{"version":3,"file":"main-B7dDrG0m.js","sources":["../../node_modules/just-debounce-it/index.mjs","../../node_modules/swiped-events/src/swiped-events.js","../../src/utils/usePageVisibility.js","../../src/components/background-service.jsx","../../src/components/compose-button.jsx","../../src/components/keyboard-shortcuts-help.jsx","../../node_modules/@formkit/auto-animate/index.mjs","../../node_modules/@formkit/auto-animate/preact/index.mjs","../../src/pages/accounts.jsx","../../src/assets/logo.svg","../../src/components/lang-selector.jsx","../../src/utils/push-notifications.js","../../src/pages/settings.jsx","../../src/utils/focus-deck.js","../../src/utils/useLocationChange.js","../../src/utils/lists.js","../../src/components/list-add-edit.jsx","../../src/components/account-info.jsx","../../src/components/account-sheet.jsx","../../src/components/drafts.jsx","../../src/components/embed-modal.jsx","../../src/components/generic-accounts.jsx","../../src/components/media-alt-modal.jsx","../../node_modules/chroma-js/src/utils/limit.js","../../node_modules/chroma-js/src/utils/type.js","../../node_modules/chroma-js/src/utils/unpack.js","../../node_modules/chroma-js/src/utils/index.js","../../node_modules/chroma-js/src/utils/multiply-matrices.js","../../node_modules/chroma-js/src/io/lab/lab-constants.js","../../node_modules/chroma-js/src/io/lab/lab2rgb.js","../../node_modules/chroma-js/src/io/oklab/oklab2rgb.js","../../node_modules/chroma-js/src/io/lab/rgb2lab.js","../../node_modules/chroma-js/src/io/oklab/rgb2oklab.js","../../node_modules/chroma-js/src/io/lch/lch2lab.js","../../node_modules/chroma-js/src/io/oklch/oklch2rgb.js","../../node_modules/chroma-js/src/io/lch/lab2lch.js","../../node_modules/chroma-js/src/io/oklch/rgb2oklch.js","../../src/components/media-modal.jsx","../../src/components/report-modal.jsx","../../node_modules/lz-string/libs/lz-string.js","../../src/assets/floating-button.svg","../../src/assets/multi-column.svg","../../src/assets/tab-menu-bar.svg","../../src/utils/followed-tags.js","../../src/components/AsyncText.jsx","../../src/components/shortcuts-settings.jsx","../../src/components/modals.jsx","../../src/components/follow-request-buttons.jsx","../../src/components/notification.jsx","../../src/components/notification-service.jsx","../../src/components/search-form.jsx","../../src/components/search-command.jsx","../../src/components/shortcuts.jsx","../../src/utils/timeline-utils.js","../../src/utils/useScroll.js","../../src/utils/useScrollFn.js","../../src/components/media-post.jsx","../../src/components/nav-menu.jsx","../../src/components/timeline.jsx","../../src/pages/account-statuses.jsx","../../src/pages/annual-report.jsx","../../src/pages/bookmarks.jsx","../../src/assets/features/catch-up.png","../../src/pages/catchup.jsx","../../src/pages/favourites.jsx","../../src/pages/filters.jsx","../../src/pages/followed-hashtags.jsx","../../src/pages/following.jsx","../../src/pages/hashtag.jsx","../../src/pages/list.jsx","../../src/utils/group-notifications.js","../../src/pages/mentions.jsx","../../src/pages/notifications.jsx","../../src/pages/public.jsx","../../src/pages/search.jsx","../../src/pages/trending.jsx","../../src/components/columns.jsx","../../src/pages/home.jsx","../../src/utils/get-instance-status-url.js","../../src/pages/http-route.jsx","../../src/pages/lists.jsx","../../src/data/instances.json?url","../../src/utils/oauth-pkce.js","../../src/utils/auth.js","../../src/pages/login.jsx","../../src/pages/status.jsx","../../src/pages/status-route.jsx","../../src/assets/features/boosts-carousel.jpg","../../src/assets/features/grouped-notifications.jpg","../../src/assets/features/multi-column.jpg","../../src/assets/features/multi-hashtag-timeline.jpg","../../src/assets/features/nested-comments-thread.jpg","../../src/assets/logo-text.svg","../../src/pages/welcome.jsx","../../src/utils/toast-alert.js","../../src/app.jsx","../../src/main.jsx"],"sourcesContent":["var functionDebounce = debounce;\n\nfunction debounce(fn, wait, callFirst) {\n  var timeout = null;\n  var debouncedFn = null;\n\n  var clear = function() {\n    if (timeout) {\n      clearTimeout(timeout);\n\n      debouncedFn = null;\n      timeout = null;\n    }\n  };\n\n  var flush = function() {\n    var call = debouncedFn;\n    clear();\n\n    if (call) {\n      call();\n    }\n  };\n\n  var debounceWrapper = function() {\n    if (!wait) {\n      return fn.apply(this, arguments);\n    }\n\n    var context = this;\n    var args = arguments;\n    var callNow = callFirst && !timeout;\n    clear();\n\n    debouncedFn = function() {\n      fn.apply(context, args);\n    };\n\n    timeout = setTimeout(function() {\n      timeout = null;\n\n      if (!callNow) {\n        var call = debouncedFn;\n        debouncedFn = null;\n\n        return call();\n      }\n    }, wait);\n\n    if (callNow) {\n      return debouncedFn();\n    }\n  };\n\n  debounceWrapper.cancel = clear;\n  debounceWrapper.flush = flush;\n\n  return debounceWrapper;\n}\n\nexport {functionDebounce as default};\n","/*!\n * swiped-events.js - v@version@\n * Pure JavaScript swipe events\n * https://github.com/john-doherty/swiped-events\n * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element\n * @author John Doherty <www.johndoherty.info>\n * @license MIT\n */\n(function (window, document) {\n\n    'use strict';\n\n    // patch CustomEvent to allow constructor creation (IE/Chrome)\n    if (typeof window.CustomEvent !== 'function') {\n\n        window.CustomEvent = function (event, params) {\n\n            params = params || { bubbles: false, cancelable: false, detail: undefined };\n\n            var evt = document.createEvent('CustomEvent');\n            evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n            return evt;\n        };\n\n        window.CustomEvent.prototype = window.Event.prototype;\n    }\n\n    document.addEventListener('touchstart', handleTouchStart, false);\n    document.addEventListener('touchmove', handleTouchMove, false);\n    document.addEventListener('touchend', handleTouchEnd, false);\n\n    var xDown = null;\n    var yDown = null;\n    var xDiff = null;\n    var yDiff = null;\n    var timeDown = null;\n    var startEl = null;\n    var touchCount = 0;\n\n    /**\n     * Fires swiped event if swipe detected on touchend\n     * @param {object} e - browser event object\n     * @returns {void}\n     */\n    function handleTouchEnd(e) {\n\n        // if the user released on a different target, cancel!\n        if (startEl !== e.target) return;\n\n        var swipeThreshold = parseInt(getNearestAttribute(startEl, 'data-swipe-threshold', '20'), 10); // default 20 units\n        var swipeUnit = getNearestAttribute(startEl, 'data-swipe-unit', 'px'); // default px\n        var swipeTimeout = parseInt(getNearestAttribute(startEl, 'data-swipe-timeout', '500'), 10);    // default 500ms\n        var timeDiff = Date.now() - timeDown;\n        var eventType = '';\n        var changedTouches = e.changedTouches || e.touches || [];\n\n        if (swipeUnit === 'vh') {\n            swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientHeight); // get percentage of viewport height in pixels\n        }\n        if (swipeUnit === 'vw') {\n            swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientWidth); // get percentage of viewport height in pixels\n        }\n\n        if (Math.abs(xDiff) > Math.abs(yDiff)) { // most significant\n            if (Math.abs(xDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n                if (xDiff > 0) {\n                    eventType = 'swiped-left';\n                }\n                else {\n                    eventType = 'swiped-right';\n                }\n            }\n        }\n        else if (Math.abs(yDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n            if (yDiff > 0) {\n                eventType = 'swiped-up';\n            }\n            else {\n                eventType = 'swiped-down';\n            }\n        }\n\n        if (eventType !== '') {\n\n            var eventData = {\n                dir: eventType.replace(/swiped-/, ''),\n                touchType: (changedTouches[0] || {}).touchType || 'direct',\n                fingers: touchCount, // Number of fingers used\n                xStart: parseInt(xDown, 10),\n                xEnd: parseInt((changedTouches[0] || {}).clientX || -1, 10),\n                yStart: parseInt(yDown, 10),\n                yEnd: parseInt((changedTouches[0] || {}).clientY || -1, 10)\n            };\n\n            // fire `swiped` event event on the element that started the swipe\n            startEl.dispatchEvent(new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData }));\n\n            // fire `swiped-dir` event on the element that started the swipe\n            startEl.dispatchEvent(new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData }));\n        }\n\n        // reset values\n        xDown = null;\n        yDown = null;\n        timeDown = null;\n    }\n    /**\n     * Records current location on touchstart event\n     * @param {object} e - browser event object\n     * @returns {void}\n     */\n    function handleTouchStart(e) {\n\n        // if the element has data-swipe-ignore=\"true\" we stop listening for swipe events\n        if (e.target.getAttribute('data-swipe-ignore') === 'true') return;\n\n        startEl = e.target;\n\n        timeDown = Date.now();\n        xDown = e.touches[0].clientX;\n        yDown = e.touches[0].clientY;\n        xDiff = 0;\n        yDiff = 0;\n        touchCount = e.touches.length;\n    }\n\n    /**\n     * Records location diff in px on touchmove event\n     * @param {object} e - browser event object\n     * @returns {void}\n     */\n    function handleTouchMove(e) {\n\n        if (!xDown || !yDown) return;\n\n        var xUp = e.touches[0].clientX;\n        var yUp = e.touches[0].clientY;\n\n        xDiff = xDown - xUp;\n        yDiff = yDown - yUp;\n    }\n\n    /**\n     * Gets attribute off HTML element or nearest parent\n     * @param {object} el - HTML element to retrieve attribute from\n     * @param {string} attributeName - name of the attribute\n     * @param {any} defaultValue - default value to return if no match found\n     * @returns {any} attribute value or defaultValue\n     */\n    function getNearestAttribute(el, attributeName, defaultValue) {\n\n        // walk up the dom tree looking for attributeName\n        while (el && el !== document.documentElement) {\n\n            var attributeValue = el.getAttribute(attributeName);\n\n            if (attributeValue) {\n                return attributeValue;\n            }\n\n            el = el.parentNode;\n        }\n\n        return defaultValue;\n    }\n\n}(window, document));\n","import { useEffect, useRef } from 'preact/hooks';\n\nexport default function usePageVisibility(fn = () => {}, deps = []) {\n  const savedCallback = useRef(fn);\n  useEffect(() => {\n    savedCallback.current = fn;\n  }, [deps]);\n\n  useEffect(() => {\n    const handleVisibilityChange = () => {\n      const hidden = document.hidden || document.visibilityState === 'hidden';\n      console.log('๐Ÿ‘€ Page visibility changed', hidden ? 'hidden' : 'visible');\n      savedCallback.current(!hidden);\n    };\n\n    document.addEventListener('visibilitychange', handleVisibilityChange);\n    return () =>\n      document.removeEventListener('visibilitychange', handleVisibilityChange);\n  }, []);\n}\n","import { useLingui } from '@lingui/react/macro';\nimport { memo } from 'preact/compat';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport { api } from '../utils/api';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus } from '../utils/states';\nimport useInterval from '../utils/useInterval';\nimport usePageVisibility from '../utils/usePageVisibility';\n\nconst STREAMING_TIMEOUT = 1000 * 3; // 3 seconds\nconst POLL_INTERVAL = 20_000; // 20 seconds\n\nexport default memo(function BackgroundService({ isLoggedIn }) {\n  const { t } = useLingui();\n\n  // Notifications service\n  // - WebSocket to receive notifications when page is visible\n  const [visible, setVisible] = useState(true);\n  const visibleTimeout = useRef();\n  usePageVisibility((visible) => {\n    clearTimeout(visibleTimeout.current);\n    if (visible) {\n      setVisible(true);\n    } else {\n      visibleTimeout.current = setTimeout(() => {\n        setVisible(false);\n      }, POLL_INTERVAL);\n    }\n  });\n\n  const checkLatestNotification = async (masto, instance, skipCheckMarkers) => {\n    if (states.notificationsLast) {\n      const notificationsIterator = masto.v1.notifications.list({\n        limit: 1,\n        sinceId: states.notificationsLast.id,\n      });\n      const { value: notifications } = await notificationsIterator.next();\n      if (notifications?.length) {\n        if (skipCheckMarkers) {\n          states.notificationsShowNew = true;\n        } else {\n          let lastReadId;\n          try {\n            const markers = await masto.v1.markers.fetch({\n              timeline: 'notifications',\n            });\n            lastReadId = markers?.notifications?.lastReadId;\n          } catch (e) {}\n          if (lastReadId) {\n            states.notificationsShowNew = notifications[0].id !== lastReadId;\n          } else {\n            states.notificationsShowNew = true;\n          }\n        }\n      }\n    }\n  };\n\n  useEffect(() => {\n    let sub;\n    let streamTimeout;\n    let pollNotifications;\n    if (isLoggedIn && visible) {\n      const { masto, streaming, instance } = api();\n      (async () => {\n        // 1. Get the latest notification\n        await checkLatestNotification(masto, instance);\n\n        let hasStreaming = false;\n        // 2. Start streaming\n        if (streaming) {\n          streamTimeout = setTimeout(() => {\n            (async () => {\n              try {\n                hasStreaming = true;\n                sub = streaming.user.notification.subscribe();\n                console.log('๐ŸŽ Streaming notification', sub);\n                for await (const entry of sub) {\n                  if (!sub) break;\n                  if (!visible) break;\n                  console.log('๐Ÿ””๐Ÿ”” Notification entry', entry);\n                  if (entry.event === 'notification') {\n                    console.log('๐Ÿ””๐Ÿ”” Notification', entry);\n                    saveStatus(entry.payload, instance, {\n                      skipThreading: true,\n                    });\n                  }\n                  states.notificationsShowNew = true;\n                }\n                console.log('๐Ÿ’ฅ Streaming notification loop STOPPED');\n              } catch (e) {\n                hasStreaming = false;\n                console.error(e);\n              }\n\n              if (!hasStreaming) {\n                console.log('๐ŸŽ Streaming failed, fallback to polling');\n                pollNotifications = setInterval(() => {\n                  checkLatestNotification(masto, instance, true);\n                }, POLL_INTERVAL);\n              }\n            })();\n          }, STREAMING_TIMEOUT);\n        }\n      })();\n    }\n    return () => {\n      sub?.unsubscribe?.();\n      sub = null;\n      clearTimeout(streamTimeout);\n      clearInterval(pollNotifications);\n    };\n  }, [visible, isLoggedIn]);\n\n  // Check for updates service\n  const lastCheckDate = useRef();\n  const checkForUpdates = () => {\n    lastCheckDate.current = Date.now();\n    console.log('โœจ Check app update');\n    fetch('./version.json')\n      .then((r) => r.json())\n      .then((info) => {\n        if (info) states.appVersion = info;\n      })\n      .catch((e) => {\n        console.error(e);\n      });\n  };\n  useInterval(checkForUpdates, visible && 1000 * 60 * 30); // 30 minutes\n  usePageVisibility((visible) => {\n    if (visible) {\n      if (!lastCheckDate.current) {\n        checkForUpdates();\n      } else {\n        const diff = Date.now() - lastCheckDate.current;\n        if (diff > 1000 * 60 * 60) {\n          // 1 hour\n          checkForUpdates();\n        }\n      }\n    }\n  });\n\n  // Global keyboard shortcuts \"service\"\n  useHotkeys('shift+alt+k', () => {\n    const currentCloakMode = states.settings.cloakMode;\n    states.settings.cloakMode = !currentCloakMode;\n    showToast({\n      text: currentCloakMode ? t`Cloak mode disabled` : t`Cloak mode enabled`,\n    });\n  });\n\n  return null;\n});\n","import { useLingui } from '@lingui/react/macro';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useSnapshot } from 'valtio';\n\nimport openCompose from '../utils/open-compose';\nimport openOSK from '../utils/open-osk';\nimport states from '../utils/states';\n\nimport Icon from './icon';\n\nexport default function ComposeButton() {\n  const { t } = useLingui();\n  const snapStates = useSnapshot(states);\n\n  function handleButton(e) {\n    if (snapStates.composerState.minimized) {\n      states.composerState.minimized = false;\n      openOSK();\n      return;\n    }\n\n    if (e.shiftKey) {\n      const newWin = openCompose();\n\n      if (!newWin) {\n        states.showCompose = true;\n      }\n    } else {\n      openOSK();\n      states.showCompose = true;\n    }\n  }\n\n  useHotkeys('c, shift+c', handleButton, {\n    ignoreEventWhen: (e) => {\n      const hasModal = !!document.querySelector('#modal-container > *');\n      return hasModal;\n    },\n  });\n\n  return (\n    <button\n      type=\"button\"\n      id=\"compose-button\"\n      onClick={handleButton}\n      class={`${snapStates.composerState.minimized ? 'min' : ''} ${\n        snapStates.composerState.publishing ? 'loading' : ''\n      } ${snapStates.composerState.publishingError ? 'error' : ''}`}\n    >\n      <Icon icon=\"quill\" size=\"xl\" alt={t`Compose`} />\n    </button>\n  );\n}\n","import './keyboard-shortcuts-help.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { memo } from 'preact/compat';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useSnapshot } from 'valtio';\n\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Modal from './modal';\n\nexport default memo(function KeyboardShortcutsHelp() {\n  const { t } = useLingui();\n  const snapStates = useSnapshot(states);\n\n  function onClose() {\n    states.showKeyboardShortcutsHelp = false;\n  }\n\n  useHotkeys(\n    '?, shift+?, shift+slash',\n    (e) => {\n      console.log('help');\n      states.showKeyboardShortcutsHelp = true;\n    },\n    {\n      ignoreEventWhen: (e) => {\n        const hasModal = !!document.querySelector('#modal-container > *');\n        return hasModal;\n      },\n    },\n  );\n\n  return (\n    !!snapStates.showKeyboardShortcutsHelp && (\n      <Modal onClose={onClose}>\n        <div id=\"keyboard-shortcuts-help-container\" class=\"sheet\" tabindex=\"-1\">\n          <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n            <Icon icon=\"x\" alt={t`Close`} />\n          </button>\n          <header>\n            <h2>\n              <Trans>Keyboard shortcuts</Trans>\n            </h2>\n          </header>\n          <main>\n            <table>\n              <tbody>\n                {[\n                  {\n                    action: t`Keyboard shortcuts help`,\n                    keys: <kbd>?</kbd>,\n                  },\n                  {\n                    action: t`Next post`,\n                    keys: <kbd>j</kbd>,\n                  },\n                  {\n                    action: t`Previous post`,\n                    keys: <kbd>k</kbd>,\n                  },\n                  {\n                    action: t`Skip carousel to next post`,\n                    keys: (\n                      <Trans>\n                        <kbd>Shift</kbd> + <kbd>j</kbd>\n                      </Trans>\n                    ),\n                  },\n                  {\n                    action: t`Skip carousel to previous post`,\n                    keys: (\n                      <Trans>\n                        <kbd>Shift</kbd> + <kbd>k</kbd>\n                      </Trans>\n                    ),\n                  },\n                  {\n                    action: t`Load new posts`,\n                    keys: <kbd>.</kbd>,\n                  },\n                  {\n                    action: t`Open post details`,\n                    keys: (\n                      <Trans>\n                        <kbd>Enter</kbd> or <kbd>o</kbd>\n                      </Trans>\n                    ),\n                  },\n                  {\n                    action: (\n                      <Trans>\n                        Expand content warning or\n                        <br />\n                        toggle expanded/collapsed thread\n                      </Trans>\n                    ),\n                    keys: <kbd>x</kbd>,\n                  },\n                  {\n                    action: t`Close post or dialogs`,\n                    keys: (\n                      <Trans>\n                        <kbd>Esc</kbd> or <kbd>Backspace</kbd>\n                      </Trans>\n                    ),\n                  },\n                  {\n                    action: t`Focus column in multi-column mode`,\n                    keys: (\n                      <Trans>\n                        <kbd>1</kbd> to <kbd>9</kbd>\n                      </Trans>\n                    ),\n                  },\n                  {\n                    action: t`Focus next column in multi-column mode`,\n                    keys: <kbd>]</kbd>,\n                  },\n                  {\n                    action: t`Focus previous column in multi-column mode`,\n                    keys: <kbd>[</kbd>,\n                  },\n                  {\n                    action: t`Compose new post`,\n                    keys: <kbd>c</kbd>,\n                  },\n                  {\n                    action: t`Compose new post (new window)`,\n                    className: 'insignificant',\n                    keys: (\n                      <Trans>\n                        <kbd>Shift</kbd> + <kbd>c</kbd>\n                      </Trans>\n                    ),\n                  },\n                  {\n                    action: t`Send post`,\n                    keys: (\n                      <Trans>\n                        <kbd>Ctrl</kbd> + <kbd>Enter</kbd> or <kbd>โŒ˜</kbd> +{' '}\n                        <kbd>Enter</kbd>\n                      </Trans>\n                    ),\n                  },\n                  {\n                    action: t`Search`,\n                    keys: <kbd>/</kbd>,\n                  },\n                  {\n                    action: t`Reply`,\n                    keys: <kbd>r</kbd>,\n                  },\n                  {\n                    action: t`Reply (new window)`,\n                    className: 'insignificant',\n                    keys: (\n                      <Trans>\n                        <kbd>Shift</kbd> + <kbd>r</kbd>\n                      </Trans>\n                    ),\n                  },\n                  {\n                    action: t`Like (favourite)`,\n                    keys: (\n                      <Trans>\n                        <kbd>l</kbd> or <kbd>f</kbd>\n                      </Trans>\n                    ),\n                  },\n                  {\n                    action: t`Boost`,\n                    keys: (\n                      <Trans>\n                        <kbd>Shift</kbd> + <kbd>b</kbd>\n                      </Trans>\n                    ),\n                  },\n                  {\n                    action: t`Bookmark`,\n                    keys: <kbd>d</kbd>,\n                  },\n                  {\n                    action: t`Toggle Cloak mode`,\n                    keys: (\n                      <Trans>\n                        <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>k</kbd>\n                      </Trans>\n                    ),\n                  },\n                ].map(({ action, className, keys }) => (\n                  <tr key={action}>\n                    <th class={className}>{action}</th>\n                    <td>{keys}</td>\n                  </tr>\n                ))}\n              </tbody>\n            </table>\n          </main>\n        </div>\n      </Modal>\n    )\n  );\n});\n","/**\n * A set of all the parents currently being observe. This is the only non weak\n * registry.\n */\nconst parents = new Set();\n/**\n * Element coordinates that is constantly kept up to date.\n */\nconst coords = new WeakMap();\n/**\n * Siblings of elements that have been removed from the dom.\n */\nconst siblings = new WeakMap();\n/**\n * Animations that are currently running.\n */\nconst animations = new WeakMap();\n/**\n * A map of existing intersection observers used to track element movements.\n */\nconst intersections = new WeakMap();\n/**\n * Intervals for automatically checking the position of elements occasionally.\n */\nconst intervals = new WeakMap();\n/**\n * The configuration options for each group of elements.\n */\nconst options = new WeakMap();\n/**\n * Debounce counters by id, used to debounce calls to update positions.\n */\nconst debounces = new WeakMap();\n/**\n * All parents that are currently enabled are tracked here.\n */\nconst enabled = new WeakSet();\n/**\n * The document used to calculate transitions.\n */\nlet root;\n/**\n * The rootโ€™s XY scroll positions.\n */\nlet scrollX = 0;\nlet scrollY = 0;\n/**\n * Used to sign an element as the target.\n */\nconst TGT = \"__aa_tgt\";\n/**\n * Used to sign an element as being part of a removal.\n */\nconst DEL = \"__aa_del\";\n/**\n * Used to sign an element as being \"new\". When an element is removed from the\n * dom, but may cycle back in we can sign it with new to ensure the next time\n * it is recognized we consider it new.\n */\nconst NEW = \"__aa_new\";\n/**\n * Callback for handling all mutations.\n * @param mutations - A mutation list\n */\nconst handleMutations = (mutations) => {\n    const elements = getElements(mutations);\n    // If elements is \"false\" that means this mutation that should be ignored.\n    if (elements) {\n        elements.forEach((el) => animate(el));\n    }\n};\n/**\n *\n * @param entries - Elements that have been resized.\n */\nconst handleResizes = (entries) => {\n    entries.forEach((entry) => {\n        if (entry.target === root)\n            updateAllPos();\n        if (coords.has(entry.target))\n            updatePos(entry.target);\n    });\n};\n/**\n * Observe this elements position.\n * @param el - The element to observe the position of.\n */\nfunction observePosition(el) {\n    const oldObserver = intersections.get(el);\n    oldObserver === null || oldObserver === void 0 ? void 0 : oldObserver.disconnect();\n    let rect = coords.get(el);\n    let invocations = 0;\n    const buffer = 5;\n    if (!rect) {\n        rect = getCoords(el);\n        coords.set(el, rect);\n    }\n    const { offsetWidth, offsetHeight } = root;\n    const rootMargins = [\n        rect.top - buffer,\n        offsetWidth - (rect.left + buffer + rect.width),\n        offsetHeight - (rect.top + buffer + rect.height),\n        rect.left - buffer,\n    ];\n    const rootMargin = rootMargins\n        .map((px) => `${-1 * Math.floor(px)}px`)\n        .join(\" \");\n    const observer = new IntersectionObserver(() => {\n        ++invocations > 1 && updatePos(el);\n    }, {\n        root,\n        threshold: 1,\n        rootMargin,\n    });\n    observer.observe(el);\n    intersections.set(el, observer);\n}\n/**\n * Update the exact position of a given element.\n * @param el - An element to update the position of.\n */\nfunction updatePos(el) {\n    clearTimeout(debounces.get(el));\n    const optionsOrPlugin = getOptions(el);\n    const delay = isPlugin(optionsOrPlugin) ? 500 : optionsOrPlugin.duration;\n    debounces.set(el, setTimeout(async () => {\n        const currentAnimation = animations.get(el);\n        try {\n            await (currentAnimation === null || currentAnimation === void 0 ? void 0 : currentAnimation.finished);\n            coords.set(el, getCoords(el));\n            observePosition(el);\n        }\n        catch {\n            // ignore errors as the `.finished` promise is rejected when animations were cancelled\n        }\n    }, delay));\n}\n/**\n * Updates all positions that are currently being tracked.\n */\nfunction updateAllPos() {\n    clearTimeout(debounces.get(root));\n    debounces.set(root, setTimeout(() => {\n        parents.forEach((parent) => forEach(parent, (el) => lowPriority(() => updatePos(el))));\n    }, 100));\n}\n/**\n * Its possible for a quick scroll or other fast events to get past the\n * intersection observer, so occasionally we need want \"cold-poll\" for the\n * latests and greatest position. We try to do this in the most non-disruptive\n * fashion possible. First we only do this ever couple seconds, staggard by a\n * random offset.\n * @param el - Element\n */\nfunction poll(el) {\n    setTimeout(() => {\n        intervals.set(el, setInterval(() => lowPriority(updatePos.bind(null, el)), 2000));\n    }, Math.round(2000 * Math.random()));\n}\n/**\n * Perform some operation that is non critical at some point.\n * @param callback\n */\nfunction lowPriority(callback) {\n    if (typeof requestIdleCallback === \"function\") {\n        requestIdleCallback(() => callback());\n    }\n    else {\n        requestAnimationFrame(() => callback());\n    }\n}\n/**\n * The mutation observer responsible for watching each root element.\n */\nlet mutations;\n/**\n * A resize observer, responsible for recalculating elements on resize.\n */\nlet resize;\n/**\n * Ensure the browser is supported.\n */\nconst supportedBrowser = typeof window !== \"undefined\" && \"ResizeObserver\" in window;\n/**\n * If this is in a browser, initialize our Web APIs\n */\nif (supportedBrowser) {\n    root = document.documentElement;\n    mutations = new MutationObserver(handleMutations);\n    resize = new ResizeObserver(handleResizes);\n    window.addEventListener(\"scroll\", () => {\n        scrollY = window.scrollY;\n        scrollX = window.scrollX;\n    });\n    resize.observe(root);\n}\n/**\n * Retrieves all the elements that may have been affected by the last mutation\n * including ones that have been removed and are no longer in the DOM.\n * @param mutations - A mutation list.\n * @returns\n */\nfunction getElements(mutations) {\n    const observedNodes = mutations.reduce((nodes, mutation) => {\n        return [\n            ...nodes,\n            ...Array.from(mutation.addedNodes),\n            ...Array.from(mutation.removedNodes),\n        ];\n    }, []);\n    // Short circuit if _only_ comment nodes are observed\n    const onlyCommentNodesObserved = observedNodes.every((node) => node.nodeName === \"#comment\");\n    if (onlyCommentNodesObserved)\n        return false;\n    return mutations.reduce((elements, mutation) => {\n        // Short circuit if we find a purposefully deleted node.\n        if (elements === false)\n            return false;\n        if (mutation.target instanceof Element) {\n            target(mutation.target);\n            if (!elements.has(mutation.target)) {\n                elements.add(mutation.target);\n                for (let i = 0; i < mutation.target.children.length; i++) {\n                    const child = mutation.target.children.item(i);\n                    if (!child)\n                        continue;\n                    if (DEL in child) {\n                        return false;\n                    }\n                    target(mutation.target, child);\n                    elements.add(child);\n                }\n            }\n            if (mutation.removedNodes.length) {\n                for (let i = 0; i < mutation.removedNodes.length; i++) {\n                    const child = mutation.removedNodes[i];\n                    if (DEL in child) {\n                        return false;\n                    }\n                    if (child instanceof Element) {\n                        elements.add(child);\n                        target(mutation.target, child);\n                        siblings.set(child, [\n                            mutation.previousSibling,\n                            mutation.nextSibling,\n                        ]);\n                    }\n                }\n            }\n        }\n        return elements;\n    }, new Set());\n}\n/**\n * Assign the target to an element.\n * @param el - The root element\n * @param child\n */\nfunction target(el, child) {\n    if (!child && !(TGT in el))\n        Object.defineProperty(el, TGT, { value: el });\n    else if (child && !(TGT in child))\n        Object.defineProperty(child, TGT, { value: el });\n}\n/**\n * Determines what kind of change took place on the given element and then\n * performs the proper animation based on that.\n * @param el - The specific element to animate.\n */\nfunction animate(el) {\n    var _a;\n    const isMounted = el.isConnected;\n    const preExisting = coords.has(el);\n    if (isMounted && siblings.has(el))\n        siblings.delete(el);\n    if (animations.has(el)) {\n        (_a = animations.get(el)) === null || _a === void 0 ? void 0 : _a.cancel();\n    }\n    if (NEW in el) {\n        add(el);\n    }\n    else if (preExisting && isMounted) {\n        remain(el);\n    }\n    else if (preExisting && !isMounted) {\n        remove(el);\n    }\n    else {\n        add(el);\n    }\n}\n/**\n * Removes all non-digits from a string and casts to a number.\n * @param str - A string containing a pixel value.\n * @returns\n */\nfunction raw(str) {\n    return Number(str.replace(/[^0-9.\\-]/g, \"\"));\n}\n/**\n * Get the scroll offset of elements\n * @param el - Element\n * @returns\n */\nfunction getScrollOffset(el) {\n    let p = el.parentElement;\n    while (p) {\n        if (p.scrollLeft || p.scrollTop) {\n            return { x: p.scrollLeft, y: p.scrollTop };\n        }\n        p = p.parentElement;\n    }\n    return { x: 0, y: 0 };\n}\n/**\n * Get the coordinates of elements adjusted for scroll position.\n * @param el - Element\n * @returns\n */\nfunction getCoords(el) {\n    const rect = el.getBoundingClientRect();\n    const { x, y } = getScrollOffset(el);\n    return {\n        top: rect.top + y,\n        left: rect.left + x,\n        width: rect.width,\n        height: rect.height,\n    };\n}\n/**\n * Returns the width/height that the element should be transitioned between.\n * This takes into account box-sizing.\n * @param el - Element being animated\n * @param oldCoords - Old set of Coordinates coordinates\n * @param newCoords - New set of Coordinates coordinates\n * @returns\n */\nfunction getTransitionSizes(el, oldCoords, newCoords) {\n    let widthFrom = oldCoords.width;\n    let heightFrom = oldCoords.height;\n    let widthTo = newCoords.width;\n    let heightTo = newCoords.height;\n    const styles = getComputedStyle(el);\n    const sizing = styles.getPropertyValue(\"box-sizing\");\n    if (sizing === \"content-box\") {\n        const paddingY = raw(styles.paddingTop) +\n            raw(styles.paddingBottom) +\n            raw(styles.borderTopWidth) +\n            raw(styles.borderBottomWidth);\n        const paddingX = raw(styles.paddingLeft) +\n            raw(styles.paddingRight) +\n            raw(styles.borderRightWidth) +\n            raw(styles.borderLeftWidth);\n        widthFrom -= paddingX;\n        widthTo -= paddingX;\n        heightFrom -= paddingY;\n        heightTo -= paddingY;\n    }\n    return [widthFrom, widthTo, heightFrom, heightTo].map(Math.round);\n}\n/**\n * Retrieves animation options for the current element.\n * @param el - Element to retrieve options for.\n * @returns\n */\nfunction getOptions(el) {\n    return TGT in el && options.has(el[TGT])\n        ? options.get(el[TGT])\n        : { duration: 250, easing: \"ease-in-out\" };\n}\n/**\n * Returns the target of a given animation (generally the parent).\n * @param el - An element to check for a target\n * @returns\n */\nfunction getTarget(el) {\n    if (TGT in el)\n        return el[TGT];\n    return undefined;\n}\n/**\n * Checks if animations are enabled or disabled for a given element.\n * @param el - Any element\n * @returns\n */\nfunction isEnabled(el) {\n    const target = getTarget(el);\n    return target ? enabled.has(target) : false;\n}\n/**\n * Iterate over the children of a given parent.\n * @param parent - A parent element\n * @param callback - A callback\n */\nfunction forEach(parent, ...callbacks) {\n    callbacks.forEach((callback) => callback(parent, options.has(parent)));\n    for (let i = 0; i < parent.children.length; i++) {\n        const child = parent.children.item(i);\n        if (child) {\n            callbacks.forEach((callback) => callback(child, options.has(child)));\n        }\n    }\n}\n/**\n * Always return tuple to provide consistent interface\n */\nfunction getPluginTuple(pluginReturn) {\n    if (Array.isArray(pluginReturn))\n        return pluginReturn;\n    return [pluginReturn];\n}\n/**\n * Determine if config is plugin\n */\nfunction isPlugin(config) {\n    return typeof config === \"function\";\n}\n/**\n * The element in question is remaining in the DOM.\n * @param el - Element to flip\n * @returns\n */\nfunction remain(el) {\n    const oldCoords = coords.get(el);\n    const newCoords = getCoords(el);\n    if (!isEnabled(el))\n        return coords.set(el, newCoords);\n    let animation;\n    if (!oldCoords)\n        return;\n    const pluginOrOptions = getOptions(el);\n    if (typeof pluginOrOptions !== \"function\") {\n        const deltaX = oldCoords.left - newCoords.left;\n        const deltaY = oldCoords.top - newCoords.top;\n        const [widthFrom, widthTo, heightFrom, heightTo] = getTransitionSizes(el, oldCoords, newCoords);\n        const start = {\n            transform: `translate(${deltaX}px, ${deltaY}px)`,\n        };\n        const end = {\n            transform: `translate(0, 0)`,\n        };\n        if (widthFrom !== widthTo) {\n            start.width = `${widthFrom}px`;\n            end.width = `${widthTo}px`;\n        }\n        if (heightFrom !== heightTo) {\n            start.height = `${heightFrom}px`;\n            end.height = `${heightTo}px`;\n        }\n        animation = el.animate([start, end], {\n            duration: pluginOrOptions.duration,\n            easing: pluginOrOptions.easing,\n        });\n    }\n    else {\n        const [keyframes] = getPluginTuple(pluginOrOptions(el, \"remain\", oldCoords, newCoords));\n        animation = new Animation(keyframes);\n        animation.play();\n    }\n    animations.set(el, animation);\n    coords.set(el, newCoords);\n    animation.addEventListener(\"finish\", updatePos.bind(null, el));\n}\n/**\n * Adds the element with a transition.\n * @param el - Animates the element being added.\n */\nfunction add(el) {\n    if (NEW in el)\n        delete el[NEW];\n    const newCoords = getCoords(el);\n    coords.set(el, newCoords);\n    const pluginOrOptions = getOptions(el);\n    if (!isEnabled(el))\n        return;\n    let animation;\n    if (typeof pluginOrOptions !== \"function\") {\n        animation = el.animate([\n            { transform: \"scale(.98)\", opacity: 0 },\n            { transform: \"scale(0.98)\", opacity: 0, offset: 0.5 },\n            { transform: \"scale(1)\", opacity: 1 },\n        ], {\n            duration: pluginOrOptions.duration * 1.5,\n            easing: \"ease-in\",\n        });\n    }\n    else {\n        const [keyframes] = getPluginTuple(pluginOrOptions(el, \"add\", newCoords));\n        animation = new Animation(keyframes);\n        animation.play();\n    }\n    animations.set(el, animation);\n    animation.addEventListener(\"finish\", updatePos.bind(null, el));\n}\n/**\n * Clean up after removing an element from the dom.\n * @param el - Element being removed\n * @param styles - Optional styles that should be removed from the element.\n */\nfunction cleanUp(el, styles) {\n    var _a;\n    el.remove();\n    coords.delete(el);\n    siblings.delete(el);\n    animations.delete(el);\n    (_a = intersections.get(el)) === null || _a === void 0 ? void 0 : _a.disconnect();\n    setTimeout(() => {\n        if (DEL in el)\n            delete el[DEL];\n        Object.defineProperty(el, NEW, { value: true, configurable: true });\n        if (styles && el instanceof HTMLElement) {\n            for (const style in styles) {\n                el.style[style] = \"\";\n            }\n        }\n    }, 0);\n}\n/**\n * Animates the removal of an element.\n * @param el - Element to remove\n */\nfunction remove(el) {\n    var _a;\n    if (!siblings.has(el) || !coords.has(el))\n        return;\n    const [prev, next] = siblings.get(el);\n    Object.defineProperty(el, DEL, { value: true, configurable: true });\n    const finalX = window.scrollX;\n    const finalY = window.scrollY;\n    if (next && next.parentNode && next.parentNode instanceof Element) {\n        next.parentNode.insertBefore(el, next);\n    }\n    else if (prev && prev.parentNode) {\n        prev.parentNode.appendChild(el);\n    }\n    else {\n        (_a = getTarget(el)) === null || _a === void 0 ? void 0 : _a.appendChild(el);\n    }\n    if (!isEnabled(el))\n        return cleanUp(el);\n    const [top, left, width, height] = deletePosition(el);\n    const optionsOrPlugin = getOptions(el);\n    const oldCoords = coords.get(el);\n    if (finalX !== scrollX || finalY !== scrollY) {\n        adjustScroll(el, finalX, finalY, optionsOrPlugin);\n    }\n    let animation;\n    let styleReset = {\n        position: \"absolute\",\n        top: `${top}px`,\n        left: `${left}px`,\n        width: `${width}px`,\n        height: `${height}px`,\n        margin: \"0\",\n        pointerEvents: \"none\",\n        transformOrigin: \"center\",\n        zIndex: \"100\",\n    };\n    if (!isPlugin(optionsOrPlugin)) {\n        Object.assign(el.style, styleReset);\n        animation = el.animate([\n            {\n                transform: \"scale(1)\",\n                opacity: 1,\n            },\n            {\n                transform: \"scale(.98)\",\n                opacity: 0,\n            },\n        ], { duration: optionsOrPlugin.duration, easing: \"ease-out\" });\n    }\n    else {\n        const [keyframes, options] = getPluginTuple(optionsOrPlugin(el, \"remove\", oldCoords));\n        if ((options === null || options === void 0 ? void 0 : options.styleReset) !== false) {\n            styleReset = (options === null || options === void 0 ? void 0 : options.styleReset) || styleReset;\n            Object.assign(el.style, styleReset);\n        }\n        animation = new Animation(keyframes);\n        animation.play();\n    }\n    animations.set(el, animation);\n    animation.addEventListener(\"finish\", cleanUp.bind(null, el, styleReset));\n}\n/**\n * If the element being removed is at the very bottom of the page, and the\n * the page was scrolled into a space being \"made available\" by the element\n * that was removed, the page scroll will have jumped up some amount. We need\n * to offset the jump by the amount that the page was \"automatically\" scrolled\n * up. We can do this by comparing the scroll position before and after the\n * element was removed, and then offsetting by that amount.\n *\n * @param el - The element being deleted\n * @param finalX - The final X scroll position\n * @param finalY - The final Y scroll position\n * @param optionsOrPlugin - The options or plugin\n * @returns\n */\nfunction adjustScroll(el, finalX, finalY, optionsOrPlugin) {\n    const scrollDeltaX = scrollX - finalX;\n    const scrollDeltaY = scrollY - finalY;\n    const scrollBefore = document.documentElement.style.scrollBehavior;\n    const scrollBehavior = getComputedStyle(root).scrollBehavior;\n    if (scrollBehavior === \"smooth\") {\n        document.documentElement.style.scrollBehavior = \"auto\";\n    }\n    window.scrollTo(window.scrollX + scrollDeltaX, window.scrollY + scrollDeltaY);\n    if (!el.parentElement)\n        return;\n    const parent = el.parentElement;\n    let lastHeight = parent.clientHeight;\n    let lastWidth = parent.clientWidth;\n    const startScroll = performance.now();\n    // Here we use a manual scroll animation to keep the element using the same\n    // easing and timing as the parentโ€™s scroll animation.\n    function smoothScroll() {\n        requestAnimationFrame(() => {\n            if (!isPlugin(optionsOrPlugin)) {\n                const deltaY = lastHeight - parent.clientHeight;\n                const deltaX = lastWidth - parent.clientWidth;\n                if (startScroll + optionsOrPlugin.duration > performance.now()) {\n                    window.scrollTo({\n                        left: window.scrollX - deltaX,\n                        top: window.scrollY - deltaY,\n                    });\n                    lastHeight = parent.clientHeight;\n                    lastWidth = parent.clientWidth;\n                    smoothScroll();\n                }\n                else {\n                    document.documentElement.style.scrollBehavior = scrollBefore;\n                }\n            }\n        });\n    }\n    smoothScroll();\n}\n/**\n * Determines the position of the element being removed.\n * @param el - The element being deleted\n * @returns\n */\nfunction deletePosition(el) {\n    const oldCoords = coords.get(el);\n    const [width, , height] = getTransitionSizes(el, oldCoords, getCoords(el));\n    let offsetParent = el.parentElement;\n    while (offsetParent &&\n        (getComputedStyle(offsetParent).position === \"static\" ||\n            offsetParent instanceof HTMLBodyElement)) {\n        offsetParent = offsetParent.parentElement;\n    }\n    if (!offsetParent)\n        offsetParent = document.body;\n    const parentStyles = getComputedStyle(offsetParent);\n    const parentCoords = coords.get(offsetParent) || getCoords(offsetParent);\n    const top = Math.round(oldCoords.top - parentCoords.top) -\n        raw(parentStyles.borderTopWidth);\n    const left = Math.round(oldCoords.left - parentCoords.left) -\n        raw(parentStyles.borderLeftWidth);\n    return [top, left, width, height];\n}\n/**\n * A function that automatically adds animation effects to itself and its\n * immediate children. Specifically it adds effects for adding, moving, and\n * removing DOM elements.\n * @param el - A parent element to add animations to.\n * @param options - An optional object of options.\n */\nfunction autoAnimate(el, config = {}) {\n    if (mutations && resize) {\n        const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n        const isDisabledDueToReduceMotion = mediaQuery.matches &&\n            !isPlugin(config) &&\n            !config.disrespectUserMotionPreference;\n        if (!isDisabledDueToReduceMotion) {\n            enabled.add(el);\n            if (getComputedStyle(el).position === \"static\") {\n                Object.assign(el.style, { position: \"relative\" });\n            }\n            forEach(el, updatePos, poll, (element) => resize === null || resize === void 0 ? void 0 : resize.observe(element));\n            if (isPlugin(config)) {\n                options.set(el, config);\n            }\n            else {\n                options.set(el, { duration: 250, easing: \"ease-in-out\", ...config });\n            }\n            mutations.observe(el, { childList: true });\n            parents.add(el);\n        }\n    }\n    return Object.freeze({\n        parent: el,\n        enable: () => {\n            enabled.add(el);\n        },\n        disable: () => {\n            enabled.delete(el);\n        },\n        isEnabled: () => enabled.has(el),\n    });\n}\n/**\n * The vue directive.\n */\nconst vAutoAnimate = {\n    mounted: (el, binding) => {\n        autoAnimate(el, binding.value || {});\n    },\n    // ignore ssr see #96:\n    getSSRProps: () => ({}),\n};\n\nexport { autoAnimate as default, getTransitionSizes, vAutoAnimate };\n","import { useRef, useState, useEffect } from 'preact/hooks';\nimport autoAnimate from '../index.mjs';\n\n/**\n * AutoAnimate hook for adding dead-simple transitions and animations to preact.\n * @param options - Auto animate options or a plugin\n * @returns\n */\nfunction useAutoAnimate(options) {\n    const element = useRef(null);\n    const [controller, setController] = useState();\n    const setEnabled = (enabled) => {\n        if (controller) {\n            enabled ? controller.enable() : controller.disable();\n        }\n    };\n    useEffect(() => {\n        if (element.current instanceof HTMLElement)\n            setController(autoAnimate(element.current, options || {}));\n    }, []);\n    return [element, setEnabled];\n}\n\nexport { useAutoAnimate };\n","import './accounts.css';\n\nimport { useAutoAnimate } from '@formkit/auto-animate/preact';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { Menu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { useReducer } from 'preact/hooks';\n\nimport Avatar from '../components/avatar';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport MenuConfirm from '../components/menu-confirm';\nimport MenuLink from '../components/menu-link';\nimport Menu2 from '../components/menu2';\nimport NameText from '../components/name-text';\nimport { api } from '../utils/api';\nimport states from '../utils/states';\nimport store from '../utils/store';\nimport { getCurrentAccountID, setCurrentAccountID } from '../utils/store-utils';\n\nconst isStandalone = window.matchMedia('(display-mode: standalone)').matches;\n\nfunction Accounts({ onClose }) {\n  const { t } = useLingui();\n  const { masto } = api();\n  // Accounts\n  const accounts = store.local.getJSON('accounts');\n  const currentAccount = getCurrentAccountID();\n  const moreThanOneAccount = accounts.length > 1;\n\n  const [_, reload] = useReducer((x) => x + 1, 0);\n  const [accountsListParent] = useAutoAnimate();\n\n  return (\n    <div id=\"accounts-container\" class=\"sheet\" tabIndex=\"-1\">\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}\n      <header class=\"header-grid\">\n        <h2>\n          <Trans>Accounts</Trans>\n        </h2>\n      </header>\n      <main>\n        <section>\n          <ul class=\"accounts-list\" ref={accountsListParent}>\n            {accounts.map((account, i) => {\n              const isCurrent = account.info.id === currentAccount;\n              const isDefault = i === 0; // first account is always default\n              return (\n                <li key={account.info.id}>\n                  <div>\n                    {moreThanOneAccount && (\n                      <span class={`current ${isCurrent ? 'is-current' : ''}`}>\n                        <Icon icon=\"check-circle\" alt={t`Current`} />\n                      </span>\n                    )}\n                    <Avatar\n                      url={account.info.avatarStatic}\n                      size=\"xxl\"\n                      onDblClick={async () => {\n                        if (isCurrent) {\n                          try {\n                            const info = await masto.v1.accounts\n                              .$select(account.info.id)\n                              .fetch();\n                            console.log('fetched account info', info);\n                            account.info = info;\n                            store.local.setJSON('accounts', accounts);\n                            reload();\n                          } catch (e) {}\n                        }\n                      }}\n                    />\n                    <NameText\n                      account={\n                        moreThanOneAccount\n                          ? {\n                              ...account.info,\n                              acct: /@/.test(account.info.acct)\n                                ? account.info.acct\n                                : `${account.info.acct}@${account.instanceURL}`,\n                            }\n                          : account.info\n                      }\n                      showAcct\n                      onClick={() => {\n                        if (isCurrent) {\n                          states.showAccount = `${account.info.username}@${account.instanceURL}`;\n                        } else {\n                          setCurrentAccountID(account.info.id);\n                          location.reload();\n                        }\n                      }}\n                    />\n                  </div>\n                  <div class=\"actions\">\n                    {isDefault && moreThanOneAccount && (\n                      <>\n                        <span class=\"tag\">\n                          <Trans>Default</Trans>\n                        </span>{' '}\n                      </>\n                    )}\n                    <Menu2\n                      align=\"end\"\n                      menuButton={\n                        <button type=\"button\" class=\"plain more-button\">\n                          <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n                        </button>\n                      }\n                    >\n                      {moreThanOneAccount && (\n                        <>\n                          <MenuItem\n                            disabled={isCurrent}\n                            onClick={() => {\n                              setCurrentAccountID(account.info.id);\n                              location.reload();\n                            }}\n                          >\n                            <Icon icon=\"transfer\" />{' '}\n                            <Trans>Switch to this account</Trans>\n                          </MenuItem>\n                          {!isStandalone && !isCurrent && (\n                            <MenuLink\n                              href={`./?account=${account.info.id}`}\n                              target=\"_blank\"\n                            >\n                              <Icon icon=\"external\" />\n                              <span>\n                                <Trans>Switch in new tab/window</Trans>\n                              </span>\n                            </MenuLink>\n                          )}\n                          <MenuDivider />\n                        </>\n                      )}\n                      <MenuItem\n                        onClick={() => {\n                          states.showAccount = `${account.info.username}@${account.instanceURL}`;\n                        }}\n                      >\n                        <Icon icon=\"user\" />\n                        <span>\n                          <Trans>View profileโ€ฆ</Trans>\n                        </span>\n                      </MenuItem>\n                      <MenuDivider />\n                      {moreThanOneAccount && (\n                        <MenuItem\n                          disabled={isDefault}\n                          onClick={() => {\n                            // Move account to the top of the list\n                            accounts.splice(i, 1);\n                            accounts.unshift(account);\n                            store.local.setJSON('accounts', accounts);\n                            reload();\n                          }}\n                        >\n                          <Icon icon=\"check-circle\" />\n                          <span>\n                            <Trans>Set as default</Trans>\n                          </span>\n                        </MenuItem>\n                      )}\n                      <MenuConfirm\n                        subMenu\n                        confirmLabel={\n                          <>\n                            <Icon icon=\"exit\" />\n                            <span>\n                              <Trans>\n                                Log out{' '}\n                                <span class=\"bidi-isolate\">\n                                  @{account.info.acct}\n                                </span>\n                                ?\n                              </Trans>\n                            </span>\n                          </>\n                        }\n                        disabled={!isCurrent}\n                        menuItemClassName=\"danger\"\n                        onClick={() => {\n                          // const yes = confirm('Log out?');\n                          // if (!yes) return;\n                          accounts.splice(i, 1);\n                          store.local.setJSON('accounts', accounts);\n                          // location.reload();\n                          location.href = location.pathname || '/';\n                        }}\n                      >\n                        <Icon icon=\"exit\" />\n                        <span>\n                          <Trans>Log outโ€ฆ</Trans>\n                        </span>\n                      </MenuConfirm>\n                    </Menu2>\n                  </div>\n                </li>\n              );\n            })}\n          </ul>\n          <p>\n            <Link to=\"/login\" class=\"button plain2\" onClick={onClose}>\n              <Icon icon=\"plus\" />{' '}\n              <span>\n                <Trans>Add an existing account</Trans>\n              </span>\n            </Link>\n          </p>\n          {moreThanOneAccount && (\n            <p>\n              <small>\n                <Trans>\n                  Note: <i>Default</i> account will always be used for first\n                  load. Switched accounts will persist during the session.\n                </Trans>\n              </small>\n            </p>\n          )}\n        </section>\n      </main>\n    </div>\n  );\n}\n\nexport default Accounts;\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20xml:space='preserve'%20fill-rule='evenodd'%20stroke-linejoin='round'%20stroke-miterlimit='2'%20clip-rule='evenodd'%20viewBox='0%200%2064%2064'%3e%3cpath%20fill='none'%20d='M0%200h63.994v63.994H0z'/%3e%3cpath%20fill='%23a4bff7'%20d='M37.774%2011.471c14.639%203.752%2019.034%2016.557%2015.889%2031.304-.696%203.261-2.563%206.661-6.356%208.693-3.204%201.717-8.07%202.537-15.338.55l-9.634-2.404C11.651%2046.992%208.378%2038.733%2010.027%2031.823c3.627-15.201%2015.543-23.48%2027.747-20.352Z'/%3e%3cpath%20fill='%23d8e7fe'%20d='M36.76%2015.429c12.289%203.15%2015.547%2014.114%2012.907%2026.493-.947%204.44-4.937%209.365-16.664%206.143l-9.684-2.417c-7.854-1.923-10.53-7.8-9.318-12.877%203.016-12.639%2012.611-19.943%2022.759-17.342Z'/%3e%3cpath%20fill='%236081e6'%20d='M27.471%2024.991c-1.457-.698-7.229%203.213-7.663%208.926-.182%202.39%204.55%203.237%205.071-.169.725-4.743%203.715-8.218%202.592-8.757Zm10.746%202.005c-2.083.327-.382%205.901-.595%2010.727-.123%202.8%204.388%203.464%204.703%202.011%201.098-5.073-2.066-13.058-4.108-12.738Z'/%3e%3c/svg%3e\"","import { useLingui } from '@lingui/react';\nimport { useMemo } from 'preact/hooks';\n\nimport { CATALOGS, DEFAULT_LANG, DEV_LOCALES, LOCALES } from '../locales';\nimport { activateLang } from '../utils/lang';\nimport localeCode2Text from '../utils/localeCode2Text';\nimport store from '../utils/store';\n\nconst regionMaps = {\n  'zh-CN': 'zh-Hans',\n  'zh-TW': 'zh-Hant',\n  'pt-BR': 'pt-BR',\n};\n\nexport default function LangSelector() {\n  const { i18n } = useLingui();\n\n  // Sorted on render, so the order won't suddenly change based on current locale\n  const populatedLocales = useMemo(() => {\n    return LOCALES.map((lang) => {\n      // Don't need regions for now, it makes text too noisy\n      // Wait till there's too many languages and there are regional clashes\n      const regionlessCode = regionMaps[lang] || lang.replace(/-[a-z]+$/i, '');\n\n      const native = localeCode2Text({\n        code: regionlessCode,\n        locale: lang,\n        fallback: CATALOGS.find((c) => c.code === lang)?.nativeName,\n      });\n\n      // Not used when rendering because it'll change based on current locale\n      // Only used for sorting on render\n      const _common = localeCode2Text({\n        code: regionlessCode,\n        locale: i18n.locale,\n        fallback: CATALOGS.find((c) => c.code === lang)?.name,\n      });\n\n      return {\n        code: lang,\n        regionlessCode,\n        _common,\n        native,\n      };\n    }).sort((a, b) => {\n      // Sort by common name\n      const order = a._common.localeCompare(b._common, i18n.locale);\n      if (order !== 0) return order;\n      // Sort by code (fallback)\n      if (a.code < b.code) return -1;\n      if (a.code > b.code) return 1;\n      return 0;\n    });\n  }, []);\n\n  return (\n    <label class=\"lang-selector\">\n      ๐ŸŒ{' '}\n      <select\n        class=\"small\"\n        value={i18n.locale || DEFAULT_LANG}\n        onChange={(e) => {\n          store.local.set('lang', e.target.value);\n          activateLang(e.target.value);\n        }}\n      >\n        {populatedLocales.map(({ code, regionlessCode, native }) => {\n          // Common name changes based on current locale\n          const common = localeCode2Text({\n            code: regionlessCode,\n            locale: i18n.locale,\n            fallback: CATALOGS.find((c) => c.code === code)?.name,\n          });\n          const showCommon = !!common && common !== native;\n          return (\n            <option\n              value={code}\n              data-regionless-code={regionlessCode}\n              key={code}\n            >\n              {showCommon ? `${native} - ${common}` : native}\n            </option>\n          );\n        })}\n        {(import.meta.env.DEV || import.meta.env.PHANPY_SHOW_DEV_LOCALES) && (\n          <optgroup label=\"๐Ÿšง Development (<50% translated)\">\n            {DEV_LOCALES.map((code) => {\n              if (code === 'pseudo-LOCALE') {\n                return (\n                  <>\n                    <hr />\n                    <option value={code} key={code}>\n                      Pseudolocalization (test)\n                    </option>\n                  </>\n                );\n              }\n              const nativeName = CATALOGS.find(\n                (c) => c.code === code,\n              )?.nativeName;\n              const completion = CATALOGS.find(\n                (c) => c.code === code,\n              )?.completion;\n              return (\n                <option value={code} key={code}>\n                  {nativeName || code} &lrm;[{completion}%]\n                </option>\n              );\n            })}\n          </optgroup>\n        )}\n      </select>\n    </label>\n  );\n}\n","// Utils for push notifications\nimport { api } from './api';\nimport { getVapidKey } from './store-utils';\n\n// Subscription is an object with the following structure:\n// {\n//   data: {\n//     alerts: {\n//       admin: {\n//         report: boolean,\n//         signUp: boolean,\n//       },\n//       favourite: boolean,\n//       follow: boolean,\n//       mention: boolean,\n//       poll: boolean,\n//       reblog: boolean,\n//       status: boolean,\n//       update: boolean,\n//     }\n//   },\n//   policy: \"all\" | \"followed\" | \"follower\" | \"none\",\n//   subscription: {\n//     endpoint: string,\n//     keys: {\n//       auth: string,\n//       p256dh: string,\n//     },\n//   },\n// }\n\n// Back-end CRUD\n// =============\n\nfunction createBackendPushSubscription(subscription) {\n  const { masto } = api();\n  return masto.v1.push.subscription.create(subscription);\n}\n\nfunction fetchBackendPushSubscription() {\n  const { masto } = api();\n  return masto.v1.push.subscription.fetch();\n}\n\nfunction updateBackendPushSubscription(subscription) {\n  const { masto } = api();\n  return masto.v1.push.subscription.update(subscription);\n}\n\nfunction removeBackendPushSubscription() {\n  const { masto } = api();\n  return masto.v1.push.subscription.remove();\n}\n\n// Front-end\n// =========\n\nexport function isPushSupported() {\n  return 'serviceWorker' in navigator && 'PushManager' in window;\n}\n\nexport function getRegistration() {\n  // return navigator.serviceWorker.ready;\n  return navigator.serviceWorker.getRegistration();\n}\n\nasync function getSubscription() {\n  const registration = await getRegistration();\n  const subscription = registration\n    ? await registration.pushManager.getSubscription()\n    : undefined;\n  return { registration, subscription };\n}\n\nfunction urlBase64ToUint8Array(base64String) {\n  const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n  const base64 = `${base64String}${padding}`\n    .replace(/-/g, '+')\n    .replace(/_/g, '/');\n\n  const rawData = window.atob(base64);\n  const outputArray = new Uint8Array(rawData.length);\n\n  for (let i = 0; i < rawData.length; ++i) {\n    outputArray[i] = rawData.charCodeAt(i);\n  }\n\n  return outputArray;\n}\n\n// Front-end <-> back-end\n// ======================\n\nexport async function initSubscription() {\n  if (!isPushSupported()) return;\n  const { subscription } = await getSubscription();\n  let backendSubscription = null;\n  try {\n    backendSubscription = await fetchBackendPushSubscription();\n  } catch (err) {\n    if (/(not found|unknown)/i.test(err.message)) {\n      // No subscription found\n    } else {\n      // Other error\n      throw err;\n    }\n  }\n  console.log('INIT subscription', {\n    subscription,\n    backendSubscription,\n  });\n\n  // Check if the subscription changed\n  if (backendSubscription && subscription) {\n    const sameEndpoint = backendSubscription.endpoint === subscription.endpoint;\n    const vapidKey = getVapidKey();\n    const sameKey = backendSubscription.serverKey === vapidKey;\n    if (!sameEndpoint) {\n      throw new Error('Backend subscription endpoint changed');\n    }\n    if (sameKey) {\n      // Subscription didn't change\n    } else {\n      // Subscription changed\n      console.error('๐Ÿ”” Subscription changed', {\n        sameEndpoint,\n        serverKey: backendSubscription.serverKey,\n        vapIdKey: vapidKey,\n        endpoint1: backendSubscription.endpoint,\n        endpoint2: subscription.endpoint,\n        sameKey,\n        key1: backendSubscription.serverKey,\n        key2: vapidKey,\n      });\n      throw new Error('Backend subscription key and vapid key changed');\n      // Only unsubscribe from backend, not from browser\n      // await removeBackendPushSubscription();\n      // // Now let's resubscribe\n      // // NOTE: I have no idea if this works\n      // return await updateSubscription({\n      //   data: backendSubscription.data,\n      //   policy: backendSubscription.policy,\n      // });\n    }\n  }\n\n  if (subscription && !backendSubscription) {\n    // check if account's vapidKey is same as subscription's applicationServerKey\n    const vapidKey = getVapidKey();\n    if (vapidKey) {\n      const { applicationServerKey } = subscription.options;\n      const vapidKeyStr = urlBase64ToUint8Array(vapidKey).toString();\n      const applicationServerKeyStr = new Uint8Array(\n        applicationServerKey,\n      ).toString();\n      const sameKey = vapidKeyStr === applicationServerKeyStr;\n      if (sameKey) {\n        // Subscription didn't change\n      } else {\n        // Subscription changed\n        console.error('๐Ÿ”” Subscription changed', {\n          vapidKeyStr,\n          applicationServerKeyStr,\n          sameKey,\n        });\n        // Unsubscribe since backend doesn't have a subscription\n        await subscription.unsubscribe();\n        throw new Error('Subscription key and vapid key changed');\n      }\n    } else {\n      console.warn('No vapidKey found');\n    }\n  }\n\n  // Check if backend subscription returns 404\n  // if (subscription && !backendSubscription) {\n  //   // Re-subscribe to backend\n  //   backendSubscription = await createBackendPushSubscription({\n  //     subscription,\n  //     data: {},\n  //     policy: 'all',\n  //   });\n  // }\n\n  return { subscription, backendSubscription };\n}\n\nexport async function updateSubscription({ data, policy }) {\n  console.log('๐Ÿ”” Updating subscription', { data, policy });\n  if (!isPushSupported()) return;\n  let { registration, subscription } = await getSubscription();\n  let backendSubscription = null;\n\n  if (subscription) {\n    try {\n      backendSubscription = await updateBackendPushSubscription({\n        data,\n        policy,\n      });\n      // TODO: save subscription in user settings\n    } catch (error) {\n      // Backend doesn't have a subscription for this user\n      // Create a new one\n      backendSubscription = await createBackendPushSubscription({\n        subscription,\n        data,\n        policy,\n      });\n      // TODO: save subscription in user settings\n    }\n  } else {\n    // User is not subscribed\n    const vapidKey = getVapidKey();\n    if (!vapidKey) throw new Error('No server key found');\n    subscription = await registration.pushManager.subscribe({\n      userVisibleOnly: true,\n      applicationServerKey: urlBase64ToUint8Array(vapidKey),\n    });\n    backendSubscription = await createBackendPushSubscription({\n      subscription,\n      data,\n      policy,\n    });\n    // TODO: save subscription in user settings\n  }\n\n  return { subscription, backendSubscription };\n}\n\nexport async function removeSubscription() {\n  if (!isPushSupported()) return;\n  const { subscription } = await getSubscription();\n  if (subscription) {\n    await removeBackendPushSubscription();\n    await subscription.unsubscribe();\n  }\n}\n","import './settings.css';\n\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport logo from '../assets/logo.svg';\n\nimport Icon from '../components/icon';\nimport LangSelector from '../components/lang-selector';\nimport Link from '../components/link';\nimport RelativeTime from '../components/relative-time';\nimport targetLanguages from '../data/lingva-target-languages';\nimport { api } from '../utils/api';\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport localeCode2Text from '../utils/localeCode2Text';\nimport prettyBytes from '../utils/pretty-bytes';\nimport {\n  initSubscription,\n  isPushSupported,\n  removeSubscription,\n  updateSubscription,\n} from '../utils/push-notifications';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport store from '../utils/store';\nimport supports from '../utils/supports';\n\nconst DEFAULT_TEXT_SIZE = 16;\nconst TEXT_SIZES = [14, 15, 16, 17, 18, 19, 20];\nconst {\n  PHANPY_WEBSITE: WEBSITE,\n  PHANPY_PRIVACY_POLICY_URL: PRIVACY_POLICY_URL,\n  PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL,\n  PHANPY_GIPHY_API_KEY: GIPHY_API_KEY,\n} = import.meta.env;\n\nfunction Settings({ onClose }) {\n  const { t } = useLingui();\n  const snapStates = useSnapshot(states);\n  const currentTheme = store.local.get('theme') || 'auto';\n  const themeFormRef = useRef();\n  const targetLanguage =\n    snapStates.settings.contentTranslationTargetLanguage || null;\n  const systemTargetLanguage = getTranslateTargetLanguage();\n  const systemTargetLanguageText = localeCode2Text(systemTargetLanguage);\n  const currentTextSize = store.local.get('textSize') || DEFAULT_TEXT_SIZE;\n\n  const [prefs, setPrefs] = useState(store.account.get('preferences') || {});\n  const { masto, authenticated, instance } = api();\n  // Get preferences every time Settings is opened\n  // NOTE: Disabled for now because I don't expect this to change often. Also for some reason, the /api/v1/preferences endpoint is cached for a while and return old prefs if refresh immediately after changing them.\n  // useEffect(() => {\n  //   const { masto } = api();\n  //   (async () => {\n  //     try {\n  //       const preferences = await masto.v1.preferences.fetch();\n  //       setPrefs(preferences);\n  //       store.account.set('preferences', preferences);\n  //     } catch (e) {\n  //       // Silently fail\n  //       console.error(e);\n  //     }\n  //   })();\n  // }, []);\n\n  return (\n    <div\n      id=\"settings-container\"\n      class=\"sheet\"\n      tabIndex=\"-1\"\n      style={{\n        '--current-text-size': `${currentTextSize}px`,\n      }}\n    >\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}\n      <header>\n        <h2>\n          <Trans>Settings</Trans>\n        </h2>\n      </header>\n      <main>\n        <section>\n          <ul>\n            <li>\n              <div>\n                <label>\n                  <Trans>Appearance</Trans>\n                </label>\n              </div>\n              <div>\n                <form\n                  ref={themeFormRef}\n                  onInput={(e) => {\n                    console.log(e);\n                    e.preventDefault();\n                    const formData = new FormData(themeFormRef.current);\n                    const theme = formData.get('theme');\n                    const html = document.documentElement;\n\n                    if (theme === 'auto') {\n                      html.classList.remove('is-light', 'is-dark');\n\n                      // Disable manual theme <meta>\n                      const $manualMeta = document.querySelector(\n                        'meta[data-theme-setting=\"manual\"]',\n                      );\n                      if ($manualMeta) {\n                        $manualMeta.name = '';\n                      }\n                      // Enable auto theme <meta>s\n                      const $autoMetas = document.querySelectorAll(\n                        'meta[data-theme-setting=\"auto\"]',\n                      );\n                      $autoMetas.forEach((m) => {\n                        m.name = 'theme-color';\n                      });\n                    } else {\n                      html.classList.toggle('is-light', theme === 'light');\n                      html.classList.toggle('is-dark', theme === 'dark');\n\n                      // Enable manual theme <meta>\n                      const $manualMeta = document.querySelector(\n                        'meta[data-theme-setting=\"manual\"]',\n                      );\n                      if ($manualMeta) {\n                        $manualMeta.name = 'theme-color';\n                        $manualMeta.content =\n                          theme === 'light'\n                            ? $manualMeta.dataset.themeLightColor\n                            : $manualMeta.dataset.themeDarkColor;\n                      }\n                      // Disable auto theme <meta>s\n                      const $autoMetas = document.querySelectorAll(\n                        'meta[data-theme-setting=\"auto\"]',\n                      );\n                      $autoMetas.forEach((m) => {\n                        m.name = '';\n                      });\n                    }\n                    document\n                      .querySelector('meta[name=\"color-scheme\"]')\n                      .setAttribute(\n                        'content',\n                        theme === 'auto' ? 'dark light' : theme,\n                      );\n\n                    if (theme === 'auto') {\n                      store.local.del('theme');\n                    } else {\n                      store.local.set('theme', theme);\n                    }\n                  }}\n                >\n                  <div class=\"radio-group\">\n                    <label>\n                      <input\n                        type=\"radio\"\n                        name=\"theme\"\n                        value=\"light\"\n                        defaultChecked={currentTheme === 'light'}\n                      />\n                      <span>\n                        <Trans>Light</Trans>\n                      </span>\n                    </label>\n                    <label>\n                      <input\n                        type=\"radio\"\n                        name=\"theme\"\n                        value=\"dark\"\n                        defaultChecked={currentTheme === 'dark'}\n                      />\n                      <span>\n                        <Trans>Dark</Trans>\n                      </span>\n                    </label>\n                    <label>\n                      <input\n                        type=\"radio\"\n                        name=\"theme\"\n                        value=\"auto\"\n                        defaultChecked={\n                          currentTheme !== 'light' && currentTheme !== 'dark'\n                        }\n                      />\n                      <span>\n                        <Trans>Auto</Trans>\n                      </span>\n                    </label>\n                  </div>\n                </form>\n              </div>\n            </li>\n            <li>\n              <div>\n                <label>\n                  <Trans>Text size</Trans>\n                </label>\n              </div>\n              <div class=\"range-group\">\n                <span style={{ fontSize: TEXT_SIZES[0] }}>\n                  <Trans comment=\"Preview of one character, in smallest size\">\n                    A\n                  </Trans>\n                </span>{' '}\n                <input\n                  type=\"range\"\n                  min={TEXT_SIZES[0]}\n                  max={TEXT_SIZES[TEXT_SIZES.length - 1]}\n                  step=\"1\"\n                  value={currentTextSize}\n                  list=\"sizes\"\n                  onChange={(e) => {\n                    const value = parseInt(e.target.value, 10);\n                    const html = document.documentElement;\n                    // set CSS variable\n                    html.style.setProperty('--text-size', `${value}px`);\n                    // save to local storage\n                    if (value === DEFAULT_TEXT_SIZE) {\n                      store.local.del('textSize');\n                    } else {\n                      store.local.set('textSize', e.target.value);\n                    }\n                  }}\n                />{' '}\n                <span style={{ fontSize: TEXT_SIZES[TEXT_SIZES.length - 1] }}>\n                  <Trans comment=\"Preview of one character, in largest size\">\n                    A\n                  </Trans>\n                </span>\n                <datalist id=\"sizes\">\n                  {TEXT_SIZES.map((size) => (\n                    <option value={size} />\n                  ))}\n                </datalist>\n              </div>\n            </li>\n            <li>\n              <span>\n                <label>\n                  <Trans>Display language</Trans>\n                </label>\n                <br />\n                <small>\n                  <a\n                    href=\"https://crowdin.com/project/phanpy\"\n                    target=\"_blank\"\n                    rel=\"noopener noreferrer\"\n                  >\n                    <Trans>Volunteer translations</Trans>\n                  </a>\n                </small>\n              </span>\n              <LangSelector />\n            </li>\n          </ul>\n        </section>\n        {authenticated && (\n          <>\n            <h3>\n              <Trans>Posting</Trans>\n            </h3>\n            <section>\n              <ul>\n                <li>\n                  <div>\n                    <label for=\"posting-privacy-field\">\n                      <Trans>Default visibility</Trans>{' '}\n                      <Icon icon=\"cloud\" alt={t`Synced`} class=\"synced-icon\" />\n                    </label>\n                  </div>\n                  <div>\n                    <select\n                      id=\"posting-privacy-field\"\n                      value={prefs['posting:default:visibility'] || 'public'}\n                      onChange={(e) => {\n                        const { value } = e.target;\n                        (async () => {\n                          try {\n                            await masto.v1.accounts.updateCredentials({\n                              source: {\n                                privacy: value,\n                              },\n                            });\n                            setPrefs({\n                              ...prefs,\n                              'posting:default:visibility': value,\n                            });\n                            store.account.set('preferences', {\n                              ...prefs,\n                              'posting:default:visibility': value,\n                            });\n                          } catch (e) {\n                            alert(t`Failed to update posting privacy`);\n                            console.error(e);\n                          }\n                        })();\n                      }}\n                    >\n                      <option value=\"public\">\n                        <Trans>Public</Trans>\n                      </option>\n                      <option value=\"unlisted\">\n                        <Trans>Unlisted</Trans>\n                      </option>\n                      <option value=\"private\">\n                        <Trans>Followers only</Trans>\n                      </option>\n                    </select>\n                  </div>\n                </li>\n              </ul>\n            </section>\n            <p class=\"section-postnote\">\n              <Icon icon=\"cloud\" alt={t`Synced`} class=\"synced-icon\" />{' '}\n              <small>\n                <Trans>\n                  Synced to your instance server's settings.{' '}\n                  <a\n                    href={`https://${instance}/`}\n                    target=\"_blank\"\n                    rel=\"noopener noreferrer\"\n                  >\n                    Go to your instance ({instance}) for more settings.\n                  </a>\n                </Trans>\n              </small>\n            </p>\n          </>\n        )}\n        <h3>\n          <Trans>Experiments</Trans>\n        </h3>\n        <section>\n          <ul>\n            <li class=\"block\">\n              <label>\n                <input\n                  type=\"checkbox\"\n                  checked={snapStates.settings.autoRefresh}\n                  onChange={(e) => {\n                    states.settings.autoRefresh = e.target.checked;\n                  }}\n                />{' '}\n                <Trans>Auto refresh timeline posts</Trans>\n              </label>\n            </li>\n            <li class=\"block\">\n              <label>\n                <input\n                  type=\"checkbox\"\n                  checked={snapStates.settings.boostsCarousel}\n                  onChange={(e) => {\n                    states.settings.boostsCarousel = e.target.checked;\n                  }}\n                />{' '}\n                <Trans>Boosts carousel</Trans>\n              </label>\n            </li>\n            <li class=\"block\">\n              <label>\n                <input\n                  type=\"checkbox\"\n                  checked={snapStates.settings.contentTranslation}\n                  onChange={(e) => {\n                    const { checked } = e.target;\n                    states.settings.contentTranslation = checked;\n                    if (!checked) {\n                      states.settings.contentTranslationTargetLanguage = null;\n                    }\n                  }}\n                />{' '}\n                <Trans>Post translation</Trans>\n              </label>\n              <div\n                class={`sub-section ${\n                  !snapStates.settings.contentTranslation\n                    ? 'more-insignificant'\n                    : ''\n                }`}\n              >\n                <div>\n                  <label>\n                    <Trans>Translate to </Trans>{' '}\n                    <select\n                      value={targetLanguage || ''}\n                      disabled={!snapStates.settings.contentTranslation}\n                      style={{ width: '10em' }}\n                      onChange={(e) => {\n                        states.settings.contentTranslationTargetLanguage =\n                          e.target.value || null;\n                      }}\n                    >\n                      <option value=\"\">\n                        <Trans>\n                          System language ({systemTargetLanguageText})\n                        </Trans>\n                      </option>\n                      <option disabled>โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€</option>\n                      {targetLanguages.map((lang) => {\n                        const common = localeCode2Text({\n                          code: lang.code,\n                          fallback: lang.name,\n                        });\n                        const native = localeCode2Text({\n                          code: lang.code,\n                          locale: lang.code,\n                        });\n                        const showCommon = common !== native;\n                        return (\n                          <option value={lang.code}>\n                            {showCommon ? `${native} - ${common}` : common}\n                          </option>\n                        );\n                      })}\n                    </select>\n                  </label>\n                </div>\n                <hr />\n                <div class=\"checkbox-fieldset\">\n                  <Plural\n                    value={\n                      snapStates.settings.contentTranslationHideLanguages.length\n                    }\n                    _0={`Hide \"Translate\" button for:`}\n                    other={`Hide \"Translate\" button for (#):`}\n                  />\n                  <div class=\"checkbox-fields\">\n                    {targetLanguages.map((lang) => {\n                      const common = localeCode2Text({\n                        code: lang.code,\n                        fallback: lang.name,\n                      });\n                      const native = localeCode2Text({\n                        code: lang.code,\n                        locale: lang.code,\n                      });\n                      const showCommon = common !== native;\n                      return (\n                        <label>\n                          <input\n                            type=\"checkbox\"\n                            checked={snapStates.settings.contentTranslationHideLanguages.includes(\n                              lang.code,\n                            )}\n                            onChange={(e) => {\n                              const { checked } = e.target;\n                              if (checked) {\n                                states.settings.contentTranslationHideLanguages.push(\n                                  lang.code,\n                                );\n                              } else {\n                                states.settings.contentTranslationHideLanguages =\n                                  snapStates.settings.contentTranslationHideLanguages.filter(\n                                    (code) => code !== lang.code,\n                                  );\n                              }\n                            }}\n                          />{' '}\n                          {showCommon ? (\n                            <span>\n                              {native}{' '}\n                              <span class=\"insignificant\">- {common}</span>\n                            </span>\n                          ) : (\n                            common\n                          )}\n                        </label>\n                      );\n                    })}\n                  </div>\n                </div>\n                <p class=\"insignificant\">\n                  <small>\n                    <Trans>\n                      Note: This feature uses external translation services,\n                      powered by{' '}\n                      <a\n                        href=\"https://github.com/cheeaun/lingva-api\"\n                        target=\"_blank\"\n                        rel=\"noopener noreferrer\"\n                      >\n                        Lingva API\n                      </a>{' '}\n                      &amp;{' '}\n                      <a\n                        href=\"https://github.com/thedaviddelta/lingva-translate\"\n                        target=\"_blank\"\n                        rel=\"noopener noreferrer\"\n                      >\n                        Lingva Translate\n                      </a>\n                      .\n                    </Trans>\n                  </small>\n                </p>\n                <hr />\n                <div>\n                  <label>\n                    <input\n                      type=\"checkbox\"\n                      checked={snapStates.settings.contentTranslationAutoInline}\n                      disabled={!snapStates.settings.contentTranslation}\n                      onChange={(e) => {\n                        states.settings.contentTranslationAutoInline =\n                          e.target.checked;\n                      }}\n                    />{' '}\n                    <Trans>Auto inline translation</Trans>\n                  </label>\n                  <p class=\"insignificant\">\n                    <small>\n                      <Trans>\n                        Automatically show translation for posts in timeline.\n                        Only works for <b>short</b> posts without content\n                        warning, media and poll.\n                      </Trans>\n                    </small>\n                  </p>\n                </div>\n              </div>\n            </li>\n            {!!GIPHY_API_KEY && authenticated && (\n              <li class=\"block\">\n                <label>\n                  <input\n                    type=\"checkbox\"\n                    checked={snapStates.settings.composerGIFPicker}\n                    onChange={(e) => {\n                      states.settings.composerGIFPicker = e.target.checked;\n                    }}\n                  />{' '}\n                  <Trans>GIF Picker for composer</Trans>\n                </label>\n                <div class=\"sub-section insignificant\">\n                  <small>\n                    <Trans>\n                      Note: This feature uses external GIF search service,\n                      powered by{' '}\n                      <a\n                        href=\"https://developers.giphy.com/\"\n                        target=\"_blank\"\n                        rel=\"noopener noreferrer\"\n                      >\n                        GIPHY\n                      </a>\n                      . G-rated (suitable for viewing by all ages), tracking\n                      parameters are stripped, referrer information is omitted\n                      from requests, but search queries and IP address\n                      information will still reach their servers.\n                    </Trans>\n                  </small>\n                </div>\n              </li>\n            )}\n            {!!IMG_ALT_API_URL && authenticated && (\n              <li class=\"block\">\n                <label>\n                  <input\n                    type=\"checkbox\"\n                    checked={snapStates.settings.mediaAltGenerator}\n                    onChange={(e) => {\n                      states.settings.mediaAltGenerator = e.target.checked;\n                    }}\n                  />{' '}\n                  <Trans>Image description generator</Trans>{' '}\n                  <Icon icon=\"sparkles2\" class=\"more-insignificant\" />\n                </label>\n                <div class=\"sub-section insignificant\">\n                  <small>\n                    <Trans>\n                      Only for new images while composing new posts.\n                    </Trans>\n                  </small>\n                </div>\n                <div class=\"sub-section insignificant\">\n                  <small>\n                    <Trans>\n                      Note: This feature uses external AI service, powered by{' '}\n                      <a\n                        href=\"https://github.com/cheeaun/img-alt-api\"\n                        target=\"_blank\"\n                        rel=\"noopener noreferrer\"\n                      >\n                        img-alt-api\n                      </a>\n                      . May not work well. Only for images and in English.\n                    </Trans>\n                  </small>\n                </div>\n              </li>\n            )}\n            {authenticated && supports('@mastodon/grouped-notifications') && (\n              <li class=\"block\">\n                <label>\n                  <input\n                    type=\"checkbox\"\n                    checked={snapStates.settings.groupedNotificationsAlpha}\n                    onChange={(e) => {\n                      states.settings.groupedNotificationsAlpha =\n                        e.target.checked;\n                    }}\n                  />{' '}\n                  <Trans>Server-side grouped notifications</Trans>\n                </label>\n                <div class=\"sub-section insignificant\">\n                  <small>\n                    <Trans>\n                      Alpha-stage feature. Potentially improved grouping window\n                      but basic grouping logic.\n                    </Trans>\n                  </small>\n                </div>\n              </li>\n            )}\n            {authenticated && (\n              <li class=\"block\">\n                <label>\n                  <input\n                    type=\"checkbox\"\n                    checked={\n                      snapStates.settings.shortcutSettingsCloudImportExport\n                    }\n                    onChange={(e) => {\n                      states.settings.shortcutSettingsCloudImportExport =\n                        e.target.checked;\n                    }}\n                  />{' '}\n                  <Trans>\"Cloud\" import/export for shortcuts settings</Trans>{' '}\n                  <Icon icon=\"cloud\" class=\"more-insignificant\" />\n                </label>\n                <div class=\"sub-section insignificant\">\n                  <small>\n                    <Trans>\n                      โš ๏ธโš ๏ธโš ๏ธ Very experimental.\n                      <br />\n                      Stored in your own profileโ€™s notes. Profile (private)\n                      notes are mainly used for other profiles, and hidden for\n                      own profile.\n                    </Trans>\n                  </small>\n                </div>\n                <div class=\"sub-section insignificant\">\n                  <small>\n                    <Trans>\n                      Note: This feature uses currently-logged-in instance\n                      server API.\n                    </Trans>\n                  </small>\n                </div>\n              </li>\n            )}\n            <li class=\"block\">\n              <label>\n                <input\n                  type=\"checkbox\"\n                  checked={snapStates.settings.cloakMode}\n                  onChange={(e) => {\n                    states.settings.cloakMode = e.target.checked;\n                  }}\n                />{' '}\n                <Trans>\n                  Cloak mode{' '}\n                  <span class=\"insignificant\">\n                    (<samp>Text</samp> โ†’ <samp>โ–ˆโ–ˆโ–ˆโ–ˆ</samp>)\n                  </span>\n                </Trans>\n              </label>\n              <div class=\"sub-section insignificant\">\n                <small>\n                  <Trans>\n                    Replace text as blocks, useful when taking screenshots, for\n                    privacy reasons.\n                  </Trans>\n                </small>\n              </div>\n            </li>\n            {authenticated && (\n              <li>\n                <button\n                  type=\"button\"\n                  class=\"light\"\n                  onClick={() => {\n                    states.showDrafts = true;\n                    states.showSettings = false;\n                  }}\n                >\n                  <Trans>Unsent drafts</Trans>\n                </button>\n              </li>\n            )}\n          </ul>\n        </section>\n        {authenticated && <PushNotificationsSection onClose={onClose} />}\n        <h3>\n          <Trans>About</Trans>\n        </h3>\n        <section>\n          <div\n            style={{\n              display: 'flex',\n              flexWrap: 'wrap',\n              gap: 8,\n              lineHeight: 1.25,\n              alignItems: 'center',\n              marginTop: 8,\n            }}\n          >\n            <img\n              src={logo}\n              alt=\"\"\n              width=\"64\"\n              height=\"64\"\n              style={{\n                aspectRatio: '1/1',\n                verticalAlign: 'middle',\n                background: '#b7cdf9',\n                borderRadius: 12,\n              }}\n            />\n            <div>\n              <b>Phanpy</b>{' '}\n              <a\n                href=\"https://hachyderm.io/@phanpy\"\n                // target=\"_blank\"\n                rel=\"noopener noreferrer\"\n                onClick={(e) => {\n                  e.preventDefault();\n                  states.showAccount = 'phanpy@hachyderm.io';\n                }}\n              >\n                @phanpy\n              </a>\n              <br />\n              <Trans>\n                <a\n                  href=\"https://github.com/cheeaun/phanpy\"\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                >\n                  Built\n                </a>{' '}\n                by{' '}\n                <a\n                  href=\"https://mastodon.social/@cheeaun\"\n                  // target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                  onClick={(e) => {\n                    e.preventDefault();\n                    states.showAccount = 'cheeaun@mastodon.social';\n                  }}\n                >\n                  @cheeaun\n                </a>\n              </Trans>\n            </div>\n          </div>\n          <p>\n            <a\n              href=\"https://github.com/sponsors/cheeaun\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              <Trans>Sponsor</Trans>\n            </a>{' '}\n            &middot;{' '}\n            <a\n              href=\"https://www.buymeacoffee.com/cheeaun\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              <Trans>Donate</Trans>\n            </a>{' '}\n            &middot;{' '}\n            <a\n              href=\"https://patreon.com/cheeaun\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              Patreon\n            </a>{' '}\n            &middot;{' '}\n            <a\n              href={PRIVACY_POLICY_URL}\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              <Trans>Privacy Policy</Trans>\n            </a>\n          </p>\n          {__BUILD_TIME__ && (\n            <p>\n              {WEBSITE && (\n                <>\n                  <Trans>\n                    <span class=\"insignificant\">Site:</span>{' '}\n                    {WEBSITE.replace(/https?:\\/\\//g, '').replace(/\\/$/, '')}\n                  </Trans>\n                  <br />\n                </>\n              )}\n              <Trans>\n                <span class=\"insignificant\">Version:</span>{' '}\n                <input\n                  type=\"text\"\n                  class=\"version-string\"\n                  readOnly\n                  size=\"18\" // Manually calculated here\n                  value={`${__BUILD_TIME__.slice(0, 10).replace(/-/g, '.')}${\n                    __COMMIT_HASH__ ? `.${__COMMIT_HASH__}` : ''\n                  }`}\n                  onClick={(e) => {\n                    e.target.select();\n                    // Copy to clipboard\n                    try {\n                      navigator.clipboard.writeText(e.target.value);\n                      showToast(t`Version string copied`);\n                    } catch (e) {\n                      console.warn(e);\n                      showToast(t`Unable to copy version string`);\n                    }\n                  }}\n                />{' '}\n                {!__FAKE_COMMIT_HASH__ && (\n                  <span class=\"ib insignificant\">\n                    (\n                    <a\n                      href={`https://github.com/cheeaun/phanpy/commit/${__COMMIT_HASH__}`}\n                      target=\"_blank\"\n                      rel=\"noopener noreferrer\"\n                    >\n                      <RelativeTime datetime={new Date(__BUILD_TIME__)} />\n                    </a>\n                    )\n                  </span>\n                )}\n              </Trans>\n            </p>\n          )}\n        </section>\n        {(import.meta.env.DEV || import.meta.env.PHANPY_DEV) && (\n          <details class=\"debug-info\">\n            <summary></summary>\n            <p>Debugging</p>\n            {__BENCH_RESULTS?.size > 0 && (\n              <ul>\n                {Array.from(__BENCH_RESULTS.entries()).map(\n                  ([name, duration]) => (\n                    <li>\n                      <b>{name}</b>: {duration}ms\n                    </li>\n                  ),\n                )}\n              </ul>\n            )}\n            <p>Service Worker Cache</p>\n            <button\n              type=\"button\"\n              class=\"plain2 small\"\n              onClick={async () => alert(await getCachesKeys())}\n            >\n              Show keys count\n            </button>{' '}\n            <button\n              type=\"button\"\n              class=\"plain2 small\"\n              onClick={async () => alert(await getCachesSize())}\n            >\n              Show cache size\n            </button>{' '}\n            <button\n              type=\"button\"\n              class=\"plain2 small\"\n              onClick={() => {\n                const key = prompt('Enter cache key');\n                if (!key) return;\n                try {\n                  clearCacheKey(key);\n                } catch (e) {\n                  alert(e);\n                }\n              }}\n            >\n              Clear cache key\n            </button>{' '}\n            <button\n              type=\"button\"\n              class=\"plain2 small\"\n              onClick={() => {\n                try {\n                  clearCaches();\n                } catch (e) {\n                  alert(e);\n                }\n              }}\n            >\n              Clear all caches\n            </button>\n          </details>\n        )}\n      </main>\n    </div>\n  );\n}\n\nasync function getCachesKeys() {\n  const keys = await caches.keys();\n  const total = {};\n  for (const key of keys) {\n    const cache = await caches.open(key);\n    const k = await cache.keys();\n    total[key] = k.length;\n  }\n  return total;\n}\n\nasync function getCachesSize() {\n  const keys = await caches.keys();\n  let total = {};\n  let TOTAL = 0;\n  for (const key of keys) {\n    const cache = await caches.open(key);\n    const k = await cache.keys();\n    for (const item of k) {\n      try {\n        const response = await cache.match(item);\n        const blob = await response.blob();\n        total[key] = (total[key] || 0) + blob.size;\n        TOTAL += blob.size;\n      } catch (e) {\n        alert('Failed to get cache size for ' + item);\n        alert(e);\n      }\n    }\n  }\n  return {\n    ...Object.fromEntries(\n      Object.entries(total).map(([k, v]) => [k, prettyBytes(v)]),\n    ),\n    TOTAL: prettyBytes(TOTAL),\n  };\n}\n\nfunction clearCacheKey(key) {\n  return caches.delete(key);\n}\n\nasync function clearCaches() {\n  const keys = await caches.keys();\n  for (const key of keys) {\n    await caches.delete(key);\n  }\n}\n\nfunction PushNotificationsSection({ onClose }) {\n  const { t } = useLingui();\n  if (!isPushSupported()) return null;\n\n  const { instance } = api();\n  const [uiState, setUIState] = useState('default');\n  const pushFormRef = useRef();\n  const [allowNotifications, setAllowNotifications] = useState(false);\n  const [needRelogin, setNeedRelogin] = useState(false);\n  const previousPolicyRef = useRef();\n  useEffect(() => {\n    (async () => {\n      setUIState('loading');\n      try {\n        const { subscription, backendSubscription } = await initSubscription();\n        if (\n          backendSubscription?.policy &&\n          backendSubscription.policy !== 'none'\n        ) {\n          setAllowNotifications(true);\n          const { alerts, policy } = backendSubscription;\n          console.log('backendSubscription', backendSubscription);\n          previousPolicyRef.current = policy;\n          const { elements } = pushFormRef.current;\n          const policyEl = elements.namedItem('policy');\n          if (policyEl) policyEl.value = policy;\n          // alerts is {}, iterate it\n          Object.keys(alerts).forEach((alert) => {\n            const el = elements.namedItem(alert);\n            if (el?.type === 'checkbox') {\n              el.checked = true;\n            }\n          });\n        }\n        setUIState('default');\n      } catch (err) {\n        console.warn(err);\n        if (/outside.*authorized/i.test(err.message)) {\n          setNeedRelogin(true);\n        } else {\n          alert(err?.message || err);\n        }\n        setUIState('error');\n      }\n    })();\n  }, []);\n\n  const isLoading = uiState === 'loading';\n\n  return (\n    <form\n      ref={pushFormRef}\n      onChange={() => {\n        setTimeout(() => {\n          const values = Object.fromEntries(new FormData(pushFormRef.current));\n          const allowNotifications = !!values['policy-allow'];\n          const params = {\n            data: {\n              policy: values.policy,\n              alerts: {\n                mention: !!values.mention,\n                favourite: !!values.favourite,\n                reblog: !!values.reblog,\n                follow: !!values.follow,\n                follow_request: !!values.followRequest,\n                poll: !!values.poll,\n                update: !!values.update,\n                status: !!values.status,\n              },\n            },\n          };\n\n          let alertsCount = 0;\n          // Remove false values from data.alerts\n          // API defaults to false anyway\n          Object.keys(params.data.alerts).forEach((key) => {\n            if (!params.data.alerts[key]) {\n              delete params.data.alerts[key];\n            } else {\n              alertsCount++;\n            }\n          });\n          const policyChanged =\n            previousPolicyRef.current !== params.data.policy;\n\n          console.log('PN Form', {\n            values,\n            allowNotifications: allowNotifications,\n            params,\n          });\n\n          if (allowNotifications && alertsCount > 0) {\n            if (policyChanged) {\n              console.debug('Policy changed.');\n              removeSubscription()\n                .then(() => {\n                  updateSubscription(params);\n                })\n                .catch((err) => {\n                  console.warn(err);\n                  alert(t`Failed to update subscription. Please try again.`);\n                });\n            } else {\n              updateSubscription(params).catch((err) => {\n                console.warn(err);\n                alert(t`Failed to update subscription. Please try again.`);\n              });\n            }\n          } else {\n            removeSubscription().catch((err) => {\n              console.warn(err);\n              alert(t`Failed to remove subscription. Please try again.`);\n            });\n          }\n        }, 100);\n      }}\n    >\n      <h3>\n        <Trans>Push Notifications (beta)</Trans>\n      </h3>\n      <section>\n        <ul>\n          <li>\n            <label>\n              <input\n                type=\"checkbox\"\n                disabled={isLoading || needRelogin}\n                name=\"policy-allow\"\n                checked={allowNotifications}\n                onChange={async (e) => {\n                  const { checked } = e.target;\n                  if (checked) {\n                    // Request permission\n                    const permission = await Notification.requestPermission();\n                    if (permission === 'granted') {\n                      setAllowNotifications(true);\n                    } else {\n                      setAllowNotifications(false);\n                      if (permission === 'denied') {\n                        alert(\n                          t`Push notifications are blocked. Please enable them in your browser settings.`,\n                        );\n                      }\n                    }\n                  } else {\n                    setAllowNotifications(false);\n                  }\n                }}\n              />{' '}\n              <Trans>\n                Allow from{' '}\n                <select\n                  name=\"policy\"\n                  disabled={isLoading || needRelogin || !allowNotifications}\n                >\n                  {[\n                    {\n                      value: 'all',\n                      label: t`anyone`,\n                    },\n                    {\n                      value: 'followed',\n                      label: t`people I follow`,\n                    },\n                    {\n                      value: 'follower',\n                      label: t`followers`,\n                    },\n                  ].map((type) => (\n                    <option value={type.value}>{type.label}</option>\n                  ))}\n                </select>\n              </Trans>\n            </label>\n            <div\n              class=\"shazam-container no-animation\"\n              style={{\n                width: '100%',\n              }}\n              hidden={!allowNotifications}\n            >\n              <div class=\"shazam-container-inner\">\n                <div class=\"sub-section\">\n                  <ul>\n                    {[\n                      {\n                        value: 'mention',\n                        label: t`Mentions`,\n                      },\n                      {\n                        value: 'favourite',\n                        label: t`Likes`,\n                      },\n                      {\n                        value: 'reblog',\n                        label: t`Boosts`,\n                      },\n                      {\n                        value: 'follow',\n                        label: t`Follows`,\n                      },\n                      {\n                        value: 'followRequest',\n                        label: t`Follow requests`,\n                      },\n                      {\n                        value: 'poll',\n                        label: t`Polls`,\n                      },\n                      {\n                        value: 'update',\n                        label: t`Post edits`,\n                      },\n                      {\n                        value: 'status',\n                        label: t`New posts`,\n                      },\n                    ].map((alert) => (\n                      <li>\n                        <label>\n                          <input type=\"checkbox\" name={alert.value} />{' '}\n                          {alert.label}\n                        </label>\n                      </li>\n                    ))}\n                  </ul>\n                </div>\n              </div>\n            </div>\n            {needRelogin && (\n              <div class=\"sub-section\">\n                <p>\n                  <Trans>\n                    Push permission was not granted since your last login.\n                    You'll need to{' '}\n                    <Link to={`/login?instance=${instance}`} onClick={onClose}>\n                      <b>log in</b> again to grant push permission\n                    </Link>\n                    .\n                  </Trans>\n                </p>\n              </div>\n            )}\n          </li>\n        </ul>\n      </section>\n      <p class=\"section-postnote\">\n        <small>\n          <Trans>\n            NOTE: Push notifications only work for <b>one account</b>.\n          </Trans>\n        </small>\n      </p>\n    </form>\n  );\n}\n\nexport default Settings;\n","const focusDeck = () => {\n  let timer = setTimeout(() => {\n    const columns = document.getElementById('columns');\n    if (columns) {\n      // Focus focused column\n      const focusedColumn = columns.querySelector('.deck-container.focus');\n      if (focusedColumn) {\n        focusedColumn.focus();\n      } else {\n        // Focus first column within viewport\n        const firstVisibleColumn = Array.from(\n          columns.querySelectorAll('.deck-container'),\n        ).find((column) => {\n          const columnRect = column.getBoundingClientRect();\n          return columnRect.left >= 0;\n        });\n        if (firstVisibleColumn) {\n          firstVisibleColumn.focus();\n        } else {\n          // Focus first column\n          columns.querySelector('.deck-container')?.focus?.();\n        }\n      }\n    } else {\n      const modals = document.querySelectorAll('#modal-container > *');\n      if (modals?.length) {\n        // Focus last modal\n        const modal = modals[modals.length - 1]; // last one\n        const modalFocusElement =\n          modal.querySelector('[tabindex=\"-1\"]') || modal;\n        if (modalFocusElement) {\n          modalFocusElement.focus();\n          return;\n        }\n      }\n      const backDrop = document.querySelector('.deck-backdrop');\n      if (backDrop) return;\n      // Focus last deck\n      const pages = document.querySelectorAll('.deck-container');\n      const page = pages[pages.length - 1]; // last one\n      if (page && page.tabIndex === -1) {\n        console.log('FOCUS', page);\n        page.focus();\n      }\n    }\n  }, 100);\n  return () => clearTimeout(timer);\n};\n\nexport default focusDeck;\n","import { useEffect, useRef } from 'preact/hooks';\nimport { useLocation } from 'react-router-dom';\n\n// Hook that runs a callback when the location changes\n// Won't run on the first render\n\nexport default function useLocationChange(fn) {\n  if (!fn) return;\n  const location = useLocation();\n  const currentLocationRef = useRef(location.pathname);\n  useEffect(() => {\n    // console.log('location', {\n    //   current: currentLocationRef.current,\n    //   next: location.pathname,\n    // });\n    if (\n      currentLocationRef.current &&\n      location.pathname !== currentLocationRef.current\n    ) {\n      fn?.();\n    }\n  }, [location.pathname, fn]);\n}\n","import { api } from './api';\nimport pmem from './pmem';\nimport store from './store';\n\nconst FETCH_MAX_AGE = 1000 * 60; // 1 minute\nconst MAX_AGE = 24 * 60 * 60 * 1000; // 1 day\n\nexport const fetchLists = pmem(\n  async () => {\n    const { masto } = api();\n    const lists = await masto.v1.lists.list();\n    lists.sort((a, b) => a.title.localeCompare(b.title));\n\n    if (lists.length) {\n      setTimeout(() => {\n        // Save to local storage, with saved timestamp\n        store.account.set('lists', {\n          lists,\n          updatedAt: Date.now(),\n        });\n      }, 1);\n    }\n\n    return lists;\n  },\n  {\n    maxAge: FETCH_MAX_AGE,\n  },\n);\n\nexport async function getLists() {\n  try {\n    const { lists, updatedAt } = store.account.get('lists') || {};\n    if (!lists?.length) return await fetchLists();\n    if (Date.now() - updatedAt > MAX_AGE) {\n      // Stale-while-revalidate\n      fetchLists();\n      return lists;\n    }\n    return lists;\n  } catch (e) {\n    return [];\n  }\n}\n\nexport const fetchList = pmem(\n  (id) => {\n    const { masto } = api();\n    return masto.v1.lists.$select(id).fetch();\n  },\n  {\n    maxAge: FETCH_MAX_AGE,\n  },\n);\n\nexport async function getList(id) {\n  const { lists } = store.account.get('lists') || {};\n  console.log({ lists });\n  if (lists?.length) {\n    const theList = lists.find((l) => l.id === id);\n    if (theList) return theList;\n  }\n  try {\n    return fetchList(id);\n  } catch (e) {\n    return null;\n  }\n}\n\nexport async function getListTitle(id) {\n  const list = await getList(id);\n  return list?.title || '';\n}\n\nexport function addListStore(list) {\n  const { lists } = store.account.get('lists') || {};\n  if (lists?.length) {\n    lists.push(list);\n    lists.sort((a, b) => a.title.localeCompare(b.title));\n    store.account.set('lists', {\n      lists,\n      updatedAt: Date.now(),\n    });\n  }\n}\n\nexport function updateListStore(list) {\n  const { lists } = store.account.get('lists') || {};\n  if (lists?.length) {\n    const index = lists.findIndex((l) => l.id === list.id);\n    if (index !== -1) {\n      lists[index] = list;\n      lists.sort((a, b) => a.title.localeCompare(b.title));\n      store.account.set('lists', {\n        lists,\n        updatedAt: Date.now(),\n      });\n    }\n  }\n}\n\nexport function deleteListStore(listID) {\n  const { lists } = store.account.get('lists') || {};\n  if (lists?.length) {\n    const index = lists.findIndex((l) => l.id === listID);\n    if (index !== -1) {\n      lists.splice(index, 1);\n      store.account.set('lists', {\n        lists,\n        updatedAt: Date.now(),\n      });\n    }\n  }\n}\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport { addListStore, deleteListStore, updateListStore } from '../utils/lists';\nimport supports from '../utils/supports';\n\nimport Icon from './icon';\nimport MenuConfirm from './menu-confirm';\n\nfunction ListAddEdit({ list, onClose }) {\n  const { t } = useLingui();\n  const { masto } = api();\n  const [uiState, setUIState] = useState('default');\n  const editMode = !!list;\n  const nameFieldRef = useRef();\n  const repliesPolicyFieldRef = useRef();\n  const exclusiveFieldRef = useRef();\n  useEffect(() => {\n    if (editMode) {\n      nameFieldRef.current.value = list.title;\n      repliesPolicyFieldRef.current.value = list.repliesPolicy;\n      if (exclusiveFieldRef.current) {\n        exclusiveFieldRef.current.checked = list.exclusive;\n      }\n    }\n  }, [editMode]);\n  const supportsExclusive =\n    supports('@mastodon/list-exclusive') ||\n    supports('@gotosocial/list-exclusive');\n\n  return (\n    <div class=\"sheet\">\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}{' '}\n      <header>\n        <h2>{editMode ? t`Edit list` : t`New list`}</h2>\n      </header>\n      <main>\n        <form\n          class=\"list-form\"\n          onSubmit={(e) => {\n            e.preventDefault(); // Get form values\n\n            const formData = new FormData(e.target);\n            const title = formData.get('title');\n            const repliesPolicy = formData.get('replies_policy');\n            const exclusive = formData.get('exclusive') === 'on';\n            console.log({\n              title,\n              repliesPolicy,\n              exclusive,\n            });\n            setUIState('loading');\n\n            (async () => {\n              try {\n                let listResult;\n\n                if (editMode) {\n                  listResult = await masto.v1.lists.$select(list.id).update({\n                    title,\n                    replies_policy: repliesPolicy,\n                    exclusive,\n                  });\n                } else {\n                  listResult = await masto.v1.lists.create({\n                    title,\n                    replies_policy: repliesPolicy,\n                    exclusive,\n                  });\n                }\n\n                console.log(listResult);\n                setUIState('default');\n                onClose?.({\n                  state: 'success',\n                  list: listResult,\n                });\n\n                setTimeout(() => {\n                  if (editMode) {\n                    updateListStore(listResult);\n                  } else {\n                    addListStore(listResult);\n                  }\n                }, 1);\n              } catch (e) {\n                console.error(e);\n                setUIState('error');\n                alert(\n                  editMode\n                    ? t`Unable to edit list.`\n                    : t`Unable to create list.`,\n                );\n              }\n            })();\n          }}\n        >\n          <div class=\"list-form-row\">\n            <label for=\"list-title\">\n              <Trans>Name</Trans>{' '}\n              <input\n                ref={nameFieldRef}\n                type=\"text\"\n                id=\"list-title\"\n                name=\"title\"\n                required\n                disabled={uiState === 'loading'}\n                dir=\"auto\"\n              />\n            </label>\n          </div>\n          <div class=\"list-form-row\">\n            <select\n              ref={repliesPolicyFieldRef}\n              name=\"replies_policy\"\n              required\n              disabled={uiState === 'loading'}\n            >\n              <option value=\"list\">\n                <Trans>Show replies to list members</Trans>\n              </option>\n              <option value=\"followed\">\n                <Trans>Show replies to people I follow</Trans>\n              </option>\n              <option value=\"none\">\n                <Trans>Don't show replies</Trans>\n              </option>\n            </select>\n          </div>\n          {supportsExclusive && (\n            <div class=\"list-form-row\">\n              <label class=\"label-block\">\n                <input\n                  ref={exclusiveFieldRef}\n                  type=\"checkbox\"\n                  name=\"exclusive\"\n                  disabled={uiState === 'loading'}\n                />{' '}\n                <Trans>Hide posts on this list from Home/Following</Trans>\n              </label>\n            </div>\n          )}\n          <div class=\"list-form-footer\">\n            <button type=\"submit\" disabled={uiState === 'loading'}>\n              {editMode ? t`Save` : t`Create`}\n            </button>\n            {editMode && (\n              <MenuConfirm\n                disabled={uiState === 'loading'}\n                align=\"end\"\n                menuItemClassName=\"danger\"\n                confirmLabel={t`Delete this list?`}\n                onClick={() => {\n                  // const yes = confirm('Delete this list?');\n                  // if (!yes) return;\n                  setUIState('loading');\n\n                  (async () => {\n                    try {\n                      await masto.v1.lists.$select(list.id).remove();\n                      setUIState('default');\n                      onClose?.({\n                        state: 'deleted',\n                      });\n                      setTimeout(() => {\n                        deleteListStore(list.id);\n                      }, 1);\n                    } catch (e) {\n                      console.error(e);\n                      setUIState('error');\n                      alert(t`Unable to delete list.`);\n                    }\n                  })();\n                }}\n              >\n                <button\n                  type=\"button\"\n                  class=\"light danger\"\n                  disabled={uiState === 'loading'}\n                >\n                  <Trans>Deleteโ€ฆ</Trans>\n                </button>\n              </MenuConfirm>\n            )}\n          </div>\n        </form>\n      </main>\n    </div>\n  );\n}\n\nexport default ListAddEdit;\n","import './account-info.css';\n\nimport { msg, plural } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport {\n  useCallback,\n  useEffect,\n  useMemo,\n  useReducer,\n  useRef,\n  useState,\n} from 'preact/hooks';\nimport punycode from 'punycode/';\n\nimport { api } from '../utils/api';\nimport enhanceContent from '../utils/enhance-content';\nimport getHTMLText from '../utils/getHTMLText';\nimport handleContentLinks from '../utils/handle-content-links';\nimport i18nDuration from '../utils/i18n-duration';\nimport { getLists } from '../utils/lists';\nimport niceDateTime from '../utils/nice-date-time';\nimport pmem from '../utils/pmem';\nimport shortenNumber from '../utils/shorten-number';\nimport showCompose from '../utils/show-compose';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport store from '../utils/store';\nimport { getCurrentAccountID, updateAccount } from '../utils/store-utils';\nimport supports from '../utils/supports';\n\nimport AccountBlock from './account-block';\nimport Avatar from './avatar';\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\nimport Link from './link';\nimport ListAddEdit from './list-add-edit';\nimport Loader from './loader';\nimport MenuConfirm from './menu-confirm';\nimport MenuLink from './menu-link';\nimport Menu2 from './menu2';\nimport Modal from './modal';\nimport SubMenu2 from './submenu2';\nimport TranslationBlock from './translation-block';\n\nconst MUTE_DURATIONS = [\n  60 * 5, // 5 minutes\n  60 * 30, // 30 minutes\n  60 * 60, // 1 hour\n  60 * 60 * 6, // 6 hours\n  60 * 60 * 24, // 1 day\n  60 * 60 * 24 * 3, // 3 days\n  60 * 60 * 24 * 7, // 1 week\n  60 * 60 * 24 * 30, // 30 days\n  0, // forever\n];\nconst MUTE_DURATIONS_LABELS = {\n  0: msg`Forever`,\n  300: i18nDuration(5, 'minute'),\n  1_800: i18nDuration(30, 'minute'),\n  3_600: i18nDuration(1, 'hour'),\n  21_600: i18nDuration(6, 'hour'),\n  86_400: i18nDuration(1, 'day'),\n  259_200: i18nDuration(3, 'day'),\n  604_800: i18nDuration(1, 'week'),\n  2592_000: i18nDuration(30, 'day'),\n};\n\nconst LIMIT = 80;\n\nconst ACCOUNT_INFO_MAX_AGE = 1000 * 60 * 10; // 10 mins\n\nfunction fetchFamiliarFollowers(currentID, masto) {\n  return masto.v1.accounts.familiarFollowers.fetch({\n    id: [currentID],\n  });\n}\nconst memFetchFamiliarFollowers = pmem(fetchFamiliarFollowers, {\n  maxAge: ACCOUNT_INFO_MAX_AGE,\n});\n\nasync function fetchPostingStats(accountID, masto) {\n  const fetchStatuses = masto.v1.accounts\n    .$select(accountID)\n    .statuses.list({\n      limit: 20,\n    })\n    .next();\n\n  const { value: statuses } = await fetchStatuses;\n  console.log('fetched statuses', statuses);\n  const stats = {\n    total: statuses.length,\n    originals: 0,\n    replies: 0,\n    boosts: 0,\n  };\n  // Categories statuses by type\n  // - Original posts (not replies to others)\n  // - Threads (self-replies + 1st original post)\n  // - Boosts (reblogs)\n  // - Replies (not-self replies)\n  statuses.forEach((status) => {\n    if (status.reblog) {\n      stats.boosts++;\n    } else if (\n      !!status.inReplyToId &&\n      status.inReplyToAccountId !== status.account.id // Not self-reply\n    ) {\n      stats.replies++;\n    } else {\n      stats.originals++;\n    }\n  });\n\n  // Count days since last post\n  if (statuses.length) {\n    stats.daysSinceLastPost = Math.ceil(\n      (Date.now() - new Date(statuses[statuses.length - 1].createdAt)) /\n        86400000,\n    );\n  }\n\n  console.log('posting stats', stats);\n  return stats;\n}\nconst memFetchPostingStats = pmem(fetchPostingStats, {\n  maxAge: ACCOUNT_INFO_MAX_AGE,\n});\n\nfunction AccountInfo({\n  account,\n  fetchAccount = () => {},\n  standalone,\n  instance,\n  authenticated,\n}) {\n  const { i18n, t } = useLingui();\n  const { masto } = api({\n    instance,\n  });\n  const { masto: currentMasto, instance: currentInstance } = api();\n  const [uiState, setUIState] = useState('default');\n  const isString = typeof account === 'string';\n  const [info, setInfo] = useState(isString ? null : account);\n\n  const sameCurrentInstance = useMemo(\n    () => instance === currentInstance,\n    [instance, currentInstance],\n  );\n\n  useEffect(() => {\n    if (!isString) {\n      setInfo(account);\n      return;\n    }\n    setUIState('loading');\n    (async () => {\n      try {\n        const info = await fetchAccount();\n        states.accounts[`${info.id}@${instance}`] = info;\n        setInfo(info);\n        setUIState('default');\n      } catch (e) {\n        console.error(e);\n        setInfo(null);\n        setUIState('error');\n      }\n    })();\n  }, [isString, account, fetchAccount]);\n\n  const {\n    acct,\n    avatar,\n    avatarStatic,\n    bot,\n    createdAt,\n    displayName,\n    emojis,\n    fields,\n    followersCount,\n    followingCount,\n    group,\n    // header,\n    // headerStatic,\n    id,\n    lastStatusAt,\n    locked,\n    note,\n    statusesCount,\n    url,\n    username,\n    memorial,\n    moved,\n    roles,\n    hideCollections,\n  } = info || {};\n  let headerIsAvatar = false;\n  let { header, headerStatic } = info || {};\n  if (!header || /missing\\.png$/.test(header)) {\n    if (avatar && !/missing\\.png$/.test(avatar)) {\n      header = avatar;\n      headerIsAvatar = true;\n      if (avatarStatic && !/missing\\.png$/.test(avatarStatic)) {\n        headerStatic = avatarStatic;\n      }\n    }\n  }\n\n  const isSelf = useMemo(() => id === getCurrentAccountID(), [id]);\n\n  useEffect(() => {\n    const infoHasEssentials = !!(\n      info?.id &&\n      info?.username &&\n      info?.acct &&\n      info?.avatar &&\n      info?.avatarStatic &&\n      info?.displayName &&\n      info?.url\n    );\n    if (isSelf && instance && infoHasEssentials) {\n      const accounts = store.local.getJSON('accounts');\n      let updated = false;\n      accounts.forEach((account) => {\n        if (account.info.id === info.id && account.instanceURL === instance) {\n          account.info = info;\n          updated = true;\n        }\n      });\n      if (updated) {\n        console.log('Updated account info', info);\n        store.local.setJSON('accounts', accounts);\n      }\n    }\n  }, [isSelf, info, instance]);\n\n  const accountInstance = useMemo(() => {\n    if (!url) return null;\n    const domain = punycode.toUnicode(URL.parse(url).hostname);\n    return domain;\n  }, [url]);\n\n  const [headerCornerColors, setHeaderCornerColors] = useState([]);\n\n  const followersIterator = useRef();\n  const familiarFollowersCache = useRef([]);\n  async function fetchFollowers(firstLoad) {\n    if (firstLoad || !followersIterator.current) {\n      followersIterator.current = masto.v1.accounts.$select(id).followers.list({\n        limit: LIMIT,\n      });\n    }\n    const results = await followersIterator.current.next();\n    if (isSelf) return results;\n    if (!sameCurrentInstance) return results;\n\n    const { value } = results;\n    let newValue = [];\n    // On first load, fetch familiar followers, merge to top of results' `value`\n    // Remove dups on every fetch\n    if (firstLoad) {\n      let familiarFollowers = [];\n      try {\n        familiarFollowers = await masto.v1.accounts.familiarFollowers.fetch({\n          id: [id],\n        });\n      } catch (e) {}\n      familiarFollowersCache.current = familiarFollowers?.[0]?.accounts || [];\n      newValue = [\n        ...familiarFollowersCache.current,\n        ...value.filter(\n          (account) =>\n            !familiarFollowersCache.current.some(\n              (familiar) => familiar.id === account.id,\n            ),\n        ),\n      ];\n    } else if (value?.length) {\n      newValue = value.filter(\n        (account) =>\n          !familiarFollowersCache.current.some(\n            (familiar) => familiar.id === account.id,\n          ),\n      );\n    }\n\n    return {\n      ...results,\n      value: newValue,\n    };\n  }\n\n  const followingIterator = useRef();\n  async function fetchFollowing(firstLoad) {\n    if (firstLoad || !followingIterator.current) {\n      followingIterator.current = masto.v1.accounts.$select(id).following.list({\n        limit: LIMIT,\n      });\n    }\n    const results = await followingIterator.current.next();\n    return results;\n  }\n\n  const LinkOrDiv = standalone ? 'div' : Link;\n  const accountLink = instance ? `/${instance}/a/${id}` : `/a/${id}`;\n\n  const [familiarFollowers, setFamiliarFollowers] = useState([]);\n  const [postingStats, setPostingStats] = useState();\n  const [postingStatsUIState, setPostingStatsUIState] = useState('default');\n  const hasPostingStats = !!postingStats?.total;\n\n  const renderFamiliarFollowers = async (currentID) => {\n    try {\n      const followers = await memFetchFamiliarFollowers(\n        currentID,\n        currentMasto,\n      );\n      console.log('fetched familiar followers', followers);\n      setFamiliarFollowers(\n        followers[0].accounts.slice(0, FAMILIAR_FOLLOWERS_LIMIT),\n      );\n    } catch (e) {\n      console.error(e);\n    }\n  };\n\n  const renderPostingStats = async () => {\n    if (!id) return;\n    setPostingStatsUIState('loading');\n    try {\n      const stats = await memFetchPostingStats(id, masto);\n      setPostingStats(stats);\n      setPostingStatsUIState('default');\n    } catch (e) {\n      console.error(e);\n      setPostingStatsUIState('error');\n    }\n  };\n\n  const onRelationshipChange = useCallback(\n    ({ relationship, currentID }) => {\n      if (!relationship.following) {\n        renderFamiliarFollowers(currentID);\n        if (!standalone && statusesCount > 0) {\n          // Only render posting stats if not standalone and has posts\n          renderPostingStats();\n        }\n      }\n    },\n    [standalone, id, statusesCount],\n  );\n\n  const onProfileUpdate = useCallback(\n    (newAccount) => {\n      if (newAccount.id === id) {\n        console.log('Updated account info', newAccount);\n        setInfo(newAccount);\n        states.accounts[`${newAccount.id}@${instance}`] = newAccount;\n      }\n    },\n    [id, instance],\n  );\n\n  return (\n    <div\n      tabIndex=\"-1\"\n      class={`account-container ${uiState === 'loading' ? 'skeleton' : ''}`}\n      style={{\n        '--header-color-1': headerCornerColors[0],\n        '--header-color-2': headerCornerColors[1],\n        '--header-color-3': headerCornerColors[2],\n        '--header-color-4': headerCornerColors[3],\n      }}\n    >\n      {uiState === 'error' && (\n        <div class=\"ui-state\">\n          <p>\n            <Trans>Unable to load account.</Trans>\n          </p>\n          <p>\n            <a\n              href={isString ? account : url}\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              <Trans>Go to account page</Trans> <Icon icon=\"external\" />\n            </a>\n          </p>\n        </div>\n      )}\n      {uiState === 'loading' ? (\n        <>\n          <header>\n            <AccountBlock avatarSize=\"xxxl\" skeleton />\n          </header>\n          <main>\n            <div class=\"note\">\n              <p>โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆ</p>\n              <p>โ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ</p>\n            </div>\n            <div class=\"account-metadata-box\">\n              <div class=\"profile-metadata\">\n                <div class=\"profile-field\">\n                  <b class=\"more-insignificant\">โ–ˆโ–ˆโ–ˆ</b>\n                  <p>โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ</p>\n                </div>\n                <div class=\"profile-field\">\n                  <b class=\"more-insignificant\">โ–ˆโ–ˆโ–ˆโ–ˆ</b>\n                  <p>โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ</p>\n                </div>\n              </div>\n              <div class=\"stats\">\n                <div>\n                  <span>โ–ˆโ–ˆ</span> <Trans>Followers</Trans>\n                </div>\n                <div>\n                  <span>โ–ˆโ–ˆ</span> <Trans id=\"following.stats\">Following</Trans>\n                </div>\n                <div>\n                  <span>โ–ˆโ–ˆ</span> <Trans>Posts</Trans>\n                </div>\n              </div>\n            </div>\n            <div class=\"actions\">\n              <span />\n              <span class=\"buttons\">\n                <button type=\"button\" class=\"plain\" disabled>\n                  <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n                </button>\n              </span>\n            </div>\n          </main>\n        </>\n      ) : (\n        info && (\n          <>\n            {!!moved && (\n              <div class=\"account-moved\">\n                <p>\n                  <Trans>\n                    <b>{displayName}</b> has indicated that their new account is\n                    now:\n                  </Trans>\n                </p>\n                <AccountBlock\n                  account={moved}\n                  instance={instance}\n                  onClick={(e) => {\n                    e.stopPropagation();\n                    states.showAccount = moved;\n                  }}\n                />\n              </div>\n            )}\n            {!!header && !/missing\\.png$/.test(header) && (\n              <img\n                src={header}\n                alt=\"\"\n                class={`header-banner ${\n                  headerIsAvatar ? 'header-is-avatar' : ''\n                }`}\n                onError={(e) => {\n                  if (e.target.crossOrigin) {\n                    if (e.target.src !== headerStatic) {\n                      e.target.src = headerStatic;\n                    } else {\n                      e.target.removeAttribute('crossorigin');\n                      e.target.src = header;\n                    }\n                  } else if (e.target.src !== headerStatic) {\n                    e.target.src = headerStatic;\n                  } else {\n                    e.target.remove();\n                  }\n                }}\n                crossOrigin=\"anonymous\"\n                onLoad={(e) => {\n                  e.target.classList.add('loaded');\n                  try {\n                    // Get color from four corners of image\n                    const canvas = window.OffscreenCanvas\n                      ? new OffscreenCanvas(1, 1)\n                      : document.createElement('canvas');\n                    const ctx = canvas.getContext('2d', {\n                      willReadFrequently: true,\n                    });\n                    canvas.width = e.target.width;\n                    canvas.height = e.target.height;\n                    ctx.imageSmoothingEnabled = false;\n                    ctx.drawImage(e.target, 0, 0);\n                    // const colors = [\n                    //   ctx.getImageData(0, 0, 1, 1).data,\n                    //   ctx.getImageData(e.target.width - 1, 0, 1, 1).data,\n                    //   ctx.getImageData(0, e.target.height - 1, 1, 1).data,\n                    //   ctx.getImageData(\n                    //     e.target.width - 1,\n                    //     e.target.height - 1,\n                    //     1,\n                    //     1,\n                    //   ).data,\n                    // ];\n                    // Get 10x10 pixels from corners, get average color from each\n                    const pixelDimension = 10;\n                    const colors = [\n                      ctx.getImageData(0, 0, pixelDimension, pixelDimension)\n                        .data,\n                      ctx.getImageData(\n                        e.target.width - pixelDimension,\n                        0,\n                        pixelDimension,\n                        pixelDimension,\n                      ).data,\n                      ctx.getImageData(\n                        0,\n                        e.target.height - pixelDimension,\n                        pixelDimension,\n                        pixelDimension,\n                      ).data,\n                      ctx.getImageData(\n                        e.target.width - pixelDimension,\n                        e.target.height - pixelDimension,\n                        pixelDimension,\n                        pixelDimension,\n                      ).data,\n                    ].map((data) => {\n                      let r = 0;\n                      let g = 0;\n                      let b = 0;\n                      let a = 0;\n                      for (let i = 0; i < data.length; i += 4) {\n                        r += data[i];\n                        g += data[i + 1];\n                        b += data[i + 2];\n                        a += data[i + 3];\n                      }\n                      const dataLength = data.length / 4;\n                      return [\n                        r / dataLength,\n                        g / dataLength,\n                        b / dataLength,\n                        a / dataLength,\n                      ];\n                    });\n                    const rgbColors = colors.map((color) => {\n                      const [r, g, b, a] = lightenRGB(color);\n                      return `rgba(${r}, ${g}, ${b}, ${a})`;\n                    });\n                    setHeaderCornerColors(rgbColors);\n                    console.log({ colors, rgbColors });\n                  } catch (e) {\n                    // Silently fail\n                  }\n                }}\n              />\n            )}\n            <header>\n              {standalone ? (\n                <Menu2\n                  shift={\n                    window.matchMedia('(min-width: calc(40em))').matches\n                      ? 114\n                      : 64\n                  }\n                  menuButton={\n                    <div>\n                      <AccountBlock\n                        account={info}\n                        instance={instance}\n                        avatarSize=\"xxxl\"\n                        onClick={() => {}}\n                      />\n                    </div>\n                  }\n                >\n                  <div class=\"szh-menu__header\">\n                    <AccountHandleInfo acct={acct} instance={instance} />\n                  </div>\n                  <MenuItem\n                    onClick={() => {\n                      const handleWithInstance = acct.includes('@')\n                        ? `@${acct}`\n                        : `@${acct}@${instance}`;\n                      try {\n                        navigator.clipboard.writeText(handleWithInstance);\n                        showToast(t`Handle copied`);\n                      } catch (e) {\n                        console.error(e);\n                        showToast(t`Unable to copy handle`);\n                      }\n                    }}\n                  >\n                    <Icon icon=\"link\" />\n                    <span>\n                      <Trans>Copy handle</Trans>\n                    </span>\n                  </MenuItem>\n                  <MenuItem href={url} target=\"_blank\">\n                    <Icon icon=\"external\" />\n                    <span>\n                      <Trans>Go to original profile page</Trans>\n                    </span>\n                  </MenuItem>\n                  <MenuDivider />\n                  <MenuLink href={info.avatar} target=\"_blank\">\n                    <Icon icon=\"user\" />\n                    <span>\n                      <Trans>View profile image</Trans>\n                    </span>\n                  </MenuLink>\n                  <MenuLink href={info.header} target=\"_blank\">\n                    <Icon icon=\"media\" />\n                    <span>\n                      <Trans>View profile header</Trans>\n                    </span>\n                  </MenuLink>\n                </Menu2>\n              ) : (\n                <AccountBlock\n                  account={info}\n                  instance={instance}\n                  avatarSize=\"xxxl\"\n                  internal\n                />\n              )}\n            </header>\n            <div class=\"faux-header-bg\" aria-hidden=\"true\" />\n            <main>\n              {!!memorial && (\n                <span class=\"tag\">\n                  <Trans>In Memoriam</Trans>\n                </span>\n              )}\n              {!!bot && (\n                <span class=\"tag\">\n                  <Icon icon=\"bot\" /> <Trans>Automated</Trans>\n                </span>\n              )}\n              {!!group && (\n                <span class=\"tag\">\n                  <Icon icon=\"group\" /> <Trans>Group</Trans>\n                </span>\n              )}\n              {roles?.map((role) => (\n                <span class=\"tag\">\n                  {role.name}\n                  {!!accountInstance && (\n                    <>\n                      {' '}\n                      <span class=\"more-insignificant\">{accountInstance}</span>\n                    </>\n                  )}\n                </span>\n              ))}\n              <div\n                class=\"note\"\n                dir=\"auto\"\n                onClick={handleContentLinks({\n                  instance: currentInstance,\n                })}\n                dangerouslySetInnerHTML={{\n                  __html: enhanceContent(note, { emojis }),\n                }}\n              />\n              <div class=\"account-metadata-box\">\n                {fields?.length > 0 && (\n                  <div class=\"profile-metadata\">\n                    {fields.map(({ name, value, verifiedAt }, i) => (\n                      <div\n                        class={`profile-field ${\n                          verifiedAt ? 'profile-verified' : ''\n                        }`}\n                        key={name + i}\n                        dir=\"auto\"\n                      >\n                        <b>\n                          <EmojiText text={name} emojis={emojis} />{' '}\n                          {!!verifiedAt && (\n                            <Icon\n                              icon=\"check-circle\"\n                              size=\"s\"\n                              alt={t`Verified`}\n                            />\n                          )}\n                        </b>\n                        <p\n                          dangerouslySetInnerHTML={{\n                            __html: enhanceContent(value, { emojis }),\n                          }}\n                        />\n                      </div>\n                    ))}\n                  </div>\n                )}\n                <div class=\"stats\">\n                  <LinkOrDiv\n                    tabIndex={0}\n                    to={accountLink}\n                    onClick={() => {\n                      // states.showAccount = false;\n                      setTimeout(() => {\n                        states.showGenericAccounts = {\n                          id: 'followers',\n                          heading: t`Followers`,\n                          fetchAccounts: fetchFollowers,\n                          instance,\n                          excludeRelationshipAttrs: isSelf\n                            ? ['followedBy']\n                            : [],\n                          blankCopy: hideCollections\n                            ? t`This user has chosen to not make this information available.`\n                            : undefined,\n                        };\n                      }, 0);\n                    }}\n                  >\n                    {!!familiarFollowers.length && (\n                      <span class=\"shazam-container-horizontal\">\n                        <span class=\"shazam-container-inner stats-avatars-bunch\">\n                          {familiarFollowers.map((follower) => (\n                            <Avatar\n                              url={follower.avatarStatic}\n                              size=\"s\"\n                              alt={`${follower.displayName} @${follower.acct}`}\n                              squircle={follower?.bot}\n                            />\n                          ))}\n                        </span>\n                      </span>\n                    )}\n                    <span title={followersCount}>\n                      {shortenNumber(followersCount)}\n                    </span>{' '}\n                    <Trans>Followers</Trans>\n                  </LinkOrDiv>\n                  <LinkOrDiv\n                    class=\"insignificant\"\n                    tabIndex={0}\n                    to={accountLink}\n                    onClick={() => {\n                      // states.showAccount = false;\n                      setTimeout(() => {\n                        states.showGenericAccounts = {\n                          heading: t({\n                            id: 'following.stats',\n                            message: 'Following',\n                          }),\n                          fetchAccounts: fetchFollowing,\n                          instance,\n                          excludeRelationshipAttrs: isSelf ? ['following'] : [],\n                          blankCopy: hideCollections\n                            ? t`This user has chosen to not make this information available.`\n                            : undefined,\n                        };\n                      }, 0);\n                    }}\n                  >\n                    <span title={followingCount}>\n                      {shortenNumber(followingCount)}\n                    </span>{' '}\n                    <Trans id=\"following.stats\">Following</Trans>\n                    <br />\n                  </LinkOrDiv>\n                  <LinkOrDiv\n                    class=\"insignificant\"\n                    to={accountLink}\n                    // onClick={\n                    //   standalone\n                    //     ? undefined\n                    //     : () => {\n                    //         hideAllModals();\n                    //       }\n                    // }\n                  >\n                    <span title={statusesCount}>\n                      {shortenNumber(statusesCount)}\n                    </span>{' '}\n                    <Trans>Posts</Trans>\n                  </LinkOrDiv>\n                  {!!createdAt && (\n                    <div class=\"insignificant\">\n                      <Trans>\n                        Joined{' '}\n                        <time datetime={createdAt}>\n                          {niceDateTime(createdAt, {\n                            hideTime: true,\n                          })}\n                        </time>\n                      </Trans>\n                    </div>\n                  )}\n                </div>\n              </div>\n              {!!postingStats && (\n                <LinkOrDiv\n                  to={accountLink}\n                  class=\"account-metadata-box\"\n                  // onClick={() => {\n                  //   states.showAccount = false;\n                  // }}\n                >\n                  <div class=\"shazam-container\">\n                    <div class=\"shazam-container-inner\">\n                      {hasPostingStats ? (\n                        <div\n                          class=\"posting-stats\"\n                          title={t`${(\n                            postingStats.originals / postingStats.total\n                          ).toLocaleString(i18n.locale || undefined, {\n                            style: 'percent',\n                          })} original posts, ${(\n                            postingStats.replies / postingStats.total\n                          ).toLocaleString(i18n.locale || undefined, {\n                            style: 'percent',\n                          })} replies, ${(\n                            postingStats.boosts / postingStats.total\n                          ).toLocaleString(i18n.locale || undefined, {\n                            style: 'percent',\n                          })} boosts`}\n                        >\n                          <div>\n                            {postingStats.daysSinceLastPost < 365\n                              ? plural(postingStats.total, {\n                                  one: plural(postingStats.daysSinceLastPost, {\n                                    one: `Last 1 post in the past 1 day`,\n                                    other: `Last 1 post in the past ${postingStats.daysSinceLastPost} days`,\n                                  }),\n                                  other: plural(\n                                    postingStats.daysSinceLastPost,\n                                    {\n                                      one: `Last ${postingStats.total} posts in the past 1 day`,\n                                      other: `Last ${postingStats.total} posts in the past ${postingStats.daysSinceLastPost} days`,\n                                    },\n                                  ),\n                                })\n                              : plural(postingStats.total, {\n                                  one: 'Last 1 post in the past year(s)',\n                                  other: `Last ${postingStats.total} posts in the past year(s)`,\n                                })}\n                          </div>\n                          <div\n                            class=\"posting-stats-bar\"\n                            style={{\n                              // [originals | replies | boosts]\n                              '--originals-percentage': `${\n                                (postingStats.originals / postingStats.total) *\n                                100\n                              }%`,\n                              '--replies-percentage': `${\n                                ((postingStats.originals +\n                                  postingStats.replies) /\n                                  postingStats.total) *\n                                100\n                              }%`,\n                            }}\n                          />\n                          <div class=\"posting-stats-legends\">\n                            <span class=\"ib\">\n                              <span class=\"posting-stats-legend-item posting-stats-legend-item-originals\" />{' '}\n                              <Trans>Original</Trans>\n                            </span>{' '}\n                            <span class=\"ib\">\n                              <span class=\"posting-stats-legend-item posting-stats-legend-item-replies\" />{' '}\n                              <Trans>Replies</Trans>\n                            </span>{' '}\n                            <span class=\"ib\">\n                              <span class=\"posting-stats-legend-item posting-stats-legend-item-boosts\" />{' '}\n                              <Trans>Boosts</Trans>\n                            </span>\n                          </div>\n                        </div>\n                      ) : (\n                        <div class=\"posting-stats\">\n                          <Trans>Post stats unavailable.</Trans>\n                        </div>\n                      )}\n                    </div>\n                  </div>\n                </LinkOrDiv>\n              )}\n              {!moved && (\n                <div class=\"account-metadata-box\">\n                  <div\n                    class=\"shazam-container no-animation\"\n                    hidden={!!postingStats}\n                  >\n                    <div class=\"shazam-container-inner\">\n                      <button\n                        type=\"button\"\n                        class=\"posting-stats-button\"\n                        disabled={postingStatsUIState === 'loading'}\n                        onClick={() => {\n                          renderPostingStats();\n                        }}\n                      >\n                        <div\n                          class={`posting-stats-bar posting-stats-icon ${\n                            postingStatsUIState === 'loading' ? 'loading' : ''\n                          }`}\n                          style={{\n                            '--originals-percentage': '33%',\n                            '--replies-percentage': '66%',\n                          }}\n                        />\n                        <Trans>View post stats</Trans>{' '}\n                        {/* <Loader\n                        abrupt\n                        hidden={postingStatsUIState !== 'loading'}\n                      /> */}\n                      </button>\n                    </div>\n                  </div>\n                </div>\n              )}\n            </main>\n            <footer>\n              <RelatedActions\n                info={info}\n                instance={instance}\n                standalone={standalone}\n                authenticated={authenticated}\n                onRelationshipChange={onRelationshipChange}\n                onProfileUpdate={onProfileUpdate}\n              />\n            </footer>\n          </>\n        )\n      )}\n    </div>\n  );\n}\n\nconst FAMILIAR_FOLLOWERS_LIMIT = 3;\n\nfunction RelatedActions({\n  info,\n  instance,\n  standalone,\n  authenticated,\n  onRelationshipChange = () => {},\n  onProfileUpdate = () => {},\n}) {\n  if (!info) return null;\n  const { _, t } = useLingui();\n  const {\n    masto: currentMasto,\n    instance: currentInstance,\n    authenticated: currentAuthenticated,\n  } = api();\n  const sameInstance = instance === currentInstance;\n\n  const [relationshipUIState, setRelationshipUIState] = useState('default');\n  const [relationship, setRelationship] = useState(null);\n\n  const { id, acct, url, username, locked, lastStatusAt, note, fields, moved } =\n    info;\n  const accountID = useRef(id);\n\n  const {\n    following,\n    showingReblogs,\n    notifying,\n    followedBy,\n    blocking,\n    blockedBy,\n    muting,\n    mutingNotifications,\n    requested,\n    domainBlocking,\n    endorsed,\n    note: privateNote,\n  } = relationship || {};\n\n  const [currentInfo, setCurrentInfo] = useState(null);\n  const [isSelf, setIsSelf] = useState(false);\n\n  const acctWithInstance = acct.includes('@') ? acct : `${acct}@${instance}`;\n\n  useEffect(() => {\n    if (info) {\n      const currentAccount = getCurrentAccountID();\n      let currentID;\n      (async () => {\n        if (sameInstance && authenticated) {\n          currentID = id;\n        } else if (!sameInstance && currentAuthenticated) {\n          // Grab this account from my logged-in instance\n          const acctHasInstance = info.acct.includes('@');\n          try {\n            const results = await currentMasto.v2.search.fetch({\n              q: acctHasInstance ? info.acct : `${info.username}@${instance}`,\n              type: 'accounts',\n              limit: 1,\n              resolve: true,\n            });\n            console.log('๐Ÿฅ Fetched account from logged-in instance', results);\n            if (results.accounts.length) {\n              currentID = results.accounts[0].id;\n              setCurrentInfo(results.accounts[0]);\n            }\n          } catch (e) {\n            console.error(e);\n          }\n        }\n\n        if (!currentID) return;\n\n        if (currentAccount === currentID) {\n          // It's myself!\n          setIsSelf(true);\n          return;\n        }\n\n        accountID.current = currentID;\n\n        // if (moved) return;\n\n        setRelationshipUIState('loading');\n\n        const fetchRelationships = currentMasto.v1.accounts.relationships.fetch(\n          {\n            id: [currentID],\n          },\n        );\n\n        try {\n          const relationships = await fetchRelationships;\n          console.log('fetched relationship', relationships);\n          setRelationshipUIState('default');\n\n          if (relationships.length) {\n            const relationship = relationships[0];\n            setRelationship(relationship);\n            onRelationshipChange({ relationship, currentID });\n          }\n        } catch (e) {\n          console.error(e);\n          setRelationshipUIState('error');\n        }\n      })();\n    }\n  }, [info, authenticated]);\n\n  useEffect(() => {\n    if (info && isSelf) {\n      updateAccount(info);\n    }\n  }, [info, isSelf]);\n\n  const loading = relationshipUIState === 'loading';\n\n  const [showTranslatedBio, setShowTranslatedBio] = useState(false);\n  const [showAddRemoveLists, setShowAddRemoveLists] = useState(false);\n  const [showPrivateNoteModal, setShowPrivateNoteModal] = useState(false);\n  const [showEditProfile, setShowEditProfile] = useState(false);\n  const [lists, setLists] = useState([]);\n\n  return (\n    <>\n      <div class=\"actions\">\n        <span>\n          {followedBy ? (\n            <span class=\"tag\">\n              <Trans>Follows you</Trans>\n            </span>\n          ) : !!lastStatusAt ? (\n            <small class=\"insignificant\">\n              <Trans>\n                Last post:{' '}\n                <span class=\"ib\">\n                  {niceDateTime(lastStatusAt, {\n                    hideTime: true,\n                  })}\n                </span>\n              </Trans>\n            </small>\n          ) : (\n            <span />\n          )}\n          {muting && (\n            <span class=\"tag danger\">\n              <Trans>Muted</Trans>\n            </span>\n          )}\n          {blocking && (\n            <span class=\"tag danger\">\n              <Trans>Blocked</Trans>\n            </span>\n          )}\n        </span>{' '}\n        <span class=\"buttons\">\n          {!!privateNote && (\n            <button\n              type=\"button\"\n              class=\"private-note-tag\"\n              title={t`Private note`}\n              onClick={() => {\n                setShowPrivateNoteModal(true);\n              }}\n              dir=\"auto\"\n            >\n              <span>{privateNote}</span>\n            </button>\n          )}\n          <Menu2\n            portal={{\n              target: document.body,\n            }}\n            containerProps={{\n              style: {\n                // Higher than the backdrop\n                zIndex: 1001,\n              },\n            }}\n            align=\"center\"\n            position=\"anchor\"\n            overflow=\"auto\"\n            menuButton={\n              <button type=\"button\" class=\"plain\" disabled={loading}>\n                <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n              </button>\n            }\n            onMenuChange={(e) => {\n              if (following && e.open) {\n                // Fetch lists that have this account\n                (async () => {\n                  try {\n                    const lists = await currentMasto.v1.accounts\n                      .$select(accountID.current)\n                      .lists.list();\n                    console.log('fetched account lists', lists);\n                    setLists(lists);\n                  } catch (e) {\n                    console.error(e);\n                  }\n                })();\n              }\n            }}\n          >\n            {currentAuthenticated && !isSelf && (\n              <>\n                <MenuItem\n                  onClick={() => {\n                    showCompose({\n                      draftStatus: {\n                        status: `@${currentInfo?.acct || acct} `,\n                      },\n                    });\n                  }}\n                >\n                  <Icon icon=\"at\" />\n                  <span>\n                    <Trans>\n                      Mention <span class=\"bidi-isolate\">@{username}</span>\n                    </Trans>\n                  </span>\n                </MenuItem>\n                <MenuItem\n                  onClick={() => {\n                    setShowTranslatedBio(true);\n                  }}\n                >\n                  <Icon icon=\"translate\" />\n                  <span>\n                    <Trans>Translate bio</Trans>\n                  </span>\n                </MenuItem>\n                {supports('@mastodon/profile-private-note') && (\n                  <MenuItem\n                    onClick={() => {\n                      setShowPrivateNoteModal(true);\n                    }}\n                  >\n                    <Icon icon=\"pencil\" />\n                    <span>\n                      {privateNote ? t`Edit private note` : t`Add private note`}\n                    </span>\n                  </MenuItem>\n                )}\n                {following && !!relationship && (\n                  <>\n                    <MenuItem\n                      onClick={() => {\n                        setRelationshipUIState('loading');\n                        (async () => {\n                          try {\n                            const rel = await currentMasto.v1.accounts\n                              .$select(accountID.current)\n                              .follow({\n                                notify: !notifying,\n                              });\n                            if (rel) setRelationship(rel);\n                            setRelationshipUIState('default');\n                            showToast(\n                              rel.notifying\n                                ? t`Notifications enabled for @${username}'s posts.`\n                                : t` Notifications disabled for @${username}'s posts.`,\n                            );\n                          } catch (e) {\n                            alert(e);\n                            setRelationshipUIState('error');\n                          }\n                        })();\n                      }}\n                    >\n                      <Icon icon=\"notification\" />\n                      <span>\n                        {notifying\n                          ? t`Disable notifications`\n                          : t`Enable notifications`}\n                      </span>\n                    </MenuItem>\n                    <MenuItem\n                      onClick={() => {\n                        setRelationshipUIState('loading');\n                        (async () => {\n                          try {\n                            const rel = await currentMasto.v1.accounts\n                              .$select(accountID.current)\n                              .follow({\n                                reblogs: !showingReblogs,\n                              });\n                            if (rel) setRelationship(rel);\n                            setRelationshipUIState('default');\n                            showToast(\n                              rel.showingReblogs\n                                ? t`Boosts from @${username} enabled.`\n                                : t`Boosts from @${username} disabled.`,\n                            );\n                          } catch (e) {\n                            alert(e);\n                            setRelationshipUIState('error');\n                          }\n                        })();\n                      }}\n                    >\n                      <Icon icon=\"rocket\" />\n                      <span>\n                        {showingReblogs ? t`Disable boosts` : t`Enable boosts`}\n                      </span>\n                    </MenuItem>\n                  </>\n                )}\n                {/* Add/remove from lists is only possible if following the account */}\n                {following && (\n                  <MenuItem\n                    onClick={() => {\n                      setShowAddRemoveLists(true);\n                    }}\n                  >\n                    <Icon icon=\"list\" />\n                    {lists.length ? (\n                      <>\n                        <small class=\"menu-grow\">\n                          <Trans>Add/Remove from Lists</Trans>\n                          <br />\n                          <span class=\"more-insignificant\">\n                            {lists.map((list) => list.title).join(', ')}\n                          </span>\n                        </small>\n                        <small class=\"more-insignificant\">{lists.length}</small>\n                      </>\n                    ) : (\n                      <span>\n                        <Trans>Add/Remove from Lists</Trans>\n                      </span>\n                    )}\n                  </MenuItem>\n                )}\n                <MenuDivider />\n              </>\n            )}\n            <MenuItem\n              onClick={() => {\n                const handle = `@${currentInfo?.acct || acctWithInstance}`;\n                try {\n                  navigator.clipboard.writeText(handle);\n                  showToast(t`Handle copied`);\n                } catch (e) {\n                  console.error(e);\n                  showToast(t`Unable to copy handle`);\n                }\n              }}\n            >\n              <Icon icon=\"copy\" />\n              <small>\n                <Trans>Copy handle</Trans>\n                <br />\n                <span class=\"more-insignificant bidi-isolate\">\n                  @{currentInfo?.acct || acctWithInstance}\n                </span>\n              </small>\n            </MenuItem>\n            <MenuItem href={url} target=\"_blank\">\n              <Icon icon=\"external\" />\n              <small class=\"menu-double-lines\">{niceAccountURL(url)}</small>\n            </MenuItem>\n            <div class=\"menu-horizontal\">\n              <MenuItem\n                onClick={() => {\n                  // Copy url to clipboard\n                  try {\n                    navigator.clipboard.writeText(url);\n                    showToast(t`Link copied`);\n                  } catch (e) {\n                    console.error(e);\n                    showToast(t`Unable to copy link`);\n                  }\n                }}\n              >\n                <Icon icon=\"link\" />\n                <span>\n                  <Trans>Copy</Trans>\n                </span>\n              </MenuItem>\n              {navigator?.share &&\n                navigator?.canShare?.({\n                  url,\n                }) && (\n                  <MenuItem\n                    onClick={() => {\n                      try {\n                        navigator.share({\n                          url,\n                        });\n                      } catch (e) {\n                        console.error(e);\n                        alert(t`Sharing doesn't seem to work.`);\n                      }\n                    }}\n                  >\n                    <Icon icon=\"share\" />\n                    <span>\n                      <Trans>Shareโ€ฆ</Trans>\n                    </span>\n                  </MenuItem>\n                )}\n            </div>\n            {!!relationship && (\n              <>\n                <MenuDivider />\n                {muting ? (\n                  <MenuItem\n                    onClick={() => {\n                      setRelationshipUIState('loading');\n                      (async () => {\n                        try {\n                          const newRelationship = await currentMasto.v1.accounts\n                            .$select(currentInfo?.id || id)\n                            .unmute();\n                          console.log('unmuting', newRelationship);\n                          setRelationship(newRelationship);\n                          setRelationshipUIState('default');\n                          showToast(t`Unmuted @${username}`);\n                          states.reloadGenericAccounts.id = 'mute';\n                          states.reloadGenericAccounts.counter++;\n                        } catch (e) {\n                          console.error(e);\n                          setRelationshipUIState('error');\n                        }\n                      })();\n                    }}\n                  >\n                    <Icon icon=\"unmute\" />\n                    <span>\n                      <Trans>\n                        Unmute <span class=\"bidi-isolate\">@{username}</span>\n                      </Trans>\n                    </span>\n                  </MenuItem>\n                ) : (\n                  <SubMenu2\n                    menuClassName=\"menu-blur\"\n                    openTrigger=\"clickOnly\"\n                    direction=\"bottom\"\n                    overflow=\"auto\"\n                    shift={16}\n                    label={\n                      <>\n                        <Icon icon=\"mute\" />\n                        <span class=\"menu-grow\">\n                          <Trans>\n                            Mute <span class=\"bidi-isolate\">@{username}</span>โ€ฆ\n                          </Trans>\n                        </span>\n                        <span\n                          style={{\n                            textOverflow: 'clip',\n                          }}\n                        >\n                          <Icon icon=\"time\" />\n                          <Icon icon=\"chevron-right\" />\n                        </span>\n                      </>\n                    }\n                  >\n                    <div class=\"menu-wrap\">\n                      {MUTE_DURATIONS.map((duration) => (\n                        <MenuItem\n                          onClick={() => {\n                            setRelationshipUIState('loading');\n                            (async () => {\n                              try {\n                                const newRelationship =\n                                  await currentMasto.v1.accounts\n                                    .$select(currentInfo?.id || id)\n                                    .mute({\n                                      duration,\n                                    });\n                                console.log('muting', newRelationship);\n                                setRelationship(newRelationship);\n                                setRelationshipUIState('default');\n                                showToast(\n                                  t`Muted @${username} for ${\n                                    typeof MUTE_DURATIONS_LABELS[duration] ===\n                                    'function'\n                                      ? MUTE_DURATIONS_LABELS[duration]()\n                                      : _(MUTE_DURATIONS_LABELS[duration])\n                                  }`,\n                                );\n                                states.reloadGenericAccounts.id = 'mute';\n                                states.reloadGenericAccounts.counter++;\n                              } catch (e) {\n                                console.error(e);\n                                setRelationshipUIState('error');\n                                showToast(t`Unable to mute @${username}`);\n                              }\n                            })();\n                          }}\n                        >\n                          {typeof MUTE_DURATIONS_LABELS[duration] === 'function'\n                            ? MUTE_DURATIONS_LABELS[duration]()\n                            : _(MUTE_DURATIONS_LABELS[duration])}\n                        </MenuItem>\n                      ))}\n                    </div>\n                  </SubMenu2>\n                )}\n                {followedBy && (\n                  <MenuConfirm\n                    subMenu\n                    menuItemClassName=\"danger\"\n                    confirmLabel={\n                      <>\n                        <Icon icon=\"user-x\" />\n                        <span>\n                          <Trans>\n                            Remove <span class=\"bidi-isolate\">@{username}</span>{' '}\n                            from followers?\n                          </Trans>\n                        </span>\n                      </>\n                    }\n                    onClick={() => {\n                      setRelationshipUIState('loading');\n                      (async () => {\n                        try {\n                          const newRelationship = await currentMasto.v1.accounts\n                            .$select(currentInfo?.id || id)\n                            .removeFromFollowers();\n                          console.log(\n                            'removing from followers',\n                            newRelationship,\n                          );\n                          setRelationship(newRelationship);\n                          setRelationshipUIState('default');\n                          showToast(t`@${username} removed from followers`);\n                          states.reloadGenericAccounts.id = 'followers';\n                          states.reloadGenericAccounts.counter++;\n                        } catch (e) {\n                          console.error(e);\n                          setRelationshipUIState('error');\n                        }\n                      })();\n                    }}\n                  >\n                    <Icon icon=\"user-x\" />\n                    <span>\n                      <Trans>Remove followerโ€ฆ</Trans>\n                    </span>\n                  </MenuConfirm>\n                )}\n                <MenuConfirm\n                  subMenu\n                  confirm={!blocking}\n                  confirmLabel={\n                    <>\n                      <Icon icon=\"block\" />\n                      <span>\n                        <Trans>\n                          Block <span class=\"bidi-isolate\">@{username}</span>?\n                        </Trans>\n                      </span>\n                    </>\n                  }\n                  itemProps={{\n                    className: 'danger',\n                  }}\n                  menuItemClassName=\"danger\"\n                  onClick={() => {\n                    // if (!blocking && !confirm(`Block @${username}?`)) {\n                    //   return;\n                    // }\n                    setRelationshipUIState('loading');\n                    (async () => {\n                      try {\n                        if (blocking) {\n                          const newRelationship = await currentMasto.v1.accounts\n                            .$select(currentInfo?.id || id)\n                            .unblock();\n                          console.log('unblocking', newRelationship);\n                          setRelationship(newRelationship);\n                          setRelationshipUIState('default');\n                          showToast(t`Unblocked @${username}`);\n                        } else {\n                          const newRelationship = await currentMasto.v1.accounts\n                            .$select(currentInfo?.id || id)\n                            .block();\n                          console.log('blocking', newRelationship);\n                          setRelationship(newRelationship);\n                          setRelationshipUIState('default');\n                          showToast(t`Blocked @${username}`);\n                        }\n                        states.reloadGenericAccounts.id = 'block';\n                        states.reloadGenericAccounts.counter++;\n                      } catch (e) {\n                        console.error(e);\n                        setRelationshipUIState('error');\n                        if (blocking) {\n                          showToast(t`Unable to unblock @${username}`);\n                        } else {\n                          showToast(t`Unable to block @${username}`);\n                        }\n                      }\n                    })();\n                  }}\n                >\n                  {blocking ? (\n                    <>\n                      <Icon icon=\"unblock\" />\n                      <span>\n                        <Trans>\n                          Unblock <span class=\"bidi-isolate\">@{username}</span>\n                        </Trans>\n                      </span>\n                    </>\n                  ) : (\n                    <>\n                      <Icon icon=\"block\" />\n                      <span>\n                        <Trans>\n                          Block <span class=\"bidi-isolate\">@{username}</span>โ€ฆ\n                        </Trans>\n                      </span>\n                    </>\n                  )}\n                </MenuConfirm>\n                <MenuItem\n                  className=\"danger\"\n                  onClick={() => {\n                    states.showReportModal = {\n                      account: currentInfo || info,\n                    };\n                  }}\n                >\n                  <Icon icon=\"flag\" />\n                  <span>\n                    <Trans>\n                      Report <span class=\"bidi-isolate\">@{username}</span>โ€ฆ\n                    </Trans>\n                  </span>\n                </MenuItem>\n              </>\n            )}\n            {currentAuthenticated &&\n              isSelf &&\n              standalone &&\n              supports('@mastodon/profile-edit') && (\n                <>\n                  <MenuDivider />\n                  <MenuItem\n                    onClick={() => {\n                      setShowEditProfile(true);\n                    }}\n                  >\n                    <Icon icon=\"pencil\" />\n                    <span>\n                      <Trans>Edit profile</Trans>\n                    </span>\n                  </MenuItem>\n                </>\n              )}\n            {import.meta.env.DEV && currentAuthenticated && isSelf && (\n              <>\n                <MenuDivider />\n                <MenuItem\n                  onClick={async () => {\n                    const relationships =\n                      await currentMasto.v1.accounts.relationships.fetch({\n                        id: [accountID.current],\n                      });\n                    const { note } = relationships[0] || {};\n                    if (note) {\n                      alert(note);\n                      console.log(note);\n                    }\n                  }}\n                >\n                  <Icon icon=\"pencil\" />\n                  <span>See note</span>\n                </MenuItem>\n              </>\n            )}\n          </Menu2>\n          {!relationship && relationshipUIState === 'loading' && (\n            <Loader abrupt />\n          )}\n          {!!relationship && !moved && (\n            <MenuConfirm\n              confirm={following || requested}\n              confirmLabel={\n                <span>\n                  {requested\n                    ? t`Withdraw follow request?`\n                    : t`Unfollow @${info.acct || info.username}?`}\n                </span>\n              }\n              menuItemClassName=\"danger\"\n              align=\"end\"\n              disabled={loading}\n              onClick={() => {\n                setRelationshipUIState('loading');\n                (async () => {\n                  try {\n                    let newRelationship;\n\n                    if (following || requested) {\n                      // const yes = confirm(\n                      //   requested\n                      //     ? 'Withdraw follow request?'\n                      //     : `Unfollow @${info.acct || info.username}?`,\n                      // );\n\n                      // if (yes) {\n                      newRelationship = await currentMasto.v1.accounts\n                        .$select(accountID.current)\n                        .unfollow();\n                      // }\n                    } else {\n                      newRelationship = await currentMasto.v1.accounts\n                        .$select(accountID.current)\n                        .follow();\n                    }\n\n                    if (newRelationship) setRelationship(newRelationship);\n                    setRelationshipUIState('default');\n                  } catch (e) {\n                    alert(e);\n                    setRelationshipUIState('error');\n                  }\n                })();\n              }}\n            >\n              <button\n                type=\"button\"\n                class={`${following || requested ? 'light swap' : ''}`}\n                data-swap-state={following || requested ? 'danger' : ''}\n                disabled={loading}\n              >\n                {following ? (\n                  <>\n                    <span>\n                      <Trans>Following</Trans>\n                    </span>\n                    <span>\n                      <Trans>Unfollowโ€ฆ</Trans>\n                    </span>\n                  </>\n                ) : requested ? (\n                  <>\n                    <span>\n                      <Trans>Requested</Trans>\n                    </span>\n                    <span>\n                      <Trans>Withdrawโ€ฆ</Trans>\n                    </span>\n                  </>\n                ) : locked ? (\n                  <>\n                    <Icon icon=\"lock\" />{' '}\n                    <span>\n                      <Trans>Follow</Trans>\n                    </span>\n                  </>\n                ) : (\n                  t`Follow`\n                )}\n              </button>\n            </MenuConfirm>\n          )}\n        </span>\n      </div>\n      {!!showTranslatedBio && (\n        <Modal\n          onClose={() => {\n            setShowTranslatedBio(false);\n          }}\n        >\n          <TranslatedBioSheet\n            note={note}\n            fields={fields}\n            onClose={() => setShowTranslatedBio(false)}\n          />\n        </Modal>\n      )}\n      {!!showAddRemoveLists && (\n        <Modal\n          onClose={() => {\n            setShowAddRemoveLists(false);\n          }}\n        >\n          <AddRemoveListsSheet\n            accountID={accountID.current}\n            onClose={() => setShowAddRemoveLists(false)}\n          />\n        </Modal>\n      )}\n      {!!showPrivateNoteModal && (\n        <Modal\n          onClose={() => {\n            setShowPrivateNoteModal(false);\n          }}\n        >\n          <PrivateNoteSheet\n            account={info}\n            note={privateNote}\n            onRelationshipChange={(relationship) => {\n              setRelationship(relationship);\n              // onRelationshipChange({ relationship, currentID: accountID.current });\n            }}\n            onClose={() => setShowPrivateNoteModal(false)}\n          />\n        </Modal>\n      )}\n      {!!showEditProfile && (\n        <Modal\n          onClose={() => {\n            setShowEditProfile(false);\n          }}\n        >\n          <EditProfileSheet\n            onClose={({ state, account } = {}) => {\n              setShowEditProfile(false);\n              if (state === 'success' && account) {\n                onProfileUpdate(account);\n              }\n            }}\n          />\n        </Modal>\n      )}\n    </>\n  );\n}\n\n// Apply more alpha if high luminence\nfunction lightenRGB([r, g, b]) {\n  const luminence = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n  console.log('luminence', luminence);\n  let alpha;\n  if (luminence >= 220) {\n    alpha = 1;\n  } else if (luminence <= 50) {\n    alpha = 0.1;\n  } else {\n    alpha = luminence / 255;\n  }\n  alpha = Math.min(1, alpha);\n  return [r, g, b, alpha];\n}\n\nfunction niceAccountURL(url) {\n  if (!url) return;\n  const urlObj = URL.parse(url);\n  const { host, pathname } = urlObj;\n  const path = pathname.replace(/\\/$/, '').replace(/^\\//, '');\n  return (\n    <>\n      <span class=\"more-insignificant\">{punycode.toUnicode(host)}/</span>\n      <wbr />\n      <span>{path}</span>\n    </>\n  );\n}\n\nfunction TranslatedBioSheet({ note, fields, onClose }) {\n  const { t } = useLingui();\n  const fieldsText =\n    fields\n      ?.map(({ name, value }) => `${name}\\n${getHTMLText(value)}`)\n      .join('\\n\\n') || '';\n\n  const text = getHTMLText(note) + (fieldsText ? `\\n\\n${fieldsText}` : '');\n\n  return (\n    <div class=\"sheet\">\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}\n      <header>\n        <h2>\n          <Trans>Translated Bio</Trans>\n        </h2>\n      </header>\n      <main>\n        <p\n          style={{\n            whiteSpace: 'pre-wrap',\n          }}\n        >\n          {text}\n        </p>\n        <TranslationBlock forceTranslate text={text} />\n      </main>\n    </div>\n  );\n}\n\nfunction AddRemoveListsSheet({ accountID, onClose }) {\n  const { t } = useLingui();\n  const { masto } = api();\n  const [uiState, setUIState] = useState('default');\n  const [lists, setLists] = useState([]);\n  const [listsContainingAccount, setListsContainingAccount] = useState([]);\n  const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n\n  useEffect(() => {\n    setUIState('loading');\n    (async () => {\n      try {\n        const lists = await getLists();\n        setLists(lists);\n        const listsContainingAccount = await masto.v1.accounts\n          .$select(accountID)\n          .lists.list();\n        console.log({ lists, listsContainingAccount });\n        setListsContainingAccount(listsContainingAccount);\n        setUIState('default');\n      } catch (e) {\n        console.error(e);\n        setUIState('error');\n      }\n    })();\n  }, [reloadCount]);\n\n  const [showListAddEditModal, setShowListAddEditModal] = useState(false);\n\n  return (\n    <div class=\"sheet\" id=\"list-add-remove-container\">\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}\n      <header>\n        <h2>\n          <Trans>Add/Remove from Lists</Trans>\n        </h2>\n      </header>\n      <main>\n        {lists.length > 0 ? (\n          <ul class=\"list-add-remove\">\n            {lists.map((list) => {\n              const inList = listsContainingAccount.some(\n                (l) => l.id === list.id,\n              );\n              return (\n                <li>\n                  <button\n                    type=\"button\"\n                    class={`light ${inList ? 'checked' : ''}`}\n                    disabled={uiState === 'loading'}\n                    onClick={() => {\n                      setUIState('loading');\n                      (async () => {\n                        try {\n                          if (inList) {\n                            await masto.v1.lists\n                              .$select(list.id)\n                              .accounts.remove({\n                                accountIds: [accountID],\n                              });\n                          } else {\n                            await masto.v1.lists\n                              .$select(list.id)\n                              .accounts.create({\n                                accountIds: [accountID],\n                              });\n                          }\n                          // setUIState('default');\n                          reload();\n                        } catch (e) {\n                          console.error(e);\n                          setUIState('error');\n                          alert(\n                            inList\n                              ? t`Unable to remove from list.`\n                              : t`Unable to add to list.`,\n                          );\n                        }\n                      })();\n                    }}\n                  >\n                    <Icon icon=\"check-circle\" alt=\"โ˜‘๏ธ\" />\n                    <span>{list.title}</span>\n                  </button>\n                </li>\n              );\n            })}\n          </ul>\n        ) : uiState === 'loading' ? (\n          <p class=\"ui-state\">\n            <Loader abrupt />\n          </p>\n        ) : uiState === 'error' ? (\n          <p class=\"ui-state\">\n            <Trans>Unable to load lists.</Trans>\n          </p>\n        ) : (\n          <p class=\"ui-state\">\n            <Trans>No lists.</Trans>\n          </p>\n        )}\n        <button\n          type=\"button\"\n          class=\"plain2\"\n          onClick={() => setShowListAddEditModal(true)}\n          disabled={uiState !== 'default'}\n        >\n          <Icon icon=\"plus\" size=\"l\" />{' '}\n          <span>\n            <Trans>New list</Trans>\n          </span>\n        </button>\n      </main>\n      {showListAddEditModal && (\n        <Modal\n          onClick={(e) => {\n            if (e.target === e.currentTarget) {\n              setShowListAddEditModal(false);\n            }\n          }}\n        >\n          <ListAddEdit\n            list={showListAddEditModal?.list}\n            onClose={(result) => {\n              if (result.state === 'success') {\n                reload();\n              }\n              setShowListAddEditModal(false);\n            }}\n          />\n        </Modal>\n      )}\n    </div>\n  );\n}\n\nfunction PrivateNoteSheet({\n  account,\n  note: initialNote,\n  onRelationshipChange = () => {},\n  onClose = () => {},\n}) {\n  const { t } = useLingui();\n  const { masto } = api();\n  const [uiState, setUIState] = useState('default');\n  const textareaRef = useRef(null);\n\n  useEffect(() => {\n    let timer;\n    if (textareaRef.current && !initialNote) {\n      timer = setTimeout(() => {\n        textareaRef.current.focus?.();\n      }, 100);\n    }\n    return () => {\n      clearTimeout(timer);\n    };\n  }, []);\n\n  return (\n    <div class=\"sheet\" id=\"private-note-container\">\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}\n      <header>\n        <b>\n          <Trans>\n            Private note about{' '}\n            <span class=\"bidi-isolate\">\n              @{account?.username || account?.acct}\n            </span>\n          </Trans>\n        </b>\n      </header>\n      <main>\n        <form\n          onSubmit={(e) => {\n            e.preventDefault();\n            const formData = new FormData(e.target);\n            const note = formData.get('note');\n            if (note?.trim() !== initialNote?.trim()) {\n              setUIState('loading');\n              (async () => {\n                try {\n                  const newRelationship = await masto.v1.accounts\n                    .$select(account?.id)\n                    .note.create({\n                      comment: note,\n                    });\n                  console.log('updated relationship', newRelationship);\n                  setUIState('default');\n                  onRelationshipChange(newRelationship);\n                  onClose();\n                } catch (e) {\n                  console.error(e);\n                  setUIState('error');\n                  alert(e?.message || t`Unable to update private note.`);\n                }\n              })();\n            }\n          }}\n        >\n          <textarea\n            ref={textareaRef}\n            name=\"note\"\n            disabled={uiState === 'loading'}\n            dir=\"auto\"\n          >\n            {initialNote}\n          </textarea>\n          <footer>\n            <button\n              type=\"button\"\n              class=\"light\"\n              disabled={uiState === 'loading'}\n              onClick={() => {\n                onClose?.();\n              }}\n            >\n              <Trans>Cancel</Trans>\n            </button>\n            <span>\n              <Loader abrupt hidden={uiState !== 'loading'} />\n              <button disabled={uiState === 'loading'} type=\"submit\">\n                <Trans>Save &amp; close</Trans>\n              </button>\n            </span>\n          </footer>\n        </form>\n      </main>\n    </div>\n  );\n}\n\nfunction EditProfileSheet({ onClose = () => {} }) {\n  const { t } = useLingui();\n  const { masto } = api();\n  const [uiState, setUIState] = useState('loading');\n  const [account, setAccount] = useState(null);\n\n  useEffect(() => {\n    (async () => {\n      try {\n        const acc = await masto.v1.accounts.verifyCredentials();\n        setAccount(acc);\n        setUIState('default');\n      } catch (e) {\n        console.error(e);\n        setUIState('error');\n      }\n    })();\n  }, []);\n\n  console.log('EditProfileSheet', account);\n  const { displayName, source } = account || {};\n  const { note, fields } = source || {};\n  const fieldsAttributesRef = useRef(null);\n\n  return (\n    <div class=\"sheet\" id=\"edit-profile-container\">\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}\n      <header>\n        <b>\n          <Trans>Edit profile</Trans>\n        </b>\n      </header>\n      <main>\n        {uiState === 'loading' ? (\n          <p class=\"ui-state\">\n            <Loader abrupt />\n          </p>\n        ) : (\n          <form\n            onSubmit={(e) => {\n              e.preventDefault();\n              const formData = new FormData(e.target);\n              const displayName = formData.get('display_name');\n              const note = formData.get('note');\n              const fieldsAttributesFields =\n                fieldsAttributesRef.current.querySelectorAll(\n                  'input[name^=\"fields_attributes\"]',\n                );\n              const fieldsAttributes = [];\n              fieldsAttributesFields.forEach((field) => {\n                const name = field.name;\n                const [_, index, key] =\n                  name.match(/fields_attributes\\[(\\d+)\\]\\[(.+)\\]/) || [];\n                const value = field.value ? field.value.trim() : '';\n                if (index && key && value) {\n                  if (!fieldsAttributes[index]) fieldsAttributes[index] = {};\n                  fieldsAttributes[index][key] = value;\n                }\n              });\n              // Fill in the blanks\n              fieldsAttributes.forEach((field) => {\n                if (field.name && !field.value) {\n                  field.value = '';\n                }\n              });\n\n              (async () => {\n                try {\n                  const newAccount = await masto.v1.accounts.updateCredentials({\n                    displayName,\n                    note,\n                    fieldsAttributes,\n                  });\n                  console.log('updated account', newAccount);\n                  onClose?.({\n                    state: 'success',\n                    account: newAccount,\n                  });\n                } catch (e) {\n                  console.error(e);\n                  alert(e?.message || t`Unable to update profile.`);\n                }\n              })();\n            }}\n          >\n            <p>\n              <label>\n                <Trans>Name</Trans>{' '}\n                <input\n                  type=\"text\"\n                  name=\"display_name\"\n                  defaultValue={displayName}\n                  maxLength={30}\n                  disabled={uiState === 'loading'}\n                  dir=\"auto\"\n                />\n              </label>\n            </p>\n            <p>\n              <label>\n                <Trans>Bio</Trans>\n                <textarea\n                  defaultValue={note}\n                  name=\"note\"\n                  maxLength={500}\n                  rows=\"5\"\n                  disabled={uiState === 'loading'}\n                  dir=\"auto\"\n                />\n              </label>\n            </p>\n            {/* Table for fields; name and values are in fields, min 4 rows */}\n            <p>\n              <Trans>Extra fields</Trans>\n            </p>\n            <table ref={fieldsAttributesRef}>\n              <thead>\n                <tr>\n                  <th>\n                    <Trans>Label</Trans>\n                  </th>\n                  <th>\n                    <Trans>Content</Trans>\n                  </th>\n                </tr>\n              </thead>\n              <tbody>\n                {Array.from({ length: Math.max(4, fields.length) }).map(\n                  (_, i) => {\n                    const { name = '', value = '' } = fields[i] || {};\n                    return (\n                      <FieldsAttributesRow\n                        key={i}\n                        name={name}\n                        value={value}\n                        index={i}\n                        disabled={uiState === 'loading'}\n                      />\n                    );\n                  },\n                )}\n              </tbody>\n            </table>\n            <footer>\n              <button\n                type=\"button\"\n                class=\"light\"\n                disabled={uiState === 'loading'}\n                onClick={() => {\n                  onClose?.();\n                }}\n              >\n                <Trans>Cancel</Trans>\n              </button>\n              <button type=\"submit\" disabled={uiState === 'loading'}>\n                <Trans>Save</Trans>\n              </button>\n            </footer>\n          </form>\n        )}\n      </main>\n    </div>\n  );\n}\n\nfunction FieldsAttributesRow({ name, value, disabled, index: i }) {\n  const [hasValue, setHasValue] = useState(!!value);\n  return (\n    <tr>\n      <td>\n        <input\n          type=\"text\"\n          name={`fields_attributes[${i}][name]`}\n          defaultValue={name}\n          disabled={disabled}\n          maxLength={255}\n          required={hasValue}\n          dir=\"auto\"\n        />\n      </td>\n      <td>\n        <input\n          type=\"text\"\n          name={`fields_attributes[${i}][value]`}\n          defaultValue={value}\n          disabled={disabled}\n          maxLength={255}\n          onChange={(e) => setHasValue(!!e.currentTarget.value)}\n          dir=\"auto\"\n        />\n      </td>\n    </tr>\n  );\n}\n\nfunction AccountHandleInfo({ acct, instance }) {\n  // acct = username or username@server\n  let [username, server] = acct.split('@');\n  if (!server) server = instance;\n  const encodedAcct = punycode.toASCII(acct);\n  return (\n    <div class=\"handle-info\">\n      <span class=\"handle-handle\" title={encodedAcct}>\n        <b class=\"handle-username\">{username}</b>\n        <span class=\"handle-at\">@</span>\n        <b class=\"handle-server\">{server}</b>\n      </span>\n      <div class=\"handle-legend\">\n        <span class=\"ib\">\n          <span class=\"handle-legend-icon username\" /> <Trans>username</Trans>\n        </span>{' '}\n        <span class=\"ib\">\n          <span class=\"handle-legend-icon server\" />{' '}\n          <Trans>server domain name</Trans>\n        </span>\n      </div>\n    </div>\n  );\n}\n\nexport default AccountInfo;\n","import { useLingui } from '@lingui/react/macro';\nimport { useEffect } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport states from '../utils/states';\nimport useLocationChange from '../utils/useLocationChange';\n\nimport AccountInfo from './account-info';\nimport Icon from './icon';\n\nfunction AccountSheet({ account, instance: propInstance, onClose }) {\n  const { t } = useLingui();\n  const { masto, instance, authenticated } = api({ instance: propInstance });\n  const isString = typeof account === 'string';\n\n  useEffect(() => {\n    if (!isString) {\n      states.accounts[`${account.id}@${instance}`] = account;\n    }\n  }, [account]);\n\n  useLocationChange(onClose);\n\n  return (\n    <div\n      class=\"sheet\"\n      // onClick={(e) => {\n      //   const accountBlock = e.target.closest('.account-block');\n      //   if (accountBlock) {\n      //     onClose({\n      //       destination: 'account-statuses',\n      //     });\n      //   }\n      // }}\n    >\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close outer\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}\n      <AccountInfo\n        instance={instance}\n        authenticated={authenticated}\n        account={account}\n        fetchAccount={async () => {\n          if (isString) {\n            try {\n              const info = await masto.v1.accounts.lookup({\n                acct: account,\n                skip_webfinger: false,\n              });\n              return info;\n            } catch (e) {\n              const result = await masto.v2.search.fetch({\n                q: account,\n                type: 'accounts',\n                limit: 1,\n                resolve: authenticated,\n              });\n              if (result.accounts.length) {\n                return result.accounts[0];\n              } else if (/https?:\\/\\/[^/]+\\/@/.test(account)) {\n                const accountURL = URL.parse(account);\n                const { hostname, pathname } = accountURL;\n                const acct =\n                  pathname.replace(/^\\//, '').replace(/\\/$/, '') +\n                  '@' +\n                  hostname;\n                const result = await masto.v2.search.fetch({\n                  q: acct,\n                  type: 'accounts',\n                  limit: 1,\n                  resolve: authenticated,\n                });\n                if (result.accounts.length) {\n                  return result.accounts[0];\n                }\n              }\n            }\n          } else {\n            return account;\n          }\n        }}\n      />\n    </div>\n  );\n}\n\nexport default AccountSheet;\n","import './drafts.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useMemo, useReducer, useState } from 'react';\n\nimport { api } from '../utils/api';\nimport db from '../utils/db';\nimport niceDateTime from '../utils/nice-date-time';\nimport states from '../utils/states';\nimport { getCurrentAccountNS } from '../utils/store-utils';\n\nimport Icon from './icon';\nimport Loader from './loader';\nimport MenuConfirm from './menu-confirm';\n\nfunction Drafts({ onClose }) {\n  const { t } = useLingui();\n  const { masto } = api();\n  const [uiState, setUIState] = useState('default');\n  const [drafts, setDrafts] = useState([]);\n  const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n\n  useEffect(() => {\n    setUIState('loading');\n    (async () => {\n      try {\n        const keys = await db.drafts.keys();\n        if (keys.length) {\n          const ns = getCurrentAccountNS();\n          const ownKeys = keys.filter((key) => key.startsWith(ns));\n          if (ownKeys.length) {\n            const drafts = await db.drafts.getMany(ownKeys);\n            drafts.sort(\n              (a, b) =>\n                new Date(b.updatedAt).getTime() -\n                new Date(a.updatedAt).getTime(),\n            );\n            setDrafts(drafts);\n          } else {\n            setDrafts([]);\n          }\n        } else {\n          setDrafts([]);\n        }\n        setUIState('default');\n      } catch (e) {\n        console.error(e);\n        setUIState('error');\n      }\n    })();\n  }, [reloadCount]);\n\n  const hasDrafts = drafts?.length > 0;\n\n  return (\n    <div class=\"sheet\">\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}\n      <header>\n        <h2>\n          <Trans>Unsent drafts</Trans>{' '}\n          <Loader abrupt hidden={uiState !== 'loading'} />\n        </h2>\n        {hasDrafts && (\n          <div class=\"insignificant\">\n            <Trans>\n              Looks like you have unsent drafts. Let's continue where you left\n              off.\n            </Trans>\n          </div>\n        )}\n      </header>\n      <main>\n        {hasDrafts ? (\n          <>\n            <ul class=\"drafts-list\">\n              {drafts.map((draft) => {\n                const { updatedAt, key, draftStatus, replyTo } = draft;\n                const updatedAtDate = new Date(updatedAt);\n                return (\n                  <li key={updatedAt}>\n                    <div class=\"mini-draft-meta\">\n                      <b>\n                        <Icon icon={replyTo ? 'reply' : 'quill'} size=\"s\" />{' '}\n                        <time>\n                          {!!replyTo && (\n                            <>\n                              <span class=\"bidi-isolate\">\n                                @{replyTo.account.acct}\n                              </span>\n                              <br />\n                            </>\n                          )}\n                          {niceDateTime(updatedAtDate)}\n                        </time>\n                      </b>\n                      <MenuConfirm\n                        confirmLabel={\n                          <span>\n                            <Trans>Delete this draft?</Trans>\n                          </span>\n                        }\n                        menuItemClassName=\"danger\"\n                        align=\"end\"\n                        disabled={uiState === 'loading'}\n                        onClick={() => {\n                          (async () => {\n                            try {\n                              // const yes = confirm('Delete this draft?');\n                              // if (yes) {\n                              await db.drafts.del(key);\n                              reload();\n                              // }\n                            } catch (e) {\n                              alert(t`Error deleting draft! Please try again.`);\n                            }\n                          })();\n                        }}\n                      >\n                        <button\n                          type=\"button\"\n                          class=\"small light\"\n                          disabled={uiState === 'loading'}\n                        >\n                          <Trans>Deleteโ€ฆ</Trans>\n                        </button>\n                      </MenuConfirm>\n                    </div>\n                    <button\n                      type=\"button\"\n                      disabled={uiState === 'loading'}\n                      class=\"draft-item\"\n                      onClick={async () => {\n                        // console.log({ draftStatus });\n                        let replyToStatus;\n                        if (replyTo) {\n                          setUIState('loading');\n                          try {\n                            replyToStatus = await masto.v1.statuses\n                              .$select(replyTo.id)\n                              .fetch();\n                          } catch (e) {\n                            console.error(e);\n                            alert(t`Error fetching reply-to status!`);\n                            setUIState('default');\n                            return;\n                          }\n                          setUIState('default');\n                        }\n                        window.__COMPOSE__ = {\n                          draftStatus,\n                          replyToStatus,\n                        };\n                        states.showCompose = true;\n                        states.showDrafts = false;\n                      }}\n                    >\n                      <MiniDraft draft={draft} />\n                    </button>\n                  </li>\n                );\n              })}\n            </ul>\n            {drafts.length > 1 && (\n              <p>\n                <MenuConfirm\n                  confirmLabel={\n                    <span>\n                      <Trans>Delete all drafts?</Trans>\n                    </span>\n                  }\n                  menuItemClassName=\"danger\"\n                  disabled={uiState === 'loading'}\n                  onClick={() => {\n                    (async () => {\n                      // const yes = confirm('Delete all drafts?');\n                      // if (yes) {\n                      setUIState('loading');\n                      try {\n                        await db.drafts.delMany(\n                          drafts.map((draft) => draft.key),\n                        );\n                        setUIState('default');\n                        reload();\n                      } catch (e) {\n                        console.error(e);\n                        alert(t`Error deleting drafts! Please try again.`);\n                        setUIState('error');\n                      }\n                      // }\n                    })();\n                  }}\n                >\n                  <button\n                    type=\"button\"\n                    class=\"light danger\"\n                    disabled={uiState === 'loading'}\n                  >\n                    <Trans>Delete allโ€ฆ</Trans>\n                  </button>\n                </MenuConfirm>\n              </p>\n            )}\n          </>\n        ) : (\n          <p>\n            <Trans>No drafts found.</Trans>\n          </p>\n        )}\n      </main>\n    </div>\n  );\n}\n\nfunction MiniDraft({ draft }) {\n  const { t } = useLingui();\n  const { draftStatus, replyTo } = draft;\n  const { status, spoilerText, poll, mediaAttachments } = draftStatus;\n  const hasPoll = poll?.options?.length > 0;\n  const hasMedia = mediaAttachments?.length > 0;\n  const hasPollOrMedia = hasPoll || hasMedia;\n  const firstImageMedia = useMemo(() => {\n    if (!hasMedia) return;\n    const image = mediaAttachments.find((media) => /image/.test(media.type));\n    if (!image) return;\n    const { file } = image;\n    const objectURL = URL.createObjectURL(file);\n    return objectURL;\n  }, [hasMedia, mediaAttachments]);\n  return (\n    <>\n      <div class=\"mini-draft\">\n        {hasPollOrMedia && (\n          <div\n            class={`mini-draft-aside ${firstImageMedia ? 'has-image' : ''}`}\n            style={\n              firstImageMedia\n                ? {\n                    '--bg-image': `url(${firstImageMedia})`,\n                  }\n                : {}\n            }\n          >\n            {hasPoll && <Icon icon=\"poll\" alt={t`Poll`} />}\n            {hasMedia && (\n              <span>\n                <Icon icon=\"attachment\" alt={t`Media`} />{' '}\n                <small>{mediaAttachments?.length}</small>\n              </span>\n            )}\n          </div>\n        )}\n        <div class=\"mini-draft-main\">\n          {!!spoilerText && <div class=\"mini-draft-spoiler\">{spoilerText}</div>}\n          {!!status && <div class=\"mini-draft-status\">{status}</div>}\n        </div>\n      </div>\n    </>\n  );\n}\n\nexport default Drafts;\n","import './embed-modal.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\n\nimport Icon from './icon';\n\nfunction EmbedModal({ html, url, width, height, onClose = () => {} }) {\n  const { t } = useLingui();\n  return (\n    <div class=\"embed-modal-container\">\n      <div class=\"top-controls\">\n        <button type=\"button\" class=\"light\" onClick={() => onClose()}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n        {url && (\n          <a\n            href={url}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            class=\"button plain\"\n          >\n            <span>\n              <Trans>Open in new window</Trans>\n            </span>{' '}\n            <Icon icon=\"external\" />\n          </a>\n        )}\n      </div>\n      <div\n        class=\"embed-content\"\n        dangerouslySetInnerHTML={{ __html: html }}\n        style={{\n          '--width': width + 'px',\n          '--height': height + 'px',\n          '--aspect-ratio': `${width}/${height}`,\n        }}\n      />\n    </div>\n  );\n}\n\nexport default EmbedModal;\n","import './generic-accounts.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { InView } from 'react-intersection-observer';\nimport { useSnapshot } from 'valtio';\n\nimport { api } from '../utils/api';\nimport { fetchRelationships } from '../utils/relationships';\nimport states from '../utils/states';\nimport useLocationChange from '../utils/useLocationChange';\n\nimport AccountBlock from './account-block';\nimport Icon from './icon';\nimport Link from './link';\nimport Loader from './loader';\nimport Status from './status';\n\nexport default function GenericAccounts({\n  instance,\n  excludeRelationshipAttrs = [],\n  postID,\n  onClose = () => {},\n  blankCopy,\n}) {\n  const { t } = useLingui();\n  const { masto, instance: currentInstance } = api();\n  const isCurrentInstance = instance ? instance === currentInstance : true;\n  const snapStates = useSnapshot(states);\n  ``;\n  const [uiState, setUIState] = useState('default');\n  const [accounts, setAccounts] = useState([]);\n  const [showMore, setShowMore] = useState(false);\n\n  useLocationChange(onClose);\n\n  if (!snapStates.showGenericAccounts) {\n    return null;\n  }\n\n  const {\n    id,\n    heading,\n    fetchAccounts,\n    accounts: staticAccounts,\n    showReactions,\n  } = snapStates.showGenericAccounts;\n\n  const [relationshipsMap, setRelationshipsMap] = useState({});\n\n  const loadRelationships = async (accounts) => {\n    if (!accounts?.length) return;\n    if (!isCurrentInstance) return;\n    const relationships = await fetchRelationships(accounts, relationshipsMap);\n    if (relationships) {\n      setRelationshipsMap({\n        ...relationshipsMap,\n        ...relationships,\n      });\n    }\n  };\n\n  const loadAccounts = (firstLoad) => {\n    if (!fetchAccounts) return;\n    if (firstLoad) setAccounts([]);\n    setUIState('loading');\n    (async () => {\n      try {\n        const { done, value } = await fetchAccounts(firstLoad);\n        if (Array.isArray(value)) {\n          if (firstLoad) {\n            const accounts = [];\n            for (let i = 0; i < value.length; i++) {\n              const account = value[i];\n              const theAccount = accounts.find(\n                (a, j) => a.id === account.id && i !== j,\n              );\n              if (!theAccount) {\n                accounts.push({\n                  _types: [],\n                  ...account,\n                });\n              } else {\n                theAccount._types.push(...account._types);\n              }\n            }\n            setAccounts(accounts);\n          } else {\n            // setAccounts((prev) => [...prev, ...value]);\n            // Merge accounts by id and _types\n            setAccounts((prev) => {\n              const newAccounts = prev;\n              for (const account of value) {\n                const theAccount = newAccounts.find((a) => a.id === account.id);\n                if (!theAccount) {\n                  newAccounts.push(account);\n                } else {\n                  theAccount._types.push(...account._types);\n                }\n              }\n              return newAccounts;\n            });\n          }\n          setShowMore(!done);\n\n          loadRelationships(value);\n        } else {\n          setShowMore(false);\n        }\n        setUIState('default');\n      } catch (e) {\n        console.error(e);\n        setUIState('error');\n      }\n    })();\n  };\n\n  const firstLoad = useRef(true);\n  useEffect(() => {\n    if (staticAccounts?.length > 0) {\n      setAccounts(staticAccounts);\n      loadRelationships(staticAccounts);\n    } else {\n      loadAccounts(true);\n      firstLoad.current = false;\n    }\n  }, [staticAccounts, fetchAccounts]);\n\n  useEffect(() => {\n    if (firstLoad.current) return;\n    // reloadGenericAccounts contains value like {id: 'mute', counter: 1}\n    // We only need to reload if the id matches\n    if (snapStates.reloadGenericAccounts?.id === id) {\n      loadAccounts(true);\n    }\n  }, [snapStates.reloadGenericAccounts.counter]);\n\n  const post = states.statuses[postID];\n\n  return (\n    <div id=\"generic-accounts-container\" class=\"sheet\" tabindex=\"-1\">\n      <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n        <Icon icon=\"x\" alt={t`Close`} />\n      </button>\n      <header>\n        <h2>{heading || t`Accounts`}</h2>\n      </header>\n      <main>\n        {post && (\n          <Link\n            to={`/${instance || currentInstance}/s/${post.id}`}\n            class=\"post-preview\"\n          >\n            <Status status={post} size=\"s\" readOnly />\n          </Link>\n        )}\n        {accounts.length > 0 ? (\n          <>\n            <ul class=\"accounts-list\">\n              {accounts.map((account) => {\n                const relationship = relationshipsMap[account.id];\n                const key = `${account.id}-${account._types?.length || ''}`;\n                return (\n                  <li key={key}>\n                    {showReactions && account._types?.length > 0 && (\n                      <div class=\"reactions-block\">\n                        {account._types.map((type) => (\n                          <Icon\n                            icon={\n                              {\n                                reblog: 'rocket',\n                                favourite: 'heart',\n                              }[type]\n                            }\n                            class={`${type}-icon`}\n                          />\n                        ))}\n                      </div>\n                    )}\n                    <div class=\"account-relationships\">\n                      <AccountBlock\n                        account={account}\n                        showStats\n                        relationship={relationship}\n                        excludeRelationshipAttrs={excludeRelationshipAttrs}\n                      />\n                    </div>\n                  </li>\n                );\n              })}\n            </ul>\n            {uiState === 'default' ? (\n              showMore ? (\n                <InView\n                  onChange={(inView) => {\n                    if (inView) {\n                      loadAccounts();\n                    }\n                  }}\n                >\n                  <button\n                    type=\"button\"\n                    class=\"plain block\"\n                    onClick={() => loadAccounts()}\n                  >\n                    <Trans>Show moreโ€ฆ</Trans>\n                  </button>\n                </InView>\n              ) : (\n                <p class=\"ui-state insignificant\">\n                  <Trans>The end.</Trans>\n                </p>\n              )\n            ) : (\n              uiState === 'loading' && (\n                <p class=\"ui-state\">\n                  <Loader abrupt />\n                </p>\n              )\n            )}\n          </>\n        ) : uiState === 'loading' ? (\n          <p class=\"ui-state\">\n            <Loader abrupt />\n          </p>\n        ) : uiState === 'error' ? (\n          <p class=\"ui-state\">\n            <Trans>Error loading accounts</Trans>\n          </p>\n        ) : (\n          <p class=\"ui-state insignificant\">\n            {blankCopy || t`Nothing to show`}\n          </p>\n        )}\n      </main>\n    </div>\n  );\n}\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { Menu, MenuItem } from '@szhsin/react-menu';\nimport { useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport localeMatch from '../utils/locale-match';\nimport { speak, supportsTTS } from '../utils/speech';\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Menu2 from './menu2';\nimport TranslationBlock from './translation-block';\n\nexport default function MediaAltModal({ alt, lang, onClose }) {\n  const { t } = useLingui();\n  const snapStates = useSnapshot(states);\n  const [forceTranslate, setForceTranslate] = useState(false);\n  const targetLanguage = getTranslateTargetLanguage(true);\n  const contentTranslationHideLanguages =\n    snapStates.settings.contentTranslationHideLanguages || [];\n  const differentLanguage =\n    !!lang &&\n    lang !== targetLanguage &&\n    !localeMatch([lang], [targetLanguage]) &&\n    !contentTranslationHideLanguages.find(\n      (l) => lang === l || localeMatch([lang], [l]),\n    );\n\n  return (\n    <div class=\"sheet\" tabindex=\"-1\">\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close outer\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}\n      <header class=\"header-grid\">\n        <h2>\n          <Trans>Media description</Trans>\n        </h2>\n        <div class=\"header-side\">\n          <Menu2\n            align=\"end\"\n            menuButton={\n              <button type=\"button\" class=\"plain4\">\n                <Icon icon=\"more\" alt={t`More`} size=\"xl\" />\n              </button>\n            }\n          >\n            <MenuItem\n              disabled={forceTranslate}\n              onClick={() => {\n                setForceTranslate(true);\n              }}\n            >\n              <Icon icon=\"translate\" />\n              <span>\n                <Trans>Translate</Trans>\n              </span>\n            </MenuItem>\n            {supportsTTS && (\n              <MenuItem\n                onClick={() => {\n                  speak(alt, lang);\n                }}\n              >\n                <Icon icon=\"speak\" />\n                <span>\n                  <Trans>Speak</Trans>\n                </span>\n              </MenuItem>\n            )}\n          </Menu2>\n        </div>\n      </header>\n      <main lang={lang} dir=\"auto\">\n        <p\n          style={{\n            whiteSpace: 'pre-wrap',\n            textWrap: 'pretty',\n          }}\n        >\n          {alt}\n        </p>\n        {(differentLanguage || forceTranslate) && (\n          <TranslationBlock\n            forceTranslate={forceTranslate}\n            sourceLanguage={lang}\n            text={alt}\n          />\n        )}\n      </main>\n    </div>\n  );\n}\n","const { min, max } = Math;\n\nexport default (x, low = 0, high = 1) => {\n    return min(max(low, x), high);\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","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","// 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","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 { 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 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 } 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, 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 '../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 { 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 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 { Trans, useLingui } from '@lingui/react/macro';\nimport { MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport {\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport { oklch2rgb, rgb2oklch } from '../utils/color-utils';\nimport isRTL from '../utils/is-rtl';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport store from '../utils/store';\n\nimport Icon from './icon';\nimport Link from './link';\nimport Media from './media';\nimport MenuLink from './menu-link';\nimport Menu2 from './menu2';\n\nconst { PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL } = import.meta.env;\n\nfunction MediaModal({\n  mediaAttachments,\n  statusID,\n  instance,\n  lang,\n  index = 0,\n  onClose = () => {},\n}) {\n  const { t } = useLingui();\n  const [uiState, setUIState] = useState('default');\n  const carouselRef = useRef(null);\n\n  const [currentIndex, setCurrentIndex] = useState(index);\n  const carouselFocusItem = useRef(null);\n  useLayoutEffect(() => {\n    carouselFocusItem.current?.scrollIntoView();\n\n    // history.pushState({ mediaModal: true }, '');\n    // const handlePopState = (e) => {\n    //   if (e.state?.mediaModal) {\n    //     onClose();\n    //   }\n    // };\n    // window.addEventListener('popstate', handlePopState);\n    // return () => {\n    //   window.removeEventListener('popstate', handlePopState);\n    // };\n  }, []);\n  const prevStatusID = useRef(statusID);\n  useEffect(() => {\n    const scrollLeft = index * carouselRef.current.clientWidth;\n    const differentStatusID = prevStatusID.current !== statusID;\n    if (differentStatusID) prevStatusID.current = statusID;\n    carouselRef.current.focus();\n    carouselRef.current.scrollTo({\n      left: scrollLeft * (isRTL() ? -1 : 1),\n      behavior: differentStatusID ? 'auto' : 'smooth',\n    });\n  }, [index, statusID]);\n\n  const [showControls, setShowControls] = useState(true);\n\n  useEffect(() => {\n    let handleSwipe = () => {\n      onClose();\n    };\n    if (carouselRef.current) {\n      carouselRef.current.addEventListener('swiped-down', handleSwipe);\n    }\n    return () => {\n      if (carouselRef.current) {\n        carouselRef.current.removeEventListener('swiped-down', handleSwipe);\n      }\n    };\n  }, []);\n\n  useHotkeys(\n    'esc',\n    onClose,\n    {\n      ignoreEventWhen: (e) => {\n        const hasModal = !!document.querySelector('#modal-container > *');\n        return hasModal;\n      },\n    },\n    [onClose],\n  );\n\n  useEffect(() => {\n    let handleScroll = () => {\n      const { clientWidth, scrollLeft } = carouselRef.current;\n      const index = Math.round(Math.abs(scrollLeft) / clientWidth);\n      setCurrentIndex(index);\n    };\n    if (carouselRef.current) {\n      carouselRef.current.addEventListener('scroll', handleScroll, {\n        passive: true,\n      });\n    }\n    return () => {\n      if (carouselRef.current) {\n        carouselRef.current.removeEventListener('scroll', handleScroll);\n      }\n    };\n  }, []);\n\n  useEffect(() => {\n    let timer = setTimeout(() => {\n      carouselRef.current?.focus?.();\n    }, 100);\n    return () => clearTimeout(timer);\n  }, []);\n\n  const mediaOkColors = useMemo(() => {\n    return mediaAttachments?.map((media) => {\n      const { blurhash } = media;\n      if (blurhash) {\n        const averageColor = getBlurHashAverageColor(blurhash);\n        return rgb2oklch(averageColor);\n      }\n      return null;\n    });\n  }, [mediaAttachments]);\n  const mediaAccentColors = useMemo(() => {\n    return mediaOkColors?.map((okColor) => {\n      if (okColor) {\n        return {\n          light: oklch2rgb([0.95, 0.01, okColor[2]]),\n          dark: oklch2rgb([0.35, 0.01, okColor[2]]),\n          default: oklch2rgb([0.6, okColor[1], okColor[2]]),\n        };\n      }\n      return null;\n    });\n  });\n  const mediaAccentGradients = useMemo(() => {\n    const gap = 5;\n    const range = 100 / mediaAccentColors.length;\n    const colors = mediaAccentColors.map((color, i) => {\n      const start = i * range + gap;\n      const end = (i + 1) * range - gap;\n      if (color?.light && color?.dark) {\n        return {\n          light: `\n                rgb(${color.light?.join(',')}) ${start}%, \n                rgb(${color.light?.join(',')}) ${end}%\n              `,\n          dark: `\n                rgb(${color.dark?.join(',')}) ${start}%, \n                rgb(${color.dark?.join(',')}) ${end}%\n              `,\n        };\n      }\n\n      return {\n        light: `\n              transparent ${start}%, \n              transparent ${end}%\n            `,\n        dark: `\n              transparent ${start}%, \n              transparent ${end}%\n            `,\n      };\n    });\n    const lightGradient = colors.map((color) => color.light).join(', ');\n    const darkGradient = colors.map((color) => color.dark).join(', ');\n    return {\n      light: lightGradient,\n      dark: darkGradient,\n    };\n  }, [mediaAccentColors]);\n\n  let toastRef = useRef(null);\n  useEffect(() => {\n    return () => {\n      toastRef.current?.hideToast?.();\n    };\n  }, []);\n\n  useLayoutEffect(() => {\n    const currentColor = mediaAccentColors[currentIndex];\n    let $meta;\n    let metaColor;\n    if (currentColor) {\n      const theme = store.local.get('theme');\n      if (theme) {\n        const mediaColor = `rgb(${currentColor[theme].join(',')})`;\n        console.log({ mediaColor });\n        $meta = document.querySelector(\n          `meta[name=\"theme-color\"][data-theme-setting=\"manual\"]`,\n        );\n        if ($meta) {\n          metaColor = $meta.content;\n          $meta.content = mediaColor;\n        }\n      } else {\n        const colorScheme = window.matchMedia('(prefers-color-scheme: dark)')\n          .matches\n          ? 'dark'\n          : 'light';\n        const mediaColor = `rgb(${currentColor[colorScheme].join(',')})`;\n        console.log({ mediaColor });\n        $meta = document.querySelector(\n          `meta[name=\"theme-color\"][media*=\"${colorScheme}\"]`,\n        );\n        if ($meta) {\n          metaColor = $meta.content;\n          $meta.content = mediaColor;\n        }\n      }\n    }\n    return () => {\n      // Reset meta color\n      if ($meta && metaColor) {\n        $meta.content = metaColor;\n      }\n    };\n  }, [currentIndex, mediaAccentColors]);\n\n  return (\n    <div\n      class={`media-modal-container media-modal-count-${mediaAttachments?.length}`}\n    >\n      <div\n        ref={carouselRef}\n        tabIndex=\"0\"\n        data-swipe-threshold=\"44\"\n        class=\"carousel\"\n        onClick={(e) => {\n          if (\n            e.target.classList.contains('carousel-item') ||\n            e.target.classList.contains('media') ||\n            e.target.classList.contains('media-zoom')\n          ) {\n            onClose();\n          }\n        }}\n        style={\n          mediaAttachments.length > 1\n            ? {\n                backgroundAttachment: 'local',\n                '--accent-gradient-light': mediaAccentGradients?.light,\n                '--accent-gradient-dark': mediaAccentGradients?.dark,\n                //     backgroundImage: `linear-gradient(\n                // to ${isRTL() ? 'left' : 'right'}, ${mediaAccentGradient})`,\n              }\n            : {}\n        }\n      >\n        {mediaAttachments?.map((media, i) => {\n          const accentColor =\n            mediaAttachments.length === 1 ? mediaAccentColors[i] : null;\n          return (\n            <div\n              class=\"carousel-item\"\n              style={\n                accentColor\n                  ? {\n                      '--accent-color': `rgb(${accentColor.default.join(',')})`,\n                      '--accent-light-color': `rgb(${accentColor.light?.join(\n                        ',',\n                      )})`,\n                      '--accent-dark-color': `rgb(${accentColor.dark?.join(\n                        ',',\n                      )})`,\n                      '--accent-alpha-color': `rgba(${accentColor.default.join(\n                        ',',\n                      )}, 0.4)`,\n                    }\n                  : {}\n              }\n              tabindex=\"0\"\n              key={media.id}\n              ref={i === currentIndex ? carouselFocusItem : null}\n              onClick={(e) => {\n                // console.log(e);\n                // if (e.target !== e.currentTarget) {\n                //   setShowControls(!showControls);\n                // }\n                if (!e.target.classList.contains('media')) {\n                  setShowControls(!showControls);\n                }\n              }}\n            >\n              {!!media.description && (\n                <button\n                  type=\"button\"\n                  class=\"media-alt\"\n                  hidden={!showControls}\n                  onClick={() => {\n                    states.showMediaAlt = {\n                      alt: media.description,\n                      lang,\n                    };\n                  }}\n                >\n                  <span class=\"alt-badge\">ALT</span>\n                  <span class=\"media-alt-desc\" lang={lang} dir=\"auto\">\n                    {media.description}\n                  </span>\n                </button>\n              )}\n              <Media media={media} showOriginal lang={lang} />\n            </div>\n          );\n        })}\n      </div>\n      <div class=\"carousel-top-controls\" hidden={!showControls}>\n        <span>\n          <button\n            type=\"button\"\n            class=\"carousel-button\"\n            onClick={() => onClose()}\n          >\n            <Icon icon=\"x\" alt={t`Close`} />\n          </button>\n        </span>\n        {mediaAttachments?.length > 1 ? (\n          <span class=\"carousel-dots\">\n            {mediaAttachments?.map((media, i) => (\n              <button\n                key={media.id}\n                type=\"button\"\n                disabled={i === currentIndex}\n                class={`carousel-dot ${i === currentIndex ? 'active' : ''}`}\n                onClick={(e) => {\n                  e.preventDefault();\n                  e.stopPropagation();\n                  const left =\n                    carouselRef.current.clientWidth * i * (isRTL() ? -1 : 1);\n                  carouselRef.current.focus();\n                  carouselRef.current.scrollTo({ left, behavior: 'smooth' });\n                }}\n              >\n                <Icon icon=\"round\" size=\"s\" alt=\"โธฑ\" />\n              </button>\n            ))}\n          </span>\n        ) : (\n          <span />\n        )}\n        <span>\n          <Menu2\n            overflow=\"auto\"\n            align=\"end\"\n            position=\"anchor\"\n            gap={4}\n            menuClassName=\"glass-menu\"\n            menuButton={\n              <button type=\"button\" class=\"carousel-button\">\n                <Icon icon=\"more\" alt={t`More`} />\n              </button>\n            }\n          >\n            <MenuLink\n              href={\n                mediaAttachments[currentIndex]?.remoteUrl ||\n                mediaAttachments[currentIndex]?.url\n              }\n              class=\"carousel-button\"\n              target=\"_blank\"\n              title={t`Open original media in new window`}\n            >\n              <Icon icon=\"popout\" />\n              <span>\n                <Trans>Open original media</Trans>\n              </span>\n            </MenuLink>\n            {import.meta.env.DEV && // Only dev for now\n              !!states.settings.mediaAltGenerator &&\n              !!IMG_ALT_API_URL &&\n              !!mediaAttachments[currentIndex]?.url &&\n              !mediaAttachments[currentIndex]?.description &&\n              mediaAttachments[currentIndex]?.type === 'image' && (\n                <>\n                  <MenuDivider />\n                  <MenuItem\n                    disabled={uiState === 'loading'}\n                    onClick={() => {\n                      setUIState('loading');\n                      toastRef.current = showToast({\n                        text: t`Attempting to describe image. Please waitโ€ฆ`,\n                        duration: -1,\n                      });\n                      (async function () {\n                        try {\n                          const response = await fetch(\n                            `${IMG_ALT_API_URL}?image=${encodeURIComponent(\n                              mediaAttachments[currentIndex]?.url,\n                            )}`,\n                          ).then((r) => r.json());\n                          states.showMediaAlt = {\n                            alt: response.description,\n                          };\n                        } catch (e) {\n                          console.error(e);\n                          showToast(t`Failed to describe image`);\n                        } finally {\n                          setUIState('default');\n                          toastRef.current?.hideToast?.();\n                        }\n                      })();\n                    }}\n                  >\n                    <Icon icon=\"sparkles2\" />\n                    <span>\n                      <Trans>Describe imageโ€ฆ</Trans>\n                    </span>\n                  </MenuItem>\n                </>\n              )}\n          </Menu2>{' '}\n          <Link\n            to={`${instance ? `/${instance}` : ''}/s/${statusID}${\n              window.matchMedia('(min-width: calc(40em + 350px))').matches\n                ? `?media=${currentIndex + 1}`\n                : ''\n            }`}\n            class=\"button carousel-button media-post-link\"\n            // onClick={() => {\n            //   // if small screen (not media query min-width 40em + 350px), run onClose\n            //   if (\n            //     !window.matchMedia('(min-width: calc(40em + 350px))').matches\n            //   ) {\n            //     onClose();\n            //   }\n            // }}\n          >\n            <span class=\"button-label\">\n              <Trans>View post</Trans>{' '}\n            </span>\n            &raquo;\n          </Link>\n        </span>\n      </div>\n      {mediaAttachments?.length > 1 && (\n        <div class=\"carousel-controls\" hidden={!showControls}>\n          <button\n            type=\"button\"\n            class=\"carousel-button\"\n            hidden={currentIndex === 0}\n            onClick={(e) => {\n              e.preventDefault();\n              e.stopPropagation();\n              carouselRef.current.focus();\n              carouselRef.current.scrollTo({\n                left:\n                  carouselRef.current.clientWidth *\n                  (currentIndex - 1) *\n                  (isRTL() ? -1 : 1),\n                behavior: 'smooth',\n              });\n            }}\n          >\n            <Icon icon=\"arrow-left\" alt={t`Previous`} />\n          </button>\n          <button\n            type=\"button\"\n            class=\"carousel-button\"\n            hidden={currentIndex === mediaAttachments.length - 1}\n            onClick={(e) => {\n              e.preventDefault();\n              e.stopPropagation();\n              carouselRef.current.focus();\n              carouselRef.current.scrollTo({\n                left:\n                  carouselRef.current.clientWidth *\n                  (currentIndex + 1) *\n                  (isRTL() ? -1 : 1),\n                behavior: 'smooth',\n              });\n            }}\n          >\n            <Icon icon=\"arrow-right\" alt={t`Next`} />\n          </button>\n        </div>\n      )}\n    </div>\n  );\n}\n\nexport default MediaModal;\n","import './report-modal.css';\n\nimport { msg } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { Fragment } from 'preact';\nimport { useMemo, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport showToast from '../utils/show-toast';\nimport { getCurrentInstance } from '../utils/store-utils';\n\nimport AccountBlock from './account-block';\nimport Icon from './icon';\nimport Loader from './loader';\nimport Status from './status';\n\n// NOTE: `dislike` hidden for now, it's actually not used for reporting\n// Mastodon shows another screen for unfollowing, muting or blocking instead of reporting\n\nconst CATEGORIES = [, /*'dislike'*/ 'spam', 'legal', 'violation', 'other'];\n// `violation` will be set if there are `rule_ids[]`\n\nconst CATEGORIES_INFO = {\n  // dislike: {\n  //   label: 'Dislike',\n  //   description: 'Not something you want to see',\n  // },\n  spam: {\n    label: msg`Spam`,\n    description: msg`Malicious links, fake engagement, or repetitive replies`,\n  },\n  legal: {\n    label: msg`Illegal`,\n    description: msg`Violates the law of your or the server's country`,\n  },\n  violation: {\n    label: msg`Server rule violation`,\n    description: msg`Breaks specific server rules`,\n    stampLabel: msg`Violation`,\n  },\n  other: {\n    label: msg`Other`,\n    description: msg`Issue doesn't fit other categories`,\n    excludeStamp: true,\n  },\n};\n\nfunction ReportModal({ account, post, onClose }) {\n  const { _, t } = useLingui();\n  const { masto } = api();\n  const [uiState, setUIState] = useState('default');\n  const [username, domain] = account.acct.split('@');\n\n  const [rules, currentDomain] = useMemo(() => {\n    const { rules, domain } = getCurrentInstance();\n    return [rules || [], domain];\n  });\n\n  const [selectedCategory, setSelectedCategory] = useState(null);\n  const [showRules, setShowRules] = useState(false);\n\n  const rulesRef = useRef(null);\n  const [hasRules, setHasRules] = useState(false);\n\n  return (\n    <div class=\"report-modal-container\">\n      <div class=\"top-controls\">\n        <h1>{post ? t`Report Post` : t`Report @${username}`}</h1>\n        <button\n          type=\"button\"\n          class=\"plain4 small\"\n          disabled={uiState === 'loading'}\n          onClick={() => onClose()}\n        >\n          <Icon icon=\"x\" size=\"xl\" alt={t`Close`} />\n        </button>\n      </div>\n      <main>\n        <div class=\"report-preview\">\n          {post ? (\n            <Status status={post} size=\"s\" previewMode />\n          ) : (\n            <AccountBlock\n              account={account}\n              avatarSize=\"xxl\"\n              useAvatarStatic\n              showStats\n              showActivity\n            />\n          )}\n        </div>\n        {!!selectedCategory &&\n          !CATEGORIES_INFO[selectedCategory].excludeStamp && (\n            <span\n              class=\"rubber-stamp\"\n              key={selectedCategory}\n              aria-hidden=\"true\"\n            >\n              {_(\n                CATEGORIES_INFO[selectedCategory].stampLabel ||\n                  _(CATEGORIES_INFO[selectedCategory].label),\n              )}\n              <small>\n                <Trans>Pending review</Trans>\n              </small>\n            </span>\n          )}\n        <form\n          onSubmit={(e) => {\n            e.preventDefault();\n\n            const formData = new FormData(e.target);\n            const entries = Object.fromEntries(formData.entries());\n            console.log('ENTRIES', entries);\n\n            let { category, comment, forward } = entries;\n            if (!comment) comment = undefined;\n            if (forward === 'on') forward = true;\n            const ruleIds =\n              category === 'violation'\n                ? Object.entries(entries)\n                    .filter(([key]) => key.startsWith('rule_ids'))\n                    .map(([key, value]) => value)\n                : undefined;\n\n            const params = {\n              category,\n              comment,\n              forward,\n              ruleIds,\n            };\n            console.log('PARAMS', params);\n\n            setUIState('loading');\n            (async () => {\n              try {\n                await masto.v1.reports.create({\n                  accountId: account.id,\n                  statusIds: post?.id ? [post.id] : undefined,\n                  category,\n                  comment,\n                  ruleIds,\n                  forward,\n                });\n                setUIState('success');\n                showToast(post ? t`Post reported` : t`Profile reported`);\n                onClose();\n              } catch (error) {\n                console.error(error);\n                setUIState('error');\n                showToast(\n                  error?.message ||\n                    (post\n                      ? t`Unable to report post`\n                      : t`Unable to report profile`),\n                );\n              }\n            })();\n          }}\n        >\n          <p>\n            {post\n              ? t`What's the issue with this post?`\n              : t`What's the issue with this profile?`}\n          </p>\n          <section class=\"report-categories\">\n            {CATEGORIES.map((category) =>\n              category === 'violation' && !rules?.length ? null : (\n                <Fragment key={category}>\n                  <label class=\"report-category\">\n                    <input\n                      type=\"radio\"\n                      name=\"category\"\n                      value={category}\n                      required\n                      disabled={uiState === 'loading'}\n                      onChange={(e) => {\n                        setSelectedCategory(e.target.value);\n                        setShowRules(e.target.value === 'violation');\n                      }}\n                    />\n                    <span>\n                      {_(CATEGORIES_INFO[category].label)} &nbsp;\n                      <small class=\"ib insignificant\">\n                        {_(CATEGORIES_INFO[category].description)}\n                      </small>\n                    </span>\n                  </label>\n                  {category === 'violation' && !!rules?.length && (\n                    <div\n                      class=\"shazam-container no-animation\"\n                      hidden={!showRules}\n                    >\n                      <div class=\"shazam-container-inner\">\n                        <div class=\"report-rules\" ref={rulesRef}>\n                          {rules.map((rule, i) => (\n                            <label class=\"report-rule\" key={rule.id}>\n                              <input\n                                type=\"checkbox\"\n                                name={`rule_ids[${i}]`}\n                                value={rule.id}\n                                required={showRules && !hasRules}\n                                disabled={uiState === 'loading'}\n                                onChange={(e) => {\n                                  const { checked } = e.target;\n                                  if (checked) {\n                                    setHasRules(true);\n                                  } else {\n                                    const checkedInputs =\n                                      rulesRef.current.querySelectorAll(\n                                        'input:checked',\n                                      );\n                                    if (!checkedInputs.length) {\n                                      setHasRules(false);\n                                    }\n                                  }\n                                }}\n                              />\n                              <span>{rule.text}</span>\n                            </label>\n                          ))}\n                        </div>\n                      </div>\n                    </div>\n                  )}\n                </Fragment>\n              ),\n            )}\n          </section>\n          <section class=\"report-comment\">\n            <p>\n              <label for=\"report-comment\">\n                <Trans>Additional info</Trans>\n              </label>\n            </p>\n            <textarea\n              maxlength=\"1000\"\n              rows=\"1\"\n              name=\"comment\"\n              id=\"report-comment\"\n              disabled={uiState === 'loading'}\n              required={!post} // Required if not reporting a post\n            />\n          </section>\n          {!!domain && domain !== currentDomain && (\n            <section>\n              <p>\n                <label>\n                  <input\n                    type=\"checkbox\"\n                    switch\n                    name=\"forward\"\n                    disabled={uiState === 'loading'}\n                  />{' '}\n                  <span>\n                    <Trans>\n                      Forward to <i>{domain}</i>\n                    </Trans>\n                  </span>\n                </label>\n              </p>\n            </section>\n          )}\n          <footer>\n            <button type=\"submit\" disabled={uiState === 'loading'}>\n              <Trans>Send Report</Trans>\n            </button>{' '}\n            <button\n              type=\"submit\"\n              class=\"plain2\"\n              disabled={uiState === 'loading'}\n              onClick={async () => {\n                try {\n                  await masto.v1.accounts.$select(account.id).mute(); // Infinite duration\n                  showToast(t`Muted ${username}`);\n                } catch (e) {\n                  console.error(e);\n                  showToast(t`Unable to mute ${username}`);\n                }\n                // onSubmit will still run\n              }}\n            >\n              <Trans>\n                Send Report <small class=\"ib\">+ Mute profile</small>\n              </Trans>\n            </button>{' '}\n            <button\n              type=\"submit\"\n              class=\"plain2\"\n              disabled={uiState === 'loading'}\n              onClick={async () => {\n                try {\n                  await masto.v1.accounts.$select(account.id).block();\n                  showToast(t`Blocked ${username}`);\n                } catch (e) {\n                  console.error(e);\n                  showToast(t`Unable to block ${username}`);\n                }\n                // onSubmit will still run\n              }}\n            >\n              <Trans>\n                Send Report <small class=\"ib\">+ Block profile</small>\n              </Trans>\n            </button>\n            <Loader hidden={uiState !== 'loading'} />\n          </footer>\n        </form>\n      </main>\n    </div>\n  );\n}\n\nexport default ReportModal;\n","// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>\n// This work is free. You can redistribute it and/or modify it\n// under the terms of the WTFPL, Version 2\n// For more information see LICENSE.txt or http://www.wtfpl.net/\n//\n// For more information, the home page:\n// http://pieroxy.net/blog/pages/lz-string/testing.html\n//\n// LZ-based compression algorithm, version 1.4.5\nvar LZString = (function() {\n\n// private property\nvar f = String.fromCharCode;\nvar keyStrBase64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\nvar keyStrUriSafe = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$\";\nvar baseReverseDic = {};\n\nfunction getBaseValue(alphabet, character) {\n  if (!baseReverseDic[alphabet]) {\n    baseReverseDic[alphabet] = {};\n    for (var i=0 ; i<alphabet.length ; i++) {\n      baseReverseDic[alphabet][alphabet.charAt(i)] = i;\n    }\n  }\n  return baseReverseDic[alphabet][character];\n}\n\nvar LZString = {\n  compressToBase64 : function (input) {\n    if (input == null) return \"\";\n    var res = LZString._compress(input, 6, function(a){return keyStrBase64.charAt(a);});\n    switch (res.length % 4) { // To produce valid Base64\n    default: // When could this happen ?\n    case 0 : return res;\n    case 1 : return res+\"===\";\n    case 2 : return res+\"==\";\n    case 3 : return res+\"=\";\n    }\n  },\n\n  decompressFromBase64 : function (input) {\n    if (input == null) return \"\";\n    if (input == \"\") return null;\n    return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrBase64, input.charAt(index)); });\n  },\n\n  compressToUTF16 : function (input) {\n    if (input == null) return \"\";\n    return LZString._compress(input, 15, function(a){return f(a+32);}) + \" \";\n  },\n\n  decompressFromUTF16: function (compressed) {\n    if (compressed == null) return \"\";\n    if (compressed == \"\") return null;\n    return LZString._decompress(compressed.length, 16384, function(index) { return compressed.charCodeAt(index) - 32; });\n  },\n\n  //compress into uint8array (UCS-2 big endian format)\n  compressToUint8Array: function (uncompressed) {\n    var compressed = LZString.compress(uncompressed);\n    var buf=new Uint8Array(compressed.length*2); // 2 bytes per character\n\n    for (var i=0, TotalLen=compressed.length; i<TotalLen; i++) {\n      var current_value = compressed.charCodeAt(i);\n      buf[i*2] = current_value >>> 8;\n      buf[i*2+1] = current_value % 256;\n    }\n    return buf;\n  },\n\n  //decompress from uint8array (UCS-2 big endian format)\n  decompressFromUint8Array:function (compressed) {\n    if (compressed===null || compressed===undefined){\n        return LZString.decompress(compressed);\n    } else {\n        var buf=new Array(compressed.length/2); // 2 bytes per character\n        for (var i=0, TotalLen=buf.length; i<TotalLen; i++) {\n          buf[i]=compressed[i*2]*256+compressed[i*2+1];\n        }\n\n        var result = [];\n        buf.forEach(function (c) {\n          result.push(f(c));\n        });\n        return LZString.decompress(result.join(''));\n\n    }\n\n  },\n\n\n  //compress into a string that is already URI encoded\n  compressToEncodedURIComponent: function (input) {\n    if (input == null) return \"\";\n    return LZString._compress(input, 6, function(a){return keyStrUriSafe.charAt(a);});\n  },\n\n  //decompress from an output of compressToEncodedURIComponent\n  decompressFromEncodedURIComponent:function (input) {\n    if (input == null) return \"\";\n    if (input == \"\") return null;\n    input = input.replace(/ /g, \"+\");\n    return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrUriSafe, input.charAt(index)); });\n  },\n\n  compress: function (uncompressed) {\n    return LZString._compress(uncompressed, 16, function(a){return f(a);});\n  },\n  _compress: function (uncompressed, bitsPerChar, getCharFromInt) {\n    if (uncompressed == null) return \"\";\n    var i, value,\n        context_dictionary= {},\n        context_dictionaryToCreate= {},\n        context_c=\"\",\n        context_wc=\"\",\n        context_w=\"\",\n        context_enlargeIn= 2, // Compensate for the first entry which should not count\n        context_dictSize= 3,\n        context_numBits= 2,\n        context_data=[],\n        context_data_val=0,\n        context_data_position=0,\n        ii;\n\n    for (ii = 0; ii < uncompressed.length; ii += 1) {\n      context_c = uncompressed.charAt(ii);\n      if (!Object.prototype.hasOwnProperty.call(context_dictionary,context_c)) {\n        context_dictionary[context_c] = context_dictSize++;\n        context_dictionaryToCreate[context_c] = true;\n      }\n\n      context_wc = context_w + context_c;\n      if (Object.prototype.hasOwnProperty.call(context_dictionary,context_wc)) {\n        context_w = context_wc;\n      } else {\n        if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n          if (context_w.charCodeAt(0)<256) {\n            for (i=0 ; i<context_numBits ; i++) {\n              context_data_val = (context_data_val << 1);\n              if (context_data_position == bitsPerChar-1) {\n                context_data_position = 0;\n                context_data.push(getCharFromInt(context_data_val));\n                context_data_val = 0;\n              } else {\n                context_data_position++;\n              }\n            }\n            value = context_w.charCodeAt(0);\n            for (i=0 ; i<8 ; i++) {\n              context_data_val = (context_data_val << 1) | (value&1);\n              if (context_data_position == bitsPerChar-1) {\n                context_data_position = 0;\n                context_data.push(getCharFromInt(context_data_val));\n                context_data_val = 0;\n              } else {\n                context_data_position++;\n              }\n              value = value >> 1;\n            }\n          } else {\n            value = 1;\n            for (i=0 ; i<context_numBits ; i++) {\n              context_data_val = (context_data_val << 1) | value;\n              if (context_data_position ==bitsPerChar-1) {\n                context_data_position = 0;\n                context_data.push(getCharFromInt(context_data_val));\n                context_data_val = 0;\n              } else {\n                context_data_position++;\n              }\n              value = 0;\n            }\n            value = context_w.charCodeAt(0);\n            for (i=0 ; i<16 ; i++) {\n              context_data_val = (context_data_val << 1) | (value&1);\n              if (context_data_position == bitsPerChar-1) {\n                context_data_position = 0;\n                context_data.push(getCharFromInt(context_data_val));\n                context_data_val = 0;\n              } else {\n                context_data_position++;\n              }\n              value = value >> 1;\n            }\n          }\n          context_enlargeIn--;\n          if (context_enlargeIn == 0) {\n            context_enlargeIn = Math.pow(2, context_numBits);\n            context_numBits++;\n          }\n          delete context_dictionaryToCreate[context_w];\n        } else {\n          value = context_dictionary[context_w];\n          for (i=0 ; i<context_numBits ; i++) {\n            context_data_val = (context_data_val << 1) | (value&1);\n            if (context_data_position == bitsPerChar-1) {\n              context_data_position = 0;\n              context_data.push(getCharFromInt(context_data_val));\n              context_data_val = 0;\n            } else {\n              context_data_position++;\n            }\n            value = value >> 1;\n          }\n\n\n        }\n        context_enlargeIn--;\n        if (context_enlargeIn == 0) {\n          context_enlargeIn = Math.pow(2, context_numBits);\n          context_numBits++;\n        }\n        // Add wc to the dictionary.\n        context_dictionary[context_wc] = context_dictSize++;\n        context_w = String(context_c);\n      }\n    }\n\n    // Output the code for w.\n    if (context_w !== \"\") {\n      if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n        if (context_w.charCodeAt(0)<256) {\n          for (i=0 ; i<context_numBits ; i++) {\n            context_data_val = (context_data_val << 1);\n            if (context_data_position == bitsPerChar-1) {\n              context_data_position = 0;\n              context_data.push(getCharFromInt(context_data_val));\n              context_data_val = 0;\n            } else {\n              context_data_position++;\n            }\n          }\n          value = context_w.charCodeAt(0);\n          for (i=0 ; i<8 ; i++) {\n            context_data_val = (context_data_val << 1) | (value&1);\n            if (context_data_position == bitsPerChar-1) {\n              context_data_position = 0;\n              context_data.push(getCharFromInt(context_data_val));\n              context_data_val = 0;\n            } else {\n              context_data_position++;\n            }\n            value = value >> 1;\n          }\n        } else {\n          value = 1;\n          for (i=0 ; i<context_numBits ; i++) {\n            context_data_val = (context_data_val << 1) | value;\n            if (context_data_position == bitsPerChar-1) {\n              context_data_position = 0;\n              context_data.push(getCharFromInt(context_data_val));\n              context_data_val = 0;\n            } else {\n              context_data_position++;\n            }\n            value = 0;\n          }\n          value = context_w.charCodeAt(0);\n          for (i=0 ; i<16 ; i++) {\n            context_data_val = (context_data_val << 1) | (value&1);\n            if (context_data_position == bitsPerChar-1) {\n              context_data_position = 0;\n              context_data.push(getCharFromInt(context_data_val));\n              context_data_val = 0;\n            } else {\n              context_data_position++;\n            }\n            value = value >> 1;\n          }\n        }\n        context_enlargeIn--;\n        if (context_enlargeIn == 0) {\n          context_enlargeIn = Math.pow(2, context_numBits);\n          context_numBits++;\n        }\n        delete context_dictionaryToCreate[context_w];\n      } else {\n        value = context_dictionary[context_w];\n        for (i=0 ; i<context_numBits ; i++) {\n          context_data_val = (context_data_val << 1) | (value&1);\n          if (context_data_position == bitsPerChar-1) {\n            context_data_position = 0;\n            context_data.push(getCharFromInt(context_data_val));\n            context_data_val = 0;\n          } else {\n            context_data_position++;\n          }\n          value = value >> 1;\n        }\n\n\n      }\n      context_enlargeIn--;\n      if (context_enlargeIn == 0) {\n        context_enlargeIn = Math.pow(2, context_numBits);\n        context_numBits++;\n      }\n    }\n\n    // Mark the end of the stream\n    value = 2;\n    for (i=0 ; i<context_numBits ; i++) {\n      context_data_val = (context_data_val << 1) | (value&1);\n      if (context_data_position == bitsPerChar-1) {\n        context_data_position = 0;\n        context_data.push(getCharFromInt(context_data_val));\n        context_data_val = 0;\n      } else {\n        context_data_position++;\n      }\n      value = value >> 1;\n    }\n\n    // Flush the last char\n    while (true) {\n      context_data_val = (context_data_val << 1);\n      if (context_data_position == bitsPerChar-1) {\n        context_data.push(getCharFromInt(context_data_val));\n        break;\n      }\n      else context_data_position++;\n    }\n    return context_data.join('');\n  },\n\n  decompress: function (compressed) {\n    if (compressed == null) return \"\";\n    if (compressed == \"\") return null;\n    return LZString._decompress(compressed.length, 32768, function(index) { return compressed.charCodeAt(index); });\n  },\n\n  _decompress: function (length, resetValue, getNextValue) {\n    var dictionary = [],\n        next,\n        enlargeIn = 4,\n        dictSize = 4,\n        numBits = 3,\n        entry = \"\",\n        result = [],\n        i,\n        w,\n        bits, resb, maxpower, power,\n        c,\n        data = {val:getNextValue(0), position:resetValue, index:1};\n\n    for (i = 0; i < 3; i += 1) {\n      dictionary[i] = i;\n    }\n\n    bits = 0;\n    maxpower = Math.pow(2,2);\n    power=1;\n    while (power!=maxpower) {\n      resb = data.val & data.position;\n      data.position >>= 1;\n      if (data.position == 0) {\n        data.position = resetValue;\n        data.val = getNextValue(data.index++);\n      }\n      bits |= (resb>0 ? 1 : 0) * power;\n      power <<= 1;\n    }\n\n    switch (next = bits) {\n      case 0:\n          bits = 0;\n          maxpower = Math.pow(2,8);\n          power=1;\n          while (power!=maxpower) {\n            resb = data.val & data.position;\n            data.position >>= 1;\n            if (data.position == 0) {\n              data.position = resetValue;\n              data.val = getNextValue(data.index++);\n            }\n            bits |= (resb>0 ? 1 : 0) * power;\n            power <<= 1;\n          }\n        c = f(bits);\n        break;\n      case 1:\n          bits = 0;\n          maxpower = Math.pow(2,16);\n          power=1;\n          while (power!=maxpower) {\n            resb = data.val & data.position;\n            data.position >>= 1;\n            if (data.position == 0) {\n              data.position = resetValue;\n              data.val = getNextValue(data.index++);\n            }\n            bits |= (resb>0 ? 1 : 0) * power;\n            power <<= 1;\n          }\n        c = f(bits);\n        break;\n      case 2:\n        return \"\";\n    }\n    dictionary[3] = c;\n    w = c;\n    result.push(c);\n    while (true) {\n      if (data.index > length) {\n        return \"\";\n      }\n\n      bits = 0;\n      maxpower = Math.pow(2,numBits);\n      power=1;\n      while (power!=maxpower) {\n        resb = data.val & data.position;\n        data.position >>= 1;\n        if (data.position == 0) {\n          data.position = resetValue;\n          data.val = getNextValue(data.index++);\n        }\n        bits |= (resb>0 ? 1 : 0) * power;\n        power <<= 1;\n      }\n\n      switch (c = bits) {\n        case 0:\n          bits = 0;\n          maxpower = Math.pow(2,8);\n          power=1;\n          while (power!=maxpower) {\n            resb = data.val & data.position;\n            data.position >>= 1;\n            if (data.position == 0) {\n              data.position = resetValue;\n              data.val = getNextValue(data.index++);\n            }\n            bits |= (resb>0 ? 1 : 0) * power;\n            power <<= 1;\n          }\n\n          dictionary[dictSize++] = f(bits);\n          c = dictSize-1;\n          enlargeIn--;\n          break;\n        case 1:\n          bits = 0;\n          maxpower = Math.pow(2,16);\n          power=1;\n          while (power!=maxpower) {\n            resb = data.val & data.position;\n            data.position >>= 1;\n            if (data.position == 0) {\n              data.position = resetValue;\n              data.val = getNextValue(data.index++);\n            }\n            bits |= (resb>0 ? 1 : 0) * power;\n            power <<= 1;\n          }\n          dictionary[dictSize++] = f(bits);\n          c = dictSize-1;\n          enlargeIn--;\n          break;\n        case 2:\n          return result.join('');\n      }\n\n      if (enlargeIn == 0) {\n        enlargeIn = Math.pow(2, numBits);\n        numBits++;\n      }\n\n      if (dictionary[c]) {\n        entry = dictionary[c];\n      } else {\n        if (c === dictSize) {\n          entry = w + w.charAt(0);\n        } else {\n          return null;\n        }\n      }\n      result.push(entry);\n\n      // Add w+entry[0] to the dictionary.\n      dictionary[dictSize++] = w + entry.charAt(0);\n      enlargeIn--;\n\n      w = entry;\n\n      if (enlargeIn == 0) {\n        enlargeIn = Math.pow(2, numBits);\n        numBits++;\n      }\n\n    }\n  }\n};\n  return LZString;\n})();\n\nif (typeof define === 'function' && define.amd) {\n  define(function () { return LZString; });\n} else if( typeof module !== 'undefined' && module != null ) {\n  module.exports = LZString\n} else if( typeof angular !== 'undefined' && angular != null ) {\n  angular.module('LZString', [])\n  .factory('LZString', function () {\n    return LZString;\n  });\n}\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20fill='none'%20viewBox='0%200%2084%2062'%3e%3crect%20width='64'%20height='48'%20x='18'%20y='2'%20fill='%23fff'%20stroke='%23999'%20stroke-width='3'%20rx='4'/%3e%3crect%20width='32'%20height='48'%20x='2'%20y='12'%20fill='%23fff'%20stroke='%23999'%20stroke-width='3'%20rx='4'/%3e%3cpath%20fill='%234169E1'%20d='M14%2052a4%204%200%201%201-8%200%204%204%200%200%201%208%200Zm64-42a4%204%200%201%201-8%200%204%204%200%200%201%208%200Z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20fill='none'%20viewBox='0%200%2082%2062'%3e%3crect%20width='78'%20height='58'%20x='2'%20y='2'%20fill='%23999'%20fill-opacity='.3'%20stroke='%23999'%20stroke-width='3'%20rx='4'/%3e%3crect%20width='18'%20height='46'%20x='8'%20y='8'%20fill='%23fff'%20stroke='%23999'%20stroke-width='2'%20rx='1'/%3e%3crect%20width='18'%20height='46'%20x='32'%20y='8'%20fill='%23fff'%20stroke='%23999'%20stroke-width='2'%20rx='1'/%3e%3crect%20width='18'%20height='46'%20x='56'%20y='8'%20fill='%23fff'%20stroke='%23999'%20stroke-width='2'%20rx='1'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20fill='none'%20viewBox='0%200%2084%2062'%3e%3crect%20width='64'%20height='48'%20x='18'%20y='2'%20fill='%23fff'%20stroke='%23999'%20stroke-width='3'%20rx='4'/%3e%3cpath%20fill='%23999'%20fill-opacity='.3'%20d='M19%203h62v10H19z'/%3e%3cpath%20stroke='%234169E1'%20stroke-width='2'%20d='M43%208a2%202%200%201%201-4%200%202%202%200%200%201%204%200Z'/%3e%3cpath%20stroke='%23999'%20stroke-width='2'%20d='M52%208a2%202%200%201%201-4%200%202%202%200%200%201%204%200Zm9%200a2%202%200%201%201-4%200%202%202%200%200%201%204%200Z'/%3e%3crect%20width='32'%20height='48'%20x='2'%20y='12'%20fill='%23fff'%20stroke='%23999'%20stroke-width='3'%20rx='4'/%3e%3cpath%20fill='%23999'%20fill-opacity='.3'%20d='M3%2049h30v10H3z'/%3e%3cpath%20stroke='%234169E1'%20stroke-width='2'%20d='M11%2054a2%202%200%201%201-4%200%202%202%200%200%201%204%200Z'/%3e%3cpath%20stroke='%23999'%20stroke-width='2'%20d='M20%2054a2%202%200%201%201-4%200%202%202%200%200%201%204%200Zm9%200a2%202%200%201%201-4%200%202%202%200%200%201%204%200Z'/%3e%3c/svg%3e\"","import { api } from '../utils/api';\nimport store from '../utils/store';\n\nconst LIMIT = 200;\nconst MAX_FETCH = 10;\n\nexport async function fetchFollowedTags() {\n  const { masto } = api();\n  const iterator = masto.v1.followedTags.list({\n    limit: LIMIT,\n  });\n  const tags = [];\n  let fetchCount = 0;\n  do {\n    const { value, done } = await iterator.next();\n    if (done || value?.length === 0) break;\n    tags.push(...value);\n    fetchCount++;\n  } while (fetchCount < MAX_FETCH);\n  tags.sort((a, b) => a.name.localeCompare(b.name));\n  console.log(tags);\n\n  if (tags.length) {\n    setTimeout(() => {\n      // Save to local storage, with saved timestamp\n      store.account.set('followedTags', {\n        tags,\n        updatedAt: Date.now(),\n      });\n    }, 1);\n  }\n\n  return tags;\n}\n\nconst MAX_AGE = 24 * 60 * 60 * 1000; // 1 day\nexport async function getFollowedTags() {\n  try {\n    const { tags, updatedAt } = store.account.get('followedTags') || {};\n    if (!tags?.length) return await fetchFollowedTags();\n    if (Date.now() - updatedAt > MAX_AGE) {\n      // Stale-while-revalidate\n      fetchFollowedTags();\n      return tags;\n    }\n    return tags;\n  } catch (e) {\n    return [];\n  }\n}\n\nconst fauxDiv = document.createElement('div');\nexport const extractTagsFromStatus = (content) => {\n  if (!content) return [];\n  if (content.indexOf('#') === -1) return [];\n  fauxDiv.innerHTML = content;\n  const hashtagLinks = fauxDiv.querySelectorAll('a.hashtag');\n  if (!hashtagLinks.length) return [];\n  return Array.from(hashtagLinks).map((a) =>\n    a.innerText.trim().replace(/^[^#]*#+/, ''),\n  );\n};\n","import { useEffect, useState } from 'preact/hooks';\n\nfunction AsyncText({ children }) {\n  if (typeof children === 'string') return children;\n  const [text, setText] = useState('');\n  useEffect(() => {\n    Promise.resolve(children).then(setText);\n  }, [children]);\n  return text;\n}\n\nexport default AsyncText;\n","import './shortcuts-settings.css';\n\nimport { useAutoAnimate } from '@formkit/auto-animate/preact';\nimport { msg, t } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport {\n  compressToEncodedURIComponent,\n  decompressFromEncodedURIComponent,\n} from 'lz-string';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport floatingButtonUrl from '../assets/floating-button.svg';\nimport multiColumnUrl from '../assets/multi-column.svg';\nimport tabMenuBarUrl from '../assets/tab-menu-bar.svg';\n\nimport { api } from '../utils/api';\nimport { fetchFollowedTags } from '../utils/followed-tags';\nimport { getLists, getListTitle } from '../utils/lists';\nimport pmem from '../utils/pmem';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport store from '../utils/store';\nimport { getCurrentAccountID } from '../utils/store-utils';\n\nimport AsyncText from './AsyncText';\nimport Icon from './icon';\nimport MenuConfirm from './menu-confirm';\nimport Modal from './modal';\n\nexport const SHORTCUTS_LIMIT = 9;\n\nconst TYPES = [\n  'following',\n  'mentions',\n  'notifications',\n  'list',\n  'public',\n  'trending',\n  'search',\n  'hashtag',\n  'bookmarks',\n  'favourites',\n  // NOTE: Hide for now\n  // 'account-statuses', // Need @acct search first\n];\nconst TYPE_TEXT = {\n  following: msg`Home / Following`,\n  notifications: msg`Notifications`,\n  list: msg`Lists`,\n  public: msg`Public (Local / Federated)`,\n  search: msg`Search`,\n  'account-statuses': msg`Account`,\n  bookmarks: msg`Bookmarks`,\n  favourites: msg`Likes`,\n  hashtag: msg`Hashtag`,\n  trending: msg`Trending`,\n  mentions: msg`Mentions`,\n};\nconst TYPE_PARAMS = {\n  list: [\n    {\n      text: msg`List ID`,\n      name: 'id',\n      notRequired: true,\n    },\n  ],\n  public: [\n    {\n      text: msg`Local only`,\n      name: 'local',\n      type: 'checkbox',\n    },\n    {\n      text: msg`Instance`,\n      name: 'instance',\n      type: 'text',\n      placeholder: msg`Optional, e.g. mastodon.social`,\n      notRequired: true,\n    },\n  ],\n  trending: [\n    {\n      text: msg`Instance`,\n      name: 'instance',\n      type: 'text',\n      placeholder: msg`Optional, e.g. mastodon.social`,\n      notRequired: true,\n    },\n  ],\n  search: [\n    {\n      text: msg`Search term`,\n      name: 'query',\n      type: 'text',\n      placeholder: msg`Optional, unless for multi-column mode`,\n      notRequired: true,\n    },\n  ],\n  'account-statuses': [\n    {\n      text: '@',\n      name: 'id',\n      type: 'text',\n      placeholder: 'cheeaun@mastodon.social',\n    },\n  ],\n  hashtag: [\n    {\n      text: '#',\n      name: 'hashtag',\n      type: 'text',\n      placeholder: msg`e.g. PixelArt (Max 5, space-separated)`,\n      pattern: '[^#]+',\n    },\n    {\n      text: msg`Media only`,\n      name: 'media',\n      type: 'checkbox',\n    },\n    {\n      text: msg`Instance`,\n      name: 'instance',\n      type: 'text',\n      placeholder: msg`Optional, e.g. mastodon.social`,\n      notRequired: true,\n    },\n  ],\n};\nconst fetchAccountTitle = pmem(async ({ id }) => {\n  const account = await api().masto.v1.accounts.$select(id).fetch();\n  return account.username || account.acct || account.displayName;\n});\nexport const SHORTCUTS_META = {\n  following: {\n    id: 'home',\n    title: (_, index) =>\n      index === 0\n        ? t`Home`\n        : t({ id: 'following.title', message: 'Following' }),\n    path: '/',\n    icon: 'home',\n  },\n  mentions: {\n    id: 'mentions',\n    title: msg`Mentions`,\n    path: '/mentions',\n    icon: 'at',\n  },\n  notifications: {\n    id: 'notifications',\n    title: msg`Notifications`,\n    path: '/notifications',\n    icon: 'notification',\n  },\n  list: {\n    id: ({ id }) => (id ? 'list' : 'lists'),\n    title: ({ id }) => (id ? getListTitle(id) : t`Lists`),\n    path: ({ id }) => (id ? `/l/${id}` : '/l'),\n    icon: 'list',\n    excludeViewMode: ({ id }) => (!id ? ['multi-column'] : []),\n  },\n  public: {\n    id: 'public',\n    title: ({ local }) => (local ? t`Local` : t`Federated`),\n    subtitle: ({ instance }) => instance || api().instance,\n    path: ({ local, instance }) => `/${instance}/p${local ? '/l' : ''}`,\n    icon: ({ local }) => (local ? 'building' : 'earth'),\n  },\n  trending: {\n    id: 'trending',\n    title: msg`Trending`,\n    subtitle: ({ instance }) => instance || api().instance,\n    path: ({ instance }) => `/${instance}/trending`,\n    icon: 'chart',\n  },\n  search: {\n    id: 'search',\n    title: ({ query }) => (query ? `โ€œ${query}โ€` : t`Search`),\n    path: ({ query }) =>\n      query\n        ? `/search?q=${encodeURIComponent(query)}&type=statuses`\n        : '/search',\n    icon: 'search',\n    excludeViewMode: ({ query }) => (!query ? ['multi-column'] : []),\n  },\n  'account-statuses': {\n    id: 'account-statuses',\n    title: fetchAccountTitle,\n    path: ({ id }) => `/a/${id}`,\n    icon: 'user',\n  },\n  bookmarks: {\n    id: 'bookmarks',\n    title: msg`Bookmarks`,\n    path: '/b',\n    icon: 'bookmark',\n  },\n  favourites: {\n    id: 'favourites',\n    title: msg`Likes`,\n    path: '/f',\n    icon: 'heart',\n  },\n  hashtag: {\n    id: 'hashtag',\n    title: ({ hashtag }) => hashtag,\n    subtitle: ({ instance }) => instance || api().instance,\n    path: ({ hashtag, instance, media }) =>\n      `${instance ? `/${instance}` : ''}/t/${hashtag.split(/\\s+/).join('+')}${\n        media ? '?media=1' : ''\n      }`,\n    icon: 'hashtag',\n  },\n};\n\nfunction ShortcutsSettings({ onClose }) {\n  const { _ } = useLingui();\n  const snapStates = useSnapshot(states);\n  const { shortcuts } = snapStates;\n  const [showForm, setShowForm] = useState(false);\n  const [showImportExport, setShowImportExport] = useState(false);\n\n  const [shortcutsListParent] = useAutoAnimate();\n\n  return (\n    <div id=\"shortcuts-settings-container\" class=\"sheet\" tabindex=\"-1\">\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}\n      <header>\n        <h2>\n          <Icon icon=\"shortcut\" /> <Trans>Shortcuts</Trans>{' '}\n          <sup\n            style={{\n              fontSize: 12,\n              opacity: 0.5,\n              textTransform: 'uppercase',\n            }}\n          >\n            <Trans>beta</Trans>\n          </sup>\n        </h2>\n      </header>\n      <main>\n        <p>\n          <Trans>Specify a list of shortcuts that'll appear&nbsp;as:</Trans>\n        </p>\n        <div class=\"shortcuts-view-mode\">\n          {[\n            {\n              value: 'float-button',\n              label: t`Floating button`,\n              imgURL: floatingButtonUrl,\n            },\n            {\n              value: 'tab-menu-bar',\n              label: t`Tab/Menu bar`,\n              imgURL: tabMenuBarUrl,\n            },\n            {\n              value: 'multi-column',\n              label: t`Multi-column`,\n              imgURL: multiColumnUrl,\n            },\n          ].map(({ value, label, imgURL }) => {\n            const checked =\n              snapStates.settings.shortcutsViewMode === value ||\n              (value === 'float-button' &&\n                !snapStates.settings.shortcutsViewMode);\n            return (\n              <label key={value} class={checked ? 'checked' : ''}>\n                <input\n                  type=\"radio\"\n                  name=\"shortcuts-view-mode\"\n                  value={value}\n                  checked={checked}\n                  onChange={(e) => {\n                    states.settings.shortcutsViewMode = e.target.value;\n                  }}\n                />{' '}\n                <img src={imgURL} alt=\"\" width=\"80\" height=\"58\" />{' '}\n                <span>{label}</span>\n              </label>\n            );\n          })}\n        </div>\n        {shortcuts.length > 0 ? (\n          <>\n            <ol class=\"shortcuts-list\" ref={shortcutsListParent}>\n              {shortcuts.filter(Boolean).map((shortcut, i) => {\n                // const key = i + Object.values(shortcut);\n                const key = Object.values(shortcut).join('-');\n                const { type } = shortcut;\n                if (!SHORTCUTS_META[type]) return null;\n                let { icon, title, subtitle, excludeViewMode } =\n                  SHORTCUTS_META[type];\n                if (typeof title === 'function') {\n                  title = title(shortcut, i);\n                } else {\n                  title = _(title);\n                }\n                if (typeof subtitle === 'function') {\n                  subtitle = subtitle(shortcut, i);\n                } else {\n                  subtitle = _(subtitle);\n                }\n                if (typeof icon === 'function') {\n                  icon = icon(shortcut, i);\n                }\n                if (typeof excludeViewMode === 'function') {\n                  excludeViewMode = excludeViewMode(shortcut, i);\n                }\n                const excludedViewMode = excludeViewMode?.includes(\n                  snapStates.settings.shortcutsViewMode,\n                );\n                return (\n                  <li key={key}>\n                    <Icon icon={icon} />\n                    <span class=\"shortcut-text\">\n                      <AsyncText>{title}</AsyncText>\n                      {subtitle && (\n                        <>\n                          {' '}\n                          <small class=\"ib insignificant\">{subtitle}</small>\n                        </>\n                      )}\n                      {excludedViewMode && (\n                        <span class=\"tag\">\n                          <Trans>Not available in current view mode</Trans>\n                        </span>\n                      )}\n                    </span>\n                    <span class=\"shortcut-actions\">\n                      <button\n                        type=\"button\"\n                        class=\"plain small\"\n                        disabled={i === 0}\n                        onClick={() => {\n                          const shortcutsArr = Array.from(states.shortcuts);\n                          if (i > 0) {\n                            const temp = states.shortcuts[i - 1];\n                            shortcutsArr[i - 1] = shortcut;\n                            shortcutsArr[i] = temp;\n                            states.shortcuts = shortcutsArr;\n                          }\n                        }}\n                      >\n                        <Icon icon=\"arrow-up\" alt={t`Move up`} />\n                      </button>\n                      <button\n                        type=\"button\"\n                        class=\"plain small\"\n                        disabled={i === shortcuts.length - 1}\n                        onClick={() => {\n                          const shortcutsArr = Array.from(states.shortcuts);\n                          if (i < states.shortcuts.length - 1) {\n                            const temp = states.shortcuts[i + 1];\n                            shortcutsArr[i + 1] = shortcut;\n                            shortcutsArr[i] = temp;\n                            states.shortcuts = shortcutsArr;\n                          }\n                        }}\n                      >\n                        <Icon icon=\"arrow-down\" alt={t`Move down`} />\n                      </button>\n                      <button\n                        type=\"button\"\n                        class=\"plain small\"\n                        onClick={() => {\n                          setShowForm({\n                            shortcut,\n                            shortcutIndex: i,\n                          });\n                        }}\n                      >\n                        <Icon icon=\"pencil\" alt={t`Edit`} />\n                      </button>\n                      {/* <button\n                      type=\"button\"\n                      class=\"plain small\"\n                      onClick={() => {\n                        states.shortcuts.splice(i, 1);\n                      }}\n                    >\n                      <Icon icon=\"x\" alt=\"Remove\" />\n                    </button> */}\n                    </span>\n                  </li>\n                );\n              })}\n            </ol>\n            {shortcuts.length === 1 &&\n              snapStates.settings.shortcutsViewMode !== 'float-button' && (\n                <div class=\"ui-state insignificant\">\n                  <Icon icon=\"info\" />{' '}\n                  <small>\n                    <Trans>\n                      Add more than one shortcut/column to make this work.\n                    </Trans>\n                  </small>\n                </div>\n              )}\n          </>\n        ) : (\n          <div class=\"ui-state insignificant\">\n            <p>\n              {snapStates.settings.shortcutsViewMode === 'multi-column'\n                ? t`No columns yet. Tap on the Add column button.`\n                : t`No shortcuts yet. Tap on the Add shortcut button.`}\n            </p>\n            <p>\n              <Trans>\n                Not sure what to add?\n                <br />\n                Try adding{' '}\n                <a\n                  href=\"#\"\n                  onClick={(e) => {\n                    e.preventDefault();\n                    states.shortcuts = [\n                      {\n                        type: 'following',\n                      },\n                      {\n                        type: 'notifications',\n                      },\n                    ];\n                  }}\n                >\n                  Home / Following and Notifications\n                </a>{' '}\n                first.\n              </Trans>\n            </p>\n          </div>\n        )}\n        <p class=\"insignificant\">\n          {shortcuts.length >= SHORTCUTS_LIMIT &&\n            (snapStates.settings.shortcutsViewMode === 'multi-column'\n              ? t`Max ${SHORTCUTS_LIMIT} columns`\n              : t`Max ${SHORTCUTS_LIMIT} shortcuts`)}\n        </p>\n        <p\n          style={{\n            display: 'flex',\n            justifyContent: 'space-between',\n            alignItems: 'center',\n          }}\n        >\n          <button\n            type=\"button\"\n            class=\"light\"\n            onClick={() => setShowImportExport(true)}\n          >\n            <Trans>Import/export</Trans>\n          </button>\n          <button\n            type=\"button\"\n            disabled={shortcuts.length >= SHORTCUTS_LIMIT}\n            onClick={() => setShowForm(true)}\n          >\n            <Icon icon=\"plus\" />{' '}\n            <span>\n              {snapStates.settings.shortcutsViewMode === 'multi-column'\n                ? t`Add columnโ€ฆ`\n                : t`Add shortcutโ€ฆ`}\n            </span>\n          </button>\n        </p>\n      </main>\n      {showForm && (\n        <Modal\n          onClick={(e) => {\n            if (e.target === e.currentTarget) {\n              setShowForm(false);\n            }\n          }}\n        >\n          <ShortcutForm\n            shortcut={showForm.shortcut}\n            shortcutIndex={showForm.shortcutIndex}\n            onSubmit={({ result, mode }) => {\n              console.log('onSubmit', result);\n              if (mode === 'edit') {\n                states.shortcuts[showForm.shortcutIndex] = result;\n              } else {\n                states.shortcuts.push(result);\n              }\n            }}\n            onClose={() => setShowForm(false)}\n          />\n        </Modal>\n      )}\n      {showImportExport && (\n        <Modal\n          onClick={(e) => {\n            if (e.target === e.currentTarget) {\n              setShowImportExport(false);\n            }\n          }}\n        >\n          <ImportExport\n            shortcuts={shortcuts}\n            onClose={() => setShowImportExport(false)}\n          />\n        </Modal>\n      )}\n    </div>\n  );\n}\n\nconst FORM_NOTES = {\n  list: msg`Specific list is optional. For multi-column mode, list is required, else the column will not be shown.`,\n  search: msg`For multi-column mode, search term is required, else the column will not be shown.`,\n  hashtag: msg`Multiple hashtags are supported. Space-separated.`,\n};\n\nfunction ShortcutForm({\n  onSubmit,\n  disabled,\n  shortcut,\n  shortcutIndex,\n  onClose,\n}) {\n  const { _ } = useLingui();\n  console.log('shortcut', shortcut);\n  const editMode = !!shortcut;\n  const [currentType, setCurrentType] = useState(shortcut?.type || null);\n\n  const [uiState, setUIState] = useState('default');\n  const [lists, setLists] = useState([]);\n  const [followedHashtags, setFollowedHashtags] = useState([]);\n  useEffect(() => {\n    (async () => {\n      if (currentType !== 'list') return;\n      try {\n        setUIState('loading');\n        const lists = await getLists();\n        setLists(lists);\n        setUIState('default');\n      } catch (e) {\n        console.error(e);\n        setUIState('error');\n      }\n    })();\n\n    (async () => {\n      if (currentType !== 'hashtag') return;\n      try {\n        const tags = await fetchFollowedTags();\n        setFollowedHashtags(tags);\n      } catch (e) {\n        console.error(e);\n      }\n    })();\n  }, [currentType]);\n\n  const formRef = useRef();\n  useEffect(() => {\n    if (editMode && currentType && TYPE_PARAMS[currentType]) {\n      // Populate form\n      const form = formRef.current;\n      TYPE_PARAMS[currentType].forEach(({ name, type }) => {\n        const input = form.querySelector(`[name=\"${name}\"]`);\n        if (input && shortcut[name]) {\n          if (type === 'checkbox') {\n            input.checked = shortcut[name] === 'on' ? true : false;\n          } else {\n            input.value = shortcut[name];\n          }\n        }\n      });\n    }\n  }, [editMode, currentType]);\n\n  return (\n    <div id=\"shortcut-settings-form\" class=\"sheet\">\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}\n      <header>\n        <h2>{editMode ? t`Edit shortcut` : t`Add shortcut`}</h2>\n      </header>\n      <main tabindex=\"-1\">\n        <form\n          ref={formRef}\n          onSubmit={(e) => {\n            // Construct a nice object from form\n            e.preventDefault();\n            const data = new FormData(e.target);\n            const result = {};\n            data.forEach((value, key) => {\n              result[key] = value?.trim();\n              if (key === 'instance') {\n                // Remove protocol and trailing slash\n                result[key] = result[key]\n                  .replace(/^https?:\\/\\//, '')\n                  .replace(/\\/+$/, '');\n                // Remove @acct@ or acct@ from instance URL\n                result[key] = result[key].replace(/^@?[^@]+@/, '');\n              }\n            });\n            console.log('result', result);\n            if (!result.type) return;\n            onSubmit({\n              result,\n              mode: editMode ? 'edit' : 'add',\n            });\n            // Reset\n            e.target.reset();\n            setCurrentType(null);\n            onClose?.();\n          }}\n        >\n          <p>\n            <label>\n              <span>\n                <Trans>Timeline</Trans>\n              </span>\n              <select\n                required\n                disabled={disabled}\n                onChange={(e) => {\n                  setCurrentType(e.target.value);\n                }}\n                defaultValue={editMode ? shortcut.type : undefined}\n                name=\"type\"\n                dir=\"auto\"\n              >\n                <option></option>\n                {TYPES.map((type) => (\n                  <option value={type}>{_(TYPE_TEXT[type])}</option>\n                ))}\n              </select>\n            </label>\n          </p>\n          {TYPE_PARAMS[currentType]?.map?.(\n            ({ text, name, type, placeholder, pattern, notRequired }) => {\n              if (currentType === 'list') {\n                return (\n                  <p>\n                    <label>\n                      <span>\n                        <Trans>List</Trans>\n                      </span>\n                      <select\n                        name=\"id\"\n                        required={!notRequired}\n                        disabled={disabled || uiState === 'loading'}\n                        defaultValue={editMode ? shortcut.id : undefined}\n                        dir=\"auto\"\n                      >\n                        <option value=\"\"></option>\n                        {lists.map((list) => (\n                          <option value={list.id}>{list.title}</option>\n                        ))}\n                      </select>\n                    </label>\n                  </p>\n                );\n              }\n\n              return (\n                <p>\n                  <label>\n                    <span>{_(text)}</span>{' '}\n                    <input\n                      type={type}\n                      switch={type === 'checkbox' || undefined}\n                      name={name}\n                      placeholder={_(placeholder)}\n                      required={type === 'text' && !notRequired}\n                      disabled={disabled}\n                      list={\n                        currentType === 'hashtag'\n                          ? 'followed-hashtags-datalist'\n                          : null\n                      }\n                      autocorrect=\"off\"\n                      autocapitalize=\"off\"\n                      spellCheck={false}\n                      pattern={pattern}\n                      dir=\"auto\"\n                    />\n                    {currentType === 'hashtag' &&\n                      followedHashtags.length > 0 && (\n                        <datalist id=\"followed-hashtags-datalist\">\n                          {followedHashtags.map((tag) => (\n                            <option value={tag.name} />\n                          ))}\n                        </datalist>\n                      )}\n                  </label>\n                </p>\n              );\n            },\n          )}\n          {!!FORM_NOTES[currentType] && (\n            <p class=\"form-note insignificant\">\n              <Icon icon=\"info\" />\n              {_(FORM_NOTES[currentType])}\n            </p>\n          )}\n          <footer>\n            <button\n              type=\"submit\"\n              class=\"block\"\n              disabled={disabled || uiState === 'loading'}\n            >\n              {editMode ? t`Save` : t`Add`}\n            </button>\n            {editMode && (\n              <button\n                type=\"button\"\n                class=\"light danger\"\n                onClick={() => {\n                  states.shortcuts.splice(shortcutIndex, 1);\n                  onClose?.();\n                }}\n              >\n                <Trans>Remove</Trans>\n              </button>\n            )}\n          </footer>\n        </form>\n      </main>\n    </div>\n  );\n}\n\nfunction ImportExport({ shortcuts, onClose }) {\n  const { _ } = useLingui();\n  const { masto } = api();\n  const shortcutsStr = useMemo(() => {\n    if (!shortcuts) return '';\n    if (!shortcuts.filter(Boolean).length) return '';\n    return compressToEncodedURIComponent(\n      JSON.stringify(shortcuts.filter(Boolean)),\n    );\n  }, [shortcuts]);\n  const [importShortcutStr, setImportShortcutStr] = useState('');\n  const [importUIState, setImportUIState] = useState('default');\n  const parsedImportShortcutStr = useMemo(() => {\n    if (!importShortcutStr) {\n      setImportUIState('default');\n      return null;\n    }\n    try {\n      const parsed = JSON.parse(\n        decompressFromEncodedURIComponent(importShortcutStr),\n      );\n      // Very basic validation, I know\n      if (!Array.isArray(parsed)) throw new Error('Not an array');\n      setImportUIState('default');\n      return parsed;\n    } catch (err) {\n      // Fallback to JSON string parsing\n      // There's a chance that someone might want to import a JSON string instead of the compressed version\n      try {\n        const parsed = JSON.parse(importShortcutStr);\n        if (!Array.isArray(parsed)) throw new Error('Not an array');\n        setImportUIState('default');\n        return parsed;\n      } catch (err) {\n        setImportUIState('error');\n        return null;\n      }\n    }\n  }, [importShortcutStr]);\n  const hasCurrentSettings = states.shortcuts.length > 0;\n\n  const shortcutsImportFieldRef = useRef();\n\n  return (\n    <div id=\"import-export-container\" class=\"sheet\">\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}\n      <header>\n        <h2>\n          <Trans>\n            Import/Export <small class=\"ib insignificant\">Shortcuts</small>\n          </Trans>\n        </h2>\n      </header>\n      <main tabindex=\"-1\">\n        <section>\n          <h3>\n            <Icon icon=\"arrow-down-circle\" size=\"l\" class=\"insignificant\" />{' '}\n            <span>\n              <Trans>Import</Trans>\n            </span>\n          </h3>\n          <p class=\"field-button\">\n            <input\n              ref={shortcutsImportFieldRef}\n              type=\"text\"\n              name=\"import\"\n              placeholder={t`Paste shortcuts here`}\n              class=\"block\"\n              onInput={(e) => {\n                setImportShortcutStr(e.target.value);\n              }}\n              dir=\"auto\"\n            />\n            {states.settings.shortcutSettingsCloudImportExport && (\n              <button\n                type=\"button\"\n                class=\"plain2 small\"\n                disabled={importUIState === 'cloud-downloading'}\n                onClick={async () => {\n                  setImportUIState('cloud-downloading');\n                  const currentAccount = getCurrentAccountID();\n                  showToast(\n                    t`Downloading saved shortcuts from instance serverโ€ฆ`,\n                  );\n                  try {\n                    const relationships =\n                      await masto.v1.accounts.relationships.fetch({\n                        id: [currentAccount],\n                      });\n                    const relationship = relationships[0];\n                    if (relationship) {\n                      const { note = '' } = relationship;\n                      if (\n                        /<phanpy-shortcuts-settings>(.*)<\\/phanpy-shortcuts-settings>/.test(\n                          note,\n                        )\n                      ) {\n                        const settings = note.match(\n                          /<phanpy-shortcuts-settings>(.*)<\\/phanpy-shortcuts-settings>/,\n                        )[1];\n                        const { v, dt, data } = JSON.parse(settings);\n                        shortcutsImportFieldRef.current.value = data;\n                        shortcutsImportFieldRef.current.dispatchEvent(\n                          new Event('input'),\n                        );\n                      }\n                    }\n                    setImportUIState('default');\n                  } catch (e) {\n                    console.error(e);\n                    setImportUIState('error');\n                    showToast(t`Unable to download shortcuts`);\n                  }\n                }}\n                title={t`Download shortcuts from instance server`}\n              >\n                <Icon icon=\"cloud\" />\n                <Icon icon=\"arrow-down\" />\n              </button>\n            )}\n          </p>\n          {!!parsedImportShortcutStr &&\n            Array.isArray(parsedImportShortcutStr) && (\n              <>\n                <p>\n                  <b>{parsedImportShortcutStr.length}</b> shortcut\n                  {parsedImportShortcutStr.length > 1 ? 's' : ''}{' '}\n                  <small class=\"insignificant\">\n                    ({importShortcutStr.length} characters)\n                  </small>\n                </p>\n                <ol class=\"import-settings-list\">\n                  {parsedImportShortcutStr.map((shortcut) => (\n                    <li>\n                      <span\n                        style={{\n                          opacity: shortcuts.some((s) =>\n                            // Compare all properties\n                            Object.keys(s).every(\n                              (key) => s[key] === shortcut[key],\n                            ),\n                          )\n                            ? 1\n                            : 0,\n                        }}\n                      >\n                        *\n                      </span>\n                      <span>\n                        {_(TYPE_TEXT[shortcut.type])}\n                        {shortcut.type === 'list' && ' โš ๏ธ'}{' '}\n                        {TYPE_PARAMS[shortcut.type]?.map?.(\n                          ({ text, name, type }) =>\n                            shortcut[name] ? (\n                              <>\n                                <span class=\"tag collapsed insignificant\">\n                                  {text}:{' '}\n                                  {type === 'checkbox'\n                                    ? shortcut[name] === 'on'\n                                      ? 'โœ…'\n                                      : 'โŒ'\n                                    : shortcut[name]}\n                                </span>{' '}\n                              </>\n                            ) : null,\n                        )}\n                      </span>\n                    </li>\n                  ))}\n                </ol>\n                <p>\n                  <small>\n                    <Trans>* Exists in current shortcuts</Trans>\n                  </small>\n                  <br />\n                  <small>\n                    โš ๏ธ{' '}\n                    <Trans>\n                      List may not work if it's from a different account.\n                    </Trans>\n                  </small>\n                </p>\n              </>\n            )}\n          {importUIState === 'error' && (\n            <p class=\"error\">\n              <small>\n                โš ๏ธ <Trans>Invalid settings format</Trans>\n              </small>\n            </p>\n          )}\n          <p>\n            {hasCurrentSettings && (\n              <>\n                <MenuConfirm\n                  confirmLabel={t`Append to current shortcuts?`}\n                  menuFooter={\n                    <div class=\"footer\">\n                      <Trans>\n                        Only shortcuts that donโ€™t exist in current shortcuts\n                        will be appended.\n                      </Trans>\n                    </div>\n                  }\n                  onClick={() => {\n                    // states.shortcuts = [\n                    //   ...states.shortcuts,\n                    //   ...parsedImportShortcutStr,\n                    // ];\n                    // Append non-unique shortcuts only\n                    const nonUniqueShortcuts = parsedImportShortcutStr.filter(\n                      (shortcut) =>\n                        !states.shortcuts.some((s) =>\n                          // Compare all properties\n                          Object.keys(s).every(\n                            (key) => s[key] === shortcut[key],\n                          ),\n                        ),\n                    );\n                    if (!nonUniqueShortcuts.length) {\n                      showToast(t`No new shortcuts to import`);\n                      return;\n                    }\n                    let newShortcuts = [\n                      ...states.shortcuts,\n                      ...nonUniqueShortcuts,\n                    ];\n                    const exceededLimit = newShortcuts.length > SHORTCUTS_LIMIT;\n                    if (exceededLimit) {\n                      // If exceeded, trim it\n                      newShortcuts = newShortcuts.slice(0, SHORTCUTS_LIMIT);\n                    }\n                    states.shortcuts = newShortcuts;\n                    showToast(\n                      exceededLimit\n                        ? t`Shortcuts imported. Exceeded max ${SHORTCUTS_LIMIT}, so the rest are not imported.`\n                        : t`Shortcuts imported`,\n                    );\n                    onClose?.();\n                  }}\n                >\n                  <button\n                    type=\"button\"\n                    class=\"plain2\"\n                    disabled={!parsedImportShortcutStr}\n                  >\n                    <Trans>Import & appendโ€ฆ</Trans>\n                  </button>\n                </MenuConfirm>{' '}\n              </>\n            )}\n            <MenuConfirm\n              confirmLabel={\n                hasCurrentSettings\n                  ? t`Override current shortcuts?`\n                  : t`Import shortcuts?`\n              }\n              menuItemClassName={hasCurrentSettings ? 'danger' : undefined}\n              onClick={() => {\n                states.shortcuts = parsedImportShortcutStr;\n                showToast(t`Shortcuts imported`);\n                onClose?.();\n              }}\n            >\n              <button\n                type=\"button\"\n                class=\"plain2\"\n                disabled={!parsedImportShortcutStr}\n              >\n                {hasCurrentSettings ? t`or overrideโ€ฆ` : t`Importโ€ฆ`}\n              </button>\n            </MenuConfirm>\n          </p>\n        </section>\n        <section>\n          <h3>\n            <Icon icon=\"arrow-up-circle\" size=\"l\" class=\"insignificant\" />{' '}\n            <span>\n              <Trans>Export</Trans>\n            </span>\n          </h3>\n          <p>\n            <input\n              style={{ width: '100%' }}\n              type=\"text\"\n              value={shortcutsStr}\n              readOnly\n              onClick={(e) => {\n                if (!e.target.value) return;\n                e.target.select();\n                // Copy url to clipboard\n                try {\n                  navigator.clipboard.writeText(e.target.value);\n                  showToast(t`Shortcuts copied`);\n                } catch (e) {\n                  console.error(e);\n                  showToast(t`Unable to copy shortcuts`);\n                }\n              }}\n              dir=\"auto\"\n            />\n          </p>\n          <p>\n            <button\n              type=\"button\"\n              class=\"plain2\"\n              disabled={!shortcutsStr}\n              onClick={() => {\n                try {\n                  navigator.clipboard.writeText(shortcutsStr);\n                  showToast(t`Shortcut settings copied`);\n                } catch (e) {\n                  console.error(e);\n                  showToast(t`Unable to copy shortcut settings`);\n                }\n              }}\n            >\n              <Icon icon=\"clipboard\" />{' '}\n              <span>\n                <Trans>Copy</Trans>\n              </span>\n            </button>{' '}\n            {navigator?.share &&\n              navigator?.canShare?.({\n                text: shortcutsStr,\n              }) && (\n                <button\n                  type=\"button\"\n                  class=\"plain2\"\n                  disabled={!shortcutsStr}\n                  onClick={() => {\n                    try {\n                      navigator.share({\n                        text: shortcutsStr,\n                      });\n                    } catch (e) {\n                      console.error(e);\n                      alert(t`Sharing doesn't seem to work.`);\n                    }\n                  }}\n                >\n                  <Icon icon=\"share\" />{' '}\n                  <span>\n                    <Trans>Share</Trans>\n                  </span>\n                </button>\n              )}{' '}\n            {states.settings.shortcutSettingsCloudImportExport && (\n              <button\n                type=\"button\"\n                class=\"plain2\"\n                disabled={importUIState === 'cloud-uploading'}\n                onClick={async () => {\n                  setImportUIState('cloud-uploading');\n                  const currentAccount = getCurrentAccountID();\n                  try {\n                    const relationships =\n                      await masto.v1.accounts.relationships.fetch({\n                        id: [currentAccount],\n                      });\n                    const relationship = relationships[0];\n                    if (relationship) {\n                      const { note = '' } = relationship;\n                      // const newNote = `${note}\\n\\n\\n$<phanpy-shortcuts-settings>{shortcutsStr}</phanpy-shortcuts-settings>`;\n                      let newNote = '';\n                      const settingsJSON = JSON.stringify({\n                        v: '1', // version\n                        dt: Date.now(), // datetime stamp\n                        data: shortcutsStr, // shortcuts settings string\n                      });\n                      if (\n                        /<phanpy-shortcuts-settings>(.*)<\\/phanpy-shortcuts-settings>/.test(\n                          note,\n                        )\n                      ) {\n                        newNote = note.replace(\n                          /<phanpy-shortcuts-settings>(.*)<\\/phanpy-shortcuts-settings>/,\n                          `<phanpy-shortcuts-settings>${settingsJSON}</phanpy-shortcuts-settings>`,\n                        );\n                      } else {\n                        newNote = `${note}\\n\\n\\n<phanpy-shortcuts-settings>${settingsJSON}</phanpy-shortcuts-settings>`;\n                      }\n                      showToast(t`Saving shortcuts to instance serverโ€ฆ`);\n                      await masto.v1.accounts\n                        .$select(currentAccount)\n                        .note.create({\n                          comment: newNote,\n                        });\n                      setImportUIState('default');\n                      showToast(t`Shortcuts saved`);\n                    }\n                  } catch (e) {\n                    console.error(e);\n                    setImportUIState('error');\n                    showToast(t`Unable to save shortcuts`);\n                  }\n                }}\n                title={t`Sync to instance server`}\n              >\n                <Icon icon=\"cloud\" />\n                <Icon icon=\"arrow-up\" />\n              </button>\n            )}{' '}\n            {shortcutsStr.length > 0 && (\n              <small class=\"insignificant ib\">\n                <Plural\n                  value={shortcutsStr.length}\n                  one=\"# character\"\n                  other=\"# characters\"\n                />\n              </small>\n            )}\n          </p>\n          {!!shortcutsStr && (\n            <details>\n              <summary class=\"insignificant\">\n                <small>\n                  <Trans>Raw Shortcuts JSON</Trans>\n                </small>\n              </summary>\n              <textarea style={{ width: '100%' }} rows={10} readOnly>\n                {JSON.stringify(shortcuts.filter(Boolean), null, 2)}\n              </textarea>\n            </details>\n          )}\n        </section>\n        {states.settings.shortcutSettingsCloudImportExport && (\n          <footer>\n            <p>\n              <Icon icon=\"cloud\" />{' '}\n              <Trans>\n                Import/export settings from/to instance server (Very\n                experimental)\n              </Trans>\n            </p>\n          </footer>\n        )}\n      </main>\n    </div>\n  );\n}\n\nexport default ShortcutsSettings;\n","import { useLingui } from '@lingui/react/macro';\nimport { useEffect } from 'preact/hooks';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { subscribe, useSnapshot } from 'valtio';\n\nimport Accounts from '../pages/accounts';\nimport Settings from '../pages/settings';\nimport focusDeck from '../utils/focus-deck';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\n\nimport AccountSheet from './account-sheet';\nimport ComposeSuspense, { preload } from './compose-suspense';\nimport Drafts from './drafts';\nimport EmbedModal from './embed-modal';\nimport GenericAccounts from './generic-accounts';\nimport MediaAltModal from './media-alt-modal';\nimport MediaModal from './media-modal';\nimport Modal from './modal';\nimport ReportModal from './report-modal';\nimport ShortcutsSettings from './shortcuts-settings';\n\nsubscribe(states, (changes) => {\n  for (const [action, path, value, prevValue] of changes) {\n    // When closing modal, focus on deck\n    if (/^show/i.test(path) && !value) {\n      focusDeck();\n    }\n  }\n});\n\nexport default function Modals() {\n  const { t } = useLingui();\n  const snapStates = useSnapshot(states);\n  const navigate = useNavigate();\n  const location = useLocation();\n\n  useEffect(() => {\n    setTimeout(preload, 1000);\n  }, []);\n\n  return (\n    <>\n      {!!snapStates.showCompose && (\n        <Modal\n          class={`solid ${snapStates.composerState.minimized ? 'min' : ''}`}\n          minimized={!!snapStates.composerState.minimized}\n        >\n          <ComposeSuspense\n            replyToStatus={\n              typeof snapStates.showCompose !== 'boolean'\n                ? snapStates.showCompose.replyToStatus\n                : window.__COMPOSE__?.replyToStatus || null\n            }\n            editStatus={\n              states.showCompose?.editStatus ||\n              window.__COMPOSE__?.editStatus ||\n              null\n            }\n            draftStatus={\n              states.showCompose?.draftStatus ||\n              window.__COMPOSE__?.draftStatus ||\n              null\n            }\n            onClose={(results) => {\n              const { newStatus, instance, type } = results || {};\n              states.showCompose = false;\n              window.__COMPOSE__ = null;\n              if (newStatus) {\n                states.reloadStatusPage++;\n                showToast({\n                  text: {\n                    post: t`Post published. Check it out.`,\n                    reply: t`Reply posted. Check it out.`,\n                    edit: t`Post updated. Check it out.`,\n                  }[type || 'post'],\n                  delay: 1000,\n                  duration: 10_000, // 10 seconds\n                  onClick: (toast) => {\n                    toast.hideToast();\n                    states.prevLocation = location;\n                    navigate(\n                      instance\n                        ? `/${instance}/s/${newStatus.id}`\n                        : `/s/${newStatus.id}`,\n                    );\n                  },\n                });\n              }\n            }}\n          />\n        </Modal>\n      )}\n      {!!snapStates.showSettings && (\n        <Modal\n          onClose={() => {\n            states.showSettings = false;\n          }}\n        >\n          <Settings\n            onClose={() => {\n              states.showSettings = false;\n            }}\n          />\n        </Modal>\n      )}\n      {!!snapStates.showAccounts && (\n        <Modal\n          onClose={() => {\n            states.showAccounts = false;\n          }}\n        >\n          <Accounts\n            onClose={() => {\n              states.showAccounts = false;\n            }}\n          />\n        </Modal>\n      )}\n      {!!snapStates.showAccount && (\n        <Modal\n          onClose={() => {\n            states.showAccount = false;\n          }}\n        >\n          <AccountSheet\n            account={snapStates.showAccount?.account || snapStates.showAccount}\n            instance={snapStates.showAccount?.instance}\n            onClose={({ destination } = {}) => {\n              states.showAccount = false;\n              // states.showGenericAccounts = false;\n              // if (destination) {\n              //   states.showAccounts = false;\n              // }\n            }}\n          />\n        </Modal>\n      )}\n      {!!snapStates.showDrafts && (\n        <Modal\n          onClose={() => {\n            states.showDrafts = false;\n          }}\n        >\n          <Drafts onClose={() => (states.showDrafts = false)} />\n        </Modal>\n      )}\n      {!!snapStates.showMediaModal && (\n        <Modal\n          onClick={(e) => {\n            if (\n              e.target === e.currentTarget ||\n              e.target.classList.contains('media')\n            ) {\n              states.showMediaModal = false;\n            }\n          }}\n        >\n          <MediaModal\n            mediaAttachments={snapStates.showMediaModal.mediaAttachments}\n            instance={snapStates.showMediaModal.instance}\n            index={snapStates.showMediaModal.index}\n            statusID={snapStates.showMediaModal.statusID}\n            onClose={() => {\n              states.showMediaModal = false;\n            }}\n          />\n        </Modal>\n      )}\n      {!!snapStates.showShortcutsSettings && (\n        <Modal\n          onClose={() => {\n            states.showShortcutsSettings = false;\n          }}\n        >\n          <ShortcutsSettings\n            onClose={() => (states.showShortcutsSettings = false)}\n          />\n        </Modal>\n      )}\n      {!!snapStates.showGenericAccounts && (\n        <Modal\n          onClose={() => {\n            states.showGenericAccounts = false;\n          }}\n        >\n          <GenericAccounts\n            instance={snapStates.showGenericAccounts.instance}\n            excludeRelationshipAttrs={\n              snapStates.showGenericAccounts.excludeRelationshipAttrs\n            }\n            postID={snapStates.showGenericAccounts.postID}\n            onClose={() => (states.showGenericAccounts = false)}\n            blankCopy={snapStates.showGenericAccounts.blankCopy}\n          />\n        </Modal>\n      )}\n      {!!snapStates.showMediaAlt && (\n        <Modal\n          onClose={(e) => {\n            states.showMediaAlt = false;\n          }}\n        >\n          <MediaAltModal\n            alt={snapStates.showMediaAlt.alt || snapStates.showMediaAlt}\n            lang={snapStates.showMediaAlt?.lang}\n            onClose={() => {\n              states.showMediaAlt = false;\n            }}\n          />\n        </Modal>\n      )}\n      {!!snapStates.showEmbedModal && (\n        <Modal\n          class=\"solid\"\n          onClose={() => {\n            states.showEmbedModal = false;\n          }}\n        >\n          <EmbedModal\n            html={snapStates.showEmbedModal.html}\n            url={snapStates.showEmbedModal.url}\n            width={snapStates.showEmbedModal.width}\n            height={snapStates.showEmbedModal.height}\n            onClose={() => {\n              states.showEmbedModal = false;\n            }}\n          />\n        </Modal>\n      )}\n      {!!snapStates.showReportModal && (\n        <Modal\n          onClose={() => {\n            states.showReportModal = false;\n          }}\n        >\n          <ReportModal\n            account={snapStates.showReportModal.account}\n            post={snapStates.showReportModal.post}\n            onClose={() => {\n              states.showReportModal = false;\n            }}\n          />\n        </Modal>\n      )}\n    </>\n  );\n}\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\n\nimport Icon from './icon';\nimport Loader from './loader';\n\nfunction FollowRequestButtons({ accountID, onChange }) {\n  const { t } = useLingui();\n  const { masto } = api();\n  const [uiState, setUIState] = useState('default');\n  const [requestState, setRequestState] = useState(null); // accept, reject\n  const [relationship, setRelationship] = useState(null);\n\n  const hasRelationship = relationship !== null;\n\n  return (\n    <p class=\"follow-request-buttons\">\n      <button\n        type=\"button\"\n        disabled={uiState === 'loading' || hasRelationship}\n        onClick={() => {\n          setUIState('loading');\n          setRequestState('accept');\n          (async () => {\n            try {\n              const rel = await masto.v1.followRequests\n                .$select(accountID)\n                .authorize();\n              if (!rel?.followedBy) {\n                throw new Error('Follow request not accepted');\n              }\n              setRelationship(rel);\n              onChange();\n            } catch (e) {\n              console.error(e);\n            }\n            setUIState('default');\n          })();\n        }}\n      >\n        <Trans>Accept</Trans>\n      </button>{' '}\n      <button\n        type=\"button\"\n        disabled={uiState === 'loading' || hasRelationship}\n        class=\"light danger\"\n        onClick={() => {\n          setUIState('loading');\n          setRequestState('reject');\n          (async () => {\n            try {\n              const rel = await masto.v1.followRequests\n                .$select(accountID)\n                .reject();\n              if (rel?.followedBy) {\n                throw new Error('Follow request not rejected');\n              }\n              setRelationship(rel);\n              onChange();\n            } catch (e) {\n              console.error(e);\n              setUIState('default');\n            }\n          })();\n        }}\n      >\n        <Trans>Reject</Trans>\n      </button>\n      <span class=\"follow-request-states\">\n        {hasRelationship && requestState ? (\n          requestState === 'accept' ? (\n            <Icon\n              icon=\"check-circle\"\n              alt={t`Accepted`}\n              class=\"follow-accepted\"\n            />\n          ) : (\n            <Icon icon=\"x-circle\" alt={t`Rejected`} class=\"follow-rejected\" />\n          )\n        ) : (\n          <Loader hidden={uiState !== 'loading'} />\n        )}\n      </span>\n    </p>\n  );\n}\n\nexport default FollowRequestButtons;\n","import { msg, t } from '@lingui/core/macro';\nimport { Plural, Select, Trans, useLingui } from '@lingui/react/macro';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\n\nimport { api } from '../utils/api';\nimport { isFiltered } from '../utils/filters';\nimport shortenNumber from '../utils/shorten-number';\nimport states, { statusKey } from '../utils/states';\nimport { getCurrentAccountID } from '../utils/store-utils';\nimport useTruncated from '../utils/useTruncated';\n\nimport Avatar from './avatar';\nimport CustomEmoji from './custom-emoji';\nimport FollowRequestButtons from './follow-request-buttons';\nimport Icon from './icon';\nimport Link from './link';\nimport NameText from './name-text';\nimport Status from './status';\n\nconst NOTIFICATION_ICONS = {\n  mention: 'comment',\n  status: 'notification',\n  reblog: 'rocket',\n  follow: 'follow',\n  follow_request: 'follow-add',\n  favourite: 'heart',\n  poll: 'poll',\n  update: 'pencil',\n  'admin.signup': 'account-edit',\n  'admin.report': 'account-warning',\n  severed_relationships: 'heart-break',\n  moderation_warning: 'alert',\n  emoji_reaction: 'emoji2',\n  'pleroma:emoji_reaction': 'emoji2',\n  annual_report: 'celebrate',\n};\n\n/*\nNotification types\n==================\nmention = Someone mentioned you in their status\nstatus = Someone you enabled notifications for has posted a status\nreblog = Someone boosted one of your statuses\nfollow = Someone followed you\nfollow_request = Someone requested to follow you\nfavourite = Someone favourited one of your statuses\npoll = A poll you have voted in or created has ended\nupdate = A status you interacted with has been edited\nadmin.sign_up = Someone signed up (optionally sent to admins)\nadmin.report = A new report has been filed\nsevered_relationships = Severed relationships\nmoderation_warning = Moderation warning\n*/\n\nfunction emojiText({ account, emoji, emoji_url }) {\n  let url;\n  let staticUrl;\n  if (typeof emoji_url === 'string') {\n    url = emoji_url;\n  } else {\n    url = emoji_url?.url;\n    staticUrl = emoji_url?.staticUrl;\n  }\n  const emojiObject = url ? (\n    <CustomEmoji url={url} staticUrl={staticUrl} alt={emoji} />\n  ) : (\n    emoji\n  );\n  return (\n    <Trans>\n      {account} reacted to your post with {emojiObject}\n    </Trans>\n  );\n}\n\nconst contentText = {\n  status: ({ account }) => <Trans>{account} published a post.</Trans>,\n  reblog: ({\n    count,\n    account,\n    postsCount,\n    postType,\n    components: { Subject },\n  }) => (\n    <Plural\n      value={count}\n      _1={\n        <Plural\n          value={postsCount}\n          _1={\n            <Select\n              value={postType}\n              _reply={<Trans>{account} boosted your reply.</Trans>}\n              other={<Trans>{account} boosted your post.</Trans>}\n            />\n          }\n          other={\n            <Trans>\n              {account} boosted {postsCount} of your posts.\n            </Trans>\n          }\n        />\n      }\n      other={\n        <Select\n          value={postType}\n          _reply={\n            <Trans>\n              <Subject clickable={count > 1}>\n                <span title={count}>{shortenNumber(count)}</span> people\n              </Subject>{' '}\n              boosted your reply.\n            </Trans>\n          }\n          other={\n            <Trans>\n              <Subject clickable={count > 1}>\n                <span title={count}>{shortenNumber(count)}</span> people\n              </Subject>{' '}\n              boosted your post.\n            </Trans>\n          }\n        />\n      }\n    />\n  ),\n  follow: ({ account, count, components: { Subject } }) => (\n    <Plural\n      value={count}\n      _1={<Trans>{account} followed you.</Trans>}\n      other={\n        <Trans>\n          <Subject clickable={count > 1}>\n            <span title={count}>{shortenNumber(count)}</span> people\n          </Subject>{' '}\n          followed you.\n        </Trans>\n      }\n    />\n  ),\n  follow_request: ({ account }) => (\n    <Trans>{account} requested to follow you.</Trans>\n  ),\n  favourite: ({\n    account,\n    count,\n    postsCount,\n    postType,\n    components: { Subject },\n  }) => (\n    <Plural\n      value={count}\n      _1={\n        <Plural\n          value={postsCount}\n          _1={\n            <Select\n              value={postType}\n              _reply={<Trans>{account} liked your reply.</Trans>}\n              other={<Trans>{account} liked your post.</Trans>}\n            />\n          }\n          other={\n            <Trans>\n              {account} liked {postsCount} of your posts.\n            </Trans>\n          }\n        />\n      }\n      other={\n        <Select\n          value={postType}\n          _reply={\n            <Trans>\n              <Subject clickable={count > 1}>\n                <span title={count}>{shortenNumber(count)}</span> people\n              </Subject>{' '}\n              liked your reply.\n            </Trans>\n          }\n          other={\n            <Trans>\n              <Subject clickable={count > 1}>\n                <span title={count}>{shortenNumber(count)}</span> people\n              </Subject>{' '}\n              liked your post.\n            </Trans>\n          }\n        />\n      }\n    />\n  ),\n  poll: () => t`A poll you have voted in or created has ended.`,\n  'poll-self': () => t`A poll you have created has ended.`,\n  'poll-voted': () => t`A poll you have voted in has ended.`,\n  update: () => t`A post you interacted with has been edited.`,\n  'favourite+reblog': ({\n    count,\n    account,\n    postsCount,\n    postType,\n    components: { Subject },\n  }) => (\n    <Plural\n      value={count}\n      _1={\n        <Plural\n          value={postsCount}\n          _1={\n            <Select\n              value={postType}\n              _reply={<Trans>{account} boosted & liked your reply.</Trans>}\n              other={<Trans>{account} boosted & liked your post.</Trans>}\n            />\n          }\n          other={\n            <Trans>\n              {account} boosted & liked {postsCount} of your posts.\n            </Trans>\n          }\n        />\n      }\n      other={\n        <Select\n          value={postType}\n          _reply={\n            <Trans>\n              <Subject clickable={count > 1}>\n                <span title={count}>{shortenNumber(count)}</span> people\n              </Subject>{' '}\n              boosted & liked your reply.\n            </Trans>\n          }\n          other={\n            <Trans>\n              <Subject clickable={count > 1}>\n                <span title={count}>{shortenNumber(count)}</span> people\n              </Subject>{' '}\n              boosted & liked your post.\n            </Trans>\n          }\n        />\n      }\n    />\n  ),\n  'admin.sign_up': ({ account }) => <Trans>{account} signed up.</Trans>,\n  'admin.report': ({ account, targetAccount }) => (\n    <Trans>\n      {account} reported {targetAccount}\n    </Trans>\n  ),\n  severed_relationships: ({ name }) => (\n    <Trans>\n      Lost connections with <i>{name}</i>.\n    </Trans>\n  ),\n  moderation_warning: () => (\n    <b>\n      <Trans>Moderation warning</Trans>\n    </b>\n  ),\n  emoji_reaction: emojiText,\n  'pleroma:emoji_reaction': emojiText,\n  annual_report: ({ year }) => <Trans>Your {year} #Wrapstodon is here!</Trans>,\n};\n\n// account_suspension, domain_block, user_domain_block\nconst SEVERED_RELATIONSHIPS_TEXT = {\n  account_suspension: ({ from, targetName }) => (\n    <Trans>\n      An admin from <i>{from}</i> has suspended <i>{targetName}</i>, which means\n      you can no longer receive updates from them or interact with them.\n    </Trans>\n  ),\n  domain_block: ({ from, targetName, followersCount, followingCount }) => (\n    <Trans>\n      An admin from <i>{from}</i> has blocked <i>{targetName}</i>. Affected\n      followers: {followersCount}, followings: {followingCount}.\n    </Trans>\n  ),\n  user_domain_block: ({ targetName, followersCount, followingCount }) => (\n    <Trans>\n      You have blocked <i>{targetName}</i>. Removed followers: {followersCount},\n      followings: {followingCount}.\n    </Trans>\n  ),\n};\n\nconst MODERATION_WARNING_TEXT = {\n  none: msg`Your account has received a moderation warning.`,\n  disable: msg`Your account has been disabled.`,\n  mark_statuses_as_sensitive: msg`Some of your posts have been marked as sensitive.`,\n  delete_statuses: msg`Some of your posts have been deleted.`,\n  sensitive: msg`Your posts will be marked as sensitive from now on.`,\n  silence: msg`Your account has been limited.`,\n  suspend: msg`Your account has been suspended.`,\n};\n\nconst AVATARS_LIMIT = 30;\n\nfunction Notification({\n  notification,\n  instance,\n  isStatic,\n  disableContextMenu,\n}) {\n  const { _ } = useLingui();\n  const { masto } = api();\n  const {\n    id,\n    status,\n    account,\n    report,\n    event,\n    moderation_warning,\n    annualReport,\n    // Client-side grouped notification\n    _ids,\n    _accounts,\n    _statuses,\n    _groupKeys,\n    // Server-side grouped notification\n    sampleAccounts,\n    notificationsCount,\n    groupKey,\n  } = notification;\n  let { type } = notification;\n\n  if (type === 'mention' && !status) {\n    // Could be deleted\n    return null;\n  }\n\n  // status = Attached when type of the notification is favourite, reblog, status, mention, poll, or update\n  const actualStatus = status?.reblog || status;\n  const actualStatusID = actualStatus?.id;\n\n  const currentAccount = getCurrentAccountID();\n  const isSelf = currentAccount === account?.id;\n  const isVoted = status?.poll?.voted;\n  const isReplyToOthers =\n    !!status?.inReplyToAccountId &&\n    status?.inReplyToAccountId !== currentAccount &&\n    status?.account?.id === currentAccount;\n\n  let favsCount = 0;\n  let reblogsCount = 0;\n  if (type === 'favourite+reblog') {\n    if (_accounts) {\n      for (const account of _accounts) {\n        if (account._types?.includes('favourite')) {\n          favsCount++;\n        }\n        if (account._types?.includes('reblog')) {\n          reblogsCount++;\n        }\n      }\n    }\n    if (!reblogsCount && favsCount) type = 'favourite';\n    if (!favsCount && reblogsCount) type = 'reblog';\n  }\n\n  let text;\n  if (type === 'poll') {\n    text = contentText[isSelf ? 'poll-self' : isVoted ? 'poll-voted' : 'poll'];\n  } else if (contentText[type]) {\n    text = contentText[type];\n  } else {\n    // Anticipate unhandled notification types, possibly from Mastodon forks or non-Mastodon instances\n    // This surfaces the error to the user, hoping that users will report it\n    text = t`[Unknown notification type: ${type}]`;\n  }\n\n  const Subject = ({ clickable, ...props }) =>\n    clickable ? (\n      <b tabIndex=\"0\" onClick={handleOpenGenericAccounts} {...props} />\n    ) : (\n      <b {...props} />\n    );\n\n  if (typeof text === 'function') {\n    const count =\n      _accounts?.length || sampleAccounts?.length || (account ? 1 : 0);\n    const postsCount = _statuses?.length || (status ? 1 : 0);\n    if (type === 'admin.report') {\n      const targetAccount = report?.targetAccount;\n      if (targetAccount) {\n        text = text({\n          account: <NameText account={account} showAvatar />,\n          targetAccount: <NameText account={targetAccount} showAvatar />,\n        });\n      }\n    } else if (type === 'severed_relationships') {\n      const targetName = event?.targetName;\n      if (targetName) {\n        text = text({ name: targetName });\n      }\n    } else if (\n      (type === 'emoji_reaction' || type === 'pleroma:emoji_reaction') &&\n      notification.emoji\n    ) {\n      const emojiURL =\n        notification.emoji_url || // This is string\n        status?.emojis?.find?.(\n          (emoji) =>\n            emoji?.shortcode ===\n            notification.emoji.replace(/^:/, '').replace(/:$/, ''),\n        ); // Emoji object instead of string\n      text = text({\n        account: <NameText account={account} showAvatar />,\n        emoji: notification.emoji,\n        emojiURL,\n      });\n    } else if (type === 'annual_report') {\n      text = text({\n        ...notification.annualReport,\n      });\n    } else {\n      text = text({\n        account: account ? (\n          <NameText account={account} showAvatar />\n        ) : (\n          sampleAccounts?.[0] && (\n            <NameText account={sampleAccounts[0]} showAvatar />\n          )\n        ),\n        count,\n        postsCount,\n        postType: isReplyToOthers ? 'reply' : 'post',\n        components: { Subject },\n      });\n    }\n  }\n\n  const formattedCreatedAt =\n    notification.createdAt && new Date(notification.createdAt).toLocaleString();\n\n  const genericAccountsHeading =\n    {\n      'favourite+reblog': t`Boosted/Liked byโ€ฆ`,\n      favourite: t`Liked byโ€ฆ`,\n      reblog: t`Boosted byโ€ฆ`,\n      follow: t`Followed byโ€ฆ`,\n    }[type] || t`Accounts`;\n  const handleOpenGenericAccounts = () => {\n    states.showGenericAccounts = {\n      heading: genericAccountsHeading,\n      accounts: _accounts,\n      showReactions: type === 'favourite+reblog',\n      excludeRelationshipAttrs: type === 'follow' ? ['followedBy'] : [],\n      postID: statusKey(actualStatusID, instance),\n    };\n  };\n\n  console.debug('RENDER Notification', notification.id);\n\n  const diffCount =\n    notificationsCount > 0 && notificationsCount > sampleAccounts?.length;\n  const expandAccounts = diffCount ? 'remote' : 'local';\n\n  // If there's a status and filter action is 'hide', then the notification is hidden\n  // TODO: Handle 'warn' action one day\n  if (!!status?.filtered) {\n    const isOwnPost = status?.account?.id === currentAccount;\n    const filterInfo = isFiltered(status.filtered, 'notifications');\n    if (!isSelf && !isOwnPost && filterInfo?.action === 'hide') {\n      return null;\n    }\n  }\n\n  return (\n    <div\n      class={`notification notification-${type}`}\n      data-notification-id={_ids || id}\n      data-group-key={_groupKeys?.join(' ') || groupKey}\n      tabIndex=\"0\"\n    >\n      <div\n        class={`notification-type notification-${type}`}\n        title={formattedCreatedAt}\n      >\n        {type === 'favourite+reblog' ? (\n          <>\n            <Icon icon=\"rocket\" size=\"xl\" alt={type} class=\"reblog-icon\" />\n            <Icon icon=\"heart\" size=\"xl\" alt={type} class=\"favourite-icon\" />\n          </>\n        ) : (\n          <Icon\n            icon={NOTIFICATION_ICONS[type] || 'notification'}\n            size=\"xl\"\n            alt={type}\n          />\n        )}\n      </div>\n      <div class=\"notification-content\">\n        {type !== 'mention' && (\n          <>\n            <p>{text}</p>\n            {type === 'follow_request' && (\n              <FollowRequestButtons accountID={account.id} />\n            )}\n            {type === 'severed_relationships' && (\n              <div>\n                {SEVERED_RELATIONSHIPS_TEXT[event.type]({\n                  from: instance,\n                  ...event,\n                })}\n                <br />\n                <a\n                  href={`https://${instance}/severed_relationships`}\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                >\n                  <Trans>\n                    Learn more <Icon icon=\"external\" size=\"s\" />\n                  </Trans>\n                </a>\n                .\n              </div>\n            )}\n            {type === 'moderation_warning' && !!moderation_warning && (\n              <div>\n                {_(MODERATION_WARNING_TEXT[moderation_warning.action]())}\n                <br />\n                <a\n                  href={`/disputes/strikes/${moderation_warning.id}`}\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                >\n                  <Trans>\n                    Learn more <Icon icon=\"external\" size=\"s\" />\n                  </Trans>\n                </a>\n              </div>\n            )}\n            {type === 'annual_report' && (\n              <div>\n                <Link to={`/annual_report/${annualReport?.year}`}>\n                  <Trans>View #Wrapstodon</Trans>\n                </Link>\n              </div>\n            )}\n          </>\n        )}\n        {_accounts?.length > 1 && (\n          <p class=\"avatars-stack\">\n            {_accounts.slice(0, AVATARS_LIMIT).map((account) => (\n              <Fragment key={account.id}>\n                <a\n                  key={account.id}\n                  href={account.url}\n                  rel=\"noopener noreferrer\"\n                  class=\"account-avatar-stack\"\n                  onClick={(e) => {\n                    e.preventDefault();\n                    states.showAccount = account;\n                  }}\n                >\n                  <Avatar\n                    url={account.avatarStatic}\n                    size={\n                      _accounts.length <= 10\n                        ? 'xxl'\n                        : _accounts.length < 20\n                          ? 'xl'\n                          : 'l'\n                    }\n                    key={account.id}\n                    alt={`${account.displayName} @${account.acct}`}\n                    squircle={account?.bot}\n                  />\n                  {type === 'favourite+reblog' && (\n                    <div class=\"account-sub-icons\">\n                      {account._types.map((type) => (\n                        <Icon\n                          icon={NOTIFICATION_ICONS[type]}\n                          size=\"s\"\n                          class={`${type}-icon`}\n                        />\n                      ))}\n                    </div>\n                  )}\n                </a>{' '}\n              </Fragment>\n            ))}\n            {type === 'favourite+reblog' && expandAccounts === 'remote' ? (\n              <button\n                type=\"button\"\n                class=\"small plain\"\n                data-group-keys={_groupKeys?.join(' ')}\n                onClick={() => {\n                  states.showGenericAccounts = {\n                    heading: genericAccountsHeading,\n                    fetchAccounts: async () => {\n                      const keyAccounts = await Promise.allSettled(\n                        _groupKeys.map(async (gKey) => {\n                          const iterator = masto.v2.notifications\n                            .$select(gKey)\n                            .accounts.list();\n                          return [gKey, (await iterator.next()).value];\n                        }),\n                      );\n                      const accounts = [];\n                      for (const keyAccount of keyAccounts) {\n                        const [key, _accounts] = keyAccount.value;\n                        const type = /^favourite/.test(key)\n                          ? 'favourite'\n                          : /^reblog/.test(key)\n                            ? 'reblog'\n                            : null;\n                        if (!type) continue;\n                        for (const account of _accounts) {\n                          const theAccount = accounts.find(\n                            (a) => a.id === account.id,\n                          );\n                          if (theAccount) {\n                            theAccount._types.push(type);\n                          } else {\n                            account._types = [type];\n                            accounts.push(account);\n                          }\n                        }\n                      }\n                      return {\n                        done: true,\n                        value: accounts,\n                      };\n                    },\n                    showReactions: true,\n                    postID: statusKey(actualStatusID, instance),\n                  };\n                }}\n              >\n                <Icon icon=\"chevron-down\" />\n              </button>\n            ) : (\n              <button\n                type=\"button\"\n                class=\"small plain\"\n                onClick={handleOpenGenericAccounts}\n              >\n                {_accounts.length > AVATARS_LIMIT &&\n                  `+${_accounts.length - AVATARS_LIMIT}`}\n                <Icon icon=\"chevron-down\" />\n              </button>\n            )}\n          </p>\n        )}\n        {!_accounts?.length && sampleAccounts?.length > 1 && (\n          <p class=\"avatars-stack\">\n            {sampleAccounts.map((account) => (\n              <Fragment key={account.id}>\n                <a\n                  key={account.id}\n                  href={account.url}\n                  rel=\"noopener noreferrer\"\n                  class=\"account-avatar-stack\"\n                  onClick={(e) => {\n                    e.preventDefault();\n                    states.showAccount = account;\n                  }}\n                >\n                  <Avatar\n                    url={account.avatarStatic}\n                    size=\"xxl\"\n                    key={account.id}\n                    alt={`${account.displayName} @${account.acct}`}\n                    squircle={account?.bot}\n                  />\n                  {/* {type === 'favourite+reblog' && (\n                    <div class=\"account-sub-icons\">\n                      {account._types.map((type) => (\n                        <Icon\n                          icon={NOTIFICATION_ICONS[type]}\n                          size=\"s\"\n                          class={`${type}-icon`}\n                        />\n                      ))}\n                    </div>\n                  )} */}\n                </a>{' '}\n              </Fragment>\n            ))}\n            {notificationsCount > sampleAccounts.length && (\n              <Link\n                to={\n                  instance ? `/${instance}/s/${status.id}` : `/s/${status.id}`\n                }\n                class=\"button small plain centered\"\n              >\n                +{notificationsCount - sampleAccounts.length}\n                <Icon icon=\"chevron-right\" />\n              </Link>\n            )}\n          </p>\n        )}\n        {_statuses?.length > 1 && (\n          <ul class=\"notification-group-statuses\">\n            {_statuses.map((status) => (\n              <li key={status.id}>\n                <TruncatedLink\n                  class={`status-link status-type-${type}`}\n                  to={\n                    instance ? `/${instance}/s/${status.id}` : `/s/${status.id}`\n                  }\n                >\n                  <Status\n                    status={status}\n                    size=\"s\"\n                    previewMode\n                    allowContextMenu\n                  />\n                </TruncatedLink>\n              </li>\n            ))}\n          </ul>\n        )}\n        {status && (!_statuses?.length || _statuses?.length <= 1) && (\n          <TruncatedLink\n            class={`status-link status-type-${type}`}\n            to={\n              instance\n                ? `/${instance}/s/${actualStatusID}`\n                : `/s/${actualStatusID}`\n            }\n            onContextMenu={\n              !disableContextMenu\n                ? (e) => {\n                    const post = e.target.querySelector('.status');\n                    if (post) {\n                      // Fire a custom event to open the context menu\n                      if (e.metaKey) return;\n                      e.preventDefault();\n                      post.dispatchEvent(\n                        new MouseEvent('contextmenu', {\n                          clientX: e.clientX,\n                          clientY: e.clientY,\n                        }),\n                      );\n                    }\n                  }\n                : undefined\n            }\n          >\n            {isStatic ? (\n              <Status\n                status={actualStatus}\n                size=\"s\"\n                readOnly\n                allowContextMenu\n              />\n            ) : (\n              <Status\n                statusID={actualStatusID}\n                size=\"s\"\n                readOnly\n                allowContextMenu\n              />\n            )}\n          </TruncatedLink>\n        )}\n      </div>\n    </div>\n  );\n}\n\nfunction TruncatedLink(props) {\n  const ref = useTruncated();\n  return <Link {...props} data-read-more={t`Read more โ†’`} ref={ref} />;\n}\n\nexport default memo(Notification, (oldProps, newProps) => {\n  return oldProps.notification?.id === newProps.notification?.id;\n});\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { memo } from 'preact/compat';\nimport { useLayoutEffect, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport { api } from '../utils/api';\nimport states from '../utils/states';\nimport {\n  getAccountByAccessToken,\n  getCurrentAccount,\n} from '../utils/store-utils';\nimport usePageVisibility from '../utils/usePageVisibility';\n\nimport Icon from './icon';\nimport Link from './link';\nimport Modal from './modal';\nimport Notification from './notification';\n\n{\n  if ('serviceWorker' in navigator) {\n    console.log('๐Ÿ‘‚๐Ÿ‘‚๐Ÿ‘‚ Listen to message');\n    navigator.serviceWorker.addEventListener('message', (event) => {\n      console.log('๐Ÿ’ฅ๐Ÿ’ฅ๐Ÿ’ฅ Message event', event);\n      const { type, id, accessToken } = event?.data || {};\n      if (type === 'notification') {\n        states.routeNotification = {\n          id,\n          accessToken,\n        };\n      }\n    });\n  }\n}\n\nexport default memo(function NotificationService() {\n  const { t } = useLingui();\n  if (!('serviceWorker' in navigator)) return null;\n\n  const snapStates = useSnapshot(states);\n  const { routeNotification } = snapStates;\n\n  console.log('๐Ÿ›Ž๏ธ Notification service', routeNotification);\n\n  const { id, accessToken } = routeNotification || {};\n  const [showNotificationSheet, setShowNotificationSheet] = useState(false);\n\n  useLayoutEffect(() => {\n    if (!id || !accessToken) return;\n    const { instance: currentInstance } = api();\n    const { masto, instance } = api({\n      accessToken,\n    });\n    console.log('API', { accessToken, currentInstance, instance });\n    const sameInstance = currentInstance === instance;\n    const account = accessToken\n      ? getAccountByAccessToken(accessToken)\n      : getCurrentAccount();\n    (async () => {\n      const notification = await masto.v1.notifications.$select(id).fetch();\n      if (notification && account) {\n        console.log('๐Ÿ›Ž๏ธ Notification', { id, notification, account });\n        const accountInstance = account.instanceURL;\n        const { type, status, account: notificationAccount } = notification;\n        const hasModal = !!document.querySelector('#modal-container > *');\n        const isFollow = type === 'follow' && !!notificationAccount?.id;\n        const hasAccount = !!notificationAccount?.id;\n        const hasStatus = !!status?.id;\n        if (isFollow && sameInstance) {\n          // Show account sheet, can handle different instances\n          states.showAccount = {\n            account: notificationAccount,\n            instance: accountInstance,\n          };\n        } else if (hasModal || !sameInstance || (hasAccount && hasStatus)) {\n          // Show sheet of notification, if\n          // - there is a modal open\n          // - the notification is from another instance\n          // - the notification has both account and status, gives choice for users to go to account or status\n          setShowNotificationSheet({\n            id,\n            account,\n            notification,\n            sameInstance,\n          });\n        } else {\n          if (hasStatus) {\n            // Go to status page\n            location.hash = `/${currentInstance}/s/${status.id}`;\n          } else if (isFollow) {\n            // Go to profile page\n            location.hash = `/${currentInstance}/a/${notificationAccount.id}`;\n          } else {\n            // Go to notifications page\n            location.hash = '/notifications';\n          }\n        }\n      } else {\n        console.warn('๐Ÿ›Ž๏ธ Notification not found', id);\n      }\n    })();\n  }, [id, accessToken]);\n\n  // useLayoutEffect(() => {\n  //   // Listen to message from service worker\n  //   const handleMessage = (event) => {\n  //     console.log('๐Ÿ’ฅ๐Ÿ’ฅ๐Ÿ’ฅ Message event', event);\n  //     const { type, id, accessToken } = event?.data || {};\n  //     if (type === 'notification') {\n  //       states.routeNotification = {\n  //         id,\n  //         accessToken,\n  //       };\n  //     }\n  //   };\n  //   console.log('๐Ÿ‘‚๐Ÿ‘‚๐Ÿ‘‚ Listen to message');\n  //   navigator.serviceWorker.addEventListener('message', handleMessage);\n  //   return () => {\n  //     console.log('๐Ÿ‘‚๐Ÿ‘‚๐Ÿ‘‚ Remove listen to message');\n  //     navigator.serviceWorker.removeEventListener('message', handleMessage);\n  //   };\n  // }, []);\n\n  useLayoutEffect(() => {\n    if (navigator?.clearAppBadge) {\n      navigator.clearAppBadge();\n    }\n  }, []);\n  usePageVisibility((visible) => {\n    if (visible && navigator?.clearAppBadge) {\n      console.log('๐Ÿ”ฐ Clear app badge');\n      navigator.clearAppBadge();\n    }\n  });\n\n  const onClose = () => {\n    setShowNotificationSheet(false);\n    states.routeNotification = null;\n\n    // If url is #/notifications?id=123, go to #/notifications\n    if (/\\/notifications\\?id=/i.test(location.hash)) {\n      location.hash = '/notifications';\n    }\n  };\n\n  if (showNotificationSheet) {\n    const { id, account, notification, sameInstance } = showNotificationSheet;\n    return (\n      <Modal\n        onClick={(e) => {\n          if (e.target === e.currentTarget) {\n            onClose();\n          }\n        }}\n      >\n        <div class=\"sheet\" tabIndex=\"-1\">\n          <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n            <Icon icon=\"x\" alt={t`Close`} />\n          </button>\n          <header>\n            <b>\n              <Trans>Notification</Trans>\n            </b>\n          </header>\n          <main>\n            {!sameInstance && (\n              <p>\n                <Trans>This notification is from your other account.</Trans>\n              </p>\n            )}\n            <div\n              class=\"notification-peek\"\n              // style={{\n              //   pointerEvents: sameInstance ? '' : 'none',\n              // }}\n              onClick={(e) => {\n                const { target } = e;\n                // If button or links\n                if (e.target.tagName === 'BUTTON' || e.target.tagName === 'A') {\n                  onClose();\n                }\n              }}\n            >\n              <Notification\n                instance={account.instanceURL}\n                notification={notification}\n                isStatic\n              />\n            </div>\n            <div\n              style={{\n                textAlign: 'end',\n              }}\n            >\n              <Link to=\"/notifications\" class=\"button light\" onClick={onClose}>\n                <span>\n                  <Trans>View all notifications</Trans>\n                </span>{' '}\n                <Icon icon=\"arrow-right\" />\n              </Link>\n            </div>\n          </main>\n        </div>\n      </Modal>\n    );\n  }\n\n  return null;\n});\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { forwardRef } from 'preact/compat';\nimport { useImperativeHandle, useRef, useState } from 'preact/hooks';\nimport { useSearchParams } from 'react-router-dom';\n\nimport { api } from '../utils/api';\n\nimport Icon from './icon';\nimport Link from './link';\n\nconst SearchForm = forwardRef((props, ref) => {\n  const { t } = useLingui();\n  const { instance } = api();\n  const [searchParams, setSearchParams] = useSearchParams();\n  const [searchMenuOpen, setSearchMenuOpen] = useState(false);\n  const [query, setQuery] = useState(searchParams.get('q') || '');\n  const type = searchParams.get('type');\n  const formRef = useRef(null);\n\n  const searchFieldRef = useRef(null);\n  useImperativeHandle(ref, () => ({\n    setValue: (value) => {\n      setQuery(value);\n    },\n    focus: () => {\n      searchFieldRef.current.focus();\n    },\n    select: () => {\n      searchFieldRef.current.select();\n    },\n    blur: () => {\n      searchFieldRef.current.blur();\n    },\n  }));\n\n  return (\n    <form\n      ref={formRef}\n      class=\"search-popover-container\"\n      onSubmit={(e) => {\n        e.preventDefault();\n\n        const isSearchPage = /\\/search/.test(location.hash);\n        if (isSearchPage) {\n          if (query) {\n            const params = {\n              q: query,\n            };\n            if (type) params.type = type; // Preserve type\n            setSearchParams(params);\n          } else {\n            setSearchParams({});\n          }\n        } else {\n          if (query) {\n            location.hash = `/search?q=${encodeURIComponent(query)}${\n              type ? `&type=${type}` : ''\n            }`;\n          } else {\n            location.hash = `/search`;\n          }\n        }\n\n        props?.onSubmit?.(e);\n      }}\n    >\n      <input\n        ref={searchFieldRef}\n        value={query}\n        name=\"q\"\n        type=\"search\"\n        // autofocus\n        placeholder={t`Search`}\n        dir=\"auto\"\n        autocomplete=\"off\"\n        autocorrect=\"off\"\n        autocapitalize=\"off\"\n        spellCheck=\"false\"\n        onSearch={(e) => {\n          if (!e.target.value) {\n            setSearchParams({});\n          }\n        }}\n        onInput={(e) => {\n          setQuery(e.target.value);\n          setSearchMenuOpen(true);\n        }}\n        onFocus={() => {\n          setSearchMenuOpen(true);\n          formRef.current\n            ?.querySelector('.search-popover-item')\n            ?.classList.add('focus');\n        }}\n        onBlur={() => {\n          setTimeout(() => {\n            setSearchMenuOpen(false);\n          }, 100);\n          formRef.current\n            ?.querySelector('.search-popover-item.focus')\n            ?.classList.remove('focus');\n        }}\n        onKeyDown={(e) => {\n          const { key } = e;\n          switch (key) {\n            case 'Escape':\n              setSearchMenuOpen(false);\n              break;\n            case 'Down':\n            case 'ArrowDown':\n              e.preventDefault();\n              if (searchMenuOpen) {\n                const focusItem = formRef.current.querySelector(\n                  '.search-popover-item.focus',\n                );\n                if (focusItem) {\n                  let nextItem = focusItem.nextElementSibling;\n                  while (nextItem && nextItem.hidden) {\n                    nextItem = nextItem.nextElementSibling;\n                  }\n                  if (nextItem) {\n                    nextItem.classList.add('focus');\n                    const siblings = Array.from(\n                      nextItem.parentElement.children,\n                    ).filter((el) => el !== nextItem);\n                    siblings.forEach((el) => {\n                      el.classList.remove('focus');\n                    });\n                  }\n                } else {\n                  const firstItem = formRef.current.querySelector(\n                    '.search-popover-item',\n                  );\n                  if (firstItem) {\n                    firstItem.classList.add('focus');\n                  }\n                }\n              }\n              break;\n            case 'Up':\n            case 'ArrowUp':\n              e.preventDefault();\n              if (searchMenuOpen) {\n                const focusItem = document.querySelector(\n                  '.search-popover-item.focus',\n                );\n                if (focusItem) {\n                  let prevItem = focusItem.previousElementSibling;\n                  while (prevItem && prevItem.hidden) {\n                    prevItem = prevItem.previousElementSibling;\n                  }\n                  if (prevItem) {\n                    prevItem.classList.add('focus');\n                    const siblings = Array.from(\n                      prevItem.parentElement.children,\n                    ).filter((el) => el !== prevItem);\n                    siblings.forEach((el) => {\n                      el.classList.remove('focus');\n                    });\n                  }\n                } else {\n                  const lastItem = document.querySelector(\n                    '.search-popover-item:last-child',\n                  );\n                  if (lastItem) {\n                    lastItem.classList.add('focus');\n                  }\n                }\n              }\n              break;\n            case 'Enter':\n              if (searchMenuOpen) {\n                const focusItem = document.querySelector(\n                  '.search-popover-item.focus',\n                );\n                if (focusItem) {\n                  e.preventDefault();\n                  focusItem.click();\n                }\n                setSearchMenuOpen(false);\n                props?.onSubmit?.(e);\n              }\n              break;\n          }\n        }}\n      />\n      <div class=\"search-popover\" hidden={!searchMenuOpen || !query}>\n        {/* {!!query && (\n          <Link\n            to={`/search?q=${encodeURIComponent(query)}`}\n            class=\"search-popover-item focus\"\n            onClick={(e) => {\n              props?.onSubmit?.(e);\n            }}\n          >\n            <Icon icon=\"search\" />\n            <span>{query}</span>\n          </Link>\n        )} */}\n        {!!query &&\n          [\n            {\n              label: (\n                <Trans>\n                  {query}{' '}\n                  <small class=\"insignificant\">\n                    โ€’ accounts, hashtags &amp; posts\n                  </small>\n                </Trans>\n              ),\n              to: `/search?q=${encodeURIComponent(query)}`,\n              top: !type && !/\\s/.test(query),\n              hidden: !!type,\n            },\n            {\n              label: (\n                <Trans>\n                  Posts with <q>{query}</q>\n                </Trans>\n              ),\n              to: `/search?q=${encodeURIComponent(query)}&type=statuses`,\n              hidden: /^https?:/.test(query),\n              top: /\\s/.test(query),\n              icon: 'document',\n              queryType: 'statuses',\n            },\n            {\n              label: (\n                <Trans>\n                  Posts tagged with <mark>#{query.replace(/^#/, '')}</mark>\n                </Trans>\n              ),\n              to: `/${instance}/t/${query.replace(/^#/, '')}`,\n              hidden:\n                /^@/.test(query) || /^https?:/.test(query) || /\\s/.test(query),\n              top: /^#/.test(query),\n              type: 'link',\n              icon: 'hashtag',\n              queryType: 'hashtags',\n            },\n            {\n              label: (\n                <Trans>\n                  Look up <mark>{query}</mark>\n                </Trans>\n              ),\n              to: `/${query}`,\n              hidden: !/^https?:/.test(query),\n              top: /^https?:/.test(query),\n              type: 'link',\n            },\n            {\n              label: (\n                <Trans>\n                  Accounts with <q>{query}</q>\n                </Trans>\n              ),\n              to: `/search?q=${encodeURIComponent(query)}&type=accounts`,\n              icon: 'group',\n              queryType: 'accounts',\n            },\n          ]\n            .sort((a, b) => {\n              if (type) {\n                if (a.queryType === type) return -1;\n                if (b.queryType === type) return 1;\n              }\n              if (a.top && !b.top) return -1;\n              if (!a.top && b.top) return 1;\n              return 0;\n            })\n            .filter(({ hidden }) => !hidden)\n            .map(({ label, to, icon, type }, i) => (\n              <Link\n                to={to}\n                class={`search-popover-item ${i === 0 ? 'focus' : ''}`}\n                // hidden={hidden}\n                onClick={(e) => {\n                  console.log('onClick', e);\n                  props?.onSubmit?.(e);\n                }}\n              >\n                <Icon\n                  icon={icon || (type === 'link' ? 'arrow-right' : 'search')}\n                  class=\"more-insignificant\"\n                />\n                <span>{label}</span>{' '}\n              </Link>\n            ))}\n      </div>\n    </form>\n  );\n});\n\nexport default SearchForm;\n","import './search-command.css';\n\nimport { memo } from 'preact/compat';\nimport { useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport SearchForm from './search-form';\n\nexport default memo(function SearchCommand({ onClose = () => {} }) {\n  const [showSearch, setShowSearch] = useState(false);\n  const searchFormRef = useRef(null);\n\n  useHotkeys(\n    ['Slash', '/'],\n    (e) => {\n      setShowSearch(true);\n      setTimeout(() => {\n        searchFormRef.current?.focus?.();\n        searchFormRef.current?.select?.();\n      }, 0);\n    },\n    {\n      preventDefault: true,\n      ignoreEventWhen: (e) => {\n        const isSearchPage = /\\/search/.test(location.hash);\n        const hasModal = !!document.querySelector('#modal-container > *');\n        return isSearchPage || hasModal;\n      },\n    },\n  );\n\n  const closeSearch = () => {\n    setShowSearch(false);\n    onClose();\n  };\n\n  useHotkeys(\n    'esc',\n    (e) => {\n      searchFormRef.current?.blur?.();\n      closeSearch();\n    },\n    {\n      enabled: showSearch,\n      enableOnFormTags: true,\n      preventDefault: true,\n    },\n  );\n\n  return (\n    <div\n      id=\"search-command-container\"\n      hidden={!showSearch}\n      onClick={(e) => {\n        console.log(e);\n        if (e.target === e.currentTarget) {\n          closeSearch();\n        }\n      }}\n    >\n      <SearchForm\n        ref={searchFormRef}\n        onSubmit={() => {\n          closeSearch();\n        }}\n      />\n    </div>\n  );\n});\n","import './shortcuts.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { MenuDivider } from '@szhsin/react-menu';\nimport { memo } from 'preact/compat';\nimport { useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useNavigate } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport { SHORTCUTS_META } from '../components/shortcuts-settings';\nimport { api } from '../utils/api';\nimport { getLists } from '../utils/lists';\nimport states from '../utils/states';\n\nimport AsyncText from './AsyncText';\nimport Icon from './icon';\nimport Link from './link';\nimport MenuLink from './menu-link';\nimport Menu2 from './menu2';\nimport SubMenu2 from './submenu2';\n\nfunction Shortcuts() {\n  const { t } = useLingui();\n  const { _ } = useLingui();\n  const { instance } = api();\n  const snapStates = useSnapshot(states);\n  const { shortcuts, settings } = snapStates;\n\n  if (!shortcuts.length) {\n    return null;\n  }\n  const isMultiColumnMode =\n    settings.shortcutsViewMode === 'multi-column' ||\n    (!settings.shortcutsViewMode && settings.shortcutsColumnsMode);\n  if (isMultiColumnMode) {\n    return null;\n  }\n\n  const menuRef = useRef();\n\n  const hasLists = useRef(false);\n  const formattedShortcuts = shortcuts\n    .map((pin, i) => {\n      const { type, ...data } = pin;\n      if (!SHORTCUTS_META[type]) return null;\n      let { id, path, title, subtitle, icon } = SHORTCUTS_META[type];\n\n      if (typeof id === 'function') {\n        id = id(data, i);\n      }\n      if (typeof path === 'function') {\n        path = path(\n          {\n            ...data,\n            instance: data.instance || instance,\n          },\n          i,\n        );\n      }\n      if (typeof title === 'function') {\n        title = title(data, i);\n      } else {\n        title = _(title);\n      }\n      if (typeof subtitle === 'function') {\n        subtitle = subtitle(data, i);\n      } else {\n        subtitle = _(subtitle);\n      }\n      if (typeof icon === 'function') {\n        icon = icon(data, i);\n      }\n\n      if (id === 'lists') {\n        hasLists.current = true;\n      }\n\n      return {\n        id,\n        path,\n        title,\n        subtitle,\n        icon,\n      };\n    })\n    .filter(Boolean);\n\n  const navigate = useNavigate();\n  useHotkeys(\n    ['1', '2', '3', '4', '5', '6', '7', '8', '9'],\n    (e, handler) => {\n      const index = parseInt(handler.keys[0], 10) - 1;\n      if (index < formattedShortcuts.length) {\n        const { path } = formattedShortcuts[index];\n        if (path) {\n          navigate(path);\n          menuRef.current?.closeMenu?.();\n        }\n      }\n    },\n    {\n      enabled: !isMultiColumnMode,\n    },\n  );\n\n  const [lists, setLists] = useState([]);\n\n  return (\n    <div id=\"shortcuts\">\n      {snapStates.settings.shortcutsViewMode === 'tab-menu-bar' ? (\n        <nav\n          class=\"tab-bar\"\n          onContextMenu={(e) => {\n            e.preventDefault();\n            states.showShortcutsSettings = true;\n          }}\n        >\n          <ul>\n            {formattedShortcuts.map(\n              ({ id, path, title, subtitle, icon }, i) => {\n                return (\n                  <li key={`${i}-${id}-${title}-${subtitle}-${path}`}>\n                    <Link\n                      class={subtitle ? 'has-subtitle' : ''}\n                      to={path}\n                      onClick={(e) => {\n                        if (e.target.classList.contains('is-active')) {\n                          e.preventDefault();\n                          const page = document.getElementById(`${id}-page`);\n                          console.log(id, page);\n                          if (page) {\n                            page.scrollTop = 0;\n                            const updatesButton =\n                              page.querySelector('.updates-button');\n                            if (updatesButton) {\n                              updatesButton.click();\n                            }\n                          }\n                        }\n                      }}\n                    >\n                      <Icon icon={icon} size=\"xl\" alt={title} />\n                      <span>\n                        <AsyncText>{title}</AsyncText>\n                        {subtitle && (\n                          <>\n                            <br />\n                            <small>{subtitle}</small>\n                          </>\n                        )}\n                      </span>\n                    </Link>\n                  </li>\n                );\n              },\n            )}\n          </ul>\n        </nav>\n      ) : (\n        <Menu2\n          instanceRef={menuRef}\n          overflow=\"auto\"\n          viewScroll=\"close\"\n          menuClassName=\"glass-menu shortcuts-menu\"\n          gap={8}\n          position=\"anchor\"\n          onMenuChange={(e) => {\n            if (e.open && hasLists.current) {\n              getLists().then(setLists);\n            }\n          }}\n          menuButton={\n            <button\n              type=\"button\"\n              id=\"shortcuts-button\"\n              class=\"plain\"\n              onContextMenu={(e) => {\n                e.preventDefault();\n                states.showShortcutsSettings = true;\n              }}\n              onTransitionStart={(e) => {\n                // Close menu if the button disappears\n                try {\n                  const { target } = e;\n                  if (getComputedStyle(target).pointerEvents === 'none') {\n                    menuRef.current?.closeMenu?.();\n                  }\n                } catch (e) {}\n              }}\n            >\n              <Icon icon=\"shortcut\" size=\"xl\" alt={t`Shortcuts`} />\n            </button>\n          }\n        >\n          {formattedShortcuts.map(({ id, path, title, subtitle, icon }, i) => {\n            if (id === 'lists') {\n              return (\n                <SubMenu2\n                  menuClassName=\"glass-menu\"\n                  overflow=\"auto\"\n                  gap={-8}\n                  label={\n                    <>\n                      <Icon icon={icon} size=\"l\" />\n                      <span class=\"menu-grow\">\n                        <AsyncText>{title}</AsyncText>\n                      </span>\n                      <Icon icon=\"chevron-right\" />\n                    </>\n                  }\n                >\n                  <MenuLink to=\"/l\">\n                    <span>\n                      <Trans>All Lists</Trans>\n                    </span>\n                  </MenuLink>\n                  <MenuDivider />\n                  {lists?.map((list) => (\n                    <MenuLink key={list.id} to={`/l/${list.id}`}>\n                      <span>{list.title}</span>\n                    </MenuLink>\n                  ))}\n                </SubMenu2>\n              );\n            }\n\n            return (\n              <MenuLink\n                to={path}\n                key={`${i}-${id}-${title}-${subtitle}-${path}`}\n                class=\"glass-menu-item\"\n              >\n                <Icon icon={icon} size=\"l\" />{' '}\n                <span class=\"menu-grow\">\n                  <span>\n                    <AsyncText>{title}</AsyncText>\n                  </span>\n                  {subtitle && (\n                    <>\n                      {' '}\n                      <small class=\"more-insignificant\">{subtitle}</small>\n                    </>\n                  )}\n                </span>\n                <span class=\"menu-shortcut hide-until-focus-visible\">\n                  {i + 1}\n                </span>\n              </MenuLink>\n            );\n          })}\n        </Menu2>\n      )}\n    </div>\n  );\n}\n\nexport default memo(Shortcuts);\n","import { api } from './api';\nimport { extractTagsFromStatus, getFollowedTags } from './followed-tags';\nimport pmem from './pmem';\nimport { fetchRelationships } from './relationships';\nimport states, { saveStatus, statusKey } from './states';\nimport store from './store';\nimport supports from './supports';\n\nexport function groupBoosts(values) {\n  let newValues = [];\n  let boostStash = [];\n  let serialBoosts = 0;\n  for (let i = 0; i < values.length; i++) {\n    const item = values[i];\n    if (item.reblog && !item.account?.group) {\n      boostStash.push(item);\n      serialBoosts++;\n    } else {\n      newValues.push(item);\n      if (serialBoosts < 3) {\n        serialBoosts = 0;\n      }\n    }\n  }\n  // if boostStash is more than quarter of values\n  // or if there are 3 or more boosts in a row\n  if (\n    values.length > 10 &&\n    (boostStash.length > values.length / 4 || serialBoosts >= 3)\n  ) {\n    // if boostStash is more than 3 quarter of values\n    const boostStashID = boostStash.map((status) => status.id);\n    if (boostStash.length > (values.length * 3) / 4) {\n      // insert boost array at the end of specialHome list\n      newValues = [\n        ...newValues,\n        { id: boostStashID, items: boostStash, type: 'boosts' },\n      ];\n    } else {\n      // insert boosts array in the middle of specialHome list\n      const half = Math.floor(newValues.length / 2);\n      newValues = [\n        ...newValues.slice(0, half),\n        {\n          id: boostStashID,\n          items: boostStash,\n          type: 'boosts',\n        },\n        ...newValues.slice(half),\n      ];\n    }\n    return newValues;\n  } else {\n    return values;\n  }\n}\n\nexport function dedupeBoosts(items, instance) {\n  const boostedStatusIDs = store.account.get('boostedStatusIDs') || {};\n  const filteredItems = items.filter((item) => {\n    if (!item.reblog) return true;\n    const statusKey = `${instance}-${item.reblog.id}`;\n    const boosterID = boostedStatusIDs[statusKey];\n    if (boosterID && boosterID !== item.id) {\n      console.warn(\n        `๐Ÿšซ Duplicate boost by ${item.account.displayName}`,\n        item,\n        item.reblog,\n      );\n      return false;\n    } else {\n      boostedStatusIDs[statusKey] = item.id;\n    }\n    return true;\n  });\n  // Limit to 50\n  const keys = Object.keys(boostedStatusIDs);\n  if (keys.length > 50) {\n    keys.slice(0, keys.length - 50).forEach((key) => {\n      delete boostedStatusIDs[key];\n    });\n  }\n  store.account.set('boostedStatusIDs', boostedStatusIDs);\n  return filteredItems;\n}\n\nexport function groupContext(items, instance) {\n  const contexts = [];\n  let contextIndex = 0;\n  items.forEach((item) => {\n    for (let i = 0; i < contexts.length; i++) {\n      if (contexts[i].find((t) => t.id === item.id)) return;\n      if (\n        contexts[i].find((t) => t.id === item.inReplyToId) ||\n        contexts[i].find((t) => t.inReplyToId === item.id)\n      ) {\n        contexts[i].push(item);\n        return;\n      }\n    }\n    const repliedItem = items.find((i) => i.id === item.inReplyToId);\n    if (repliedItem) {\n      contexts[contextIndex++] = [item, repliedItem];\n    }\n  });\n\n  // Check for cross-item contexts\n  // Merge contexts into one if they have a common item (same id)\n  for (let i = 0; i < contexts.length; i++) {\n    for (let j = i + 1; j < contexts.length; j++) {\n      const commonItem = contexts[i].find((t) => contexts[j].includes(t));\n      if (commonItem) {\n        contexts[i] = [...contexts[i], ...contexts[j]];\n        // Remove duplicate items\n        contexts[i] = contexts[i].filter(\n          (item, index, self) =>\n            self.findIndex((t) => t.id === item.id) === index,\n        );\n        contexts.splice(j, 1);\n        j--;\n      }\n    }\n  }\n\n  // Sort items by checking inReplyToId\n  contexts.forEach((context) => {\n    context.sort((a, b) => {\n      if (!a.inReplyToId && !b.inReplyToId) {\n        return new Date(a.createdAt) - new Date(b.createdAt);\n      }\n      if (a.inReplyToId === b.id) return 1;\n      if (b.inReplyToId === a.id) return -1;\n      if (!a.inReplyToId) return -1;\n      if (!b.inReplyToId) return 1;\n      return new Date(a.createdAt) - new Date(b.createdAt);\n    });\n  });\n\n  // Tag items that has different author than first post's author\n  contexts.forEach((context) => {\n    const firstItemAccountID = context[0].account.id;\n    context.forEach((item) => {\n      if (item.account.id !== firstItemAccountID) {\n        item._differentAuthor = true;\n      }\n    });\n  });\n\n  if (contexts.length) console.log('๐Ÿงต Contexts', contexts);\n\n  const newItems = [];\n  const appliedContextIndices = [];\n  const inReplyToIds = [];\n  items.forEach((item) => {\n    if (item.reblog) {\n      newItems.push(item);\n      return;\n    }\n    for (let i = 0; i < contexts.length; i++) {\n      if (contexts[i].find((t) => t.id === item.id)) {\n        if (appliedContextIndices.includes(i)) return;\n        const contextItems = contexts[i];\n        contextItems.sort((a, b) => {\n          const aDate = new Date(a.createdAt);\n          const bDate = new Date(b.createdAt);\n          return aDate - bDate;\n        });\n        const firstItemAccountID = contextItems[0].account.id;\n        newItems.push({\n          id: contextItems.map((i) => i.id),\n          items: contextItems,\n          type: contextItems.every((it) => it.account.id === firstItemAccountID)\n            ? 'thread'\n            : 'conversation',\n        });\n        appliedContextIndices.push(i);\n        return;\n      }\n    }\n\n    // PREPARE FOR REPLY HINTS\n    if (item.inReplyToId && item.inReplyToAccountId !== item.account.id) {\n      const sKey = statusKey(item.id, instance);\n      if (!states.statusReply[sKey]) {\n        // If it's a reply and not a thread\n        inReplyToIds.push({\n          sKey,\n          inReplyToId: item.inReplyToId,\n        });\n        // queueMicrotask(async () => {\n        //   try {\n        //     const { masto } = api({ instance });\n        //     // const replyToStatus = await masto.v1.statuses\n        //     //   .$select(item.inReplyToId)\n        //     //   .fetch();\n        //     const replyToStatus = await fetchStatus(item.inReplyToId, masto);\n        //     saveStatus(replyToStatus, instance, {\n        //       skipThreading: true,\n        //       skipUnfurling: true,\n        //     });\n        //     states.statusReply[sKey] = {\n        //       id: replyToStatus.id,\n        //       instance,\n        //     };\n        //   } catch (e) {\n        //     // Silently fail\n        //     console.error(e);\n        //   }\n        // });\n      }\n    }\n\n    newItems.push(item);\n  });\n\n  // FETCH AND SHOW REPLY HINTS\n  if (inReplyToIds?.length) {\n    queueMicrotask(() => {\n      const { masto } = api({ instance });\n      console.log('REPLYHINT', inReplyToIds);\n\n      // Fallback if batch fetch fails or returns nothing or not supported\n      async function fallbackFetch() {\n        for (let i = 0; i < inReplyToIds.length; i++) {\n          const { sKey, inReplyToId } = inReplyToIds[i];\n          try {\n            const replyToStatus = await fetchStatus(inReplyToId, masto);\n            saveStatus(replyToStatus, instance, {\n              skipThreading: true,\n            });\n            states.statusReply[sKey] = {\n              id: replyToStatus.id,\n              instance,\n            };\n            // Pause 1s\n            await new Promise((resolve) => setTimeout(resolve, 1000));\n          } catch (e) {\n            // Silently fail\n            console.error(e);\n          }\n        }\n      }\n\n      if (supports('@mastodon/fetch-multiple-statuses')) {\n        // This is batch fetching yooo, woot\n        // Limit 20, returns 422 if exceeded https://github.com/mastodon/mastodon/pull/27871\n        const ids = inReplyToIds.map(({ inReplyToId }) => inReplyToId);\n        (async () => {\n          try {\n            const replyToStatuses = await masto.v1.statuses.list({ id: ids });\n            if (replyToStatuses?.length) {\n              for (const replyToStatus of replyToStatuses) {\n                saveStatus(replyToStatus, instance, {\n                  skipThreading: true,\n                });\n                const sKey = inReplyToIds.find(\n                  ({ inReplyToId }) => inReplyToId === replyToStatus.id,\n                )?.sKey;\n                if (sKey) {\n                  states.statusReply[sKey] = {\n                    id: replyToStatus.id,\n                    instance,\n                  };\n                }\n              }\n            } else {\n              fallbackFetch();\n            }\n          } catch (e) {\n            // Silently fail\n            console.error(e);\n            fallbackFetch();\n          }\n        })();\n      } else {\n        fallbackFetch();\n      }\n    });\n  }\n\n  return newItems;\n}\n\nconst fetchStatus = pmem((statusID, masto) => {\n  return masto.v1.statuses.$select(statusID).fetch();\n});\n\nexport async function assignFollowedTags(items, instance) {\n  const followedTags = await getFollowedTags(); // [{name: 'tag'}, {...}]\n  if (!followedTags.length) return;\n  const { statusFollowedTags } = states;\n  console.log('statusFollowedTags', statusFollowedTags);\n  const statusWithFollowedTags = [];\n  items.forEach((item) => {\n    if (item.reblog) return;\n    const { id, content, tags = [] } = item;\n    const sKey = statusKey(id, instance);\n    if (statusFollowedTags[sKey]?.length) return;\n    const extractedTags = extractTagsFromStatus(content);\n    if (!extractedTags.length && !tags.length) return;\n    const itemFollowedTags = followedTags.reduce((acc, tag) => {\n      if (\n        extractedTags.some((t) => t.toLowerCase() === tag.name.toLowerCase()) ||\n        tags.some((t) => t.name.toLowerCase() === tag.name.toLowerCase())\n      ) {\n        acc.push(tag.name);\n      }\n      return acc;\n    }, []);\n    if (itemFollowedTags.length) {\n      // statusFollowedTags[sKey] = itemFollowedTags;\n      statusWithFollowedTags.push({\n        item,\n        sKey,\n        followedTags: itemFollowedTags,\n      });\n    }\n  });\n\n  if (statusWithFollowedTags.length) {\n    const accounts = statusWithFollowedTags.map((s) => s.item.account);\n    const relationships = await fetchRelationships(accounts);\n    if (!relationships) return;\n\n    statusWithFollowedTags.forEach((s) => {\n      const { item, sKey, followedTags } = s;\n      const r = relationships[item.account.id];\n      if (r && !r.following) {\n        statusFollowedTags[sKey] = followedTags;\n      }\n    });\n  }\n}\n\nexport function clearFollowedTagsState() {\n  states.statusFollowedTags = {};\n}\n","import { useLayoutEffect, useState } from 'preact/hooks';\n\nexport default function useScroll({\n  scrollableRef,\n  distanceFromStart = 1, // ratio of clientHeight/clientWidth\n  distanceFromEnd = 1, // ratio of clientHeight/clientWidth\n  scrollThresholdStart = 10,\n  scrollThresholdEnd = 10,\n  direction = 'vertical',\n  distanceFromStartPx: _distanceFromStartPx,\n  distanceFromEndPx: _distanceFromEndPx,\n} = {}) {\n  const [scrollDirection, setScrollDirection] = useState(null);\n  const [reachStart, setReachStart] = useState(false);\n  const [reachEnd, setReachEnd] = useState(false);\n  const [nearReachStart, setNearReachStart] = useState(false);\n  const [nearReachEnd, setNearReachEnd] = useState(false);\n  const isVertical = direction === 'vertical';\n\n  useLayoutEffect(() => {\n    const scrollableElement = scrollableRef.current;\n    if (!scrollableElement) return {};\n    let previousScrollStart = isVertical\n      ? scrollableElement.scrollTop\n      : scrollableElement.scrollLeft;\n\n    function onScroll() {\n      const {\n        scrollTop,\n        scrollLeft,\n        scrollHeight,\n        scrollWidth,\n        clientHeight,\n        clientWidth,\n      } = scrollableElement;\n      const scrollStart = isVertical ? scrollTop : scrollLeft;\n      const scrollDimension = isVertical ? scrollHeight : scrollWidth;\n      const clientDimension = isVertical ? clientHeight : clientWidth;\n      const scrollDistance = Math.abs(scrollStart - previousScrollStart);\n      const distanceFromStartPx =\n        _distanceFromStartPx ||\n        Math.min(\n          clientDimension * distanceFromStart,\n          scrollDimension,\n          scrollStart,\n        );\n      const distanceFromEndPx =\n        _distanceFromEndPx ||\n        Math.min(\n          clientDimension * distanceFromEnd,\n          scrollDimension,\n          scrollDimension - scrollStart - clientDimension,\n        );\n\n      if (\n        scrollDistance >=\n        (previousScrollStart < scrollStart\n          ? scrollThresholdEnd\n          : scrollThresholdStart)\n      ) {\n        setScrollDirection(previousScrollStart < scrollStart ? 'end' : 'start');\n        previousScrollStart = scrollStart;\n      }\n\n      setReachStart(scrollStart <= 0);\n      setReachEnd(scrollStart + clientDimension >= scrollDimension);\n      setNearReachStart(scrollStart <= distanceFromStartPx);\n      setNearReachEnd(\n        scrollStart + clientDimension >= scrollDimension - distanceFromEndPx,\n      );\n    }\n\n    scrollableElement.addEventListener('scroll', onScroll, { passive: true });\n\n    return () => scrollableElement.removeEventListener('scroll', onScroll);\n  }, [\n    distanceFromStart,\n    distanceFromEnd,\n    scrollThresholdStart,\n    scrollThresholdEnd,\n  ]);\n\n  return {\n    scrollDirection,\n    reachStart,\n    reachEnd,\n    nearReachStart,\n    nearReachEnd,\n    init: () => {\n      if (scrollableRef.current) {\n        scrollableRef.current.dispatchEvent(new Event('scroll'));\n      }\n    },\n  };\n}\n","import { useEffect, useLayoutEffect, useRef, useState } from 'preact/hooks';\nimport { useThrottledCallback } from 'use-debounce';\n\nexport default function useScrollFn(\n  {\n    scrollableRef,\n    distanceFromStart = 1, // ratio of clientHeight/clientWidth\n    distanceFromEnd = 1, // ratio of clientHeight/clientWidth\n    scrollThresholdStart = 10,\n    scrollThresholdEnd = 10,\n    direction = 'vertical',\n    distanceFromStartPx: _distanceFromStartPx,\n    distanceFromEndPx: _distanceFromEndPx,\n    init,\n  } = {},\n  callback,\n  deps,\n) {\n  if (!callback) return;\n  // const [scrollDirection, setScrollDirection] = useState(null);\n  // const [reachStart, setReachStart] = useState(false);\n  // const [reachEnd, setReachEnd] = useState(false);\n  // const [nearReachStart, setNearReachStart] = useState(false);\n  // const [nearReachEnd, setNearReachEnd] = useState(false);\n  const isVertical = direction === 'vertical';\n  const previousScrollStart = useRef(null);\n  const scrollDirection = useRef(null);\n\n  const onScroll = useThrottledCallback(() => {\n    // let scrollDirection = null;\n    let reachStart = false;\n    let reachEnd = false;\n    let nearReachStart = false;\n    let nearReachEnd = false;\n\n    const scrollableElement = scrollableRef.current;\n    const {\n      scrollTop,\n      scrollLeft,\n      scrollHeight,\n      scrollWidth,\n      clientHeight,\n      clientWidth,\n    } = scrollableElement;\n    const scrollStart = isVertical ? scrollTop : scrollLeft;\n    const scrollDimension = isVertical ? scrollHeight : scrollWidth;\n    const clientDimension = isVertical ? clientHeight : clientWidth;\n    const scrollDistance = Math.abs(scrollStart - previousScrollStart.current);\n    const distanceFromStartPx =\n      _distanceFromStartPx ||\n      Math.min(\n        clientDimension * distanceFromStart,\n        scrollDimension,\n        scrollStart,\n      );\n    const distanceFromEndPx =\n      _distanceFromEndPx ||\n      Math.min(\n        clientDimension * distanceFromEnd,\n        scrollDimension,\n        scrollDimension - scrollStart - clientDimension,\n      );\n\n    if (\n      scrollDistance >=\n      (previousScrollStart.current < scrollStart\n        ? scrollThresholdEnd\n        : scrollThresholdStart)\n    ) {\n      // setScrollDirection(\n      //   previousScrollStart.current < scrollStart ? 'end' : 'start',\n      // );\n      scrollDirection.current =\n        previousScrollStart.current < scrollStart ? 'end' : 'start';\n      previousScrollStart.current = scrollStart;\n    }\n\n    // setReachStart(scrollStart <= 0);\n    // setReachEnd(scrollStart + clientDimension >= scrollDimension);\n    // setNearReachStart(scrollStart <= distanceFromStartPx);\n    // setNearReachEnd(\n    //   scrollStart + clientDimension >= scrollDimension - distanceFromEndPx,\n    // );\n    reachStart = scrollStart <= 0;\n    reachEnd = scrollStart + clientDimension >= scrollDimension;\n    nearReachStart = scrollStart <= distanceFromStartPx;\n    nearReachEnd =\n      scrollStart + clientDimension >= scrollDimension - distanceFromEndPx;\n\n    callback({\n      scrollDirection: scrollDirection.current,\n      reachStart,\n      reachEnd,\n      nearReachStart,\n      nearReachEnd,\n    });\n  }, 500);\n\n  useLayoutEffect(() => {\n    const scrollableElement = scrollableRef.current;\n    if (!scrollableElement) return {};\n    previousScrollStart.current =\n      scrollableElement[isVertical ? 'scrollTop' : 'scrollLeft'];\n\n    scrollableElement.addEventListener('scroll', onScroll, { passive: true });\n\n    return () => scrollableElement.removeEventListener('scroll', onScroll);\n  }, [\n    distanceFromStart,\n    distanceFromEnd,\n    scrollThresholdStart,\n    scrollThresholdEnd,\n    ...deps,\n  ]);\n\n  // useEffect(() => {\n  //   callback({\n  //     scrollDirection,\n  //     reachStart,\n  //     reachEnd,\n  //     nearReachStart,\n  //     nearReachEnd,\n  //   });\n  // }, [\n  //   scrollDirection,\n  //   reachStart,\n  //   reachEnd,\n  //   nearReachStart,\n  //   nearReachEnd,\n  //   ...deps,\n  // ]);\n\n  useEffect(() => {\n    if (init && scrollableRef.current) {\n      queueMicrotask(() => {\n        scrollableRef.current.dispatchEvent(new Event('scroll'));\n      });\n    }\n  }, [init]);\n\n  // return {\n  //   scrollDirection,\n  //   reachStart,\n  //   reachEnd,\n  //   nearReachStart,\n  //   nearReachEnd,\n  //   init: () => {\n  //     if (scrollableRef.current) {\n  //       scrollableRef.current.dispatchEvent(new Event('scroll'));\n  //     }\n  //   },\n  // };\n}\n","import './media-post.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { memo } from 'preact/compat';\nimport { useContext, useMemo } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport FilterContext from '../utils/filter-context';\nimport { isFiltered } from '../utils/filters';\nimport states, { statusKey } from '../utils/states';\nimport store from '../utils/store';\nimport { getCurrentAccountID } from '../utils/store-utils';\n\nimport Media from './media';\n\nfunction MediaPost({\n  class: className,\n  statusID,\n  status,\n  instance,\n  parent,\n  // allowFilters,\n  onMediaClick,\n}) {\n  const { t } = useLingui();\n  let sKey = statusKey(statusID, instance);\n  const snapStates = useSnapshot(states);\n  if (!status) {\n    status = snapStates.statuses[sKey] || snapStates.statuses[statusID];\n    sKey = statusKey(status?.id, instance);\n  }\n  if (!status) {\n    return null;\n  }\n\n  const {\n    account: {\n      acct,\n      avatar,\n      avatarStatic,\n      id: accountId,\n      url: accountURL,\n      displayName,\n      username,\n      emojis: accountEmojis,\n      bot,\n      group,\n    },\n    id,\n    repliesCount,\n    reblogged,\n    reblogsCount,\n    favourited,\n    favouritesCount,\n    bookmarked,\n    poll,\n    muted,\n    sensitive,\n    spoilerText,\n    visibility, // public, unlisted, private, direct\n    language,\n    editedAt,\n    filtered,\n    card,\n    createdAt,\n    inReplyToId,\n    inReplyToAccountId,\n    content,\n    mentions,\n    mediaAttachments,\n    reblog,\n    uri,\n    url,\n    emojis,\n    // Non-API props\n    _deleted,\n    _pinned,\n    // _filtered,\n  } = status;\n\n  if (!mediaAttachments?.length) {\n    return null;\n  }\n\n  const debugHover = (e) => {\n    if (e.shiftKey) {\n      console.log({\n        ...status,\n      });\n    }\n  };\n\n  const currentAccount = useMemo(() => {\n    return getCurrentAccountID();\n  }, []);\n  const isSelf = useMemo(() => {\n    return currentAccount && currentAccount === accountId;\n  }, [accountId, currentAccount]);\n\n  const filterContext = useContext(FilterContext);\n  const filterInfo = !isSelf && isFiltered(filtered, filterContext);\n\n  if (filterInfo?.action === 'hide') {\n    return null;\n  }\n\n  console.debug('RENDER Media post', id, status?.account.displayName);\n\n  const hasSpoiler = sensitive;\n  const readingExpandMedia = useMemo(() => {\n    // default | show_all | hide_all\n    const prefs = store.account.get('preferences') || {};\n    return prefs['reading:expand:media']?.toLowerCase() || 'default';\n  }, []);\n  const showSpoilerMedia = readingExpandMedia === 'show_all';\n\n  const Parent = parent || 'div';\n\n  return mediaAttachments.map((media, i) => {\n    const mediaKey = `${sKey}-${media.id}`;\n    const filterTitleStr = filterInfo?.titlesStr;\n    return (\n      <Parent\n        data-state-post-id={sKey}\n        onMouseEnter={debugHover}\n        key={mediaKey}\n        data-spoiler-text={\n          spoilerText || (sensitive ? t`Sensitive media` : undefined)\n        }\n        data-filtered-text={\n          filterInfo\n            ? filterTitleStr\n              ? t`Filtered: ${filterTitleStr}`\n              : t`Filtered`\n            : undefined\n        }\n        class={`\n          media-post\n          ${filterInfo ? 'filtered' : ''}\n          ${hasSpoiler ? 'has-spoiler' : ''}\n          ${showSpoilerMedia ? 'show-media' : ''}\n        `}\n      >\n        <Media\n          class={className}\n          media={media}\n          lang={language}\n          to={`/${instance}/s/${id}?media-only=${i + 1}`}\n          onClick={\n            onMediaClick ? (e) => onMediaClick(e, i, media, status) : undefined\n          }\n        />\n      </Parent>\n    );\n  });\n}\n\nexport default memo(MediaPost);\n","import './nav-menu.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { ControlledMenu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { memo } from 'preact/compat';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport { useLongPress } from 'use-long-press';\nimport { useSnapshot } from 'valtio';\n\nimport { api } from '../utils/api';\nimport { getLists } from '../utils/lists';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport states from '../utils/states';\nimport store from '../utils/store';\nimport { getCurrentAccountID } from '../utils/store-utils';\nimport supports from '../utils/supports';\n\nimport Avatar from './avatar';\nimport Icon from './icon';\nimport MenuLink from './menu-link';\nimport SubMenu2 from './submenu2';\n\nfunction NavMenu(props) {\n  const { t } = useLingui();\n  const snapStates = useSnapshot(states);\n  const { masto, instance, authenticated } = api();\n\n  const [currentAccount, moreThanOneAccount] = useMemo(() => {\n    const accounts = store.local.getJSON('accounts') || [];\n    const acc =\n      accounts.find((account) => account.info.id === getCurrentAccountID()) ||\n      accounts[0];\n    return [acc, accounts.length > 1];\n  }, []);\n\n  // Home = Following\n  // But when in multi-column mode, Home becomes columns of anything\n  // User may choose pin or not to pin Following\n  // If user doesn't pin Following, we show it in the menu\n  const showFollowing =\n    (snapStates.settings.shortcutsViewMode === 'multi-column' ||\n      (!snapStates.settings.shortcutsViewMode &&\n        snapStates.settings.shortcutsColumnsMode)) &&\n    !snapStates.shortcuts.find((pin) => pin.type === 'following');\n\n  const bindLongPress = useLongPress(\n    () => {\n      states.showAccounts = true;\n    },\n    {\n      threshold: 600,\n      detect: 'touch',\n      cancelOnMovement: true,\n    },\n  );\n\n  const buttonRef = useRef();\n  const [menuState, setMenuState] = useState(undefined);\n\n  const boundingBoxPadding = safeBoundingBoxPadding([\n    0,\n    0,\n    snapStates.settings.shortcutsViewMode === 'tab-menu-bar' ? 50 : 0,\n    0,\n  ]);\n\n  const mutesIterator = useRef();\n  async function fetchMutes(firstLoad) {\n    if (firstLoad || !mutesIterator.current) {\n      mutesIterator.current = masto.v1.mutes.list({\n        limit: 80,\n      });\n    }\n    const results = await mutesIterator.current.next();\n    return results;\n  }\n\n  const blocksIterator = useRef();\n  async function fetchBlocks(firstLoad) {\n    if (firstLoad || !blocksIterator.current) {\n      blocksIterator.current = masto.v1.blocks.list({\n        limit: 80,\n      });\n    }\n    const results = await blocksIterator.current.next();\n    return results;\n  }\n\n  const buttonClickTS = useRef();\n  return (\n    <>\n      <button\n        ref={buttonRef}\n        type=\"button\"\n        class={`button plain nav-menu-button ${\n          moreThanOneAccount ? 'with-avatar' : ''\n        } ${menuState === 'open' ? 'active' : ''}`}\n        style={{ position: 'relative' }}\n        onClick={() => {\n          buttonClickTS.current = Date.now();\n          setMenuState((state) => (!state ? 'open' : undefined));\n        }}\n        onContextMenu={(e) => {\n          e.preventDefault();\n          states.showAccounts = true;\n        }}\n        {...bindLongPress()}\n      >\n        {moreThanOneAccount && (\n          <Avatar\n            url={\n              currentAccount?.info?.avatar || currentAccount?.info?.avatarStatic\n            }\n            size=\"l\"\n            squircle={currentAccount?.info?.bot}\n          />\n        )}\n        <Icon icon=\"menu\" size={moreThanOneAccount ? 's' : 'l'} alt={t`Menu`} />\n      </button>\n      <ControlledMenu\n        menuClassName=\"nav-menu\"\n        state={menuState}\n        anchorRef={buttonRef}\n        onClose={() => {\n          setMenuState(undefined);\n        }}\n        containerProps={{\n          style: {\n            zIndex: 10,\n          },\n          onClick: () => {\n            if (Date.now() - buttonClickTS.current < 300) {\n              return;\n            }\n            // setMenuState(undefined);\n          },\n        }}\n        portal={{\n          target: document.body,\n        }}\n        {...props}\n        overflow=\"auto\"\n        viewScroll=\"close\"\n        position=\"anchor\"\n        align=\"center\"\n        boundingBoxPadding={boundingBoxPadding}\n        unmountOnClose\n      >\n        {!!snapStates.appVersion?.commitHash &&\n          __COMMIT_HASH__ !== snapStates.appVersion.commitHash && (\n            <div class=\"top-menu\">\n              <MenuItem\n                onClick={() => {\n                  const yes = confirm(t`Reload page now to update?`);\n                  if (yes) {\n                    (async () => {\n                      try {\n                        location.reload();\n                      } catch (e) {}\n                    })();\n                  }\n                }}\n              >\n                <Icon icon=\"sparkles\" class=\"sparkle-icon\" size=\"l\" />{' '}\n                <span>\n                  <Trans>New update availableโ€ฆ</Trans>\n                </span>\n              </MenuItem>\n              <MenuDivider />\n            </div>\n          )}\n        <section>\n          <MenuLink to=\"/\">\n            <Icon icon=\"home\" size=\"l\" />{' '}\n            <span>\n              <Trans>Home</Trans>\n            </span>\n          </MenuLink>\n          {authenticated ? (\n            <>\n              {showFollowing && (\n                <MenuLink to=\"/following\">\n                  <Icon icon=\"following\" size=\"l\" />{' '}\n                  <span>\n                    <Trans id=\"following.title\">Following</Trans>\n                  </span>\n                </MenuLink>\n              )}\n              <MenuLink to=\"/catchup\">\n                <Icon icon=\"history2\" size=\"l\" />\n                <span>\n                  <Trans>Catch-up</Trans>\n                </span>\n              </MenuLink>\n              {supports('@mastodon/mentions') && (\n                <MenuLink to=\"/mentions\">\n                  <Icon icon=\"at\" size=\"l\" />{' '}\n                  <span>\n                    <Trans>Mentions</Trans>\n                  </span>\n                </MenuLink>\n              )}\n              <MenuLink to=\"/notifications\">\n                <Icon icon=\"notification\" size=\"l\" />{' '}\n                <span>\n                  <Trans>Notifications</Trans>\n                </span>\n                {snapStates.notificationsShowNew && (\n                  <sup title={t`New`} style={{ opacity: 0.5 }}>\n                    {' '}\n                    &bull;\n                  </sup>\n                )}\n              </MenuLink>\n              <MenuDivider />\n              {currentAccount?.info?.id && (\n                <MenuLink to={`/${instance}/a/${currentAccount.info.id}`}>\n                  <Icon icon=\"user\" size=\"l\" />{' '}\n                  <span>\n                    <Trans>Profile</Trans>\n                  </span>\n                </MenuLink>\n              )}\n              <ListMenu menuState={menuState} />\n              <MenuLink to=\"/b\">\n                <Icon icon=\"bookmark\" size=\"l\" />{' '}\n                <span>\n                  <Trans>Bookmarks</Trans>\n                </span>\n              </MenuLink>\n              <SubMenu2\n                menuClassName=\"nav-submenu\"\n                overflow=\"auto\"\n                gap={-8}\n                label={\n                  <>\n                    <Icon icon=\"more\" size=\"l\" />\n                    <span class=\"menu-grow\">\n                      <Trans>Moreโ€ฆ</Trans>\n                    </span>\n                    <Icon icon=\"chevron-right\" />\n                  </>\n                }\n              >\n                <MenuLink to=\"/f\">\n                  <Icon icon=\"heart\" size=\"l\" />{' '}\n                  <span>\n                    <Trans>Likes</Trans>\n                  </span>\n                </MenuLink>\n                <MenuLink to=\"/fh\">\n                  <Icon icon=\"hashtag\" size=\"l\" />{' '}\n                  <span>\n                    <Trans>Followed Hashtags</Trans>\n                  </span>\n                </MenuLink>\n                <MenuDivider />\n                {supports('@mastodon/filters') && (\n                  <MenuLink to=\"/ft\">\n                    <Icon icon=\"filters\" size=\"l\" />{' '}\n                    <span>\n                      <Trans>Filters</Trans>\n                    </span>\n                  </MenuLink>\n                )}\n                <MenuItem\n                  onClick={() => {\n                    states.showGenericAccounts = {\n                      id: 'mute',\n                      heading: t`Muted users`,\n                      fetchAccounts: fetchMutes,\n                      excludeRelationshipAttrs: ['muting'],\n                    };\n                  }}\n                >\n                  <Icon icon=\"mute\" size=\"l\" />{' '}\n                  <span>\n                    <Trans>Muted usersโ€ฆ</Trans>\n                  </span>\n                </MenuItem>\n                <MenuItem\n                  onClick={() => {\n                    states.showGenericAccounts = {\n                      id: 'block',\n                      heading: t`Blocked users`,\n                      fetchAccounts: fetchBlocks,\n                      excludeRelationshipAttrs: ['blocking'],\n                    };\n                  }}\n                >\n                  <Icon icon=\"block\" size=\"l\" />{' '}\n                  <span>\n                    <Trans>Blocked usersโ€ฆ</Trans>\n                  </span>\n                </MenuItem>{' '}\n              </SubMenu2>\n              <MenuDivider />\n              <MenuItem\n                onClick={() => {\n                  states.showAccounts = true;\n                }}\n              >\n                <Icon icon=\"group\" size=\"l\" />{' '}\n                <span>\n                  <Trans>Accountsโ€ฆ</Trans>\n                </span>\n              </MenuItem>\n            </>\n          ) : (\n            <>\n              <MenuDivider />\n              <MenuLink to=\"/login\">\n                <Icon icon=\"user\" size=\"l\" />{' '}\n                <span>\n                  <Trans>Log in</Trans>\n                </span>\n              </MenuLink>\n            </>\n          )}\n        </section>\n        <section>\n          <MenuDivider />\n          <MenuLink to={`/search`}>\n            <Icon icon=\"search\" size=\"l\" />{' '}\n            <span>\n              <Trans>Search</Trans>\n            </span>\n          </MenuLink>\n          <MenuLink to={`/${instance}/trending`}>\n            <Icon icon=\"chart\" size=\"l\" />{' '}\n            <span>\n              <Trans>Trending</Trans>\n            </span>\n          </MenuLink>\n          <MenuLink to={`/${instance}/p/l`}>\n            <Icon icon=\"building\" size=\"l\" />{' '}\n            <span>\n              <Trans>Local</Trans>\n            </span>\n          </MenuLink>\n          <MenuLink to={`/${instance}/p`}>\n            <Icon icon=\"earth\" size=\"l\" />{' '}\n            <span>\n              <Trans>Federated</Trans>\n            </span>\n          </MenuLink>\n          {authenticated ? (\n            <>\n              <MenuDivider className=\"divider-grow\" />\n              <MenuItem\n                onClick={() => {\n                  states.showKeyboardShortcutsHelp = true;\n                }}\n              >\n                <Icon icon=\"keyboard\" size=\"l\" />{' '}\n                <span>\n                  <Trans>Keyboard shortcuts</Trans>\n                </span>\n              </MenuItem>\n              <MenuItem\n                onClick={() => {\n                  states.showShortcutsSettings = true;\n                }}\n              >\n                <Icon icon=\"shortcut\" size=\"l\" />{' '}\n                <span>\n                  <Trans>Shortcuts / Columnsโ€ฆ</Trans>\n                </span>\n              </MenuItem>\n              <MenuItem\n                onClick={() => {\n                  states.showSettings = true;\n                }}\n              >\n                <Icon icon=\"gear\" size=\"l\" />{' '}\n                <span>\n                  <Trans>Settingsโ€ฆ</Trans>\n                </span>\n              </MenuItem>\n            </>\n          ) : (\n            <>\n              <MenuDivider />\n              <MenuItem\n                onClick={() => {\n                  states.showSettings = true;\n                }}\n              >\n                <Icon icon=\"gear\" size=\"l\" />{' '}\n                <span>\n                  <Trans>Settingsโ€ฆ</Trans>\n                </span>\n              </MenuItem>\n            </>\n          )}\n        </section>\n      </ControlledMenu>\n    </>\n  );\n}\n\nfunction ListMenu({ menuState }) {\n  const supportsLists = supports('@mastodon/lists');\n  const [lists, setLists] = useState([]);\n  useEffect(() => {\n    if (!supportsLists) return;\n    if (menuState === 'open') {\n      getLists().then(setLists);\n    }\n  }, [menuState, supportsLists]);\n\n  return lists.length > 0 ? (\n    <SubMenu2\n      menuClassName=\"nav-submenu\"\n      overflow=\"auto\"\n      gap={-8}\n      label={\n        <>\n          <Icon icon=\"list\" size=\"l\" />\n          <span class=\"menu-grow\">\n            <Trans>Lists</Trans>\n          </span>\n          <Icon icon=\"chevron-right\" />\n        </>\n      }\n    >\n      <MenuLink to=\"/l\">\n        <span>\n          <Trans>All Lists</Trans>\n        </span>\n      </MenuLink>\n      {lists?.length > 0 && (\n        <>\n          <MenuDivider />\n          {lists.map((list) => (\n            <MenuLink key={list.id} to={`/l/${list.id}`}>\n              <span>{list.title}</span>\n            </MenuLink>\n          ))}\n        </>\n      )}\n    </SubMenu2>\n  ) : (\n    supportsLists && (\n      <MenuLink to=\"/l\">\n        <Icon icon=\"list\" size=\"l\" />\n        <span>\n          <Trans>Lists</Trans>\n        </span>\n      </MenuLink>\n    )\n  );\n}\n\nexport default memo(NavMenu);\n","import { plural } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { memo } from 'preact/compat';\nimport {\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { InView } from 'react-intersection-observer';\nimport { useDebouncedCallback } from 'use-debounce';\nimport { useSnapshot } from 'valtio';\n\nimport FilterContext from '../utils/filter-context';\nimport { filteredItems, isFiltered } from '../utils/filters';\nimport isRTL from '../utils/is-rtl';\nimport showToast from '../utils/show-toast';\nimport states, { statusKey } from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport { isMediaFirstInstance } from '../utils/store-utils';\nimport { groupBoosts, groupContext } from '../utils/timeline-utils';\nimport useInterval from '../utils/useInterval';\nimport usePageVisibility from '../utils/usePageVisibility';\nimport useScroll from '../utils/useScroll';\nimport useScrollFn from '../utils/useScrollFn';\n\nimport Icon from './icon';\nimport Link from './link';\nimport MediaPost from './media-post';\nimport NavMenu from './nav-menu';\nimport Status from './status';\n\nconst scrollIntoViewOptions = {\n  block: 'nearest',\n  inline: 'center',\n  behavior: 'smooth',\n};\n\nfunction Timeline({\n  title,\n  titleComponent,\n  id,\n  instance,\n  emptyText,\n  errorText,\n  useItemID, // use statusID instead of status object, assuming it's already in states\n  boostsCarousel,\n  fetchItems = () => {},\n  checkForUpdates = () => {},\n  checkForUpdatesInterval = 15_000, // 15 seconds\n  headerStart,\n  headerEnd,\n  timelineStart,\n  // allowFilters,\n  refresh,\n  view,\n  filterContext,\n  showFollowedTags,\n  showReplyParent,\n  clearWhenRefresh,\n}) {\n  const { t } = useLingui();\n  const snapStates = useSnapshot(states);\n  const [items, setItems] = useState([]);\n  const [uiState, setUIState] = useState('start');\n  const [showMore, setShowMore] = useState(false);\n  const [showNew, setShowNew] = useState(false);\n  const [visible, setVisible] = useState(true);\n  const scrollableRef = useRef();\n\n  console.debug('RENDER Timeline', id, refresh);\n  __BENCHMARK.start(`timeline-${id}-load`);\n\n  const mediaFirst = useMemo(() => isMediaFirstInstance(), []);\n\n  const allowGrouping = view !== 'media';\n  const loadItemsTS = useRef(0); // Ensures only one loadItems at a time\n  const loadItems = useDebouncedCallback(\n    (firstLoad) => {\n      setShowNew(false);\n      // if (uiState === 'loading') return;\n      setUIState('loading');\n      (async () => {\n        try {\n          const ts = (loadItemsTS.current = Date.now());\n          let { done, value } = await fetchItems(firstLoad);\n          if (ts !== loadItemsTS.current) return;\n          if (Array.isArray(value)) {\n            // Avoid grouping for pinned posts\n            const [pinnedPosts, otherPosts] = value.reduce(\n              (acc, item) => {\n                if (item._pinned) {\n                  acc[0].push(item);\n                } else {\n                  acc[1].push(item);\n                }\n                return acc;\n              },\n              [[], []],\n            );\n            value = otherPosts;\n            if (allowGrouping) {\n              if (boostsCarousel) {\n                value = groupBoosts(value);\n              }\n              value = groupContext(value, instance);\n            }\n            if (pinnedPosts.length) {\n              value = pinnedPosts.concat(value);\n            }\n            console.log(value);\n            if (firstLoad) {\n              setItems(value);\n            } else {\n              setItems((items) => [...items, ...value]);\n            }\n            if (!value.length) done = true;\n            setShowMore(!done);\n          } else {\n            setShowMore(false);\n          }\n          setUIState('default');\n          __BENCHMARK.end(`timeline-${id}-load`);\n        } catch (e) {\n          console.error(e);\n          setUIState('error');\n          if (firstLoad && !items.length && errorText) {\n            showToast(errorText);\n          }\n        } finally {\n          loadItems.cancel();\n        }\n      })();\n    },\n    1_000,\n    {\n      leading: true,\n      // trailing: false,\n    },\n  );\n\n  const itemsSelector = '.timeline-item, .timeline-item-alt';\n\n  const jRef = useHotkeys('j, shift+j', (_, handler) => {\n    // focus on next status after active item\n    const activeItem = document.activeElement.closest(itemsSelector);\n    const activeItemRect = activeItem?.getBoundingClientRect();\n    const allItems = Array.from(\n      scrollableRef.current.querySelectorAll(itemsSelector),\n    );\n    if (\n      activeItem &&\n      activeItemRect.top < scrollableRef.current.clientHeight &&\n      activeItemRect.bottom > 0\n    ) {\n      const activeItemIndex = allItems.indexOf(activeItem);\n      let nextItem = allItems[activeItemIndex + 1];\n      if (handler.shift) {\n        // get next status that's not .timeline-item-alt\n        nextItem = allItems.find(\n          (item, index) =>\n            index > activeItemIndex &&\n            !item.classList.contains('timeline-item-alt'),\n        );\n      }\n      if (nextItem) {\n        nextItem.focus();\n        nextItem.scrollIntoView(scrollIntoViewOptions);\n      }\n    } else {\n      // If active status is not in viewport, get the topmost status-link in viewport\n      const topmostItem = allItems.find((item) => {\n        const itemRect = item.getBoundingClientRect();\n        return itemRect.top >= 44 && itemRect.left >= 0; // 44 is the magic number for header height, not real\n      });\n      if (topmostItem) {\n        topmostItem.focus();\n        topmostItem.scrollIntoView(scrollIntoViewOptions);\n      }\n    }\n  });\n\n  const kRef = useHotkeys('k, shift+k', (_, handler) => {\n    // focus on previous status after active item\n    const activeItem = document.activeElement.closest(itemsSelector);\n    const activeItemRect = activeItem?.getBoundingClientRect();\n    const allItems = Array.from(\n      scrollableRef.current.querySelectorAll(itemsSelector),\n    );\n    if (\n      activeItem &&\n      activeItemRect.top < scrollableRef.current.clientHeight &&\n      activeItemRect.bottom > 0\n    ) {\n      const activeItemIndex = allItems.indexOf(activeItem);\n      let prevItem = allItems[activeItemIndex - 1];\n      if (handler.shift) {\n        // get prev status that's not .timeline-item-alt\n        prevItem = allItems.findLast(\n          (item, index) =>\n            index < activeItemIndex &&\n            !item.classList.contains('timeline-item-alt'),\n        );\n      }\n      if (prevItem) {\n        prevItem.focus();\n        prevItem.scrollIntoView(scrollIntoViewOptions);\n      }\n    } else {\n      // If active status is not in viewport, get the topmost status-link in viewport\n      const topmostItem = allItems.find((item) => {\n        const itemRect = item.getBoundingClientRect();\n        return itemRect.top >= 44 && itemRect.left >= 0; // 44 is the magic number for header height, not real\n      });\n      if (topmostItem) {\n        topmostItem.focus();\n        topmostItem.scrollIntoView(scrollIntoViewOptions);\n      }\n    }\n  });\n\n  const oRef = useHotkeys(['enter', 'o'], () => {\n    // open active status\n    const activeItem = document.activeElement;\n    if (activeItem?.matches(itemsSelector)) {\n      activeItem.click();\n    }\n  });\n\n  const showNewPostsIndicator =\n    items.length > 0 && uiState !== 'loading' && showNew;\n  const handleLoadNewPosts = useCallback(() => {\n    if (showNewPostsIndicator) loadItems(true);\n    scrollableRef.current?.scrollTo({\n      top: 0,\n      behavior: 'smooth',\n    });\n  }, [loadItems, showNewPostsIndicator]);\n  const dotRef = useHotkeys('.', handleLoadNewPosts);\n\n  // const {\n  //   scrollDirection,\n  //   nearReachStart,\n  //   nearReachEnd,\n  //   reachStart,\n  //   reachEnd,\n  // } = useScroll({\n  //   scrollableRef,\n  //   distanceFromEnd: 2,\n  //   scrollThresholdStart: 44,\n  // });\n  const headerRef = useRef();\n  // const [hiddenUI, setHiddenUI] = useState(false);\n  const [nearReachStart, setNearReachStart] = useState(false);\n  useScrollFn(\n    {\n      scrollableRef,\n      distanceFromEnd: 2,\n      scrollThresholdStart: 44,\n    },\n    ({\n      scrollDirection,\n      nearReachStart,\n      // nearReachEnd,\n      reachStart,\n      // reachEnd,\n    }) => {\n      // setHiddenUI(scrollDirection === 'end' && !nearReachEnd);\n      if (headerRef.current) {\n        const hiddenUI = scrollDirection === 'end' && !nearReachStart;\n        headerRef.current.hidden = hiddenUI;\n      }\n      setNearReachStart(nearReachStart);\n      if (reachStart) {\n        loadItems(true);\n      }\n      // else if (nearReachEnd || (reachEnd && showMore)) {\n      //   loadItems();\n      // }\n    },\n    [],\n  );\n\n  useEffect(() => {\n    scrollableRef.current?.scrollTo({ top: 0 });\n    loadItems(true);\n  }, []);\n  const firstLoad = useRef(true);\n  useEffect(() => {\n    if (firstLoad.current) {\n      firstLoad.current = false;\n      return;\n    }\n    if (clearWhenRefresh && items?.length) {\n      loadItems.cancel?.();\n      setItems([]);\n    }\n    loadItems(true);\n  }, [clearWhenRefresh, refresh]);\n\n  // useEffect(() => {\n  //   if (reachStart) {\n  //     loadItems(true);\n  //   }\n  // }, [reachStart]);\n\n  // useEffect(() => {\n  //   if (nearReachEnd || (reachEnd && showMore)) {\n  //     loadItems();\n  //   }\n  // }, [nearReachEnd, showMore]);\n\n  const prevView = useRef(view);\n  useEffect(() => {\n    if (prevView.current !== view) {\n      prevView.current = view;\n      setItems([]);\n    }\n  }, [view]);\n\n  const loadOrCheckUpdates = useCallback(\n    async ({ disableIdleCheck = false } = {}) => {\n      const noPointers = scrollableRef.current\n        ? getComputedStyle(scrollableRef.current).pointerEvents === 'none'\n        : false;\n      console.log('โœจ Load or check updates', id, {\n        autoRefresh: snapStates.settings.autoRefresh,\n        scrollTop: scrollableRef.current.scrollTop,\n        disableIdleCheck,\n        idle: window.__IDLE__,\n        inBackground: inBackground(),\n        noPointers,\n      });\n      if (\n        snapStates.settings.autoRefresh &&\n        scrollableRef.current.scrollTop < 16 &&\n        (disableIdleCheck || window.__IDLE__) &&\n        !inBackground() &&\n        !noPointers\n      ) {\n        console.log('โœจ Load updates', id, snapStates.settings.autoRefresh);\n        loadItems(true);\n      } else {\n        console.log('โœจ Check updates', id, snapStates.settings.autoRefresh);\n        const hasUpdate = await checkForUpdates();\n        if (hasUpdate) {\n          console.log('โœจ Has new updates', id);\n          setShowNew(true);\n        }\n      }\n    },\n    [id, loadItems, checkForUpdates, snapStates.settings.autoRefresh],\n  );\n\n  const lastHiddenTime = useRef();\n  usePageVisibility(\n    (visible) => {\n      if (visible) {\n        const timeDiff = Date.now() - lastHiddenTime.current;\n        if (!lastHiddenTime.current || timeDiff > 1000 * 3) {\n          // 3 seconds\n          loadOrCheckUpdates({\n            disableIdleCheck: true,\n          });\n        }\n      } else {\n        lastHiddenTime.current = Date.now();\n      }\n      setVisible(visible);\n    },\n    [checkForUpdates, loadOrCheckUpdates, snapStates.settings.autoRefresh],\n  );\n\n  // checkForUpdates interval\n  useInterval(\n    loadOrCheckUpdates,\n    visible && !showNew\n      ? checkForUpdatesInterval * (nearReachStart ? 1 : 2)\n      : null,\n  );\n\n  // const hiddenUI = scrollDirection === 'end' && !nearReachStart;\n\n  return (\n    <FilterContext.Provider value={filterContext}>\n      <div\n        id={`${id}-page`}\n        class={`deck-container ${\n          mediaFirst ? 'deck-container-media-first' : ''\n        }`}\n        ref={(node) => {\n          scrollableRef.current = node;\n          jRef(node);\n          kRef(node);\n          oRef(node);\n          dotRef(node);\n        }}\n        tabIndex=\"-1\"\n        onClick={(e) => {\n          // If click on timeline item, unhide header\n          if (\n            headerRef.current &&\n            e.target.closest('.timeline-item, .timeline-item-alt')\n          ) {\n            setTimeout(() => {\n              headerRef.current.hidden = false;\n            }, 250);\n          }\n        }}\n      >\n        <div class=\"timeline-deck deck\">\n          <header\n            ref={headerRef}\n            // hidden={hiddenUI}\n            onClick={(e) => {\n              if (!e.target.closest('a, button')) {\n                scrollableRef.current?.scrollTo({\n                  top: 0,\n                  behavior: 'smooth',\n                });\n              }\n            }}\n            onDblClick={(e) => {\n              if (!e.target.closest('a, button')) {\n                loadItems(true);\n              }\n            }}\n            class={uiState === 'loading' ? 'loading' : ''}\n          >\n            <div class=\"header-grid\">\n              <div class=\"header-side\">\n                <NavMenu />\n                {headerStart !== null && headerStart !== undefined ? (\n                  headerStart\n                ) : (\n                  <Link to=\"/\" class=\"button plain home-button\">\n                    <Icon icon=\"home\" size=\"l\" alt={t`Home`} />\n                  </Link>\n                )}\n              </div>\n              {title && (titleComponent ? titleComponent : <h1>{title}</h1>)}\n              <div class=\"header-side\">\n                {/* <Loader hidden={uiState !== 'loading'} /> */}\n                {!!headerEnd && headerEnd}\n              </div>\n            </div>\n            {showNewPostsIndicator && (\n              <button\n                class=\"updates-button shiny-pill\"\n                type=\"button\"\n                onClick={handleLoadNewPosts}\n              >\n                <Icon icon=\"arrow-up\" /> <Trans>New posts</Trans>\n              </button>\n            )}\n          </header>\n          {!!timelineStart && (\n            <div\n              class={`timeline-start ${uiState === 'loading' ? 'loading' : ''}`}\n            >\n              {timelineStart}\n            </div>\n          )}\n          {!!items.length ? (\n            <>\n              <ul class={`timeline ${view ? `timeline-${view}` : ''}`}>\n                {items.map((status) => (\n                  <TimelineItem\n                    status={status}\n                    instance={instance}\n                    useItemID={useItemID}\n                    // allowFilters={allowFilters}\n                    filterContext={filterContext}\n                    key={status.id + status?._pinned + view}\n                    view={view}\n                    showFollowedTags={showFollowedTags}\n                    showReplyParent={showReplyParent}\n                    mediaFirst={mediaFirst}\n                  />\n                ))}\n                {showMore &&\n                  uiState === 'loading' &&\n                  (view === 'media' ? null : (\n                    <>\n                      <li\n                        style={{\n                          height: '20vh',\n                        }}\n                      >\n                        <Status skeleton mediaFirst={mediaFirst} />\n                      </li>\n                      <li\n                        style={{\n                          height: '25vh',\n                        }}\n                      >\n                        <Status skeleton mediaFirst={mediaFirst} />\n                      </li>\n                    </>\n                  ))}\n              </ul>\n              {uiState === 'default' &&\n                (showMore ? (\n                  <InView\n                    root={scrollableRef.current}\n                    rootMargin={`0px 0px ${screen.height * 1.5}px 0px`}\n                    onChange={(inView) => {\n                      if (inView) {\n                        loadItems();\n                      }\n                    }}\n                  >\n                    <button\n                      type=\"button\"\n                      class=\"plain block\"\n                      onClick={() => loadItems()}\n                      style={{ marginBlockEnd: '6em' }}\n                    >\n                      <Trans>Show moreโ€ฆ</Trans>\n                    </button>\n                  </InView>\n                ) : (\n                  <p class=\"ui-state insignificant\">\n                    <Trans>The end.</Trans>\n                  </p>\n                ))}\n            </>\n          ) : uiState === 'loading' ? (\n            <ul class=\"timeline\">\n              {Array.from({ length: 5 }).map((_, i) =>\n                view === 'media' ? (\n                  <div\n                    style={{\n                      height: '50vh',\n                    }}\n                  />\n                ) : (\n                  <li key={i}>\n                    <Status skeleton mediaFirst={mediaFirst} />\n                  </li>\n                ),\n              )}\n            </ul>\n          ) : (\n            uiState !== 'error' &&\n            uiState !== 'start' && <p class=\"ui-state\">{emptyText}</p>\n          )}\n          {uiState === 'error' && (\n            <p class=\"ui-state\">\n              {errorText}\n              <br />\n              <br />\n              <button type=\"button\" onClick={() => loadItems(!items.length)}>\n                <Trans>Try again</Trans>\n              </button>\n            </p>\n          )}\n        </div>\n      </div>\n    </FilterContext.Provider>\n  );\n}\n\nconst TimelineItem = memo(\n  ({\n    status,\n    instance,\n    useItemID,\n    // allowFilters,\n    filterContext,\n    view,\n    showFollowedTags,\n    showReplyParent,\n    mediaFirst,\n  }) => {\n    const { t } = useLingui();\n    console.debug('RENDER TimelineItem', status.id);\n    const { id: statusID, reblog, items, type, _pinned } = status;\n    if (_pinned) useItemID = false;\n    const actualStatusID = reblog?.id || statusID;\n    const url = instance\n      ? `/${instance}/s/${actualStatusID}`\n      : `/s/${actualStatusID}`;\n\n    if (items) {\n      let fItems = filteredItems(items, filterContext);\n      let title = '';\n      if (type === 'boosts') {\n        title = plural(fItems.length, {\n          one: '# Boost',\n          other: '# Boosts',\n        });\n      } else if (type === 'pinned') {\n        title = t`Pinned posts`;\n      }\n      const isCarousel = type === 'boosts' || type === 'pinned';\n      if (isCarousel) {\n        const filteredItemsIDs = new Set();\n        // Here, we don't hide filtered posts, but we sort them last\n        fItems.sort((a, b) => {\n          // if (a._filtered && !b._filtered) {\n          //   return 1;\n          // }\n          // if (!a._filtered && b._filtered) {\n          //   return -1;\n          // }\n          const aFiltered = isFiltered(a.filtered, filterContext);\n          const bFiltered = isFiltered(b.filtered, filterContext);\n          if (aFiltered) filteredItemsIDs.add(a.id);\n          if (bFiltered) filteredItemsIDs.add(b.id);\n          if (aFiltered && !bFiltered) {\n            return 1;\n          }\n          if (!aFiltered && bFiltered) {\n            return -1;\n          }\n          return 0;\n        });\n\n        if (filteredItemsIDs.size >= 2) {\n          const GROUP_SIZE = 5;\n          // If 2 or more, group filtered items into one, limit to GROUP_SIZE in a group\n          const unfiltered = [];\n          const filtered = [];\n          fItems.forEach((item) => {\n            if (filteredItemsIDs.has(item.id)) {\n              filtered.push(item);\n            } else {\n              unfiltered.push(item);\n            }\n          });\n          const filteredItems = [];\n          for (let i = 0; i < filtered.length; i += GROUP_SIZE) {\n            filteredItems.push({\n              _grouped: true,\n              posts: filtered.slice(i, i + GROUP_SIZE),\n            });\n          }\n          fItems = unfiltered.concat(filteredItems);\n        }\n\n        return (\n          <li key={`timeline-${statusID}`} class=\"timeline-item-carousel\">\n            <StatusCarousel title={title} class={`${type}-carousel`}>\n              {fItems.map((item) => {\n                const { id: statusID, reblog, _pinned, _grouped } = item;\n                if (_grouped) {\n                  return (\n                    <li key={statusID} class=\"timeline-item-carousel-group\">\n                      {item.posts.map((item) => {\n                        const { id: statusID, reblog, _pinned } = item;\n                        const actualStatusID = reblog?.id || statusID;\n                        const url = instance\n                          ? `/${instance}/s/${actualStatusID}`\n                          : `/s/${actualStatusID}`;\n                        if (_pinned) useItemID = false;\n                        return (\n                          <Link\n                            class=\"status-carousel-link timeline-item-alt\"\n                            to={url}\n                          >\n                            {useItemID ? (\n                              <Status\n                                statusID={statusID}\n                                instance={instance}\n                                size=\"s\"\n                              />\n                            ) : (\n                              <Status\n                                status={item}\n                                instance={instance}\n                                size=\"s\"\n                              />\n                            )}\n                          </Link>\n                        );\n                      })}\n                    </li>\n                  );\n                }\n\n                const actualStatusID = reblog?.id || statusID;\n                const url = instance\n                  ? `/${instance}/s/${actualStatusID}`\n                  : `/s/${actualStatusID}`;\n                if (_pinned) useItemID = false;\n                return (\n                  <li key={statusID}>\n                    <Link\n                      class=\"status-carousel-link timeline-item-alt\"\n                      to={url}\n                    >\n                      {useItemID ? (\n                        <Status\n                          statusID={statusID}\n                          instance={instance}\n                          size=\"s\"\n                          contentTextWeight\n                          enableCommentHint\n                          // allowFilters={allowFilters}\n                          mediaFirst={mediaFirst}\n                        />\n                      ) : (\n                        <Status\n                          status={item}\n                          instance={instance}\n                          size=\"s\"\n                          contentTextWeight\n                          enableCommentHint\n                          // allowFilters={allowFilters}\n                          mediaFirst={mediaFirst}\n                        />\n                      )}\n                    </Link>\n                  </li>\n                );\n              })}\n            </StatusCarousel>\n          </li>\n        );\n      }\n      const manyItems = fItems.length > 3;\n      return fItems.map((item, i) => {\n        const { id: statusID, _differentAuthor } = item;\n        const url = instance ? `/${instance}/s/${statusID}` : `/s/${statusID}`;\n        const isMiddle = i > 0 && i < fItems.length - 1;\n        const isSpoiler = item.sensitive && !!item.spoilerText;\n        const showCompact =\n          (!_differentAuthor && isSpoiler && i > 0) ||\n          (manyItems &&\n            isMiddle &&\n            (type === 'thread' ||\n              (type === 'conversation' &&\n                !_differentAuthor &&\n                !fItems[i - 1]._differentAuthor &&\n                !fItems[i + 1]._differentAuthor)));\n        const isStart = i === 0;\n        const isEnd = i === fItems.length - 1;\n        return (\n          <li\n            key={`timeline-${statusID}`}\n            class={`timeline-item-container timeline-item-container-type-${type} timeline-item-container-${\n              isStart ? 'start' : isEnd ? 'end' : 'middle'\n            } ${_differentAuthor ? 'timeline-item-diff-author' : ''}`}\n          >\n            <Link class=\"status-link timeline-item\" to={url}>\n              {showCompact ? (\n                <TimelineStatusCompact\n                  status={item}\n                  instance={instance}\n                  filterContext={filterContext}\n                />\n              ) : useItemID ? (\n                <Status\n                  statusID={statusID}\n                  instance={instance}\n                  enableCommentHint={isEnd}\n                  showFollowedTags={showFollowedTags}\n                  // allowFilters={allowFilters}\n                />\n              ) : (\n                <Status\n                  status={item}\n                  instance={instance}\n                  enableCommentHint={isEnd}\n                  showFollowedTags={showFollowedTags}\n                  // allowFilters={allowFilters}\n                />\n              )}\n            </Link>\n          </li>\n        );\n      });\n    }\n\n    const itemKey = `timeline-${statusID + _pinned}`;\n\n    if (view === 'media') {\n      return useItemID ? (\n        <MediaPost\n          class=\"timeline-item\"\n          parent=\"li\"\n          key={itemKey}\n          statusID={statusID}\n          instance={instance}\n          // allowFilters={allowFilters}\n        />\n      ) : (\n        <MediaPost\n          class=\"timeline-item\"\n          parent=\"li\"\n          key={itemKey}\n          status={status}\n          instance={instance}\n          // allowFilters={allowFilters}\n        />\n      );\n    }\n\n    return (\n      <li key={itemKey}>\n        <Link class=\"status-link timeline-item\" to={url}>\n          {useItemID ? (\n            <Status\n              statusID={statusID}\n              instance={instance}\n              enableCommentHint\n              showFollowedTags={showFollowedTags}\n              showReplyParent={showReplyParent}\n              // allowFilters={allowFilters}\n              mediaFirst={mediaFirst}\n            />\n          ) : (\n            <Status\n              status={status}\n              instance={instance}\n              enableCommentHint\n              showFollowedTags={showFollowedTags}\n              showReplyParent={showReplyParent}\n              // allowFilters={allowFilters}\n              mediaFirst={mediaFirst}\n            />\n          )}\n        </Link>\n      </li>\n    );\n  },\n  (oldProps, newProps) => {\n    const oldID = (oldProps.status?.id || '').toString();\n    const newID = (newProps.status?.id || '').toString();\n    return (\n      oldID === newID &&\n      oldProps.instance === newProps.instance &&\n      oldProps.view === newProps.view\n    );\n  },\n);\n\nfunction StatusCarousel({ title, class: className, children }) {\n  const { t } = useLingui();\n  const carouselRef = useRef();\n  // const { reachStart, reachEnd, init } = useScroll({\n  //   scrollableRef: carouselRef,\n  //   direction: 'horizontal',\n  // });\n  const startButtonRef = useRef();\n  const endButtonRef = useRef();\n  // useScrollFn(\n  //   {\n  //     scrollableRef: carouselRef,\n  //     direction: 'horizontal',\n  //     init: true,\n  //   },\n  //   ({ reachStart, reachEnd }) => {\n  //     if (startButtonRef.current) startButtonRef.current.disabled = reachStart;\n  //     if (endButtonRef.current) endButtonRef.current.disabled = reachEnd;\n  //   },\n  //   [],\n  // );\n  // useEffect(() => {\n  //   init?.();\n  // }, []);\n\n  const [render, setRender] = useState(false);\n  useEffect(() => {\n    setTimeout(() => {\n      setRender(true);\n    }, 1);\n  }, []);\n\n  return (\n    <div class={`status-carousel ${className}`}>\n      <header>\n        <h3>{title}</h3>\n        <span>\n          <button\n            ref={startButtonRef}\n            type=\"button\"\n            class=\"small plain2\"\n            // disabled={reachStart}\n            onClick={() => {\n              const left =\n                Math.min(320, carouselRef.current?.offsetWidth) *\n                (isRTL() ? 1 : -1);\n              carouselRef.current?.scrollBy({\n                left,\n                behavior: 'smooth',\n              });\n            }}\n          >\n            <Icon icon=\"chevron-left\" alt={t`Previous`} />\n          </button>{' '}\n          <button\n            ref={endButtonRef}\n            type=\"button\"\n            class=\"small plain2\"\n            // disabled={reachEnd}\n            onClick={() => {\n              const left =\n                Math.min(320, carouselRef.current?.offsetWidth) *\n                (isRTL() ? -1 : 1);\n              carouselRef.current?.scrollBy({\n                left,\n                behavior: 'smooth',\n              });\n            }}\n          >\n            <Icon icon=\"chevron-right\" alt={t`Next`} />\n          </button>\n        </span>\n      </header>\n      <ul ref={carouselRef}>\n        <InView\n          class=\"status-carousel-beacon\"\n          onChange={(inView) => {\n            if (startButtonRef.current)\n              startButtonRef.current.disabled = inView;\n          }}\n        />\n        {children[0]}\n        {render && children.slice(1)}\n        <InView\n          class=\"status-carousel-beacon\"\n          onChange={(inView) => {\n            if (endButtonRef.current) endButtonRef.current.disabled = inView;\n          }}\n        />\n      </ul>\n    </div>\n  );\n}\n\nfunction TimelineStatusCompact({ status, instance, filterContext }) {\n  const { t } = useLingui();\n  const snapStates = useSnapshot(states);\n  const { id, visibility, language } = status;\n  const statusPeekText = statusPeek(status);\n  const sKey = statusKey(id, instance);\n  const filterInfo = isFiltered(status.filtered, filterContext);\n  return (\n    <article\n      class={`status compact-thread ${\n        visibility === 'direct' ? 'visibility-direct' : ''\n      }`}\n      tabindex=\"-1\"\n    >\n      {!!snapStates.statusThreadNumber[sKey] ? (\n        <div class=\"status-thread-badge\">\n          <Icon icon=\"thread\" size=\"s\" alt={t`Thread`} />\n          {snapStates.statusThreadNumber[sKey]\n            ? ` ${snapStates.statusThreadNumber[sKey]}/X`\n            : ''}\n        </div>\n      ) : (\n        <div class=\"status-thread-badge\">\n          <Icon icon=\"thread\" size=\"s\" alt={t`Thread`} />\n        </div>\n      )}\n      <div\n        class=\"content-compact\"\n        title={statusPeekText}\n        lang={language}\n        dir=\"auto\"\n      >\n        {!!filterInfo ? (\n          <b\n            class=\"status-filtered-badge badge-meta horizontal\"\n            title={filterInfo?.titlesStr || ''}\n          >\n            {filterInfo?.titlesStr ? (\n              <Trans>\n                <span>Filtered</span>: <span>{filterInfo.titlesStr}</span>\n              </Trans>\n            ) : (\n              <span>\n                <Trans>Filtered</Trans>\n              </span>\n            )}\n          </b>\n        ) : (\n          <>\n            {statusPeekText}\n            {status.sensitive && status.spoilerText && (\n              <>\n                {' '}\n                <span class=\"spoiler-badge\">\n                  <Icon icon=\"eye-close\" size=\"s\" alt={t`Content warning`} />\n                </span>\n              </>\n            )}\n          </>\n        )}\n      </div>\n    </article>\n  );\n}\n\nfunction inBackground() {\n  return !!document.querySelector('.deck-backdrop, #modal-container > *');\n}\n\nexport default Timeline;\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { MenuItem } from '@szhsin/react-menu';\nimport {\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'preact/hooks';\nimport punycode from 'punycode/';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport AccountInfo from '../components/account-info';\nimport EmojiText from '../components/emoji-text';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Menu2 from '../components/menu2';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport pmem from '../utils/pmem';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus } from '../utils/states';\nimport { isMediaFirstInstance } from '../utils/store-utils';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\nconst MIN_YEAR = 1983;\nconst MIN_YEAR_MONTH = `${MIN_YEAR}-01`; // Birth of the Internet\n\nconst supportsInputMonth = (() => {\n  try {\n    const input = document.createElement('input');\n    input.setAttribute('type', 'month');\n    return input.type === 'month';\n  } catch (e) {\n    return false;\n  }\n})();\n\nasync function _isSearchEnabled(instance) {\n  const { masto } = api({ instance });\n  const results = await masto.v2.search.fetch({\n    q: 'from:me',\n    type: 'statuses',\n    limit: 1,\n  });\n  return !!results?.statuses?.length;\n}\nconst isSearchEnabled = pmem(_isSearchEnabled);\n\nfunction AccountStatuses() {\n  const { i18n, t } = useLingui();\n  const snapStates = useSnapshot(states);\n  const { id, ...params } = useParams();\n  const [searchParams, setSearchParams] = useSearchParams();\n  const month = searchParams.get('month');\n  const excludeReplies = !searchParams.get('replies');\n  const excludeBoosts = !!searchParams.get('boosts');\n  const tagged = searchParams.get('tagged');\n  const media = !!searchParams.get('media');\n  const { masto, instance, authenticated } = api({ instance: params.instance });\n  const { masto: currentMasto, instance: currentInstance } = api();\n  const accountStatusesIterator = useRef();\n\n  const allSearchParams = [month, excludeReplies, excludeBoosts, tagged, media];\n  const [account, setAccount] = useState();\n  const searchOffsetRef = useRef(0);\n  useEffect(() => {\n    searchOffsetRef.current = 0;\n  }, allSearchParams);\n\n  const mediaFirst = useMemo(() => isMediaFirstInstance(), []);\n\n  const sameCurrentInstance = useMemo(\n    () => instance === currentInstance,\n    [instance, currentInstance],\n  );\n  const [searchEnabled, setSearchEnabled] = useState(false);\n  useEffect(() => {\n    // Only enable for current logged-in instance\n    // Most remote instances don't allow unauthenticated searches\n    if (!sameCurrentInstance) return;\n    if (!account?.acct) return;\n    (async () => {\n      const enabled = await isSearchEnabled(instance);\n      console.log({ enabled });\n      setSearchEnabled(enabled);\n    })();\n  }, [instance, sameCurrentInstance, account?.acct]);\n\n  async function fetchAccountStatuses(firstLoad) {\n    const isValidMonth = /^\\d{4}-[01]\\d$/.test(month);\n    const isValidYear = month?.split?.('-')?.[0] >= MIN_YEAR;\n    if (isValidMonth && isValidYear) {\n      if (!account) {\n        return {\n          value: [],\n          done: true,\n        };\n      }\n      const [_year, _month] = month.split('-');\n      const monthIndex = parseInt(_month, 10) - 1;\n      // YYYY-MM (no day)\n      // Search options:\n      // - from:account\n      // - after:YYYY-MM-DD (non-inclusive)\n      // - before:YYYY-MM-DD (non-inclusive)\n\n      // Last day of previous month\n      const after = new Date(_year, monthIndex, 0);\n      const afterStr = `${after.getFullYear()}-${(after.getMonth() + 1)\n        .toString()\n        .padStart(2, '0')}-${after.getDate().toString().padStart(2, '0')}`;\n      // First day of next month\n      const before = new Date(_year, monthIndex + 1, 1);\n      const beforeStr = `${before.getFullYear()}-${(before.getMonth() + 1)\n        .toString()\n        .padStart(2, '0')}-${before.getDate().toString().padStart(2, '0')}`;\n      console.log({\n        month,\n        _year,\n        _month,\n        monthIndex,\n        after,\n        before,\n        afterStr,\n        beforeStr,\n      });\n\n      let limit;\n      if (firstLoad) {\n        limit = LIMIT + 1;\n        searchOffsetRef.current = 0;\n      } else {\n        limit = LIMIT + searchOffsetRef.current + 1;\n        searchOffsetRef.current += LIMIT;\n      }\n\n      const searchResults = await masto.v2.search.fetch({\n        q: `from:${account.acct} after:${afterStr} before:${beforeStr}`,\n        type: 'statuses',\n        limit,\n        offset: searchOffsetRef.current,\n      });\n      if (searchResults?.statuses?.length) {\n        const value = searchResults.statuses.slice(0, LIMIT);\n        value.forEach((item) => {\n          saveStatus(item, instance);\n        });\n        const done = searchResults.statuses.length <= LIMIT;\n        return { value, done };\n      } else {\n        return { value: [], done: true };\n      }\n    }\n\n    let results = [];\n    if (firstLoad) {\n      const { value } = await masto.v1.accounts\n        .$select(id)\n        .statuses.list({\n          pinned: true,\n        })\n        .next();\n      if (value?.length && !tagged && !media) {\n        const pinnedStatuses = value.map((status) => {\n          saveStatus(status, instance);\n          return {\n            ...status,\n            _pinned: true,\n          };\n        });\n        if (pinnedStatuses.length >= 3) {\n          const pinnedStatusesIds = pinnedStatuses.map((status) => status.id);\n          results.push({\n            id: pinnedStatusesIds,\n            items: pinnedStatuses,\n            type: 'pinned',\n          });\n        } else {\n          results.push(...pinnedStatuses);\n        }\n      }\n    }\n    if (firstLoad || !accountStatusesIterator.current) {\n      accountStatusesIterator.current = masto.v1.accounts\n        .$select(id)\n        .statuses.list({\n          limit: LIMIT,\n          exclude_replies: excludeReplies,\n          exclude_reblogs: excludeBoosts,\n          only_media: media || undefined,\n          tagged,\n        });\n    }\n    const { value, done } = await accountStatusesIterator.current.next();\n    if (value?.length) {\n      // Check if value is same as pinned post (results)\n      // If the index for every post is the same, means API might not support pinned posts\n      if (results.length) {\n        let pinnedStatusesIds = [];\n        if (results[0]?.type === 'pinned') {\n          pinnedStatusesIds = results[0].id;\n        } else {\n          pinnedStatusesIds = results\n            .filter((status) => status._pinned)\n            .map((status) => status.id);\n        }\n        const containsAllPinned = pinnedStatusesIds.every((postId) =>\n          value.some((status) => status.id === postId),\n        );\n        if (containsAllPinned) {\n          // Remove pinned posts\n          results = [];\n        }\n      }\n\n      results.push(...value);\n\n      value.forEach((item) => {\n        saveStatus(item, instance);\n      });\n    }\n    return {\n      value: results,\n      done,\n    };\n  }\n\n  const [featuredTags, setFeaturedTags] = useState([]);\n  let title = t`Account posts`;\n  if (account?.acct) {\n    const acctDisplay = (/@/.test(account.acct) ? '' : '@') + account.acct;\n    const accountDisplay = account?.displayName\n      ? `${account.displayName} (${acctDisplay})`\n      : `${acctDisplay}`;\n    if (!excludeReplies) {\n      title = t`${accountDisplay} (+ Replies)`;\n    } else if (excludeBoosts) {\n      title = t`${accountDisplay} (- Boosts)`;\n    } else if (tagged) {\n      title = t`${accountDisplay} (#${tagged})`;\n    } else if (media) {\n      title = t`${accountDisplay} (Media)`;\n    } else if (month) {\n      const monthYear = new Date(month).toLocaleString(i18n.locale, {\n        month: 'long',\n        year: 'numeric',\n      });\n      title = t`${accountDisplay} (${monthYear})`;\n    } else {\n      title = accountDisplay;\n    }\n  }\n  useTitle(title, '/:instance?/a/:id');\n\n  const fetchAccountPromiseRef = useRef();\n  const fetchAccount = useCallback(() => {\n    const fetchPromise =\n      fetchAccountPromiseRef.current || masto.v1.accounts.$select(id).fetch();\n    fetchAccountPromiseRef.current = fetchPromise;\n    return fetchPromise;\n  }, [id, masto]);\n\n  useEffect(() => {\n    (async () => {\n      try {\n        const acc = await fetchAccount();\n        console.log(acc);\n        setAccount(acc);\n      } catch (e) {\n        console.error(e);\n      }\n      // No need, because the whole filter bar is hidden\n      // TODO: Revisit this\n      if (!mediaFirst) {\n        try {\n          const featuredTags = await masto.v1.accounts\n            .$select(id)\n            .featuredTags.list();\n          console.log({ featuredTags });\n          setFeaturedTags(featuredTags);\n        } catch (e) {\n          console.error(e);\n        }\n      }\n    })();\n  }, [id, mediaFirst]);\n\n  const { displayName, acct, emojis } = account || {};\n\n  const filterBarRef = useRef();\n  const TimelineStart = useMemo(() => {\n    const filtered =\n      !excludeReplies || excludeBoosts || tagged || media || !!month;\n    const cachedAccount = snapStates.accounts[`${id}@${instance}`];\n\n    return (\n      <>\n        <AccountInfo\n          instance={instance}\n          account={cachedAccount || id}\n          fetchAccount={fetchAccount}\n          authenticated={authenticated}\n          standalone\n        />\n        {!mediaFirst && (\n          <div\n            class=\"filter-bar\"\n            ref={filterBarRef}\n            style={{\n              position: 'relative',\n            }}\n          >\n            {filtered ? (\n              <Link\n                to={`/${instance}/a/${id}`}\n                class=\"insignificant filter-clear\"\n                title={t`Clear filters`}\n                key=\"clear-filters\"\n              >\n                <Icon icon=\"x\" size=\"l\" alt={t`Clear`} />\n              </Link>\n            ) : (\n              <Icon\n                icon=\"filter\"\n                class=\"insignificant\"\n                size=\"l\"\n                alt={t`Filters`}\n              />\n            )}\n            <Link\n              to={`/${instance}/a/${id}${excludeReplies ? '?replies=1' : ''}`}\n              onClick={() => {\n                if (excludeReplies) {\n                  showToast(t`Showing post with replies`);\n                }\n              }}\n              class={excludeReplies ? '' : 'is-active'}\n            >\n              <Trans>+ Replies</Trans>\n            </Link>\n            <Link\n              to={`/${instance}/a/${id}${excludeBoosts ? '' : '?boosts=0'}`}\n              onClick={() => {\n                if (!excludeBoosts) {\n                  showToast(t`Showing posts without boosts`);\n                }\n              }}\n              class={!excludeBoosts ? '' : 'is-active'}\n            >\n              <Trans>- Boosts</Trans>\n            </Link>\n            <Link\n              to={`/${instance}/a/${id}${media ? '' : '?media=1'}`}\n              onClick={() => {\n                if (!media) {\n                  showToast(t`Showing posts with media`);\n                }\n              }}\n              class={media ? 'is-active' : ''}\n            >\n              <Trans>Media</Trans>\n            </Link>\n            {featuredTags.map((tag) => (\n              <Link\n                key={tag.id}\n                to={`/${instance}/a/${id}${\n                  tagged === tag.name\n                    ? ''\n                    : `?tagged=${encodeURIComponent(tag.name)}`\n                }`}\n                onClick={() => {\n                  if (tagged !== tag.name) {\n                    showToast(t`Showing posts tagged with #${tag.name}`);\n                  }\n                }}\n                class={tagged === tag.name ? 'is-active' : ''}\n              >\n                <span>\n                  <span class=\"more-insignificant\">#</span>\n                  {tag.name}\n                </span>\n                {\n                  // The count differs based on instance ๐Ÿ˜…\n                }\n                {/* <span class=\"filter-count\">{tag.statusesCount}</span> */}\n              </Link>\n            ))}\n            {searchEnabled &&\n              (supportsInputMonth ? (\n                <label class={`filter-field ${month ? 'is-active' : ''}`}>\n                  <Icon icon=\"month\" size=\"l\" />\n                  <input\n                    type=\"month\"\n                    disabled={!account?.acct}\n                    value={month || ''}\n                    min={MIN_YEAR_MONTH}\n                    max={new Date().toISOString().slice(0, 7)}\n                    onInput={(e) => {\n                      const { value, validity } = e.currentTarget;\n                      if (!validity.valid) return;\n                      setSearchParams(\n                        value\n                          ? {\n                              month: value,\n                            }\n                          : {},\n                      );\n                      const [year, month] = value.split('-');\n                      const monthIndex = parseInt(month, 10) - 1;\n                      const date = new Date(year, monthIndex);\n                      showToast(\n                        t`Showing posts in ${date.toLocaleString(i18n.locale, {\n                          month: 'long',\n                          year: 'numeric',\n                        })}`,\n                      );\n                    }}\n                  />\n                </label>\n              ) : (\n                // Fallback to <select> for month and <input type=\"number\"> for year\n                <MonthPicker\n                  class={`filter-field ${month ? 'is-active' : ''}`}\n                  disabled={!account?.acct}\n                  value={month || ''}\n                  min={MIN_YEAR_MONTH}\n                  max={new Date().toISOString().slice(0, 7)}\n                  onInput={(e) => {\n                    const { value, validity } = e;\n                    if (!validity.valid) return;\n                    setSearchParams(\n                      value\n                        ? {\n                            month: value,\n                          }\n                        : {},\n                    );\n                  }}\n                />\n              ))}\n          </div>\n        )}\n      </>\n    );\n  }, [\n    id,\n    instance,\n    authenticated,\n    featuredTags,\n    fetchAccount,\n    searchEnabled,\n    ...allSearchParams,\n  ]);\n\n  useEffect(() => {\n    // Focus on .is-active\n    const active = filterBarRef.current?.querySelector('.is-active');\n    if (active) {\n      console.log('active', active, active.offsetLeft);\n      filterBarRef.current.scrollTo({\n        behavior: 'smooth',\n        left:\n          active.offsetLeft -\n          (filterBarRef.current.offsetWidth - active.offsetWidth) / 2,\n      });\n    }\n  }, [featuredTags, searchEnabled, ...allSearchParams]);\n\n  const accountInstance = useMemo(() => {\n    if (!account?.url) return null;\n    const domain = URL.parse(account.url).hostname;\n    return domain;\n  }, [account]);\n  const sameInstance = instance === accountInstance;\n  const allowSwitch = !!account && !sameInstance;\n\n  return (\n    <Timeline\n      key={id}\n      title={`${account?.acct ? '@' + account.acct : t`Posts`}`}\n      titleComponent={\n        <h1\n          class=\"header-double-lines header-account\"\n          // onClick={() => {\n          //   states.showAccount = {\n          //     account,\n          //     instance,\n          //   };\n          // }}\n        >\n          <b>\n            <EmojiText text={displayName} emojis={emojis} />\n          </b>\n          <div>\n            <span class=\"bidi-isolate\">@{acct}</span>\n          </div>\n        </h1>\n      }\n      id=\"account-statuses\"\n      instance={instance}\n      emptyText={t`Nothing to see here yet.`}\n      errorText={t`Unable to load posts`}\n      fetchItems={fetchAccountStatuses}\n      useItemID\n      view={media || mediaFirst ? 'media' : undefined}\n      boostsCarousel={snapStates.settings.boostsCarousel}\n      timelineStart={TimelineStart}\n      refresh={[\n        excludeReplies,\n        excludeBoosts,\n        tagged,\n        media,\n        month + account?.acct,\n      ].toString()}\n      headerEnd={\n        <Menu2\n          portal\n          // setDownOverflow\n          overflow=\"auto\"\n          viewScroll=\"close\"\n          position=\"anchor\"\n          menuButton={\n            <button type=\"button\" class=\"plain\">\n              <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n            </button>\n          }\n        >\n          <MenuItem\n            disabled={!allowSwitch}\n            onClick={() => {\n              (async () => {\n                try {\n                  const { masto } = api({\n                    instance: accountInstance,\n                  });\n                  const acc = await masto.v1.accounts.lookup({\n                    acct: account.acct,\n                  });\n                  const { id } = acc;\n                  location.hash = `/${accountInstance}/a/${id}`;\n                } catch (e) {\n                  console.error(e);\n                  alert(t`Unable to fetch account info`);\n                }\n              })();\n            }}\n          >\n            <Icon icon=\"transfer\" />{' '}\n            <small class=\"menu-double-lines\">\n              <Trans>\n                Switch to account's instance{' '}\n                {accountInstance ? (\n                  <>\n                    {' '}\n                    (<b>{punycode.toUnicode(accountInstance)}</b>)\n                  </>\n                ) : null}\n              </Trans>\n            </small>\n          </MenuItem>\n          {!sameCurrentInstance && (\n            <MenuItem\n              onClick={() => {\n                (async () => {\n                  try {\n                    const acc = await currentMasto.v1.accounts.lookup({\n                      acct: account.acct + '@' + instance,\n                    });\n                    const { id } = acc;\n                    location.hash = `/${currentInstance}/a/${id}`;\n                  } catch (e) {\n                    console.error(e);\n                    alert(t`Unable to fetch account info`);\n                  }\n                })();\n              }}\n            >\n              <Icon icon=\"transfer\" />{' '}\n              <small class=\"menu-double-lines\">\n                <Trans>\n                  Switch to my instance (<b>{currentInstance}</b>)\n                </Trans>\n              </small>\n            </MenuItem>\n          )}\n        </Menu2>\n      }\n    />\n  );\n}\n\nfunction MonthPicker(props) {\n  const { i18n } = useLingui();\n  const {\n    class: className,\n    disabled,\n    value,\n    min,\n    max,\n    onInput = () => {},\n  } = props;\n  const [_year, _month] = value?.split('-') || [];\n  const monthFieldRef = useRef();\n  const yearFieldRef = useRef();\n\n  const checkValidity = (month, year) => {\n    const [minYear, minMonth] = min?.split('-') || [];\n    const [maxYear, maxMonth] = max?.split('-') || [];\n    if (year < minYear) return false;\n    if (year > maxYear) return false;\n    if (year === minYear && month < minMonth) return false;\n    if (year === maxYear && month > maxMonth) return false;\n    return true;\n  };\n\n  return (\n    <div class={className}>\n      <Icon icon=\"month\" size=\"l\" />\n      <select\n        ref={monthFieldRef}\n        disabled={disabled}\n        value={_month || ''}\n        onInput={(e) => {\n          const { value: month } = e.currentTarget;\n          const year = yearFieldRef.current.value;\n          if (!checkValidity(month, year))\n            return {\n              value: '',\n              validity: {\n                valid: false,\n              },\n            };\n          onInput({\n            value: month ? `${year}-${month}` : '',\n            validity: {\n              valid: true,\n            },\n          });\n        }}\n      >\n        <option value=\"\">\n          <Trans>Month</Trans>\n        </option>\n        <option disabled>-----</option>\n        {Array.from({ length: 12 }, (_, i) => (\n          <option\n            value={\n              // Month is 1-indexed\n              (i + 1).toString().padStart(2, '0')\n            }\n            key={i}\n          >\n            {new Date(0, i).toLocaleString(i18n.locale, {\n              month: 'long',\n            })}\n          </option>\n        ))}\n      </select>{' '}\n      <input\n        ref={yearFieldRef}\n        type=\"number\"\n        disabled={disabled}\n        value={_year || new Date().getFullYear()}\n        min={min?.slice(0, 4) || MIN_YEAR}\n        max={max?.slice(0, 4) || new Date().getFullYear()}\n        onInput={(e) => {\n          const { value: year, validity } = e.currentTarget;\n          const month = monthFieldRef.current.value;\n          if (!validity.valid || !checkValidity(month, year))\n            return {\n              value: '',\n              validity: {\n                valid: false,\n              },\n            };\n          onInput({\n            value: year ? `${year}-${month}` : '',\n            validity: {\n              valid: true,\n            },\n          });\n        }}\n        style={{\n          width: '4.5em',\n        }}\n      />\n    </div>\n  );\n}\n\nexport default AccountStatuses;\n","import './annual-report.css';\n\nimport { Trans } from '@lingui/react/macro';\nimport { useEffect, useState } from 'preact/hooks';\nimport { useParams } from 'react-router-dom';\n\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport NameText from '../components/name-text';\nimport Status from '../components/status';\nimport { api } from '../utils/api';\nimport useTitle from '../utils/useTitle';\n\nexport default function AnnualReport() {\n  const params = useParams();\n  const { year } = params;\n  useTitle(year ? `Annual Report: ${year}` : 'Annual Report');\n  const { masto, instance } = api();\n  const [results, setResults] = useState(null);\n  const [uiState, setUIState] = useState('default');\n\n  useEffect(() => {\n    if (year) {\n      (async () => {\n        setUIState('loading');\n        const results = await masto.v1.annualReports.$select(year).fetch();\n        console.log('REPORT', results);\n        setResults(results);\n        setUIState('default');\n      })();\n    }\n  }, [year]);\n\n  const { accounts, annualReports, statuses } = results || {};\n  const report = annualReports?.find((report) => report.year == year)?.data;\n\n  const datePlaceholder = new Date();\n\n  return (\n    <div id=\"annual-report-page\" class=\"deck-container\" tabIndex=\"-1\">\n      <div class=\"report\">\n        <h1>{year} #Wrapstodon</h1>\n        {uiState === 'loading' && (\n          <p>\n            <Loader abrupt /> <Trans>Loadingโ€ฆ</Trans>\n          </p>\n        )}\n        {!!report && (\n          <dl>\n            {Object.entries(report).map(([key, value]) => (\n              <>\n                <dt>{key}</dt>\n                <dd class={`report-${key}`}>\n                  {Array.isArray(value) ? (\n                    <table>\n                      <thead>\n                        <tr>\n                          {Object.entries(value[0]).map(([key, value]) => (\n                            <th\n                              class={\n                                key !== 'month' && typeof value === 'number'\n                                  ? 'number'\n                                  : ''\n                              }\n                            >\n                              {key}\n                            </th>\n                          ))}\n                        </tr>\n                      </thead>\n                      <tbody>\n                        {value.map((item) => (\n                          <tr>\n                            {Object.entries(item).map(([k, value]) => (\n                              <td\n                                class={\n                                  k !== 'month' && typeof value === 'number'\n                                    ? 'number'\n                                    : ''\n                                }\n                              >\n                                {value &&\n                                /(accountId)/i.test(k) &&\n                                /^(mostRebloggedAccounts|commonlyInteractedWithAccounts)$/i.test(\n                                  key,\n                                ) ? (\n                                  <NameText\n                                    account={accounts?.find(\n                                      (a) => a.id === value,\n                                    )}\n                                    showAvatar\n                                  />\n                                ) : k === 'month' ? (\n                                  datePlaceholder.setMonth(value - 1) &&\n                                  datePlaceholder.toLocaleString(undefined, {\n                                    month: 'long',\n                                  })\n                                ) : typeof value === 'number' ? (\n                                  value.toLocaleString()\n                                ) : (\n                                  value\n                                )}\n                              </td>\n                            ))}\n                          </tr>\n                        ))}\n                      </tbody>\n                    </table>\n                  ) : typeof value === 'object' ? (\n                    /^(topStatuses)$/i.test(key) ? (\n                      <dl>\n                        {Object.entries(value).map(([k, value]) => (\n                          <>\n                            <dt>{k}</dt>\n                            <dd>\n                              {value && (\n                                <Link to={`/${instance}/s/${value}`}>\n                                  <Status\n                                    status={statuses?.find(\n                                      (s) => s.id === value,\n                                    )}\n                                    size=\"s\"\n                                    readOnly\n                                  />\n                                </Link>\n                              )}\n                            </dd>\n                          </>\n                        ))}\n                      </dl>\n                    ) : (\n                      <table>\n                        <tbody>\n                          {Object.entries(value).map(([k, value]) => (\n                            <tr>\n                              <th>{k}</th>\n                              <td\n                                class={\n                                  typeof value === 'number' ? 'number' : ''\n                                }\n                              >\n                                {value}\n                              </td>\n                            </tr>\n                          ))}\n                        </tbody>\n                      </table>\n                    )\n                  ) : typeof value === 'string' ? (\n                    value\n                  ) : (\n                    // Last resort\n                    JSON.stringify(value, null, 2)\n                  )}\n                </dd>\n              </>\n            ))}\n          </dl>\n        )}\n      </div>\n      <hr />\n      <p style={{ textAlign: 'center' }}>\n        <Link to=\"/\">\n          <Trans>Go home</Trans>\n        </Link>\n      </p>\n    </div>\n  );\n}\n","import { useLingui } from '@lingui/react/macro';\nimport { useRef } from 'preact/hooks';\n\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction Bookmarks() {\n  const { t } = useLingui();\n  useTitle(t`Bookmarks`, '/bookmarks');\n  const { masto, instance } = api();\n  const bookmarksIterator = useRef();\n  async function fetchBookmarks(firstLoad) {\n    if (firstLoad || !bookmarksIterator.current) {\n      bookmarksIterator.current = masto.v1.bookmarks.list({ limit: LIMIT });\n    }\n    return await bookmarksIterator.current.next();\n  }\n\n  return (\n    <Timeline\n      title={t`Bookmarks`}\n      id=\"bookmarks\"\n      emptyText={t`No bookmarks yet. Go bookmark something!`}\n      errorText={t`Unable to load bookmarks.`}\n      instance={instance}\n      fetchItems={fetchBookmarks}\n    />\n  );\n}\n\nexport default Bookmarks;\n","export default \"__VITE_ASSET__S_9SYp01__\"","import '../components/links-bar.css';\nimport './catchup.css';\n\nimport autoAnimate from '@formkit/auto-animate';\nimport { msg, select } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n  useCallback,\n  useEffect,\n  useMemo,\n  useReducer,\n  useRef,\n  useState,\n} from 'preact/hooks';\nimport punycode from 'punycode/';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useSearchParams } from 'react-router-dom';\nimport { uid } from 'uid/single';\n\nimport catchupUrl from '../assets/features/catch-up.png';\n\nimport Avatar from '../components/avatar';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport Modal from '../components/modal';\nimport NameText from '../components/name-text';\nimport NavMenu from '../components/nav-menu';\nimport RelativeTime from '../components/relative-time';\nimport { api } from '../utils/api';\nimport { oklab2rgb, rgb2oklab } from '../utils/color-utils';\nimport db from '../utils/db';\nimport emojifyText from '../utils/emojify-text';\nimport { isFiltered } from '../utils/filters';\nimport htmlContentLength from '../utils/html-content-length';\nimport mem from '../utils/mem';\nimport niceDateTime from '../utils/nice-date-time';\nimport shortenNumber from '../utils/shorten-number';\nimport showToast from '../utils/show-toast';\nimport states, { statusKey } from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport store from '../utils/store';\nimport { getCurrentAccountID, getCurrentAccountNS } from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport { assignFollowedTags } from '../utils/timeline-utils';\nimport useTitle from '../utils/useTitle';\n\nconst FILTER_CONTEXT = 'home';\n\nconst RANGES = [\n  { label: msg`last 1 hour`, value: 1 },\n  { label: msg`last 2 hours`, value: 2 },\n  { label: msg`last 3 hours`, value: 3 },\n  { label: msg`last 4 hours`, value: 4 },\n  { label: msg`last 5 hours`, value: 5 },\n  { label: msg`last 6 hours`, value: 6 },\n  { label: msg`last 7 hours`, value: 7 },\n  { label: msg`last 8 hours`, value: 8 },\n  { label: msg`last 9 hours`, value: 9 },\n  { label: msg`last 10 hours`, value: 10 },\n  { label: msg`last 11 hours`, value: 11 },\n  { label: msg`last 12 hours`, value: 12 },\n  { label: msg`beyond 12 hours`, value: 13 },\n];\n\nconst FILTER_KEYS = {\n  original: msg`Original`,\n  replies: msg`Replies`,\n  boosts: msg`Boosts`,\n  followedTags: msg`Followed tags`,\n  groups: msg`Groups`,\n  filtered: msg`Filtered`,\n};\nconst FILTER_SORTS = [\n  'createdAt',\n  'repliesCount',\n  'favouritesCount',\n  'reblogsCount',\n  'density',\n];\nconst FILTER_GROUPS = [null, 'account'];\n\nconst DTF = mem(\n  (locale) =>\n    new Intl.DateTimeFormat(locale || undefined, {\n      year: 'numeric',\n      month: 'short',\n      day: 'numeric',\n      hour: 'numeric',\n      minute: 'numeric',\n    }),\n);\n\nfunction Catchup() {\n  const { i18n, _, t } = useLingui();\n  const dtf = DTF(i18n.locale);\n\n  useTitle(`Catch-up`, '/catchup');\n  const { masto, instance } = api();\n  const [searchParams, setSearchParams] = useSearchParams();\n  const id = searchParams.get('id');\n  const [uiState, setUIState] = useState('start');\n  const [showTopLinks, setShowTopLinks] = useState(false);\n\n  const currentAccount = useMemo(() => {\n    return getCurrentAccountID();\n  }, []);\n  const isSelf = (accountID) => accountID === currentAccount;\n\n  const supportsPixelfed = supports('@pixelfed/home-include-reblogs');\n\n  async function fetchHome({ maxCreatedAt }) {\n    const maxCreatedAtDate = maxCreatedAt ? new Date(maxCreatedAt) : null;\n    console.debug('fetchHome', maxCreatedAtDate);\n    const allResults = [];\n    const homeIterator = masto.v1.timelines.home.list({ limit: 40 });\n    mainloop: while (true) {\n      try {\n        if (supportsPixelfed && homeIterator.nextParams) {\n          if (typeof homeIterator.nextParams === 'string') {\n            homeIterator.nextParams += '&include_reblogs=true';\n          } else {\n            homeIterator.nextParams.include_reblogs = true;\n          }\n        }\n        const results = await homeIterator.next();\n        const { value } = results;\n        if (value?.length) {\n          // This ignores maxCreatedAt filter, but it's ok for now\n          await assignFollowedTags(value, instance);\n          let addedResults = false;\n          for (let i = 0; i < value.length; i++) {\n            const item = value[i];\n            const createdAtDate = new Date(item.createdAt);\n            if (!maxCreatedAtDate || createdAtDate >= maxCreatedAtDate) {\n              // Filtered\n              const selfPost = isSelf(\n                item.reblog?.account?.id || item.account.id,\n              );\n              const filterInfo =\n                !selfPost &&\n                isFiltered(\n                  item.reblog?.filtered || item.filtered,\n                  FILTER_CONTEXT,\n                );\n              if (filterInfo?.action === 'hide') continue;\n              item._filtered = filterInfo;\n\n              // Followed tags\n              const sKey = statusKey(item.id, instance);\n              item._followedTags = states.statusFollowedTags[sKey]\n                ? [...states.statusFollowedTags[sKey]]\n                : [];\n\n              allResults.push(item);\n              addedResults = true;\n            } else {\n              // Don't immediately stop, still add the other items that might still be within range\n              // break mainloop;\n            }\n            // Only stop when ALL items are outside of range\n            if (!addedResults) {\n              break mainloop;\n            }\n          }\n        } else {\n          break mainloop;\n        }\n        // Pause 1s\n        await new Promise((resolve) => setTimeout(resolve, 1000));\n      } catch (e) {\n        console.error(e);\n        break mainloop;\n      }\n    }\n\n    // Post-process all results\n    // 1. Threadify - tag 1st-post in a thread\n    allResults.forEach((status) => {\n      if (status?.inReplyToId) {\n        const replyToStatus = allResults.find(\n          (s) => s.id === status.inReplyToId,\n        );\n        if (replyToStatus && !replyToStatus.inReplyToId) {\n          replyToStatus._thread = true;\n        }\n      }\n    });\n\n    return allResults;\n  }\n\n  const [posts, setPosts] = useState([]);\n  const catchupRangeRef = useRef();\n  const catchupLastRef = useRef();\n  const NS = useMemo(() => getCurrentAccountNS(), []);\n  const handleCatchupClick = useCallback(async ({ duration } = {}) => {\n    const now = Date.now();\n    const maxCreatedAt = duration ? now - duration : null;\n    setUIState('loading');\n    const results = await fetchHome({ maxCreatedAt });\n    // Namespaced by account ID\n    // Possible conflict if ID matches between different accounts from different instances\n    const catchupID = `${NS}-${uid()}`;\n    try {\n      await db.catchup.set(catchupID, {\n        id: catchupID,\n        posts: results,\n        count: results.length,\n        startAt: maxCreatedAt,\n        endAt: now,\n      });\n      setSearchParams({ id: catchupID });\n    } catch (e) {\n      console.error(e, results);\n    }\n  }, []);\n\n  useEffect(() => {\n    if (id) {\n      (async () => {\n        const catchup = await db.catchup.get(id);\n        if (catchup) {\n          catchup.posts.sort((a, b) => (a.createdAt > b.createdAt ? 1 : -1));\n          setPosts(catchup.posts);\n          setUIState('results');\n        }\n      })();\n    } else if (uiState === 'results') {\n      setPosts([]);\n      setUIState('start');\n    }\n  }, [id]);\n\n  const [reloadCatchupsCount, reloadCatchups] = useReducer((c) => c + 1, 0);\n  const [lastCatchupEndAt, setLastCatchupEndAt] = useState(null);\n  const [prevCatchups, setPrevCatchups] = useState([]);\n  useEffect(() => {\n    (async () => {\n      try {\n        const catchups = await db.catchup.keys();\n        if (catchups.length) {\n          const ns = getCurrentAccountNS();\n          const ownKeys = catchups.filter((key) => key.startsWith(`${ns}-`));\n          if (ownKeys.length) {\n            let ownCatchups = await db.catchup.getMany(ownKeys);\n            ownCatchups.sort((a, b) => b.endAt - a.endAt);\n\n            // Split to 1st 3 last catchups, and the rest\n            let lastCatchups = ownCatchups.slice(0, 3);\n            let restCatchups = ownCatchups.slice(3);\n\n            const trimmedCatchups = lastCatchups.map((c) => {\n              const { id, count, startAt, endAt } = c;\n              return {\n                id,\n                count,\n                startAt,\n                endAt,\n              };\n            });\n            setPrevCatchups(trimmedCatchups);\n            setLastCatchupEndAt(lastCatchups[0].endAt);\n\n            // GC time\n            ownCatchups = null;\n            lastCatchups = null;\n\n            queueMicrotask(() => {\n              if (restCatchups.length) {\n                // delete them\n                db.catchup\n                  .delMany(restCatchups.map((c) => c.id))\n                  .then(() => {\n                    // GC time\n                    restCatchups = null;\n                  })\n                  .catch((e) => {\n                    console.error(e);\n                  });\n              }\n            });\n\n            return;\n          }\n        }\n      } catch (e) {\n        console.error(e);\n      }\n      setPrevCatchups([]);\n    })();\n  }, [reloadCatchupsCount]);\n  useEffect(() => {\n    if (uiState === 'start') {\n      reloadCatchups();\n    }\n  }, [uiState === 'start']);\n\n  const [filterCounts, links] = useMemo(() => {\n    let filtered = 0,\n      groups = 0,\n      boosts = 0,\n      replies = 0,\n      followedTags = 0,\n      original = 0;\n    const links = {};\n    for (const post of posts) {\n      if (post._filtered) {\n        filtered++;\n        post.__FILTER = 'filtered';\n      } else if (post.group) {\n        groups++;\n        post.__FILTER = 'groups';\n      } else if (post.reblog) {\n        boosts++;\n        post.__FILTER = 'boosts';\n      } else if (post._followedTags?.length) {\n        followedTags++;\n        post.__FILTER = 'followedTags';\n      } else if (\n        post.inReplyToId &&\n        post.inReplyToAccountId !== post.account?.id\n      ) {\n        replies++;\n        post.__FILTER = 'replies';\n      } else {\n        original++;\n        post.__FILTER = 'original';\n      }\n\n      const thePost = post.reblog || post;\n      if (\n        post.__FILTER !== 'filtered' &&\n        thePost.card?.url &&\n        thePost.card?.image &&\n        thePost.card?.type === 'link'\n      ) {\n        const { card, favouritesCount, reblogsCount } = thePost;\n        let { url } = card;\n        url = url.replace(/\\/$/, '');\n        if (!links[url]) {\n          links[url] = {\n            postID: thePost.id,\n            card,\n            shared: 1,\n            sharers: [post.account],\n            likes: favouritesCount,\n            boosts: reblogsCount,\n          };\n        } else {\n          if (links[url].sharers.find((a) => a.id === post.account.id)) {\n            continue;\n          }\n          links[url].shared++;\n          links[url].sharers.push(post.account);\n          if (links[url].postID !== thePost.id) {\n            links[url].likes += favouritesCount;\n            links[url].boosts += reblogsCount;\n          }\n        }\n      }\n    }\n\n    let topLinks = [];\n    for (const link in links) {\n      topLinks.push({\n        url: link,\n        ...links[link],\n      });\n    }\n    topLinks.sort((a, b) => {\n      if (a.shared > b.shared) return -1;\n      if (a.shared < b.shared) return 1;\n      if (a.boosts > b.boosts) return -1;\n      if (a.boosts < b.boosts) return 1;\n      if (a.likes > b.likes) return -1;\n      if (a.likes < b.likes) return 1;\n      return 0;\n    });\n\n    // Slice links to shared > 1 but min 10 links\n    if (topLinks.length > 10) {\n      linksLoop: for (let i = 10; i < topLinks.length; i++) {\n        const { shared } = topLinks[i];\n        if (shared <= 1) {\n          topLinks = topLinks.slice(0, i);\n          break linksLoop;\n        }\n      }\n    }\n\n    return [\n      {\n        filtered,\n        groups,\n        boosts,\n        replies,\n        followedTags,\n        original,\n      },\n      topLinks,\n    ];\n  }, [posts]);\n\n  const [selectedFilterCategory, setSelectedFilterCategory] = useState('all');\n  const [selectedAuthor, setSelectedAuthor] = useState(null);\n\n  const [range, setRange] = useState(1);\n\n  const [sortBy, setSortBy] = useState('createdAt');\n  const [sortOrder, setSortOrder] = useState('asc');\n  const [groupBy, setGroupBy] = useState(null);\n\n  const [filteredPosts, authors, authorCounts] = useMemo(() => {\n    const authorsHash = {};\n    const authorCountsMap = new Map();\n\n    let filteredPosts = posts.filter((post) => {\n      const postFilterMatches =\n        selectedFilterCategory === 'all' ||\n        post.__FILTER === selectedFilterCategory;\n\n      if (postFilterMatches) {\n        authorsHash[post.account.id] = post.account;\n        authorCountsMap.set(\n          post.account.id,\n          (authorCountsMap.get(post.account.id) || 0) + 1,\n        );\n      }\n\n      return postFilterMatches;\n    });\n\n    // Deduplicate boosts\n    const boostedPosts = {};\n    filteredPosts.forEach((post) => {\n      if (post.reblog) {\n        if (boostedPosts[post.reblog.id]) {\n          if (boostedPosts[post.reblog.id].__BOOSTERS) {\n            boostedPosts[post.reblog.id].__BOOSTERS.add(post.account);\n          } else {\n            boostedPosts[post.reblog.id].__BOOSTERS = new Set([post.account]);\n          }\n          post.__HIDDEN = true;\n        } else {\n          boostedPosts[post.reblog.id] = post;\n        }\n      }\n    });\n\n    if (selectedAuthor && authorCountsMap.has(selectedAuthor)) {\n      filteredPosts = filteredPosts.filter(\n        (post) =>\n          post.account.id === selectedAuthor ||\n          [...(post.__BOOSTERS || [])].find((a) => a.id === selectedAuthor),\n      );\n    }\n\n    return [filteredPosts, authorsHash, Object.fromEntries(authorCountsMap)];\n  }, [selectedFilterCategory, selectedAuthor, posts]);\n\n  const filteredPostsMap = useMemo(() => {\n    const map = {};\n    filteredPosts.forEach((post) => {\n      map[post.id] = post;\n    });\n    return map;\n  }, [filteredPosts]);\n\n  const authorCountsList = useMemo(\n    () =>\n      Object.keys(authorCounts).sort(\n        (a, b) => authorCounts[b] - authorCounts[a],\n      ),\n    [authorCounts],\n  );\n\n  const sortedFilteredPosts = useMemo(() => {\n    const authorIndices = {};\n    authorCountsList.forEach((authorID, index) => {\n      authorIndices[authorID] = index;\n    });\n    return filteredPosts\n      .filter((post) => !post.__HIDDEN)\n      .sort((a, b) => {\n        if (groupBy === 'account') {\n          const aAccountID = a.account.id;\n          const bAccountID = b.account.id;\n          const aIndex = authorIndices[aAccountID];\n          const bIndex = authorIndices[bAccountID];\n          const order = aIndex - bIndex;\n          if (order !== 0) {\n            return order;\n          }\n        }\n        if (sortBy !== 'createdAt') {\n          a = a.reblog || a;\n          b = b.reblog || b;\n          if (sortBy !== 'density' && a[sortBy] === b[sortBy]) {\n            return a.createdAt > b.createdAt ? 1 : -1;\n          }\n        }\n        if (sortBy === 'density') {\n          const aDensity = postDensity(a);\n          const bDensity = postDensity(b);\n          if (sortOrder === 'asc') {\n            return aDensity > bDensity ? 1 : -1;\n          } else {\n            return bDensity > aDensity ? 1 : -1;\n          }\n        }\n        if (sortOrder === 'asc') {\n          return a[sortBy] > b[sortBy] ? 1 : -1;\n        } else {\n          return b[sortBy] > a[sortBy] ? 1 : -1;\n        }\n      });\n  }, [filteredPosts, sortBy, sortOrder, groupBy, authorCountsList]);\n\n  const prevGroup = useRef(null);\n\n  const authorsListParent = useRef(null);\n  const autoAnimated = useRef(false);\n  useEffect(() => {\n    if (posts.length > 100 || autoAnimated.current) return;\n    if (authorsListParent.current) {\n      autoAnimate(authorsListParent.current, {\n        duration: 200,\n      });\n      autoAnimated.current = true;\n    }\n  }, [posts, authorsListParent]);\n\n  const postsBarType = posts.length > 160 ? '3d' : '2d';\n\n  const postsBar = useMemo(() => {\n    if (postsBarType !== '2d') return null;\n    return posts.map((post) => {\n      // If part of filteredPosts\n      const isFiltered = filteredPostsMap[post.id];\n      return (\n        <span\n          key={post.id}\n          class={`post-dot ${isFiltered ? 'post-dot-highlight' : ''}`}\n        />\n      );\n    });\n  }, [filteredPostsMap]);\n\n  const postsBins = useMemo(() => {\n    if (postsBarType !== '3d') return null;\n    if (!posts?.length) return null;\n    const bins = binByTime(posts, 'createdAt', 320);\n    return bins.map((posts, i) => {\n      return (\n        <div class=\"posts-bin\" key={i}>\n          {posts.map((post) => {\n            const isFiltered = filteredPostsMap[post.id];\n            return (\n              <span\n                key={post.id}\n                class={`post-dot ${isFiltered ? 'post-dot-highlight' : ''}`}\n              />\n            );\n          })}\n        </div>\n      );\n    });\n  }, [filteredPostsMap]);\n\n  const scrollableRef = useRef(null);\n\n  // if range value exceeded lastCatchupEndAt, show error\n  const lastCatchupRange = useMemo(() => {\n    // return hour, not ms\n    if (!lastCatchupEndAt) return null;\n    return (Date.now() - lastCatchupEndAt) / 1000 / 60 / 60;\n  }, [lastCatchupEndAt, range]);\n\n  useEffect(() => {\n    if (uiState !== 'results') return;\n    const authorUsername =\n      selectedAuthor && authors[selectedAuthor]\n        ? authors[selectedAuthor].username\n        : '';\n    const sortOrderIndex = sortOrder === 'asc' ? 0 : 1;\n    const groupByText = {\n      account: 'authors',\n    };\n    let toast = showToast({\n      duration: 5_000, // 5 seconds\n      // Note: I'm sorry, translators\n      text: t`Showing ${select(selectedFilterCategory, {\n        all: 'all posts',\n        original: 'original posts',\n        replies: 'replies',\n        boosts: 'boosts',\n        followedTags: 'followed tags',\n        groups: 'groups',\n        filtered: 'filtered posts',\n      })}, ${select(sortBy, {\n        createdAt: select(sortOrder, {\n          asc: 'oldest',\n          desc: 'latest',\n        }),\n        reblogsCount: select(sortOrder, {\n          asc: 'fewest boosts',\n          desc: 'most boosts',\n        }),\n        favouritesCount: select(sortOrder, {\n          asc: 'fewest likes',\n          desc: 'most likes',\n        }),\n        repliesCount: select(sortOrder, {\n          asc: 'fewest replies',\n          desc: 'most replies',\n        }),\n        density: select(sortOrder, { asc: 'least dense', desc: 'most dense' }),\n      })} first${select(groupBy, {\n        account: ', grouped by authors',\n        other: '',\n      })}`,\n    });\n    return () => {\n      toast?.hideToast?.();\n    };\n  }, [\n    uiState,\n    selectedFilterCategory,\n    selectedAuthor,\n    sortBy,\n    sortOrder,\n    groupBy,\n    authors,\n  ]);\n\n  useEffect(() => {\n    if (selectedAuthor) {\n      if (authors[selectedAuthor]) {\n        // Check if author is visible and within the scrollable area viewport\n        const authorElement = authorsListParent.current.querySelector(\n          `[data-author=\"${selectedAuthor}\"]`,\n        );\n        const scrollableRect =\n          authorsListParent.current?.getBoundingClientRect();\n        const authorRect = authorElement?.getBoundingClientRect();\n        console.log({\n          sLeft: scrollableRect.left,\n          sRight: scrollableRect.right,\n          aLeft: authorRect.left,\n          aRight: authorRect.right,\n        });\n        if (\n          authorRect.left < scrollableRect.left ||\n          authorRect.right > scrollableRect.right\n        ) {\n          authorElement.scrollIntoView({\n            block: 'nearest',\n            inline: 'center',\n            behavior: 'smooth',\n          });\n        } else if (authorRect.top < 0) {\n          authorElement.scrollIntoView({\n            block: 'nearest',\n            inline: 'nearest',\n            behavior: 'smooth',\n          });\n        }\n      }\n    }\n  }, [selectedAuthor, authors]);\n\n  const [showHelp, setShowHelp] = useState(false);\n\n  const itemsSelector = '.catchup-list > li > a';\n  const jRef = useHotkeys(\n    'j',\n    () => {\n      const activeItem = document.activeElement.closest(itemsSelector);\n      const activeItemRect = activeItem?.getBoundingClientRect();\n      const allItems = Array.from(\n        scrollableRef.current.querySelectorAll(itemsSelector),\n      );\n      if (\n        activeItem &&\n        activeItemRect.top < scrollableRef.current.clientHeight &&\n        activeItemRect.bottom > 0\n      ) {\n        const activeItemIndex = allItems.indexOf(activeItem);\n        const nextItem = allItems[activeItemIndex + 1];\n        if (nextItem) {\n          nextItem.focus();\n          nextItem.scrollIntoView({\n            block: 'center',\n            inline: 'center',\n            behavior: 'smooth',\n          });\n        }\n      } else {\n        const topmostItem = allItems.find((item) => {\n          const itemRect = item.getBoundingClientRect();\n          return itemRect.top >= 0;\n        });\n        if (topmostItem) {\n          topmostItem.focus();\n          topmostItem.scrollIntoView({\n            block: 'nearest',\n            inline: 'center',\n            behavior: 'smooth',\n          });\n        }\n      }\n    },\n    {\n      preventDefault: true,\n      ignoreModifiers: true,\n    },\n  );\n\n  const kRef = useHotkeys(\n    'k',\n    () => {\n      const activeItem = document.activeElement.closest(itemsSelector);\n      const activeItemRect = activeItem?.getBoundingClientRect();\n      const allItems = Array.from(\n        scrollableRef.current.querySelectorAll(itemsSelector),\n      );\n      if (\n        activeItem &&\n        activeItemRect.top < scrollableRef.current.clientHeight &&\n        activeItemRect.bottom > 0\n      ) {\n        const activeItemIndex = allItems.indexOf(activeItem);\n        let prevItem = allItems[activeItemIndex - 1];\n        if (prevItem) {\n          prevItem.focus();\n          prevItem.scrollIntoView({\n            block: 'center',\n            inline: 'center',\n            behavior: 'smooth',\n          });\n        }\n      } else {\n        const topmostItem = allItems.find((item) => {\n          const itemRect = item.getBoundingClientRect();\n          return itemRect.top >= 44 && itemRect.left >= 0;\n        });\n        if (topmostItem) {\n          topmostItem.focus();\n          topmostItem.scrollIntoView({\n            block: 'nearest',\n            inline: 'center',\n            behavior: 'smooth',\n          });\n        }\n      }\n    },\n    {\n      preventDefault: true,\n      ignoreModifiers: true,\n    },\n  );\n\n  const hlRef = useHotkeys(\n    'h, l',\n    (_, handler) => {\n      // Go next/prev selectedAuthor in authorCountsList list\n      const key = handler.keys[0];\n      if (selectedAuthor) {\n        const index = authorCountsList.indexOf(selectedAuthor);\n        if (key === 'h') {\n          if (index > 0 && index < authorCountsList.length) {\n            setSelectedAuthor(authorCountsList[index - 1]);\n            scrollableRef.current?.focus();\n          }\n        } else if (key === 'l') {\n          if (index < authorCountsList.length - 1 && index >= 0) {\n            setSelectedAuthor(authorCountsList[index + 1]);\n            scrollableRef.current?.focus();\n          }\n        }\n      } else if (key === 'l') {\n        setSelectedAuthor(authorCountsList[0]);\n        scrollableRef.current?.focus();\n      }\n    },\n    {\n      preventDefault: true,\n      ignoreModifiers: true,\n      enableOnFormTags: ['input'],\n    },\n  );\n\n  const escRef = useHotkeys(\n    'esc',\n    () => {\n      setSelectedAuthor(null);\n      scrollableRef.current?.focus();\n    },\n    {\n      preventDefault: true,\n      ignoreModifiers: true,\n      enableOnFormTags: ['input'],\n    },\n  );\n\n  const dotRef = useHotkeys(\n    '.',\n    () => {\n      scrollableRef.current?.scrollTo({\n        top: 0,\n        behavior: 'smooth',\n      });\n    },\n    {\n      preventDefault: true,\n      ignoreModifiers: true,\n      enableOnFormTags: ['input'],\n    },\n  );\n\n  const handleArrowKeys = useCallback((e) => {\n    const activeElement = document.activeElement;\n    const isRadio =\n      activeElement?.tagName === 'INPUT' && activeElement.type === 'radio';\n    const isArrowKeys =\n      e.key === 'ArrowDown' ||\n      e.key === 'ArrowUp' ||\n      e.key === 'ArrowLeft' ||\n      e.key === 'ArrowRight';\n    if (isArrowKeys && isRadio) {\n      // Note: page scroll won't trigger on first arrow key press due to this. Subsequent presses will.\n      activeElement.blur();\n      return;\n    }\n  }, []);\n\n  return (\n    <div\n      ref={(node) => {\n        scrollableRef.current = node;\n        jRef(node);\n        kRef(node);\n        hlRef(node);\n        escRef(node);\n      }}\n      id=\"catchup-page\"\n      class=\"deck-container\"\n      tabIndex=\"-1\"\n    >\n      <div class=\"timeline-deck deck wide\">\n        <header\n          class={`${uiState === 'loading' ? 'loading' : ''}`}\n          onClick={(e) => {\n            if (!e.target.closest('a, button')) {\n              scrollableRef.current?.scrollTo({\n                top: 0,\n                behavior: 'smooth',\n              });\n            }\n          }}\n        >\n          <div class=\"header-grid\">\n            <div class=\"header-side\">\n              <NavMenu />\n              {uiState === 'results' && (\n                <Link to=\"/catchup\" class=\"button plain\">\n                  <Icon icon=\"history2\" size=\"l\" alt={t`Catch-up`} />\n                </Link>\n              )}\n              {uiState === 'start' && (\n                <Link to=\"/\" class=\"button plain\">\n                  <Icon icon=\"home\" size=\"l\" alt={t`Home`} />\n                </Link>\n              )}\n            </div>\n            <h1>\n              {uiState !== 'start' && (\n                <Trans>\n                  Catch-up <sup>beta</sup>\n                </Trans>\n              )}\n            </h1>\n            <div class=\"header-side\">\n              {uiState !== 'start' && uiState !== 'loading' && (\n                <button\n                  type=\"button\"\n                  class=\"plain\"\n                  onClick={() => {\n                    setShowHelp(true);\n                  }}\n                >\n                  <Trans>Help</Trans>\n                </button>\n              )}\n            </div>\n          </div>\n        </header>\n        <main onKeyDown={handleArrowKeys}>\n          {uiState === 'start' && (\n            <div class=\"catchup-start\">\n              <h1>\n                <Trans>\n                  Catch-up <sup>beta</sup>\n                </Trans>\n              </h1>\n              <details>\n                <summary>\n                  <Trans>What is this?</Trans>\n                </summary>\n                <p>\n                  <Trans>\n                    Catch-up is a separate timeline for your followings,\n                    offering a high-level view at a glance, with a simple,\n                    email-inspired interface to effortlessly sort and filter\n                    through posts.\n                  </Trans>\n                </p>\n                <img\n                  src={catchupUrl}\n                  width=\"1200\"\n                  height=\"900\"\n                  alt={t`Preview of Catch-up UI`}\n                />\n                <p>\n                  <button\n                    type=\"button\"\n                    onClick={(e) => {\n                      e.target.closest('details').open = false;\n                    }}\n                  >\n                    <Trans>Let's catch up</Trans>\n                  </button>\n                </p>\n              </details>\n              <p>\n                <Trans>Let's catch up on the posts from your followings.</Trans>\n              </p>\n              <p>\n                <b>\n                  <Trans>Show me all posts fromโ€ฆ</Trans>\n                </b>\n              </p>\n              <div class=\"catchup-form\">\n                <input\n                  ref={catchupRangeRef}\n                  type=\"range\"\n                  value={range}\n                  min={RANGES[0].value}\n                  max={RANGES[RANGES.length - 1].value}\n                  step=\"1\"\n                  list=\"catchup-ranges\"\n                  onChange={(e) => setRange(+e.target.value)}\n                />{' '}\n                <span\n                  style={{\n                    width: '8em',\n                  }}\n                >\n                  {_(RANGES[range - 1].label)}\n                  <br />\n                  <small class=\"insignificant\">\n                    {range == RANGES[RANGES.length - 1].value\n                      ? t`until the max`\n                      : niceDateTime(\n                          new Date(Date.now() - range * 60 * 60 * 1000),\n                        )}\n                  </small>\n                </span>\n                <datalist id=\"catchup-ranges\">\n                  {RANGES.map(({ label, value }) => (\n                    <option value={value} label={_(label)} />\n                  ))}\n                </datalist>{' '}\n                <button\n                  type=\"button\"\n                  onClick={() => {\n                    if (range < RANGES[RANGES.length - 1].value) {\n                      let duration;\n                      if (\n                        range === RANGES[RANGES.length - 1].value &&\n                        catchupLastRef.current?.checked\n                      ) {\n                        duration = Date.now() - lastCatchupEndAt;\n                      } else {\n                        duration = range * 60 * 60 * 1000;\n                      }\n                      handleCatchupClick({ duration });\n                    } else {\n                      handleCatchupClick();\n                    }\n                  }}\n                >\n                  <Trans>Catch up</Trans>\n                </button>\n              </div>\n              {lastCatchupRange && range > lastCatchupRange ? (\n                <p class=\"catchup-info\">\n                  <Icon icon=\"info\" />{' '}\n                  <Trans>Overlaps with your last catch-up</Trans>\n                </p>\n              ) : range === RANGES[RANGES.length - 1].value &&\n                lastCatchupEndAt ? (\n                <p class=\"catchup-info\">\n                  <label>\n                    <input\n                      type=\"checkbox\"\n                      switch\n                      checked\n                      ref={catchupLastRef}\n                    />{' '}\n                    <Trans>\n                      Until the last catch-up (\n                      {dtf.format(new Date(lastCatchupEndAt))})\n                    </Trans>\n                  </label>\n                </p>\n              ) : null}\n              <p class=\"insignificant\">\n                <small>\n                  <Trans>\n                    Note: your instance might only show a maximum of 800 posts\n                    in the Home timeline regardless of the time range. Could be\n                    less or more.\n                  </Trans>\n                </small>\n              </p>\n              {!!prevCatchups?.length && (\n                <div class=\"catchup-prev\">\n                  <p>\n                    <Trans>Previouslyโ€ฆ</Trans>\n                  </p>\n                  <ul>\n                    {prevCatchups.map((pc) => (\n                      <li key={pc.id}>\n                        <Link to={`/catchup?id=${pc.id}`}>\n                          <Icon icon=\"history2\" />{' '}\n                          <span>\n                            {pc.startAt\n                              ? dtf.formatRange(\n                                  new Date(pc.startAt),\n                                  new Date(pc.endAt),\n                                )\n                              : `โ€ฆโ€‰โ€“โ€‰${dtf.format(new Date(pc.endAt))}`}\n                          </span>\n                        </Link>{' '}\n                        <span>\n                          <small class=\"ib insignificant\">\n                            <Plural\n                              value={pc.count}\n                              one=\"# post\"\n                              other=\"# posts\"\n                            />\n                          </small>{' '}\n                          <button\n                            type=\"button\"\n                            class=\"light danger small\"\n                            onClick={async () => {\n                              const yes = confirm(t`Remove this catch-up?`);\n                              if (yes) {\n                                let st = showToast(\n                                  t`Removing Catch-up ${pc.id}`,\n                                );\n                                await db.catchup.del(pc.id);\n                                st?.hideToast?.();\n                                showToast(t`Catch-up ${pc.id} removed`);\n                                reloadCatchups();\n                              }\n                            }}\n                          >\n                            <Icon icon=\"x\" alt={t`Remove`} />\n                          </button>\n                        </span>\n                      </li>\n                    ))}\n                  </ul>\n                  {prevCatchups.length >= 3 && (\n                    <p>\n                      <small>\n                        <Trans>\n                          Note: Only max 3 will be stored. The rest will be\n                          automatically removed.\n                        </Trans>\n                      </small>\n                    </p>\n                  )}\n                </div>\n              )}\n            </div>\n          )}\n          {uiState === 'loading' && (\n            <div class=\"ui-state catchup-start\">\n              <Loader abrupt />\n              <p class=\"insignificant\">\n                <Trans>Fetching postsโ€ฆ</Trans>\n              </p>\n              <p class=\"insignificant\">\n                <Trans>This might take a while.</Trans>\n              </p>\n            </div>\n          )}\n          {uiState === 'results' && (\n            <>\n              <div class=\"catchup-header\">\n                {posts.length > 0 && (\n                  <p>\n                    <b class=\"ib\">\n                      {dtf.formatRange(\n                        new Date(posts[0].createdAt),\n                        new Date(posts[posts.length - 1].createdAt),\n                      )}\n                    </b>\n                  </p>\n                )}\n                <aside>\n                  <button\n                    hidden={\n                      selectedFilterCategory === 'all' &&\n                      !selectedAuthor &&\n                      sortBy === 'createdAt' &&\n                      sortOrder === 'asc'\n                    }\n                    type=\"button\"\n                    class=\"plain4 small\"\n                    onClick={() => {\n                      setSelectedFilterCategory('all');\n                      setSelectedAuthor(null);\n                      setSortBy('createdAt');\n                      setGroupBy(null);\n                      setSortOrder('asc');\n                    }}\n                  >\n                    <Trans>Reset filters</Trans>\n                  </button>\n                  {links?.length > 0 && (\n                    <button\n                      type=\"button\"\n                      class=\"plain small\"\n                      onClick={() => setShowTopLinks(!showTopLinks)}\n                    >\n                      <Trans>Top links</Trans>{' '}\n                      <Icon\n                        icon=\"chevron-down\"\n                        style={{\n                          transform: showTopLinks\n                            ? 'rotate(180deg)'\n                            : 'rotate(0deg)',\n                        }}\n                      />\n                    </button>\n                  )}\n                </aside>\n              </div>\n              <div class=\"shazam-container no-animation\" hidden={!showTopLinks}>\n                <div class=\"shazam-container-inner\">\n                  <div class=\"catchup-top-links links-bar\">\n                    {links.map((link) => {\n                      const { card, shared, sharers, likes, boosts } = link;\n                      const {\n                        blurhash,\n                        title,\n                        description,\n                        url,\n                        image,\n                        imageDescription,\n                        language,\n                        width,\n                        height,\n                        publishedAt,\n                      } = card;\n                      const domain = punycode.toUnicode(\n                        URL.parse(url)\n                          .hostname.replace(/^www\\./, '')\n                          .replace(/\\/$/, ''),\n                      );\n                      let accentColor;\n                      if (blurhash) {\n                        const averageColor = getBlurHashAverageColor(blurhash);\n                        const labAverageColor = rgb2oklab(averageColor);\n                        accentColor = oklab2rgb([\n                          0.6,\n                          labAverageColor[1],\n                          labAverageColor[2],\n                        ]);\n                      }\n\n                      return (\n                        <a\n                          key={url}\n                          href={url}\n                          target=\"_blank\"\n                          rel=\"noopener noreferrer\"\n                          class=\"link-block\"\n                          style={\n                            accentColor\n                              ? {\n                                  '--accent-color': `rgb(${accentColor.join(\n                                    ',',\n                                  )})`,\n                                  '--accent-alpha-color': `rgba(${accentColor.join(\n                                    ',',\n                                  )}, 0.4)`,\n                                }\n                              : {}\n                          }\n                        >\n                          <article>\n                            <figure>\n                              <img\n                                src={image}\n                                alt={imageDescription}\n                                width={width}\n                                height={height}\n                                loading=\"lazy\"\n                              />\n                            </figure>\n                            <div class=\"article-body\">\n                              <header>\n                                <div class=\"article-meta\">\n                                  <span class=\"domain\">{domain}</span>{' '}\n                                  {!!publishedAt && <>&middot; </>}\n                                  {!!publishedAt && (\n                                    <>\n                                      <RelativeTime\n                                        datetime={publishedAt}\n                                        format=\"micro\"\n                                      />\n                                    </>\n                                  )}\n                                </div>\n                                {!!title && (\n                                  <h1\n                                    class=\"title\"\n                                    lang={language}\n                                    dir=\"auto\"\n                                    title={title}\n                                  >\n                                    {title}\n                                  </h1>\n                                )}\n                              </header>\n                              {!!description && (\n                                <p\n                                  class=\"description\"\n                                  lang={language}\n                                  dir=\"auto\"\n                                  title={description}\n                                >\n                                  {description}\n                                </p>\n                              )}\n                              <hr />\n                              <p\n                                style={{\n                                  whiteSpace: 'nowrap',\n                                }}\n                              >\n                                <Trans>\n                                  Shared by{' '}\n                                  {sharers.map((s) => {\n                                    const { avatarStatic, displayName } = s;\n                                    return (\n                                      <button\n                                        type=\"button\"\n                                        class=\"plain\"\n                                        style={{\n                                          padding: 0,\n                                        }}\n                                        onClick={(e) => {\n                                          e.preventDefault();\n                                          e.stopPropagation();\n                                          // Reset and filter to author\n                                          const { id } = s;\n                                          setSelectedAuthor(id);\n                                          setSelectedFilterCategory('all');\n                                        }}\n                                      >\n                                        <Avatar\n                                          url={avatarStatic}\n                                          size=\"s\"\n                                          alt={displayName}\n                                        />\n                                      </button>\n                                    );\n                                  })}\n                                </Trans>\n                              </p>\n                            </div>\n                          </article>\n                        </a>\n                      );\n                    })}\n                  </div>\n                </div>\n              </div>\n              {posts.length >= 5 &&\n                (postsBarType === '3d' ? (\n                  <div class=\"catchup-posts-viz-time-bar\">{postsBins}</div>\n                ) : (\n                  <div class=\"catchup-posts-viz-bar\">{postsBar}</div>\n                ))}\n              {posts.length >= 2 && (\n                <div class=\"catchup-filters\">\n                  <label class=\"filter-cat\">\n                    <input\n                      type=\"radio\"\n                      name=\"filter-cat\"\n                      checked={selectedFilterCategory.toLowerCase() === 'all'}\n                      onChange={() => {\n                        setSelectedFilterCategory('all');\n                      }}\n                    />\n                    <Trans>All</Trans> <span class=\"count\">{posts.length}</span>\n                  </label>\n                  {Object.entries(FILTER_KEYS).map(\n                    ([key, label]) =>\n                      !!filterCounts[key] && (\n                        <label\n                          class=\"filter-cat\"\n                          key={_(label)}\n                          title={\n                            ((filterCounts[key] / posts.length) * 100).toFixed(\n                              2,\n                            ) + '%'\n                          }\n                        >\n                          <input\n                            type=\"radio\"\n                            name=\"filter-cat\"\n                            checked={\n                              selectedFilterCategory.toLowerCase() ===\n                              key.toLowerCase()\n                            }\n                            onChange={() => {\n                              setSelectedFilterCategory(key);\n                              if (key === 'boosts') {\n                                setSortBy('reblogsCount');\n                                setSortOrder('desc');\n                                setGroupBy(null);\n                              }\n                              // setSelectedAuthor(null);\n                            }}\n                          />\n                          {_(label)}{' '}\n                          <span class=\"count\">{filterCounts[key]}</span>\n                        </label>\n                      ),\n                  )}\n                </div>\n              )}\n              {posts.length >= 2 && !!authorCounts && (\n                <div\n                  class=\"catchup-filters authors-filters\"\n                  ref={authorsListParent}\n                >\n                  {authorCountsList.map((author) => (\n                    <label\n                      class=\"filter-author\"\n                      data-author={author}\n                      key={`${author}-${authorCounts[author]}`}\n                      // Preact messed up the order sometimes, need additional key besides just `author`\n                      // https://github.com/preactjs/preact/issues/2849\n                    >\n                      <input\n                        type=\"radio\"\n                        name=\"filter-author\"\n                        checked={selectedAuthor === author}\n                        onChange={() => {\n                          setSelectedAuthor(author);\n                          // setGroupBy(null);\n                        }}\n                        onClick={() => {\n                          if (selectedAuthor === author) {\n                            setSelectedAuthor(null);\n                          }\n                        }}\n                      />\n                      <Avatar\n                        url={\n                          authors[author].avatarStatic || authors[author].avatar\n                        }\n                        size=\"xxl\"\n                        alt={`${authors[author].displayName} (@${authors[author].acct})`}\n                      />{' '}\n                      <span class=\"count\">{authorCounts[author]}</span>\n                      <span class=\"username\">{authors[author].username}</span>\n                    </label>\n                  ))}\n                  {authorCountsList.length > 5 && (\n                    <small\n                      key=\"authors-count\"\n                      style={{\n                        whiteSpace: 'nowrap',\n                        paddingInline: '1em',\n                        opacity: 0.33,\n                      }}\n                    >\n                      <Plural\n                        value={authorCountsList.length}\n                        one=\"# author\"\n                        other=\"# authors\"\n                      />\n                    </small>\n                  )}\n                </div>\n              )}\n              {posts.length >= 2 && (\n                <div class=\"catchup-filters\">\n                  <span class=\"filter-label\">\n                    <Trans>Sort</Trans>\n                  </span>{' '}\n                  <fieldset class=\"radio-field-group\">\n                    {FILTER_SORTS.map((key) => (\n                      <label\n                        class=\"filter-sort\"\n                        key={key}\n                        onClick={(e) => {\n                          if (sortBy === key) {\n                            e.preventDefault();\n                            e.stopPropagation();\n                            setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');\n                          }\n                        }}\n                      >\n                        <input\n                          type=\"radio\"\n                          name=\"filter-sort-cat\"\n                          checked={sortBy === key}\n                          onChange={() => {\n                            setSortBy(key);\n                            const order = /(replies|favourites|reblogs)/.test(\n                              key,\n                            )\n                              ? 'desc'\n                              : 'asc';\n                            setSortOrder(order);\n                          }}\n                        />\n                        {\n                          {\n                            createdAt: t`Date`,\n                            repliesCount: t`Replies`,\n                            favouritesCount: t`Likes`,\n                            reblogsCount: t`Boosts`,\n                            density: t`Density`,\n                          }[key]\n                        }\n                        {sortBy === key && (sortOrder === 'asc' ? ' โ†‘' : ' โ†“')}\n                      </label>\n                    ))}\n                  </fieldset>\n                  {/* <fieldset class=\"radio-field-group\">\n                    {['asc', 'desc'].map((key) => (\n                      <label class=\"filter-sort\" key={key}>\n                        <input\n                          type=\"radio\"\n                          name=\"filter-sort-dir\"\n                          checked={sortOrder === key}\n                          onChange={() => {\n                            setSortOrder(key);\n                          }}\n                        />\n                        {key === 'asc' ? 'โ†‘' : 'โ†“'}\n                      </label>\n                    ))}\n                  </fieldset> */}\n                  <span class=\"filter-label\">\n                    <Trans id=\"group.filter\">Group</Trans>\n                  </span>{' '}\n                  <fieldset class=\"radio-field-group\">\n                    {FILTER_GROUPS.map((key) => (\n                      <label class=\"filter-group\" key={key || 'none'}>\n                        <input\n                          type=\"radio\"\n                          name=\"filter-group\"\n                          checked={groupBy === key}\n                          onChange={() => {\n                            setGroupBy(key);\n                          }}\n                          disabled={key === 'account' && selectedAuthor}\n                        />\n                        {{\n                          account: t`Authors`,\n                        }[key] || t`None`}\n                      </label>\n                    ))}\n                  </fieldset>\n                  {\n                    selectedAuthor && authorCountsList.length > 1 ? (\n                      <button\n                        type=\"button\"\n                        class=\"plain6 small\"\n                        onClick={() => {\n                          setSelectedAuthor(null);\n                        }}\n                        style={{\n                          whiteSpace: 'nowrap',\n                        }}\n                      >\n                        <Trans>Show all authors</Trans>\n                      </button>\n                    ) : null\n                    // <button\n                    //   type=\"button\"\n                    //   class=\"plain4 small\"\n                    //   onClick={() => {}}\n                    // >\n                    //   Group by authors\n                    // </button>\n                  }\n                </div>\n              )}\n              <ul\n                class={`catchup-list catchup-filter-${\n                  selectedFilterCategory || ''\n                } ${sortBy ? `catchup-sort-${sortBy}` : ''} ${\n                  selectedAuthor && authors[selectedAuthor]\n                    ? `catchup-selected-author`\n                    : ''\n                } ${groupBy ? `catchup-group-${groupBy}` : ''}`}\n              >\n                {sortedFilteredPosts.map((post, i) => {\n                  const id = post.reblog?.id || post.id;\n                  let showSeparator = false;\n                  if (groupBy === 'account') {\n                    if (\n                      prevGroup.current &&\n                      post.account.id !== prevGroup.current &&\n                      i > 0\n                    ) {\n                      showSeparator = true;\n                    }\n                    prevGroup.current = post.account.id;\n                  }\n                  return (\n                    <Fragment key={`${post.id}-${showSeparator}`}>\n                      {showSeparator && <li class=\"separator\" />}\n                      <IntersectionPostLineItem\n                        to={`/${instance}/s/${id}`}\n                        post={post}\n                        root={scrollableRef.current}\n                      />\n                    </Fragment>\n                  );\n                })}\n              </ul>\n              <footer>\n                {filteredPosts.length > 5 && (\n                  <p>\n                    {selectedFilterCategory === 'boosts'\n                      ? t`You don't have to read everything.`\n                      : t`That's all.`}{' '}\n                    <button\n                      type=\"button\"\n                      class=\"textual\"\n                      onClick={() => {\n                        scrollableRef.current.scrollTop = 0;\n                      }}\n                    >\n                      <Trans>Back to top</Trans>\n                    </button>\n                    .\n                  </p>\n                )}\n              </footer>\n            </>\n          )}\n        </main>\n      </div>\n      {showHelp && (\n        <Modal onClose={() => setShowHelp(false)}>\n          <div class=\"sheet\" id=\"catchup-help-sheet\">\n            <button\n              type=\"button\"\n              class=\"sheet-close\"\n              onClick={() => setShowHelp(false)}\n            >\n              <Icon icon=\"x\" alt={t`Close`} />\n            </button>\n            <header>\n              <h2>\n                <Trans>Help</Trans>\n              </h2>\n            </header>\n            <main>\n              <dl>\n                <dt>\n                  <Trans>Top links</Trans>\n                </dt>\n                <dd>\n                  <Trans>\n                    Links shared by followings, sorted by shared counts, boosts\n                    and likes.\n                  </Trans>\n                </dd>\n                <dt>\n                  <Trans>Sort: Density</Trans>\n                </dt>\n                <dd>\n                  <Trans>\n                    Posts are sorted by information density or depth. Shorter\n                    posts are \"lighter\" while longer posts are \"heavier\". Posts\n                    with photos are \"heavier\" than posts without photos.\n                  </Trans>\n                </dd>\n                <dt>\n                  <Trans>Group: Authors</Trans>\n                </dt>\n                <dd>\n                  <Trans>\n                    Posts are grouped by authors, sorted by posts count per\n                    author.\n                  </Trans>\n                </dd>\n                <dt>\n                  <Trans>Keyboard shortcuts</Trans>\n                </dt>\n                {/* <dd>\n                  <kbd>j</kbd>: <Trans>Next post</Trans>\n                </dd>\n                <dd>\n                  <kbd>k</kbd>: <Trans>Previous post</Trans>\n                </dd>\n                <dd>\n                  <kbd>l</kbd>: <Trans>Next author</Trans>\n                </dd>\n                <dd>\n                  <kbd>h</kbd>: <Trans>Previous author</Trans>\n                </dd>\n                <dd>\n                  <kbd>Enter</kbd>: <Trans>Open post details</Trans>\n                </dd>\n                <dd>\n                  <kbd>.</kbd>: <Trans>Scroll to top</Trans>\n                </dd> */}\n                <dd>\n                  <table>\n                    <tbody>\n                      <tr>\n                        <td>\n                          <Trans>Next post</Trans>\n                        </td>\n                        <td>\n                          <kbd>j</kbd>\n                        </td>\n                      </tr>\n                      <tr>\n                        <td>\n                          <Trans>Previous post</Trans>\n                        </td>\n                        <td>\n                          <kbd>k</kbd>\n                        </td>\n                      </tr>\n                      <tr>\n                        <td>\n                          <Trans>Next author</Trans>\n                        </td>\n                        <td>\n                          <kbd>l</kbd>\n                        </td>\n                      </tr>\n                      <tr>\n                        <td>\n                          <Trans>Previous author</Trans>\n                        </td>\n                        <td>\n                          <kbd>h</kbd>\n                        </td>\n                      </tr>\n                      <tr>\n                        <td>\n                          <Trans>Open post details</Trans>\n                        </td>\n                        <td>\n                          <kbd>Enter</kbd>\n                        </td>\n                      </tr>\n                      <tr>\n                        <td>\n                          <Trans>Scroll to top</Trans>\n                        </td>\n                        <td>\n                          <kbd>.</kbd>\n                        </td>\n                      </tr>\n                    </tbody>\n                  </table>\n                </dd>\n              </dl>\n            </main>\n          </div>\n        </Modal>\n      )}\n    </div>\n  );\n}\n\nconst PostLine = memo(\n  function ({ post }) {\n    const {\n      id,\n      account,\n      group,\n      reblog,\n      inReplyToId,\n      inReplyToAccountId,\n      _followedTags: isFollowedTags,\n      _filtered: filterInfo,\n      visibility,\n      __BOOSTERS,\n    } = post;\n    const isReplyTo = inReplyToId && inReplyToAccountId !== account.id;\n    const isFiltered = !!filterInfo;\n\n    const debugHover = (e) => {\n      if (e.shiftKey) {\n        console.log({\n          ...post,\n        });\n      }\n    };\n\n    return (\n      <article\n        class={`post-line ${\n          group\n            ? 'group'\n            : reblog\n              ? 'reblog'\n              : isFollowedTags?.length\n                ? 'followed-tags'\n                : ''\n        } ${isReplyTo ? 'reply-to' : ''} ${\n          isFiltered ? 'filtered' : ''\n        } visibility-${visibility}`}\n        onMouseEnter={debugHover}\n      >\n        <span class=\"post-author\">\n          {reblog ? (\n            <span class=\"post-reblog-avatar\">\n              <Avatar\n                url={account.avatarStatic || account.avatar}\n                squircle={account.bot}\n              />\n              {__BOOSTERS?.size > 0\n                ? [...__BOOSTERS].map((b) => (\n                    <Avatar url={b.avatarStatic || b.avatar} squircle={b.bot} />\n                  ))\n                : ''}{' '}\n              <Icon icon=\"rocket\" />{' '}\n              {/* <Avatar\n              url={reblog.account.avatarStatic || reblog.account.avatar}\n              squircle={reblog.account.bot}\n            /> */}\n              <NameText account={reblog.account} showAvatar />\n            </span>\n          ) : (\n            <NameText account={account} showAvatar />\n          )}\n        </span>\n        <PostPeek post={reblog || post} filterInfo={filterInfo} />\n        <span class=\"post-meta\">\n          <PostStats post={reblog || post} />{' '}\n          <RelativeTime\n            datetime={new Date(reblog?.createdAt || post.createdAt)}\n            format=\"micro\"\n          />\n        </span>\n      </article>\n    );\n  },\n  (oldProps, newProps) => {\n    return oldProps?.post?.id === newProps?.post?.id;\n  },\n);\n\nconst IntersectionPostLineItem = ({ root, to, ...props }) => {\n  const ref = useRef();\n  const [show, setShow] = useState(false);\n  useEffect(() => {\n    const observer = new IntersectionObserver(\n      (entries) => {\n        const entry = entries[0];\n        if (entry.isIntersecting) {\n          queueMicrotask(() => setShow(true));\n          observer.unobserve(ref.current);\n        }\n      },\n      {\n        root,\n        rootMargin: `${Math.max(320, screen.height * 0.75)}px`,\n      },\n    );\n    if (ref.current) observer.observe(ref.current);\n    return () => {\n      if (ref.current) observer.unobserve(ref.current);\n    };\n  }, []);\n\n  return show ? (\n    <li>\n      <Link to={to}>\n        <PostLine {...props} />\n      </Link>\n    </li>\n  ) : (\n    <li ref={ref} style={{ height: '4em' }} />\n  );\n};\n\n// A media speak a thousand words\nconst MEDIA_DENSITY = 8;\nconst CARD_DENSITY = 8;\nfunction postDensity(post) {\n  const { spoilerText, content, poll, mediaAttachments, card } = post;\n  const pollContent = poll?.options?.length\n    ? poll.options.reduce((acc, cur) => acc + cur.title, '')\n    : '';\n  const density =\n    (spoilerText.length + htmlContentLength(content) + pollContent.length) /\n      140 +\n    (mediaAttachments?.length\n      ? MEDIA_DENSITY * mediaAttachments.length\n      : card?.image\n        ? CARD_DENSITY\n        : 0);\n  return density;\n}\n\nconst MEDIA_SIZE = 48;\n\nfunction PostPeek({ post, filterInfo }) {\n  const { t } = useLingui();\n  const {\n    spoilerText,\n    sensitive,\n    content,\n    emojis,\n    poll,\n    mediaAttachments,\n    card,\n    inReplyToId,\n    inReplyToAccountId,\n    account,\n    _thread,\n  } = post;\n  const isThread =\n    (inReplyToId && inReplyToAccountId === account.id) || !!_thread;\n\n  const readingExpandSpoilers = useMemo(() => {\n    const prefs = store.account.get('preferences') || {};\n    return !!prefs['reading:expand:spoilers'];\n  }, []);\n  // const readingExpandSpoilers = true;\n  const showMedia = readingExpandSpoilers || (!spoilerText && !sensitive);\n  const postText = content ? statusPeek(post) : '';\n\n  const showPostContent = !spoilerText || readingExpandSpoilers;\n\n  return (\n    <div class=\"post-peek\" title={!spoilerText ? postText : ''}>\n      <span class=\"post-peek-content\">\n        {isThread && !showPostContent && (\n          <>\n            <span class=\"post-peek-tag post-peek-thread\">Thread</span>{' '}\n          </>\n        )}\n        {!!filterInfo ? (\n          <span class=\"post-peek-filtered\">\n            {/* Filtered{filterInfo?.titlesStr ? `: ${filterInfo.titlesStr}` : ''} */}\n            {filterInfo?.titlesStr\n              ? t`Filtered: ${filterInfo.titlesStr}`\n              : t`Filtered`}\n          </span>\n        ) : (\n          <>\n            {!!spoilerText && (\n              <span class=\"post-peek-spoiler\">\n                <Icon\n                  icon={`${readingExpandSpoilers ? 'eye-open' : 'eye-close'}`}\n                />{' '}\n                {spoilerText}\n              </span>\n            )}\n            {showPostContent && (\n              <div class=\"post-peek-html\">\n                {isThread && (\n                  <>\n                    <span class=\"post-peek-tag post-peek-thread\">\n                      <Trans>Thread</Trans>\n                    </span>{' '}\n                  </>\n                )}\n                {!!content && (\n                  <div\n                    dangerouslySetInnerHTML={{\n                      __html: emojifyText(content, emojis),\n                    }}\n                  />\n                )}\n                {!!poll?.options?.length &&\n                  poll.options.map((o) => (\n                    <div>\n                      {poll.multiple ? 'โ–ช๏ธ' : 'โ€ข'} {o.title}\n                    </div>\n                  ))}\n                {!content &&\n                  mediaAttachments?.length === 1 &&\n                  mediaAttachments[0].description && (\n                    <>\n                      <span class=\"post-peek-tag post-peek-alt\">ALT</span>{' '}\n                      <div>{mediaAttachments[0].description}</div>\n                    </>\n                  )}\n              </div>\n            )}\n          </>\n        )}\n      </span>\n      {!filterInfo && (\n        <span class=\"post-peek-post-content\">\n          {!!poll && (\n            <span class=\"post-peek-tag post-peek-poll\">\n              <Icon icon=\"poll\" size=\"s\" />\n              <Trans>Poll</Trans>\n            </span>\n          )}\n          {!!mediaAttachments?.length\n            ? mediaAttachments.map((m) => {\n                const mediaURL = m.previewUrl || m.url;\n                const remoteMediaURL = m.previewRemoteUrl || m.remoteUrl;\n                const width = m.meta?.original\n                  ? m.meta.original.width\n                  : m.meta?.small?.width || m.meta?.original?.width;\n                const height = m.meta?.original\n                  ? m.meta.original.height\n                  : m.meta?.small?.height || m.meta?.original?.height;\n                return (\n                  <span key={m.id} class=\"post-peek-media\">\n                    {{\n                      image:\n                        (mediaURL || remoteMediaURL) && showMedia ? (\n                          <img\n                            src={mediaURL}\n                            width={MEDIA_SIZE}\n                            height={MEDIA_SIZE}\n                            alt={m.description}\n                            loading=\"lazy\"\n                            onError={(e) => {\n                              const { src } = e.target;\n                              if (src === mediaURL) {\n                                e.target.src = remoteMediaURL;\n                              }\n                            }}\n                            style={{\n                              '--anim-duration': `${Math.min(\n                                Math.max(Math.max(width, height) / 100, 5),\n                                120,\n                              )}s`,\n                            }}\n                          />\n                        ) : (\n                          <span class=\"post-peek-faux-media\">๐Ÿ–ผ</span>\n                        ),\n                      gifv:\n                        (mediaURL || remoteMediaURL) && showMedia ? (\n                          <img\n                            src={mediaURL}\n                            width={MEDIA_SIZE}\n                            height={MEDIA_SIZE}\n                            alt={m.description}\n                            loading=\"lazy\"\n                            onError={(e) => {\n                              const { src } = e.target;\n                              if (src === mediaURL) {\n                                e.target.src = remoteMediaURL;\n                              }\n                            }}\n                          />\n                        ) : (\n                          <span class=\"post-peek-faux-media\">๐ŸŽž๏ธ</span>\n                        ),\n                      video:\n                        (mediaURL || remoteMediaURL) && showMedia ? (\n                          <img\n                            src={mediaURL}\n                            width={MEDIA_SIZE}\n                            height={MEDIA_SIZE}\n                            alt={m.description}\n                            loading=\"lazy\"\n                            onError={(e) => {\n                              const { src } = e.target;\n                              if (src === mediaURL) {\n                                e.target.src = remoteMediaURL;\n                              }\n                            }}\n                          />\n                        ) : (\n                          <span class=\"post-peek-faux-media\">๐Ÿ“น</span>\n                        ),\n                      audio: <span class=\"post-peek-faux-media\">๐ŸŽต</span>,\n                    }[m.type] || null}\n                  </span>\n                );\n              })\n            : !!card &&\n              card.image &&\n              showMedia && (\n                <span\n                  class={`post-peek-media post-peek-card card-${\n                    card.type || ''\n                  }`}\n                >\n                  {card.image ? (\n                    <img\n                      src={card.image}\n                      width={MEDIA_SIZE}\n                      height={MEDIA_SIZE}\n                      alt={\n                        card.title || card.description || card.imageDescription\n                      }\n                      loading=\"lazy\"\n                      style={{\n                        '--anim-duration':\n                          card.width &&\n                          card.height &&\n                          `${Math.min(\n                            Math.max(\n                              Math.max(card.width, card.height) / 100,\n                              5,\n                            ),\n                            120,\n                          )}s`,\n                      }}\n                    />\n                  ) : (\n                    <span class=\"post-peek-faux-media\">๐Ÿ”—</span>\n                  )}\n                </span>\n              )}\n        </span>\n      )}\n    </div>\n  );\n}\n\nfunction PostStats({ post }) {\n  const { t } = useLingui();\n  const { reblogsCount, repliesCount, favouritesCount } = post;\n  return (\n    <span class=\"post-stats\">\n      {repliesCount > 0 && (\n        <span class=\"post-stat-replies\">\n          <Icon icon=\"comment2\" size=\"s\" alt={t`Replies`} />{' '}\n          {shortenNumber(repliesCount)}\n        </span>\n      )}\n      {favouritesCount > 0 && (\n        <span class=\"post-stat-likes\">\n          <Icon icon=\"heart\" size=\"s\" alt={t`Likes`} />{' '}\n          {shortenNumber(favouritesCount)}\n        </span>\n      )}\n      {reblogsCount > 0 && (\n        <span class=\"post-stat-boosts\">\n          <Icon icon=\"rocket\" size=\"s\" alt={t`Boosts`} />{' '}\n          {shortenNumber(reblogsCount)}\n        </span>\n      )}\n    </span>\n  );\n}\n\nfunction binByTime(data, key, numBins) {\n  // Extract dates from data objects\n  const dates = data.map((item) => new Date(item[key]));\n\n  // Find minimum and maximum dates directly (avoiding Math.min/max)\n  const minDate = dates.reduce(\n    (acc, date) => (date < acc ? date : acc),\n    dates[0],\n  );\n  const maxDate = dates.reduce(\n    (acc, date) => (date > acc ? date : acc),\n    dates[0],\n  );\n\n  // Calculate the time span in milliseconds\n  const range = maxDate.getTime() - minDate.getTime();\n\n  // Create empty bins and loop through data\n  const bins = Array.from({ length: numBins }, () => []);\n  data.forEach((item) => {\n    const date = new Date(item[key]);\n    const normalized = (date.getTime() - minDate.getTime()) / range;\n    const binIndex = Math.floor(normalized * (numBins - 1));\n    bins[binIndex].push(item);\n  });\n\n  return bins;\n}\n\nexport default Catchup;\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { useRef } from 'preact/hooks';\n\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction Favourites() {\n  const { t } = useLingui();\n  useTitle(t`Likes`, '/favourites');\n  const { masto, instance } = api();\n  const favouritesIterator = useRef();\n  async function fetchFavourites(firstLoad) {\n    if (firstLoad || !favouritesIterator.current) {\n      favouritesIterator.current = masto.v1.favourites.list({ limit: LIMIT });\n    }\n    return await favouritesIterator.current.next();\n  }\n\n  return (\n    <Timeline\n      title={t`Likes`}\n      id=\"favourites\"\n      emptyText={t`No likes yet. Go like something!`}\n      errorText={t`Unable to load likes.`}\n      instance={instance}\n      fetchItems={fetchFavourites}\n    />\n  );\n}\n\nexport default Favourites;\n","import './filters.css';\n\nimport { msg } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useReducer, useRef, useState } from 'preact/hooks';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport MenuConfirm from '../components/menu-confirm';\nimport Modal from '../components/modal';\nimport NavMenu from '../components/nav-menu';\nimport RelativeTime from '../components/relative-time';\nimport { api } from '../utils/api';\nimport i18nDuration from '../utils/i18n-duration';\nimport useInterval from '../utils/useInterval';\nimport useTitle from '../utils/useTitle';\n\nconst FILTER_CONTEXT = ['home', 'public', 'notifications', 'thread', 'account'];\nconst FILTER_CONTEXT_UNIMPLEMENTED = ['notifications', 'thread', 'account'];\nconst FILTER_CONTEXT_LABELS = {\n  home: msg`Home and lists`,\n  notifications: msg`Notifications`,\n  public: msg`Public timelines`,\n  thread: msg`Conversations`,\n  account: msg`Profiles`,\n};\n\nconst EXPIRY_DURATIONS = [\n  0, // forever\n  30 * 60, // 30 minutes\n  60 * 60, // 1 hour\n  6 * 60 * 60, // 6 hours\n  12 * 60 * 60, // 12 hours\n  60 * 60 * 24, // 24 hours\n  60 * 60 * 24 * 7, // 7 days\n  60 * 60 * 24 * 30, // 30 days\n];\n\nconst EXPIRY_DURATIONS_LABELS = {\n  0: msg`Never`,\n  1800: i18nDuration(30, 'minute'),\n  3600: i18nDuration(1, 'hour'),\n  21600: i18nDuration(6, 'hour'),\n  43200: i18nDuration(12, 'hour'),\n  86_400: i18nDuration(24, 'hour'),\n  604_800: i18nDuration(7, 'day'),\n  2_592_000: i18nDuration(30, 'day'),\n};\n\nfunction Filters() {\n  const { t } = useLingui();\n  const { masto } = api();\n  useTitle(t`Filters`, `/ft`);\n  const [uiState, setUIState] = useState('default');\n  const [showFiltersAddEditModal, setShowFiltersAddEditModal] = useState(false);\n\n  const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n  const [filters, setFilters] = useState([]);\n  useEffect(() => {\n    setUIState('loading');\n    (async () => {\n      try {\n        const filters = await masto.v2.filters.list();\n        filters.sort((a, b) => a.title.localeCompare(b.title));\n        filters.forEach((filter) => {\n          if (filter.keywords?.length) {\n            filter.keywords.sort((a, b) => a.id - b.id);\n          }\n        });\n        console.log(filters);\n        setFilters(filters);\n        setUIState('default');\n      } catch (e) {\n        console.error(e);\n        setUIState('error');\n      }\n    })();\n  }, [reloadCount]);\n\n  return (\n    <div id=\"filters-page\" class=\"deck-container\" tabIndex=\"-1\">\n      <div class=\"timeline-deck deck\">\n        <header>\n          <div class=\"header-grid\">\n            <div class=\"header-side\">\n              <NavMenu />\n              <Link to=\"/\" class=\"button plain\">\n                <Icon icon=\"home\" size=\"l\" alt={t`Home`} />\n              </Link>\n            </div>\n            <h1>\n              <Trans>Filters</Trans>\n            </h1>\n            <div class=\"header-side\">\n              <button\n                type=\"button\"\n                class=\"plain\"\n                onClick={() => {\n                  setShowFiltersAddEditModal(true);\n                }}\n              >\n                <Icon icon=\"plus\" size=\"l\" alt={t`New filter`} />\n              </button>\n            </div>\n          </div>\n        </header>\n        <main>\n          {filters.length > 0 ? (\n            <>\n              <ul class=\"filters-list\">\n                {filters.map((filter) => {\n                  const { id, title, expiresAt, keywords } = filter;\n                  return (\n                    <li key={id}>\n                      <div>\n                        <h2>{title}</h2>\n                        {keywords?.length > 0 && (\n                          <div>\n                            {keywords.map((k) => (\n                              <>\n                                <span class=\"tag collapsed insignificant\">\n                                  {k.wholeWord ? `โ€œ${k.keyword}โ€` : k.keyword}\n                                </span>{' '}\n                              </>\n                            ))}\n                          </div>\n                        )}\n                        <small class=\"insignificant\">\n                          <ExpiryStatus expiresAt={expiresAt} />\n                        </small>\n                      </div>\n                      <button\n                        type=\"button\"\n                        class=\"plain\"\n                        onClick={() => {\n                          setShowFiltersAddEditModal({\n                            filter,\n                          });\n                        }}\n                      >\n                        <Icon icon=\"pencil\" size=\"l\" alt=\"Edit filter\" />\n                      </button>\n                    </li>\n                  );\n                })}\n              </ul>\n              {filters.length > 1 && (\n                <footer class=\"ui-state\">\n                  <small class=\"insignificant\">\n                    <Plural\n                      value={filters.length}\n                      one=\"# filter\"\n                      other=\"# filters\"\n                    />\n                  </small>\n                </footer>\n              )}\n            </>\n          ) : uiState === 'loading' ? (\n            <p class=\"ui-state\">\n              <Loader />\n            </p>\n          ) : uiState === 'error' ? (\n            <p class=\"ui-state\">\n              <Trans>Unable to load filters.</Trans>\n            </p>\n          ) : (\n            <p class=\"ui-state\">\n              <Trans>No filters yet.</Trans>\n            </p>\n          )}\n        </main>\n      </div>\n      {!!showFiltersAddEditModal && (\n        <Modal\n          title={t`Add filter`}\n          onClose={() => {\n            setShowFiltersAddEditModal(false);\n          }}\n        >\n          <FiltersAddEdit\n            filter={showFiltersAddEditModal?.filter}\n            onClose={(result) => {\n              if (result.state === 'success') {\n                reload();\n              }\n              setShowFiltersAddEditModal(false);\n            }}\n          />\n        </Modal>\n      )}\n    </div>\n  );\n}\n\nlet _id = 1;\nconst incID = () => _id++;\nfunction FiltersAddEdit({ filter, onClose }) {\n  const { _, t } = useLingui();\n  const { masto } = api();\n  const [uiState, setUIState] = useState('default');\n  const editMode = !!filter;\n  const { context, expiresAt, id, keywords, title, filterAction } =\n    filter || {};\n  const hasExpiry = !!expiresAt;\n  const expiresAtDate = hasExpiry && new Date(expiresAt);\n  const [editKeywords, setEditKeywords] = useState(keywords || []);\n  const keywordsRef = useRef();\n\n  // Hacky way of handling removed keywords for both existing and new ones\n  const [removedKeywordIDs, setRemovedKeywordIDs] = useState([]);\n  const [removedKeyword_IDs, setRemovedKeyword_IDs] = useState([]);\n\n  const filteredEditKeywords = editKeywords.filter(\n    (k) =>\n      !removedKeywordIDs.includes(k.id) && !removedKeyword_IDs.includes(k._id),\n  );\n\n  return (\n    <div class=\"sheet\" id=\"filters-add-edit-modal\">\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}\n      <header>\n        <h2>{editMode ? t`Edit filter` : t`New filter`}</h2>\n      </header>\n      <main>\n        <form\n          onSubmit={(e) => {\n            e.preventDefault();\n            const formData = new FormData(e.target);\n            const title = formData.get('title');\n            const keywordIDs = formData.getAll('keyword_attributes[][id]');\n            const keywordKeywords = formData.getAll(\n              'keyword_attributes[][keyword]',\n            );\n            // const keywordWholeWords = formData.getAll(\n            //   'keyword_attributes[][whole_word]',\n            // );\n            // Not using getAll because it skips the empty checkboxes\n            const keywordWholeWords = [\n              ...keywordsRef.current.querySelectorAll(\n                'input[name=\"keyword_attributes[][whole_word]\"]',\n              ),\n            ].map((i) => i.checked);\n            const keywordsAttributes = keywordKeywords.map((k, i) => ({\n              id: keywordIDs[i] || undefined,\n              keyword: k,\n              wholeWord: keywordWholeWords[i],\n            }));\n            // if (editMode && keywords?.length) {\n            //   // Find which one got deleted and add to keywordsAttributes\n            //   keywords.forEach((k) => {\n            //     if (!keywordsAttributes.find((ka) => ka.id === k.id)) {\n            //       keywordsAttributes.push({\n            //         ...k,\n            //         _destroy: true,\n            //       });\n            //     }\n            //   });\n            // }\n            if (editMode && removedKeywordIDs?.length) {\n              removedKeywordIDs.forEach((id) => {\n                keywordsAttributes.push({\n                  id,\n                  _destroy: true,\n                });\n              });\n            }\n            const context = formData.getAll('context');\n            let expiresIn = formData.get('expires_in');\n            const filterAction = formData.get('filter_action');\n            console.log({\n              title,\n              keywordIDs,\n              keywords: keywordKeywords,\n              wholeWords: keywordWholeWords,\n              keywordsAttributes,\n              context,\n              expiresIn,\n              filterAction,\n            });\n\n            // Required fields\n            if (!title || !context?.length) {\n              return;\n            }\n\n            setUIState('loading');\n\n            (async () => {\n              try {\n                let filterResult;\n\n                if (editMode) {\n                  if (expiresIn === '' || expiresIn === null) {\n                    // No value\n                    // Preserve existing expiry if not specified\n                    // Seconds from now to expiresAtDate\n                    // Other clients don't do this\n                    if (hasExpiry) {\n                      expiresIn = Math.floor(\n                        (expiresAtDate - new Date()) / 1000,\n                      );\n                    } else {\n                      expiresIn = null;\n                    }\n                  } else if (expiresIn === '0' || expiresIn === 0) {\n                    // 0 = Never\n                    expiresIn = null;\n                  } else {\n                    expiresIn = +expiresIn;\n                  }\n                  filterResult = await masto.v2.filters.$select(id).update({\n                    title,\n                    context,\n                    expiresIn,\n                    keywordsAttributes,\n                    filterAction,\n                  });\n                } else {\n                  expiresIn = +expiresIn || null;\n                  filterResult = await masto.v2.filters.create({\n                    title,\n                    context,\n                    expiresIn,\n                    keywordsAttributes,\n                    filterAction,\n                  });\n                }\n                console.log({ filterResult });\n                setUIState('default');\n                onClose?.({\n                  state: 'success',\n                  filter: filterResult,\n                });\n              } catch (error) {\n                console.error(error);\n                setUIState('error');\n                alert(\n                  editMode\n                    ? t`Unable to edit filter`\n                    : t`Unable to create filter`,\n                );\n              }\n            })();\n          }}\n        >\n          <div class=\"filter-form-row\">\n            <label>\n              <b>\n                <Trans>Title</Trans>\n              </b>\n              <input\n                type=\"text\"\n                name=\"title\"\n                defaultValue={title}\n                disabled={uiState === 'loading'}\n                dir=\"auto\"\n                required\n              />\n            </label>\n          </div>\n          <div class=\"filter-form-keywords\" ref={keywordsRef}>\n            {filteredEditKeywords.length ? (\n              <ul class=\"filter-keywords\">\n                {filteredEditKeywords.map((k) => {\n                  const { id, keyword, wholeWord, _id } = k;\n                  return (\n                    <li key={`${id}-${_id}`}>\n                      <input\n                        type=\"hidden\"\n                        name=\"keyword_attributes[][id]\"\n                        value={id}\n                      />\n                      <input\n                        name=\"keyword_attributes[][keyword]\"\n                        type=\"text\"\n                        defaultValue={keyword}\n                        disabled={uiState === 'loading'}\n                        required\n                        dir=\"auto\"\n                      />\n                      <div class=\"filter-keyword-actions\">\n                        <label>\n                          <input\n                            name=\"keyword_attributes[][whole_word]\"\n                            type=\"checkbox\"\n                            value={id} // Hacky way to map checkbox boolean to the keyword id\n                            defaultChecked={wholeWord}\n                            disabled={uiState === 'loading'}\n                          />{' '}\n                          <Trans>Whole word</Trans>\n                        </label>\n                        <button\n                          type=\"button\"\n                          class=\"light danger small\"\n                          disabled={uiState === 'loading'}\n                          onClick={() => {\n                            if (id) {\n                              removedKeywordIDs.push(id);\n                              setRemovedKeywordIDs([...removedKeywordIDs]);\n                            } else if (_id) {\n                              removedKeyword_IDs.push(_id);\n                              setRemovedKeyword_IDs([...removedKeyword_IDs]);\n                            }\n                          }}\n                        >\n                          <Icon icon=\"x\" alt={t`Remove`} />\n                        </button>\n                      </div>\n                    </li>\n                  );\n                })}\n              </ul>\n            ) : (\n              <div class=\"filter-keywords\">\n                <div class=\"insignificant\">\n                  <Trans>No keywords. Add one.</Trans>\n                </div>\n              </div>\n            )}\n            <footer class=\"filter-keywords-footer\">\n              <button\n                type=\"button\"\n                class=\"light\"\n                onClick={() => {\n                  setEditKeywords([\n                    ...editKeywords,\n                    {\n                      _id: incID(),\n                      keyword: '',\n                      wholeWord: true,\n                    },\n                  ]);\n                  setTimeout(() => {\n                    // Focus last input\n                    const fields =\n                      keywordsRef.current.querySelectorAll(\n                        'input[type=\"text\"]',\n                      );\n                    fields[fields.length - 1]?.focus?.();\n                  }, 10);\n                }}\n              >\n                <Trans>Add keyword</Trans>\n              </button>{' '}\n              {filteredEditKeywords?.length > 1 && (\n                <small class=\"insignificant\">\n                  <Plural\n                    value={filteredEditKeywords.length}\n                    one=\"# keyword\"\n                    other=\"# keywords\"\n                  />\n                </small>\n              )}\n            </footer>\n          </div>\n          <div class=\"filter-form-cols\">\n            <div class=\"filter-form-col\">\n              <div>\n                <b>\n                  <Trans>Filter fromโ€ฆ</Trans>\n                </b>\n              </div>\n              {FILTER_CONTEXT.map((ctx) => (\n                <div>\n                  <label\n                    class={\n                      FILTER_CONTEXT_UNIMPLEMENTED.includes(ctx)\n                        ? 'insignificant'\n                        : ''\n                    }\n                  >\n                    <input\n                      type=\"checkbox\"\n                      name=\"context\"\n                      value={ctx}\n                      defaultChecked={!!context ? context.includes(ctx) : true}\n                      disabled={uiState === 'loading'}\n                    />{' '}\n                    {_(FILTER_CONTEXT_LABELS[ctx])}\n                    {FILTER_CONTEXT_UNIMPLEMENTED.includes(ctx) ? '*' : ''}\n                  </label>{' '}\n                </div>\n              ))}\n              <p>\n                <small class=\"insignificant\">\n                  <Trans>* Not implemented yet</Trans>\n                </small>\n              </p>\n            </div>\n            <div class=\"filter-form-col\">\n              {editMode && (\n                <Trans>\n                  Status:{' '}\n                  <b>\n                    <ExpiryStatus expiresAt={expiresAt} showNeverExpires />\n                  </b>\n                </Trans>\n              )}\n              <div>\n                <label for=\"filters-expires_in\">\n                  {editMode ? t`Change expiry` : t`Expiry`}\n                </label>\n                <select\n                  id=\"filters-expires_in\"\n                  name=\"expires_in\"\n                  disabled={uiState === 'loading'}\n                  defaultValue={editMode ? undefined : 0}\n                >\n                  {editMode && <option></option>}\n                  {EXPIRY_DURATIONS.map((v) => (\n                    <option value={v}>\n                      {typeof EXPIRY_DURATIONS_LABELS[v] === 'function'\n                        ? EXPIRY_DURATIONS_LABELS[v]()\n                        : _(EXPIRY_DURATIONS_LABELS[v])}\n                    </option>\n                  ))}\n                </select>\n              </div>\n              <p>\n                <Trans>Filtered post will beโ€ฆ</Trans>\n                <br />\n                <label class=\"ib\">\n                  <input\n                    type=\"radio\"\n                    name=\"filter_action\"\n                    value=\"warn\"\n                    defaultChecked={filterAction === 'warn' || !editMode}\n                    disabled={uiState === 'loading'}\n                  />{' '}\n                  <Trans>minimized</Trans>\n                </label>{' '}\n                <label class=\"ib\">\n                  <input\n                    type=\"radio\"\n                    name=\"filter_action\"\n                    value=\"hide\"\n                    defaultChecked={filterAction === 'hide'}\n                    disabled={uiState === 'loading'}\n                  />{' '}\n                  <Trans>hidden</Trans>\n                </label>\n              </p>\n            </div>\n          </div>\n          <footer class=\"filter-form-footer\">\n            <span>\n              <button type=\"submit\" disabled={uiState === 'loading'}>\n                {editMode ? t`Save` : t`Create`}\n              </button>{' '}\n              <Loader abrupt hidden={uiState !== 'loading'} />\n            </span>\n            {editMode && (\n              <MenuConfirm\n                disabled={uiState === 'loading'}\n                align=\"end\"\n                menuItemClassName=\"danger\"\n                confirmLabel={t`Delete this filter?`}\n                onClick={() => {\n                  setUIState('loading');\n                  (async () => {\n                    try {\n                      await masto.v2.filters.$select(id).remove();\n                      setUIState('default');\n                      onClose?.({\n                        state: 'success',\n                      });\n                    } catch (e) {\n                      console.error(e);\n                      setUIState('error');\n                      alert(t`Unable to delete filter.`);\n                    }\n                  })();\n                }}\n              >\n                <button\n                  type=\"button\"\n                  class=\"light danger\"\n                  onClick={() => {}}\n                  disabled={uiState === 'loading'}\n                >\n                  <Trans>Deleteโ€ฆ</Trans>\n                </button>\n              </MenuConfirm>\n            )}\n          </footer>\n        </form>\n      </main>\n    </div>\n  );\n}\n\nfunction ExpiryStatus({ expiresAt, showNeverExpires }) {\n  const { t } = useLingui();\n  const hasExpiry = !!expiresAt;\n  const expiresAtDate = hasExpiry && new Date(expiresAt);\n  const expired = hasExpiry && expiresAtDate <= new Date();\n\n  // If less than a minute left, re-render interval every second, else every minute\n  const [_, rerender] = useReducer((c) => c + 1, 0);\n  useInterval(rerender, expired || 30_000);\n\n  return expired ? (\n    t`Expired`\n  ) : hasExpiry ? (\n    <Trans>\n      Expiring <RelativeTime datetime={expiresAtDate} />\n    </Trans>\n  ) : (\n    showNeverExpires && t`Never expires`\n  );\n}\n\nexport default Filters;\n","import { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useState } from 'preact/hooks';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport NavMenu from '../components/nav-menu';\nimport { api } from '../utils/api';\nimport { fetchFollowedTags } from '../utils/followed-tags';\nimport useTitle from '../utils/useTitle';\n\nfunction FollowedHashtags() {\n  const { t } = useLingui();\n  const { masto, instance } = api();\n  useTitle(t`Followed Hashtags`, `/fh`);\n  const [uiState, setUIState] = useState('default');\n\n  const [followedHashtags, setFollowedHashtags] = useState([]);\n  useEffect(() => {\n    setUIState('loading');\n    (async () => {\n      try {\n        const tags = await fetchFollowedTags();\n        setFollowedHashtags(tags);\n        setUIState('default');\n      } catch (e) {\n        console.error(e);\n        setUIState('error');\n      }\n    })();\n  }, []);\n\n  return (\n    <div id=\"followed-hashtags-page\" class=\"deck-container\" tabIndex=\"-1\">\n      <div class=\"timeline-deck deck\">\n        <header>\n          <div class=\"header-grid\">\n            <div class=\"header-side\">\n              <NavMenu />\n              <Link to=\"/\" class=\"button plain\">\n                <Icon icon=\"home\" size=\"l\" alt={t`Home`} />\n              </Link>\n            </div>\n            <h1>\n              <Trans>Followed Hashtags</Trans>\n            </h1>\n            <div class=\"header-side\" />\n          </div>\n        </header>\n        <main>\n          {followedHashtags.length > 0 ? (\n            <>\n              <ul class=\"link-list\">\n                {followedHashtags.map((tag) => (\n                  <li>\n                    <Link\n                      to={\n                        instance\n                          ? `/${instance}/t/${tag.name}`\n                          : `/t/${tag.name}`\n                      }\n                    >\n                      <Icon icon=\"hashtag\" alt=\"#\" /> <span>{tag.name}</span>\n                    </Link>\n                  </li>\n                ))}\n              </ul>\n              {followedHashtags.length > 1 && (\n                <footer class=\"ui-state\">\n                  <small class=\"insignificant\">\n                    <Plural\n                      value={followedHashtags.length}\n                      one=\"# hashtag\"\n                      other=\"# hashtags\"\n                    />\n                  </small>\n                </footer>\n              )}\n            </>\n          ) : uiState === 'loading' ? (\n            <p class=\"ui-state\">\n              <Loader abrupt />\n            </p>\n          ) : uiState === 'error' ? (\n            <p class=\"ui-state\">\n              <Trans>Unable to load followed hashtags.</Trans>\n            </p>\n          ) : (\n            <p class=\"ui-state\">\n              <Trans>No hashtags followed yet.</Trans>\n            </p>\n          )}\n        </main>\n      </div>\n    </div>\n  );\n}\n\nexport default FollowedHashtags;\n","import { useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport states, { getStatus, saveStatus } from '../utils/states';\nimport supports from '../utils/supports';\nimport {\n  assignFollowedTags,\n  clearFollowedTagsState,\n  dedupeBoosts,\n} from '../utils/timeline-utils';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction Following({ title, path, id, ...props }) {\n  const { t } = useLingui();\n  useTitle(\n    title ||\n      t({\n        id: 'following.title',\n        message: 'Following',\n      }),\n    path || '/following',\n  );\n  const { masto, streaming, instance } = api();\n  const snapStates = useSnapshot(states);\n  const homeIterator = useRef();\n  const latestItem = useRef();\n  __BENCHMARK.end('time-to-following');\n\n  console.debug('RENDER Following', title, id);\n  const supportsPixelfed = supports('@pixelfed/home-include-reblogs');\n\n  async function fetchHome(firstLoad) {\n    if (firstLoad || !homeIterator.current) {\n      __BENCHMARK.start('fetch-home-first');\n      homeIterator.current = masto.v1.timelines.home.list({ limit: LIMIT });\n    }\n    if (supportsPixelfed && homeIterator.current?.nextParams) {\n      if (typeof homeIterator.current.nextParams === 'string') {\n        homeIterator.current.nextParams += '&include_reblogs=true';\n      } else {\n        homeIterator.current.nextParams.include_reblogs = true;\n      }\n    }\n    const results = await homeIterator.current.next();\n    let { value } = results;\n    if (value?.length) {\n      let latestItemChanged = false;\n      if (firstLoad) {\n        if (value[0].id !== latestItem.current) {\n          latestItemChanged = true;\n        }\n        latestItem.current = value[0].id;\n        console.log('First load', latestItem.current);\n      }\n\n      // value = filteredItems(value, 'home');\n      value.forEach((item) => {\n        saveStatus(item, instance);\n      });\n      value = dedupeBoosts(value, instance);\n      if (firstLoad && latestItemChanged) clearFollowedTagsState();\n      assignFollowedTags(value, instance);\n\n      // ENFORCE sort by datetime (Latest first)\n      value.sort((a, b) => {\n        const aDate = new Date(a.createdAt);\n        const bDate = new Date(b.createdAt);\n        return bDate - aDate;\n      });\n    }\n    __BENCHMARK.end('fetch-home-first');\n    return {\n      ...results,\n      value,\n    };\n  }\n\n  async function checkForUpdates() {\n    try {\n      const opts = {\n        limit: 5,\n        since_id: latestItem.current,\n      };\n      if (supports('@pixelfed/home-include-reblogs')) {\n        opts.include_reblogs = true;\n      }\n      const results = await masto.v1.timelines.home.list(opts).next();\n      let { value } = results;\n      console.log('checkForUpdates', latestItem.current, value);\n      const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported\n      if (value?.length && !valueContainsLatestItem) {\n        latestItem.current = value[0].id;\n        value = dedupeBoosts(value, instance);\n        value = filteredItems(value, 'home');\n        if (value.some((item) => !item.reblog)) {\n          return true;\n        }\n      }\n      return false;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  useEffect(() => {\n    let sub;\n    (async () => {\n      if (streaming) {\n        sub = streaming.user.subscribe();\n        console.log('๐ŸŽ Streaming user', sub);\n        for await (const entry of sub) {\n          if (!sub) break;\n          if (entry.event === 'status.update') {\n            const status = entry.payload;\n            console.log(`๐Ÿ”„ Status ${status.id} updated`);\n            saveStatus(status, instance);\n          } else if (entry.event === 'delete') {\n            const statusID = entry.payload;\n            console.log(`โŒ Status ${statusID} deleted`);\n            // delete states.statuses[statusID];\n            const s = getStatus(statusID, instance);\n            if (s) s._deleted = true;\n          }\n        }\n        console.log('๐Ÿ’ฅ Streaming user loop STOPPED');\n      }\n    })();\n    return () => {\n      sub?.unsubscribe?.();\n      sub = null;\n    };\n  }, [streaming]);\n\n  return (\n    <Timeline\n      title={title || t({ id: 'following.title', message: 'Following' })}\n      id={id || 'following'}\n      emptyText={t`Nothing to see here.`}\n      errorText={t`Unable to load posts.`}\n      instance={instance}\n      fetchItems={fetchHome}\n      checkForUpdates={checkForUpdates}\n      useItemID\n      boostsCarousel={snapStates.settings.boostsCarousel}\n      {...props}\n      // allowFilters\n      filterContext=\"home\"\n      showFollowedTags\n      showReplyParent\n    />\n  );\n}\n\nexport default Following;\n","import { plural } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport {\n  FocusableItem,\n  MenuDivider,\n  MenuGroup,\n  MenuHeader,\n  MenuItem,\n} from '@szhsin/react-menu';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport { useNavigate, useParams, useSearchParams } from 'react-router-dom';\n\nimport Icon from '../components/icon';\nimport MenuConfirm from '../components/menu-confirm';\nimport Menu2 from '../components/menu2';\nimport { SHORTCUTS_LIMIT } from '../components/shortcuts-settings';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus } from '../utils/states';\nimport { isMediaFirstInstance } from '../utils/store-utils';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\n// Limit is 4 per \"mode\"\n// https://github.com/mastodon/mastodon/issues/15194\n// Hard-coded https://github.com/mastodon/mastodon/blob/19614ba2477f3d12468f5ec251ce1cc5f8c6210c/app/models/tag_feed.rb#L4\nconst TAGS_LIMIT_PER_MODE = 4;\nconst TOTAL_TAGS_LIMIT = TAGS_LIMIT_PER_MODE + 1;\n\nfunction Hashtags({ media: mediaView, columnMode, ...props }) {\n  const { t } = useLingui();\n  // const navigate = useNavigate();\n  let { hashtag, ...params } = columnMode ? {} : useParams();\n  if (props.hashtag) hashtag = props.hashtag;\n  let hashtags = hashtag.trim().split(/[\\s+]+/);\n  hashtags.sort();\n  hashtag = hashtags[0];\n  const [searchParams, setSearchParams] = useSearchParams();\n  const media = mediaView || !!searchParams.get('media');\n  const linkParams = media ? '?media=1' : '';\n\n  const { masto, instance, authenticated } = api({\n    instance: props?.instance || params.instance,\n  });\n  const {\n    masto: currentMasto,\n    instance: currentInstance,\n    authenticated: currentAuthenticated,\n  } = api();\n  const hashtagTitle = hashtags.map((t) => `#${t}`).join(' ');\n  const title = instance\n    ? media\n      ? t`${hashtagTitle} (Media only) on ${instance}`\n      : t`${hashtagTitle} on ${instance}`\n    : media\n      ? t`${hashtagTitle} (Media only)`\n      : t`${hashtagTitle}`;\n  useTitle(title, `/:instance?/t/:hashtag`);\n  const latestItem = useRef();\n\n  const mediaFirst = useMemo(() => isMediaFirstInstance(), []);\n\n  // const hashtagsIterator = useRef();\n  const maxID = useRef(undefined);\n  async function fetchHashtags(firstLoad) {\n    // if (firstLoad || !hashtagsIterator.current) {\n    //   hashtagsIterator.current = masto.v1.timelines.tag.$select(hashtag).list({\n    //     limit: LIMIT,\n    //     any: hashtags.slice(1),\n    //   });\n    // }\n    // const results = await hashtagsIterator.current.next();\n\n    // NOTE: Temporary fix for listHashtag not persisting `any` in subsequent calls.\n    const results = await masto.v1.timelines.tag\n      .$select(hashtag)\n      .list({\n        limit: LIMIT,\n        any: hashtags.slice(1),\n        maxId: firstLoad ? undefined : maxID.current,\n        onlyMedia: media ? true : undefined,\n      })\n      .next();\n    let { value } = results;\n    if (value?.length) {\n      if (firstLoad) {\n        latestItem.current = value[0].id;\n      }\n\n      // value = filteredItems(value, 'public');\n      value.forEach((item) => {\n        saveStatus(item, instance, {\n          skipThreading: media || mediaFirst, // If media view, no need to form threads\n        });\n      });\n\n      maxID.current = value[value.length - 1].id;\n    }\n    return {\n      ...results,\n      value,\n    };\n  }\n\n  async function checkForUpdates() {\n    try {\n      const results = await masto.v1.timelines.tag\n        .$select(hashtag)\n        .list({\n          limit: 1,\n          any: hashtags.slice(1),\n          since_id: latestItem.current,\n          onlyMedia: media,\n        })\n        .next();\n      let { value } = results;\n      const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported\n      if (value?.length && !valueContainsLatestItem) {\n        value = filteredItems(value, 'public');\n        return true;\n      }\n      return false;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  const [followUIState, setFollowUIState] = useState('default');\n  const [info, setInfo] = useState();\n  // Get hashtag info\n  useEffect(() => {\n    (async () => {\n      try {\n        const info = await masto.v1.tags.$select(hashtag).fetch();\n        console.log(info);\n        setInfo(info);\n      } catch (e) {\n        console.error(e);\n      }\n    })();\n  }, [hashtag]);\n\n  const reachLimit = hashtags.length >= TOTAL_TAGS_LIMIT;\n\n  const [featuredUIState, setFeaturedUIState] = useState('default');\n  const [featuredTags, setFeaturedTags] = useState([]);\n  const [isFeaturedTag, setIsFeaturedTag] = useState(false);\n  useEffect(() => {\n    if (!authenticated) return;\n    (async () => {\n      try {\n        const featuredTags = await masto.v1.featuredTags.list();\n        setFeaturedTags(featuredTags);\n        setIsFeaturedTag(\n          featuredTags.some(\n            (tag) => tag.name.toLowerCase() === hashtag.toLowerCase(),\n          ),\n        );\n      } catch (e) {\n        console.error(e);\n      }\n    })();\n  }, []);\n\n  return (\n    <Timeline\n      key={instance + hashtagTitle}\n      title={title}\n      titleComponent={\n        !!instance && (\n          <h1 class=\"header-double-lines\">\n            <b dir=\"auto\">{hashtagTitle}</b>\n            <div>{instance}</div>\n          </h1>\n        )\n      }\n      id=\"hashtag\"\n      instance={instance}\n      emptyText={t`No one has posted anything with this tag yet.`}\n      errorText={t`Unable to load posts with this tag`}\n      fetchItems={fetchHashtags}\n      checkForUpdates={checkForUpdates}\n      useItemID\n      view={media || mediaFirst ? 'media' : undefined}\n      refresh={media}\n      // allowFilters\n      filterContext=\"public\"\n      headerEnd={\n        <Menu2\n          portal\n          setDownOverflow\n          overflow=\"auto\"\n          // viewScroll=\"close\"\n          position=\"anchor\"\n          menuButton={\n            <button type=\"button\" class=\"plain\">\n              <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n            </button>\n          }\n        >\n          {!!info && hashtags.length === 1 && (\n            <>\n              <MenuConfirm\n                subMenu\n                confirm={info.following}\n                confirmLabel={t`Unfollow #${hashtag}?`}\n                disabled={followUIState === 'loading' || !authenticated}\n                onClick={() => {\n                  setFollowUIState('loading');\n                  if (info.following) {\n                    // const yes = confirm(`Unfollow #${hashtag}?`);\n                    // if (!yes) {\n                    //   setFollowUIState('default');\n                    //   return;\n                    // }\n                    masto.v1.tags\n                      .$select(hashtag)\n                      .unfollow()\n                      .then(() => {\n                        setInfo({ ...info, following: false });\n                        showToast(t`Unfollowed #${hashtag}`);\n                      })\n                      .catch((e) => {\n                        alert(e);\n                        console.error(e);\n                      })\n                      .finally(() => {\n                        setFollowUIState('default');\n                      });\n                  } else {\n                    masto.v1.tags\n                      .$select(hashtag)\n                      .follow()\n                      .then(() => {\n                        setInfo({ ...info, following: true });\n                        showToast(t`Followed #${hashtag}`);\n                      })\n                      .catch((e) => {\n                        alert(e);\n                        console.error(e);\n                      })\n                      .finally(() => {\n                        setFollowUIState('default');\n                      });\n                  }\n                }}\n              >\n                {info.following ? (\n                  <>\n                    <Icon icon=\"check-circle\" />{' '}\n                    <span>\n                      <Trans>Followingโ€ฆ</Trans>\n                    </span>\n                  </>\n                ) : (\n                  <>\n                    <Icon icon=\"plus\" />{' '}\n                    <span>\n                      <Trans>Follow</Trans>\n                    </span>\n                  </>\n                )}\n              </MenuConfirm>\n              <MenuItem\n                type=\"checkbox\"\n                checked={isFeaturedTag}\n                disabled={featuredUIState === 'loading' || !authenticated}\n                onClick={() => {\n                  setFeaturedUIState('loading');\n                  if (isFeaturedTag) {\n                    const featuredTagID = featuredTags.find(\n                      (tag) => tag.name.toLowerCase() === hashtag.toLowerCase(),\n                    ).id;\n                    if (featuredTagID) {\n                      masto.v1.featuredTags\n                        .$select(featuredTagID)\n                        .remove()\n                        .then(() => {\n                          setIsFeaturedTag(false);\n                          showToast(t`Unfeatured on profile`);\n                          setFeaturedTags(\n                            featuredTags.filter(\n                              (tag) => tag.id !== featuredTagID,\n                            ),\n                          );\n                        })\n                        .catch((e) => {\n                          console.error(e);\n                        })\n                        .finally(() => {\n                          setFeaturedUIState('default');\n                        });\n                    } else {\n                      showToast(t`Unable to unfeature on profile`);\n                    }\n                  } else {\n                    masto.v1.featuredTags\n                      .create({\n                        name: hashtag,\n                      })\n                      .then((value) => {\n                        setIsFeaturedTag(true);\n                        showToast(t`Featured on profile`);\n                        setFeaturedTags(featuredTags.concat(value));\n                      })\n                      .catch((e) => {\n                        console.error(e);\n                      })\n                      .finally(() => {\n                        setFeaturedUIState('default');\n                      });\n                  }\n                }}\n              >\n                {isFeaturedTag ? (\n                  <>\n                    <Icon icon=\"check-circle\" />\n                    <span>\n                      <Trans>Featured on profile</Trans>\n                    </span>\n                  </>\n                ) : (\n                  <>\n                    <Icon icon=\"check-circle\" />\n                    <span>\n                      <Trans>Feature on profile</Trans>\n                    </span>\n                  </>\n                )}\n              </MenuItem>\n              <MenuDivider />\n            </>\n          )}\n          {!mediaFirst && (\n            <>\n              <MenuHeader className=\"plain\">\n                <Trans>Filters</Trans>\n              </MenuHeader>\n              <MenuItem\n                type=\"checkbox\"\n                checked={!!media}\n                onClick={() => {\n                  if (media) {\n                    searchParams.delete('media');\n                  } else {\n                    searchParams.set('media', '1');\n                  }\n                  setSearchParams(searchParams);\n                }}\n              >\n                <Icon icon=\"check-circle\" alt=\"โ˜‘๏ธ\" />{' '}\n                <span class=\"menu-grow\">\n                  <Trans>Media only</Trans>\n                </span>\n              </MenuItem>\n              <MenuDivider />\n            </>\n          )}\n          <FocusableItem className=\"menu-field\" disabled={reachLimit}>\n            {({ ref }) => (\n              <form\n                onSubmit={(e) => {\n                  e.preventDefault();\n                  const newHashtag = e.target[0].value?.trim?.();\n                  // Use includes but need to be case insensitive\n                  if (\n                    newHashtag &&\n                    !hashtags.some(\n                      (t) => t.toLowerCase() === newHashtag.toLowerCase(),\n                    )\n                  ) {\n                    hashtags.push(newHashtag);\n                    hashtags.sort();\n                    // navigate(\n                    //   instance\n                    //     ? `/${instance}/t/${hashtags.join('+')}`\n                    //     : `/t/${hashtags.join('+')}`,\n                    // );\n                    location.hash = instance\n                      ? `/${instance}/t/${hashtags.join('+')}`\n                      : `/t/${hashtags.join('+')}${linkParams}`;\n                  }\n                }}\n              >\n                <Icon icon=\"hashtag\" />\n                <input\n                  ref={ref}\n                  type=\"text\"\n                  placeholder={\n                    reachLimit\n                      ? plural(TOTAL_TAGS_LIMIT, {\n                          other: 'Max # tags',\n                        })\n                      : t`Add hashtag`\n                  }\n                  required\n                  autocorrect=\"off\"\n                  autocapitalize=\"off\"\n                  spellCheck={false}\n                  // no spaces, no hashtags\n                  pattern=\"[^#][^\\s#]+[^#]\"\n                  disabled={reachLimit}\n                  dir=\"auto\"\n                />\n              </form>\n            )}\n          </FocusableItem>\n          <MenuGroup takeOverflow>\n            {hashtags.map((tag, i) => (\n              <MenuItem\n                key={tag}\n                disabled={hashtags.length === 1}\n                onClick={(e) => {\n                  hashtags.splice(i, 1);\n                  hashtags.sort();\n                  // navigate(\n                  //   instance\n                  //     ? `/${instance}/t/${hashtags.join('+')}`\n                  //     : `/t/${hashtags.join('+')}`,\n                  // );\n                  location.hash = instance\n                    ? `/${instance}/t/${hashtags.join('+')}${linkParams}`\n                    : `/t/${hashtags.join('+')}${linkParams}`;\n                }}\n              >\n                <Icon icon=\"x\" alt={t`Remove hashtag`} class=\"danger-icon\" />\n                <span class=\"bidi-isolate\">\n                  <span class=\"more-insignificant\">#</span>\n                  {tag}\n                </span>\n              </MenuItem>\n            ))}\n          </MenuGroup>\n          <MenuDivider />\n          <MenuItem\n            disabled={!currentAuthenticated}\n            onClick={() => {\n              if (states.shortcuts.length >= SHORTCUTS_LIMIT) {\n                alert(\n                  plural(SHORTCUTS_LIMIT, {\n                    one: 'Max # shortcut reached. Unable to add shortcut.',\n                    other: 'Max # shortcuts reached. Unable to add shortcut.',\n                  }),\n                );\n                return;\n              }\n              const shortcut = {\n                type: 'hashtag',\n                hashtag: hashtags.join(' '),\n                instance,\n                media: media ? 'on' : undefined,\n              };\n              // Check if already exists\n              const exists = states.shortcuts.some(\n                (s) =>\n                  s.type === shortcut.type &&\n                  s.hashtag\n                    .split(/[\\s+]+/)\n                    .sort()\n                    .join(' ') ===\n                    shortcut.hashtag\n                      .split(/[\\s+]+/)\n                      .sort()\n                      .join(' ') &&\n                  (s.instance ? s.instance === shortcut.instance : true) &&\n                  (s.media ? !!s.media === !!shortcut.media : true),\n              );\n              if (exists) {\n                alert(t`This shortcut already exists`);\n              } else {\n                states.shortcuts.push(shortcut);\n                showToast(t`Hashtag shortcut added`);\n              }\n            }}\n          >\n            <Icon icon=\"shortcut\" />{' '}\n            <span>\n              <Trans>Add to Shortcuts</Trans>\n            </span>\n          </MenuItem>\n          <MenuItem\n            onClick={() => {\n              let newInstance = prompt(\n                t`Enter a new instance e.g. \"mastodon.social\"`,\n              );\n              if (!/\\./.test(newInstance)) {\n                if (newInstance) alert(t`Invalid instance`);\n                return;\n              }\n              if (newInstance) {\n                newInstance = newInstance.toLowerCase().trim();\n                // navigate(`/${newInstance}/t/${hashtags.join('+')}`);\n                location.hash = `/${newInstance}/t/${hashtags.join(\n                  '+',\n                )}${linkParams}`;\n              }\n            }}\n          >\n            <Icon icon=\"bus\" />{' '}\n            <span>\n              <Trans>Go to another instanceโ€ฆ</Trans>\n            </span>\n          </MenuItem>\n          {currentInstance !== instance && (\n            <MenuItem\n              onClick={() => {\n                location.hash = `/${currentInstance}/t/${hashtags.join(\n                  '+',\n                )}${linkParams}`;\n              }}\n            >\n              <Icon icon=\"bus\" />{' '}\n              <small class=\"menu-double-lines\">\n                <Trans>\n                  Go to my instance (<b>{currentInstance}</b>)\n                </Trans>\n              </small>\n            </MenuItem>\n          )}\n        </Menu2>\n      }\n    />\n  );\n}\n\nexport default Hashtags;\n","import './lists.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { Menu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { InView } from 'react-intersection-observer';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport AccountBlock from '../components/account-block';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport ListAddEdit from '../components/list-add-edit';\nimport MenuConfirm from '../components/menu-confirm';\nimport MenuLink from '../components/menu-link';\nimport Menu2 from '../components/menu2';\nimport Modal from '../components/modal';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport { getList, getLists } from '../utils/lists';\nimport states, { saveStatus } from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction List(props) {\n  const { t } = useLingui();\n  const snapStates = useSnapshot(states);\n  const { masto, instance } = api();\n  const id = props?.id || useParams()?.id;\n  // const navigate = useNavigate();\n  const latestItem = useRef();\n  // const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n\n  const listIterator = useRef();\n  async function fetchList(firstLoad) {\n    if (firstLoad || !listIterator.current) {\n      listIterator.current = masto.v1.timelines.list.$select(id).list({\n        limit: LIMIT,\n      });\n    }\n    const results = await listIterator.current.next();\n    let { value } = results;\n    if (value?.length) {\n      if (firstLoad) {\n        latestItem.current = value[0].id;\n      }\n\n      // value = filteredItems(value, 'home');\n      value.forEach((item) => {\n        saveStatus(item, instance);\n      });\n    }\n    return {\n      ...results,\n      value,\n    };\n  }\n\n  async function checkForUpdates() {\n    try {\n      const results = await masto.v1.timelines.list.$select(id).list({\n        limit: 1,\n        since_id: latestItem.current,\n      });\n      let { value } = results;\n      const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported\n      if (value?.length && !valueContainsLatestItem) {\n        value = filteredItems(value, 'home');\n        return true;\n      }\n      return false;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  const [lists, setLists] = useState([]);\n  useEffect(() => {\n    getLists().then(setLists);\n  }, []);\n\n  const [list, setList] = useState({ title: 'List' });\n  // const [title, setTitle] = useState(`List`);\n  useTitle(list.title, `/l/:id`);\n  useEffect(() => {\n    (async () => {\n      try {\n        const list = await getList(id);\n        setList(list);\n        // setTitle(list.title);\n      } catch (e) {\n        console.error(e);\n      }\n    })();\n  }, [id]);\n\n  const [showListAddEditModal, setShowListAddEditModal] = useState(false);\n  const [showManageMembersModal, setShowManageMembersModal] = useState(false);\n\n  return (\n    <>\n      <Timeline\n        key={id}\n        title={list.title}\n        id=\"list\"\n        emptyText={t`Nothing yet.`}\n        errorText={t`Unable to load posts.`}\n        instance={instance}\n        fetchItems={fetchList}\n        checkForUpdates={checkForUpdates}\n        useItemID\n        boostsCarousel={snapStates.settings.boostsCarousel}\n        // allowFilters\n        filterContext=\"home\"\n        showReplyParent\n        // refresh={reloadCount}\n        headerStart={\n          // <Link to=\"/l\" class=\"button plain\">\n          //   <Icon icon=\"list\" size=\"l\" />\n          // </Link>\n          <Menu2\n            overflow=\"auto\"\n            menuButton={\n              <button type=\"button\" class=\"plain\">\n                <Icon icon=\"list\" size=\"l\" alt={t`Lists`} />\n                <Icon icon=\"chevron-down\" size=\"s\" />\n              </button>\n            }\n          >\n            <MenuLink to=\"/l\">\n              <span>\n                <Trans>All Lists</Trans>\n              </span>\n            </MenuLink>\n            {lists?.length > 0 && (\n              <>\n                <MenuDivider />\n                {lists.map((list) => (\n                  <MenuLink key={list.id} to={`/l/${list.id}`}>\n                    <span>{list.title}</span>\n                  </MenuLink>\n                ))}\n              </>\n            )}\n          </Menu2>\n        }\n        headerEnd={\n          <Menu2\n            portal\n            setDownOverflow\n            overflow=\"auto\"\n            viewScroll=\"close\"\n            position=\"anchor\"\n            menuButton={\n              <button type=\"button\" class=\"plain\">\n                <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n              </button>\n            }\n          >\n            <MenuItem\n              onClick={() =>\n                setShowListAddEditModal({\n                  list,\n                })\n              }\n            >\n              <Icon icon=\"pencil\" size=\"l\" />\n              <span>\n                <Trans>Edit</Trans>\n              </span>\n            </MenuItem>\n            <MenuItem onClick={() => setShowManageMembersModal(true)}>\n              <Icon icon=\"group\" size=\"l\" />\n              <span>\n                <Trans>Manage members</Trans>\n              </span>\n            </MenuItem>\n          </Menu2>\n        }\n      />\n      {showListAddEditModal && (\n        <Modal\n          onClick={(e) => {\n            if (e.target === e.currentTarget) {\n              setShowListAddEditModal(false);\n            }\n          }}\n        >\n          <ListAddEdit\n            list={showListAddEditModal?.list}\n            onClose={(result) => {\n              if (result.state === 'success' && result.list) {\n                setList(result.list);\n                // reload();\n              } else if (result.state === 'deleted') {\n                // navigate('/l');\n                location.hash = '/l';\n              }\n              setShowListAddEditModal(false);\n            }}\n          />\n        </Modal>\n      )}\n      {showManageMembersModal && (\n        <Modal\n          onClick={(e) => {\n            if (e.target === e.currentTarget) {\n              setShowManageMembersModal(false);\n            }\n          }}\n        >\n          <ListManageMembers\n            listID={id}\n            onClose={() => setShowManageMembersModal(false)}\n          />\n        </Modal>\n      )}\n    </>\n  );\n}\n\nconst MEMBERS_LIMIT = 40;\nfunction ListManageMembers({ listID, onClose }) {\n  const { t } = useLingui();\n  // Show list of members with [Remove] button\n  // API only returns 40 members at a time, so this need to be paginated with infinite scroll\n  // Show [Add] button after removing a member\n  const { masto, instance } = api();\n  const [members, setMembers] = useState([]);\n  const [uiState, setUIState] = useState('default');\n  const [showMore, setShowMore] = useState(false);\n\n  const membersIterator = useRef();\n\n  async function fetchMembers(firstLoad) {\n    setShowMore(false);\n    setUIState('loading');\n    (async () => {\n      try {\n        if (firstLoad || !membersIterator.current) {\n          membersIterator.current = masto.v1.lists\n            .$select(listID)\n            .accounts.list({\n              limit: MEMBERS_LIMIT,\n            });\n        }\n        const results = await membersIterator.current.next();\n        let { done, value } = results;\n        if (value?.length) {\n          if (firstLoad) {\n            setMembers(value);\n          } else {\n            setMembers(members.concat(value));\n          }\n          setShowMore(!done);\n        } else {\n          setShowMore(false);\n        }\n        setUIState('default');\n      } catch (e) {\n        setUIState('error');\n      }\n    })();\n  }\n\n  useEffect(() => {\n    fetchMembers(true);\n  }, []);\n\n  return (\n    <div class=\"sheet\" id=\"list-manage-members-container\">\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}\n      <header>\n        <h2>\n          <Trans>Manage members</Trans>\n        </h2>\n      </header>\n      <main>\n        <ul>\n          {members.map((member) => (\n            <li key={member.id}>\n              <AccountBlock account={member} instance={instance} />\n              <RemoveAddButton account={member} listID={listID} />\n            </li>\n          ))}\n          {showMore && uiState === 'default' && (\n            <InView as=\"li\" onChange={(inView) => inView && fetchMembers()}>\n              <button type=\"button\" class=\"light block\" onClick={fetchMembers}>\n                <Trans>Show moreโ€ฆ</Trans>\n              </button>\n            </InView>\n          )}\n        </ul>\n      </main>\n    </div>\n  );\n}\n\nfunction RemoveAddButton({ account, listID }) {\n  const { t } = useLingui();\n  const { masto } = api();\n  const [uiState, setUIState] = useState('default');\n  const [removed, setRemoved] = useState(false);\n\n  return (\n    <MenuConfirm\n      confirm={!removed}\n      confirmLabel={\n        <span>\n          <Trans>\n            Remove <span class=\"bidi-isolate\">@{account.username}</span> from\n            list?\n          </Trans>\n        </span>\n      }\n      align=\"end\"\n      menuItemClassName=\"danger\"\n      onClick={() => {\n        if (removed) {\n          setUIState('loading');\n          (async () => {\n            try {\n              await masto.v1.lists.$select(listID).accounts.create({\n                accountIds: [account.id],\n              });\n              setUIState('default');\n              setRemoved(false);\n            } catch (e) {\n              setUIState('error');\n            }\n          })();\n        } else {\n          // const yes = confirm(`Remove ${account.username} from this list?`);\n          // if (!yes) return;\n          setUIState('loading');\n\n          (async () => {\n            try {\n              await masto.v1.lists.$select(listID).accounts.remove({\n                accountIds: [account.id],\n              });\n              setUIState('default');\n              setRemoved(true);\n            } catch (e) {\n              setUIState('error');\n            }\n          })();\n        }\n      }}\n    >\n      <button\n        type=\"button\"\n        class={`light ${removed ? '' : 'danger'}`}\n        disabled={uiState === 'loading'}\n      >\n        {removed ? t`Add` : t`Removeโ€ฆ`}\n      </button>\n    </MenuConfirm>\n  );\n}\n\nexport default List;\n","// This is like very lame \"type-checking\" lol\nconst notificationTypeKeys = {\n  mention: ['account', 'status'],\n  status: ['account', 'status'],\n  reblog: ['account', 'status'],\n  follow: ['account'],\n  follow_request: ['account'],\n  favourite: ['account', 'status'],\n  poll: ['status'],\n  update: ['status'],\n};\n\nconst GROUP_TYPES = ['favourite', 'reblog', 'follow'];\nconst groupable = (type) => GROUP_TYPES.includes(type);\n\nexport function fixNotifications(notifications) {\n  return notifications.filter((notification) => {\n    const { type, id, createdAt } = notification;\n    if (!type) {\n      console.warn('Notification missing type', notification);\n      return false;\n    }\n    if (!id || !createdAt) {\n      console.warn('Notification missing id or createdAt', notification);\n      // Continue processing this despite missing id or createdAt\n    }\n    const keys = notificationTypeKeys[type];\n    if (keys?.length) {\n      return keys.every((key) => !!notification[key]);\n    }\n    return true; // skip other types\n  });\n}\n\nexport function massageNotifications2(notifications) {\n  if (notifications?.notificationGroups) {\n    const {\n      accounts = [],\n      notificationGroups = [],\n      statuses = [],\n    } = notifications;\n    return notificationGroups.map((group) => {\n      const { sampleAccountIds, statusId } = group;\n      const sampleAccounts =\n        sampleAccountIds?.map((id) => accounts.find((a) => a.id === id)) || [];\n      const status = statuses?.find((s) => s.id === statusId) || null;\n      return {\n        ...group,\n        sampleAccounts,\n        status,\n      };\n    });\n  }\n  return notifications;\n}\n\nexport function groupNotifications2(groupNotifications) {\n  // Make grouped notifications to look like faux grouped notifications\n  const newGroupNotifications = groupNotifications.map((gn) => {\n    const {\n      latestPageNotificationAt,\n      mostRecentNotificationId,\n      sampleAccounts,\n      notificationsCount,\n    } = gn;\n\n    return {\n      id: '' + mostRecentNotificationId,\n      createdAt: latestPageNotificationAt,\n      account: sampleAccounts[0],\n      ...gn,\n    };\n  });\n\n  // Merge favourited and reblogged of same status into a single notification\n  // - new type: \"favourite+reblog\"\n  // - sum numbers for `notificationsCount` and `sampleAccounts`\n  const notificationsMap = {};\n  const newGroupNotifications1 = [];\n  for (let i = 0; i < newGroupNotifications.length; i++) {\n    const gn = newGroupNotifications[i];\n    const {\n      type,\n      status,\n      createdAt,\n      notificationsCount,\n      sampleAccounts,\n      groupKey,\n    } = gn;\n    const date = createdAt ? new Date(createdAt).toLocaleDateString() : '';\n    let virtualType = type;\n    // const sameCount =\n    notificationsCount > 0 && notificationsCount === sampleAccounts?.length;\n    // if (sameCount && (type === 'favourite' || type === 'reblog')) {\n    if (type === 'favourite' || type === 'reblog') {\n      virtualType = 'favourite+reblog';\n    }\n    // const key = `${status?.id}-${virtualType}-${date}-${sameCount ? 1 : 0}`;\n    const key = `${status?.id}-${virtualType}-${date}`;\n    const mappedNotification = notificationsMap[key];\n    if (!groupable(type)) {\n      newGroupNotifications1.push(gn);\n    } else if (mappedNotification) {\n      // Merge sampleAccounts + merge _types\n      sampleAccounts.forEach((a) => {\n        const mappedAccount = mappedNotification.sampleAccounts.find(\n          (ma) => ma.id === a.id,\n        );\n        if (!mappedAccount) {\n          mappedNotification.sampleAccounts.push({\n            ...a,\n            _types: [type],\n          });\n        } else {\n          mappedAccount._types.push(type);\n          mappedAccount._types.sort().reverse();\n        }\n      });\n      // mappedNotification.notificationsCount =\n      //   mappedNotification.sampleAccounts.length;\n      mappedNotification.notificationsCount = Math.min(\n        mappedNotification.notificationsCount,\n        notificationsCount,\n      );\n      mappedNotification._notificationsCount.push(notificationsCount);\n      mappedNotification._accounts = mappedNotification.sampleAccounts;\n      mappedNotification._groupKeys.push(groupKey);\n    } else {\n      const accounts = sampleAccounts.map((a) => ({\n        ...a,\n        _types: [type],\n      }));\n      notificationsMap[key] = {\n        ...gn,\n        sampleAccounts: accounts,\n        type: virtualType,\n        _accounts: accounts,\n        _groupKeys: groupKey ? [groupKey] : [],\n        _notificationsCount: [notificationsCount],\n      };\n      newGroupNotifications1.push(notificationsMap[key]);\n    }\n  }\n\n  // 2nd pass.\n  // - Group 1 account favourte/reblog multiple posts\n  // - _statuses: [status, status, ...]\n  const notificationsMap2 = {};\n  const newGroupNotifications2 = [];\n  for (let i = 0; i < newGroupNotifications1.length; i++) {\n    const gn = newGroupNotifications1[i];\n    const { type, account, _accounts, sampleAccounts, createdAt, groupKey } =\n      gn;\n    const date = createdAt ? new Date(createdAt).toLocaleDateString() : '';\n    const hasOneAccount =\n      sampleAccounts?.length === 1 || _accounts?.length === 1;\n    if (\n      (type === 'favourite' ||\n        type === 'reblog' ||\n        type === 'favourite+reblog') &&\n      hasOneAccount\n    ) {\n      const key = `${account?.id}-${type}-${date}`;\n      const mappedNotification = notificationsMap2[key];\n      if (mappedNotification) {\n        mappedNotification._statuses.push(gn.status);\n        mappedNotification._ids += `-${gn.id}`;\n        mappedNotification._groupKeys.push(groupKey);\n      } else {\n        let n = (notificationsMap2[key] = {\n          ...gn,\n          type,\n          _ids: gn.id,\n          _statuses: [gn.status],\n          _groupKeys: groupKey ? [groupKey] : [],\n        });\n        newGroupNotifications2.push(n);\n      }\n    } else {\n      newGroupNotifications2.push(gn);\n    }\n  }\n\n  console.log('newGroupNotifications2', newGroupNotifications2);\n\n  return newGroupNotifications2;\n}\n\nexport default function groupNotifications(notifications) {\n  // Filter out invalid notifications\n  notifications = fixNotifications(notifications);\n\n  // Create new flat list of notifications\n  // Combine sibling notifications based on type and status id\n  // Concat all notification.account into an array of _accounts\n  const notificationsMap = {};\n  const cleanNotifications = [];\n  for (let i = 0, j = 0; i < notifications.length; i++) {\n    const notification = notifications[i];\n    const { id, status, account, type, createdAt } = notification;\n    const date = createdAt ? new Date(createdAt).toLocaleDateString() : '';\n    let virtualType = type;\n    if (type === 'favourite' || type === 'reblog') {\n      virtualType = 'favourite+reblog';\n    }\n    const key = `${status?.id}-${virtualType}-${date}`;\n    const mappedNotification = notificationsMap[key];\n    if (!groupable(type)) {\n      cleanNotifications[j++] = notification;\n    } else if (mappedNotification?.account) {\n      const mappedAccount = mappedNotification._accounts.find(\n        (a) => a.id === account.id,\n      );\n      if (mappedAccount) {\n        mappedAccount._types.push(type);\n        mappedAccount._types.sort().reverse();\n        mappedNotification._ids += `-${id}`;\n      } else {\n        account._types = [type];\n        mappedNotification._accounts.push(account);\n        mappedNotification._ids += `-${id}`;\n      }\n    } else {\n      if (account) account._types = [type];\n      let n = (notificationsMap[key] = {\n        ...notification,\n        type: virtualType,\n        _ids: id,\n        _accounts: account ? [account] : [],\n      });\n      cleanNotifications[j++] = n;\n    }\n  }\n\n  // 2nd pass to group \"favourite+reblog\"-type notifications by account if _accounts.length <= 1\n  // This means one acount has favourited and reblogged the multiple statuses\n  // The grouped notification\n  // - type: \"favourite+reblog+account\"\n  // - _statuses: [status, status, ...]\n  const notificationsMap2 = {};\n  const cleanNotifications2 = [];\n  for (let i = 0, j = 0; i < cleanNotifications.length; i++) {\n    const notification = cleanNotifications[i];\n    const { id, account, _accounts, type, createdAt } = notification;\n    const date = createdAt ? new Date(createdAt).toLocaleDateString() : '';\n    if (type === 'favourite+reblog' && account && _accounts.length === 1) {\n      const key = `${account?.id}-${type}-${date}`;\n      const mappedNotification = notificationsMap2[key];\n      if (mappedNotification) {\n        mappedNotification._statuses.push(notification.status);\n        mappedNotification._ids += `-${id}`;\n      } else {\n        let n = (notificationsMap2[key] = {\n          ...notification,\n          type,\n          _ids: id,\n          _statuses: [notification.status],\n        });\n        cleanNotifications2[j++] = n;\n      }\n    } else {\n      cleanNotifications2[j++] = notification;\n    }\n  }\n\n  console.log({ notifications, cleanNotifications, cleanNotifications2 });\n\n  // return cleanNotifications;\n  return cleanNotifications2;\n}\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { useMemo, useRef, useState } from 'preact/hooks';\nimport { useSearchParams } from 'react-router-dom';\n\nimport Link from '../components/link';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { fixNotifications } from '../utils/group-notifications';\nimport { saveStatus } from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\nconst emptySearchParams = new URLSearchParams();\n\nfunction Mentions({ columnMode, ...props }) {\n  const { t } = useLingui();\n  const { masto, instance } = api();\n  const [searchParams] = columnMode ? [emptySearchParams] : useSearchParams();\n  const [stateType, setStateType] = useState(null);\n  const type = props?.type || searchParams.get('type') || stateType;\n  useTitle(type === 'private' ? t`Private mentions` : t`Mentions`, '/mentions');\n\n  const mentionsIterator = useRef();\n  const latestItem = useRef();\n\n  async function fetchMentions(firstLoad) {\n    if (firstLoad || !mentionsIterator.current) {\n      mentionsIterator.current = masto.v1.notifications.list({\n        limit: LIMIT,\n        types: ['mention'],\n      });\n    }\n    const results = await mentionsIterator.current.next();\n    let { value } = results;\n    if (value?.length) {\n      value = fixNotifications(value);\n\n      if (firstLoad) {\n        latestItem.current = value[0].id;\n        console.log('First load', latestItem.current);\n      }\n\n      value.forEach(({ status: item }) => {\n        saveStatus(item, instance);\n      });\n    }\n    return {\n      ...results,\n      value: value?.map((item) => item.status),\n    };\n  }\n\n  const conversationsIterator = useRef();\n  const latestConversationItem = useRef();\n  async function fetchConversations(firstLoad) {\n    if (firstLoad || !conversationsIterator.current) {\n      conversationsIterator.current = masto.v1.conversations.list({\n        limit: LIMIT,\n      });\n    }\n    const results = await conversationsIterator.current.next();\n    let { value } = results;\n    value = value?.filter((item) => item.lastStatus);\n    if (value?.length) {\n      if (firstLoad) {\n        latestConversationItem.current = value[0].lastStatus.id;\n        console.log('First load', latestConversationItem.current);\n      }\n\n      value.forEach(({ lastStatus: item }) => {\n        saveStatus(item, instance);\n      });\n    }\n    console.log('results', results);\n    return {\n      ...results,\n      value: value?.map((item) => item.lastStatus),\n    };\n  }\n\n  function fetchItems(...args) {\n    if (type === 'private') {\n      return fetchConversations(...args);\n    }\n    return fetchMentions(...args);\n  }\n\n  async function checkForUpdates() {\n    if (type === 'private') {\n      try {\n        const results = await masto.v1.conversations\n          .list({\n            limit: 1,\n            since_id: latestConversationItem.current,\n          })\n          .next();\n        let { value } = results;\n        console.log(\n          'checkForUpdates PRIVATE',\n          latestConversationItem.current,\n          value,\n        );\n        const valueContainsLatestItem =\n          value[0]?.id === latestConversationItem.current; // since_id might not be supported\n        if (value?.length && !valueContainsLatestItem) {\n          latestConversationItem.current = value[0].lastStatus.id;\n          return true;\n        }\n        return false;\n      } catch (e) {\n        return false;\n      }\n    } else {\n      try {\n        const results = await masto.v1.notifications\n          .list({\n            limit: 1,\n            types: ['mention'],\n            since_id: latestItem.current,\n          })\n          .next();\n        let { value } = results;\n        console.log('checkForUpdates ALL', latestItem.current, value);\n        if (value?.length) {\n          latestItem.current = value[0].id;\n          return true;\n        }\n        return false;\n      } catch (e) {\n        return false;\n      }\n    }\n  }\n\n  const TimelineStart = useMemo(() => {\n    return (\n      <div class=\"filter-bar centered\">\n        <Link\n          to=\"/mentions\"\n          class={!type ? 'is-active' : ''}\n          onClick={(e) => {\n            if (columnMode) {\n              e.preventDefault();\n              setStateType(null);\n            }\n          }}\n        >\n          <Trans>All</Trans>\n        </Link>\n        <Link\n          to=\"/mentions?type=private\"\n          class={type === 'private' ? 'is-active' : ''}\n          onClick={(e) => {\n            if (columnMode) {\n              e.preventDefault();\n              setStateType('private');\n            }\n          }}\n        >\n          <Trans>Private</Trans>\n        </Link>\n      </div>\n    );\n  }, [type]);\n\n  return (\n    <Timeline\n      title={t`Mentions`}\n      id=\"mentions\"\n      emptyText={t`No one mentioned you :(`}\n      errorText={t`Unable to load mentions.`}\n      instance={instance}\n      fetchItems={fetchItems}\n      checkForUpdates={checkForUpdates}\n      useItemID\n      timelineStart={TimelineStart}\n      refresh={type}\n    />\n  );\n}\n\nexport default Mentions;\n","import './notifications.css';\n\nimport { msg } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { InView } from 'react-intersection-observer';\nimport { useSearchParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\nimport { subscribeKey } from 'valtio/utils';\n\nimport AccountBlock from '../components/account-block';\nimport FollowRequestButtons from '../components/follow-request-buttons';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport Modal from '../components/modal';\nimport NavMenu from '../components/nav-menu';\nimport Notification from '../components/notification';\nimport Status from '../components/status';\nimport { api } from '../utils/api';\nimport enhanceContent from '../utils/enhance-content';\nimport groupNotifications, {\n  groupNotifications2,\n  massageNotifications2,\n} from '../utils/group-notifications';\nimport handleContentLinks from '../utils/handle-content-links';\nimport mem from '../utils/mem';\nimport niceDateTime from '../utils/nice-date-time';\nimport { getRegistration } from '../utils/push-notifications';\nimport shortenNumber from '../utils/shorten-number';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus } from '../utils/states';\nimport store from '../utils/store';\nimport { getCurrentInstance } from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport usePageVisibility from '../utils/usePageVisibility';\nimport useScroll from '../utils/useScroll';\nimport useTitle from '../utils/useTitle';\n\nconst NOTIFICATIONS_LIMIT = 80;\nconst NOTIFICATIONS_GROUPED_LIMIT = 20;\nconst emptySearchParams = new URLSearchParams();\n\nconst scrollIntoViewOptions = {\n  block: 'center',\n  inline: 'center',\n  behavior: 'smooth',\n};\n\nconst memSupportsGroupedNotifications = mem(\n  () => supports('@mastodon/grouped-notifications'),\n  {\n    maxAge: 1000 * 60 * 5, // 5 minutes\n  },\n);\n\nexport function mastoFetchNotifications(opts = {}) {\n  const { masto } = api();\n  if (\n    states.settings.groupedNotificationsAlpha &&\n    memSupportsGroupedNotifications()\n  ) {\n    // https://github.com/mastodon/mastodon/pull/29889\n    return masto.v2.notifications.list({\n      limit: NOTIFICATIONS_GROUPED_LIMIT,\n      ...opts,\n    });\n  } else {\n    return masto.v1.notifications.list({\n      limit: NOTIFICATIONS_LIMIT,\n      ...opts,\n    });\n  }\n}\n\nexport function getGroupedNotifications(notifications) {\n  if (\n    states.settings.groupedNotificationsAlpha &&\n    memSupportsGroupedNotifications()\n  ) {\n    return groupNotifications2(notifications);\n  } else {\n    return groupNotifications(notifications);\n  }\n}\n\nconst NOTIFICATIONS_POLICIES = [\n  'forNotFollowing',\n  'forNotFollowers',\n  'forNewAccounts',\n  'forPrivateMentions',\n  'forLimitedAccounts',\n];\nconst NOTIFICATIONS_POLICIES_TEXT = {\n  forNotFollowing: msg`You don't follow`,\n  forNotFollowers: msg`Who don't follow you`,\n  forNewAccounts: msg`With a new account`,\n  forPrivateMentions: msg`Who unsolicitedly private mention you`,\n  forLimitedAccounts: msg`Who are limited by server moderators`,\n};\n\nfunction Notifications({ columnMode }) {\n  const { _, t } = useLingui();\n  useTitle(t`Notifications`, '/notifications');\n  const { masto, instance } = api();\n  const snapStates = useSnapshot(states);\n  const [uiState, setUIState] = useState('default');\n  const [searchParams] = columnMode ? [emptySearchParams] : useSearchParams();\n  const notificationID = searchParams.get('id');\n  const notificationAccessToken = searchParams.get('access_token');\n  const [showMore, setShowMore] = useState(false);\n  const [onlyMentions, setOnlyMentions] = useState(false);\n  const scrollableRef = useRef();\n  const { nearReachEnd, scrollDirection, reachStart, nearReachStart } =\n    useScroll({\n      scrollableRef,\n    });\n  const hiddenUI = scrollDirection === 'end' && !nearReachStart;\n  const [followRequests, setFollowRequests] = useState([]);\n  const [announcements, setAnnouncements] = useState([]);\n\n  console.debug('RENDER Notifications');\n\n  const notificationsIterator = useRef();\n  async function fetchNotifications(firstLoad) {\n    if (firstLoad || !notificationsIterator.current) {\n      // Reset iterator\n      notificationsIterator.current = mastoFetchNotifications({\n        excludeTypes: ['follow_request'],\n      });\n    }\n    if (/max_id=($|&)/i.test(notificationsIterator.current?.nextParams)) {\n      // Pixelfed returns next paginationed link with empty max_id\n      // I assume, it's done (end of list)\n      return {\n        done: true,\n      };\n    }\n    const allNotifications = await notificationsIterator.current.next();\n    const notifications = massageNotifications2(allNotifications.value);\n\n    if (notifications?.length) {\n      notifications.forEach((notification) => {\n        saveStatus(notification.status, instance, {\n          skipThreading: true,\n        });\n      });\n\n      // TEST: Slot in a fake notification to test 'severed_relationships'\n      // notifications.unshift({\n      //   id: '123123',\n      //   type: 'severed_relationships',\n      //   createdAt: '2024-03-22T19:20:08.316Z',\n      //   event: {\n      //     type: 'account_suspension',\n      //     targetName: 'mastodon.dev',\n      //     followersCount: 0,\n      //     followingCount: 0,\n      //   },\n      // });\n\n      // TEST: Slot in a fake notification to test 'moderation_warning'\n      // notifications.unshift({\n      //   id: '123123',\n      //   type: 'moderation_warning',\n      //   createdAt: new Date().toISOString(),\n      //   moderation_warning: {\n      //     id: '1231234',\n      //     action: 'mark_statuses_as_sensitive',\n      //   },\n      // });\n\n      // console.log({ notifications });\n\n      const groupedNotifications = getGroupedNotifications(notifications);\n\n      if (firstLoad) {\n        states.notificationsLast = groupedNotifications[0];\n        states.notifications = groupedNotifications;\n\n        // Update last read marker\n        masto.v1.markers\n          .create({\n            notifications: {\n              lastReadId: groupedNotifications[0].id,\n            },\n          })\n          .catch(() => {});\n      } else {\n        states.notifications.push(...groupedNotifications);\n      }\n    }\n\n    states.notificationsShowNew = false;\n    states.notificationsLastFetchTime = Date.now();\n    return allNotifications;\n  }\n\n  async function fetchFollowRequests() {\n    // Note: no pagination here yet because this better be on a separate page. Should be rare use-case???\n    try {\n      return await masto.v1.followRequests.list({\n        limit: 80,\n      });\n    } catch (e) {\n      // Silently fail\n      return [];\n    }\n  }\n\n  const loadFollowRequests = () => {\n    setUIState('loading');\n    (async () => {\n      try {\n        const requests = await fetchFollowRequests();\n        setFollowRequests(requests);\n        setUIState('default');\n      } catch (e) {\n        setUIState('error');\n      }\n    })();\n  };\n\n  async function fetchAnnouncements() {\n    try {\n      return await masto.v1.announcements.list();\n    } catch (e) {\n      // Silently fail\n      return [];\n    }\n  }\n\n  const supportsFilteredNotifications = supports(\n    '@mastodon/filtered-notifications',\n  );\n  const [showNotificationsSettings, setShowNotificationsSettings] =\n    useState(false);\n  const [notificationsPolicy, setNotificationsPolicy] = useState({});\n  function fetchNotificationsPolicy() {\n    return masto.v2.notifications.policy.fetch().catch(() => {});\n  }\n  function loadNotificationsPolicy() {\n    fetchNotificationsPolicy()\n      .then((policy) => {\n        console.log('โœจ Notifications policy', policy);\n        setNotificationsPolicy(policy);\n      })\n      .catch(() => {});\n  }\n  const [notificationsRequests, setNotificationsRequests] = useState(null);\n  function fetchNotificationsRequest() {\n    return masto.v1.notifications.requests.list();\n  }\n\n  const loadNotifications = (firstLoad) => {\n    setShowNew(false);\n    setUIState('loading');\n    (async () => {\n      try {\n        const fetchNotificationsPromise = fetchNotifications(firstLoad);\n\n        if (firstLoad) {\n          fetchAnnouncements()\n            .then((announcements) => {\n              announcements.sort((a, b) => {\n                // Sort by updatedAt first, then createdAt\n                const aDate = new Date(a.updatedAt || a.createdAt);\n                const bDate = new Date(b.updatedAt || b.createdAt);\n                return bDate - aDate;\n              });\n              setAnnouncements(announcements);\n            })\n            .catch(() => {});\n\n          fetchFollowRequests()\n            .then((requests) => {\n              setFollowRequests(requests);\n            })\n            .catch(() => {});\n\n          if (supportsFilteredNotifications) {\n            loadNotificationsPolicy();\n          }\n        }\n\n        const { done } = await fetchNotificationsPromise;\n        setShowMore(!done);\n\n        setUIState('default');\n      } catch (e) {\n        console.error(e);\n        setUIState('error');\n      }\n    })();\n  };\n\n  useEffect(() => {\n    loadNotifications(true);\n  }, []);\n  useEffect(() => {\n    if (reachStart) {\n      loadNotifications(true);\n    }\n  }, [reachStart]);\n\n  // useEffect(() => {\n  //   if (nearReachEnd && showMore) {\n  //     loadNotifications();\n  //   }\n  // }, [nearReachEnd, showMore]);\n\n  const [showNew, setShowNew] = useState(false);\n\n  const loadUpdates = useCallback(\n    ({ disableIdleCheck = false } = {}) => {\n      if (uiState === 'loading') {\n        return;\n      }\n      console.log('โœจ Load updates', {\n        autoRefresh: snapStates.settings.autoRefresh,\n        scrollTop: scrollableRef.current?.scrollTop,\n        inBackground: inBackground(),\n        disableIdleCheck,\n      });\n      if (\n        snapStates.settings.autoRefresh &&\n        scrollableRef.current?.scrollTop < 16 &&\n        (disableIdleCheck || window.__IDLE__) &&\n        !inBackground()\n      ) {\n        loadNotifications(true);\n      }\n    },\n    [snapStates.notificationsShowNew, snapStates.settings.autoRefresh, uiState],\n  );\n  // useEffect(loadUpdates, [snapStates.notificationsShowNew]);\n\n  const lastHiddenTime = useRef();\n  usePageVisibility((visible) => {\n    if (visible) {\n      const timeDiff = Date.now() - lastHiddenTime.current;\n      if (!lastHiddenTime.current || timeDiff > 1000 * 3) {\n        // 3 seconds\n        loadUpdates({\n          disableIdleCheck: true,\n        });\n      } else {\n        lastHiddenTime.current = Date.now();\n      }\n    }\n  });\n  const firstLoad = useRef(true);\n  useEffect(() => {\n    let unsub = subscribeKey(states, 'notificationsShowNew', (v) => {\n      if (firstLoad.current) {\n        firstLoad.current = false;\n        return;\n      }\n      if (uiState === 'loading') return;\n      if (v) loadUpdates();\n      setShowNew(v);\n    });\n    return () => unsub?.();\n  }, []);\n\n  const todayDate = new Date();\n  const yesterdayDate = new Date(todayDate - 24 * 60 * 60 * 1000);\n  let currentDay = new Date();\n  const showTodayEmpty = !snapStates.notifications.some(\n    (notification) =>\n      new Date(notification.createdAt).toDateString() ===\n      todayDate.toDateString(),\n  );\n\n  const announcementsListRef = useRef();\n\n  useEffect(() => {\n    if (notificationID) {\n      states.routeNotification = {\n        id: notificationID,\n        accessToken: atob(notificationAccessToken),\n      };\n    }\n  }, [notificationID, notificationAccessToken]);\n\n  // useEffect(() => {\n  //   if (uiState === 'default') {\n  //     (async () => {\n  //       try {\n  //         const registration = await getRegistration();\n  //         if (registration?.getNotifications) {\n  //           const notifications = await registration.getNotifications();\n  //           console.log('๐Ÿ”” Push notifications', notifications);\n  //           // Close all notifications?\n  //           // notifications.forEach((notification) => {\n  //           //   notification.close();\n  //           // });\n  //         }\n  //       } catch (e) {}\n  //     })();\n  //   }\n  // }, [uiState]);\n\n  const [annualReportNotification, setAnnualReportNotification] =\n    useState(null);\n  useEffect(async () => {\n    // Skip this if not in December\n    const date = new Date();\n    if (date.getMonth() !== 11) return;\n\n    // Skip if doesn't support annual report\n    if (!supports('@mastodon/annual-report')) return;\n\n    let annualReportNotification = store.account.get(\n      'annualReportNotification',\n    );\n    if (annualReportNotification) {\n      setAnnualReportNotification(annualReportNotification);\n      return;\n    }\n    const notificationIterator = mastoFetchNotifications({\n      types: ['annual_report'],\n    });\n    try {\n      const notification = await notificationIterator.next();\n      annualReportNotification = notification?.value?.notificationGroups?.[0];\n      const annualReportYear = annualReportNotification?.annualReport?.year;\n      // If same year, show the annual report\n      if (annualReportYear == date.getFullYear()) {\n        console.log(\n          'ANNUAL REPORT',\n          annualReportYear,\n          annualReportNotification,\n        );\n        setAnnualReportNotification(annualReportNotification);\n        store.account.set('annualReportNotification', annualReportNotification);\n      }\n    } catch (e) {\n      console.warn(e);\n    }\n  }, []);\n\n  const itemsSelector = '.notification';\n  const jRef = useHotkeys('j', () => {\n    const activeItem = document.activeElement.closest(itemsSelector);\n    const activeItemRect = activeItem?.getBoundingClientRect();\n    const allItems = Array.from(\n      scrollableRef.current.querySelectorAll(itemsSelector),\n    );\n    if (\n      activeItem &&\n      activeItemRect.top < scrollableRef.current.clientHeight &&\n      activeItemRect.bottom > 0\n    ) {\n      const activeItemIndex = allItems.indexOf(activeItem);\n      let nextItem = allItems[activeItemIndex + 1];\n      if (nextItem) {\n        nextItem.focus();\n        nextItem.scrollIntoView(scrollIntoViewOptions);\n      }\n    } else {\n      const topmostItem = allItems.find((item) => {\n        const itemRect = item.getBoundingClientRect();\n        return itemRect.top >= 44 && itemRect.left >= 0;\n      });\n      if (topmostItem) {\n        topmostItem.focus();\n        topmostItem.scrollIntoView(scrollIntoViewOptions);\n      }\n    }\n  });\n\n  const kRef = useHotkeys('k', () => {\n    // focus on previous status after active item\n    const activeItem = document.activeElement.closest(itemsSelector);\n    const activeItemRect = activeItem?.getBoundingClientRect();\n    const allItems = Array.from(\n      scrollableRef.current.querySelectorAll(itemsSelector),\n    );\n    if (\n      activeItem &&\n      activeItemRect.top < scrollableRef.current.clientHeight &&\n      activeItemRect.bottom > 0\n    ) {\n      const activeItemIndex = allItems.indexOf(activeItem);\n      let prevItem = allItems[activeItemIndex - 1];\n      if (prevItem) {\n        prevItem.focus();\n        prevItem.scrollIntoView(scrollIntoViewOptions);\n      }\n    } else {\n      const topmostItem = allItems.find((item) => {\n        const itemRect = item.getBoundingClientRect();\n        return itemRect.top >= 44 && itemRect.left >= 0;\n      });\n      if (topmostItem) {\n        topmostItem.focus();\n        topmostItem.scrollIntoView(scrollIntoViewOptions);\n      }\n    }\n  });\n\n  const oRef = useHotkeys(['enter', 'o'], () => {\n    const activeItem = document.activeElement.closest(itemsSelector);\n    const statusLink = activeItem?.querySelector('.status-link');\n    if (statusLink) {\n      statusLink.click();\n    }\n  });\n\n  const today = new Date();\n  const todaySubHeading = useMemo(() => {\n    return niceDateTime(today, {\n      forceOpts: {\n        weekday: 'long',\n      },\n    });\n  }, [today]);\n\n  return (\n    <div\n      id=\"notifications-page\"\n      class=\"deck-container\"\n      ref={(node) => {\n        scrollableRef.current = node;\n        jRef(node);\n        kRef(node);\n        oRef(node);\n      }}\n      tabIndex=\"-1\"\n    >\n      <div class={`timeline-deck deck ${onlyMentions ? 'only-mentions' : ''}`}>\n        <header\n          hidden={hiddenUI}\n          onClick={(e) => {\n            if (!e.target.closest('a, button')) {\n              scrollableRef.current?.scrollTo({ top: 0, behavior: 'smooth' });\n            }\n          }}\n          onDblClick={(e) => {\n            if (!e.target.closest('a, button')) {\n              loadNotifications(true);\n            }\n          }}\n          class={uiState === 'loading' ? 'loading' : ''}\n        >\n          <div class=\"header-grid\">\n            <div class=\"header-side\">\n              <NavMenu />\n              <Link to=\"/\" class=\"button plain\">\n                <Icon icon=\"home\" size=\"l\" alt={t`Home`} />\n              </Link>\n            </div>\n            <h1>\n              <Trans>Notifications</Trans>\n            </h1>\n            <div class=\"header-side\">\n              {supportsFilteredNotifications && (\n                <button\n                  type=\"button\"\n                  class=\"button plain4\"\n                  onClick={() => {\n                    setShowNotificationsSettings(true);\n                  }}\n                >\n                  <Icon\n                    icon=\"settings\"\n                    size=\"l\"\n                    alt={t`Notifications settings`}\n                  />\n                </button>\n              )}\n            </div>\n          </div>\n          {showNew && uiState !== 'loading' && (\n            <button\n              class=\"updates-button shiny-pill\"\n              type=\"button\"\n              onClick={() => {\n                loadNotifications(true);\n                scrollableRef.current?.scrollTo({\n                  top: 0,\n                  behavior: 'smooth',\n                });\n              }}\n            >\n              <Icon icon=\"arrow-up\" /> <Trans>New notifications</Trans>\n            </button>\n          )}\n        </header>\n        {announcements.length > 0 && (\n          <div class=\"shazam-container\">\n            <div class=\"shazam-container-inner\">\n              <details class=\"announcements\">\n                <summary>\n                  <span>\n                    <Icon icon=\"announce\" class=\"announcement-icon\" size=\"l\" />{' '}\n                    <Plural\n                      value={announcements.length}\n                      one=\"Announcement\"\n                      other=\"Announcements\"\n                    />{' '}\n                    <small class=\"insignificant\">{instance}</small>\n                  </span>\n                  {announcements.length > 1 && (\n                    <span class=\"announcements-nav-buttons\">\n                      {announcements.map((announcement, index) => (\n                        <button\n                          type=\"button\"\n                          class=\"plain2 small\"\n                          onClick={() => {\n                            announcementsListRef.current?.children[\n                              index\n                            ].scrollIntoView({\n                              behavior: 'smooth',\n                              block: 'nearest',\n                            });\n                          }}\n                        >\n                          {index + 1}\n                        </button>\n                      ))}\n                    </span>\n                  )}\n                </summary>\n                <ul\n                  class={`announcements-list-${\n                    announcements.length > 1 ? 'multiple' : 'single'\n                  }`}\n                  ref={announcementsListRef}\n                >\n                  {announcements.map((announcement) => (\n                    <li>\n                      <AnnouncementBlock announcement={announcement} />\n                    </li>\n                  ))}\n                </ul>\n              </details>\n            </div>\n          </div>\n        )}\n        {followRequests.length > 0 && (\n          <div class=\"follow-requests\">\n            <h2 class=\"timeline-header\">\n              <Trans>Follow requests</Trans>\n            </h2>\n            {followRequests.length > 5 ? (\n              <details>\n                <summary>\n                  <Plural\n                    value={followRequests.length}\n                    one=\"# follow request\"\n                    other=\"# follow requests\"\n                  />\n                </summary>\n                <ul>\n                  {followRequests.map((account) => (\n                    <li key={account.id}>\n                      <AccountBlock account={account} />\n                      <FollowRequestButtons\n                        accountID={account.id}\n                        onChange={() => {\n                          // loadFollowRequests();\n                          // loadNotifications(true);\n                        }}\n                      />\n                    </li>\n                  ))}\n                </ul>\n              </details>\n            ) : (\n              <ul>\n                {followRequests.map((account) => (\n                  <li key={account.id}>\n                    <AccountBlock account={account} />\n                    <FollowRequestButtons\n                      accountID={account.id}\n                      onChange={() => {\n                        // loadFollowRequests();\n                        // loadNotifications(true);\n                      }}\n                    />\n                  </li>\n                ))}\n              </ul>\n            )}\n          </div>\n        )}\n        {supportsFilteredNotifications &&\n          notificationsPolicy?.summary?.pendingRequestsCount > 0 && (\n            <div class=\"shazam-container\">\n              <div class=\"shazam-container-inner\">\n                <div class=\"filtered-notifications\">\n                  <details\n                    onToggle={async (e) => {\n                      const { open } = e.target;\n                      if (open) {\n                        const requests = await fetchNotificationsRequest();\n                        setNotificationsRequests(requests);\n                        console.log({ open, requests });\n                      }\n                    }}\n                  >\n                    <summary>\n                      <Plural\n                        value={notificationsPolicy.summary.pendingRequestsCount}\n                        one=\"Filtered notifications from # person\"\n                        other=\"Filtered notifications from # people\"\n                      />\n                    </summary>\n                    {!notificationsRequests ? (\n                      <p class=\"ui-state\">\n                        <Loader abrupt />\n                      </p>\n                    ) : (\n                      notificationsRequests?.length > 0 && (\n                        <ul>\n                          {notificationsRequests.map((request) => (\n                            <li key={request.id}>\n                              <div class=\"request-notifcations\">\n                                {!request.lastStatus?.id && (\n                                  <AccountBlock\n                                    useAvatarStatic\n                                    showStats\n                                    account={request.account}\n                                  />\n                                )}\n                                {request.lastStatus?.id && (\n                                  <div class=\"last-post\">\n                                    <Link\n                                      class=\"status-link\"\n                                      to={`/${instance}/s/${request.lastStatus.id}`}\n                                    >\n                                      <Status\n                                        status={request.lastStatus}\n                                        size=\"s\"\n                                        readOnly\n                                      />\n                                    </Link>\n                                  </div>\n                                )}\n                                <NotificationRequestModalButton\n                                  request={request}\n                                />\n                              </div>\n                              <NotificationRequestButtons\n                                request={request}\n                                onChange={() => {\n                                  loadNotifications(true);\n                                }}\n                              />\n                            </li>\n                          ))}\n                        </ul>\n                      )\n                    )}\n                  </details>\n                </div>\n              </div>\n            </div>\n          )}\n        {annualReportNotification && (\n          <div class=\"shazam-container\">\n            <div class=\"shazam-container-inner\">\n              <Notification notification={annualReportNotification} />\n            </div>\n          </div>\n        )}\n        <div id=\"mentions-option\">\n          <label>\n            <input\n              type=\"checkbox\"\n              checked={onlyMentions}\n              onChange={(e) => {\n                setOnlyMentions(e.target.checked);\n              }}\n            />{' '}\n            <Trans>Only mentions</Trans>\n          </label>\n        </div>\n        <h2 class=\"timeline-header\">\n          <Trans>Today</Trans>{' '}\n          <small class=\"insignificant bidi-isolate\">{todaySubHeading}</small>\n        </h2>\n        {showTodayEmpty && (\n          <p class=\"ui-state insignificant\">\n            {uiState === 'default' ? t`You're all caught up.` : <>&hellip;</>}\n          </p>\n        )}\n        {snapStates.notifications.length ? (\n          <>\n            {snapStates.notifications\n              // This is leaked from Notifications popover\n              .filter((n) => n.type !== 'follow_request')\n              .map((notification) => {\n                if (onlyMentions && notification.type !== 'mention') {\n                  return null;\n                }\n                const notificationDay = new Date(notification.createdAt);\n                const differentDay =\n                  notificationDay.toDateString() !== currentDay.toDateString();\n                if (differentDay) {\n                  currentDay = notificationDay;\n                }\n                // if notificationDay is yesterday, show \"Yesterday\"\n                // if notificationDay is before yesterday, show date\n                const heading =\n                  notificationDay.toDateString() ===\n                  yesterdayDate.toDateString()\n                    ? t`Yesterday`\n                    : niceDateTime(currentDay, {\n                        hideTime: true,\n                      });\n                const subHeading = niceDateTime(currentDay, {\n                  forceOpts: {\n                    weekday: 'long',\n                  },\n                });\n                return (\n                  <Fragment key={notification._ids || notification.id}>\n                    {differentDay && (\n                      <h2 class=\"timeline-header\">\n                        <span>{heading}</span>{' '}\n                        <small class=\"insignificant bidi-isolate\">\n                          {subHeading}\n                        </small>\n                      </h2>\n                    )}\n                    <Notification\n                      instance={instance}\n                      notification={notification}\n                      key={notification._ids || notification.id}\n                    />\n                  </Fragment>\n                );\n              })}\n          </>\n        ) : (\n          <>\n            {uiState === 'loading' && (\n              <>\n                <ul class=\"timeline flat\">\n                  {Array.from({ length: 5 }).map((_, i) => (\n                    <li class=\"notification skeleton\">\n                      <div class=\"notification-type\">\n                        <Icon icon=\"notification\" size=\"xl\" />\n                      </div>\n                      <div class=\"notification-content\">\n                        <p>โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆ</p>\n                      </div>\n                    </li>\n                  ))}\n                </ul>\n              </>\n            )}\n            {uiState === 'error' && (\n              <p class=\"ui-state\">\n                <Trans>Unable to load notifications</Trans>\n                <br />\n                <br />\n                <button type=\"button\" onClick={() => loadNotifications(true)}>\n                  <Trans>Try again</Trans>\n                </button>\n              </p>\n            )}\n          </>\n        )}\n        {showMore && (\n          <InView\n            onChange={(inView) => {\n              if (inView) {\n                loadNotifications();\n              }\n            }}\n          >\n            <button\n              type=\"button\"\n              class=\"plain block\"\n              disabled={uiState === 'loading'}\n              onClick={() => loadNotifications()}\n              style={{ marginBlockEnd: '6em' }}\n            >\n              {uiState === 'loading' ? (\n                <Loader abrupt />\n              ) : (\n                <Trans>Show moreโ€ฆ</Trans>\n              )}\n            </button>\n          </InView>\n        )}\n      </div>\n      {supportsFilteredNotifications && showNotificationsSettings && (\n        <Modal\n          onClick={(e) => {\n            if (e.target === e.currentTarget) {\n              setShowNotificationsSettings(false);\n            }\n          }}\n        >\n          <div class=\"sheet\" id=\"notifications-settings\" tabIndex=\"-1\">\n            <button\n              type=\"button\"\n              class=\"sheet-close\"\n              onClick={() => setShowNotificationsSettings(false)}\n            >\n              <Icon icon=\"x\" alt={t`Close`} />\n            </button>\n            <header>\n              <h2>\n                <Trans>Notifications settings</Trans>\n              </h2>\n            </header>\n            <main>\n              <form\n                onSubmit={(e) => {\n                  e.preventDefault();\n                  const {\n                    forNotFollowing,\n                    forNotFollowers,\n                    forNewAccounts,\n                    forPrivateMentions,\n                    forLimitedAccounts,\n                  } = e.target;\n                  const newPolicy = {\n                    ...notificationsPolicy,\n                    forNotFollowing: forNotFollowing.value,\n                    forNotFollowers: forNotFollowers.value,\n                    forNewAccounts: forNewAccounts.value,\n                    forPrivateMentions: forPrivateMentions.value,\n                    forLimitedAccounts: forLimitedAccounts.value,\n                  };\n                  setNotificationsPolicy(newPolicy);\n                  setShowNotificationsSettings(false);\n                  (async () => {\n                    try {\n                      await masto.v2.notifications.policy.update(newPolicy);\n                      showToast(t`Notifications settings updated`);\n                    } catch (e) {\n                      console.error(e);\n                    }\n                  })();\n                }}\n              >\n                <p>\n                  <Trans>Filter out notifications from people:</Trans>\n                </p>\n                <div class=\"notification-policy-fields\">\n                  {NOTIFICATIONS_POLICIES.map((key) => {\n                    const value = notificationsPolicy[key];\n                    return (\n                      <div key={key}>\n                        <label>\n                          {_(NOTIFICATIONS_POLICIES_TEXT[key])}\n                          <select name={key} defaultValue={value} class=\"small\">\n                            <option value=\"accept\">\n                              <Trans>Accept</Trans>\n                            </option>\n                            <option value=\"filter\">\n                              <Trans>Filter</Trans>\n                            </option>\n                            <option value=\"drop\">\n                              <Trans>Ignore</Trans>\n                            </option>\n                          </select>\n                        </label>\n                      </div>\n                    );\n                  })}\n                </div>\n                <p>\n                  <button type=\"submit\">\n                    <Trans>Save</Trans>\n                  </button>\n                </p>\n              </form>\n            </main>\n          </div>\n        </Modal>\n      )}\n    </div>\n  );\n}\n\nfunction inBackground() {\n  return !!document.querySelector('.deck-backdrop, #modal-container > *');\n}\n\nfunction AnnouncementBlock({ announcement }) {\n  const { instance } = api();\n  const { contact } = getCurrentInstance();\n  const contactAccount = contact?.account;\n  const {\n    id,\n    content,\n    startsAt,\n    endsAt,\n    published,\n    allDay,\n    publishedAt,\n    updatedAt,\n    read,\n    mentions,\n    statuses,\n    tags,\n    emojis,\n    reactions,\n  } = announcement;\n\n  const publishedAtDate = new Date(publishedAt);\n  const publishedDateText = niceDateTime(publishedAtDate);\n  const updatedAtDate = new Date(updatedAt);\n  const updatedAtText = niceDateTime(updatedAtDate);\n\n  return (\n    <div class=\"announcement-block\">\n      <AccountBlock account={contactAccount} />\n      <div\n        class=\"announcement-content\"\n        onClick={handleContentLinks({ mentions, instance })}\n        dangerouslySetInnerHTML={{\n          __html: enhanceContent(content, {\n            emojis,\n          }),\n        }}\n      />\n      <p class=\"insignificant\">\n        <time datetime={publishedAtDate.toISOString()}>\n          {niceDateTime(publishedAtDate)}\n        </time>\n        {updatedAt && updatedAtText !== publishedDateText && (\n          <>\n            {' '}\n            &bull;{' '}\n            <span class=\"ib\">\n              <Trans>\n                Updated{' '}\n                <time datetime={updatedAtDate.toISOString()}>\n                  {niceDateTime(updatedAtDate)}\n                </time>\n              </Trans>\n            </span>\n          </>\n        )}\n      </p>\n      <div class=\"announcement-reactions\" hidden>\n        {reactions.map((reaction) => {\n          const { name, count, me, staticUrl, url } = reaction;\n          return (\n            <button type=\"button\" class={`plain4 small ${me ? 'reacted' : ''}`}>\n              {url || staticUrl ? (\n                <img src={url || staticUrl} alt={name} width=\"16\" height=\"16\" />\n              ) : (\n                <span>{name}</span>\n              )}{' '}\n              <span class=\"count\">{shortenNumber(count)}</span>\n            </button>\n          );\n        })}\n      </div>\n    </div>\n  );\n}\n\nfunction fetchNotficationsByAccount(accountID) {\n  const { masto } = api();\n  return masto.v1.notifications.list({\n    accountID,\n  });\n}\nfunction NotificationRequestModalButton({ request }) {\n  const { instance } = api();\n  const [uiState, setUIState] = useState('loading');\n  const { account, lastStatus } = request;\n  const [showModal, setShowModal] = useState(false);\n  const [notifications, setNotifications] = useState([]);\n\n  function onClose() {\n    setShowModal(false);\n  }\n\n  useEffect(() => {\n    if (!request?.account?.id) return;\n    if (!showModal) return;\n    setUIState('loading');\n    (async () => {\n      const notifs = await fetchNotficationsByAccount(request.account.id);\n      setNotifications(notifs || []);\n      setUIState('default');\n    })();\n  }, [showModal, request?.account?.id]);\n\n  return (\n    <>\n      <button\n        type=\"button\"\n        class=\"plain4 request-notifications-account\"\n        onClick={() => {\n          setShowModal(true);\n        }}\n      >\n        <Icon icon=\"notification\" class=\"more-insignificant\" />{' '}\n        <small>\n          <Trans>\n            View notifications from{' '}\n            <span class=\"bidi-isolate\">@{account.username}</span>\n          </Trans>\n        </small>{' '}\n        <Icon icon=\"chevron-down\" />\n      </button>\n      {showModal && (\n        <Modal\n          onClick={(e) => {\n            if (e.target === e.currentTarget) {\n              onClose();\n            }\n          }}\n        >\n          <div class=\"sheet\" tabIndex=\"-1\">\n            <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n              <Icon icon=\"x\" alt={t`Close`} />\n            </button>\n            <header>\n              <b>\n                <Trans>\n                  Notifications from{' '}\n                  <span class=\"bidi-isolate\">@{account.username}</span>\n                </Trans>\n              </b>\n            </header>\n            <main>\n              {uiState === 'loading' ? (\n                <p class=\"ui-state\">\n                  <Loader abrupt />\n                </p>\n              ) : (\n                notifications.map((notification) => (\n                  <div\n                    class=\"notification-peek\"\n                    onClick={(e) => {\n                      const { target } = e;\n                      // If button or links\n                      if (\n                        e.target.tagName === 'BUTTON' ||\n                        e.target.tagName === 'A'\n                      ) {\n                        onClose();\n                      }\n                    }}\n                  >\n                    <Notification\n                      instance={instance}\n                      notification={notification}\n                      isStatic\n                    />\n                  </div>\n                ))\n              )}\n            </main>\n          </div>\n        </Modal>\n      )}\n    </>\n  );\n}\n\nfunction NotificationRequestButtons({ request, onChange }) {\n  const { t } = useLingui();\n  const { masto } = api();\n  const [uiState, setUIState] = useState('default');\n  const [requestState, setRequestState] = useState(null); // accept, dismiss\n  const hasRequestState = requestState !== null;\n\n  return (\n    <p class=\"notification-request-buttons\">\n      <button\n        type=\"button\"\n        disabled={uiState === 'loading' || hasRequestState}\n        onClick={() => {\n          setUIState('loading');\n          (async () => {\n            try {\n              await masto.v1.notifications.requests\n                .$select(request.id)\n                .accept();\n              setRequestState('accept');\n              setUIState('default');\n              onChange({\n                request,\n                state: 'accept',\n              });\n              showToast(\n                t`Notifications from @${request.account.username} will not be filtered from now on.`,\n              );\n            } catch (error) {\n              setUIState('error');\n              console.error(error);\n              showToast(t`Unable to accept notification request`);\n            }\n          })();\n        }}\n      >\n        <Trans>Allow</Trans>\n      </button>{' '}\n      <button\n        type=\"button\"\n        disabled={uiState === 'loading' || hasRequestState}\n        class=\"light danger\"\n        onClick={() => {\n          setUIState('loading');\n          (async () => {\n            try {\n              await masto.v1.notifications.requests\n                .$select(request.id)\n                .dismiss();\n              setRequestState('dismiss');\n              setUIState('default');\n              onChange({\n                request,\n                state: 'dismiss',\n              });\n              showToast(\n                t`Notifications from @${request.account.username} will not show up in Filtered notifications from now on.`,\n              );\n            } catch (error) {\n              setUIState('error');\n              console.error(error);\n              showToast(t`Unable to dismiss notification request`);\n            }\n          })();\n        }}\n      >\n        <Trans>Dismiss</Trans>\n      </button>\n      <span class=\"notification-request-states\">\n        {uiState === 'loading' ? (\n          <Loader abrupt />\n        ) : requestState === 'accept' ? (\n          <Icon\n            icon=\"check-circle\"\n            alt={t`Accepted`}\n            class=\"notification-accepted\"\n          />\n        ) : (\n          requestState === 'dismiss' && (\n            <Icon\n              icon=\"x-circle\"\n              alt={t`Dismissed`}\n              class=\"notification-dismissed\"\n            />\n          )\n        )}\n      </span>\n    </p>\n  );\n}\n\nexport default memo(Notifications);\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { Menu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { useRef } from 'preact/hooks';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport Icon from '../components/icon';\nimport Menu2 from '../components/menu2';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport states, { saveStatus } from '../utils/states';\nimport supports from '../utils/supports';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction Public({ local, columnMode, ...props }) {\n  const { t } = useLingui();\n  const snapStates = useSnapshot(states);\n  const isLocal = !!local;\n  const params = columnMode ? {} : useParams();\n  const { masto, instance } = api({\n    instance: props?.instance || params.instance,\n  });\n  const { masto: currentMasto, instance: currentInstance } = api();\n  const title = isLocal\n    ? t`Local timeline (${instance})`\n    : t`Federated timeline (${instance})`;\n  useTitle(title, isLocal ? `/:instance?/p/l` : `/:instance?/p`);\n  // const navigate = useNavigate();\n  const latestItem = useRef();\n\n  const publicIterator = useRef();\n  async function fetchPublic(firstLoad) {\n    if (firstLoad || !publicIterator.current) {\n      const opts = {\n        limit: LIMIT,\n        local: isLocal || undefined,\n      };\n      if (!isLocal && supports('@pixelfed/global-feed')) {\n        opts.remote = true;\n      }\n      publicIterator.current = masto.v1.timelines.public.list(opts);\n    }\n    const results = await publicIterator.current.next();\n    let { value } = results;\n    if (value?.length) {\n      if (firstLoad) {\n        latestItem.current = value[0].id;\n      }\n\n      // value = filteredItems(value, 'public');\n      value.forEach((item) => {\n        saveStatus(item, instance);\n      });\n    }\n    return {\n      ...results,\n      value,\n    };\n  }\n\n  async function checkForUpdates() {\n    try {\n      const results = await masto.v1.timelines.public\n        .list({\n          limit: 1,\n          local: isLocal,\n          since_id: latestItem.current,\n        })\n        .next();\n      let { value } = results;\n      const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported\n      if (value?.length && !valueContainsLatestItem) {\n        value = filteredItems(value, 'public');\n        return true;\n      }\n      return false;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  return (\n    <Timeline\n      key={instance + isLocal}\n      title={title}\n      titleComponent={\n        <h1 class=\"header-double-lines\">\n          <b>{isLocal ? t`Local timeline` : t`Federated timeline`}</b>\n          <div>{instance}</div>\n        </h1>\n      }\n      id=\"public\"\n      instance={instance}\n      emptyText={t`No one has posted anything yet.`}\n      errorText={t`Unable to load posts`}\n      fetchItems={fetchPublic}\n      checkForUpdates={checkForUpdates}\n      useItemID\n      headerStart={<></>}\n      boostsCarousel={snapStates.settings.boostsCarousel}\n      // allowFilters\n      filterContext=\"public\"\n      headerEnd={\n        <Menu2\n          portal\n          // setDownOverflow\n          overflow=\"auto\"\n          viewScroll=\"close\"\n          position=\"anchor\"\n          menuButton={\n            <button type=\"button\" class=\"plain\">\n              <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n            </button>\n          }\n        >\n          <MenuItem href={isLocal ? `/#/${instance}/p` : `/#/${instance}/p/l`}>\n            {isLocal ? (\n              <>\n                <Icon icon=\"transfer\" />{' '}\n                <span>\n                  <Trans>Switch to Federated</Trans>\n                </span>\n              </>\n            ) : (\n              <>\n                <Icon icon=\"transfer\" />{' '}\n                <span>\n                  <Trans>Switch to Local</Trans>\n                </span>\n              </>\n            )}\n          </MenuItem>\n          <MenuDivider />\n          <MenuItem\n            onClick={() => {\n              let newInstance = prompt(\n                t`Enter a new instance e.g. \"mastodon.social\"`,\n              );\n              if (!/\\./.test(newInstance)) {\n                if (newInstance) alert(t`Invalid instance`);\n                return;\n              }\n              if (newInstance) {\n                newInstance = newInstance.toLowerCase().trim();\n                // navigate(isLocal ? `/${newInstance}/p/l` : `/${newInstance}/p`);\n                location.hash = isLocal\n                  ? `/${newInstance}/p/l`\n                  : `/${newInstance}/p`;\n              }\n            }}\n          >\n            <Icon icon=\"bus\" />{' '}\n            <span>\n              <Trans>Go to another instanceโ€ฆ</Trans>\n            </span>\n          </MenuItem>\n          {currentInstance !== instance && (\n            <MenuItem\n              onClick={() => {\n                location.hash = isLocal\n                  ? `/${currentInstance}/p/l`\n                  : `/${currentInstance}/p`;\n              }}\n            >\n              <Icon icon=\"bus\" />{' '}\n              <small class=\"menu-double-lines\">\n                <Trans>\n                  Go to my instance (<b>{currentInstance}</b>)\n                </Trans>\n              </small>\n            </MenuItem>\n          )}\n        </Menu2>\n      }\n    />\n  );\n}\n\nexport default Public;\n","import './search.css';\n\nimport { useAutoAnimate } from '@formkit/auto-animate/preact';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useLayoutEffect, useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { InView } from 'react-intersection-observer';\nimport { useParams, useSearchParams } from 'react-router-dom';\n\nimport AccountBlock from '../components/account-block';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport NavMenu from '../components/nav-menu';\nimport SearchForm from '../components/search-form';\nimport Status from '../components/status';\nimport { api } from '../utils/api';\nimport { fetchRelationships } from '../utils/relationships';\nimport shortenNumber from '../utils/shorten-number';\nimport usePageVisibility from '../utils/usePageVisibility';\nimport useTitle from '../utils/useTitle';\n\nconst SHORT_LIMIT = 5;\nconst LIMIT = 40;\nconst emptySearchParams = new URLSearchParams();\n\nconst scrollIntoViewOptions = {\n  block: 'nearest',\n  inline: 'center',\n  behavior: 'smooth',\n};\n\nfunction Search({ columnMode, ...props }) {\n  const { t } = useLingui();\n  const params = columnMode ? {} : useParams();\n  const { masto, instance, authenticated } = api({\n    instance: params.instance,\n  });\n  const [uiState, setUIState] = useState('default');\n  const [searchParams] = columnMode ? [emptySearchParams] : useSearchParams();\n  const searchFormRef = useRef();\n  const q = props?.query || searchParams.get('q');\n  const type = columnMode\n    ? 'statuses'\n    : props?.type || searchParams.get('type');\n  let title = t`Search`;\n  if (q) {\n    switch (type) {\n      case 'statuses':\n        title = t`Search: ${q} (Posts)`;\n        break;\n      case 'accounts':\n        title = t`Search: ${q} (Accounts)`;\n        break;\n      case 'hashtags':\n        title = t`Search: ${q} (Hashtags)`;\n        break;\n      default:\n        title = t`Search: ${q}`;\n    }\n  }\n  useTitle(title, `/search`);\n\n  const [showMore, setShowMore] = useState(false);\n  const offsetRef = useRef(0);\n  useEffect(() => {\n    offsetRef.current = 0;\n  }, [q, type]);\n\n  const scrollableRef = useRef();\n  useLayoutEffect(() => {\n    scrollableRef.current?.scrollTo?.(0, 0);\n  }, [q, type]);\n\n  const [statusResults, setStatusResults] = useState([]);\n  const [accountResults, setAccountResults] = useState([]);\n  const [hashtagResults, setHashtagResults] = useState([]);\n  useEffect(() => {\n    setStatusResults([]);\n    setAccountResults([]);\n    setHashtagResults([]);\n  }, [q]);\n  const typeResults = {\n    statuses: statusResults,\n    accounts: accountResults,\n    hashtags: hashtagResults,\n  };\n  const setTypeResultsFunc = {\n    statuses: setStatusResults,\n    accounts: setAccountResults,\n    hashtags: setHashtagResults,\n  };\n\n  const [relationshipsMap, setRelationshipsMap] = useState({});\n  const loadRelationships = async (accounts) => {\n    if (!accounts?.length) return;\n    const relationships = await fetchRelationships(accounts, relationshipsMap);\n    if (relationships) {\n      setRelationshipsMap({\n        ...relationshipsMap,\n        ...relationships,\n      });\n    }\n  };\n\n  function loadResults(firstLoad) {\n    if (firstLoad) {\n      offsetRef.current = 0;\n    }\n\n    if (!firstLoad && !authenticated) {\n      // Search results pagination is only available to authenticated users\n      return;\n    }\n\n    setUIState('loading');\n    if (firstLoad && !type) {\n      setStatusResults(statusResults.slice(0, SHORT_LIMIT));\n      setAccountResults(accountResults.slice(0, SHORT_LIMIT));\n      setHashtagResults(hashtagResults.slice(0, SHORT_LIMIT));\n    }\n\n    (async () => {\n      const params = {\n        q,\n        resolve: authenticated,\n        limit: SHORT_LIMIT,\n      };\n      if (type) {\n        params.limit = LIMIT;\n        params.type = type;\n        if (authenticated) params.offset = offsetRef.current;\n      }\n\n      try {\n        const results = await masto.v2.search.fetch(params);\n        console.log(results);\n        if (type) {\n          if (firstLoad) {\n            setTypeResultsFunc[type](results[type]);\n            const length = results[type]?.length;\n            offsetRef.current = LIMIT;\n            setShowMore(!!length);\n          } else {\n            // If first item is the same, it means API doesn't support offset\n            // I know this is a very basic check, but it works for now\n            if (results[type]?.[0]?.id === typeResults[type]?.[0]?.id) {\n              setShowMore(false);\n            } else {\n              setTypeResultsFunc[type]((prev) => [...prev, ...results[type]]);\n              const length = results[type]?.length;\n              offsetRef.current = offsetRef.current + LIMIT;\n              setShowMore(!!length);\n            }\n          }\n        } else {\n          setStatusResults(results.statuses || []);\n          setAccountResults(results.accounts || []);\n          setHashtagResults(results.hashtags || []);\n          offsetRef.current = 0;\n          setShowMore(false);\n        }\n        loadRelationships(results.accounts);\n\n        setUIState('default');\n      } catch (err) {\n        console.error(err);\n        setUIState('error');\n      }\n    })();\n  }\n\n  const lastHiddenTime = useRef();\n  usePageVisibility((visible) => {\n    const reachStart = scrollableRef.current?.scrollTop === 0;\n    if (visible && reachStart) {\n      const timeDiff = Date.now() - lastHiddenTime.current;\n      if (!lastHiddenTime.current || timeDiff > 1000 * 3) {\n        // 3 seconds\n        loadResults(true);\n      } else {\n        lastHiddenTime.current = Date.now();\n      }\n    }\n  });\n\n  useEffect(() => {\n    let timer;\n    searchFormRef.current?.setValue?.(q || '');\n    if (q) {\n      loadResults(true);\n    } else {\n      timer = setTimeout(() => {\n        searchFormRef.current?.focus?.();\n      }, 150); // Right after focusDeck runs\n    }\n    return () => clearTimeout(timer);\n  }, [q, type, instance]);\n\n  useHotkeys(\n    ['/', 'Slash'],\n    (e) => {\n      searchFormRef.current?.focus?.();\n      searchFormRef.current?.select?.();\n    },\n    {\n      preventDefault: true,\n    },\n  );\n\n  const itemsSelector = '.timeline > li > a, .hashtag-list > li > a';\n  const jRef = useHotkeys('j', () => {\n    const activeItem = document.activeElement.closest(itemsSelector);\n    const activeItemRect = activeItem?.getBoundingClientRect();\n    const allItems = Array.from(\n      scrollableRef.current.querySelectorAll(itemsSelector),\n    );\n    if (\n      activeItem &&\n      activeItemRect.top < scrollableRef.current.clientHeight &&\n      activeItemRect.bottom > 0\n    ) {\n      const activeItemIndex = allItems.indexOf(activeItem);\n      let nextItem = allItems[activeItemIndex + 1];\n      if (nextItem) {\n        nextItem.focus();\n        nextItem.scrollIntoView(scrollIntoViewOptions);\n      }\n    } else {\n      const topmostItem = allItems.find((item) => {\n        const itemRect = item.getBoundingClientRect();\n        return itemRect.top >= 44 && itemRect.left >= 0;\n      });\n      if (topmostItem) {\n        topmostItem.focus();\n        topmostItem.scrollIntoView(scrollIntoViewOptions);\n      }\n    }\n  });\n\n  const kRef = useHotkeys('k', () => {\n    // focus on previous status after active item\n    const activeItem = document.activeElement.closest(itemsSelector);\n    const activeItemRect = activeItem?.getBoundingClientRect();\n    const allItems = Array.from(\n      scrollableRef.current.querySelectorAll(itemsSelector),\n    );\n    if (\n      activeItem &&\n      activeItemRect.top < scrollableRef.current.clientHeight &&\n      activeItemRect.bottom > 0\n    ) {\n      const activeItemIndex = allItems.indexOf(activeItem);\n      let prevItem = allItems[activeItemIndex - 1];\n      if (prevItem) {\n        prevItem.focus();\n        prevItem.scrollIntoView(scrollIntoViewOptions);\n      }\n    } else {\n      const topmostItem = allItems.find((item) => {\n        const itemRect = item.getBoundingClientRect();\n        return itemRect.top >= 44 && itemRect.left >= 0;\n      });\n      if (topmostItem) {\n        topmostItem.focus();\n        topmostItem.scrollIntoView(scrollIntoViewOptions);\n      }\n    }\n  });\n\n  const [filterBarParent] = useAutoAnimate();\n\n  return (\n    <div\n      id=\"search-page\"\n      class=\"deck-container\"\n      tabIndex=\"-1\"\n      ref={(node) => {\n        scrollableRef.current = node;\n        jRef(node);\n        kRef(node);\n      }}\n    >\n      <div class=\"timeline-deck deck\">\n        <header class={uiState === 'loading' ? 'loading' : ''}>\n          <div class=\"header-grid\">\n            <div class=\"header-side\">\n              <NavMenu />\n            </div>\n            <SearchForm ref={searchFormRef} />\n            <div class=\"header-side\">\n              <button\n                type=\"button\"\n                class=\"plain\"\n                onClick={() => {\n                  loadResults(true);\n                }}\n                disabled={uiState === 'loading'}\n              >\n                <Icon icon=\"search\" size=\"l\" alt={t`Search`} />\n              </button>\n            </div>\n          </div>\n        </header>\n        <main>\n          {!!q && !columnMode && (\n            <div\n              ref={filterBarParent}\n              class={`filter-bar ${uiState === 'loading' ? 'loading' : ''}`}\n            >\n              {!!type && (\n                <Link to={`/search${q ? `?q=${encodeURIComponent(q)}` : ''}`}>\n                  <Icon icon=\"chevron-left\" /> <Trans>All</Trans>\n                </Link>\n              )}\n              {[\n                {\n                  label: t`Accounts`,\n                  type: 'accounts',\n                  to: `/search?q=${encodeURIComponent(q)}&type=accounts`,\n                },\n                {\n                  label: t`Hashtags`,\n                  type: 'hashtags',\n                  to: `/search?q=${encodeURIComponent(q)}&type=hashtags`,\n                },\n                {\n                  label: t`Posts`,\n                  type: 'statuses',\n                  to: `/search?q=${encodeURIComponent(q)}&type=statuses`,\n                },\n              ]\n                .sort((a, b) => {\n                  if (a.type === type) return -1;\n                  if (b.type === type) return 1;\n                  return 0;\n                })\n                .map((link) => (\n                  <Link to={link.to} key={link.type}>\n                    {link.label}\n                  </Link>\n                ))}\n            </div>\n          )}\n          {!!q ? (\n            <>\n              {(!type || type === 'accounts') && (\n                <>\n                  {type !== 'accounts' && (\n                    <h2 class=\"timeline-header\">\n                      <Trans>Accounts</Trans>{' '}\n                      <Link\n                        to={`/search?q=${encodeURIComponent(q)}&type=accounts`}\n                      >\n                        <Icon icon=\"arrow-right\" size=\"l\" alt={t`See more`} />\n                      </Link>\n                    </h2>\n                  )}\n                  {accountResults.length > 0 ? (\n                    <>\n                      <ul class=\"timeline flat accounts-list\">\n                        {accountResults.map((account) => (\n                          <li key={account.id}>\n                            <AccountBlock\n                              account={account}\n                              instance={instance}\n                              showStats\n                              relationship={relationshipsMap[account.id]}\n                            />\n                          </li>\n                        ))}\n                      </ul>\n                      {type !== 'accounts' && (\n                        <div class=\"ui-state\">\n                          <Link\n                            class=\"plain button\"\n                            to={`/search?q=${encodeURIComponent(\n                              q,\n                            )}&type=accounts`}\n                          >\n                            <Trans>See more accounts</Trans>{' '}\n                            <Icon icon=\"arrow-right\" />\n                          </Link>\n                        </div>\n                      )}\n                    </>\n                  ) : (\n                    !type &&\n                    (uiState === 'loading' ? (\n                      <p class=\"ui-state\">\n                        <Loader abrupt />\n                      </p>\n                    ) : (\n                      <p class=\"ui-state\">\n                        <Trans>No accounts found.</Trans>\n                      </p>\n                    ))\n                  )}\n                </>\n              )}\n              {(!type || type === 'hashtags') && (\n                <>\n                  {type !== 'hashtags' && (\n                    <h2 class=\"timeline-header\">\n                      <Trans>Hashtags</Trans>{' '}\n                      <Link\n                        to={`/search?q=${encodeURIComponent(q)}&type=hashtags`}\n                      >\n                        <Icon icon=\"arrow-right\" size=\"l\" alt={t`See more`} />\n                      </Link>\n                    </h2>\n                  )}\n                  {hashtagResults.length > 0 ? (\n                    <>\n                      <ul class=\"link-list hashtag-list\">\n                        {hashtagResults.map((hashtag) => {\n                          const { name, history } = hashtag;\n                          const total = history?.reduce?.(\n                            (acc, cur) => acc + +cur.uses,\n                            0,\n                          );\n                          return (\n                            <li key={`${name}-${total}`}>\n                              <Link\n                                to={\n                                  instance\n                                    ? `/${instance}/t/${name}`\n                                    : `/t/${name}`\n                                }\n                              >\n                                <Icon icon=\"hashtag\" alt=\"#\" />\n                                <span>{name}</span>\n                                {!!total && (\n                                  <span class=\"count\">\n                                    {shortenNumber(total)}\n                                  </span>\n                                )}\n                              </Link>\n                            </li>\n                          );\n                        })}\n                      </ul>\n                      {type !== 'hashtags' && (\n                        <div class=\"ui-state\">\n                          <Link\n                            class=\"plain button\"\n                            to={`/search?q=${encodeURIComponent(\n                              q,\n                            )}&type=hashtags`}\n                          >\n                            <Trans>See more hashtags</Trans>{' '}\n                            <Icon icon=\"arrow-right\" />\n                          </Link>\n                        </div>\n                      )}\n                    </>\n                  ) : (\n                    !type &&\n                    (uiState === 'loading' ? (\n                      <p class=\"ui-state\">\n                        <Loader abrupt />\n                      </p>\n                    ) : (\n                      <p class=\"ui-state\">\n                        <Trans>No hashtags found.</Trans>\n                      </p>\n                    ))\n                  )}\n                </>\n              )}\n              {(!type || type === 'statuses') && (\n                <>\n                  {type !== 'statuses' && (\n                    <h2 class=\"timeline-header\">\n                      <Trans>Posts</Trans>{' '}\n                      <Link\n                        to={`/search?q=${encodeURIComponent(q)}&type=statuses`}\n                      >\n                        <Icon icon=\"arrow-right\" size=\"l\" alt={t`See more`} />\n                      </Link>\n                    </h2>\n                  )}\n                  {statusResults.length > 0 ? (\n                    <>\n                      <ul class=\"timeline\">\n                        {statusResults.map((status) => (\n                          <li key={status.id}>\n                            <Link\n                              class=\"status-link\"\n                              to={\n                                instance\n                                  ? `/${instance}/s/${status.id}`\n                                  : `/s/${status.id}`\n                              }\n                            >\n                              <Status status={status} />\n                            </Link>\n                          </li>\n                        ))}\n                      </ul>\n                      {type !== 'statuses' && (\n                        <div class=\"ui-state\">\n                          <Link\n                            class=\"plain button\"\n                            to={`/search?q=${encodeURIComponent(\n                              q,\n                            )}&type=statuses`}\n                          >\n                            <Trans>See more posts</Trans>{' '}\n                            <Icon icon=\"arrow-right\" />\n                          </Link>\n                        </div>\n                      )}\n                    </>\n                  ) : (\n                    !type &&\n                    (uiState === 'loading' ? (\n                      <p class=\"ui-state\">\n                        <Loader abrupt />\n                      </p>\n                    ) : (\n                      <p class=\"ui-state\">\n                        <Trans>No posts found.</Trans>\n                      </p>\n                    ))\n                  )}\n                </>\n              )}\n              {!!type &&\n                (uiState === 'default' ? (\n                  showMore ? (\n                    <InView\n                      onChange={(inView) => {\n                        if (inView) {\n                          loadResults();\n                        }\n                      }}\n                    >\n                      <button\n                        type=\"button\"\n                        class=\"plain block\"\n                        onClick={() => loadResults()}\n                        style={{ marginBlockEnd: '6em' }}\n                      >\n                        <Trans>Show moreโ€ฆ</Trans>\n                      </button>\n                    </InView>\n                  ) : (\n                    <p class=\"ui-state insignificant\">\n                      <Trans>The end.</Trans>\n                    </p>\n                  )\n                ) : (\n                  uiState === 'loading' && (\n                    <p class=\"ui-state\">\n                      <Loader abrupt />\n                    </p>\n                  )\n                ))}\n            </>\n          ) : uiState === 'loading' ? (\n            <p class=\"ui-state\">\n              <Loader abrupt />\n            </p>\n          ) : (\n            <p class=\"ui-state\">\n              <Trans>\n                Enter your search term or paste a URL above to get started.\n              </Trans>\n            </p>\n          )}\n        </main>\n      </div>\n    </div>\n  );\n}\n\nexport default Search;\n","import '../components/links-bar.css';\nimport './trending.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { MenuItem } from '@szhsin/react-menu';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport punycode from 'punycode/';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport Menu2 from '../components/menu2';\nimport NameText from '../components/name-text';\nimport RelativeTime from '../components/relative-time';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { oklab2rgb, rgb2oklab } from '../utils/color-utils';\nimport { filteredItems } from '../utils/filters';\nimport pmem from '../utils/pmem';\nimport shortenNumber from '../utils/shorten-number';\nimport states, { saveStatus } from '../utils/states';\nimport supports from '../utils/supports';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\nconst TREND_CACHE_TIME = 10 * 60 * 1000; // 10 minutes\n\nconst fetchLinks = pmem(\n  (masto) => {\n    return masto.v1.trends.links.list().next();\n  },\n  {\n    maxAge: TREND_CACHE_TIME,\n  },\n);\n\nconst fetchHashtags = pmem(\n  (masto) => {\n    return masto.v1.trends.tags.list().next();\n  },\n  {\n    maxAge: TREND_CACHE_TIME,\n  },\n);\n\nfunction fetchTrendsStatuses(masto) {\n  if (supports('@pixelfed/trending')) {\n    return masto.pixelfed.v2.discover.posts.trending.list({\n      range: 'daily',\n    });\n  }\n  return masto.v1.trends.statuses.list({\n    limit: LIMIT,\n  });\n}\n\nfunction fetchLinkList(masto, params) {\n  return masto.v1.timelines.link.list(params);\n}\n\nfunction Trending({ columnMode, ...props }) {\n  const { t } = useLingui();\n  const snapStates = useSnapshot(states);\n  const params = columnMode ? {} : useParams();\n  const { masto, instance } = api({\n    instance: props?.instance || params.instance,\n  });\n  const { masto: currentMasto, instance: currentInstance } = api();\n  const title = t`Trending (${instance})`;\n  useTitle(title, `/:instance?/trending`);\n  // const navigate = useNavigate();\n  const latestItem = useRef();\n\n  const sameCurrentInstance = instance === currentInstance;\n\n  const [hashtags, setHashtags] = useState([]);\n  const [links, setLinks] = useState([]);\n  const trendIterator = useRef();\n\n  async function fetchTrends(firstLoad) {\n    console.log('fetchTrend', firstLoad);\n    if (firstLoad || !trendIterator.current) {\n      trendIterator.current = fetchTrendsStatuses(masto);\n\n      // Get hashtags\n      if (supports('@mastodon/trending-hashtags')) {\n        try {\n          // const iterator = masto.v1.trends.tags.list();\n          const { value: tags } = await fetchHashtags(masto);\n          console.log('tags', tags);\n          if (tags?.length) {\n            setHashtags(tags);\n          }\n        } catch (e) {\n          console.error(e);\n        }\n      }\n\n      // Get links\n      if (supports('@mastodon/trending-links')) {\n        try {\n          const { value } = await fetchLinks(masto, instance);\n          // 4 types available: link, photo, video, rich\n          // Only want links for now\n          const links = value?.filter?.((link) => link.type === 'link');\n          console.log('links', links);\n          if (links?.length) {\n            setLinks(links);\n          }\n        } catch (e) {\n          console.error(e);\n        }\n      }\n    }\n    const results = await trendIterator.current.next();\n    let { value } = results;\n    if (value?.length) {\n      if (firstLoad) {\n        latestItem.current = value[0].id;\n      }\n\n      // value = filteredItems(value, 'public'); // Might not work here\n      value.forEach((item) => {\n        saveStatus(item, instance);\n      });\n    }\n    return {\n      ...results,\n      value,\n    };\n  }\n\n  // Link mentions\n  // https://github.com/mastodon/mastodon/pull/30381\n  const [currentLinkMentionsLoading, setCurrentLinkMentionsLoading] =\n    useState(false);\n  const currentLinkMentionsIterator = useRef();\n  const [currentLink, setCurrentLink] = useState(null);\n  const hasCurrentLink = !!currentLink;\n  const currentLinkRef = useRef();\n  const supportsTrendingLinkPosts =\n    sameCurrentInstance && supports('@mastodon/trending-link-posts');\n\n  useEffect(() => {\n    if (currentLink && currentLinkRef.current) {\n      currentLinkRef.current.scrollIntoView({\n        behavior: 'smooth',\n        block: 'nearest',\n        inline: 'center',\n      });\n    }\n  }, [currentLink]);\n\n  const prevCurrentLink = useRef();\n  async function fetchLinkMentions(firstLoad) {\n    if (firstLoad || !currentLinkMentionsIterator.current) {\n      setCurrentLinkMentionsLoading(true);\n      currentLinkMentionsIterator.current = fetchLinkList(masto, {\n        url: currentLink,\n      });\n    }\n    prevCurrentLink.current = currentLink;\n    const results = await currentLinkMentionsIterator.current.next();\n    let { value } = results;\n    if (value?.length) {\n      value = filteredItems(value, 'public');\n      value.forEach((item) => {\n        saveStatus(item, instance);\n      });\n    }\n    if (prevCurrentLink.current === currentLink) {\n      setCurrentLinkMentionsLoading(false);\n    }\n    return {\n      ...results,\n      value,\n    };\n  }\n\n  async function checkForUpdates() {\n    try {\n      const results = await masto.v1.trends.statuses\n        .list({\n          limit: 1,\n          // NOT SUPPORTED\n          // since_id: latestItem.current,\n        })\n        .next();\n      let { value } = results;\n      value = filteredItems(value, 'public');\n      if (value?.length && value[0].id !== latestItem.current) {\n        latestItem.current = value[0].id;\n        return true;\n      }\n      return false;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  const TimelineStart = useMemo(() => {\n    return (\n      <>\n        {!!hashtags.length && (\n          <div class=\"filter-bar expandable\">\n            <Icon icon=\"chart\" class=\"insignificant\" size=\"l\" />\n            {hashtags.map((tag, i) => {\n              const { name, history } = tag;\n              const total = history.reduce((acc, cur) => acc + +cur.uses, 0);\n              return (\n                <Link to={`/${instance}/t/${name}`} key={name}>\n                  <span dir=\"auto\">\n                    <span class=\"more-insignificant\">#</span>\n                    {name}\n                  </span>\n                  <span class=\"filter-count\">{shortenNumber(total)}</span>\n                </Link>\n              );\n            })}\n          </div>\n        )}\n        {!!links.length && (\n          <div class=\"links-bar\">\n            <header>\n              <h3>\n                <Trans>Trending News</Trans>\n              </h3>\n            </header>\n            {links.map((link) => {\n              const {\n                authors,\n                authorName,\n                authorUrl,\n                blurhash,\n                description,\n                height,\n                image,\n                imageDescription,\n                language,\n                providerName,\n                providerUrl,\n                publishedAt,\n                title,\n                url,\n                width,\n              } = link;\n              const author = authors?.[0]?.account?.id\n                ? authors[0].account\n                : null;\n              const isShortTitle = title.length < 30;\n              const hasAuthor = !!(authorName || author);\n              const domain = punycode.toUnicode(\n                URL.parse(url)\n                  .hostname.replace(/^www\\./, '')\n                  .replace(/\\/$/, ''),\n              );\n              let accentColor;\n              if (blurhash) {\n                const averageColor = getBlurHashAverageColor(blurhash);\n                const labAverageColor = rgb2oklab(averageColor);\n                accentColor = oklab2rgb([\n                  0.6,\n                  labAverageColor[1],\n                  labAverageColor[2],\n                ]);\n              }\n\n              return (\n                <div key={url}>\n                  <a\n                    ref={currentLink === url ? currentLinkRef : null}\n                    href={url}\n                    target=\"_blank\"\n                    rel=\"noopener noreferrer\"\n                    class={`link-block ${\n                      hasCurrentLink\n                        ? currentLink === url\n                          ? 'active'\n                          : 'inactive'\n                        : ''\n                    }`}\n                    style={\n                      accentColor\n                        ? {\n                            '--accent-color': `rgb(${accentColor.join(',')})`,\n                            '--accent-alpha-color': `rgba(${accentColor.join(\n                              ',',\n                            )}, 0.4)`,\n                          }\n                        : {}\n                    }\n                  >\n                    <article>\n                      <figure>\n                        <img\n                          src={image}\n                          alt={imageDescription}\n                          width={width}\n                          height={height}\n                          loading=\"lazy\"\n                        />\n                      </figure>\n                      <div class=\"article-body\">\n                        <header>\n                          <div class=\"article-meta\">\n                            <span class=\"domain\">{domain}</span>{' '}\n                            {!!publishedAt && <>&middot; </>}\n                            {!!publishedAt && (\n                              <>\n                                <RelativeTime\n                                  datetime={publishedAt}\n                                  format=\"micro\"\n                                />\n                              </>\n                            )}\n                          </div>\n                          {!!title && (\n                            <h1\n                              class=\"title\"\n                              lang={language}\n                              dir=\"auto\"\n                              title={title}\n                            >\n                              {title}\n                            </h1>\n                          )}\n                        </header>\n                        {!!description && (\n                          <p\n                            class={`description ${\n                              hasAuthor && !isShortTitle ? '' : 'more-lines'\n                            }`}\n                            lang={language}\n                            dir=\"auto\"\n                            title={description}\n                          >\n                            {description}\n                          </p>\n                        )}\n                        {hasAuthor && (\n                          <>\n                            <hr />\n                            <p class=\"byline\">\n                              <small>\n                                <Trans comment=\"By [Author]\">\n                                  By{' '}\n                                  {author ? (\n                                    <NameText account={author} showAvatar />\n                                  ) : authorUrl ? (\n                                    <a\n                                      href={authorUrl}\n                                      target=\"_blank\"\n                                      rel=\"noopener noreferrer\"\n                                    >\n                                      {authorName}\n                                    </a>\n                                  ) : (\n                                    authorName\n                                  )}\n                                </Trans>\n                              </small>\n                            </p>\n                          </>\n                        )}\n                      </div>\n                    </article>\n                  </a>\n                  {supportsTrendingLinkPosts && (\n                    <button\n                      type=\"button\"\n                      class=\"small plain4 block\"\n                      onClick={() => {\n                        setCurrentLink(url);\n                      }}\n                      disabled={url === currentLink}\n                    >\n                      <Icon icon=\"comment2\" />{' '}\n                      <span>\n                        <Trans>Mentions</Trans>\n                      </span>{' '}\n                      <Icon icon=\"chevron-down\" />\n                    </button>\n                  )}\n                </div>\n              );\n            })}\n          </div>\n        )}\n        {supportsTrendingLinkPosts && !!links.length && (\n          <div\n            class={`timeline-header-block ${hasCurrentLink ? 'blended' : ''}`}\n          >\n            {hasCurrentLink ? (\n              <>\n                <div style={{ width: 50, flexShrink: 0, textAlign: 'center' }}>\n                  {currentLinkMentionsLoading ? (\n                    <Loader abrupt />\n                  ) : (\n                    <button\n                      type=\"button\"\n                      class=\"light\"\n                      onClick={() => {\n                        setCurrentLink(null);\n                      }}\n                    >\n                      <Icon icon=\"x\" alt={t`Back to showing trending posts`} />\n                    </button>\n                  )}\n                </div>\n                <p>\n                  <Trans>\n                    Showing posts mentioning{' '}\n                    <span class=\"link-text\">\n                      {currentLink\n                        .replace(/^https?:\\/\\/(www\\.)?/i, '')\n                        .replace(/\\/$/, '')}\n                    </span>\n                  </Trans>\n                </p>\n              </>\n            ) : (\n              <p class=\"insignificant\">\n                <Trans>Trending posts</Trans>\n              </p>\n            )}\n          </div>\n        )}\n      </>\n    );\n  }, [hashtags, links, currentLink, currentLinkMentionsLoading]);\n\n  return (\n    <Timeline\n      key={instance}\n      title={title}\n      titleComponent={\n        <h1 class=\"header-double-lines\">\n          <b>\n            <Trans>Trending</Trans>\n          </b>\n          <div>{instance}</div>\n        </h1>\n      }\n      id=\"trending\"\n      instance={instance}\n      emptyText={t`No trending posts.`}\n      errorText={t`Unable to load posts`}\n      fetchItems={hasCurrentLink ? fetchLinkMentions : fetchTrends}\n      checkForUpdates={hasCurrentLink ? undefined : checkForUpdates}\n      checkForUpdatesInterval={5 * 60 * 1000} // 5 minutes\n      useItemID\n      headerStart={<></>}\n      boostsCarousel={snapStates.settings.boostsCarousel}\n      // allowFilters\n      filterContext=\"public\"\n      timelineStart={TimelineStart}\n      refresh={currentLink}\n      clearWhenRefresh\n      view={hasCurrentLink ? 'link-mentions' : undefined}\n      headerEnd={\n        <Menu2\n          portal\n          // setDownOverflow\n          overflow=\"auto\"\n          viewScroll=\"close\"\n          position=\"anchor\"\n          menuButton={\n            <button type=\"button\" class=\"plain\">\n              <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n            </button>\n          }\n        >\n          <MenuItem\n            onClick={() => {\n              let newInstance = prompt(\n                t`Enter a new instance e.g. \"mastodon.social\"`,\n              );\n              if (!/\\./.test(newInstance)) {\n                if (newInstance) alert(t`Invalid instance`);\n                return;\n              }\n              if (newInstance) {\n                newInstance = newInstance.toLowerCase().trim();\n                // navigate(`/${newInstance}/trending`);\n                location.hash = `/${newInstance}/trending`;\n              }\n            }}\n          >\n            <Icon icon=\"bus\" />{' '}\n            <span>\n              <Trans>Go to another instanceโ€ฆ</Trans>\n            </span>\n          </MenuItem>\n          {currentInstance !== instance && (\n            <MenuItem\n              onClick={() => {\n                location.hash = `/${currentInstance}/trending`;\n              }}\n            >\n              <Icon icon=\"bus\" />{' '}\n              <small class=\"menu-double-lines\">\n                <Trans>\n                  Go to my instance (<b>{currentInstance}</b>)\n                </Trans>\n              </small>\n            </MenuItem>\n          )}\n        </Menu2>\n      }\n    />\n  );\n}\n\nexport default Trending;\n","import { useLingui } from '@lingui/react/macro';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useSnapshot } from 'valtio';\n\nimport Bookmarks from '../pages/bookmarks';\nimport Favourites from '../pages/favourites';\nimport Following from '../pages/following';\nimport Hashtag from '../pages/hashtag';\nimport List from '../pages/list';\nimport Mentions from '../pages/mentions';\nimport Notifications from '../pages/notifications';\nimport Public from '../pages/public';\nimport Search from '../pages/search';\nimport Trending from '../pages/trending';\nimport isRTL from '../utils/is-rtl';\nimport states from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst scrollIntoViewOptions = {\n  block: 'nearest',\n  inline: 'nearest',\n  behavior: 'smooth',\n};\n\nfunction Columns() {\n  const { t } = useLingui();\n  useTitle(t`Home`, '/');\n  const snapStates = useSnapshot(states);\n  const { shortcuts } = snapStates;\n\n  console.debug('RENDER Columns', shortcuts);\n\n  const components = shortcuts.map((shortcut) => {\n    if (!shortcut) return null;\n    const { type, ...params } = shortcut;\n    const Component = {\n      following: Following,\n      notifications: Notifications,\n      list: List,\n      public: Public,\n      bookmarks: Bookmarks,\n      favourites: Favourites,\n      hashtag: Hashtag,\n      mentions: Mentions,\n      trending: Trending,\n      search: Search,\n    }[type];\n    if (!Component) return null;\n    // Don't show Search column with no query, for now\n    if (type === 'search' && !params.query) return null;\n    // Don't show List column with no list, for now\n    if (type === 'list' && !params.id) return null;\n    return (\n      <Component key={type + JSON.stringify(params)} {...params} columnMode />\n    );\n  });\n\n  useHotkeys(['1', '2', '3', '4', '5', '6', '7', '8', '9'], (e, handler) => {\n    try {\n      const index = parseInt(handler.keys[0], 10) - 1;\n      const $column = document.querySelectorAll('#columns > *')[index];\n      if ($column) {\n        $column.focus();\n        $column.scrollIntoView(scrollIntoViewOptions);\n      }\n    } catch (e) {\n      console.error(e);\n    }\n  });\n\n  useHotkeys(['[', ']'], (e, handler) => {\n    const key = handler.keys[0];\n    const currentFocusedColumn = document.activeElement.closest('#columns > *');\n\n    const rtl = isRTL();\n    const prevColKey = rtl ? ']' : '[';\n    const nextColKey = rtl ? '[' : ']';\n    let $column;\n\n    if (key === prevColKey) {\n      // If [, focus on left of focused column, else first column\n      $column = currentFocusedColumn\n        ? currentFocusedColumn.previousElementSibling\n        : document.querySelectorAll('#columns > *')[0];\n    } else if (key === nextColKey) {\n      // If ], focus on right of focused column, else 2nd column\n      $column = currentFocusedColumn\n        ? currentFocusedColumn.nextElementSibling\n        : document.querySelectorAll('#columns > *')[1];\n    }\n    if ($column) {\n      $column.focus();\n      $column.scrollIntoView(scrollIntoViewOptions);\n    }\n  });\n\n  return (\n    <div\n      id=\"columns\"\n      onContextMenu={(e) => {\n        // If right-click on header, but not links or buttons\n        if (\n          e.target.closest('.deck > header') &&\n          !e.target.closest('a') &&\n          !e.target.closest('button')\n        ) {\n          e.preventDefault();\n          states.showShortcutsSettings = true;\n        }\n      }}\n      onFocus={() => {\n        // Get current focused column\n        const currentFocusedColumn =\n          document.activeElement.closest('#columns > *');\n        if (currentFocusedColumn) {\n          // Remove focus classes from all columns\n          // Add focus class to current focused column\n          document.querySelectorAll('#columns > *').forEach((column) => {\n            column.classList.toggle('focus', column === currentFocusedColumn);\n          });\n        }\n      }}\n    >\n      {components}\n    </div>\n  );\n}\n\nexport default Columns;\n","import './notifications-menu.css';\n\nimport { msg } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { ControlledMenu } from '@szhsin/react-menu';\nimport { memo } from 'preact/compat';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport Columns from '../components/columns';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport Notification from '../components/notification';\nimport { api } from '../utils/api';\nimport db from '../utils/db';\nimport { massageNotifications2 } from '../utils/group-notifications';\nimport states, { saveStatus } from '../utils/states';\nimport { getCurrentAccountNS } from '../utils/store-utils';\n\nimport Following from './following';\nimport {\n  getGroupedNotifications,\n  mastoFetchNotifications,\n} from './notifications';\n\nfunction Home() {\n  const { _ } = useLingui();\n  const snapStates = useSnapshot(states);\n  __BENCHMARK.end('time-to-home');\n  useEffect(() => {\n    (async () => {\n      const keys = await db.drafts.keys();\n      if (keys.length) {\n        const ns = getCurrentAccountNS();\n        const ownKeys = keys.filter((key) => key.startsWith(ns));\n        if (ownKeys.length) {\n          states.showDrafts = true;\n        }\n      }\n    })();\n  }, []);\n\n  return (\n    <>\n      {(snapStates.settings.shortcutsViewMode === 'multi-column' ||\n        (!snapStates.settings.shortcutsViewMode &&\n          snapStates.settings.shortcutsColumnsMode)) &&\n      !!snapStates.shortcuts?.length ? (\n        <Columns />\n      ) : (\n        <Following\n          title={_(msg`Home`)}\n          path=\"/\"\n          id=\"home\"\n          headerStart={false}\n          headerEnd={<NotificationsLink />}\n        />\n      )}\n    </>\n  );\n}\n\nfunction NotificationsLink() {\n  const { t } = useLingui();\n  const snapStates = useSnapshot(states);\n  const notificationLinkRef = useRef();\n  const [menuState, setMenuState] = useState(undefined);\n  return (\n    <>\n      <Link\n        ref={notificationLinkRef}\n        to=\"/notifications\"\n        class={`button plain notifications-button ${\n          snapStates.notificationsShowNew ? 'has-badge' : ''\n        } ${menuState || ''}`}\n        onClick={(e) => {\n          e.stopPropagation();\n          if (window.matchMedia('(min-width: calc(40em))').matches) {\n            e.preventDefault();\n            setMenuState((state) => (!state ? 'open' : undefined));\n          }\n        }}\n      >\n        <Icon icon=\"notification\" size=\"l\" alt={t`Notifications`} />\n      </Link>\n      <NotificationsMenu\n        state={menuState}\n        anchorRef={notificationLinkRef}\n        onClose={() => setMenuState(undefined)}\n      />\n    </>\n  );\n}\n\nconst NOTIFICATIONS_DISPLAY_LIMIT = 5;\nfunction NotificationsMenu({ anchorRef, state, onClose }) {\n  const { masto, instance } = api();\n  const snapStates = useSnapshot(states);\n  const [uiState, setUIState] = useState('default');\n\n  const notificationsIterator = mastoFetchNotifications();\n\n  async function fetchNotifications() {\n    const allNotifications = await notificationsIterator.next();\n    const notifications = massageNotifications2(allNotifications.value);\n\n    if (notifications?.length) {\n      notifications.forEach((notification) => {\n        saveStatus(notification.status, instance, {\n          skipThreading: true,\n        });\n      });\n\n      const groupedNotifications = getGroupedNotifications(notifications);\n\n      states.notificationsLast = groupedNotifications[0];\n      states.notifications = groupedNotifications;\n\n      // Update last read marker\n      masto.v1.markers\n        .create({\n          notifications: {\n            lastReadId: groupedNotifications[0].id,\n          },\n        })\n        .catch(() => {});\n    }\n\n    states.notificationsShowNew = false;\n    states.notificationsLastFetchTime = Date.now();\n    return allNotifications;\n  }\n\n  const [hasFollowRequests, setHasFollowRequests] = useState(false);\n  function fetchFollowRequests() {\n    return masto.v1.followRequests.list({\n      limit: 1,\n    });\n  }\n\n  function loadNotifications() {\n    setUIState('loading');\n    (async () => {\n      try {\n        await fetchNotifications();\n        const followRequests = await fetchFollowRequests();\n        setHasFollowRequests(!!followRequests?.length);\n        setUIState('default');\n      } catch (e) {\n        setUIState('error');\n      }\n    })();\n  }\n\n  useEffect(() => {\n    if (state === 'open') loadNotifications();\n  }, [state]);\n\n  const menuRef = useRef();\n\n  return (\n    <ControlledMenu\n      ref={menuRef}\n      menuClassName=\"notifications-menu\"\n      state={state}\n      anchorRef={anchorRef}\n      onClose={onClose}\n      portal={{\n        target: document.body,\n      }}\n      containerProps={{\n        onClick: () => {\n          menuRef.current?.closeMenu?.();\n        },\n      }}\n      overflow=\"auto\"\n      viewScroll=\"close\"\n      position=\"anchor\"\n      align=\"center\"\n      boundingBoxPadding=\"8 8 8 8\"\n    >\n      <header>\n        <h2>\n          <Trans>Notifications</Trans>\n        </h2>\n      </header>\n      <main>\n        {snapStates.notifications.length ? (\n          <>\n            {snapStates.notifications\n              .slice(0, NOTIFICATIONS_DISPLAY_LIMIT)\n              .map((notification) => (\n                <Notification\n                  key={notification._ids || notification.id}\n                  instance={instance}\n                  notification={notification}\n                  disableContextMenu\n                />\n              ))}\n          </>\n        ) : uiState === 'loading' ? (\n          <div class=\"ui-state\">\n            <Loader abrupt />\n          </div>\n        ) : (\n          uiState === 'error' && (\n            <div class=\"ui-state\">\n              <p>\n                <Trans>Unable to fetch notifications.</Trans>\n              </p>\n              <p>\n                <button type=\"button\" onClick={loadNotifications}>\n                  <Trans>Try again</Trans>\n                </button>\n              </p>\n            </div>\n          )\n        )}\n      </main>\n      <footer>\n        <Link to=\"/mentions\" class=\"button plain\">\n          <Icon icon=\"at\" />{' '}\n          <span>\n            <Trans>Mentions</Trans>\n          </span>\n        </Link>\n        <Link to=\"/notifications\" class=\"button plain2\">\n          {hasFollowRequests ? (\n            <Trans>\n              <span class=\"tag collapsed\">New</span>{' '}\n              <span>Follow Requests</span>\n            </Trans>\n          ) : (\n            <b>\n              <Trans>See all</Trans>\n            </b>\n          )}{' '}\n          <Icon icon=\"arrow-right\" />\n        </Link>\n      </footer>\n    </ControlledMenu>\n  );\n}\n\nexport default memo(Home);\n","// export const statusRegex = /\\/@([^@\\/]+)@?([^\\/]+)?\\/([^\\/]+)\\/?$/i;\n// export const statusNoteRegex = /\\/notes\\/([^\\/]+)\\/?$/i;\n\nconst statusPostRegexes = [\n  /^\\/@[^@\\/]+\\/(?:statuses|posts)\\/([^\\/]+)/i, // GoToSocial, Takahe\n  /\\/notes\\/([^\\/]+)/i, // Misskey, Firefish\n  /^\\/(?:notice|objects)\\/([a-z0-9-]+)/i, // Pleroma\n  /\\/@[^@\\/]+\\/post\\/([^\\/]+)/i, // Threads\n  /\\/@[^@\\/]+@?[^\\/]+?\\/([^\\/]+)/i, // Mastodon\n  /^\\/p\\/[^\\/]+\\/([^\\/]+)/i, // Pixelfed\n];\n\nexport function getInstanceStatusObject(url) {\n  // Regex /:username/:id, where username = @username or @username@domain, id = anything\n  const { hostname, pathname } = URL.parse(url);\n  // const [, username, domain, id] = pathname.match(statusRegex) || [];\n  for (const regex of statusPostRegexes) {\n    const [, id] = pathname.match(regex) || [];\n    console.log(pathname, regex, id);\n    if (id) {\n      return {\n        instance: hostname,\n        id,\n      };\n    }\n  }\n  return {};\n}\n\nfunction getInstanceStatusURL(url) {\n  const { instance, id } = getInstanceStatusObject(url);\n  if (instance && id) {\n    return `/${instance}/s/${id}`;\n  }\n  return null;\n}\n\nexport default getInstanceStatusURL;\n","import { Trans } from '@lingui/react/macro';\nimport { useLayoutEffect, useState } from 'preact/hooks';\nimport { useLocation } from 'react-router-dom';\n\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport { api } from '../utils/api';\nimport getInstanceStatusURL, {\n  getInstanceStatusObject,\n} from '../utils/get-instance-status-url';\n\nexport default function HttpRoute() {\n  const location = useLocation();\n  const url = location.pathname.replace(/^\\//, '');\n  const statusObject = getInstanceStatusObject(url);\n  // const statusURL = getInstanceStatusURL(url);\n  const statusURL = statusObject?.instance\n    ? `/${statusObject.instance}/s/${statusObject.id}`\n    : null;\n  const [uiState, setUIState] = useState('loading');\n\n  useLayoutEffect(() => {\n    setUIState('loading');\n    (async () => {\n      // Check if status returns 200\n      try {\n        const { instance, id } = statusObject;\n        if (id) {\n          const { masto } = api({ instance });\n          const status = await masto.v1.statuses.$select(id).fetch();\n          if (status) {\n            window.location.hash = statusURL + '?view=full';\n            return;\n          }\n        }\n      } catch (e) {}\n\n      // Fallback to search\n      {\n        const { masto: currentMasto, instance: currentInstance } = api();\n        const result = await currentMasto.v2.search.fetch({\n          q: url,\n          limit: 1,\n          resolve: true,\n        });\n        if (result.statuses.length) {\n          const status = result.statuses[0];\n          window.location.hash = `/${currentInstance}/s/${status.id}?view=full`;\n        } else if (result.accounts.length) {\n          const account = result.accounts[0];\n          window.location.hash = `/${currentInstance}/a/${account.id}`;\n        } else if (statusURL) {\n          // Fallback to original URL, which will probably show error\n          window.location.hash = statusURL + '?view=full';\n        } else {\n          setUIState('error');\n        }\n      }\n    })();\n  }, [statusURL]);\n\n  return (\n    <div class=\"ui-state\" tabIndex=\"-1\">\n      {uiState === 'loading' ? (\n        <>\n          <Loader abrupt />\n          <h2>\n            <Trans>Resolvingโ€ฆ</Trans>\n          </h2>\n          <p>\n            <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n              {url}\n            </a>\n          </p>\n        </>\n      ) : (\n        <>\n          <h2>\n            <Trans>Unable to resolve URL</Trans>\n          </h2>\n          <p>\n            <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n              {url}\n            </a>\n          </p>\n        </>\n      )}\n      <hr />\n      <p>\n        <Link to=\"/\">\n          <Trans>Go home</Trans>\n        </Link>\n      </p>\n    </div>\n  );\n}\n","import './lists.css';\n\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useReducer, useState } from 'preact/hooks';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport ListAddEdit from '../components/list-add-edit';\nimport Loader from '../components/loader';\nimport Modal from '../components/modal';\nimport NavMenu from '../components/nav-menu';\nimport { fetchLists } from '../utils/lists';\nimport useTitle from '../utils/useTitle';\n\nfunction Lists() {\n  const { t } = useLingui();\n  useTitle(t`Lists`, `/l`);\n  const [uiState, setUIState] = useState('default');\n\n  const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n  const [lists, setLists] = useState([]);\n  useEffect(() => {\n    setUIState('loading');\n    (async () => {\n      try {\n        const lists = await fetchLists();\n        console.log(lists);\n        setLists(lists);\n        setUIState('default');\n      } catch (e) {\n        console.error(e);\n        setUIState('error');\n      }\n    })();\n  }, [reloadCount]);\n\n  const [showListAddEditModal, setShowListAddEditModal] = useState(false);\n\n  return (\n    <div id=\"lists-page\" class=\"deck-container\" tabIndex=\"-1\">\n      <div class=\"timeline-deck deck\">\n        <header>\n          <div class=\"header-grid\">\n            <div class=\"header-side\">\n              <NavMenu />\n              <Link to=\"/\" class=\"button plain\">\n                <Icon icon=\"home\" size=\"l\" />\n              </Link>\n            </div>\n            <h1>\n              <Trans>Lists</Trans>\n            </h1>\n            <div class=\"header-side\">\n              <button\n                type=\"button\"\n                class=\"plain\"\n                onClick={() => setShowListAddEditModal(true)}\n              >\n                <Icon icon=\"plus\" size=\"l\" alt={t`New list`} />\n              </button>\n            </div>\n          </div>\n        </header>\n        <main>\n          {lists.length > 0 ? (\n            <>\n              <ul class=\"link-list\">\n                {lists.map((list) => (\n                  <li>\n                    <Link to={`/l/${list.id}`}>\n                      <span>\n                        <Icon icon=\"list\" /> <span>{list.title}</span>\n                      </span>\n                      {/* <button\n                      type=\"button\"\n                      class=\"plain\"\n                      onClick={(e) => {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        setShowListAddEditModal({\n                          list,\n                        });\n                      }}\n                    >\n                      <Icon icon=\"pencil\" />\n                    </button> */}\n                    </Link>\n                  </li>\n                ))}\n              </ul>\n              {lists.length > 1 && (\n                <footer class=\"ui-state\">\n                  <small class=\"insignificant\">\n                    <Plural value={lists.length} one=\"# list\" other=\"# lists\" />\n                  </small>\n                </footer>\n              )}\n            </>\n          ) : uiState === 'loading' ? (\n            <p class=\"ui-state\">\n              <Loader />\n            </p>\n          ) : uiState === 'error' ? (\n            <p class=\"ui-state\">\n              <Trans>Unable to load lists.</Trans>\n            </p>\n          ) : (\n            <p class=\"ui-state\">\n              <Trans>No lists yet.</Trans>\n            </p>\n          )}\n        </main>\n      </div>\n      {showListAddEditModal && (\n        <Modal\n          onClick={(e) => {\n            if (e.target === e.currentTarget) {\n              setShowListAddEditModal(false);\n            }\n          }}\n        >\n          <ListAddEdit\n            list={showListAddEditModal?.list}\n            onClose={(result) => {\n              if (result.state === 'success') {\n                reload();\n              }\n              setShowListAddEditModal(false);\n            }}\n          />\n        </Modal>\n      )}\n    </div>\n  );\n}\n\nexport default Lists;\n","export default \"__VITE_ASSET__Y_wpqkTO__\"","function dec2hex(dec) {\n  return ('0' + dec.toString(16)).slice(-2);\n}\nexport function verifier() {\n  var array = new Uint32Array(56 / 2);\n  window.crypto.getRandomValues(array);\n  return Array.from(array, dec2hex).join('');\n}\nfunction sha256(plain) {\n  // returns promise ArrayBuffer\n  const encoder = new TextEncoder();\n  const data = encoder.encode(plain);\n  return window.crypto.subtle.digest('SHA-256', data);\n}\nfunction base64urlencode(a) {\n  let str = '';\n  const bytes = new Uint8Array(a);\n  const len = bytes.byteLength;\n  for (var i = 0; i < len; i++) {\n    str += String.fromCharCode(bytes[i]);\n  }\n  return btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\nexport async function generateCodeChallenge(v) {\n  const hashed = await sha256(v);\n  return base64urlencode(hashed);\n}\n\n// If /.well-known/oauth-authorization-server exists and code_challenge_methods_supported includes \"S256\", means support PKCE\nexport async function supportsPKCE({ instanceURL }) {\n  if (!instanceURL) return false;\n  try {\n    const res = await fetch(\n      `https://${instanceURL}/.well-known/oauth-authorization-server`,\n    );\n    if (!res.ok || res.status !== 200) return false;\n    const json = await res.json();\n    if (json.code_challenge_methods_supported?.includes('S256')) return true;\n    return false;\n  } catch (e) {\n    return false;\n  }\n}\n\n// For debugging\nwindow.__generateCodeChallenge = generateCodeChallenge;\n","import { generateCodeChallenge, verifier } from './oauth-pkce';\n\nconst {\n  DEV,\n  PHANPY_CLIENT_NAME: CLIENT_NAME,\n  PHANPY_WEBSITE: WEBSITE,\n} = import.meta.env;\n\nconst SCOPES = 'read write follow push';\n\n/*\n  PHANPY_WEBSITE is set to the default official site.\n  It's used in pre-built releases, so there's no way to change it dynamically\n  without rebuilding.\n  Therefore, we can't use it as redirect_uri.\n  We only use PHANPY_WEBSITE if it's \"same\" as current location URL.\n  \n  Very basic check based on location.hostname for now\n*/\nconst sameSite = WEBSITE\n  ? WEBSITE.toLowerCase().includes(location.hostname)\n  : false;\nconst currentLocation = location.origin + location.pathname;\nconst REDIRECT_URI = DEV || !sameSite ? currentLocation : WEBSITE;\n\nexport async function registerApplication({ instanceURL }) {\n  const registrationParams = new URLSearchParams({\n    client_name: CLIENT_NAME,\n    redirect_uris: REDIRECT_URI,\n    scopes: SCOPES,\n    website: WEBSITE,\n  });\n  const registrationResponse = await fetch(\n    `https://${instanceURL}/api/v1/apps`,\n    {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n      },\n      body: registrationParams.toString(),\n    },\n  );\n  const registrationJSON = await registrationResponse.json();\n  console.log({ registrationJSON });\n  return registrationJSON;\n}\n\nexport async function getPKCEAuthorizationURL({ instanceURL, client_id }) {\n  const codeVerifier = verifier();\n  const codeChallenge = await generateCodeChallenge(codeVerifier);\n  const params = new URLSearchParams({\n    client_id,\n    code_challenge_method: 'S256',\n    code_challenge: codeChallenge,\n    redirect_uri: REDIRECT_URI,\n    response_type: 'code',\n    scope: SCOPES,\n  });\n  const authorizationURL = `https://${instanceURL}/oauth/authorize?${params.toString()}`;\n  return [authorizationURL, codeVerifier];\n}\n\nexport async function getAuthorizationURL({ instanceURL, client_id }) {\n  const authorizationParams = new URLSearchParams({\n    client_id,\n    scope: SCOPES,\n    redirect_uri: REDIRECT_URI,\n    // redirect_uri: 'urn:ietf:wg:oauth:2.0:oob',\n    response_type: 'code',\n  });\n  const authorizationURL = `https://${instanceURL}/oauth/authorize?${authorizationParams.toString()}`;\n  return authorizationURL;\n}\n\nexport async function getAccessToken({\n  instanceURL,\n  client_id,\n  client_secret,\n  code,\n  code_verifier,\n}) {\n  const params = new URLSearchParams({\n    client_id,\n    redirect_uri: REDIRECT_URI,\n    grant_type: 'authorization_code',\n    code,\n    scope: SCOPES,\n    // client_secret,\n    // code_verifier,\n  });\n  if (client_secret) {\n    params.append('client_secret', client_secret);\n  }\n  if (code_verifier) {\n    params.append('code_verifier', code_verifier);\n  }\n  const tokenResponse = await fetch(`https://${instanceURL}/oauth/token`, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/x-www-form-urlencoded',\n    },\n    body: params.toString(),\n  });\n  const tokenJSON = await tokenResponse.json();\n  console.log({ tokenJSON });\n  return tokenJSON;\n}\n","import './login.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport Fuse from 'fuse.js';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useSearchParams } from 'react-router-dom';\n\nimport logo from '../assets/logo.svg';\n\nimport LangSelector from '../components/lang-selector';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport instancesListURL from '../data/instances.json?url';\nimport {\n  getAuthorizationURL,\n  getPKCEAuthorizationURL,\n  registerApplication,\n} from '../utils/auth';\nimport { supportsPKCE } from '../utils/oauth-pkce';\nimport store from '../utils/store';\nimport useTitle from '../utils/useTitle';\n\nconst { PHANPY_DEFAULT_INSTANCE: DEFAULT_INSTANCE } = import.meta.env;\n\nfunction Login() {\n  const { t } = useLingui();\n  useTitle('Log in');\n  const instanceURLRef = useRef();\n  const cachedInstanceURL = store.local.get('instanceURL');\n  const [uiState, setUIState] = useState('default');\n  const [searchParams] = useSearchParams();\n  const instance = searchParams.get('instance');\n  const submit = searchParams.get('submit');\n  const [instanceText, setInstanceText] = useState(\n    instance || cachedInstanceURL?.toLowerCase() || '',\n  );\n\n  const [instancesList, setInstancesList] = useState([]);\n  const searcher = useRef();\n  useEffect(() => {\n    (async () => {\n      try {\n        const res = await fetch(instancesListURL);\n        const data = await res.json();\n        setInstancesList(data);\n        searcher.current = new Fuse(data);\n      } catch (e) {\n        // Silently fail\n        console.error(e);\n      }\n    })();\n  }, []);\n\n  // useEffect(() => {\n  //   if (cachedInstanceURL) {\n  //     instanceURLRef.current.value = cachedInstanceURL.toLowerCase();\n  //   }\n  // }, []);\n\n  const submitInstance = (instanceURL) => {\n    if (!instanceURL) return;\n\n    (async () => {\n      // WEB_DOMAIN vs LOCAL_DOMAIN negotiation time\n      // https://docs.joinmastodon.org/admin/config/#web_domain\n      try {\n        const res = await fetch(`https://${instanceURL}/.well-known/host-meta`); // returns XML\n        const text = await res.text();\n        // Parse XML\n        const parser = new DOMParser();\n        const xmlDoc = parser.parseFromString(text, 'text/xml');\n        // Get Link[template]\n        const link = xmlDoc.getElementsByTagName('Link')[0];\n        const template = link.getAttribute('template');\n        const url = URL.parse(template);\n        const { host } = url; // host includes the port\n        if (instanceURL !== host) {\n          console.log(`๐Ÿ’ซ ${instanceURL} -> ${host}`);\n          instanceURL = host;\n        }\n      } catch (e) {\n        // Silently fail\n        console.error(e);\n      }\n\n      store.local.set('instanceURL', instanceURL);\n\n      setUIState('loading');\n      try {\n        const { client_id, client_secret, vapid_key } =\n          await registerApplication({\n            instanceURL,\n          });\n\n        const authPKCE = await supportsPKCE({ instanceURL });\n        console.log({ authPKCE });\n        if (authPKCE) {\n          if (client_id && client_secret) {\n            store.sessionCookie.set('clientID', client_id);\n            store.sessionCookie.set('clientSecret', client_secret);\n            store.sessionCookie.set('vapidKey', vapid_key);\n\n            const [url, verifier] = await getPKCEAuthorizationURL({\n              instanceURL,\n              client_id,\n            });\n            store.sessionCookie.set('codeVerifier', verifier);\n            location.href = url;\n          } else {\n            alert(t`Failed to register application`);\n          }\n        } else {\n          if (client_id && client_secret) {\n            store.sessionCookie.set('clientID', client_id);\n            store.sessionCookie.set('clientSecret', client_secret);\n            store.sessionCookie.set('vapidKey', vapid_key);\n\n            location.href = await getAuthorizationURL({\n              instanceURL,\n              client_id,\n            });\n          } else {\n            alert(t`Failed to register application`);\n          }\n        }\n        setUIState('default');\n      } catch (e) {\n        console.error(e);\n        setUIState('error');\n      }\n    })();\n  };\n\n  const cleanInstanceText = instanceText\n    ? instanceText\n        .replace(/^https?:\\/\\//, '') // Remove protocol from instance URL\n        .replace(/\\/+$/, '') // Remove trailing slash\n        .replace(/^@?[^@]+@/, '') // Remove @?acct@\n        .trim()\n    : null;\n  const instanceTextLooksLikeDomain =\n    /[^\\s\\r\\n\\t\\/\\\\]+\\.[^\\s\\r\\n\\t\\/\\\\]+/.test(cleanInstanceText) &&\n    !/[\\s\\/\\\\@]/.test(cleanInstanceText);\n\n  const instancesSuggestions = cleanInstanceText\n    ? searcher.current\n        ?.search(cleanInstanceText, {\n          limit: 10,\n        })\n        ?.map((match) => match.item)\n    : [];\n\n  const selectedInstanceText = instanceTextLooksLikeDomain\n    ? cleanInstanceText\n    : instancesSuggestions?.length\n      ? instancesSuggestions[0]\n      : instanceText\n        ? instancesList.find((instance) => instance.includes(instanceText))\n        : null;\n\n  const onSubmit = (e) => {\n    e.preventDefault();\n    // const { elements } = e.target;\n    // let instanceURL = elements.instanceURL.value.toLowerCase();\n    // // Remove protocol from instance URL\n    // instanceURL = instanceURL.replace(/^https?:\\/\\//, '').replace(/\\/+$/, '');\n    // // Remove @acct@ or acct@ from instance URL\n    // instanceURL = instanceURL.replace(/^@?[^@]+@/, '');\n    // if (!/\\./.test(instanceURL)) {\n    //   instanceURL = instancesList.find((instance) =>\n    //     instance.includes(instanceURL),\n    //   );\n    // }\n    // submitInstance(instanceURL);\n    submitInstance(selectedInstanceText);\n  };\n\n  if (submit) {\n    useEffect(() => {\n      submitInstance(instance || selectedInstanceText);\n    }, []);\n  }\n\n  return (\n    <main id=\"login\" style={{ textAlign: 'center' }}>\n      <form onSubmit={onSubmit}>\n        <h1>\n          <img src={logo} alt=\"\" width=\"80\" height=\"80\" />\n          <br />\n          <Trans>Log in</Trans>\n        </h1>\n        <label>\n          <p>\n            <Trans>Instance</Trans>\n          </p>\n          <input\n            value={instanceText}\n            required\n            type=\"text\"\n            class=\"large\"\n            id=\"instanceURL\"\n            ref={instanceURLRef}\n            disabled={uiState === 'loading'}\n            // list=\"instances-list\"\n            autocorrect=\"off\"\n            autocapitalize=\"off\"\n            autocomplete=\"off\"\n            spellCheck={false}\n            placeholder={t`instance domain`}\n            onInput={(e) => {\n              setInstanceText(e.target.value);\n            }}\n            dir=\"auto\"\n          />\n          {instancesSuggestions?.length > 0 ? (\n            <ul id=\"instances-suggestions\">\n              {instancesSuggestions.map((instance, i) => (\n                <li>\n                  <button\n                    type=\"button\"\n                    class=\"plain5\"\n                    onClick={() => {\n                      submitInstance(instance);\n                    }}\n                  >\n                    {instance}\n                  </button>\n                </li>\n              ))}\n            </ul>\n          ) : (\n            <div id=\"instances-eg\">\n              <Trans>e.g. &ldquo;mastodon.social&rdquo;</Trans>\n            </div>\n          )}\n          {/* <datalist id=\"instances-list\">\n            {instancesList.map((instance) => (\n              <option value={instance} />\n            ))}\n          </datalist> */}\n        </label>\n        {uiState === 'error' && (\n          <p class=\"error\">\n            <Trans>\n              Failed to log in. Please try again or try another instance.\n            </Trans>\n          </p>\n        )}\n        <div>\n          <button\n            disabled={\n              uiState === 'loading' || !instanceText || !selectedInstanceText\n            }\n          >\n            {selectedInstanceText\n              ? t`Continue with ${selectedInstanceText}`\n              : t`Continue`}\n          </button>{' '}\n        </div>\n        <Loader hidden={uiState !== 'loading'} />\n        <hr />\n        {!DEFAULT_INSTANCE && (\n          <p>\n            <a href=\"https://joinmastodon.org/servers\" target=\"_blank\">\n              <Trans>Don't have an account? Create one!</Trans>\n            </a>\n          </p>\n        )}\n        <p>\n          <Link to=\"/\">\n            <Trans>Go home</Trans>\n          </Link>\n        </p>\n        <LangSelector />\n      </form>\n    </main>\n  );\n}\n\nexport default Login;\n","import './status.css';\n\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { Menu, MenuDivider, MenuHeader, MenuItem } from '@szhsin/react-menu';\nimport debounce from 'just-debounce-it';\nimport pRetry from 'p-retry';\nimport { memo } from 'preact/compat';\nimport {\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'preact/hooks';\nimport punycode from 'punycode/';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { InView } from 'react-intersection-observer';\nimport { matchPath, useSearchParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport Avatar from '../components/avatar';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport MediaModal from '../components/media-modal';\nimport Menu2 from '../components/menu2';\nimport NameText from '../components/name-text';\nimport RelativeTime from '../components/relative-time';\nimport Status from '../components/status';\nimport { api } from '../utils/api';\nimport htmlContentLength from '../utils/html-content-length';\nimport shortenNumber from '../utils/shorten-number';\nimport states, {\n  getStatus,\n  saveStatus,\n  statusKey,\n  threadifyStatus,\n} from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport { getCurrentAccount } from '../utils/store-utils';\nimport useScroll from '../utils/useScroll';\nimport useTitle from '../utils/useTitle';\n\nimport getInstanceStatusURL from './../utils/get-instance-status-url';\n\nconst { PHANPY_DEFAULT_INSTANCE: DEFAULT_INSTANCE } = import.meta.env;\n\nconst LIMIT = 40;\nconst SUBCOMMENTS_OPEN_ALL_LIMIT = 10;\nconst MAX_WEIGHT = 5;\n\nlet cachedRepliesToggle = {};\nlet cachedStatusesMap = {};\nlet scrollPositions = {};\nfunction resetScrollPosition(id) {\n  delete cachedStatusesMap[id];\n  delete scrollPositions[id];\n}\n\nconst scrollIntoViewOptions = {\n  block: 'nearest',\n  inline: 'center',\n  behavior: 'smooth',\n};\n\n// Select all statuses except those inside collapsed details/summary\n// Hat-tip to @AmeliaBR@front-end.social\n// https://front-end.social/@AmeliaBR/109784776146144471\nconst STATUSES_SELECTOR =\n  '.status-link:not(details:not([open]) > summary ~ *, details:not([open]) > summary ~ * *), .status-focus:not(details:not([open]) > summary ~ *, details:not([open]) > summary ~ * *)';\n\nconst STATUS_URL_REGEX = /\\/s\\//i;\n\nfunction StatusPage(params) {\n  const { t } = useLingui();\n  const { id } = params;\n  const { masto, instance } = api({ instance: params.instance });\n  const snapStates = useSnapshot(states);\n  const [searchParams, setSearchParams] = useSearchParams();\n  const mediaParam = searchParams.get('media');\n  const mediaOnlyParam = searchParams.get('media-only');\n  const mediaIndex = parseInt(mediaParam || mediaOnlyParam, 10);\n  let showMedia = mediaIndex > 0;\n  const mediaStatusID = searchParams.get('mediaStatusID');\n  const mediaStatus = getStatus(mediaStatusID, instance);\n  if (mediaStatusID && !mediaStatus) {\n    showMedia = false;\n  }\n  const showMediaOnly = showMedia && !!mediaOnlyParam;\n\n  const sKey = statusKey(id, instance);\n  const [heroStatus, setHeroStatus] = useState(states.statuses[sKey]);\n  useEffect(() => {\n    if (states.statuses[sKey]) {\n      setHeroStatus(states.statuses[sKey]);\n    }\n  }, [sKey]);\n\n  const closeLink = useMemo(() => {\n    const { prevLocation } = states;\n    const pathname =\n      (prevLocation?.pathname || '') + (prevLocation?.search || '');\n    const matchStatusPath =\n      matchPath('/:instance/s/:id', pathname) || matchPath('/s/:id', pathname);\n    if (!pathname || matchStatusPath) {\n      return '/';\n    }\n    return pathname;\n  }, []);\n\n  useEffect(() => {\n    if (!heroStatus && showMedia) {\n      (async () => {\n        try {\n          const status = await masto.v1.statuses.$select(id).fetch();\n          saveStatus(status, instance);\n          setHeroStatus(status);\n        } catch (err) {\n          console.error(err);\n          alert('Unable to load post.');\n          location.hash = closeLink;\n        }\n      })();\n    }\n  }, [showMedia]);\n\n  const mediaAttachments = mediaStatusID\n    ? snapStates.statuses[statusKey(mediaStatusID, instance)]?.mediaAttachments\n    : heroStatus?.mediaAttachments;\n\n  const handleMediaClose = useCallback(() => {\n    if (\n      !window.matchMedia('(min-width: calc(40em + 350px))').matches &&\n      snapStates.prevLocation\n    ) {\n      history.back();\n    } else {\n      if (showMediaOnly) {\n        location.hash = closeLink;\n      } else {\n        searchParams.delete('media');\n        searchParams.delete('mediaStatusID');\n        setSearchParams(searchParams);\n      }\n    }\n  }, [showMediaOnly, closeLink, snapStates.prevLocation]);\n\n  useEffect(() => {\n    let timer = setTimeout(() => {\n      // carouselRef.current?.focus?.();\n      const $carousel = document.querySelector('.carousel');\n      if ($carousel) {\n        $carousel.focus();\n      }\n    }, 100);\n    return () => clearTimeout(timer);\n  }, [showMediaOnly]);\n\n  useEffect(() => {\n    const $deckContainers = document.querySelectorAll('.deck-container');\n    $deckContainers.forEach(($deckContainer) => {\n      $deckContainer.setAttribute('inert', '');\n    });\n    return () => {\n      $deckContainers.forEach(($deckContainer) => {\n        $deckContainer.removeAttribute('inert');\n      });\n    };\n  }, []);\n\n  return (\n    <div class=\"deck-backdrop\">\n      {showMedia ? (\n        mediaAttachments?.length ? (\n          <MediaModal\n            mediaAttachments={mediaAttachments}\n            statusID={mediaStatusID || id}\n            instance={instance}\n            lang={heroStatus?.language}\n            index={mediaIndex - 1}\n            onClose={handleMediaClose}\n          />\n        ) : (\n          <div class=\"media-modal-container loading\">\n            <Loader abrupt />\n          </div>\n        )\n      ) : (\n        <Link to={closeLink} />\n      )}\n      {!showMediaOnly && (\n        <StatusThread\n          id={id}\n          instance={params.instance}\n          closeLink={closeLink}\n        />\n      )}\n    </div>\n  );\n}\n\nfunction StatusParent(props) {\n  const { linkable, to, onClick, ...restProps } = props;\n  return linkable ? (\n    <Link class=\"status-link\" to={to} onClick={onClick} {...restProps} />\n  ) : (\n    <div class=\"status-focus\" tabIndex={0} {...restProps} />\n  );\n}\n\n// oldest first\nfunction createdAtSort(a, b) {\n  return new Date(b.created_at) - new Date(a.created_at);\n}\n\nfunction StatusThread({ id, closeLink = '/', instance: propInstance }) {\n  const { t } = useLingui();\n  const [searchParams, setSearchParams] = useSearchParams();\n  const mediaParam = searchParams.get('media');\n  const mediaStatusID = searchParams.get('mediaStatusID');\n  const showMedia = parseInt(mediaParam, 10) > 0;\n  const firstLoad = useRef(\n    !states.prevLocation &&\n      (history.length === 1 ||\n        ('navigation' in window && navigation?.entries?.()?.length === 1)),\n  );\n  const [viewMode, setViewMode] = useState(\n    searchParams.get('view') || firstLoad.current ? 'full' : null,\n  );\n  const translate = !!parseInt(searchParams.get('translate'));\n  const { masto, instance } = api({ instance: propInstance });\n  const {\n    masto: currentMasto,\n    instance: currentInstance,\n    authenticated,\n  } = api();\n  const sameInstance = instance === currentInstance;\n  const snapStates = useSnapshot(states);\n  const [statuses, setStatuses] = useState([]);\n  const [uiState, setUIState] = useState('default');\n  const heroStatusRef = useRef();\n  const sKey = statusKey(id, instance);\n  const totalDescendants = useRef(0);\n\n  const scrollableRef = useRef();\n  useEffect(() => {\n    scrollableRef.current?.focus();\n  }, []);\n  useEffect(() => {\n    const onScroll = debounce(() => {\n      // console.log('onScroll');\n      if (!scrollableRef.current) return;\n      const { scrollTop } = scrollableRef.current;\n      if (uiState !== 'loading') {\n        scrollPositions[id] = scrollTop;\n      }\n    }, 50);\n    scrollableRef.current?.addEventListener('scroll', onScroll, {\n      passive: true,\n    });\n    onScroll();\n    return () => {\n      onScroll.cancel();\n      scrollableRef.current?.removeEventListener('scroll', onScroll);\n    };\n  }, [id, uiState !== 'loading']);\n\n  const scrollOffsets = useRef();\n  const lastInitContextTS = useRef();\n  const initContext = ({ reloadHero } = {}) => {\n    console.debug('initContext', id);\n    setUIState('loading');\n    let heroTimer;\n\n    const cachedStatuses = cachedStatusesMap[id];\n    if (cachedStatuses) {\n      // Case 1: It's cached, let's restore them to make it snappy\n      const reallyCachedStatuses = cachedStatuses.filter(\n        (s) => states.statuses[sKey],\n        // Some are not cached in the global state, so we need to filter them out\n      );\n      setStatuses(reallyCachedStatuses);\n    } else {\n      // const heroIndex = statuses.findIndex((s) => s.id === id);\n      // if (heroIndex !== -1) {\n      //   // Case 2: It's in current statuses. Slice off all descendant statuses after the hero status to be safe\n      //   const slicedStatuses = statuses.slice(0, heroIndex + 1);\n      //   setStatuses(slicedStatuses);\n      // } else {\n      // Case 3: Not cached and not in statuses, let's start from scratch\n      setStatuses([{ id }]);\n      // }\n    }\n\n    (async () => {\n      const heroFetch = () =>\n        pRetry(() => masto.v1.statuses.$select(id).fetch(), {\n          retries: 4,\n        });\n      const contextFetch = pRetry(\n        () => masto.v1.statuses.$select(id).context.fetch(),\n        {\n          retries: 8,\n        },\n      );\n\n      const hasStatus = !!snapStates.statuses[sKey];\n      let heroStatus = snapStates.statuses[sKey];\n      if (hasStatus && !reloadHero) {\n        console.debug('Hero status is cached');\n      } else {\n        try {\n          heroStatus = await heroFetch();\n          saveStatus(heroStatus, instance);\n          // Give time for context to appear\n          await new Promise((resolve) => {\n            setTimeout(resolve, 100);\n          });\n        } catch (e) {\n          console.error(e);\n          setUIState('error');\n          return;\n        }\n      }\n\n      try {\n        const context = await contextFetch;\n        const { ancestors, descendants } = context;\n\n        ancestors.sort(createdAtSort);\n        descendants.sort(createdAtSort);\n\n        totalDescendants.current = descendants?.length || 0;\n\n        const missingStatuses = new Set();\n        ancestors.forEach((status) => {\n          saveStatus(status, instance, {\n            skipThreading: true,\n          });\n          if (\n            status.inReplyToId &&\n            !ancestors.find((s) => s.id === status.inReplyToId)\n          ) {\n            missingStatuses.add(status.inReplyToId);\n          }\n        });\n        const ancestorsIsThread = ancestors.every(\n          (s) => s.account.id === heroStatus.account.id,\n        );\n        const nestedDescendants = [];\n        descendants.forEach((status) => {\n          saveStatus(status, instance, {\n            skipThreading: true,\n          });\n\n          if (\n            status.inReplyToId &&\n            !descendants.find((s) => s.id === status.inReplyToId) &&\n            status.inReplyToId !== heroStatus.id\n          ) {\n            missingStatuses.add(status.inReplyToId);\n          }\n\n          if (status.inReplyToAccountId === status.account.id) {\n            // If replying to self, it's part of the thread, level 1\n            nestedDescendants.push(status);\n          } else if (status.inReplyToId === heroStatus.id) {\n            // If replying to the hero status, it's a reply, level 1\n            nestedDescendants.push(status);\n          } else if (\n            !status.inReplyToAccountId &&\n            nestedDescendants.find(\n              (s) =>\n                s.id === status.inReplyToId &&\n                s.account.id === heroStatus.account.id,\n            ) &&\n            status.account.id === heroStatus.account.id\n          ) {\n            // If replying to hero's own statuses, it's part of the thread, level 1\n            nestedDescendants.push(status);\n          } else {\n            // If replying to someone else, it's a reply to a reply, level 2\n            const parent = descendants.find((s) => s.id === status.inReplyToId);\n            if (parent) {\n              if (!parent.__replies) {\n                parent.__replies = [];\n              }\n              parent.__replies.push(status);\n            } else {\n              // If no parent, something is wrong\n              console.warn('No parent found for', status);\n            }\n          }\n        });\n\n        // sort hero author to top\n        nestedDescendants.sort((a, b) => {\n          const heroAccountID = heroStatus.account.id;\n          if (a.account.id === heroAccountID && b.account.id !== heroAccountID)\n            return -1;\n          if (b.account.id === heroAccountID && a.account.id !== heroAccountID)\n            return 1;\n          return 0;\n        });\n\n        console.log({ ancestors, descendants, nestedDescendants });\n        if (missingStatuses.size) {\n          console.error('Missing statuses', [...missingStatuses]);\n        }\n\n        let descendantLevelsCount = 1;\n        function expandReplies(_replies, level) {\n          const nextLevel = level + 1;\n          if (nextLevel > descendantLevelsCount) {\n            descendantLevelsCount = level;\n          }\n          return _replies?.map((_r) => ({\n            id: _r.id,\n            account: _r.account,\n            repliesCount: _r.repliesCount,\n            content: _r.content,\n            weight: calcStatusWeight(_r),\n            level: nextLevel,\n            replies: expandReplies(_r.__replies, nextLevel),\n          }));\n        }\n\n        const allStatuses = [\n          ...ancestors.map((s) => ({\n            id: s.id,\n            ancestor: true,\n            isThread: ancestorsIsThread,\n            accountID: s.account.id,\n            account: s.account,\n            repliesCount: s.repliesCount,\n            weight: calcStatusWeight(s),\n          })),\n          {\n            id,\n            accountID: heroStatus.account.id,\n            weight: calcStatusWeight(heroStatus),\n          },\n          ...nestedDescendants.map((s) => ({\n            id: s.id,\n            account: s.account,\n            accountID: s.account.id,\n            descendant: true,\n            thread: s.account.id === heroStatus.account.id,\n            weight: calcStatusWeight(s),\n            level: 1,\n            replies: expandReplies(s.__replies, 1),\n          })),\n        ];\n\n        setUIState('default');\n        scrollOffsets.current = {\n          offsetTop: heroStatusRef.current?.offsetTop,\n          scrollTop: scrollableRef.current?.scrollTop,\n        };\n\n        // Set limit to hero's index\n        // const heroLimit = allStatuses.findIndex((s) => s.id === id);\n        const heroLimit = ancestors.length || 0; // 0-indexed\n        if (heroLimit >= limit) {\n          setLimit(heroLimit + 1);\n        }\n\n        console.log({ allStatuses, descendantLevelsCount });\n        setStatuses(allStatuses);\n        cachedStatusesMap[id] = allStatuses;\n\n        // Let's threadify this one\n        // Note that all non-hero statuses will trigger saveStatus which will threadify them too\n        // By right, at this point, all descendant statuses should be cached\n        threadifyStatus(heroStatus, instance);\n      } catch (e) {\n        console.error(e);\n        setUIState('error');\n      }\n    })();\n\n    lastInitContextTS.current = Date.now();\n\n    return () => {\n      clearTimeout(heroTimer);\n    };\n  };\n\n  useEffect(initContext, [id, masto]);\n\n  const [showRefresh, setShowRefresh] = useState(false);\n  useEffect(() => {\n    let interval = setInterval(() => {\n      const now = Date.now();\n      if (\n        lastInitContextTS.current &&\n        now - lastInitContextTS.current >= 60_000\n      ) {\n        setShowRefresh(true);\n      }\n    }, 60_000); // 1 minute\n    return () => {\n      clearInterval(interval);\n    };\n  }, []);\n\n  useLayoutEffect(() => {\n    if (!statuses.length) return;\n    console.debug('STATUSES', statuses);\n    const scrollPosition = scrollPositions[id];\n    console.debug('scrollPosition', scrollPosition);\n    if (!!scrollPosition) {\n      console.debug('Case 1', {\n        id,\n        scrollPosition,\n      });\n      scrollableRef.current.scrollTop = scrollPosition;\n    } else if (scrollOffsets.current) {\n      const newScrollOffsets = {\n        offsetTop: heroStatusRef.current?.offsetTop,\n        scrollTop: scrollableRef.current?.scrollTop,\n      };\n      const newScrollTop =\n        newScrollOffsets.offsetTop -\n        scrollOffsets.current.offsetTop +\n        newScrollOffsets.scrollTop;\n      console.debug('Case 2', {\n        scrollOffsets: scrollOffsets.current,\n        newScrollOffsets,\n        newScrollTop,\n        statuses: [...statuses],\n      });\n      scrollableRef.current.scrollTop = newScrollTop;\n    } else if (statuses.length === 1) {\n      console.debug('Case 3', {\n        id,\n      });\n      scrollableRef.current.scrollTop = 0;\n    }\n\n    // RESET\n    scrollOffsets.current = null;\n  }, [statuses]);\n\n  useEffect(() => {\n    if (snapStates.reloadStatusPage <= 0) return;\n    // Delete the cache for the context\n    (async () => {\n      try {\n        const { instanceURL } = getCurrentAccount();\n        const contextURL = `https://${instanceURL}/api/v1/statuses/${id}/context`;\n        console.log('Clear cache', contextURL);\n        const apiCache = await caches.open('api');\n        await apiCache.delete(contextURL, { ignoreVary: true });\n\n        return initContext({\n          reloadHero: true,\n        });\n      } catch (e) {\n        console.error(e);\n      }\n    })();\n  }, [snapStates.reloadStatusPage]);\n\n  useEffect(() => {\n    return () => {\n      // RESET\n      scrollPositions = {};\n      states.reloadStatusPage = 0;\n      cachedStatusesMap = {};\n      cachedRepliesToggle = {};\n      statusWeightCache.clear();\n    };\n  }, []);\n\n  const heroStatus = snapStates.statuses[sKey] || snapStates.statuses[id];\n  const heroDisplayName = useMemo(() => {\n    // Remove shortcodes from display name\n    if (!heroStatus) return '';\n    const { account } = heroStatus;\n    const div = document.createElement('div');\n    div.innerHTML = account.displayName;\n    return div.innerText.trim();\n  }, [heroStatus]);\n  const heroContentText = useMemo(() => {\n    if (!heroStatus) return '';\n    let text = statusPeek(heroStatus);\n    if (text.length > 64) {\n      // \"The title should ideally be less than 64 characters in length\"\n      // https://www.w3.org/Provider/Style/TITLE.html\n      text = text.slice(0, 64) + 'โ€ฆ';\n    }\n    return text;\n  }, [heroStatus]);\n  useTitle(\n    heroDisplayName && heroContentText\n      ? `${heroDisplayName}: \"${heroContentText}\"`\n      : t({\n          id: 'post.title',\n          message: 'Post',\n        }),\n    '/:instance?/s/:id',\n  );\n\n  const postInstance = useMemo(() => {\n    if (!heroStatus) return;\n    const { url } = heroStatus;\n    if (!url) return;\n    return URL.parse(url).hostname;\n  }, [heroStatus]);\n  const postSameInstance = useMemo(() => {\n    if (!postInstance) return;\n    return postInstance === instance;\n  }, [postInstance, instance]);\n\n  const [limit, setLimit] = useState(LIMIT);\n  const showMore = useMemo(() => {\n    // return number of statuses to show\n    return statuses.length - limit;\n  }, [statuses.length, limit]);\n\n  const hasDescendants = statuses.some((s) => s.descendant);\n  const ancestors = statuses.filter((s) => s.ancestor);\n\n  const [heroInView, setHeroInView] = useState(true);\n  const heroPointer = useMemo(() => {\n    // get top offset of heroStatus\n    if (!heroStatusRef.current || heroInView) return null;\n    const { top } = heroStatusRef.current.getBoundingClientRect();\n    return top > 0 ? 'down' : 'up';\n  }, [heroInView]);\n\n  useHotkeys(\n    'esc',\n    () => {\n      location.hash = closeLink;\n    },\n    {\n      // If media is open, esc to close media first\n      // Else close the status page\n      enabled: !showMedia,\n      ignoreEventWhen: (e) => {\n        const hasModal = !!document.querySelector('#modal-container > *');\n        return hasModal;\n      },\n    },\n  );\n  // For backspace, will always close both media and status page\n  useHotkeys('backspace', () => {\n    location.hash = closeLink;\n  });\n\n  useHotkeys('j', () => {\n    const activeStatus = document.activeElement.closest(\n      '.status-link, .status-focus',\n    );\n    const activeStatusRect = activeStatus?.getBoundingClientRect();\n    const allStatusLinks = Array.from(\n      scrollableRef.current.querySelectorAll(STATUSES_SELECTOR),\n    );\n    console.log({ allStatusLinks });\n    if (\n      activeStatus &&\n      activeStatusRect.top < scrollableRef.current.clientHeight &&\n      activeStatusRect.bottom > 0\n    ) {\n      const activeStatusIndex = allStatusLinks.indexOf(activeStatus);\n      let nextStatus = allStatusLinks[activeStatusIndex + 1];\n      if (nextStatus) {\n        nextStatus.focus();\n        nextStatus.scrollIntoView(scrollIntoViewOptions);\n      }\n    } else {\n      // If active status is not in viewport, get the topmost status-link in viewport\n      const topmostStatusLink = allStatusLinks.find((statusLink) => {\n        const statusLinkRect = statusLink.getBoundingClientRect();\n        return statusLinkRect.top >= 44 && statusLinkRect.left >= 0; // 44 is the magic number for header height, not real\n      });\n      if (topmostStatusLink) {\n        topmostStatusLink.focus();\n        topmostStatusLink.scrollIntoView(scrollIntoViewOptions);\n      }\n    }\n  });\n\n  useHotkeys('k', () => {\n    const activeStatus = document.activeElement.closest(\n      '.status-link, .status-focus',\n    );\n    const activeStatusRect = activeStatus?.getBoundingClientRect();\n    const allStatusLinks = Array.from(\n      scrollableRef.current.querySelectorAll(STATUSES_SELECTOR),\n    );\n    if (\n      activeStatus &&\n      activeStatusRect.top < scrollableRef.current.clientHeight &&\n      activeStatusRect.bottom > 0\n    ) {\n      const activeStatusIndex = allStatusLinks.indexOf(activeStatus);\n      let prevStatus = allStatusLinks[activeStatusIndex - 1];\n      if (prevStatus) {\n        prevStatus.focus();\n        prevStatus.scrollIntoView(scrollIntoViewOptions);\n      }\n    } else {\n      // If active status is not in viewport, get the topmost status-link in viewport\n      const topmostStatusLink = allStatusLinks.find((statusLink) => {\n        const statusLinkRect = statusLink.getBoundingClientRect();\n        return statusLinkRect.top >= 44 && statusLinkRect.left >= 0; // 44 is the magic number for header height, not real\n      });\n      if (topmostStatusLink) {\n        topmostStatusLink.focus();\n        topmostStatusLink.scrollIntoView(scrollIntoViewOptions);\n      }\n    }\n  });\n\n  // NOTE: I'm not sure if 'x' is the best shortcut for this, might change it later\n  // IDEA: x is for expand\n  useHotkeys('x', () => {\n    const activeStatus = document.activeElement.closest(\n      '.status-link, .status-focus',\n    );\n    if (activeStatus) {\n      const details = activeStatus.nextElementSibling;\n      if (details && details.tagName.toLowerCase() === 'details') {\n        details.open = !details.open;\n      }\n    }\n  });\n\n  const [reachTopPost, setReachTopPost] = useState(false);\n  // const { nearReachStart } = useScroll({\n  //   scrollableRef,\n  //   distanceFromStartPx: 16,\n  // });\n\n  const initialPageState = useRef(showMedia ? 'media+status' : 'status');\n\n  const handleMediaClick = useCallback(\n    (e, i, media, status) => {\n      e.preventDefault();\n      e.stopPropagation();\n      setSearchParams({\n        media: i + 1,\n        mediaStatusID: status.id,\n      });\n    },\n    [id],\n  );\n\n  const handleStatusLinkClick = useCallback((e, status) => {\n    resetScrollPosition(status.id);\n  }, []);\n\n  useEffect(() => {\n    let timer;\n    if (mediaStatusID && showMedia) {\n      timer = setTimeout(() => {\n        const status = scrollableRef.current?.querySelector(\n          `.status-link[href*=\"/${mediaStatusID}\"]`,\n        );\n        if (status) {\n          status.scrollIntoView(scrollIntoViewOptions);\n        }\n      }, 400); // After CSS transition\n    }\n    return () => {\n      clearTimeout(timer);\n    };\n  }, [mediaStatusID, showMedia]);\n\n  const renderStatus = useCallback(\n    (status, i) => {\n      const {\n        id: statusID,\n        ancestor,\n        isThread,\n        descendant,\n        thread,\n        replies,\n        repliesCount,\n        weight,\n        level,\n      } = status;\n      const isHero = statusID === id;\n      const isLinkable = isThread || ancestor;\n\n      return (\n        <li\n          key={statusID}\n          ref={isHero ? heroStatusRef : null}\n          class={`${ancestor ? 'ancestor' : ''} ${\n            descendant ? 'descendant' : ''\n          } ${thread ? 'thread' : ''} ${isHero ? 'hero' : ''}`}\n        >\n          {isHero ? (\n            <>\n              <InView\n                threshold={0.1}\n                onChange={(inView) => {\n                  queueMicrotask(() => {\n                    requestAnimationFrame(() => {\n                      setHeroInView(inView);\n                    });\n                  });\n                }}\n                class=\"status-focus\"\n                tabIndex={0}\n              >\n                <Status\n                  statusID={statusID}\n                  instance={instance}\n                  withinContext\n                  size=\"l\"\n                  enableTranslate\n                  forceTranslate={translate}\n                />\n              </InView>\n              {uiState !== 'loading' && !authenticated ? (\n                <div class=\"post-status-banner\">\n                  <p>\n                    <Trans>\n                      You're not logged in. Interactions (reply, boost, etc) are\n                      not possible.\n                    </Trans>\n                  </p>\n                  <Link\n                    to={\n                      DEFAULT_INSTANCE\n                        ? `/login?instance=${DEFAULT_INSTANCE}&submit=1`\n                        : '/login'\n                    }\n                    class=\"button\"\n                  >\n                    <Trans>Log in</Trans>\n                  </Link>\n                </div>\n              ) : (\n                !sameInstance && (\n                  <div class=\"post-status-banner\">\n                    <p>\n                      <Trans>\n                        This post is from another instance (<b>{instance}</b>).\n                        Interactions (reply, boost, etc) are not possible.\n                      </Trans>\n                    </p>\n                    <button\n                      type=\"button\"\n                      disabled={uiState === 'loading'}\n                      onClick={() => {\n                        setUIState('loading');\n                        (async () => {\n                          try {\n                            const results = await currentMasto.v2.search.fetch({\n                              q: heroStatus.url,\n                              type: 'statuses',\n                              resolve: true,\n                              limit: 1,\n                            });\n                            if (results.statuses.length) {\n                              const status = results.statuses[0];\n                              location.hash = currentInstance\n                                ? `/${currentInstance}/s/${status.id}`\n                                : `/s/${status.id}`;\n                            } else {\n                              throw new Error('No results');\n                            }\n                          } catch (e) {\n                            setUIState('default');\n                            alert(t`Error: ${e}`);\n                            console.error(e);\n                          }\n                        })();\n                      }}\n                    >\n                      <Icon icon=\"transfer\" />{' '}\n                      <Trans>\n                        Switch to my instance to enable interactions\n                      </Trans>\n                    </button>\n                  </div>\n                )\n              )}\n            </>\n          ) : (\n            <StatusParent\n              linkable={isLinkable}\n              to={instance ? `/${instance}/s/${statusID}` : `/s/${statusID}`}\n              onClick={() => {\n                resetScrollPosition(statusID);\n              }}\n            >\n              {/* <Link\n              class=\"status-link\"\n              to={instance ? `/${instance}/s/${statusID}` : `/s/${statusID}`}\n              onClick={() => {\n                resetScrollPosition(statusID);\n              }}\n            > */}\n              {i === 0 && ancestor ? (\n                <InView\n                  threshold={0.5}\n                  onChange={(inView) => {\n                    queueMicrotask(() => {\n                      requestAnimationFrame(() => {\n                        setReachTopPost(inView);\n                      });\n                    });\n                  }}\n                >\n                  <Status\n                    statusID={statusID}\n                    instance={instance}\n                    withinContext\n                    size={thread || ancestor ? 'm' : 's'}\n                    enableTranslate\n                    onMediaClick={handleMediaClick}\n                    onStatusLinkClick={handleStatusLinkClick}\n                  />\n                </InView>\n              ) : (\n                <Status\n                  statusID={statusID}\n                  instance={instance}\n                  withinContext\n                  size={thread || ancestor ? 'm' : 's'}\n                  enableTranslate\n                  onMediaClick={handleMediaClick}\n                  onStatusLinkClick={handleStatusLinkClick}\n                  showActionsBar={!!descendant}\n                />\n              )}\n              {ancestor && repliesCount > 1 && (\n                <div class=\"replies-link\">\n                  <Icon icon=\"comment2\" alt={t`Replies`} />{' '}\n                  <span title={repliesCount}>\n                    {shortenNumber(repliesCount)}\n                  </span>\n                </div>\n              )}{' '}\n              {/* {replies?.length > LIMIT && (\n                        <div class=\"replies-link\">\n                          <Icon icon=\"comment\" />{' '}\n                          <span title={replies.length}>\n                            {shortenNumber(replies.length)}\n                          </span>\n                        </div>\n                      )} */}\n            </StatusParent>\n            // </Link>\n          )}\n          {descendant && replies?.length > 0 && (\n            <SubComments\n              instance={instance}\n              replies={replies}\n              hasParentThread={thread}\n              level={level}\n              accWeight={weight}\n              openAll={totalDescendants.current < SUBCOMMENTS_OPEN_ALL_LIMIT}\n              parentLink={{\n                to: instance ? `/${instance}/s/${statusID}` : `/s/${statusID}`,\n                onClick: () => resetScrollPosition(statusID),\n              }}\n            />\n          )}\n          {uiState === 'loading' &&\n            isHero &&\n            !!heroStatus?.repliesCount &&\n            !hasDescendants && (\n              <div class=\"status-loading\">\n                <Loader abrupt={heroStatus.repliesCount >= 3} />\n              </div>\n            )}\n          {uiState === 'error' &&\n            isHero &&\n            !!heroStatus?.repliesCount &&\n            !hasDescendants && (\n              <div class=\"status-error\">\n                <Trans>Unable to load replies.</Trans>\n                <br />\n                <button\n                  type=\"button\"\n                  class=\"plain\"\n                  onClick={() => {\n                    states.reloadStatusPage++;\n                  }}\n                >\n                  <Trans>Try again</Trans>\n                </button>\n              </div>\n            )}\n        </li>\n      );\n    },\n    [\n      id,\n      instance,\n      uiState,\n      authenticated,\n      sameInstance,\n      translate,\n      handleMediaClick,\n      handleStatusLinkClick,\n      hasDescendants,\n    ],\n  );\n\n  const prevLocationIsStatusPage = useMemo(() => {\n    // Navigation API\n    if ('navigation' in window && navigation?.entries) {\n      const prevEntry = navigation.entries()[navigation.currentEntry.index - 1];\n      if (prevEntry?.url) {\n        return STATUS_URL_REGEX.test(prevEntry.url);\n      }\n    }\n    return STATUS_URL_REGEX.test(states.prevLocation?.pathname);\n  }, [sKey]);\n\n  const moreStatusesKeys = useMemo(() => {\n    if (!showMore) return [];\n    const ids = [];\n    function getIDs(status) {\n      ids.push(status.id);\n      if (status.replies) {\n        status.replies.forEach(getIDs);\n      }\n    }\n    statuses.slice(limit).forEach(getIDs);\n    return ids.map((id) => statusKey(id, instance));\n  }, [showMore, statuses, limit, instance]);\n\n  const statusesList = useMemo(\n    () => statuses.slice(0, limit).map(renderStatus),\n    [statuses, limit, renderStatus],\n  );\n\n  // If there's spoiler in hero status, auto-expand it\n  useEffect(() => {\n    let timer = setTimeout(() => {\n      if (!heroStatusRef.current) return;\n      const spoilerButton = heroStatusRef.current.querySelector(\n        '.spoiler-button:not(.spoiling), .spoiler-media-button:not(.spoiling)',\n      );\n      if (spoilerButton) spoilerButton.click();\n    }, 1000);\n    return () => clearTimeout(timer);\n  }, [id]);\n\n  return (\n    <div\n      tabIndex=\"-1\"\n      ref={scrollableRef}\n      class={`status-deck deck contained ${\n        statuses.length > 1 ? 'padded-bottom' : ''\n      } ${\n        initialPageState.current === 'status' && !firstLoad.current\n          ? 'slide-in'\n          : ''\n      } ${viewMode ? `deck-view-${viewMode}` : ''}`}\n      onAnimationEnd={(e) => {\n        // Fix the bounce effect when switching viewMode\n        // `slide-in` animation kicks in when switching viewMode\n        if (initialPageState.current === 'status') {\n          // e.target.classList.remove('slide-in');\n          initialPageState.current = null;\n        }\n      }}\n    >\n      <header\n        class={`${uiState === 'loading' ? 'loading' : ''}`}\n        onDblClick={(e) => {\n          // reload statuses\n          states.reloadStatusPage++;\n        }}\n      >\n        {/* <div>\n            <Link class=\"button plain deck-close\" href={closeLink}>\n              <Icon icon=\"chevron-left\" size=\"xl\" />\n            </Link>\n          </div> */}\n        <div class=\"header-grid header-grid-2\">\n          <h1>\n            {prevLocationIsStatusPage && (\n              <button\n                type=\"button\"\n                class=\"plain deck-back\"\n                onClick={() => {\n                  history.back();\n                }}\n              >\n                <Icon icon=\"chevron-left\" size=\"xl\" alt={t`Back`} />\n              </button>\n            )}\n            {!heroInView && heroStatus && uiState !== 'loading' ? (\n              <>\n                <span class=\"hero-heading\">\n                  <NameText\n                    account={heroStatus.account}\n                    instance={instance}\n                    showAvatar\n                    short\n                  />{' '}\n                  <span class=\"insignificant\">\n                    &bull;{' '}\n                    <RelativeTime\n                      datetime={heroStatus.createdAt}\n                      format=\"micro\"\n                    />\n                  </span>\n                </span>{' '}\n                <button\n                  type=\"button\"\n                  class=\"ancestors-indicator light small\"\n                  onClick={(e) => {\n                    e.preventDefault();\n                    e.stopPropagation();\n                    heroStatusRef.current.scrollIntoView({\n                      behavior: 'smooth',\n                      block: 'start',\n                    });\n                  }}\n                  title={t`Go to main post`}\n                >\n                  <Icon\n                    icon={heroPointer === 'down' ? 'arrow-down' : 'arrow-up'}\n                  />\n                </button>\n              </>\n            ) : (\n              <>\n                <Trans id=\"post.title\">Post</Trans>{' '}\n                <button\n                  type=\"button\"\n                  class=\"ancestors-indicator light small\"\n                  onClick={(e) => {\n                    // Scroll to top\n                    e.preventDefault();\n                    e.stopPropagation();\n                    scrollableRef.current.scrollTo({\n                      top: 0,\n                      behavior: 'smooth',\n                    });\n                  }}\n                  hidden={!ancestors.length || reachTopPost}\n                  title={t`${ancestors.length} posts above โ€’ Go to top`}\n                >\n                  <Icon icon=\"arrow-up\" />\n                  {ancestors\n                    .filter(\n                      (a, i, arr) =>\n                        arr.findIndex((b) => b.accountID === a.accountID) === i,\n                    )\n                    .slice(0, 3)\n                    .map((ancestor) => (\n                      <Avatar\n                        key={ancestor.account.id}\n                        url={ancestor.account.avatar}\n                        alt={ancestor.account.displayName}\n                      />\n                    ))}\n                  {/* <Icon icon=\"comment\" />{' '} */}\n                  {ancestors.length > 3 && (\n                    <>\n                      {' '}\n                      <span class=\"insignificant\">\n                        {shortenNumber(ancestors.length)}\n                      </span>\n                    </>\n                  )}\n                </button>\n              </>\n            )}\n          </h1>\n          <div class=\"header-side\">\n            <button\n              type=\"button\"\n              class=\"plain4 button-switch-view\"\n              style={{\n                display: viewMode === 'full' ? '' : 'none',\n              }}\n              onClick={() => {\n                setViewMode(null);\n                searchParams.delete('media');\n                searchParams.delete('media-only');\n                searchParams.delete('view');\n                setSearchParams(searchParams);\n              }}\n              title={t`Switch to Side Peek view`}\n            >\n              <Icon icon=\"layout4\" size=\"l\" />\n            </button>\n            {showRefresh && (\n              <button\n                type=\"button\"\n                class=\"plain button-refresh\"\n                onClick={() => {\n                  states.reloadStatusPage++;\n                  setShowRefresh(false);\n                }}\n              >\n                <Icon icon=\"refresh\" size=\"l\" alt={t`Refresh`} />\n              </button>\n            )}\n            <Menu2\n              align=\"end\"\n              portal={{\n                // Need this, else the menu click will cause scroll jump\n                target: scrollableRef.current,\n              }}\n              menuButton={\n                <button type=\"button\" class=\"button plain4\">\n                  <Icon icon=\"more\" alt={t`More`} size=\"xl\" />\n                </button>\n              }\n            >\n              <MenuItem\n                disabled={uiState === 'loading'}\n                onClick={() => {\n                  states.reloadStatusPage++;\n                }}\n              >\n                <Icon icon=\"refresh\" />\n                <span>\n                  <Trans>Refresh</Trans>\n                </span>\n              </MenuItem>\n              <MenuItem\n                className=\"menu-switch-view\"\n                onClick={() => {\n                  setViewMode(viewMode === 'full' ? null : 'full');\n                  searchParams.delete('media');\n                  searchParams.delete('media-only');\n                  if (viewMode === 'full') {\n                    searchParams.delete('view');\n                  } else {\n                    searchParams.set('view', 'full');\n                  }\n                  setSearchParams(searchParams);\n                }}\n              >\n                <Icon\n                  icon={\n                    {\n                      '': 'layout5',\n                      full: 'layout4',\n                    }[viewMode || '']\n                  }\n                />\n                <span>\n                  {viewMode === 'full'\n                    ? t`Switch to Side Peek view`\n                    : t`Switch to Full view`}\n                </span>\n              </MenuItem>\n              <MenuItem\n                onClick={() => {\n                  // Click all buttons with class .spoiler but not .spoiling\n                  const buttons = Array.from(\n                    scrollableRef.current.querySelectorAll(\n                      '.spoiler-button:not(.spoiling), .spoiler-media-button:not(.spoiling)',\n                    ),\n                  );\n                  buttons.forEach((button) => {\n                    button.click();\n                  });\n                }}\n              >\n                <Icon icon=\"eye-open\" />{' '}\n                <span>\n                  <Trans>Show all sensitive content</Trans>\n                </span>\n              </MenuItem>\n              <MenuDivider />\n              <MenuHeader className=\"plain\">\n                <Trans>Experimental</Trans>\n              </MenuHeader>\n              <MenuItem\n                disabled={!postInstance || postSameInstance}\n                onClick={() => {\n                  const statusURL = getInstanceStatusURL(heroStatus.url);\n                  if (statusURL) {\n                    location.hash = statusURL;\n                  } else {\n                    alert(t`Unable to switch`);\n                  }\n                }}\n              >\n                <Icon icon=\"transfer\" />\n                <small class=\"menu-double-lines\">\n                  {postInstance\n                    ? t`Switch to post's instance (${punycode.toUnicode(\n                        postInstance,\n                      )})`\n                    : t`Switch to post's instance`}\n                </small>\n              </MenuItem>\n            </Menu2>\n            <Link class=\"button plain deck-close\" to={closeLink}>\n              <Icon icon=\"x\" size=\"xl\" alt={t`Close`} />\n            </Link>\n          </div>\n        </div>\n      </header>\n      {!!statuses.length && heroStatus ? (\n        <ul\n          class={`timeline flat contextual grow ${\n            uiState === 'loading' ? 'loading' : ''\n          }`}\n        >\n          {statusesList}\n          {showMore > 0 && (\n            <li class=\"descendant descendant-more\">\n              <button\n                type=\"button\"\n                class=\"plain block show-more\"\n                disabled={uiState === 'loading'}\n                onClick={() => setLimit((l) => l + LIMIT)}\n                style={{ marginBlockEnd: '6em' }}\n                data-state-post-ids={moreStatusesKeys.join(' ')}\n              >\n                <div class=\"ib avatars-bunch\">\n                  {/* show avatars for first 5 statuses */}\n                  {statuses.slice(limit, limit + 5).map((status) => (\n                    <Avatar\n                      key={status.id}\n                      url={status.account.avatarStatic}\n                      // title={`${status.avatar.displayName} (@${status.avatar.acct})`}\n                    />\n                  ))}\n                </div>{' '}\n                <div class=\"ib\">\n                  <Trans>Show moreโ€ฆ</Trans>{' '}\n                  <span class=\"tag\">\n                    {showMore > LIMIT ? `${LIMIT}+` : showMore}\n                  </span>\n                </div>\n              </button>\n            </li>\n          )}\n        </ul>\n      ) : (\n        <>\n          {uiState === 'loading' && (\n            <ul class=\"timeline flat contextual grow loading\">\n              <li>\n                <Status skeleton size=\"l\" />\n              </li>\n            </ul>\n          )}\n          {uiState === 'error' && (\n            <p class=\"ui-state\">\n              <Trans>Unable to load post</Trans>\n              <br />\n              <br />\n              <button\n                type=\"button\"\n                onClick={() => {\n                  states.reloadStatusPage++;\n                }}\n              >\n                <Trans>Try again</Trans>\n              </button>\n            </p>\n          )}\n        </>\n      )}\n    </div>\n  );\n}\n\nfunction SubComments({\n  replies,\n  instance,\n  hasParentThread,\n  level,\n  accWeight,\n  openAll,\n  parentLink,\n}) {\n  const { t } = useLingui();\n  const [searchParams, setSearchParams] = useSearchParams();\n\n  // Total comments count, including sub-replies\n  const diveDeep = (replies) => {\n    return replies.reduce((acc, reply) => {\n      const { repliesCount, replies } = reply;\n      const count = replies?.length || repliesCount;\n      return acc + count + diveDeep(replies || []);\n    }, 0);\n  };\n  const totalComments = replies.length + diveDeep(replies);\n  const sameCount = replies.length === totalComments;\n\n  // Get the first 3 accounts, unique by id\n  const accounts = replies\n    .map((r) => r.account)\n    .filter((a, i, arr) => arr.findIndex((b) => b.id === a.id) === i)\n    .slice(0, 3);\n\n  const totalWeight = useMemo(() => {\n    return replies?.reduce((acc, reply) => {\n      return acc + reply?.weight;\n    }, accWeight);\n  }, [accWeight, replies?.length]);\n\n  let open = false;\n  if (openAll) {\n    open = true;\n  } else if (totalWeight <= MAX_WEIGHT) {\n    open = true;\n  } else if (!hasParentThread && totalComments === 1) {\n    const shortReply = calcStatusWeight(replies[0]) < 2;\n    if (shortReply) open = true;\n  }\n  const openBefore = cachedRepliesToggle[replies[0].id];\n\n  const handleMediaClick = useCallback((e, i, media, status) => {\n    e.preventDefault();\n    e.stopPropagation();\n    setSearchParams({\n      media: i + 1,\n      mediaStatusID: status.id,\n    });\n  }, []);\n\n  const detailsRef = useRef();\n  useLayoutEffect(() => {\n    function handleScroll(e) {\n      // NOTE: this scrollLeft works for RTL too\n      // Browsers do the magic for us\n      e.target.dataset.scrollLeft = e.target.scrollLeft;\n    }\n    detailsRef.current?.addEventListener('scroll', handleScroll, {\n      passive: true,\n    });\n    return () => {\n      detailsRef.current?.removeEventListener('scroll', handleScroll);\n    };\n  }, []);\n\n  // If not open, delay render replies\n  const [renderReplies, setRenderReplies] = useState(openBefore || open);\n  useEffect(() => {\n    let timer;\n    if (!openBefore && !open) {\n      timer = setTimeout(() => setRenderReplies(true), 100);\n    }\n    return () => clearTimeout(timer);\n  }, [openBefore, open]);\n\n  const Container = open ? 'div' : 'details';\n  const isDetails = Container === 'details';\n\n  return (\n    <Container\n      ref={detailsRef}\n      class=\"replies\"\n      open={isDetails ? openBefore || open : undefined}\n      onToggle={\n        isDetails\n          ? (e) => {\n              const { open } = e.target;\n              // use first reply as ID\n              cachedRepliesToggle[replies[0].id] = open;\n            }\n          : undefined\n      }\n      style={{\n        '--comments-level': level,\n      }}\n      data-comments-level={level}\n      data-comments-level-overflow={level > 4}\n    >\n      {!open && (\n        <summary class=\"replies-summary\" hidden={open}>\n          <span class=\"avatars\">\n            {accounts.map((a) => (\n              <Avatar\n                key={a.id}\n                url={a.avatarStatic}\n                title={`${a.displayName} @${a.username}`}\n                squircle={a?.bot}\n              />\n            ))}\n          </span>\n          <span class=\"replies-counts\">\n            <b>\n              <Plural\n                value={replies.length}\n                one=\"# reply\"\n                other={\n                  <Trans>\n                    <span title={replies.length}>\n                      {shortenNumber(replies.length)}\n                    </span>{' '}\n                    replies\n                  </Trans>\n                }\n              />\n            </b>\n            {!sameCount && totalComments > 1 && (\n              <>\n                {' '}\n                &middot;{' '}\n                <span>\n                  <Plural\n                    value={totalComments}\n                    one=\"# comment\"\n                    other={\n                      <Trans>\n                        <span title={totalComments}>\n                          {shortenNumber(totalComments)}\n                        </span>{' '}\n                        comments\n                      </Trans>\n                    }\n                  />\n                </span>\n              </>\n            )}\n          </span>\n          <Icon icon=\"chevron-down\" class=\"replies-summary-chevron\" />\n          {!!parentLink && (\n            <Link\n              class=\"replies-parent-link\"\n              to={parentLink.to}\n              onClick={parentLink.onClick}\n              title={t`View post with its replies`}\n            >\n              &raquo;\n            </Link>\n          )}\n        </summary>\n      )}\n      {renderReplies && (\n        <ul>\n          {replies.map((r) => (\n            <li key={r.id}>\n              {/* <Link\n              class=\"status-link\"\n              to={instance ? `/${instance}/s/${r.id}` : `/s/${r.id}`}\n              onClick={() => {\n                resetScrollPosition(r.id);\n              }}\n            > */}\n              <div class=\"status-focus\" tabIndex={0}>\n                <Status\n                  statusID={r.id}\n                  instance={instance}\n                  withinContext\n                  size=\"s\"\n                  enableTranslate\n                  onMediaClick={handleMediaClick}\n                  showActionsBar\n                />\n                {!r.replies?.length && r.repliesCount > 0 && (\n                  <div class=\"replies-link\">\n                    <Icon icon=\"comment2\" alt={t`Replies`} />{' '}\n                    <span title={r.repliesCount}>\n                      {shortenNumber(r.repliesCount)}\n                    </span>\n                  </div>\n                )}\n              </div>\n              {/* </Link> */}\n              {r.replies?.length && (\n                <SubComments\n                  instance={instance}\n                  replies={r.replies}\n                  level={r.level}\n                  accWeight={!open ? r.weight : totalWeight}\n                  openAll={openAll}\n                  parentLink={{\n                    to: instance ? `/${instance}/s/${r.id}` : `/s/${r.id}`,\n                    onClick: () => {\n                      resetScrollPosition(r.id);\n                    },\n                  }}\n                />\n              )}\n            </li>\n          ))}\n        </ul>\n      )}\n    </Container>\n  );\n}\n\nconst MEDIA_VIRTUAL_LENGTH = 140;\nconst POLL_VIRTUAL_LENGTH = 35;\nconst CARD_VIRTUAL_LENGTH = 70;\nconst WEIGHT_SEGMENT = 140;\nconst statusWeightCache = new Map();\nfunction calcStatusWeight(status) {\n  const cachedWeight = statusWeightCache.get(status.id);\n  if (cachedWeight) return cachedWeight;\n  const { spoilerText, content, mediaAttachments, poll, card } = status;\n  const length = htmlContentLength(spoilerText + content);\n  const mediaLength = mediaAttachments?.length ? MEDIA_VIRTUAL_LENGTH : 0;\n  const pollLength = (poll?.options?.length || 0) * POLL_VIRTUAL_LENGTH;\n  const cardLength =\n    card && (mediaAttachments?.length || poll?.options?.length)\n      ? 0\n      : CARD_VIRTUAL_LENGTH;\n  const totalLength = length + mediaLength + pollLength + cardLength;\n  const weight = totalLength / WEIGHT_SEGMENT;\n  statusWeightCache.set(status.id, weight);\n  return weight;\n}\n\nexport default memo(StatusPage);\n","import { useParams } from 'react-router-dom';\n\nimport Status from './status';\n\nexport default function StatusRoute() {\n  const params = useParams();\n  const { id, instance } = params;\n  return <Status id={id} instance={instance} />;\n}\n","export default \"__VITE_ASSET__W5CngKHO__\"","export default \"__VITE_ASSET__vmqRZ5q5__\"","export default \"__VITE_ASSET__DFAo1Udm__\"","export default \"__VITE_ASSET__D2_o1n6___\"","export default \"__VITE_ASSET__ySLnBMku__\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20xml:space='preserve'%20fill-rule='evenodd'%20stroke-linejoin='round'%20stroke-miterlimit='2'%20clip-rule='evenodd'%20viewBox='0%200%20102%2028'%3e%3cpath%20fill='none'%20d='M0%200h101.5v27.5H0z'/%3e%3cg%20fill-rule='nonzero'%3e%3cpath%20fill='url(%23a)'%20d='M2.32%2021.85c1.4%200%202.21-.85%202.21-2.3v-4.64H8.5c4.45%200%207.54-2.9%207.54-7.24%200-4.35-2.98-7.24-7.32-7.24h-6.4C.93.43.11%201.28.11%202.73v16.82c0%201.45.82%202.3%202.21%202.3Zm2.21-10.4V3.94h3c2.54%200%204%201.34%204%203.75s-1.47%203.76-4%203.76h-3Z'/%3e%3cpath%20fill='url(%23b)'%20d='M20.52%2021.88c1.25%200%202.13-.76%202.13-2.23v-7.04c0-2.07%201.2-3.49%203.21-3.49%201.95%200%202.95%201.23%202.95%203.25v7.28c0%201.47.89%202.23%202.13%202.23%201.26%200%202.14-.76%202.14-2.23v-8.18c0-3.64-1.99-5.9-5.48-5.9-2.38%200-4.1%201.12-4.93%203.1h-.09V2.3c0-1.38-.78-2.2-2.1-2.2-1.31%200-2.1.82-2.1%202.2v17.34c0%201.47.9%202.23%202.14%202.23Z'/%3e%3cpath%20fill='url(%23c)'%20d='M40.45%2021.82c1.96%200%203.93-.98%204.8-2.65h.1v.8c.08%201.27.89%201.91%202.05%201.91%201.21%200%202.08-.73%202.08-2.15v-8.95c0-3.17-2.63-5.25-6.65-5.25-3.26%200-5.78%201.16-6.5%203.04-.15.32-.23.63-.23.96%200%20.97.75%201.64%201.79%201.64.69%200%201.23-.26%201.7-.79.95-1.23%201.74-1.65%203.04-1.65%201.62%200%202.64.85%202.64%202.31v1.04l-3.95.24c-3.93.23-6.13%201.88-6.13%204.74%200%202.83%202.27%204.76%205.26%204.76Zm1.4-3.09c-1.43%200-2.4-.73-2.4-1.9%200-1.12.91-1.83%202.51-1.95l3.31-.2v1.14c0%201.7-1.54%202.91-3.41%202.91Z'/%3e%3cpath%20fill='url(%23d)'%20d='M54.37%2021.88c1.26%200%202.14-.76%202.14-2.23v-7.09c0-2.03%201.21-3.44%203.13-3.44s2.89%201.17%202.89%203.22v7.31c0%201.47.88%202.23%202.14%202.23%201.24%200%202.13-.76%202.13-2.23v-8.2c0-3.68-1.96-5.87-5.45-5.87-2.41%200-4%201.07-4.83%203.01h-.09v-.87c0-1.35-.85-2.17-2.14-2.17-1.28%200-2.06.82-2.06%202.15v11.95c0%201.47.9%202.23%202.14%202.23Z'/%3e%3cpath%20fill='url(%23e)'%20d='M71.65%2027.17c1.26%200%202.14-.76%202.14-2.23v-6h.09a5.15%205.15%200%200%200%204.88%202.88c3.92%200%206.35-3.05%206.35-8.1%200-5.07-2.44-8.1-6.43-8.1a5.12%205.12%200%200%200-4.86%202.99h-.09v-.85c0-1.45-.88-2.21-2.1-2.21-1.24%200-2.11.76-2.11%202.2v17.2c0%201.46.89%202.22%202.13%202.22Zm5.6-8.8c-2.1%200-3.47-1.8-3.47-4.65%200-2.81%201.37-4.67%203.47-4.67%202.14%200%203.49%201.83%203.49%204.67%200%202.86-1.35%204.66-3.5%204.66Z'/%3e%3cpath%20fill='url(%23f)'%20d='M89.61%2027.39c3.44%200%205.26-1.5%206.73-5.55l4.81-13.1a4%204%200%200%200%20.24-1.26c0-1.13-.85-1.93-2.08-1.93-1.1%200-1.71.51-2.07%201.7l-3.4%2010.9h-.08L90.35%207.28c-.36-1.25-.94-1.73-2.07-1.73-1.26%200-2.21.83-2.21%201.99%200%20.35.09.82.25%201.26l5%2013.21-.21.56c-.52%201.1-1.32%201.42-2.07%201.42l-.75-.01c-.96%200-1.56.54-1.56%201.4%200%201.29%201%202%202.88%202Z'/%3e%3c/g%3e%3cdefs%3e%3cradialGradient%20id='a'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='b'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='c'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='d'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='e'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='f'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3c/defs%3e%3c/svg%3e\"","import './welcome.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\n\nimport boostsCarouselUrl from '../assets/features/boosts-carousel.jpg';\nimport groupedNotificationsUrl from '../assets/features/grouped-notifications.jpg';\nimport multiColumnUrl from '../assets/features/multi-column.jpg';\nimport multiHashtagTimelineUrl from '../assets/features/multi-hashtag-timeline.jpg';\nimport nestedCommentsThreadUrl from '../assets/features/nested-comments-thread.jpg';\nimport logoText from '../assets/logo-text.svg';\nimport logo from '../assets/logo.svg';\n\nimport LangSelector from '../components/lang-selector';\nimport Link from '../components/link';\nimport states from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst {\n  PHANPY_DEFAULT_INSTANCE: DEFAULT_INSTANCE,\n  PHANPY_WEBSITE: WEBSITE,\n  PHANPY_PRIVACY_POLICY_URL: PRIVACY_POLICY_URL,\n  PHANPY_DEFAULT_INSTANCE_REGISTRATION_URL: DEFAULT_INSTANCE_REGISTRATION_URL,\n} = import.meta.env;\nconst appSite = WEBSITE\n  ? WEBSITE.replace(/https?:\\/\\//g, '').replace(/\\/$/, '')\n  : null;\nconst appVersion = __BUILD_TIME__\n  ? `${__BUILD_TIME__.slice(0, 10).replace(/-/g, '.')}${\n      __COMMIT_HASH__ ? `.${__COMMIT_HASH__}` : ''\n    }`\n  : null;\n\nfunction Welcome() {\n  const { t } = useLingui();\n  useTitle(null, ['/', '/welcome']);\n  return (\n    <main id=\"welcome\">\n      <div class=\"hero-container\">\n        <div class=\"hero-content\">\n          <h1>\n            <img\n              src={logo}\n              alt=\"\"\n              width=\"160\"\n              height=\"160\"\n              style={{\n                aspectRatio: '1/1',\n                marginBlockEnd: -16,\n              }}\n            />\n            <img src={logoText} alt=\"Phanpy\" width=\"200\" />\n          </h1>\n          <p class=\"desc\">\n            <Trans>A minimalistic opinionated Mastodon web client.</Trans>\n          </p>\n          <p>\n            <Link\n              to={\n                DEFAULT_INSTANCE\n                  ? `/login?instance=${DEFAULT_INSTANCE}&submit=1`\n                  : '/login'\n              }\n              class=\"button\"\n            >\n              {DEFAULT_INSTANCE ? t`Log in` : t`Log in with Mastodon`}\n            </Link>\n          </p>\n          {DEFAULT_INSTANCE && DEFAULT_INSTANCE_REGISTRATION_URL && (\n            <p>\n              <a href={DEFAULT_INSTANCE_REGISTRATION_URL} class=\"button plain5\">\n                <Trans>Sign up</Trans>\n              </a>\n            </p>\n          )}\n          {!DEFAULT_INSTANCE && (\n            <p class=\"insignificant\">\n              <small>\n                <Trans>\n                  Connect your existing Mastodon/Fediverse account.\n                  <br />\n                  Your credentials are not stored on this server.\n                </Trans>\n              </small>\n            </p>\n          )}\n        </div>\n        {(appSite || appVersion) && (\n          <p class=\"app-site-version\">\n            <small>\n              {appSite} {appVersion}\n            </small>\n          </p>\n        )}\n        <p>\n          <Trans>\n            <a href=\"https://github.com/cheeaun/phanpy\" target=\"_blank\">\n              Built\n            </a>{' '}\n            by{' '}\n            <a\n              href=\"https://mastodon.social/@cheeaun\"\n              target=\"_blank\"\n              onClick={(e) => {\n                e.preventDefault();\n                states.showAccount = 'cheeaun@mastodon.social';\n              }}\n            >\n              @cheeaun\n            </a>\n            .{' '}\n            <a href={PRIVACY_POLICY_URL} target=\"_blank\">\n              Privacy Policy\n            </a>\n            .\n          </Trans>\n        </p>\n        <div>\n          <LangSelector />\n        </div>\n      </div>\n      <div id=\"why-container\">\n        <div class=\"sections\">\n          <section>\n            <img\n              src={boostsCarouselUrl}\n              alt={t`Screenshot of Boosts Carousel`}\n              loading=\"lazy\"\n            />\n            <h4>\n              <Trans>Boosts Carousel</Trans>\n            </h4>\n            <p>\n              <Trans>\n                Visually separate original posts and re-shared posts (boosted\n                posts).\n              </Trans>\n            </p>\n          </section>\n          <section>\n            <img\n              src={nestedCommentsThreadUrl}\n              alt={t`Screenshot of nested comments thread`}\n              loading=\"lazy\"\n            />\n            <h4>\n              <Trans>Nested comments thread</Trans>\n            </h4>\n            <p>\n              <Trans>\n                Effortlessly follow conversations. Semi-collapsible replies.\n              </Trans>\n            </p>\n          </section>\n          <section>\n            <img\n              src={groupedNotificationsUrl}\n              alt={t`Screenshot of grouped notifications`}\n              loading=\"lazy\"\n            />\n            <h4>\n              <Trans>Grouped notifications</Trans>\n            </h4>\n            <p>\n              <Trans>\n                Similar notifications are grouped and collapsed to reduce\n                clutter.\n              </Trans>\n            </p>\n          </section>\n          <section>\n            <img\n              src={multiColumnUrl}\n              alt={t`Screenshot of multi-column UI`}\n              loading=\"lazy\"\n            />\n            <h4>\n              <Trans>Single or multi-column</Trans>\n            </h4>\n            <p>\n              <Trans>\n                By default, single column for zen-mode seekers. Configurable\n                multi-column for power users.\n              </Trans>\n            </p>\n          </section>\n          <section>\n            <img\n              src={multiHashtagTimelineUrl}\n              alt={t`Screenshot of multi-hashtag timeline with a form to add more hashtags`}\n              loading=\"lazy\"\n            />\n            <h4>\n              <Trans>Multi-hashtag timeline</Trans>\n            </h4>\n            <p>\n              <Trans>Up to 5 hashtags combined into a single timeline.</Trans>\n            </p>\n          </section>\n        </div>\n      </div>\n    </main>\n  );\n}\n\nexport default Welcome;\n","// Replace alert() with toastify-js\nimport Toastify from 'toastify-js';\n\nconst nativeAlert = window.alert;\nif (!window.__nativeAlert) window.__nativeAlert = nativeAlert;\n\nwindow.alert = function (message) {\n  console.debug(\n    'ALERT: This is a custom alert() function. Native alert() is still available as window.__nativeAlert()',\n  );\n  // If Error object, show the message\n  if (message instanceof Error && message?.message) {\n    message = message.message;\n  }\n  // If not string, stringify it\n  if (typeof message !== 'string') {\n    message = JSON.stringify(message);\n  }\n\n  const toast = Toastify({\n    text: message,\n    className: 'alert',\n    gravity: 'top',\n    position: 'center',\n    duration: 10_000,\n    offset: {\n      y: 48,\n    },\n    onClick: () => {\n      toast.hideToast();\n    },\n  });\n  toast.showToast();\n};\n","import './app.css';\n\nimport { useLingui } from '@lingui/react';\nimport debounce from 'just-debounce-it';\nimport { memo } from 'preact/compat';\nimport {\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'preact/hooks';\nimport { matchPath, Route, Routes, useLocation } from 'react-router-dom';\n\nimport 'swiped-events';\n\nimport { subscribe } from 'valtio';\n\nimport BackgroundService from './components/background-service';\nimport ComposeButton from './components/compose-button';\nimport { ICONS } from './components/ICONS';\nimport KeyboardShortcutsHelp from './components/keyboard-shortcuts-help';\nimport Loader from './components/loader';\nimport Modals from './components/modals';\nimport NotificationService from './components/notification-service';\nimport SearchCommand from './components/search-command';\nimport Shortcuts from './components/shortcuts';\nimport NotFound from './pages/404';\nimport AccountStatuses from './pages/account-statuses';\nimport AnnualReport from './pages/annual-report';\nimport Bookmarks from './pages/bookmarks';\nimport Catchup from './pages/catchup';\nimport Favourites from './pages/favourites';\nimport Filters from './pages/filters';\nimport FollowedHashtags from './pages/followed-hashtags';\nimport Following from './pages/following';\nimport Hashtag from './pages/hashtag';\nimport Home from './pages/home';\nimport HttpRoute from './pages/http-route';\nimport List from './pages/list';\nimport Lists from './pages/lists';\nimport Login from './pages/login';\nimport Mentions from './pages/mentions';\nimport Notifications from './pages/notifications';\nimport Public from './pages/public';\nimport Search from './pages/search';\nimport StatusRoute from './pages/status-route';\nimport Trending from './pages/trending';\nimport Welcome from './pages/welcome';\nimport {\n  api,\n  hasInstance,\n  hasPreferences,\n  initAccount,\n  initClient,\n  initInstance,\n  initPreferences,\n} from './utils/api';\nimport { getAccessToken } from './utils/auth';\nimport focusDeck from './utils/focus-deck';\nimport states, { initStates, statusKey } from './utils/states';\nimport store from './utils/store';\nimport {\n  getAccount,\n  getCurrentAccount,\n  setCurrentAccountID,\n} from './utils/store-utils';\n\nimport './utils/toast-alert';\n\nwindow.__STATES__ = states;\nwindow.__STATES_STATS__ = () => {\n  const keys = [\n    'statuses',\n    'accounts',\n    'spoilers',\n    'unfurledLinks',\n    'statusQuotes',\n  ];\n  const counts = {};\n  keys.forEach((key) => {\n    counts[key] = Object.keys(states[key]).length;\n  });\n  console.warn('STATE stats', counts);\n\n  const { statuses } = states;\n  const unmountedPosts = [];\n  for (const key in statuses) {\n    const $post = document.querySelector(\n      `[data-state-post-id~=\"${key}\"], [data-state-post-ids~=\"${key}\"]`,\n    );\n    if (!$post) {\n      unmountedPosts.push(key);\n    }\n  }\n  console.warn('Unmounted posts', unmountedPosts.length, unmountedPosts);\n};\n\n// Experimental \"garbage collection\" for states\n// Every 15 minutes\n// Only posts for now\nsetInterval(\n  () => {\n    if (!window.__IDLE__) return;\n    const { statuses, unfurledLinks, notifications } = states;\n    let keysCount = 0;\n    const { instance } = api();\n    for (const key in statuses) {\n      if (!window.__IDLE__) break;\n      try {\n        const $post = document.querySelector(\n          `[data-state-post-id~=\"${key}\"], [data-state-post-ids~=\"${key}\"]`,\n        );\n        const postInNotifications = notifications.some(\n          (n) => key === statusKey(n.status?.id, instance),\n        );\n        if (!$post && !postInNotifications) {\n          delete states.statuses[key];\n          delete states.statusQuotes[key];\n          for (const link in unfurledLinks) {\n            const unfurled = unfurledLinks[link];\n            const sKey = statusKey(unfurled.id, unfurled.instance);\n            if (sKey === key) {\n              delete states.unfurledLinks[link];\n              break;\n            }\n          }\n          keysCount++;\n        }\n      } catch (e) {}\n    }\n    if (keysCount) {\n      console.info(`GC: Removed ${keysCount} keys`);\n    }\n  },\n  15 * 60 * 1000,\n);\n\n// Preload icons\n// There's probably a better way to do this\n// Related: https://github.com/vitejs/vite/issues/10600\nsetTimeout(() => {\n  for (const icon in ICONS) {\n    setTimeout(() => {\n      if (Array.isArray(ICONS[icon])) {\n        ICONS[icon][0]?.();\n      } else if (typeof ICONS[icon] === 'object') {\n        ICONS[icon].module?.();\n      } else {\n        ICONS[icon]?.();\n      }\n    }, 1);\n  }\n}, 5000);\n\n(() => {\n  window.__IDLE__ = true;\n  const nonIdleEvents = [\n    'mousemove',\n    'mousedown',\n    'resize',\n    'keydown',\n    'touchstart',\n    'pointerdown',\n    'pointermove',\n    'wheel',\n  ];\n  const setIdle = () => {\n    window.__IDLE__ = true;\n  };\n  const IDLE_TIME = 3_000; // 3 seconds\n  const debouncedSetIdle = debounce(setIdle, IDLE_TIME);\n  const onNonIdle = () => {\n    window.__IDLE__ = false;\n    debouncedSetIdle();\n  };\n  nonIdleEvents.forEach((event) => {\n    window.addEventListener(event, onNonIdle, {\n      passive: true,\n      capture: true,\n    });\n  });\n  window.addEventListener('blur', setIdle, {\n    passive: true,\n  });\n  // When cursor leaves the window, set idle\n  document.documentElement.addEventListener(\n    'mouseleave',\n    (e) => {\n      if (!e.relatedTarget && !e.toElement) {\n        setIdle();\n      }\n    },\n    {\n      passive: true,\n    },\n  );\n  // document.addEventListener(\n  //   'visibilitychange',\n  //   () => {\n  //     if (document.visibilityState === 'visible') {\n  //       onNonIdle();\n  //     }\n  //   },\n  //   {\n  //     passive: true,\n  //   },\n  // );\n})();\n\n// Possible fix for iOS PWA theme-color bug\n// It changes when loading web pages in \"webview\"\nconst isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);\nif (isIOS) {\n  document.addEventListener('visibilitychange', () => {\n    if (document.visibilityState === 'visible') {\n      // Don't reset theme color if media modal is showing\n      // Media modal will set its own theme color based on the media's color\n      const showingMediaModal =\n        document.getElementsByClassName('media-modal-container').length > 0;\n      if (showingMediaModal) return;\n\n      const theme = store.local.get('theme');\n      let $meta;\n      if (theme) {\n        // Get current meta\n        $meta = document.querySelector(\n          `meta[name=\"theme-color\"][data-theme-setting=\"manual\"]`,\n        );\n        if ($meta) {\n          const color = $meta.content;\n          const tempColor =\n            theme === 'light'\n              ? $meta.dataset.themeLightColorTemp\n              : $meta.dataset.themeDarkColorTemp;\n          $meta.content = tempColor || '';\n          setTimeout(() => {\n            $meta.content = color;\n          }, 10);\n        }\n      } else {\n        // Get current color scheme\n        const colorScheme = window.matchMedia('(prefers-color-scheme: dark)')\n          .matches\n          ? 'dark'\n          : 'light';\n        // Get current theme-color\n        $meta = document.querySelector(\n          `meta[name=\"theme-color\"][media*=\"${colorScheme}\"]`,\n        );\n        if ($meta) {\n          const color = $meta.dataset.content;\n          const tempColor = $meta.dataset.contentTemp;\n          $meta.content = tempColor || '';\n          setTimeout(() => {\n            $meta.content = color;\n          }, 10);\n        }\n      }\n    }\n  });\n}\n\n{\n  const theme = store.local.get('theme');\n  // If there's a theme, it's NOT auto\n  if (theme) {\n    // dark | light\n    document.documentElement.classList.add(`is-${theme}`);\n    document\n      .querySelector('meta[name=\"color-scheme\"]')\n      .setAttribute('content', theme || 'dark light');\n\n    // Enable manual theme <meta>\n    const $manualMeta = document.querySelector(\n      'meta[data-theme-setting=\"manual\"]',\n    );\n    if ($manualMeta) {\n      $manualMeta.name = 'theme-color';\n      $manualMeta.content =\n        theme === 'light'\n          ? $manualMeta.dataset.themeLightColor\n          : $manualMeta.dataset.themeDarkColor;\n    }\n    // Disable auto theme <meta>s\n    const $autoMetas = document.querySelectorAll(\n      'meta[data-theme-setting=\"auto\"]',\n    );\n    $autoMetas.forEach((m) => {\n      m.name = '';\n    });\n  }\n  const textSize = store.local.get('textSize');\n  if (textSize) {\n    document.documentElement.style.setProperty('--text-size', `${textSize}px`);\n  }\n}\n\nsubscribe(states, (changes) => {\n  for (const [action, path, value, prevValue] of changes) {\n    // Change #app dataset based on settings.shortcutsViewMode\n    if (path.join('.') === 'settings.shortcutsViewMode') {\n      const $app = document.getElementById('app');\n      if ($app) {\n        $app.dataset.shortcutsViewMode = states.shortcuts?.length ? value : '';\n      }\n    }\n\n    // Add/Remove cloak class to body\n    if (path.join('.') === 'settings.cloakMode') {\n      const $body = document.body;\n      $body.classList.toggle('cloak', value);\n    }\n  }\n});\n\nconst BENCHES = new Map();\nwindow.__BENCH_RESULTS = new Map();\nwindow.__BENCHMARK = {\n  start(name) {\n    if (!import.meta.env.DEV && !import.meta.env.PHANPY_DEV) return;\n    // If already started, ignore\n    if (BENCHES.has(name)) return;\n    const start = performance.now();\n    BENCHES.set(name, start);\n  },\n  end(name) {\n    if (!import.meta.env.DEV && !import.meta.env.PHANPY_DEV) return;\n    const start = BENCHES.get(name);\n    if (start) {\n      const end = performance.now();\n      const duration = end - start;\n      __BENCH_RESULTS.set(name, duration);\n      BENCHES.delete(name);\n    }\n  },\n};\n\nfunction App() {\n  const [isLoggedIn, setIsLoggedIn] = useState(false);\n  const [uiState, setUIState] = useState('loading');\n  __BENCHMARK.start('app-init');\n  __BENCHMARK.start('time-to-following');\n  __BENCHMARK.start('time-to-home');\n  __BENCHMARK.start('time-to-isLoggedIn');\n  useLingui();\n\n  useEffect(() => {\n    const instanceURL = store.local.get('instanceURL');\n    const code = decodeURIComponent(\n      (window.location.search.match(/code=([^&]+)/) || [, ''])[1],\n    );\n\n    if (code) {\n      console.log({ code });\n      // Clear the code from the URL\n      window.history.replaceState(\n        {},\n        document.title,\n        window.location.pathname || '/',\n      );\n\n      const clientID = store.sessionCookie.get('clientID');\n      const clientSecret = store.sessionCookie.get('clientSecret');\n      const vapidKey = store.sessionCookie.get('vapidKey');\n      const verifier = store.sessionCookie.get('codeVerifier');\n\n      (async () => {\n        setUIState('loading');\n        const { access_token: accessToken } = await getAccessToken({\n          instanceURL,\n          client_id: clientID,\n          client_secret: clientSecret,\n          code,\n          code_verifier: verifier || undefined,\n        });\n\n        if (accessToken) {\n          const client = initClient({ instance: instanceURL, accessToken });\n          await Promise.allSettled([\n            initPreferences(client),\n            initInstance(client, instanceURL),\n            initAccount(client, instanceURL, accessToken, vapidKey),\n          ]);\n          initStates();\n          window.__IGNORE_GET_ACCOUNT_ERROR__ = true;\n\n          setIsLoggedIn(true);\n          setUIState('default');\n        } else {\n          setUIState('error');\n        }\n        __BENCHMARK.end('app-init');\n      })();\n    } else {\n      window.__IGNORE_GET_ACCOUNT_ERROR__ = true;\n      const searchAccount = decodeURIComponent(\n        (window.location.search.match(/account=([^&]+)/) || [, ''])[1],\n      );\n      let account;\n      if (searchAccount) {\n        account = getAccount(searchAccount);\n        console.log('searchAccount', searchAccount, account);\n        if (account) {\n          setCurrentAccountID(account.info.id);\n          window.history.replaceState(\n            {},\n            document.title,\n            window.location.pathname || '/',\n          );\n        }\n      }\n      if (!account) {\n        account = getCurrentAccount();\n      }\n      if (account) {\n        setCurrentAccountID(account.info.id);\n        const { client } = api({ account });\n        const { instance } = client;\n        // console.log('masto', masto);\n        initStates();\n        setUIState('loading');\n        (async () => {\n          try {\n            if (hasPreferences() && hasInstance(instance)) {\n              // Non-blocking\n              initPreferences(client);\n              initInstance(client, instance);\n            } else {\n              await Promise.allSettled([\n                initPreferences(client),\n                initInstance(client, instance),\n              ]);\n            }\n          } catch (e) {\n          } finally {\n            setIsLoggedIn(true);\n            setUIState('default');\n            __BENCHMARK.end('app-init');\n          }\n        })();\n      } else {\n        setUIState('default');\n        __BENCHMARK.end('app-init');\n      }\n    }\n\n    // Cleanup\n    store.sessionCookie.del('clientID');\n    store.sessionCookie.del('clientSecret');\n    store.sessionCookie.del('codeVerifier');\n  }, []);\n\n  let location = useLocation();\n  states.currentLocation = location.pathname;\n  // useLayoutEffect(() => {\n  //   states.currentLocation = location.pathname;\n  // }, [location.pathname]);\n\n  useEffect(focusDeck, [location, isLoggedIn]);\n\n  if (/\\/https?:/.test(location.pathname)) {\n    return <HttpRoute />;\n  }\n\n  if (uiState === 'loading') {\n    return <Loader id=\"loader-root\" />;\n  }\n\n  return (\n    <>\n      <PrimaryRoutes isLoggedIn={isLoggedIn} />\n      <SecondaryRoutes isLoggedIn={isLoggedIn} />\n      <Routes>\n        <Route path=\"/:instance?/s/:id\" element={<StatusRoute />} />\n      </Routes>\n      {isLoggedIn && <ComposeButton />}\n      {isLoggedIn && <Shortcuts />}\n      <Modals />\n      {isLoggedIn && <NotificationService />}\n      <BackgroundService isLoggedIn={isLoggedIn} />\n      <SearchCommand onClose={focusDeck} />\n      <KeyboardShortcutsHelp />\n    </>\n  );\n}\n\nfunction Root({ isLoggedIn }) {\n  if (isLoggedIn) {\n    __BENCHMARK.end('time-to-isLoggedIn');\n  }\n  return isLoggedIn ? <Home /> : <Welcome />;\n}\n\nconst PrimaryRoutes = memo(({ isLoggedIn }) => {\n  const location = useLocation();\n  const nonRootLocation = useMemo(() => {\n    const { pathname } = location;\n    return !/^\\/(login|welcome)/i.test(pathname);\n  }, [location]);\n\n  return (\n    <Routes location={nonRootLocation || location}>\n      <Route path=\"/\" element={<Root isLoggedIn={isLoggedIn} />} />\n      <Route path=\"/login\" element={<Login />} />\n      <Route path=\"/welcome\" element={<Welcome />} />\n    </Routes>\n  );\n});\n\nfunction getPrevLocation() {\n  return states.prevLocation || null;\n}\nfunction SecondaryRoutes({ isLoggedIn }) {\n  // const snapStates = useSnapshot(states);\n  const location = useLocation();\n  // const prevLocation = snapStates.prevLocation;\n  const backgroundLocation = useRef(getPrevLocation());\n\n  const isModalPage = useMemo(() => {\n    return (\n      matchPath('/:instance/s/:id', location.pathname) ||\n      matchPath('/s/:id', location.pathname)\n    );\n  }, [location.pathname, matchPath]);\n  if (isModalPage) {\n    if (!backgroundLocation.current)\n      backgroundLocation.current = getPrevLocation();\n  } else {\n    backgroundLocation.current = null;\n  }\n  console.debug({\n    backgroundLocation: backgroundLocation.current,\n    location,\n  });\n\n  return (\n    <Routes location={backgroundLocation.current || location}>\n      {isLoggedIn && (\n        <>\n          <Route path=\"/notifications\" element={<Notifications />} />\n          <Route path=\"/mentions\" element={<Mentions />} />\n          <Route path=\"/following\" element={<Following />} />\n          <Route path=\"/b\" element={<Bookmarks />} />\n          <Route path=\"/f\" element={<Favourites />} />\n          <Route path=\"/l\">\n            <Route index element={<Lists />} />\n            <Route path=\":id\" element={<List />} />\n          </Route>\n          <Route path=\"/fh\" element={<FollowedHashtags />} />\n          <Route path=\"/ft\" element={<Filters />} />\n          <Route path=\"/catchup\" element={<Catchup />} />\n          <Route path=\"/annual_report/:year\" element={<AnnualReport />} />\n        </>\n      )}\n      <Route path=\"/:instance?/t/:hashtag\" element={<Hashtag />} />\n      <Route path=\"/:instance?/a/:id\" element={<AccountStatuses />} />\n      <Route path=\"/:instance?/p\">\n        <Route index element={<Public />} />\n        <Route path=\"l\" element={<Public local />} />\n      </Route>\n      <Route path=\"/:instance?/trending\" element={<Trending />} />\n      <Route path=\"/:instance?/search\" element={<Search />} />\n      {/* <Route path=\"/:anything\" element={<NotFound />} /> */}\n    </Routes>\n  );\n}\n\nexport { App };\n","import './index.css';\nimport './cloak-mode.css';\nimport './polyfills';\n\nimport { i18n } from '@lingui/core';\nimport { I18nProvider } from '@lingui/react';\n// Polyfill needed for Firefox < 122\n// https://bugzilla.mozilla.org/show_bug.cgi?id=1423593\n// import '@formatjs/intl-segmenter/polyfill';\nimport { render } from 'preact';\nimport { HashRouter } from 'react-router-dom';\n\nimport { App } from './app';\nimport { initActivateLang } from './utils/lang';\n\ninitActivateLang();\n\nif (import.meta.env.DEV) {\n  import('preact/debug');\n}\n\nrender(\n  <I18nProvider i18n={i18n}>\n    <HashRouter>\n      <App />\n    </HashRouter>\n  </I18nProvider>,\n  document.getElementById('app'),\n);\n\n// Storage cleanup\nsetTimeout(() => {\n  try {\n    // Clean up iconify localStorage\n    Object.keys(localStorage).forEach((key) => {\n      if (key.startsWith('iconify')) {\n        localStorage.removeItem(key);\n      }\n    });\n    Object.keys(sessionStorage).forEach((key) => {\n      if (key.startsWith('iconify')) {\n        sessionStorage.removeItem(key);\n      }\n    });\n\n    // Clean up old settings key\n    localStorage.removeItem('settings:boostsCarousel');\n  } catch (e) {}\n}, 5000);\n\n// Service worker cache cleanup\nif ('serviceWorker' in navigator && typeof caches !== 'undefined') {\n  const MAX_SW_CACHE_SIZE = 50;\n  const IGNORE_CACHE_KEYS = ['icons'];\n  let clearRanOnce = false;\n  const FAST_INTERVAL = 10_000; // 10 seconds\n  const SLOW_INTERVAL = 60 * 60 * 1000; // 1 hour\n  async function clearCaches() {\n    if (window.__IDLE__) {\n      try {\n        const keys = await caches.keys();\n        for (const key of keys) {\n          if (IGNORE_CACHE_KEYS.includes(key)) continue;\n          const cache = await caches.open(key);\n          const _keys = await cache.keys();\n          if (_keys.length > MAX_SW_CACHE_SIZE) {\n            console.warn('Cleaning cache', key, _keys.length);\n            const deleteKeys = _keys.slice(MAX_SW_CACHE_SIZE);\n            for (const deleteKey of deleteKeys) {\n              await cache.delete(deleteKey);\n            }\n          }\n        }\n        clearRanOnce = true;\n      } catch (e) {} // Silent fail\n    }\n    // Once cleared, clear again at slower interval\n    setTimeout(clearCaches, clearRanOnce ? SLOW_INTERVAL : FAST_INTERVAL);\n  }\n  setTimeout(clearCaches, FAST_INTERVAL);\n}\n\nwindow.__CLOAK__ = () => {\n  document.body.classList.toggle('cloak');\n};\n"],"names":["functionDebounce","debounce","fn","wait","callFirst","timeout","debouncedFn","clear","flush","call","debounceWrapper","context","args","callNow","window","document","event","params","evt","handleTouchStart","handleTouchMove","handleTouchEnd","xDown","yDown","xDiff","yDiff","timeDown","startEl","touchCount","e","swipeThreshold","getNearestAttribute","swipeUnit","swipeTimeout","timeDiff","eventType","changedTouches","eventData","xUp","yUp","el","attributeName","defaultValue","attributeValue","usePageVisibility","deps","savedCallback","useRef","useEffect","current","handleVisibilityChange","hidden","visibilityState","console","STREAMING_TIMEOUT","POLL_INTERVAL","BackgroundService","memo","isLoggedIn","t","_useLingui","visible","setVisible","useState","visibleTimeout","clearTimeout","setTimeout","checkLatestNotification","masto","instance","skipCheckMarkers","states","notificationsLast","notificationsIterator","v1","notifications","list","limit","sinceId","id","value","next","length","notificationsShowNew","lastReadId","markers","fetch","timeline","sub","streamTimeout","pollNotifications","streaming","api","hasStreaming","user","notification","subscribe","log","entry","_a","checkForUpdates","clearInterval","r","info","useInterval","lastCheckDate","useHotkeys","currentCloakMode","Date","diff","_t","settings","ComposeButton","snapStates","useSnapshot","handleButton","composerState","minimized","openOSK","shiftKey","openCompose","showCompose","ignoreEventWhen","querySelector","_jsx","type","onClick","class","publishing","publishingError","children","Icon","icon","size","alt","KeyboardShortcutsHelp","onClose","showKeyboardShortcutsHelp","hasModal","Modal","tabindex","_Trans","keys","0","action","className","1","2","map","parents","coords","siblings","animations","intersections","intervals","options","debounces","enabled","root","scrollX","scrollY","TGT","DEL","NEW","handleMutations","mutations","elements","getElements","animate","handleResizes","entries","updateAllPos","updatePos","observePosition","oldObserver","rect","invocations","buffer","getCoords","offsetWidth","offsetHeight","rootMargin","px","observer","optionsOrPlugin","getOptions","delay","isPlugin","currentAnimation","parent","forEach","lowPriority","poll","callback","resize","supportedBrowser","nodes","mutation","node","target","i","child","isMounted","preExisting","add","remain","remove","raw","str","getScrollOffset","p","x","y","getTransitionSizes","oldCoords","newCoords","widthFrom","heightFrom","widthTo","heightTo","styles","paddingY","paddingX","getTarget","isEnabled","callbacks","getPluginTuple","pluginReturn","config","animation","pluginOrOptions","deltaX","deltaY","start","end","keyframes","cleanUp","style","prev","finalX","finalY","top","left","width","height","deletePosition","adjustScroll","styleReset","scrollDeltaX","scrollDeltaY","scrollBefore","lastHeight","lastWidth","startScroll","smoothScroll","offsetParent","parentStyles","parentCoords","autoAnimate","element","useAutoAnimate","controller","setController","setEnabled","isStandalone","matchMedia","matches","Accounts","accounts","store","local","getJSON","currentAccount","getCurrentAccountID","moreThanOneAccount","_","reload","useReducer","accountsListParent","_jsxs","tabIndex","ref","account","isCurrent","isDefault","Avatar","url","avatarStatic","onDblClick","$select","NameText","test","showAcct","setCurrentAccountID","_Fragment","Menu2","align","menuButton","disabled","location","MenuLink","href","MenuDivider","MenuItem","splice","MenuConfirm","subMenu","confirmLabel","menuItemClassName","Link","to","logo","regionMaps","LangSelector","i18n","useLingui","populatedLocales","useMemo","LOCALES","lang","regionlessCode","replace","native","localeCode2Text","code","locale","fallback","CATALOGS","find","c","nativeName","_common","name","sort","a","b","order","localeCompare","DEFAULT_LANG","onChange","set","common","import","createBackendPushSubscription","subscription","push","create","fetchBackendPushSubscription","updateBackendPushSubscription","update","removeBackendPushSubscription","isPushSupported","navigator","getRegistration","serviceWorker","getSubscription","registration","pushManager","undefined","urlBase64ToUint8Array","base64String","padding","repeat","base64","rawData","atob","outputArray","Uint8Array","charCodeAt","initSubscription","backendSubscription","err","message","sameEndpoint","sameKey","vapidKey","key2","applicationServerKey","vapidKeyStr","applicationServerKeyStr","updateSubscription","data","policy","removeSubscription","DEFAULT_TEXT_SIZE","TEXT_SIZES","PHANPY_WEBSITE","WEBSITE","PHANPY_PRIVACY_POLICY_URL","PRIVACY_POLICY_URL","PHANPY_IMG_ALT_API_URL","IMG_ALT_API_URL","PHANPY_GIPHY_API_KEY","GIPHY_API_KEY","Settings","currentTheme","get","themeFormRef","targetLanguage","contentTranslationTargetLanguage","systemTargetLanguage","getTranslateTargetLanguage","systemTargetLanguageText","currentTextSize","prefs","setPrefs","authenticated","onInput","formData","theme","documentElement","html","classList","$manualMeta","$autoMetas","querySelectorAll","m","toggle","defaultChecked","fontSize","min","max","step","parseInt","setProperty","rel","for","checked","autoRefresh","boostsCarousel","targetLanguages","showCommon","contentTranslationHideLanguages","contentTranslation","composerGIFPicker","mediaAltGenerator","supports","groupedNotificationsAlpha","shortcutSettingsCloudImportExport","cloakMode","PushNotificationsSection","display","flexWrap","gap","lineHeight","src","aspectRatio","verticalAlign","borderRadius","RelativeTime","datetime","readOnly","__BUILD_TIME__","showToast","caches","uiState","setUIState","allowNotifications","setAllowNotifications","setNeedRelogin","pushFormRef","needRelogin","alerts","previousPolicyRef","policyEl","namedItem","isLoading","values","mention","favourite","reblog","follow","follow_request","followRequest","status","key","alertsCount","allowNotifications2","_t2","permission","label","components","alert2","alert","focusDeck","timer","columns","getElementById","focusedColumn","focus","firstVisibleColumn","Array","from","column","getBoundingClientRect","modals","modal","modalFocusElement","pages","page","useLocationChange","useLocation","currentLocationRef","pathname","FETCH_MAX_AGE","MAX_AGE","fetchLists","pmem","lists","title","updatedAt","now","maxAge","getLists","fetchList","getList","theList","getListTitle","addListStore","updateListStore","index","deleteListStore","listID","findIndex","ListAddEdit","editMode","nameFieldRef","repliesPolicyFieldRef","exclusiveFieldRef","repliesPolicy","exclusive","supportsExclusive","onSubmit","preventDefault","FormData","listResult","replies_policy","MUTE_DURATIONS","MUTE_DURATIONS_LABELS","i18nDuration","LIMIT","ACCOUNT_INFO_MAX_AGE","fetchFamiliarFollowers","currentID","familiarFollowers","memFetchFamiliarFollowers","fetchPostingStats","accountID","fetchStatuses","statuses","total","originals","replies","stats","boosts","memFetchPostingStats","fetchAccount","standalone","currentMasto","currentInstance","isString","setInfo","sameCurrentInstance","info2","acct","avatar","bot","createdAt","displayName","emojis","fields","group","lastStatusAt","locked","note","statusesCount","username","memorial","moved","roles","hideCollections","header","headerStatic","headerIsAvatar","isSelf","infoHasEssentials","account2","updated","punycode","accountInstance","setHeaderCornerColors","followersIterator","toUnicode","domain","fetchFollowers","firstLoad","familiarFollowersCache","results","newValue","familiarFollowers2","familiar","followingIterator","LinkOrDiv","accountLink","postingStats","setPostingStats","renderFamiliarFollowers","setFamiliarFollowers","postingStatsUIState","setPostingStatsUIState","hasPostingStats","followers","renderPostingStats","onRelationshipChange","onProfileUpdate","useCallback","newAccount","headerCornerColors","stopPropagation","onError","ctx","canvas","onLoad","pixelDimension","rgbColors","OffscreenCanvas","createElement","g","imageSmoothingEnabled","drawImage","colors","getImageData","dataLength","lightenRGB","color","AccountBlock","avatarSize","handleWithInstance","clipboard","enhanceContent","verifiedAt","__html","EmojiText","text","blankCopy","follower","followersCount","shortenNumber","fetchFollowing","followingCount","excludeRelationshipAttrs","hideTime","_i18n","daysSinceLastPost","FAMILIAR_FOLLOWERS_LIMIT","sameInstance","setRelationshipUIState","relationship","setRelationship","following","showingReblogs","currentInfo","setCurrentInfo","notifying","followedBy","blocking","blockedBy","muting","mutingNotifications","requested","domainBlocking","endorsed","privateNote","acctWithInstance","setIsSelf","q","fetchRelationships","relationships","relationship2","showAddRemoveLists","setShowAddRemoveLists","showPrivateNoteModal","setLists","updateAccount","showTranslatedBio","showEditProfile","setShowPrivateNoteModal","lists2","currentAuthenticated","onMenuChange","setShowTranslatedBio","handle","niceAccountURL","newRelationship","counter","duration","error","setShowEditProfile","relationshipUIState","Loader","loading","TranslatedBioSheet","EditProfileSheet","AddRemoveListsSheet","luminence","alpha","urlObj","host","state","getHTMLText","fieldsText","Math","path","_t4","_t3","listsContainingAccount","setListsContainingAccount","reloadCount","listsContainingAccount2","setShowListAddEditModal","inList","showListAddEditModal","accountIds","result","PrivateNoteSheet","initialNote","_t5","textareaRef","_b","e2","trim","_t6","setAccount","source","fieldsAttributesRef","displayName2","note2","fieldsAttributesFields","field","fieldsAttributes","FieldsAttributesRow","hasValue","setHasValue","AccountHandleInfo","server","encodedAcct","dir","AccountSheet","propInstance","AccountInfo","lookup","skip_webfinger","v2","search","resolve","accountURL","URL","parse","hostname","Drafts","drafts","setDrafts","db","ns","getCurrentAccountNS","ownKeys","filter","startsWith","getMany","getTime","hasDrafts","abrupt","draft","draftStatus","replyTo","updatedAtDate","replyToStatus","MiniDraft","spoilerText","mediaAttachments","hasPoll","hasMedia","firstImageMedia","image","file","objectURL","createObjectURL","hasPollOrMedia","EmbedModal","dangerouslySetInnerHTML","GenericAccounts","postID","isCurrentInstance","setAccounts","showMore","setShowMore","showGenericAccounts","heading","fetchAccounts","staticAccounts","showReactions","relationshipsMap","setRelationshipsMap","loadRelationships","loadAccounts","done","isArray","theAccount","j","_types","newAccounts","reloadGenericAccounts","post","Status","showStats","InView","MediaAltModal","forceTranslate","setForceTranslate","differentLanguage","localeMatch","l","supportsTTS","speak","whiteSpace","textWrap","TranslationBlock","sourceLanguage","classToType","obj","unpack","keyOrder","k","PI","TWOPI","PITHIRD","DEG2RAD","RAD2DEG","multiplyMatrices","A","B","B_cols","product","row","col","labConstants","compand","linear","sign","xyz2rgb","z","MtxAdaptMa","MtxAdaptMaI","MtxXYZ2RGB","RefWhiteRGB","Xn","Yn","Zn","LAB_CONSTANTS","As","Bs","Cs","Ad","Bd","Cd","X1","Y1","Z1","X2","Y2","Z2","oklab2rgb","L","rest","X","Y","Z","OKLab_to_XYZ","b_","OKLab","LMStoXYZ","OKLabtoLMS","LMSnl","gammaAdjustSRGB","companded","rgb2xyz","MtxRGB2XYZ","rgb2oklab","xyz","XYZ_to_OKLab","XYZ","XYZtoLMS","LMStoOKLab","LMS","sin","cos","lch2lab","h","oklch2rgb","sqrt","atan2","round","lab2lch","rgb2oklch","MediaModal","statusID","carouselRef","currentIndex","setCurrentIndex","carouselFocusItem","useLayoutEffect","scrollIntoView","prevStatusID","scrollLeft","clientWidth","differentStatusID","scrollTo","isRTL","behavior","showControls","setShowControls","handleSwipe","addEventListener","removeEventListener","handleScroll","abs","passive","mediaOkColors","media","blurhash","averageColor","getBlurHashAverageColor","mediaAccentColors","okColor","light","dark","default","mediaAccentGradients","range","join","lightGradient","darkGradient","toastRef","hideToast","currentColor","$meta","metaColor","mediaColor","colorScheme","content","accentColor","description","showMediaAlt","CATEGORIES","CATEGORIES_INFO","spam","legal","violation","stampLabel","other","excludeStamp","ReportModal","split","rules","currentDomain","getCurrentInstance","selectedCategory","setSelectedCategory","showRules","setShowRules","rulesRef","hasRules","setHasRules","previewMode","useAvatarStatic","showActivity","Object","fromEntries","category","comment","forward","ruleIds","reports","accountId","statusIds","Fragment","rule","required","maxlength","rows","LZString","f","keyStrBase64","keyStrUriSafe","baseReverseDic","getBaseValue","alphabet","character","input","res","compressed","uncompressed","buf","TotalLen","current_value","bitsPerChar","getCharFromInt","context_dictionary","context_dictionaryToCreate","context_c","context_wc","context_w","context_enlargeIn","context_dictSize","context_numBits","context_data","context_data_val","context_data_position","ii","resetValue","getNextValue","dictionary","enlargeIn","dictSize","numBits","w","bits","resb","maxpower","power","module","floatingButtonUrl","multiColumnUrl$1","tabMenuBarUrl","MAX_FETCH","fetchFollowedTags","iterator","followedTags","tags","fetchCount","getFollowedTags","fauxDiv","extractTagsFromStatus","hashtagLinks","AsyncText","setText","Promise","then","SHORTCUTS_LIMIT","TYPES","TYPE_TEXT","public","bookmarks","favourites","hashtag","trending","mentions","TYPE_PARAMS","notRequired","placeholder","pattern","fetchAccountTitle","SHORTCUTS_META","excludeViewMode","subtitle","query","encodeURIComponent","ShortcutsSettings","shortcuts","showForm","setShowForm","showImportExport","setShowImportExport","shortcutsListParent","opacity","textTransform","imgURL","multiColumnUrl","shortcutsViewMode","Boolean","shortcut","excludedViewMode","includes","shortcutsArr","temp","shortcutIndex","justifyContent","alignItems","currentTarget","ShortcutForm","mode","ImportExport","FORM_NOTES","currentType","setCurrentType","setFollowedHashtags","form","formRef","switch","followedHashtags","autocorrect","autocapitalize","tag","shortcutsStr","compressToEncodedURIComponent","importShortcutStr","setImportShortcutStr","parsedImportShortcutStr","setImportUIState","parsed","JSON","decompressFromEncodedURIComponent","hasCurrentSettings","shortcutsImportFieldRef","v","dt","s","importUIState","menuFooter","nonUniqueShortcuts","exceededLimit","newShortcuts","writeText","share","settingsJSON","newNote","changes","prevValue","Modals","navigate","useNavigate","preload","ComposeSuspense","__COMPOSE__","editStatus","newStatus","reloadStatusPage","reply","edit","toast","prevLocation","showSettings","showAccounts","showAccount","destination","showDrafts","showMediaModal","contains","showShortcutsSettings","showEmbedModal","showReportModal","FollowRequestButtons","requestState","setRequestState","hasRelationship","followRequests","authorize","Error","NOTIFICATION_ICONS","severed_relationships","moderation_warning","emoji_reaction","annual_report","emojiText","emoji","emoji_url","staticUrl","emojiObject","CustomEmoji","contentText","count","postsCount","postType","Subject","clickable","3","poll-self","poll-voted","favourite+reblog","admin.sign_up","admin.report","targetAccount","year","SEVERED_RELATIONSHIPS_TEXT","account_suspension","targetName","domain_block","user_domain_block","MODERATION_WARNING_TEXT","none","disable","mark_statuses_as_sensitive","delete_statuses","sensitive","silence","suspend","AVATARS_LIMIT","Notification","isStatic","disableContextMenu","report","annualReport","_ids","_accounts","_statuses","_groupKeys","sampleAccounts","notificationsCount","groupKey","actualStatus","actualStatusID","isVoted","voted","isReplyToOthers","inReplyToAccountId","favsCount","reblogsCount","props","handleOpenGenericAccounts","showAvatar","emojiURL","shortcode","formattedCreatedAt","toLocaleString","genericAccountsHeading","statusKey","diffCount","expandAccounts","_g","isOwnPost","isFiltered","filtered","type2","gKey","keyAccounts","keyAccount","_accounts2","status2","TruncatedLink","onContextMenu","dispatchEvent","clientX","clientY","useTruncated","oldProps","newProps","accessToken","NotificationService","routeNotification","showNotificationSheet","notificationAccount","hasAccount","hash","warn","id2","setShowNotificationSheet","tagName","instanceURL","SearchForm","forwardRef","searchParams","setSearchParams","useSearchParams","searchMenuOpen","setSearchMenuOpen","setQuery","searchFieldRef","useImperativeHandle","setValue","select","blur","autocomplete","spellCheck","onSearch","onFocus","onBlur","onKeyDown","focusItem","nextItem","nextElementSibling","parentElement","firstItem","prevItem","previousElementSibling","lastItem","click","queryType","SearchCommand","showSearch","setShowSearch","searchFormRef","isSearchPage","closeSearch","enableOnFormTags","Shortcuts","isMultiColumnMode","shortcutsColumnsMode","menuRef","hasLists","formattedShortcuts","pin","handler","closeMenu","updatesButton","instanceRef","overflow","viewScroll","menuClassName","position","SubMenu2","groupBoosts","newValues","boostStash","serialBoosts","item","boostStashID","items","half","floor","slice","dedupeBoosts","boostedStatusIDs","filteredItems","boosterID","groupContext","contexts","contextIndex","repliedItem","self","inReplyToId","firstItemAccountID","newItems","appliedContextIndices","inReplyToIds","contextItems","aDate","bDate","every","it","sKey","statusReply","queueMicrotask","fallbackFetch","fetchStatus","saveStatus","skipThreading","ids","replyToStatuses","assignFollowedTags","statusFollowedTags","statusWithFollowedTags","extractedTags","itemFollowedTags","acc","useScroll","scrollableRef","distanceFromStart","distanceFromEnd","scrollThresholdStart","scrollThresholdEnd","direction","distanceFromStartPx","_distanceFromStartPx","distanceFromEndPx","_distanceFromEndPx","scrollDirection","setScrollDirection","reachStart","setReachStart","reachEnd","setReachEnd","nearReachStart","setNearReachStart","nearReachEnd","setNearReachEnd","isVertical","scrollableElement","previousScrollStart","scrollTop","onScroll","scrollHeight","scrollWidth","clientHeight","scrollStart","scrollDimension","clientDimension","scrollDistance","init","Event","useScrollFn","useThrottledCallback","MediaPost","onMediaClick","accountEmojis","repliesCount","reblogged","favourited","favouritesCount","bookmarked","muted","visibility","language","editedAt","card","uri","_deleted","_pinned","debugHover","filterContext","useContext","FilterContext","filterInfo","hasSpoiler","readingExpandMedia","mediaKey","toLowerCase","filterTitleStr","Media","showSpoilerMedia","NavMenu","showFollowing","bindLongPress","useLongPress","threshold","detect","cancelOnMovement","buttonRef","menuState","setMenuState","boundingBoxPadding","safeBoundingBoxPadding","mutesIterator","fetchMutes","mutes","blocksIterator","fetchBlocks","blocks","buttonClickTS","squircle","ControlledMenu","anchorRef","containerProps","zIndex","portal","body","unmountOnClose","appVersion","commitHash","__COMMIT_HASH__","confirm","ListMenu","supportsLists","scrollIntoViewOptions","block","inline","Timeline","titleComponent","emptyText","errorText","useItemID","fetchItems","checkForUpdatesInterval","headerStart","headerEnd","timelineStart","refresh","view","showFollowedTags","showReplyParent","clearWhenRefresh","setItems","showNew","setShowNew","debug","isMediaFirstInstance","mediaFirst","allowGrouping","loadItemsTS","firstLoad2","loadItems","useDebouncedCallback","ts","otherPosts","pinnedPosts","items2","itemsSelector","jRef","activeItem","activeItemRect","closest","allItems","activeItemIndex","indexOf","itemRect","topmostItem","kRef","findLast","oRef","handleLoadNewPosts","showNewPostsIndicator","dotRef","headerRef","nearReachStart2","hiddenUI","prevView","disableIdleCheck","loadOrCheckUpdates","inBackground","noPointers","__IDLE__","visible2","hasUpdate","lastHiddenTime","TimelineItem","skeleton","inView","fItems","filteredItemsIDs","aFiltered","bFiltered","isCarousel","unfiltered","filteredItems2","has","StatusCarousel","_pinned2","_grouped","item2","statusID3","_pinned3","actualStatusID3","reblog3","statusID2","actualStatusID2","reblog2","url2","showCompact","_differentAuthor","isSpoiler","manyItems","isMiddle","isStart","isEnd","TimelineStatusCompact","itemKey","enableCommentHint","startButtonRef","oldID","toString","setRender","render","endButtonRef","statusPeekText","statusPeek","statusThreadNumber","titlesStr","MIN_YEAR","MIN_YEAR_MONTH","supportsInputMonth","setAttribute","_isSearchEnabled","isSearchEnabled","AccountStatuses","useParams","month","excludeReplies","excludeBoosts","tagged","accountStatusesIterator","allSearchParams","searchOffsetRef","searchEnabled","setSearchEnabled","isValidMonth","_year","_month","monthIndex","after","afterStr","before","beforeStr","searchResults","value2","offset","pinnedStatuses","pinnedStatusesIds","postId","setFeaturedTags","acctDisplay","accountDisplay","monthYear","fetchAccountPromiseRef","useTitle","fetchPromise","cachedAccount","featuredTags","filterBarRef","TimelineStart","month2","date","validity","MonthPicker","active","allowSwitch","offsetLeft","fetchAccountStatuses","masto2","monthFieldRef","yearFieldRef","checkValidity","minYear","minMonth","maxYear","maxMonth","AnnualReport","setResults","annualReports","report2","datePlaceholder","Bookmarks","bookmarksIterator","fetchBookmarks","catchupUrl","FILTER_CONTEXT","RANGES","FILTER_KEYS","original","groups","FILTER_SORTS","FILTER_GROUPS","DTF","mem","Intl","DateTimeFormat","day","hour","minute","Catchup","dtf","showTopLinks","setShowTopLinks","supportsPixelfed","fetchHome","maxCreatedAt","maxCreatedAtDate","allResults","mainloop","homeIterator","nextParams","createdAtDate","selfPost","addedResults","catchupRangeRef","catchupLastRef","handleCatchupClick","catchupID","catchup","posts","setPosts","reloadCatchups","setLastCatchupEndAt","prevCatchups","setPrevCatchups","lastCatchupEndAt","catchups","ownCatchups","trimmedCatchups","lastCatchups","restCatchups","endAt","startAt","reloadCatchupsCount","_followedTags","_e","thePost","__FILTER","links","sharers","links2","link","topLinks","shared","linksLoop","likes","filteredPosts","authors","authorCounts","selectedFilterCategory","filteredPosts2","setSelectedAuthor","sortBy","authorsHash","setSortOrder","authorCountsMap","postFilterMatches","boostedPosts","__BOOSTERS","selectedAuthor","filteredPostsMap","authorID","authorCountsList","sortedFilteredPosts","aAccountID","authorIndices","bAccountID","aIndex","bIndex","postDensity","bDensity","aDensity","sortOrder","groupBy","prevGroup","authorsListParent","autoAnimated","isFiltered2","postsBar","postsBarType","posts2","postsBins","binByTime","lastCatchupRange","sortOrderIndex","authorElement","scrollableRect","authorRect","right","showHelp","setShowHelp","hlRef","_2","escRef","handleArrowKeys","ignoreModifiers","activeElement","isRadio","isArrowKeys","setRange","niceDateTime","format","pc","st","yes","del","setSelectedFilterCategory","setSortBy","formatRange","setGroupBy","transform","imageDescription","publishedAt","labAverageColor","filterCounts","author","paddingInline","showSeparator","IntersectionPostLineItem","isFollowedTags","PostLine","isReplyTo","show","setShow","IntersectionObserver","unobserve","MEDIA_DENSITY","CARD_DENSITY","pollContent","cur","htmlContentLength","PostPeek","density","_thread","readingExpandSpoilers","showMedia","showPostContent","isThread","emojifyText","o","multiple","remoteMediaURL","_f","_h","_j","_i","mediaURL","MEDIA_SIZE","previewUrl","gifv","video","audio","PostStats","numBins","dates","minDate","normalized","binIndex","bins","Favourites","favouritesIterator","fetchFavourites","FILTER_CONTEXT_UNIMPLEMENTED","FILTER_CONTEXT_LABELS","home","thread","EXPIRY_DURATIONS","EXPIRY_DURATIONS_LABELS","Filters","showFiltersAddEditModal","setShowFiltersAddEditModal","filters","setFilters","keywords","expiresAt","keyword","ExpiryStatus","_id","incID","FiltersAddEdit","filterAction","hasExpiry","expiresAtDate","editKeywords","setEditKeywords","keywordsRef","setRemovedKeyword_IDs","filteredEditKeywords","setRemovedKeywordIDs","removedKeyword_IDs","title2","keywordIDs","getAll","keywordKeywords","keywordWholeWords","wholeWord","removedKeywordIDs","keywordsAttributes","context2","expiresIn","filterResult","filterAction2","_id2","showNeverExpires","expired","rerender","FollowedHashtags","Following","latestItem","__BENCHMARK","latestItemChanged","clearFollowedTagsState","opts","payload","TAGS_LIMIT_PER_MODE","TOTAL_TAGS_LIMIT","Hashtags","mediaView","columnMode","hashtags","linkParams","hashtagTitle","maxID","fetchHashtags","timelines","any","maxId","onlyMedia","since_id","valueContainsLatestItem","followUIState","setFollowUIState","reachLimit","featuredUIState","setFeaturedUIState","isFeaturedTag","featuredTags2","setIsFeaturedTag","finally","featuredTagID","catch","MenuHeader","delete","FocusableItem","newHashtag","MenuGroup","exists","newInstance","List","listIterator","setList","showManageMembersModal","setShowManageMembersModal","list2","setDownOverflow","ListManageMembers","MEMBERS_LIMIT","members","setMembers","membersIterator","fetchMembers","member","as","RemoveAddButton","removed","setRemoved","notificationTypeKeys","GROUP_TYPES","groupable","fixNotifications","massageNotifications2","notificationGroups","sampleAccountIds","statusId","groupNotifications2","groupNotifications","newGroupNotifications","gn","latestPageNotificationAt","mostRecentNotificationId","newGroupNotifications1","notificationsMap","virtualType","mappedNotification","ma","mappedAccount","newGroupNotifications2","notificationsMap2","hasOneAccount","toLocaleDateString","n","cleanNotifications","cleanNotifications2","emptySearchParams","URLSearchParams","Mentions","stateType","setStateType","mentionsIterator","fetchMentions","types","conversationsIterator","latestConversationItem","lastStatus","fetchConversations","NOTIFICATIONS_LIMIT","NOTIFICATIONS_GROUPED_LIMIT","memSupportsGroupedNotifications","mastoFetchNotifications","getGroupedNotifications","NOTIFICATIONS_POLICIES","NOTIFICATIONS_POLICIES_TEXT","forNotFollowing","forNotFollowers","forNewAccounts","forPrivateMentions","forLimitedAccounts","Notifications","notificationID","notificationAccessToken","onlyMentions","setOnlyMentions","setFollowRequests","announcements","setAnnouncements","excludeTypes","allNotifications","groupedNotifications","notificationsLastFetchTime","fetchFollowRequests","loadFollowRequests","requests","fetchAnnouncements","supportsFilteredNotifications","showNotificationsSettings","setNotificationsPolicy","fetchNotificationsPolicy","loadNotificationsPolicy","notificationsRequests","setNotificationsRequests","fetchNotificationsRequest","loadNotifications","fetchNotificationsPromise","fetchNotifications","loadUpdates","unsub","subscribeKey","yesterdayDate","todayDate","currentDay","showTodayEmpty","announcementsListRef","setAnnualReportNotification","annualReportNotification2","annualReportYear","getFullYear","statusLink","today","todaySubHeading","forceOpts","setShowNotificationsSettings","announcement","notificationsPolicy","open","onToggle","request","pendingRequestsCount","NotificationRequestModalButton","NotificationRequestButtons","annualReportNotification","notificationDay","differentDay","toDateString","subHeading","newPolicy","AnnouncementBlock","contact","contactAccount","startsAt","endsAt","published","allDay","reactions","publishedAtDate","read","publishedDateText","updatedAtText","reaction","me","fetchNotficationsByAccount","showModal","setShowModal","notifs","setNotifications","hasRequestState","Public","isLocal","publicIterator","fetchPublic","remote","prompt","SHORT_LIMIT","Search","offsetRef","statusResults","setStatusResults","accountResults","setAccountResults","hashtagResults","setHashtagResults","typeResults","setTypeResultsFunc","loadResults","_c","_d","filterBarParent","history","reduce","TREND_CACHE_TIME","fetchLinks","trends","fetchTrendsStatuses","pixelfed","discover","fetchLinkList","Trending","setHashtags","setLinks","trendIterator","fetchTrends","currentLinkMentionsLoading","setCurrentLinkMentionsLoading","currentLinkMentionsIterator","currentLink","setCurrentLink","supportsTrendingLinkPosts","currentLinkRef","hasCurrentLink","fetchLinkMentions","prevCurrentLink","authorUrl","authorName","providerName","providerUrl","isShortTitle","hasAuthor","flexShrink","textAlign","Columns","Hashtag","Component","$column","currentFocusedColumn","prevColKey","nextColKey","Home","NotificationsLink","notificationLinkRef","NotificationsMenu","NOTIFICATIONS_DISPLAY_LIMIT","hasFollowRequests","setHasFollowRequests","statusPostRegexes","getInstanceStatusObject","regex","match","getInstanceStatusURL","HttpRoute","statusObject","statusURL","Lists","instancesListURL","dec2hex","dec","verifier","array","Uint32Array","crypto","getRandomValues","sha256","plain","TextEncoder","encode","subtle","digest","base64urlencode","bytes","len","byteLength","String","fromCharCode","btoa","generateCodeChallenge","hashed","supportsPKCE","ok","json","code_challenge_methods_supported","__generateCodeChallenge","DEV","PHANPY_CLIENT_NAME","CLIENT_NAME","SCOPES","sameSite","currentLocation","origin","REDIRECT_URI","registerApplication","registrationParams","client_name","redirect_uris","scopes","website","method","headers","getPKCEAuthorizationURL","registrationJSON","client_id","codeChallenge","code_challenge_method","code_challenge","authorizationParams","scope","authorizationURL","client_secret","code_verifier","redirect_uri","append","PHANPY_DEFAULT_INSTANCE","DEFAULT_INSTANCE","Login","instanceURLRef","cachedInstanceURL","submit","instanceText","setInstanceText","instancesList","setInstancesList","searcher","Fuse","submitInstance","xmlDoc","parseFromString","template","vapid_key","authPKCE","sessionCookie","getAuthorizationURL","cleanInstanceText","instanceTextLooksLikeDomain","instancesSuggestions","instance2","selectedInstanceText","SUBCOMMENTS_OPEN_ALL_LIMIT","MAX_WEIGHT","cachedRepliesToggle","cachedStatusesMap","scrollPositions","resetScrollPosition","STATUSES_SELECTOR","STATUS_URL_REGEX","StatusPage","mediaParam","mediaOnlyParam","mediaIndex","mediaStatusID","mediaStatus","getStatus","showMediaOnly","heroStatus","setHeroStatus","closeLink","matchStatusPath","matchPath","handleMediaClose","$carousel","$deckContainers","$deckContainer","StatusParent","linkable","restProps","createdAtSort","StatusThread","navigation","translate","setStatuses","heroStatusRef","totalDescendants","scrollOffsets","lastInitContextTS","reloadHero","heroTimer","cachedStatuses","reallyCachedStatuses","heroFetch","pRetry","contextFetch","hasStatus","heroStatus2","_replies","level","nextLevel","descendantLevelsCount","expandReplies","_r","weight","descendants","ancestors2","ancestors","missingStatuses","ancestorsIsThread","nestedDescendants","__replies","heroAccountID","ancestor","threadifyStatus","offsetTop","heroLimit","setLimit","showRefresh","setShowRefresh","allStatuses","scrollPosition","initContext","interval","newScrollOffsets","contextURL","newScrollTop","statusWeightCache","heroContentText","apiCache","heroDisplayName","postInstance","hasDescendants","div","innerHTML","activeStatusRect","activeStatus","postSameInstance","nextStatus","allStatusLinks","activeStatusIndex","some","heroPointer","topmostStatusLink","heroInView","prevStatus","statusLinkRect","details","initialPageState","handleMediaClick","handleStatusLinkClick","descendant","isHero","requestAnimationFrame","setHeroInView","setReachTopPost","isLinkable","SubComments","enableTranslate","onStatusLinkClick","showActionsBar","prevLocationIsStatusPage","prevEntry","hasParentThread","openAll","getIDs","statusesList","renderStatus","spoilerButton","viewMode","moreStatusesKeys","onAnimationEnd","back","reachTopPost","arr","setViewMode","button","full","buttons","accWeight","parentLink","diveDeep","replies2","replies3","totalComments","sameCount","totalWeight","calcStatusWeight","openBefore","detailsRef","renderReplies","Container","isDetails","shortReply","open2","dataset","setRenderReplies","MEDIA_VIRTUAL_LENGTH","CARD_VIRTUAL_LENGTH","cachedWeight","mediaLength","pollLength","POLL_VIRTUAL_LENGTH","cardLength","StatusRoute","boostsCarouselUrl","groupedNotificationsUrl","multiHashtagTimelineUrl","nestedCommentsThreadUrl","logoText","PHANPY_DEFAULT_INSTANCE_REGISTRATION_URL","DEFAULT_INSTANCE_REGISTRATION_URL","appSite","Welcome","marginBlockEnd","nativeAlert","__nativeAlert","Toastify","gravity","__STATES__","__STATES_STATS__","counts","unmountedPosts","setInterval","unfurledLinks","postInNotifications","$post","unfurled","keysCount","ICONS","nonIdleEvents","setIdle","debouncedSetIdle","onNonIdle","isIOS","tempColor","themeDarkColor","textSize","$app","BENCHES","setIsLoggedIn","decodeURIComponent","clientSecret","clientID","initStates","searchAccount","getAccount","client","hasPreferences","hasInstance","initPreferences","initInstance","PrimaryRoutes","Routes","Route","Root","nonRootLocation","getPrevLocation","SecondaryRoutes","backgroundLocation","isModalPage","initActivateLang","I18nProvider","HashRouter","App","localStorage","removeItem","sessionStorage","IGNORE_CACHE_KEYS","clearRanOnce","FAST_INTERVAL","SLOW_INTERVAL","clearCaches","cache","_keys","MAX_SW_CACHE_SIZE","deleteKeys"],"mappings":"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","x_google_ignoreList":[0,1,6,7,23,24,25,26,27,28,29,30,31,32,33,34,35,36,39]}