@lordbex/thelounge 4.5.0-blowfish-pre → 4.5.1-blowfish
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/public/js/bundle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"js/bundle.js","mappings":"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","sources":["webpack://@lordbex/thelounge/webpack/runtime/chunk loaded","webpack://@lordbex/thelounge/./client/js/settings.ts","webpack://@lordbex/thelounge/./client/js/store-settings.ts","webpack://@lordbex/thelounge/./client/js/store.ts","webpack://@lordbex/thelounge/./client/js/socket.ts","webpack://@lordbex/thelounge/./client/components/MessageTypes/mode.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/mode.vue?86d9","webpack://@lordbex/thelounge/./client/components/MessageTypes/quit.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/quit.vue?6cc8","webpack://@lordbex/thelounge/./client/components/MessageTypes/away.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/away.vue?c451","webpack://@lordbex/thelounge/./client/components/MessageTypes/ sync nonrecursive \\.vue$","webpack://@lordbex/thelounge/./client/components/MessageTypes/back.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/back.vue?a43b","webpack://@lordbex/thelounge/./shared/types/chan.ts","webpack://@lordbex/thelounge/./client/components/MessageTypes/mass_event.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/mass_event.vue?ad07","webpack://@lordbex/thelounge/./client/components/MessageTypes/error.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/error.vue?3d38","webpack://@lordbex/thelounge/./client/components/MessageTypes/chghost.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/chghost.vue?ab01","webpack://@lordbex/thelounge/./client/js/eventbus.ts","webpack://@lordbex/thelounge/./client/components/MessageTypes/whois.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/whois.vue?a6be","webpack://@lordbex/thelounge/./client/components/MessageTypes/monospace_block.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/monospace_block.vue?5357","webpack://@lordbex/thelounge/./client/js/helpers/friendlysize.ts","webpack://@lordbex/thelounge/./client/components/MessageTypes/invite.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/invite.vue?0d58","webpack://@lordbex/thelounge/./client/js/helpers/ircmessageparser/parseStyle.ts","webpack://@lordbex/thelounge/./client/js/helpers/ircmessageparser/findChannels.ts","webpack://@lordbex/thelounge/./shared/linkify.ts","webpack://@lordbex/thelounge/./client/js/helpers/ircmessageparser/findEmoji.ts","webpack://@lordbex/thelounge/./client/js/helpers/ircmessageparser/findNames.ts","webpack://@lordbex/thelounge/./client/js/helpers/ircmessageparser/anyIntersection.ts","webpack://@lordbex/thelounge/./client/js/helpers/ircmessageparser/merge.ts","webpack://@lordbex/thelounge/./client/components/LinkPreviewToggle.vue","webpack://@lordbex/thelounge/./client/components/LinkPreviewToggle.vue?bfed","webpack://@lordbex/thelounge/./client/components/LinkPreviewFileSize.vue","webpack://@lordbex/thelounge/./client/components/LinkPreviewFileSize.vue?6888","webpack://@lordbex/thelounge/./client/components/InlineChannel.vue","webpack://@lordbex/thelounge/./client/components/InlineChannel.vue?b1e5","webpack://@lordbex/thelounge/./client/js/helpers/parse.ts","webpack://@lordbex/thelounge/./client/js/helpers/ircmessageparser/fill.ts","webpack://@lordbex/thelounge/./client/components/ParsedMessage.vue?11f7","webpack://@lordbex/thelounge/./client/components/ParsedMessage.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/topic.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/topic.vue?2f75","webpack://@lordbex/thelounge/./client/components/MessageTypes/part.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/part.vue?e2a6","webpack://@lordbex/thelounge/./client/components/MessageTypes/mode_user.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/mode_user.vue?70f4","webpack://@lordbex/thelounge/./client/components/MessageTypes/ctcp.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/ctcp.vue?cacf","webpack://@lordbex/thelounge/./client/components/Username.vue","webpack://@lordbex/thelounge/./client/js/helpers/colorClass.ts","webpack://@lordbex/thelounge/./client/components/Username.vue?2f83","webpack://@lordbex/thelounge/./client/components/MessageTypes/topic_set_by.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/topic_set_by.vue?2f65","webpack://@lordbex/thelounge/./client/components/MessageTypes/mode_channel.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/mode_channel.vue?8348","webpack://@lordbex/thelounge/./client/js/helpers/localetime.ts","webpack://@lordbex/thelounge/./client/js/constants.ts","webpack://@lordbex/thelounge/./client/js/helpers/isIgnoredKeybind.ts","webpack://@lordbex/thelounge/./client/components/Sidebar.vue","webpack://@lordbex/thelounge/./client/components/NetworkList.vue","webpack://@lordbex/thelounge/./client/components/Draggable.vue","webpack://@lordbex/thelounge/./client/components/Draggable.vue?a413","webpack://@lordbex/thelounge/./client/components/NetworkLobby.vue","webpack://@lordbex/thelounge/./client/js/helpers/collapseNetwork.ts","webpack://@lordbex/thelounge/./client/js/helpers/roundBadgeNumber.ts","webpack://@lordbex/thelounge/./client/js/helpers/isChannelCollapsed.ts","webpack://@lordbex/thelounge/./client/components/Windows/SignIn.vue","webpack://@lordbex/thelounge/./client/components/RevealPassword.vue","webpack://@lordbex/thelounge/./client/components/RevealPassword.vue?c069","webpack://@lordbex/thelounge/./client/components/Windows/SignIn.vue?15cf","webpack://@lordbex/thelounge/./client/components/NetworkForm.vue","webpack://@lordbex/thelounge/./client/components/SidebarToggle.vue","webpack://@lordbex/thelounge/./client/components/SidebarToggle.vue?5dae","webpack://@lordbex/thelounge/./client/components/NetworkForm.vue?97fe","webpack://@lordbex/thelounge/./client/components/Windows/Connect.vue","webpack://@lordbex/thelounge/./client/components/Windows/Connect.vue?3910","webpack://@lordbex/thelounge/./client/components/Windows/Settings.vue","webpack://@lordbex/thelounge/./client/components/Settings/Navigation.vue","webpack://@lordbex/thelounge/./client/components/Settings/SettingTabItem.vue","webpack://@lordbex/thelounge/./client/components/Settings/SettingTabItem.vue?8598","webpack://@lordbex/thelounge/./client/components/Settings/Navigation.vue?538b","webpack://@lordbex/thelounge/./client/components/Windows/Settings.vue?b26a","webpack://@lordbex/thelounge/./client/components/Windows/Help.vue","webpack://@lordbex/thelounge/./client/components/VersionChecker.vue","webpack://@lordbex/thelounge/./client/components/VersionChecker.vue?f024","webpack://@lordbex/thelounge/./client/components/Windows/Help.vue?3de4","webpack://@lordbex/thelounge/./client/components/Windows/Changelog.vue","webpack://@lordbex/thelounge/./client/components/Windows/Changelog.vue?eb05","webpack://@lordbex/thelounge/./client/components/Windows/NetworkEdit.vue","webpack://@lordbex/thelounge/./client/components/Windows/NetworkEdit.vue?3546","webpack://@lordbex/thelounge/./client/components/Windows/SearchResults.vue","webpack://@lordbex/thelounge/./client/components/Message.vue","webpack://@lordbex/thelounge/./client/components/LinkPreview.vue","webpack://@lordbex/thelounge/./client/components/LinkPreview.vue?77b7","webpack://@lordbex/thelounge/./client/components/MessageTypes/index.ts","webpack://@lordbex/thelounge/./shared/types/msg.ts","webpack://@lordbex/thelounge/./client/js/helpers/shoutbox-bridge/matchers.ts","webpack://@lordbex/thelounge/./client/js/helpers/shoutbox-bridge/parser.ts","webpack://@lordbex/thelounge/./client/components/Message.vue?dd80","webpack://@lordbex/thelounge/./client/components/MessageSearchForm.vue","webpack://@lordbex/thelounge/./client/components/MessageSearchForm.vue?6f16","webpack://@lordbex/thelounge/./client/components/DateMarker.vue","webpack://@lordbex/thelounge/./client/components/DateMarker.vue?205b","webpack://@lordbex/thelounge/./client/components/Windows/SearchResults.vue?abb7","webpack://@lordbex/thelounge/./client/components/Chat.vue","webpack://@lordbex/thelounge/./client/components/MessageList.vue","webpack://@lordbex/thelounge/./shared/irc.ts","webpack://@lordbex/thelounge/./client/js/clipboard.ts","webpack://@lordbex/thelounge/./client/components/MessageCondensed.vue","webpack://@lordbex/thelounge/./client/components/MessageCondensed.vue?0c2b","webpack://@lordbex/thelounge/./client/components/MessageList.vue?f60d","webpack://@lordbex/thelounge/./client/components/MessageList_Basic.vue","webpack://@lordbex/thelounge/./client/components/MessageList_Basic.vue?59cd","webpack://@lordbex/thelounge/./client/components/ChatInput.vue","webpack://@lordbex/thelounge/./client/js/autocompletion.ts","webpack://@lordbex/thelounge/./client/js/commands/index.ts","webpack://@lordbex/thelounge/./client/js/commands/collapse.ts","webpack://@lordbex/thelounge/./client/js/commands/expand.ts","webpack://@lordbex/thelounge/./client/js/commands/join.ts","webpack://@lordbex/thelounge/./client/js/commands/search.ts","webpack://@lordbex/thelounge/./client/js/upload.ts","webpack://@lordbex/thelounge/./client/components/ChatInput.vue?83df","webpack://@lordbex/thelounge/./client/components/ChatUserList.vue","webpack://@lordbex/thelounge/./client/components/ChatUserList.vue?ef74","webpack://@lordbex/thelounge/./client/components/Special/ListBans.vue","webpack://@lordbex/thelounge/./client/components/Special/ListBans.vue?e125","webpack://@lordbex/thelounge/./client/components/Special/ListInvites.vue","webpack://@lordbex/thelounge/./client/components/Special/ListInvites.vue?3ace","webpack://@lordbex/thelounge/./client/components/Special/ListChannels.vue","webpack://@lordbex/thelounge/./client/components/Special/ListChannels.vue?727e","webpack://@lordbex/thelounge/./client/components/Special/ListIgnored.vue","webpack://@lordbex/thelounge/./client/components/Special/ListIgnored.vue?78d6","webpack://@lordbex/thelounge/./client/components/Chat.vue?9f2a","webpack://@lordbex/thelounge/./client/components/RoutedChat.vue","webpack://@lordbex/thelounge/./client/components/RoutedChat.vue?f310","webpack://@lordbex/thelounge/./client/components/Settings/Appearance.vue","webpack://@lordbex/thelounge/./client/components/Settings/Appearance.vue?aba1","webpack://@lordbex/thelounge/./client/components/Settings/General.vue","webpack://@lordbex/thelounge/./client/components/Settings/General.vue?e603","webpack://@lordbex/thelounge/./client/components/Settings/Account.vue","webpack://@lordbex/thelounge/./client/components/Session.vue","webpack://@lordbex/thelounge/./client/js/location.ts","webpack://@lordbex/thelounge/./client/js/auth.ts","webpack://@lordbex/thelounge/./client/components/Session.vue?1e0d","webpack://@lordbex/thelounge/./client/components/Settings/Account.vue?8037","webpack://@lordbex/thelounge/./client/components/Settings/Notifications.vue","webpack://@lordbex/thelounge/./client/js/webpush.ts","webpack://@lordbex/thelounge/./client/components/Settings/Notifications.vue?6626","webpack://@lordbex/thelounge/./client/js/router.ts","webpack://@lordbex/thelounge/./client/components/ChannelWrapper.vue","webpack://@lordbex/thelounge/./client/components/ChannelWrapper.vue?8bb7","webpack://@lordbex/thelounge/./client/components/NetworkLobby.vue?7d17","webpack://@lordbex/thelounge/./client/components/Channel.vue","webpack://@lordbex/thelounge/./client/js/hooks/use-close-channel.ts","webpack://@lordbex/thelounge/./client/components/Channel.vue?19d6","webpack://@lordbex/thelounge/./client/components/JoinChannel.vue","webpack://@lordbex/thelounge/./client/components/JoinChannel.vue?d18e","webpack://@lordbex/thelounge/./client/components/DirectMessageSection.vue","webpack://@lordbex/thelounge/./client/components/DirectMessageSection.vue?a2c7","webpack://@lordbex/thelounge/./client/js/helpers/distance.ts","webpack://@lordbex/thelounge/./client/components/NetworkList.vue?403b","webpack://@lordbex/thelounge/./client/components/Sidebar.vue?9985","webpack://@lordbex/thelounge/./client/components/ImageViewer.vue","webpack://@lordbex/thelounge/./client/components/ImageViewer.vue?2dfc","webpack://@lordbex/thelounge/./client/components/ContextMenu.vue","webpack://@lordbex/thelounge/./client/js/helpers/contextMenu.ts","webpack://@lordbex/thelounge/./client/js/helpers/openInNewTab.ts","webpack://@lordbex/thelounge/./client/components/ContextMenu.vue?fdba","webpack://@lordbex/thelounge/./client/components/ConfirmDialog.vue","webpack://@lordbex/thelounge/./client/components/ConfirmDialog.vue?36a8","webpack://@lordbex/thelounge/./client/components/Mentions.vue","webpack://@lordbex/thelounge/./client/components/Mentions.vue?dcdf","webpack://@lordbex/thelounge/./client/components/App.vue","webpack://@lordbex/thelounge/./client/components/App.vue?37fa","webpack://@lordbex/thelounge/./client/js/socket-events/connection.ts","webpack://@lordbex/thelounge/./client/js/socket-events/auth.ts","webpack://@lordbex/thelounge/./client/js/socket-events/msg.ts","webpack://@lordbex/thelounge/./client/js/chan.ts","webpack://@lordbex/thelounge/./client/js/socket-events/init.ts","webpack://@lordbex/thelounge/./client/js/socket-events/commands.ts","webpack://@lordbex/thelounge/./client/js/helpers/parseIrcUri.ts","webpack://@lordbex/thelounge/./client/js/socket-events/join.ts","webpack://@lordbex/thelounge/./client/js/socket-events/more.ts","webpack://@lordbex/thelounge/./client/js/socket-events/mentions.ts","webpack://@lordbex/thelounge/./client/js/socket-events/msg_preview.ts","webpack://@lordbex/thelounge/./client/js/socket-events/msg_special.ts","webpack://@lordbex/thelounge/./client/js/socket-events/names.ts","webpack://@lordbex/thelounge/./client/js/socket-events/network.ts","webpack://@lordbex/thelounge/./client/js/socket-events/nick.ts","webpack://@lordbex/thelounge/./client/js/socket-events/open.ts","webpack://@lordbex/thelounge/./client/js/socket-events/part.ts","webpack://@lordbex/thelounge/./client/js/socket-events/quit.ts","webpack://@lordbex/thelounge/./client/js/socket-events/sync_sort.ts","webpack://@lordbex/thelounge/./client/js/socket-events/topic.ts","webpack://@lordbex/thelounge/./client/js/socket-events/users.ts","webpack://@lordbex/thelounge/./client/js/socket-events/sign_out.ts","webpack://@lordbex/thelounge/./client/js/socket-events/sessions_list.ts","webpack://@lordbex/thelounge/./client/js/socket-events/configuration.ts","webpack://@lordbex/thelounge/./client/js/socket-events/changelog.ts","webpack://@lordbex/thelounge/./client/js/socket-events/setting.ts","webpack://@lordbex/thelounge/./client/js/socket-events/history_clear.ts","webpack://@lordbex/thelounge/./client/js/socket-events/search.ts","webpack://@lordbex/thelounge/./client/js/socket-events/mute_changed.ts","webpack://@lordbex/thelounge/./client/js/socket-events/pin_changed.ts","webpack://@lordbex/thelounge/./client/js/socket-events/channel_groups.ts","webpack://@lordbex/thelounge/./client/js/keybinds.ts","webpack://@lordbex/thelounge/./client/js/helpers/listenForTwoFingerSwipes.ts","webpack://@lordbex/thelounge/./client/js/vue.ts","webpack://@lordbex/thelounge/./client/components/MessageTypes/join.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/join.vue?8f48","webpack://@lordbex/thelounge/./client/components/MessageTypes/ctcp_request.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/ctcp_request.vue?2dcb","webpack://@lordbex/thelounge/./client/components/MessageTypes/raw.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/raw.vue?56b1","webpack://@lordbex/thelounge/./client/js/localStorage.ts","webpack://@lordbex/thelounge/./client/components/MessageTypes/nick.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/nick.vue?d15a","webpack://@lordbex/thelounge/./client/components/MessageTypes/kick.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/kick.vue?24a1","webpack://@lordbex/thelounge/webpack/bootstrap","webpack://@lordbex/thelounge/webpack/runtime/compat get default export","webpack://@lordbex/thelounge/webpack/runtime/define property getters","webpack://@lordbex/thelounge/webpack/runtime/global","webpack://@lordbex/thelounge/webpack/runtime/hasOwnProperty shorthand","webpack://@lordbex/thelounge/webpack/runtime/make namespace object","webpack://@lordbex/thelounge/webpack/runtime/jsonp chunk loading","webpack://@lordbex/thelounge/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","import socket from \"./socket\";\nimport type {TypedStore} from \"./store\";\n\nconst defaultSettingConfig = {\n\tapply() {},\n\tdefault: null,\n\tsync: null,\n};\n\nconst defaultConfig = {\n\tsyncSettings: {\n\t\tdefault: true,\n\t\tsync: \"never\",\n\t\tapply(store: TypedStore, value: boolean, auto = false) {\n\t\t\t// If applied by settings/applyAll, do not emit to server\n\t\t\tif (value && !auto) {\n\t\t\t\tsocket.emit(\"setting:get\");\n\t\t\t}\n\t\t},\n\t},\n\tadvanced: {\n\t\tdefault: false,\n\t},\n\tautocomplete: {\n\t\tdefault: true,\n\t},\n\tnickPostfix: {\n\t\tdefault: \"\",\n\t},\n\tcoloredNicks: {\n\t\tdefault: true,\n\t},\n\tdesktopNotifications: {\n\t\tdefault: false,\n\t\tsync: \"never\",\n\t\tapply(store: TypedStore, value: boolean) {\n\t\t\t// Commit a mutation. options can have root: true that allows to commit root mutations in namespaced modules.\n\t\t\t// https://vuex.vuejs.org/api/#store-instance-methods. not typed?\n\t\t\tstore.commit(\"refreshDesktopNotificationState\", null, {root: true});\n\n\t\t\tif (\"Notification\" in window && value && Notification.permission !== \"granted\") {\n\t\t\t\tNotification.requestPermission(() =>\n\t\t\t\t\tstore.commit(\"refreshDesktopNotificationState\", null, {root: true})\n\t\t\t\t).catch((e) => {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t},\n\thighlights: {\n\t\tdefault: \"\",\n\t\tsync: \"always\",\n\t},\n\thighlightExceptions: {\n\t\tdefault: \"\",\n\t\tsync: \"always\",\n\t},\n\tawayMessage: {\n\t\tdefault: \"\",\n\t\tsync: \"always\",\n\t},\n\tlinks: {\n\t\tdefault: true,\n\t},\n\tmotd: {\n\t\tdefault: true,\n\t},\n\tnotification: {\n\t\tdefault: true,\n\t\tsync: \"never\",\n\t},\n\tnotifyAllMessages: {\n\t\tdefault: false,\n\t},\n\tshowSeconds: {\n\t\tdefault: false,\n\t},\n\tuse12hClock: {\n\t\tdefault: false,\n\t},\n\tstatusMessages: {\n\t\tdefault: \"condensed\",\n\t},\n\ttheme: {\n\t\tdefault: document.getElementById(\"theme\")?.dataset.serverTheme,\n\t\tapply(store: TypedStore, value: string) {\n\t\t\tconst themeEl = document.getElementById(\"theme\");\n\t\t\tconst themeUrl = `themes/${value}.css`;\n\n\t\t\tif (!(themeEl instanceof HTMLLinkElement)) {\n\t\t\t\tthrow new Error(\"theme element is not a link\");\n\t\t\t}\n\n\t\t\tconst hrefAttr = themeEl.attributes.getNamedItem(\"href\");\n\n\t\t\tif (!hrefAttr) {\n\t\t\t\tthrow new Error(\"theme is missing href attribute\");\n\t\t\t}\n\n\t\t\tif (hrefAttr.value === themeUrl) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\threfAttr.value = themeUrl;\n\n\t\t\tif (!store.state.serverConfiguration) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst newTheme = store.state.serverConfiguration?.themes.filter(\n\t\t\t\t(theme) => theme.name === value\n\t\t\t)[0];\n\n\t\t\tconst metaSelector = document.querySelector('meta[name=\"theme-color\"]');\n\n\t\t\tif (!(metaSelector instanceof HTMLMetaElement)) {\n\t\t\t\tthrow new Error(\"theme meta element is not a meta element\");\n\t\t\t}\n\n\t\t\tif (metaSelector) {\n\t\t\t\tconst themeColor = newTheme.themeColor || metaSelector.content;\n\t\t\t\tmetaSelector.content = themeColor;\n\t\t\t}\n\t\t},\n\t},\n\tmedia: {\n\t\tdefault: true,\n\t},\n\tuploadCanvas: {\n\t\tdefault: true,\n\t},\n\tuserStyles: {\n\t\tdefault: \"\",\n\t\tapply(store: TypedStore, value: string) {\n\t\t\tif (!/[?&]nocss/.test(window.location.search)) {\n\t\t\t\tconst element = document.getElementById(\"user-specified-css\");\n\n\t\t\t\tif (element) {\n\t\t\t\t\telement.innerHTML = value;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n\tsearchEnabled: {\n\t\tdefault: false,\n\t},\n\tjumptoEabled: {\n\t\tdefault: true,\n\t},\n\tfilterdmsEnabled: {\n\t\tdefault: true,\n\t},\n\tshowAllDMs: {\n\t\tdefault: false,\n\t},\n\tshowInputNick: {\n\t\tdefault: true,\n\t},\n\tdisableMutedUnread: {\n\t\tdefault: false,\n\t},\n\tcompactSidebar: {\n\t\tdefault: false,\n\t},\n\tbeautifyBridgedMessages: {\n\t\tdefault: true,\n\t},\n\tbridgedMessageNicksStyle: {\n\t\tdefault: \"parentheses\",\n\t},\n\tenhancedUserListEnabled: {\n\t\tdefault: true,\n\t},\n\tenhancedContextMenuEnabled: {\n\t\tdefault: true,\n\t},\n\tenableEnhancedSearch: {\n\t\t// disable by default for performance reasons\n\t\tdefault: false,\n\t},\n\tenableRainbowHotkey: {\n\t\tdefault: true,\n\t},\n};\n\nexport const config = normalizeConfig(defaultConfig);\n\nexport function createState() {\n\tconst state = {};\n\n\tfor (const settingName in config) {\n\t\tstate[settingName] = config[settingName].default;\n\t}\n\n\treturn state;\n}\n\nfunction normalizeConfig(obj: Record<string, Record<string, unknown>>) {\n\tconst newConfig: Partial<typeof defaultConfig> = {};\n\n\tfor (const settingName in obj) {\n\t\tnewConfig[settingName] = {...defaultSettingConfig, ...obj[settingName]};\n\t}\n\n\treturn newConfig as typeof defaultConfig;\n}\n\n// flatten to type of default\nexport type SettingsState = {\n\t[key in keyof typeof defaultConfig]: (typeof defaultConfig)[key][\"default\"];\n};\n","import storage from \"./localStorage\";\nimport socket from \"./socket\";\nimport {config, createState, SettingsState} from \"./settings\";\nimport {Store} from \"vuex\";\nimport {State} from \"./store\";\n\nexport function createSettingsStore(store: Store<State>) {\n\treturn {\n\t\tnamespaced: true,\n\t\tstate: assignStoredSettings(createState() as SettingsState, loadFromLocalStorage()),\n\t\tmutations: {\n\t\t\tset(state, {name, value}) {\n\t\t\t\tstate[name] = value;\n\t\t\t},\n\t\t},\n\t\tactions: {\n\t\t\tsyncAll({state}, force = false) {\n\t\t\t\tif (state.syncSettings === false && force === false) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tstore.commit(\"serverHasSettings\", true);\n\n\t\t\t\tfor (const name in state) {\n\t\t\t\t\tif (config[name].sync !== \"never\" || config[name].sync === \"always\") {\n\t\t\t\t\t\tsocket.emit(\"setting:set\", {name, value: state[name]});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tapplyAll({state}) {\n\t\t\t\tfor (const settingName in config) {\n\t\t\t\t\tconfig[settingName].apply(store, state[settingName], true);\n\t\t\t\t}\n\t\t\t},\n\t\t\tupdate({state, commit}, {name, value, sync = false}) {\n\t\t\t\tif (state[name] === value) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst settingConfig = config[name];\n\n\t\t\t\t// Trying to update a non existing setting (e.g. server has an old key)\n\t\t\t\tif (!settingConfig) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tsync === false &&\n\t\t\t\t\t(state.syncSettings === false || settingConfig.sync === \"never\")\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcommit(\"set\", {name, value});\n\t\t\t\tstorage.set(\"settings\", JSON.stringify(state));\n\t\t\t\tsettingConfig.apply(store, value);\n\n\t\t\t\tif (!sync) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t(state.syncSettings && settingConfig.sync !== \"never\") ||\n\t\t\t\t\tsettingConfig.sync === \"always\"\n\t\t\t\t) {\n\t\t\t\t\tsocket.emit(\"setting:set\", {name, value});\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t};\n}\n\nfunction loadFromLocalStorage(): Record<string, unknown> {\n\tlet storedSettings: Record<string, unknown> = {};\n\n\ttry {\n\t\tstoredSettings = JSON.parse(storage.get(\"settings\") || \"{}\");\n\t} catch {\n\t\tstorage.remove(\"settings\");\n\t}\n\n\tif (!storedSettings) {\n\t\treturn {};\n\t}\n\n\t// Older The Lounge versions converted highlights to an array, turn it back into a string\n\tif (storedSettings.highlights !== null && typeof storedSettings.highlights === \"object\") {\n\t\tstoredSettings.highlights = (storedSettings.highlights as string[]).join(\", \");\n\t}\n\n\treturn storedSettings;\n}\n\n/**\n * Essentially Object.assign but does not overwrite and only assigns\n * if key exists in both supplied objects and types match\n *\n * @param {object} defaultSettings\n * @param {object} storedSettings\n */\nfunction assignStoredSettings(\n\tdefaultSettings: SettingsState,\n\tstoredSettings: Record<string, unknown>\n) {\n\tconst newSettings = {...defaultSettings};\n\n\tfor (const key in defaultSettings) {\n\t\t// Make sure the setting in local storage has the same type that the code expects\n\t\tif (\n\t\t\ttypeof storedSettings[key] !== \"undefined\" &&\n\t\t\ttypeof defaultSettings[key] === typeof storedSettings[key]\n\t\t) {\n\t\t\tnewSettings[key] = storedSettings[key];\n\t\t}\n\t}\n\n\treturn newSettings;\n}\n","/* eslint-disable @typescript-eslint/no-shadow */\n\nimport {ActionContext, createStore, Store, useStore as baseUseStore} from \"vuex\";\nimport {createSettingsStore} from \"./store-settings\";\nimport storage from \"./localStorage\";\nimport type {ClientChan, ClientNetwork, NetChan, ClientMention, ClientMessage} from \"./types\";\nimport type {InjectionKey} from \"vue\";\n\nimport {SettingsState} from \"./settings\";\nimport {SearchQuery} from \"../../shared/types/storage\";\nimport {SharedConfiguration, LockedSharedConfiguration} from \"../../shared/types/config\";\n\nconst appName = document.title;\n\nenum DesktopNotificationState {\n\tUnsupported = \"unsupported\",\n\tBlocked = \"blocked\",\n\tNoHttps = \"nohttps\",\n\tGranted = \"granted\",\n}\n\nfunction detectDesktopNotificationState(): DesktopNotificationState {\n\tif (!(\"Notification\" in window)) {\n\t\treturn DesktopNotificationState.Unsupported;\n\t} else if (Notification.permission === \"granted\") {\n\t\treturn DesktopNotificationState.Granted;\n\t} else if (!window.isSecureContext) {\n\t\treturn DesktopNotificationState.NoHttps;\n\t}\n\n\treturn DesktopNotificationState.Blocked;\n}\n\nexport type ClientSession = {\n\tcurrent: boolean;\n\tactive: number;\n\tlastUse: number;\n\tip: string;\n\tagent: string;\n\ttoken: string;\n};\n\nexport type State = {\n\tappLoaded: boolean;\n\tactiveChannel?: NetChan;\n\tcurrentUserVisibleError: string | null;\n\tdesktopNotificationState: DesktopNotificationState;\n\tisAutoCompleting: boolean;\n\tisConnected: boolean;\n\tnetworks: ClientNetwork[];\n\t// TODO: type\n\tmentions: ClientMention[];\n\thasServiceWorker: boolean;\n\tpushNotificationState: string;\n\tserverConfiguration: SharedConfiguration | LockedSharedConfiguration | null;\n\tsessions: ClientSession[];\n\tsidebarOpen: boolean;\n\tsidebarDragging: boolean;\n\tuserlistOpen: boolean;\n\tversionData:\n\t\t| null\n\t\t| undefined\n\t\t| {\n\t\t\t\tlatest?: {\n\t\t\t\t\tversion: string;\n\t\t\t\t\tprerelease: boolean;\n\t\t\t\t\turl: string;\n\t\t\t\t};\n\t\t\t\tcurrent?: {\n\t\t\t\t\tversion: string;\n\t\t\t\t\tprerelease: boolean;\n\t\t\t\t\turl: string;\n\t\t\t\t\tchangelog?: string;\n\t\t\t\t};\n\t\t };\n\tversionStatus: \"loading\" | \"new-version\" | \"new-packages\" | \"up-to-date\" | \"error\";\n\tversionDataExpired: boolean;\n\tserverHasSettings: boolean;\n\tmessageSearchResults: {\n\t\tresults: ClientMessage[];\n\t} | null;\n\tmessageSearchPendingQuery: SearchQuery | null;\n\tsearchEnabled: boolean;\n};\n\nconst state = (): State => ({\n\tappLoaded: false,\n\tactiveChannel: undefined,\n\tcurrentUserVisibleError: null,\n\tdesktopNotificationState: detectDesktopNotificationState(),\n\tisAutoCompleting: false,\n\tisConnected: false,\n\tnetworks: [],\n\tmentions: [],\n\thasServiceWorker: false,\n\tpushNotificationState: \"unsupported\",\n\tserverConfiguration: null,\n\tsessions: [],\n\tsidebarOpen: false,\n\tsidebarDragging: false,\n\tuserlistOpen: storage.get(\"thelounge.state.userlist\") !== \"false\",\n\tversionData: null,\n\tversionStatus: \"loading\",\n\tversionDataExpired: false,\n\tserverHasSettings: false,\n\tmessageSearchResults: null,\n\tmessageSearchPendingQuery: null,\n\tsearchEnabled: false,\n});\n\ntype Getters = {\n\tfindChannelOnCurrentNetwork: (state: State) => (name: string) => ClientChan | undefined;\n\tfindChannelOnNetwork: (state: State) => (\n\t\tnetworkUuid: string,\n\t\tchannelName: string\n\t) => {\n\t\tnetwork: ClientNetwork;\n\t\tchannel: ClientChan;\n\t} | null;\n\tfindChannel: (state: State) => (id: number) => {\n\t\tnetwork: ClientNetwork;\n\t\tchannel: ClientChan;\n\t} | null;\n\tfindNetwork: (state: State) => (uuid: string) => ClientNetwork | null;\n\thighlightCount(state: State): number;\n\ttitle(state: State, getters: Omit<Getters, \"title\">): string;\n};\n\n// getters without the state argument\nexport type CallableGetters = {\n\t[K in keyof Getters]: ReturnType<Getters[K]>;\n};\n\nconst getters: Getters = {\n\tfindChannelOnCurrentNetwork: (state) => (name: string) => {\n\t\tname = name.toLowerCase();\n\t\treturn state.activeChannel?.network.channels.find((c) => c.name.toLowerCase() === name);\n\t},\n\tfindChannelOnNetwork: (state) => (networkUuid: string, channelName: string) => {\n\t\tfor (const network of state.networks) {\n\t\t\tif (network.uuid !== networkUuid) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (const channel of network.channels) {\n\t\t\t\tif (channel.name === channelName) {\n\t\t\t\t\treturn {network, channel};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t},\n\tfindChannel: (state) => (id: number) => {\n\t\tfor (const network of state.networks) {\n\t\t\tfor (const channel of network.channels) {\n\t\t\t\tif (channel.id === id) {\n\t\t\t\t\treturn {network, channel};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t},\n\tfindNetwork: (state) => (uuid: string) => {\n\t\tfor (const network of state.networks) {\n\t\t\tif (network.uuid === uuid) {\n\t\t\t\treturn network;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t},\n\thighlightCount(state) {\n\t\tlet highlightCount = 0;\n\n\t\tfor (const network of state.networks) {\n\t\t\tfor (const channel of network.channels) {\n\t\t\t\tif (channel.muted) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\thighlightCount += channel.highlight;\n\t\t\t}\n\t\t}\n\n\t\treturn highlightCount;\n\t},\n\ttitle(state, getters) {\n\t\tconst alertEventCount = getters.highlightCount\n\t\t\t? `(${getters.highlightCount.toString()}) `\n\t\t\t: \"\";\n\t\tconst channelname = state.activeChannel ? `${state.activeChannel.channel.name} — ` : \"\";\n\n\t\treturn alertEventCount + channelname + appName;\n\t},\n};\n\ntype Mutations = {\n\tappLoaded(state: State): void;\n\tactiveChannel(state: State, netChan: State[\"activeChannel\"]): void;\n\tcurrentUserVisibleError(state: State, error: State[\"currentUserVisibleError\"]): void;\n\trefreshDesktopNotificationState(state: State): void;\n\tisAutoCompleting(state: State, isAutoCompleting: State[\"isAutoCompleting\"]): void;\n\tisConnected(state: State, payload: State[\"isConnected\"]): void;\n\tnetworks(state: State, networks: State[\"networks\"]): void;\n\tmentions(state: State, mentions: State[\"mentions\"]): void;\n\n\tremoveNetwork(state: State, networkUuid: string): void;\n\tsortNetworks(\n\t\tstate: State,\n\t\tsortFn: (a: State[\"networks\"][0], b: State[\"networks\"][0]) => number\n\t): void;\n\thasServiceWorker(state: State): void;\n\tpushNotificationState(\n\t\tstate: State,\n\t\tpushNotificationState: State[\"pushNotificationState\"]\n\t): void;\n\tserverConfiguration(state: State, serverConfiguration: State[\"serverConfiguration\"]): void;\n\tsessions(state: State, payload: State[\"sessions\"]): void;\n\tsidebarOpen(state: State, payload: State[\"sidebarOpen\"]): void;\n\tsidebarDragging(state: State, payload: State[\"sidebarDragging\"]): void;\n\ttoggleSidebar(state: State): void;\n\ttoggleUserlist(state: State): void;\n\tuserlistOpen(state: State, payload: State[\"userlistOpen\"]): void;\n\tversionData(state: State, payload: State[\"versionData\"]): void;\n\tversionStatus(state: State, payload: State[\"versionStatus\"]): void;\n\tversionDataExpired(state: State, payload: State[\"versionDataExpired\"]): void;\n\tserverHasSettings(state: State, value: State[\"serverHasSettings\"]): void;\n\tmessageSearchPendingQuery(state: State, value: State[\"messageSearchPendingQuery\"]): void;\n\tmessageSearchResults(state: State, value: State[\"messageSearchResults\"]): void;\n\taddMessageSearchResults(state: State, value: NonNullable<State[\"messageSearchResults\"]>): void;\n};\n\nconst mutations: Mutations = {\n\tappLoaded(state) {\n\t\tstate.appLoaded = true;\n\t},\n\tactiveChannel(state, netChan) {\n\t\tstate.activeChannel = netChan;\n\t},\n\tcurrentUserVisibleError(state, error) {\n\t\tstate.currentUserVisibleError = error;\n\t},\n\trefreshDesktopNotificationState(state) {\n\t\tstate.desktopNotificationState = detectDesktopNotificationState();\n\t},\n\tisAutoCompleting(state, isAutoCompleting) {\n\t\tstate.isAutoCompleting = isAutoCompleting;\n\t},\n\tisConnected(state, payload) {\n\t\tstate.isConnected = payload;\n\t},\n\tnetworks(state, networks) {\n\t\tstate.networks = networks;\n\t},\n\tmentions(state, mentions) {\n\t\tstate.mentions = mentions;\n\t},\n\tremoveNetwork(state, networkId) {\n\t\tstate.networks.splice(\n\t\t\tstate.networks.findIndex((n) => n.uuid === networkId),\n\t\t\t1\n\t\t);\n\t},\n\tsortNetworks(state, sortFn) {\n\t\tstate.networks.sort(sortFn);\n\t},\n\thasServiceWorker(state) {\n\t\tstate.hasServiceWorker = true;\n\t},\n\tpushNotificationState(state, pushNotificationState) {\n\t\tstate.pushNotificationState = pushNotificationState;\n\t},\n\tserverConfiguration(state, serverConfiguration) {\n\t\tstate.serverConfiguration = serverConfiguration;\n\t},\n\tsessions(state, payload) {\n\t\tstate.sessions = payload;\n\t},\n\tsidebarOpen(state, payload) {\n\t\tstate.sidebarOpen = payload;\n\t},\n\tsidebarDragging(state, payload) {\n\t\tstate.sidebarDragging = payload;\n\t},\n\ttoggleSidebar(state) {\n\t\tstate.sidebarOpen = !state.sidebarOpen;\n\t},\n\ttoggleUserlist(state) {\n\t\tstate.userlistOpen = !state.userlistOpen;\n\t},\n\tuserlistOpen(state, payload) {\n\t\tstate.userlistOpen = payload;\n\t},\n\tversionData(state, payload) {\n\t\tstate.versionData = payload;\n\t},\n\tversionStatus(state, payload) {\n\t\tstate.versionStatus = payload;\n\t},\n\tversionDataExpired(state, payload) {\n\t\tstate.versionDataExpired = payload;\n\t},\n\tserverHasSettings(state, value) {\n\t\tstate.serverHasSettings = value;\n\t},\n\tmessageSearchPendingQuery(state, value) {\n\t\tstate.messageSearchPendingQuery = value;\n\t},\n\tmessageSearchResults(state, value) {\n\t\tstate.messageSearchResults = value;\n\t},\n\taddMessageSearchResults(state, value) {\n\t\t// Append the search results and add networks and channels to new messages\n\t\tif (!state.messageSearchResults) {\n\t\t\tstate.messageSearchResults = {results: []};\n\t\t}\n\n\t\tif (!value) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst results = [...value.results, ...state.messageSearchResults.results];\n\n\t\tstate.messageSearchResults = {\n\t\t\tresults,\n\t\t};\n\t},\n};\n\nexport type TypedCommit = <T extends keyof Mutations>(\n\ttype: T,\n\tpayload?: Parameters<Mutations[T]>[1] | null,\n\toptions?: {root?: boolean}\n) => ReturnType<Mutations[T]>;\ntype TypedActionContext = Omit<ActionContext<State, State>, \"commit\"> & {\n\tcommit: TypedCommit;\n};\n\ntype Actions = {\n\tpartChannel(context: TypedActionContext, payload: NetChan): void;\n};\n\nconst actions: Actions = {\n\tpartChannel({commit, state}, netChan) {\n\t\tconst mentions = state.mentions.filter((msg) => !(msg.chanId === netChan.channel.id));\n\t\tcommit(\"mentions\", mentions);\n\t},\n};\n\nconst storePattern = {\n\tstate,\n\tmutations,\n\tactions,\n\tgetters,\n};\n\n// https://vuex.vuejs.org/guide/typescript-support.html#typing-usestore-composition-function\nexport const key: InjectionKey<Store<State>> = Symbol();\n\n// vuex types getters as any\nexport type TypedStore = Omit<Store<State>, \"getters\" | \"commit\"> & {\n\tgetters: CallableGetters;\n\tcommit: TypedCommit;\n\tstate: State & {\n\t\tsettings: SettingsState;\n\t};\n};\n\nexport const store = createStore(storePattern) as TypedStore;\n\nconst settingsStore = createSettingsStore(store);\n\n// Settings module is registered dynamically because it benefits\n// from a direct reference to the store\nstore.registerModule(\"settings\", settingsStore);\n\nexport function useStore() {\n\treturn baseUseStore(key) as TypedStore;\n}\n","import io, {Socket as rawSocket} from \"socket.io-client\";\nimport type {ServerToClientEvents, ClientToServerEvents} from \"../../shared/types/socket-events\";\n\ntype Socket = rawSocket<ServerToClientEvents, ClientToServerEvents>;\n\nconst socket: Socket = io({\n\ttransports: JSON.parse(document.body.dataset.transports || \"['polling', 'websocket']\"),\n\tpath: window.location.pathname + \"socket.io/\",\n\tautoConnect: false,\n\treconnection: !document.body.classList.contains(\"public\"),\n});\n\n// Ease debugging socket during development\nif (process.env.NODE_ENV === \"development\") {\n\twindow.socket = socket;\n}\n\ndeclare global {\n\tinterface Window {\n\t\tsocket: Socket;\n\t}\n}\n\nexport default socket;\n","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\tsets mode\n\t\t<ParsedMessage :message=\"message\" />\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeMode\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./mode.vue?vue&type=template&id=8e1c6f3a&ts=true\"\nimport script from \"./mode.vue?vue&type=script&lang=ts\"\nexport * from \"./mode.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\t<i class=\"hostmask\"> (<ParsedMessage :network=\"network\" :text=\"message.hostmask\" />)</i> has\n\t\tquit\n\t\t<i v-if=\"message.text\" class=\"quit-reason\"\n\t\t\t>(<ParsedMessage :network=\"network\" :message=\"message\" />)</i\n\t\t>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport type {ClientMessage, ClientNetwork} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeQuit\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./quit.vue?vue&type=template&id=d273c630&ts=true\"\nimport script from \"./quit.vue?vue&type=script&lang=ts\"\nexport * from \"./quit.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<ParsedMessage v-if=\"message.self\" :network=\"network\" :message=\"message\" />\n\t\t<template v-else>\n\t\t\t<Username :user=\"message.from!\" />\n\t\t\tis away\n\t\t\t<i class=\"away-message\">(<ParsedMessage :network=\"network\" :message=\"message\" />)</i>\n\t\t</template>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport type {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeAway\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./away.vue?vue&type=template&id=41304132&ts=true\"\nimport script from \"./away.vue?vue&type=script&lang=ts\"\nexport * from \"./away.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","var map = {\n\t\"./away.vue\": 991,\n\t\"./back.vue\": 1344,\n\t\"./chghost.vue\": 2462,\n\t\"./ctcp.vue\": 6455,\n\t\"./ctcp_request.vue\": 8078,\n\t\"./error.vue\": 2429,\n\t\"./invite.vue\": 3393,\n\t\"./join.vue\": 7902,\n\t\"./kick.vue\": 9971,\n\t\"./mass_event.vue\": 1740,\n\t\"./mode.vue\": 514,\n\t\"./mode_channel.vue\": 7062,\n\t\"./mode_user.vue\": 5506,\n\t\"./monospace_block.vue\": 3107,\n\t\"./nick.vue\": 9956,\n\t\"./part.vue\": 5182,\n\t\"./quit.vue\": 875,\n\t\"./raw.vue\": 9207,\n\t\"./topic.vue\": 4379,\n\t\"./topic_set_by.vue\": 6789,\n\t\"./whois.vue\": 2837\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1191;","<template>\n\t<span class=\"content\">\n\t\t<ParsedMessage v-if=\"message.self\" :network=\"network\" :message=\"message\" />\n\t\t<template v-else>\n\t\t\t<Username :user=\"message.from!\" />\n\t\t\tis back\n\t\t</template>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeBack\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./back.vue?vue&type=template&id=7723954c&ts=true\"\nimport script from \"./back.vue?vue&type=script&lang=ts\"\nexport * from \"./back.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import {SharedMsg} from \"./msg\";\n\n// User groups sent by seedpool/enhanced capable servers\nexport type UserGroup = {\n\tname: string;\n\tposition: number;\n\tusers: string[];\n};\n\nexport enum ChanType {\n\tCHANNEL = \"channel\",\n\tLOBBY = \"lobby\",\n\tQUERY = \"query\",\n\tSPECIAL = \"special\",\n}\n\nexport enum SpecialChanType {\n\tBANLIST = \"list_bans\",\n\tINVITELIST = \"list_invites\",\n\tCHANNELLIST = \"list_channels\",\n\tIGNORELIST = \"list_ignored\",\n}\n\nexport enum ChanState {\n\tPARTED = 0,\n\tJOINED = 1,\n}\n\nexport type SharedChan = {\n\t// TODO: don't force existence, figure out how to make TS infer it.\n\tid: number;\n\tmessages: SharedMsg[];\n\tname: string;\n\tkey: string;\n\ttopic: string;\n\tfirstUnread: number;\n\tunread: number;\n\thighlight: number;\n\tmuted: boolean;\n\ttype: ChanType;\n\tstate: ChanState;\n\tpinned: boolean;\n\n\tspecial?: SpecialChanType;\n\tdata?: unknown;\n\tclosed?: boolean;\n\tnum_users?: number;\n\tgroups?: UserGroup[];\n};\n","<template>\n\t<span class=\"content mass-event-summary\">\n\t\t<strong>Mass event:</strong>\n\t\t<span v-for=\"(item, index) in summaryParts\" :key=\"index\">\n\t\t\t{{ index > 0 ? \", \" : \" \" }}{{ item }}\n\t\t</span>\n\t\t<i class=\"mass-event-duration\"> ({{ formattedDuration }})</i>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, PropType} from \"vue\";\nimport type {ClientMessage, ClientNetwork} from \"../../js/types\";\nimport {useStore} from \"../../js/store\";\n\nexport default defineComponent({\n\tname: \"MessageTypeMassEvent\",\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\t\tconst summaryParts = computed(() => {\n\t\t\tconst parts: string[] = [];\n\t\t\tconst summary = props.message.massEventSummary;\n\n\t\t\tif (!summary) {\n\t\t\t\treturn [\"No summary data\"];\n\t\t\t}\n\n\t\t\tif (summary.joins > 0) {\n\t\t\t\tparts.push(`${summary.joins} user${summary.joins !== 1 ? \"s\" : \"\"} joined`);\n\t\t\t}\n\n\t\t\tif (summary.parts > 0) {\n\t\t\t\tparts.push(`${summary.parts} user${summary.parts !== 1 ? \"s\" : \"\"} left`);\n\t\t\t}\n\n\t\t\tif (summary.quits > 0) {\n\t\t\t\tparts.push(`${summary.quits} user${summary.quits !== 1 ? \"s\" : \"\"} quit`);\n\t\t\t}\n\n\t\t\tif (summary.kicks > 0) {\n\t\t\t\tparts.push(`${summary.kicks} user${summary.kicks !== 1 ? \"s\" : \"\"} kicked`);\n\t\t\t}\n\n\t\t\tif (summary.nicks > 0) {\n\t\t\t\tparts.push(`${summary.nicks} nick change${summary.nicks !== 1 ? \"s\" : \"\"}`);\n\t\t\t}\n\n\t\t\tif (summary.modes > 0) {\n\t\t\t\tparts.push(`${summary.modes} mode change${summary.modes !== 1 ? \"s\" : \"\"}`);\n\t\t\t}\n\n\t\t\tif (summary.chghosts > 0) {\n\t\t\t\tparts.push(`${summary.chghosts} host change${summary.chghosts !== 1 ? \"s\" : \"\"}`);\n\t\t\t}\n\n\t\t\tif (summary.away > 0) {\n\t\t\t\tparts.push(`${summary.away} user${summary.away !== 1 ? \"s\" : \"\"} away`);\n\t\t\t}\n\n\t\t\tif (summary.back > 0) {\n\t\t\t\tparts.push(`${summary.back} user${summary.back !== 1 ? \"s\" : \"\"} back`);\n\t\t\t}\n\n\t\t\treturn parts.length > 0 ? parts : [\"No events\"];\n\t\t});\n\n\t\tconst formattedDuration = computed(() => {\n\t\t\tconst summary = props.message.massEventSummary;\n\n\t\t\tif (!summary || !summary.duration) {\n\t\t\t\treturn \"0s\";\n\t\t\t}\n\n\t\t\tconst seconds = Math.round(summary.duration / 1000);\n\n\t\t\tif (seconds < 60) {\n\t\t\t\treturn `${seconds}s`;\n\t\t\t}\n\n\t\t\tconst minutes = Math.floor(seconds / 60);\n\t\t\tconst remainingSeconds = seconds % 60;\n\n\t\t\tif (remainingSeconds === 0) {\n\t\t\t\treturn `${minutes}m`;\n\t\t\t}\n\n\t\t\treturn `${minutes}m ${remainingSeconds}s`;\n\t\t});\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tsummaryParts,\n\t\t\tformattedDuration,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./mass_event.vue?vue&type=template&id=57600f0e&ts=true\"\nimport script from \"./mass_event.vue?vue&type=script&lang=ts\"\nexport * from \"./mass_event.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<ParsedMessage :network=\"network\" :message=\"message\" :text=\"errorMessage\" />\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport {computed, defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\n\nexport default defineComponent({\n\tname: \"MessageTypeError\",\n\tcomponents: {\n\t\tParsedMessage,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst errorMessage = computed(() => {\n\t\t\t// TODO: enforce chan and nick fields so that we can get rid of that\n\t\t\tconst chan = props.message.channel || \"!UNKNOWN_CHAN\";\n\t\t\tconst nick = props.message.nick || \"!UNKNOWN_NICK\";\n\n\t\t\tswitch (props.message.error) {\n\t\t\t\tcase \"bad_channel_key\":\n\t\t\t\t\treturn `Cannot join ${chan} - Bad channel key.`;\n\t\t\t\tcase \"banned_from_channel\":\n\t\t\t\t\treturn `Cannot join ${chan} - You have been banned from the channel.`;\n\t\t\t\tcase \"cannot_send_to_channel\":\n\t\t\t\t\treturn `Cannot send to channel ${chan}`;\n\t\t\t\tcase \"channel_is_full\":\n\t\t\t\t\treturn `Cannot join ${chan} - Channel is full.`;\n\t\t\t\tcase \"chanop_privs_needed\":\n\t\t\t\t\treturn \"Cannot perform action: You're not a channel operator.\";\n\t\t\t\tcase \"invite_only_channel\":\n\t\t\t\t\treturn `Cannot join ${chan} - Channel is invite only.`;\n\t\t\t\tcase \"no_such_nick\":\n\t\t\t\t\treturn `User ${nick} hasn't logged in or does not exist.`;\n\t\t\t\tcase \"not_on_channel\":\n\t\t\t\t\treturn \"Cannot perform action: You're not on the channel.\";\n\t\t\t\tcase \"password_mismatch\":\n\t\t\t\t\treturn \"Password mismatch.\";\n\t\t\t\tcase \"too_many_channels\":\n\t\t\t\t\treturn `Cannot join ${chan} - You've already reached the maximum number of channels allowed.`;\n\t\t\t\tcase \"unknown_command\":\n\t\t\t\t\t// TODO: not having message.command should never happen, so force existence\n\t\t\t\t\treturn `Unknown command: ${props.message.command || \"!UNDEFINED_COMMAND_BUG\"}`;\n\t\t\t\tcase \"user_not_in_channel\":\n\t\t\t\t\treturn `User ${nick} is not on the channel.`;\n\t\t\t\tcase \"user_on_channel\":\n\t\t\t\t\treturn `User ${nick} is already on the channel.`;\n\t\t\t\tdefault:\n\t\t\t\t\tif (props.message.reason) {\n\t\t\t\t\t\treturn `${props.message.reason} (${\n\t\t\t\t\t\t\tprops.message.error || \"!UNDEFINED_ERR\"\n\t\t\t\t\t\t})`;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn props.message.error;\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\terrorMessage,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./error.vue?vue&type=template&id=af61be5a&ts=true\"\nimport script from \"./error.vue?vue&type=script&lang=ts\"\nexport * from \"./error.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\thas changed\n\t\t<span v-if=\"message.new_ident\"\n\t\t\t>username to <b>{{ message.new_ident }} </b></span\n\t\t>\n\t\t<span v-if=\"message.new_host\"\n\t\t\t>hostname to\n\t\t\t<i class=\"hostmask\"><ParsedMessage :network=\"network\" :text=\"message.new_host\" /></i\n\t\t></span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeChangeHost\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./chghost.vue?vue&type=template&id=eaff81c8&ts=true\"\nimport script from \"./chghost.vue?vue&type=script&lang=ts\"\nexport * from \"./chghost.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","const events = new Map();\n\nclass EventBus {\n\t/**\n\t * Register an event handler for the given type.\n\t *\n\t * @param {String} type Type of event to listen for.\n\t * @param {Function} handler Function to call in response to given event.\n\t */\n\ton(type: string, handler: (...evt: unknown[]) => void) {\n\t\tif (events.has(type)) {\n\t\t\tevents.get(type).push(handler);\n\t\t} else {\n\t\t\tevents.set(type, [handler]);\n\t\t}\n\t}\n\n\t/**\n\t * Remove an event handler for the given type.\n\t *\n\t * @param {String} type Type of event to unregister `handler` from.\n\t * @param {Function} handler Handler function to remove.\n\t */\n\toff(type: string, handler: (...evt: unknown[]) => void) {\n\t\tif (events.has(type)) {\n\t\t\tevents.set(\n\t\t\t\ttype,\n\t\t\t\tevents.get(type).filter((item: (...evt: unknown[]) => void) => item !== handler)\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Invoke all handlers for the given type.\n\t *\n\t * @param {String} type The event type to invoke.\n\t * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler.\n\t */\n\temit(type: string, ...evt: unknown[]) {\n\t\tif (events.has(type)) {\n\t\t\tevents\n\t\t\t\t.get(type)\n\t\t\t\t.slice()\n\t\t\t\t.map((handler: (...evts: unknown[]) => void) => {\n\t\t\t\t\thandler(...evt);\n\t\t\t\t});\n\t\t}\n\t}\n}\n\nexport default new EventBus();\n","<template>\n\t<span class=\"content\">\n\t\t<p>\n\t\t\t<Username :user=\"{nick: message.whois!.nick}\" />\n\t\t\t<span v-if=\"message.whois!.whowas\"> is offline, last information:</span>\n\t\t</p>\n\n\t\t<dl class=\"whois\">\n\t\t\t<template v-if=\"message.whois!.account\">\n\t\t\t\t<dt>Logged in as:</dt>\n\t\t\t\t<dd>{{ message.whois!.account }}</dd>\n\t\t\t</template>\n\n\t\t\t<dt>Host mask:</dt>\n\t\t\t<dd class=\"hostmask\">\n\t\t\t\t<ParsedMessage\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:text=\"message.whois!.ident + '@' + message.whois!.hostname\"\n\t\t\t\t/>\n\t\t\t</dd>\n\n\t\t\t<template v-if=\"message.whois!.actual_hostname\">\n\t\t\t\t<dt>Actual host:</dt>\n\t\t\t\t<dd class=\"hostmask\">\n\t\t\t\t\t<a\n\t\t\t\t\t\t:href=\"'https://ipinfo.io/' + message.whois!.actual_ip\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t>{{ message.whois!.actual_ip }}</a\n\t\t\t\t\t>\n\t\t\t\t\t<i v-if=\"message.whois!.actual_hostname != message.whois!.actual_ip\">\n\t\t\t\t\t\t({{ message.whois!.actual_hostname }})</i\n\t\t\t\t\t>\n\t\t\t\t</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.actual_username\">\n\t\t\t\t<dt>Actual username:</dt>\n\t\t\t\t<dd>{{ message.whois!.actual_username }}</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.real_name\">\n\t\t\t\t<dt>Real name:</dt>\n\t\t\t\t<dd>\n\t\t\t\t\t<ParsedMessage :network=\"network\" :text=\"message.whois!.real_name as string\" />\n\t\t\t\t</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.registered_nick\">\n\t\t\t\t<dt>Registered nick:</dt>\n\t\t\t\t<dd>{{ message.whois!.registered_nick }}</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.channels\">\n\t\t\t\t<dt>Channels:</dt>\n\t\t\t\t<dd>\n\t\t\t\t\t<ParsedMessage :network=\"network\" :text=\"message.whois!.channels as string\" />\n\t\t\t\t</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.modes\">\n\t\t\t\t<dt>Modes:</dt>\n\t\t\t\t<dd>{{ message.whois!.modes }}</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.special\">\n\t\t\t\t<template v-for=\"special in message.whois!.special\" :key=\"special\">\n\t\t\t\t\t<dt>Special:</dt>\n\t\t\t\t\t<dd>{{ special }}</dd>\n\t\t\t\t</template>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.operator\">\n\t\t\t\t<dt>Operator:</dt>\n\t\t\t\t<dd>{{ message.whois!.operator }}</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.helpop\">\n\t\t\t\t<dt>Available for help:</dt>\n\t\t\t\t<dd>Yes</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.bot\">\n\t\t\t\t<dt>Is a bot:</dt>\n\t\t\t\t<dd>Yes</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.away\">\n\t\t\t\t<dt>Away:</dt>\n\t\t\t\t<dd><ParsedMessage :network=\"network\" :text=\"message.whois!.away as string\" /></dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.secure\">\n\t\t\t\t<dt>Secure connection:</dt>\n\t\t\t\t<dd>Yes</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.certfps\">\n\t\t\t\t<template v-for=\"certfp in message.whois!.certfps\" :key=\"certfp\">\n\t\t\t\t\t<dt>Certificate:</dt>\n\t\t\t\t\t<dd>{{ certfp }}</dd>\n\t\t\t\t</template>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.server\">\n\t\t\t\t<dt>Connected to:</dt>\n\t\t\t\t<dd>\n\t\t\t\t\t{{ message.whois!.server }} <i>({{ message.whois!.server_info }})</i>\n\t\t\t\t</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.logonTime\">\n\t\t\t\t<dt>Connected at:</dt>\n\t\t\t\t<dd>{{ localetime(message.whois!.logonTime as Date) }}</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.idle\">\n\t\t\t\t<dt>Idle since:</dt>\n\t\t\t\t<dd>{{ localetime(message.whois!.idleTime as Date) }}</dd>\n\t\t\t</template>\n\t\t</dl>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport localetime from \"../../js/helpers/localetime\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeWhois\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup() {\n\t\treturn {\n\t\t\tlocaletime: (date: Date) => localetime(date),\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./whois.vue?vue&type=template&id=4544ec98&ts=true\"\nimport script from \"./whois.vue?vue&type=script&lang=ts\"\nexport * from \"./whois.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<span class=\"text\"><ParsedMessage :network=\"network\" :text=\"cleanText\" /></span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeMonospaceBlock\",\n\tcomponents: {\n\t\tParsedMessage,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst cleanText = computed(() => {\n\t\t\tlet lines = props.message.text!.split(\"\\n\");\n\n\t\t\t// If all non-empty lines of the MOTD start with a hyphen (which is common\n\t\t\t// across MOTDs), remove all the leading hyphens.\n\t\t\tif (lines.every((line) => line === \"\" || line[0] === \"-\")) {\n\t\t\t\tlines = lines.map((line) => line.substring(2));\n\t\t\t}\n\n\t\t\t// Remove empty lines around the MOTD (but not within it)\n\t\t\treturn lines\n\t\t\t\t.map((line) => line.replace(/\\s*$/, \"\"))\n\t\t\t\t.join(\"\\n\")\n\t\t\t\t.replace(/^[\\r\\n]+|[\\r\\n]+$/g, \"\");\n\t\t});\n\n\t\treturn {\n\t\t\tcleanText,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./monospace_block.vue?vue&type=template&id=63c82b2a&ts=true\"\nimport script from \"./monospace_block.vue?vue&type=script&lang=ts\"\nexport * from \"./monospace_block.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","const sizes = [\"Bytes\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\"];\n\nexport default (size: number) => {\n\t// Loosely inspired from https://stackoverflow.com/a/18650828/1935861\n\tconst i = size > 0 ? Math.floor(Math.log(size) / Math.log(1024)) : 0;\n\tconst fixedSize = parseFloat((size / Math.pow(1024, i)).toFixed(1));\n\treturn `${fixedSize} ${sizes[i]}`;\n};\n","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\tinvited\n\t\t<span v-if=\"message.invitedYou\">you</span>\n\t\t<Username v-else :user=\"message.target!\" />\n\t\tto <ParsedMessage :network=\"network\" :text=\"message.channel\" />\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeInvite\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./invite.vue?vue&type=template&id=1d873497&ts=true\"\nimport script from \"./invite.vue?vue&type=script&lang=ts\"\nexport * from \"./invite.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","// Styling control codes\nconst BOLD = \"\\x02\";\nconst COLOR = \"\\x03\";\nconst HEX_COLOR = \"\\x04\";\nconst RESET = \"\\x0f\";\nconst REVERSE = \"\\x16\";\nconst ITALIC = \"\\x1d\";\nconst UNDERLINE = \"\\x1f\";\nconst STRIKETHROUGH = \"\\x1e\";\nconst MONOSPACE = \"\\x11\";\n\nexport type ParsedStyle = {\n\tbold?: boolean;\n\ttextColor?: string;\n\tbgColor?: string;\n\thexColor?: string;\n\thexBgColor?: string;\n\titalic?: boolean;\n\tunderline?: boolean;\n\tstrikethrough?: boolean;\n\tmonospace?: boolean;\n\ttext: string;\n\tstart: number;\n\tend: number;\n};\n\n// Color code matcher, with format `XX,YY` where both `XX` and `YY` are\n// integers, `XX` is the text color and `YY` is an optional background color.\nconst colorRx = /^(\\d{1,2})(?:,(\\d{1,2}))?/;\n\n// 6-char Hex color code matcher\nconst hexColorRx = /^([0-9a-f]{6})(?:,([0-9a-f]{6}))?/i;\n\n// Represents all other control codes that to be ignored/filtered from the text\n// This regex allows line feed character\nconst controlCodesRx = /[\\u0000-\\u0009\\u000B-\\u001F]/g;\n\n// Converts a given text into an array of objects, each of them representing a\n// similarly styled section of the text. Each object carries the `text`, style\n// information (`bold`, `textColor`, `bgcolor`, `italic`,\n// `underline`, `strikethrough`, `monospace`), and `start`/`end` cursors.\nfunction parseStyle(text: string) {\n\tconst result: ParsedStyle[] = [];\n\tlet start = 0;\n\tlet position = 0;\n\n\t// At any given time, these carry style information since last time a styling\n\t// control code was met.\n\tlet colorCodes,\n\t\tbold,\n\t\ttextColor,\n\t\tbgColor,\n\t\thexColor,\n\t\thexBgColor,\n\t\titalic,\n\t\tunderline,\n\t\tstrikethrough,\n\t\tmonospace;\n\n\tconst resetStyle = () => {\n\t\tbold = false;\n\t\ttextColor = undefined;\n\t\tbgColor = undefined;\n\t\thexColor = undefined;\n\t\thexBgColor = undefined;\n\t\titalic = false;\n\t\tunderline = false;\n\t\tstrikethrough = false;\n\t\tmonospace = false;\n\t};\n\n\tresetStyle();\n\n\t// When called, this \"closes\" the current fragment by adding an entry to the\n\t// `result` array using the styling information set last time a control code\n\t// was met.\n\tconst emitFragment = () => {\n\t\t// Uses the text fragment starting from the last control code position up to\n\t\t// the current position\n\t\tconst textPart = text.slice(start, position);\n\n\t\t// Filters out all non-style related control codes present in this text\n\t\tconst processedText = textPart.replace(controlCodesRx, \" \");\n\n\t\tif (processedText.length) {\n\t\t\t// Current fragment starts where the previous one ends, or at 0 if none\n\t\t\tconst fragmentStart = result.length ? result[result.length - 1].end : 0;\n\n\t\t\tresult.push({\n\t\t\t\tbold,\n\t\t\t\ttextColor,\n\t\t\t\tbgColor,\n\t\t\t\thexColor,\n\t\t\t\thexBgColor,\n\t\t\t\titalic,\n\t\t\t\tunderline,\n\t\t\t\tstrikethrough,\n\t\t\t\tmonospace,\n\t\t\t\ttext: processedText,\n\t\t\t\tstart: fragmentStart,\n\t\t\t\tend: fragmentStart + processedText.length,\n\t\t\t});\n\t\t}\n\n\t\t// Now that a fragment has been \"closed\", the next one will start after that\n\t\tstart = position + 1;\n\t};\n\n\t// This loop goes through each character of the given text one by one by\n\t// bumping the `position` cursor. Every time a new special \"styling\" character\n\t// is met, an object gets created (with `emitFragment()`)information on text\n\t// encountered since the previous styling character.\n\twhile (position < text.length) {\n\t\tswitch (text[position]) {\n\t\t\tcase RESET:\n\t\t\t\temitFragment();\n\t\t\t\tresetStyle();\n\t\t\t\tbreak;\n\n\t\t\t// Meeting a BOLD character means that the ongoing text is either going to\n\t\t\t// be in bold or that the previous one was in bold and the following one\n\t\t\t// must be reset.\n\t\t\t// This same behavior applies to COLOR, REVERSE, ITALIC, and UNDERLINE.\n\t\t\tcase BOLD:\n\t\t\t\temitFragment();\n\t\t\t\tbold = !bold;\n\t\t\t\tbreak;\n\n\t\t\tcase COLOR:\n\t\t\t\temitFragment();\n\n\t\t\t\t// Go one step further to find the corresponding color\n\t\t\t\tcolorCodes = text.slice(position + 1).match(colorRx);\n\n\t\t\t\tif (colorCodes) {\n\t\t\t\t\ttextColor = Number(colorCodes[1]);\n\n\t\t\t\t\tif (colorCodes[2]) {\n\t\t\t\t\t\tbgColor = Number(colorCodes[2]);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Color code length is > 1, so bump the current position cursor by as\n\t\t\t\t\t// much (and reset the start cursor for the current text block as well)\n\t\t\t\t\tposition += colorCodes[0].length;\n\t\t\t\t\tstart = position + 1;\n\t\t\t\t} else {\n\t\t\t\t\t// If no color codes were found, toggles back to no colors (like BOLD).\n\t\t\t\t\ttextColor = undefined;\n\t\t\t\t\tbgColor = undefined;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase HEX_COLOR:\n\t\t\t\temitFragment();\n\n\t\t\t\tcolorCodes = text.slice(position + 1).match(hexColorRx);\n\n\t\t\t\tif (colorCodes) {\n\t\t\t\t\thexColor = colorCodes[1].toUpperCase();\n\n\t\t\t\t\tif (colorCodes[2]) {\n\t\t\t\t\t\thexBgColor = colorCodes[2].toUpperCase();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Color code length is > 1, so bump the current position cursor by as\n\t\t\t\t\t// much (and reset the start cursor for the current text block as well)\n\t\t\t\t\tposition += colorCodes[0].length;\n\t\t\t\t\tstart = position + 1;\n\t\t\t\t} else {\n\t\t\t\t\t// If no color codes were found, toggles back to no colors (like BOLD).\n\t\t\t\t\thexColor = undefined;\n\t\t\t\t\thexBgColor = undefined;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase REVERSE: {\n\t\t\t\temitFragment();\n\t\t\t\tconst tmp = bgColor;\n\t\t\t\tbgColor = textColor;\n\t\t\t\ttextColor = tmp;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase ITALIC:\n\t\t\t\temitFragment();\n\t\t\t\titalic = !italic;\n\t\t\t\tbreak;\n\n\t\t\tcase UNDERLINE:\n\t\t\t\temitFragment();\n\t\t\t\tunderline = !underline;\n\t\t\t\tbreak;\n\n\t\t\tcase STRIKETHROUGH:\n\t\t\t\temitFragment();\n\t\t\t\tstrikethrough = !strikethrough;\n\t\t\t\tbreak;\n\n\t\t\tcase MONOSPACE:\n\t\t\t\temitFragment();\n\t\t\t\tmonospace = !monospace;\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Evaluate the next character at the next iteration\n\t\tposition += 1;\n\t}\n\n\t// The entire text has been parsed, so we finalize the current text fragment.\n\temitFragment();\n\n\treturn result;\n}\n\nconst properties = [\n\t\"bold\",\n\t\"textColor\",\n\t\"bgColor\",\n\t\"hexColor\",\n\t\"hexBgColor\",\n\t\"italic\",\n\t\"underline\",\n\t\"strikethrough\",\n\t\"monospace\",\n];\n\nfunction prepare(text: string) {\n\treturn (\n\t\tparseStyle(text)\n\t\t\t// This optimizes fragments by combining them together when all their values\n\t\t\t// for the properties defined above are equal.\n\t\t\t.reduce((prev: ParsedStyle[], curr) => {\n\t\t\t\tif (prev.length) {\n\t\t\t\t\tconst lastEntry = prev[prev.length - 1];\n\n\t\t\t\t\tif (properties.every((key) => curr[key] === lastEntry[key])) {\n\t\t\t\t\t\tlastEntry.text += curr.text;\n\t\t\t\t\t\tlastEntry.end += curr.text.length;\n\t\t\t\t\t\treturn prev;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn prev.concat([curr]);\n\t\t\t}, [])\n\t);\n}\n\nexport default prepare;\n","// Escapes the RegExp special characters \"^\", \"$\", \"\", \".\", \"*\", \"+\", \"?\", \"(\",\n// \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in string.\n// See https://lodash.com/docs/#escapeRegExp\nimport escapeRegExp from \"lodash/escapeRegExp.js\";\nimport {Part} from \"./merge\";\n\nexport type ChannelPart = Part & {\n\tchannel: string;\n};\n\n// escapes a regex in a way that's compatible to shove it in\n// a regex char set (meaning it also escapes -)\nfunction escapeRegExpCharSet(raw: string): string {\n\tconst escaped: string = escapeRegExp(raw);\n\treturn escaped.replace(\"-\", \"\\\\-\");\n}\n\n// Given an array of channel prefixes (such as \"#\" and \"&\") and an array of user\n// modes (such as \"@\" and \"+\"), this function extracts channels and nicks from a\n// text.\n// It returns an array of objects for each channel found with their start index,\n// end index and channel name.\nfunction findChannels(text: string, channelPrefixes: string[], userModes: string[]) {\n\t// `userModePattern` is necessary to ignore user modes in /whois responses.\n\t// For example, a voiced user in #thelounge will have a /whois response of:\n\t// > foo is on the following channels: +#thelounge\n\t// We need to explicitly ignore user modes to parse such channels correctly.\n\tconst userModePattern = userModes.map(escapeRegExpCharSet).join(\"\");\n\tconst channelPrefixPattern = channelPrefixes.map(escapeRegExpCharSet).join(\"\");\n\tconst channelPattern = `(?:^|\\\\s)[${userModePattern}]*([${channelPrefixPattern}][^ \\u0007]+)`;\n\tconst channelRegExp = new RegExp(channelPattern, \"g\");\n\n\tconst result: ChannelPart[] = [];\n\tlet match: RegExpExecArray | null;\n\n\tdo {\n\t\t// With global (\"g\") regexes, calling `exec` multiple times will find\n\t\t// successive matches in the same string.\n\t\tmatch = channelRegExp.exec(text);\n\n\t\tif (match) {\n\t\t\tresult.push({\n\t\t\t\tstart: match.index + match[0].length - match[1].length,\n\t\t\t\tend: match.index + match[0].length,\n\t\t\t\tchannel: match[1],\n\t\t\t});\n\t\t}\n\t} while (match);\n\n\treturn result;\n}\n\nexport default findChannels;\n","import LinkifyIt, {Match, type Validate} from \"linkify-it\";\nimport tlds from \"tlds/index.json\" with {type: \"json\"};\n\nexport type LinkPart = {\n\tstart: number;\n\tend: number;\n\tlink: string;\n};\n\nconst linkify = LinkifyIt().tlds(tlds).tlds(\"onion\", true);\n\n// Known schemes to detect in text\nconst commonSchemes = [\n\t\"sftp\",\n\t\"smb\",\n\t\"file\",\n\t\"irc\",\n\t\"ircs\",\n\t\"svn\",\n\t\"git\",\n\t\"steam\",\n\t\"mumble\",\n\t\"ts3server\",\n\t\"svn+ssh\",\n\t\"ssh\",\n\t\"gopher\",\n\t\"gemini\",\n];\n\nfor (const schema of commonSchemes) {\n\tlinkify.add(schema + \":\", \"http:\");\n}\n\nlinkify.add(\"web+\", {\n\tvalidate(text: string, pos: number, self: LinkifyIt.LinkifyIt) {\n\t\tconst webSchemaRe = /^[a-z]+:/gi;\n\n\t\tif (!webSchemaRe.test(text.slice(pos))) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst linkEnd = self.testSchemaAt(text, \"http:\", pos + webSchemaRe.lastIndex);\n\n\t\tif (linkEnd === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn webSchemaRe.lastIndex + linkEnd;\n\t},\n\tnormalize(match) {\n\t\tmatch.schema = match.text.slice(0, match.text.indexOf(\":\") + 1);\n\t},\n});\n\n// we must rewrite protocol less urls to http, else if TL is hosted\n// on https, this would incorrectly use https for the remote link.\n// See https://github.com/thelounge/thelounge/issues/2525\n//\n// We take the validation logic from linkify and just add our own\n// normalizer.\nlinkify.add(\"//\", {\n\tvalidate: (linkify as unknown as {__schemas__: Record<string, {validate: Validate}>})\n\t\t.__schemas__[\"//\"].validate,\n\tnormalize(match) {\n\t\tmatch.schema = \"\"; // this counts as not having a schema\n\t\tmatch.url = \"http:\" + match.url;\n\t},\n});\n\nexport function findLinks(text: string) {\n\tconst matches = linkify.match(text);\n\n\tif (!matches) {\n\t\treturn [];\n\t}\n\n\treturn matches.map(makeLinkPart);\n}\n\nexport function findLinksWithSchema(text: string) {\n\tconst matches = linkify.match(text);\n\n\tif (!matches) {\n\t\treturn [];\n\t}\n\n\treturn matches.filter((url) => !!url.schema).map(makeLinkPart);\n}\n\nfunction makeLinkPart(url: Match): LinkPart {\n\treturn {\n\t\tstart: url.index,\n\t\tend: url.lastIndex,\n\t\tlink: url.url,\n\t};\n}\n","import emojiRegExp from \"emoji-regex\";\nimport {Part} from \"./merge\";\n\nconst regExp = emojiRegExp();\n\nexport type EmojiPart = Part & {\n\temoji: string;\n};\n\nfunction findEmoji(text: string) {\n\tconst result: EmojiPart[] = [];\n\tlet match: RegExpExecArray | null;\n\n\twhile ((match = regExp.exec(text))) {\n\t\tresult.push({\n\t\t\tstart: match.index,\n\t\t\tend: match.index + match[0].length,\n\t\t\temoji: match[0],\n\t\t});\n\t}\n\n\treturn result;\n}\n\nexport default findEmoji;\n","import {Part} from \"./merge\";\n\nconst nickRegExp = /([\\w[\\]\\\\`^{|}-]+)/g;\n\nexport type NamePart = Part & {\n\tnick: string;\n};\n\nfunction findNames(text: string, nicks: string[]): NamePart[] {\n\tconst result: NamePart[] = [];\n\n\t// Return early if we don't have any nicknames to find\n\tif (nicks.length === 0) {\n\t\treturn result;\n\t}\n\n\tlet match: RegExpExecArray | null;\n\n\twhile ((match = nickRegExp.exec(text))) {\n\t\tif (nicks.indexOf(match[1]) > -1) {\n\t\t\tresult.push({\n\t\t\t\tstart: match.index,\n\t\t\t\tend: match.index + match[1].length,\n\t\t\t\tnick: match[1],\n\t\t\t});\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport default findNames;\n","// Return true if any section of \"a\" or \"b\" parts (defined by their start/end\n\nimport {Part} from \"./merge\";\n\n// markers) intersect each other, false otherwise.\nfunction anyIntersection(a: Part, b: Part) {\n\treturn (\n\t\t(a.start <= b.start && b.start < a.end) ||\n\t\t(a.start < b.end && b.end <= a.end) ||\n\t\t(b.start <= a.start && a.start < b.end) ||\n\t\t(b.start < a.end && a.end <= b.end)\n\t);\n}\n\nexport default anyIntersection;\n","import anyIntersection from \"./anyIntersection\";\nimport fill from \"./fill\";\nimport {ChannelPart} from \"./findChannels\";\nimport {EmojiPart} from \"./findEmoji\";\nimport {LinkPart} from \"../../../../shared/linkify\";\nimport {NamePart} from \"./findNames\";\n\nexport type Part = {\n\tstart: number;\n\tend: number;\n};\n\ntype TextPart = Part & {\n\ttext: string;\n};\n\ntype Fragment = {\n\tstart: number;\n\tend: number;\n\ttext: string;\n};\n\n// Merge text part information within a styling fragment\nfunction assign(textPart: Part, fragment: Fragment) {\n\tconst fragStart = fragment.start;\n\tconst start = Math.max(fragment.start, textPart.start);\n\tconst end = Math.min(fragment.end, textPart.end);\n\tconst text = fragment.text.slice(start - fragStart, end - fragStart);\n\n\treturn Object.assign({}, fragment, {start, end, text});\n}\n\nfunction sortParts(a: Part, b: Part) {\n\treturn a.start - b.start || b.end - a.end;\n}\n\nexport type MergedParts = (TextPart | NamePart | EmojiPart | ChannelPart | LinkPart)[];\n\ntype MergedPart = (TextPart | NamePart | EmojiPart | ChannelPart | LinkPart) & {\n\tfragments: Fragment[];\n};\n\n// Merge the style fragments within the text parts, taking into account\n// boundaries and text sections that have not matched to links or channels.\n// For example, given a string \"foobar\" where \"foo\" and \"bar\" have been\n// identified as parts (channels, links, etc.) and \"fo\", \"ob\" and \"ar\" have 3\n// different styles, the first resulting part will contain fragments \"fo\" and\n// \"o\", and the second resulting part will contain \"b\" and \"ar\". \"o\" and \"b\"\n// fragments will contain duplicate styling attributes.\nfunction merge(parts: MergedParts, styleFragments: Fragment[], cleanText: string): MergedPart[] {\n\t// Remove overlapping parts\n\tparts = parts.sort(sortParts).reduce<MergedParts>((prev, curr) => {\n\t\tconst intersection = prev.some((p) => anyIntersection(p, curr));\n\n\t\tif (intersection) {\n\t\t\treturn prev;\n\t\t}\n\n\t\treturn prev.concat([curr]);\n\t}, []);\n\n\t// Every section of the original text that has not been captured in a \"part\"\n\t// is filled with \"text\" parts, dummy objects with start/end but no extra\n\t// metadata.\n\n\tconst filled = fill(parts, cleanText) as TextPart[];\n\tconst allParts: MergedParts = [...parts, ...filled].sort(sortParts); // Sort all parts identified based on their position in the original text\n\n\t// Distribute the style fragments within the text parts\n\treturn allParts.map((part) => {\n\t\tconst fragments = styleFragments\n\t\t\t.filter((fragment) => anyIntersection(part, fragment))\n\t\t\t.map((fragment) => assign(part, fragment));\n\n\t\treturn {...part, fragments} as MergedPart;\n\t});\n}\n\nexport default merge;\n","<template>\n\t<button\n\t\tv-if=\"link.type !== 'loading'\"\n\t\t:class=\"['toggle-button', 'toggle-preview', {opened: link.shown}]\"\n\t\t:aria-label=\"ariaLabel\"\n\t\t@click=\"onClick\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, PropType} from \"vue\";\nimport {ClientMessage, ClientLinkPreview} from \"../js/types\";\n\nexport default defineComponent({\n\tname: \"LinkPreviewToggle\",\n\tprops: {\n\t\tlink: {type: Object as PropType<ClientLinkPreview>, required: true},\n\t\tmessage: {type: Object as PropType<ClientMessage>, required: true},\n\t},\n\temits: [\"toggle-link-preview\"],\n\tsetup(props, {emit}) {\n\t\tconst ariaLabel = computed(() => {\n\t\t\treturn props.link.shown ? \"Collapse preview\" : \"Expand preview\";\n\t\t});\n\n\t\tconst onClick = () => {\n\t\t\tprops.link.shown = !props.link.shown;\n\t\t\temit(\"toggle-link-preview\", props.link, props.message);\n\t\t};\n\n\t\treturn {\n\t\t\tariaLabel,\n\t\t\tonClick,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./LinkPreviewToggle.vue?vue&type=template&id=1ba6c5b8&ts=true\"\nimport script from \"./LinkPreviewToggle.vue?vue&type=script&lang=ts\"\nexport * from \"./LinkPreviewToggle.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"preview-size\">({{ previewSize }})</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent} from \"vue\";\nimport friendlysize from \"../js/helpers/friendlysize\";\n\nexport default defineComponent({\n\tname: \"LinkPreviewFileSize\",\n\tprops: {\n\t\tsize: {type: Number, required: true},\n\t},\n\tsetup(props) {\n\t\tconst previewSize = friendlysize(props.size);\n\n\t\treturn {\n\t\t\tpreviewSize,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./LinkPreviewFileSize.vue?vue&type=template&id=19e7dc56&ts=true\"\nimport script from \"./LinkPreviewFileSize.vue?vue&type=script&lang=ts\"\nexport * from \"./LinkPreviewFileSize.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span\n\t\tclass=\"inline-channel\"\n\t\tdir=\"auto\"\n\t\trole=\"button\"\n\t\ttabindex=\"0\"\n\t\t@click.prevent=\"openContextMenu\"\n\t\t@contextmenu.prevent=\"openContextMenu\"\n\t\t><slot></slot\n\t></span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent} from \"vue\";\nimport eventbus from \"../js/eventbus\";\n\nexport default defineComponent({\n\tname: \"InlineChannel\",\n\tprops: {\n\t\tchannel: String,\n\t},\n\tsetup(props) {\n\t\tconst openContextMenu = (event) => {\n\t\t\teventbus.emit(\"contextmenu:inline-channel\", {\n\t\t\t\tevent: event,\n\t\t\t\tchannel: props.channel,\n\t\t\t});\n\t\t};\n\n\t\treturn {\n\t\t\topenContextMenu,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./InlineChannel.vue?vue&type=template&id=e318f974&ts=true\"\nimport script from \"./InlineChannel.vue?vue&type=script&lang=ts\"\nexport * from \"./InlineChannel.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import {h as createElement, VNode} from \"vue\";\nimport parseStyle from \"./ircmessageparser/parseStyle\";\nimport findChannels, {ChannelPart} from \"./ircmessageparser/findChannels\";\nimport {findLinks, LinkPart} from \"../../../shared/linkify\";\nimport findEmoji, {EmojiPart} from \"./ircmessageparser/findEmoji\";\nimport findNames, {NamePart} from \"./ircmessageparser/findNames\";\nimport merge, {MergedParts} from \"./ircmessageparser/merge\";\nimport emojiMap from \"./fullnamemap.json\" with {type: \"json\"};\nimport LinkPreviewToggle from \"../../components/LinkPreviewToggle.vue\";\nimport LinkPreviewFileSize from \"../../components/LinkPreviewFileSize.vue\";\nimport InlineChannel from \"../../components/InlineChannel.vue\";\nimport Username from \"../../components/Username.vue\";\nimport {ClientMessage, ClientNetwork} from \"../types\";\n\nconst emojiModifiersRegex = /[\\u{1f3fb}-\\u{1f3ff}]|\\u{fe0f}/gu;\n\ntype FragmentType = {\n\tstart: number;\n\tend: number;\n\ttext: string;\n};\n\n// Type guards for proper type narrowing\nfunction isLinkPart(part: {\n\tfragments: FragmentType[];\n\t[key: string]: unknown;\n}): part is LinkPart & {fragments: FragmentType[]} {\n\treturn \"link\" in part;\n}\n\nfunction isChannelPart(part: {\n\tfragments: FragmentType[];\n\t[key: string]: unknown;\n}): part is ChannelPart & {fragments: FragmentType[]} {\n\treturn \"channel\" in part;\n}\n\nfunction isEmojiPart(part: {\n\tfragments: FragmentType[];\n\t[key: string]: unknown;\n}): part is EmojiPart & {fragments: FragmentType[]} {\n\treturn \"emoji\" in part;\n}\n\nfunction isNamePart(part: {\n\tfragments: FragmentType[];\n\t[key: string]: unknown;\n}): part is NamePart & {fragments: FragmentType[]} {\n\treturn \"nick\" in part;\n}\n\ntype Fragment = {\n\tclass?: string[];\n\ttext?: string;\n};\n\ntype StyledFragment = Fragment & {\n\ttextColor?: string;\n\tbgColor?: string;\n\thexColor?: string;\n\thexBgColor?: string;\n\n\tbold?: boolean;\n\titalic?: boolean;\n\tunderline?: boolean;\n\tmonospace?: boolean;\n\tstrikethrough?: boolean;\n};\n\n// Create an HTML `span` with styling information for a given fragment\nfunction createFragment(fragment: StyledFragment): VNode | string | undefined {\n\tconst classes: string[] = [];\n\n\tif (fragment.bold) {\n\t\tclasses.push(\"irc-bold\");\n\t}\n\n\tif (fragment.textColor !== undefined) {\n\t\tclasses.push(\"irc-fg\" + fragment.textColor);\n\t}\n\n\tif (fragment.bgColor !== undefined) {\n\t\tclasses.push(\"irc-bg\" + fragment.bgColor);\n\t}\n\n\tif (fragment.italic) {\n\t\tclasses.push(\"irc-italic\");\n\t}\n\n\tif (fragment.underline) {\n\t\tclasses.push(\"irc-underline\");\n\t}\n\n\tif (fragment.strikethrough) {\n\t\tclasses.push(\"irc-strikethrough\");\n\t}\n\n\tif (fragment.monospace) {\n\t\tclasses.push(\"irc-monospace\");\n\t}\n\n\tconst data: {\n\t\tclass?: string[];\n\t\tstyle?: Record<string, string>;\n\t} = {\n\t\tclass: undefined,\n\t\tstyle: undefined,\n\t};\n\n\tlet hasData = false;\n\n\tif (classes.length > 0) {\n\t\thasData = true;\n\t\tdata.class = classes;\n\t}\n\n\tif (fragment.hexColor) {\n\t\thasData = true;\n\t\tdata.style = {\n\t\t\tcolor: `#${fragment.hexColor}`,\n\t\t};\n\n\t\tif (fragment.hexBgColor) {\n\t\t\tdata.style[\"background-color\"] = `#${fragment.hexBgColor}`;\n\t\t}\n\t}\n\n\treturn hasData ? createElement(\"span\", data, fragment.text) : fragment.text;\n}\n\n// Transform an IRC message potentially filled with styling control codes, URLs,\n// nicknames, and channels into a string of HTML elements to display on the client.\nfunction parse(text: string, message?: ClientMessage, network?: ClientNetwork) {\n\t// Extract the styling information and get the plain text version from it\n\tconst styleFragments = parseStyle(text);\n\tconst cleanText = styleFragments.map((fragment) => fragment.text).join(\"\");\n\n\t// On the plain text, find channels and URLs, returned as \"parts\". Parts are\n\t// arrays of objects containing start and end markers, as well as metadata\n\t// depending on what was found (channel or link).\n\tconst channelPrefixes = network ? network.serverOptions.CHANTYPES : [\"#\", \"&\"];\n\tconst userModes = network\n\t\t? network.serverOptions.PREFIX?.prefix?.map((pref) => pref.symbol)\n\t\t: [\"!\", \"@\", \"%\", \"+\"];\n\tconst channelParts = findChannels(cleanText, channelPrefixes, userModes);\n\tconst linkParts = findLinks(cleanText);\n\tconst emojiParts = findEmoji(cleanText);\n\tconst nameParts = findNames(cleanText, message ? message.users || [] : []);\n\n\tconst parts = (channelParts as MergedParts)\n\t\t.concat(linkParts)\n\t\t.concat(emojiParts)\n\t\t.concat(nameParts);\n\n\t// Merge the styling information with the channels / URLs / nicks / text objects and\n\t// generate HTML strings with the resulting fragments\n\treturn merge(parts, styleFragments, cleanText).map((textPart) => {\n\t\tconst fragments = textPart.fragments.map((fragment) => createFragment(fragment));\n\n\t\t// Wrap these potentially styled fragments with links and channel buttons\n\t\tif (isLinkPart(textPart)) {\n\t\t\tconst preview =\n\t\t\t\tmessage &&\n\t\t\t\tmessage.previews &&\n\t\t\t\tmessage.previews.find((p) => p.link === textPart.link);\n\t\t\tconst link = createElement(\n\t\t\t\t\"a\",\n\t\t\t\t{\n\t\t\t\t\thref: textPart.link,\n\t\t\t\t\tdir: preview ? null : \"auto\",\n\t\t\t\t\ttarget: \"_blank\",\n\t\t\t\t\trel: \"noopener\",\n\t\t\t\t},\n\t\t\t\tfragments\n\t\t\t);\n\n\t\t\tif (!preview) {\n\t\t\t\treturn link;\n\t\t\t}\n\n\t\t\tconst linkEls = [link];\n\n\t\t\tif (preview.size > 0) {\n\t\t\t\tlinkEls.push(\n\t\t\t\t\tcreateElement(LinkPreviewFileSize, {\n\t\t\t\t\t\tsize: preview.size,\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tlinkEls.push(\n\t\t\t\tcreateElement(LinkPreviewToggle, {\n\t\t\t\t\tlink: preview,\n\t\t\t\t\tmessage: message,\n\t\t\t\t})\n\t\t\t);\n\n\t\t\t// We wrap the link, size, and the toggle button into <span dir=\"auto\">\n\t\t\t// to correctly keep the left-to-right order of these elements\n\t\t\treturn createElement(\n\t\t\t\t\"span\",\n\t\t\t\t{\n\t\t\t\t\tdir: \"auto\",\n\t\t\t\t},\n\t\t\t\tlinkEls\n\t\t\t);\n\t\t} else if (isChannelPart(textPart)) {\n\t\t\treturn createElement(\n\t\t\t\tInlineChannel,\n\t\t\t\t{\n\t\t\t\t\tchannel: textPart.channel,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdefault: () => fragments,\n\t\t\t\t}\n\t\t\t);\n\t\t} else if (isEmojiPart(textPart)) {\n\t\t\tconst emojiWithoutModifiers = textPart.emoji.replace(emojiModifiersRegex, \"\");\n\t\t\tconst title = emojiMap[emojiWithoutModifiers]\n\t\t\t\t? `Emoji: ${emojiMap[emojiWithoutModifiers]}`\n\t\t\t\t: null;\n\n\t\t\treturn createElement(\n\t\t\t\t\"span\",\n\t\t\t\t{\n\t\t\t\t\tclass: [\"emoji\"],\n\t\t\t\t\trole: \"img\",\n\t\t\t\t\t\"aria-label\": title,\n\t\t\t\t\ttitle: title,\n\t\t\t\t},\n\t\t\t\tfragments\n\t\t\t);\n\t\t} else if (isNamePart(textPart)) {\n\t\t\treturn createElement(\n\t\t\t\tUsername,\n\t\t\t\t{\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tnick: textPart.nick,\n\t\t\t\t\t},\n\t\t\t\t\tdir: \"auto\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdefault: () => fragments,\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\treturn fragments;\n\t});\n}\n\nexport default parse;\n","// Create plain text entries corresponding to areas of the text that match no\n// existing entries. Returns an empty array if all parts of the text have been\n\nimport {Part} from \"./merge\";\n\n// parsed into recognizable entries already.\nfunction fill(existingEntries: Part[], text: string) {\n\tlet position = 0;\n\n\t// Fill inner parts of the text. For example, if text is `foobarbaz` and both\n\t// `foo` and `baz` have matched into an entry, this will return a dummy entry\n\t// corresponding to `bar`.\n\tconst result = existingEntries.reduce<Part[]>((acc, textSegment) => {\n\t\tif (textSegment.start > position) {\n\t\t\tacc.push({\n\t\t\t\tstart: position,\n\t\t\t\tend: textSegment.start,\n\t\t\t});\n\t\t}\n\n\t\tposition = textSegment.end;\n\t\treturn acc;\n\t}, []);\n\n\t// Complete the unmatched end of the text with a dummy entry\n\tif (position < text.length) {\n\t\tresult.push({\n\t\t\tstart: position,\n\t\t\tend: text.length,\n\t\t});\n\t}\n\n\treturn result;\n}\n\nexport default fill;\n","import script from \"./ParsedMessage.vue?vue&type=script&lang=ts\"\nexport * from \"./ParsedMessage.vue?vue&type=script&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport parse from \"../js/helpers/parse\";\nimport type {ClientMessage, ClientNetwork} from \"../js/types\";\n\nexport default defineComponent({\n\tname: \"ParsedMessage\",\n\tfunctional: true,\n\tprops: {\n\t\ttext: String,\n\t\tmessage: {type: Object as PropType<ClientMessage | string>, required: false},\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: false},\n\t},\n\trender(context) {\n\t\treturn parse(\n\t\t\ttypeof context.text !== \"undefined\" ? context.text : context.message.text,\n\t\t\tcontext.message,\n\t\t\tcontext.network\n\t\t);\n\t},\n});\n</script>\n","<template>\n\t<span class=\"content\">\n\t\t<template v-if=\"message.from && message.from.nick\"\n\t\t\t><Username :user=\"message.from\" /> has changed the topic to:\n\t\t</template>\n\t\t<template v-else>The topic is: </template>\n\t\t<span v-if=\"message.text\" class=\"new-topic\"\n\t\t\t><ParsedMessage :network=\"network\" :message=\"message\"\n\t\t/></span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport type {ClientMessage, ClientNetwork} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeTopic\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./topic.vue?vue&type=template&id=fd1370ea&ts=true\"\nimport script from \"./topic.vue?vue&type=script&lang=ts\"\nexport * from \"./topic.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\t<i class=\"hostmask\"> (<ParsedMessage :network=\"network\" :text=\"message.hostmask\" />)</i> has\n\t\tleft the channel\n\t\t<i v-if=\"message.text\" class=\"part-reason\"\n\t\t\t>(<ParsedMessage :network=\"network\" :message=\"message\" />)</i\n\t\t>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypePart\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./part.vue?vue&type=template&id=0912be24&ts=true\"\nimport script from \"./part.vue?vue&type=script&lang=ts\"\nexport * from \"./part.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\tyour user mode is <b>{{ message.raw_modes }} </b>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\n\nexport default defineComponent({\n\tname: \"MessageChannelMode\",\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./mode_user.vue?vue&type=template&id=afc2368a&ts=true\"\nimport script from \"./mode_user.vue?vue&type=script&lang=ts\"\nexport * from \"./mode_user.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\t{{ ` ` }}\n\n\t\t<span class=\"ctcp-message\"><ParsedMessage :text=\"message.ctcpMessage\" /></span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeCTCP\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./ctcp.vue?vue&type=template&id=5cc606e9&ts=true\"\nimport script from \"./ctcp.vue?vue&type=script&lang=ts\"\nexport * from \"./ctcp.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span\n\t\t:class=\"['user', {[nickColor]: store.state.settings.coloredNicks}, {active: active}]\"\n\t\t:data-name=\"user.nick\"\n\t\trole=\"button\"\n\t\tv-on=\"onHover ? {mouseenter: hover} : {}\"\n\t\t@click.prevent=\"openContextMenu\"\n\t\t@contextmenu.prevent=\"openContextMenu\"\n\t\t><slot>{{ displayNick }} </slot></span\n\t>\n</template>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, PropType} from \"vue\";\nimport {UserInMessage} from \"../../shared/types/msg\";\nimport eventbus from \"../js/eventbus\";\nimport colorClass from \"../js/helpers/colorClass\";\nimport type {ClientChan, ClientNetwork} from \"../js/types\";\nimport {useStore} from \"../js/store\";\nimport {ChanState} from \"../../shared/types/chan\";\n\ntype UsernameUser = Partial<UserInMessage> & {\n\tmode?: string;\n\tnick: string;\n};\n\nexport default defineComponent({\n\tname: \"Username\",\n\tprops: {\n\t\tuser: {\n\t\t\t// TODO: UserInMessage shouldn't be necessary here.\n\t\t\ttype: Object as PropType<UsernameUser | UserInMessage>,\n\t\t\trequired: true,\n\t\t},\n\t\tactive: Boolean,\n\t\tonHover: {\n\t\t\ttype: Function as PropType<(user: UserInMessage) => void>,\n\t\t\trequired: false,\n\t\t},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: false},\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: false},\n\t},\n\tsetup(props) {\n\t\tconst mode = computed(() => {\n\t\t\t// Message objects have a singular mode, but user objects have modes array\n\t\t\tif (props.user.modes) {\n\t\t\t\treturn props.user.modes[0];\n\t\t\t}\n\n\t\t\treturn props.user.mode;\n\t\t});\n\n\t\t// TODO: Nick must be ! because our user prop union includes UserInMessage\n\t\tconst nickColor = computed(() => colorClass(props.user.nick));\n\n\t\tconst hover = () => {\n\t\t\tif (props.onHover) {\n\t\t\t\treturn props.onHover(props.user as UserInMessage);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\n\t\tconst openContextMenu = (event: Event) => {\n\t\t\teventbus.emit(\"contextmenu:user\", {\n\t\t\t\tevent: event,\n\t\t\t\tuser: props.user,\n\t\t\t\tnetwork: props.network,\n\t\t\t\tchannel: props.channel,\n\t\t\t});\n\t\t};\n\n\t\tconst store = useStore();\n\n\t\t// Add to autocomplete for bridged users (need to switch channel after connect if channel active on connect)\n\t\tif (\n\t\t\tstore.state.settings.beautifyBridgedMessages &&\n\t\t\tprops.user.shoutbox &&\n\t\t\tstore.state.activeChannel?.channel.state === ChanState.JOINED &&\n\t\t\t!store.state.activeChannel?.channel.users.find((u) => u.nick === props.user.nick)\n\t\t) {\n\t\t\tstore.state.activeChannel?.channel.users.push({\n\t\t\t\tnick: props.user.nick!,\n\t\t\t\tmodes: [],\n\t\t\t\tlastMessage: Date.now(),\n\t\t\t\tmode: \"\",\n\t\t\t\taway: \"\",\n\t\t\t});\n\t\t}\n\n\t\t// Allow adjusting nick display via setting\n\t\tconst displayNick = computed(() => {\n\t\t\tconst umode = mode.value ?? \"\";\n\t\t\tconst nick = props.user.nick!;\n\n\t\t\tif (\n\t\t\t\tstore.state.settings.beautifyBridgedMessages &&\n\t\t\t\tprops.user.shoutbox &&\n\t\t\t\tstore.state.settings.bridgedMessageNicksStyle === \"parentheses\"\n\t\t\t) {\n\t\t\t\treturn `(${umode}${nick})`;\n\t\t\t}\n\n\t\t\treturn `${umode}${nick}`;\n\t\t});\n\n\t\treturn {\n\t\t\tdisplayNick,\n\t\t\tmode,\n\t\t\tnickColor,\n\t\t\thover,\n\t\t\topenContextMenu,\n\t\t\tstore,\n\t\t};\n\t},\n});\n</script>\n","// Generates a string from \"color-1\" to \"color-32\" based on an input string\nexport default (str: string) => {\n\tlet hash = 0;\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\thash += str.charCodeAt(i);\n\t}\n\n\t/*\n\t\tModulo 32 lets us be case insensitive for ascii\n\t\tdue to A being ascii 65 (100 0001)\n\t\t while a being ascii 97 (110 0001)\n\t*/\n\treturn \"color-\" + (1 + (hash % 32)).toString();\n};\n","import { render } from \"./Username.vue?vue&type=template&id=1bc7b953&ts=true\"\nimport script from \"./Username.vue?vue&type=script&lang=ts\"\nexport * from \"./Username.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\tTopic set by\n\t\t<Username :user=\"message.from!\" />\n\t\ton {{ messageTimeLocale }}\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport localetime from \"../../js/helpers/localetime\";\nimport {computed, defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeTopicSetBy\",\n\tcomponents: {\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst messageTimeLocale = computed(() => localetime(props.message.when!));\n\n\t\treturn {\n\t\t\tmessageTimeLocale,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./topic_set_by.vue?vue&type=template&id=59d2c9b3&ts=true\"\nimport script from \"./topic_set_by.vue?vue&type=script&lang=ts\"\nexport * from \"./topic_set_by.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\tchannel mode is <b>{{ message.text }} </b>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\n\nexport default defineComponent({\n\tname: \"MessageChannelMode\",\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./mode_channel.vue?vue&type=template&id=08285cb4&ts=true\"\nimport script from \"./mode_channel.vue?vue&type=script&lang=ts\"\nexport * from \"./mode_channel.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import dayjs from \"dayjs\";\n\nexport default (time: Date | number) => dayjs(time).format(\"D MMMM YYYY, HH:mm:ss\");\n","const colorCodeMap = [\n\t[\"00\", \"White\"],\n\t[\"01\", \"Black\"],\n\t[\"02\", \"Blue\"],\n\t[\"03\", \"Green\"],\n\t[\"04\", \"Red\"],\n\t[\"05\", \"Brown\"],\n\t[\"06\", \"Magenta\"],\n\t[\"07\", \"Orange\"],\n\t[\"08\", \"Yellow\"],\n\t[\"09\", \"Light Green\"],\n\t[\"10\", \"Cyan\"],\n\t[\"11\", \"Light Cyan\"],\n\t[\"12\", \"Light Blue\"],\n\t[\"13\", \"Pink\"],\n\t[\"14\", \"Grey\"],\n\t[\"15\", \"Light Grey\"],\n];\n\nconst timeFormats = {\n\tmsgDefault: \"HH:mm\",\n\tmsgWithSeconds: \"HH:mm:ss\",\n\tmsg12h: \"hh:mm A\",\n\tmsg12hWithSeconds: \"hh:mm:ss A\",\n};\n\nexport default {\n\tcolorCodeMap,\n\tcommands: [] as string[],\n\ttimeFormats,\n\t// Same value as media query in CSS that forces sidebars to become overlays\n\tmobileViewportPixels: 768,\n};\n","export default (event: MouseEvent | Mousetrap.ExtendedKeyboardEvent) => {\n\tif (\n\t\t(event.target as HTMLElement).tagName !== \"TEXTAREA\" &&\n\t\t(event.target as HTMLElement).tagName !== \"INPUT\"\n\t) {\n\t\treturn false;\n\t}\n\n\t// If focus is in a textarea, do not handle keybinds if user has typed anything\n\t// This is done to prevent keyboard layout binds conflicting with ours\n\t// For example alt+shift+left on macos selects a word\n\treturn !!(event.target as HTMLInputElement | HTMLTextAreaElement).value;\n};\n","<template>\n\t<aside id=\"sidebar\" ref=\"sidebar\" :class=\"store.state.settings.compactSidebar ? 'compact' : ''\">\n\t\t<div class=\"scrollable-area\">\n\t\t\t<div class=\"logo-container\">\n\t\t\t\t<img\n\t\t\t\t\t:src=\"`img/logo-${isPublic() ? 'horizontal-' : ''}transparent-bg.svg`\"\n\t\t\t\t\tclass=\"logo\"\n\t\t\t\t\talt=\"The Lounge\"\n\t\t\t\t\trole=\"presentation\"\n\t\t\t\t/>\n\t\t\t\t<img\n\t\t\t\t\t:src=\"`img/logo-${isPublic() ? 'horizontal-' : ''}transparent-bg-inverted.svg`\"\n\t\t\t\t\tclass=\"logo-inverted\"\n\t\t\t\t\talt=\"The Lounge\"\n\t\t\t\t\trole=\"presentation\"\n\t\t\t\t/>\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"isDevelopment\"\n\t\t\t\t\ttitle=\"The Lounge has been built in development mode\"\n\t\t\t\t\t:style=\"{\n\t\t\t\t\t\tbackgroundColor: '#ff9e18',\n\t\t\t\t\t\tcolor: '#000',\n\t\t\t\t\t\tpadding: '2px',\n\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\tfontSize: '12px',\n\t\t\t\t\t}\"\n\t\t\t\t\t>DEVELOPER</span\n\t\t\t\t>\n\t\t\t</div>\n\t\t\t<NetworkList />\n\t\t</div>\n\t\t<footer id=\"footer\">\n\t\t\t<span\n\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-touch\"\n\t\t\t\taria-label=\"Connect to network\"\n\t\t\t\t><router-link\n\t\t\t\t\tv-slot:default=\"{navigate, isActive}\"\n\t\t\t\t\tto=\"/connect\"\n\t\t\t\t\trole=\"tab\"\n\t\t\t\t\taria-controls=\"connect\"\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\t:class=\"['icon', 'connect', {active: isActive}]\"\n\t\t\t\t\t\t:aria-selected=\"isActive\"\n\t\t\t\t\t\t@click=\"navigate\"\n\t\t\t\t\t\t@keypress.enter=\"navigate as (e?: KeyboardEvent) => void\"\n\t\t\t\t\t/> </router-link\n\t\t\t></span>\n\t\t\t<span class=\"tooltipped tooltipped-n tooltipped-no-touch\" aria-label=\"Settings\"\n\t\t\t\t><router-link\n\t\t\t\t\tv-slot:default=\"{navigate, isActive}\"\n\t\t\t\t\tto=\"/settings\"\n\t\t\t\t\trole=\"tab\"\n\t\t\t\t\taria-controls=\"settings\"\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\t:class=\"['icon', 'settings', {active: isActive}]\"\n\t\t\t\t\t\t:aria-selected=\"isActive\"\n\t\t\t\t\t\t@click=\"navigate\"\n\t\t\t\t\t\t@keypress.enter=\"navigate as (e?: KeyboardEvent) => void\"\n\t\t\t\t\t></button> </router-link\n\t\t\t></span>\n\t\t\t<span\n\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-touch\"\n\t\t\t\t:aria-label=\"\n\t\t\t\t\tstore.state.serverConfiguration?.isUpdateAvailable\n\t\t\t\t\t\t? 'Help\\n(update available)'\n\t\t\t\t\t\t: 'Help'\n\t\t\t\t\"\n\t\t\t\t><router-link\n\t\t\t\t\tv-slot:default=\"{navigate, isActive}\"\n\t\t\t\t\tto=\"/help\"\n\t\t\t\t\trole=\"tab\"\n\t\t\t\t\taria-controls=\"help\"\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\t:aria-selected=\"route.name === 'Help'\"\n\t\t\t\t\t\t:class=\"[\n\t\t\t\t\t\t\t'icon',\n\t\t\t\t\t\t\t'help',\n\t\t\t\t\t\t\t{notified: store.state.serverConfiguration?.isUpdateAvailable},\n\t\t\t\t\t\t\t{active: isActive},\n\t\t\t\t\t\t]\"\n\t\t\t\t\t\t@click=\"navigate\"\n\t\t\t\t\t\t@keypress.enter=\"navigate as (e?: KeyboardEvent) => void\"\n\t\t\t\t\t></button> </router-link\n\t\t\t></span>\n\t\t</footer>\n\t</aside>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, nextTick, onMounted, onUnmounted, PropType, ref} from \"vue\";\nimport {useRoute} from \"vue-router\";\nimport {useStore} from \"../js/store\";\nimport NetworkList from \"./NetworkList.vue\";\n\nexport default defineComponent({\n\tname: \"Sidebar\",\n\tcomponents: {\n\t\tNetworkList,\n\t},\n\tprops: {\n\t\toverlay: {type: Object as PropType<HTMLElement | null>, required: true},\n\t},\n\tsetup(props) {\n\t\tconst isDevelopment = process.env.NODE_ENV !== \"production\";\n\n\t\tconst store = useStore();\n\t\tconst route = useRoute();\n\n\t\tconst touchStartPos = ref<Touch | null>();\n\t\tconst touchCurPos = ref<Touch | null>();\n\t\tconst touchStartTime = ref<number>(0);\n\t\tconst menuWidth = ref<number>(0);\n\t\tconst menuIsMoving = ref<boolean>(false);\n\t\tconst menuIsAbsolute = ref<boolean>(false);\n\n\t\tconst sidebar = ref<HTMLElement | null>(null);\n\n\t\tconst toggle = (state: boolean) => {\n\t\t\tstore.commit(\"sidebarOpen\", state);\n\t\t};\n\n\t\tconst onTouchMove = (e: TouchEvent) => {\n\t\t\tconst touch = (touchCurPos.value = e.touches.item(0));\n\n\t\t\tif (\n\t\t\t\t!touch ||\n\t\t\t\t!touchStartPos.value ||\n\t\t\t\t!touchStartPos.value.screenX ||\n\t\t\t\t!touchStartPos.value.screenY\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet distX = touch.screenX - touchStartPos.value.screenX;\n\t\t\tconst distY = touch.screenY - touchStartPos.value.screenY;\n\n\t\t\tif (!menuIsMoving.value) {\n\t\t\t\t// tan(45°) is 1. Gestures in 0°-45° (< 1) are considered horizontal, so\n\t\t\t\t// menu must be open; gestures in 45°-90° (>1) are considered vertical, so\n\t\t\t\t// chat windows must be scrolled.\n\t\t\t\tif (Math.abs(distY / distX) >= 1) {\n\t\t\t\t\t// eslint-disable-next-line no-use-before-define\n\t\t\t\t\tonTouchEnd();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst devicePixelRatio = window.devicePixelRatio || 2;\n\n\t\t\t\tif (Math.abs(distX) > devicePixelRatio) {\n\t\t\t\t\tstore.commit(\"sidebarDragging\", true);\n\t\t\t\t\tmenuIsMoving.value = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Do not animate the menu on desktop view\n\t\t\tif (!menuIsAbsolute.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (store.state.sidebarOpen) {\n\t\t\t\tdistX += menuWidth.value;\n\t\t\t}\n\n\t\t\tif (distX > menuWidth.value) {\n\t\t\t\tdistX = menuWidth.value;\n\t\t\t} else if (distX < 0) {\n\t\t\t\tdistX = 0;\n\t\t\t}\n\n\t\t\tif (sidebar.value) {\n\t\t\t\tsidebar.value.style.transform = \"translate3d(\" + distX.toString() + \"px, 0, 0)\";\n\t\t\t}\n\n\t\t\tif (props.overlay) {\n\t\t\t\tprops.overlay.style.opacity = `${distX / menuWidth.value}`;\n\t\t\t}\n\t\t};\n\n\t\tconst onTouchEnd = () => {\n\t\t\tif (!touchStartPos.value?.screenX || !touchCurPos.value?.screenX) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst diff = touchCurPos.value.screenX - touchStartPos.value.screenX;\n\t\t\tconst absDiff = Math.abs(diff);\n\n\t\t\tif (\n\t\t\t\tabsDiff > menuWidth.value / 2 ||\n\t\t\t\t(Date.now() - touchStartTime.value < 180 && absDiff > 50)\n\t\t\t) {\n\t\t\t\ttoggle(diff > 0);\n\t\t\t}\n\n\t\t\tdocument.body.removeEventListener(\"touchmove\", onTouchMove);\n\t\t\tdocument.body.removeEventListener(\"touchend\", onTouchEnd);\n\n\t\t\tstore.commit(\"sidebarDragging\", false);\n\n\t\t\ttouchStartPos.value = null;\n\t\t\ttouchCurPos.value = null;\n\t\t\ttouchStartTime.value = 0;\n\t\t\tmenuIsMoving.value = false;\n\n\t\t\tvoid nextTick(() => {\n\t\t\t\tif (sidebar.value) {\n\t\t\t\t\tsidebar.value.style.transform = \"\";\n\t\t\t\t}\n\n\t\t\t\tif (props.overlay) {\n\t\t\t\t\tprops.overlay.style.opacity = \"\";\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tconst onTouchStart = (e: TouchEvent) => {\n\t\t\tif (!sidebar.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttouchStartPos.value = touchCurPos.value = e.touches.item(0);\n\n\t\t\tif (e.touches.length !== 1) {\n\t\t\t\tonTouchEnd();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst styles = window.getComputedStyle(sidebar.value);\n\n\t\t\tmenuWidth.value = parseFloat(styles.width);\n\t\t\tmenuIsAbsolute.value = styles.position === \"absolute\";\n\n\t\t\tif (\n\t\t\t\t!store.state.sidebarOpen ||\n\t\t\t\t(touchStartPos.value?.screenX && touchStartPos.value.screenX > menuWidth.value)\n\t\t\t) {\n\t\t\t\ttouchStartTime.value = Date.now();\n\n\t\t\t\tdocument.body.addEventListener(\"touchmove\", onTouchMove, {passive: true});\n\t\t\t\tdocument.body.addEventListener(\"touchend\", onTouchEnd, {passive: true});\n\t\t\t}\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\tdocument.body.addEventListener(\"touchstart\", onTouchStart, {passive: true});\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\tdocument.body.removeEventListener(\"touchstart\", onTouchStart);\n\t\t});\n\n\t\tconst isPublic = () => document.body.classList.contains(\"public\");\n\n\t\treturn {\n\t\t\tisDevelopment,\n\t\t\tstore,\n\t\t\troute,\n\t\t\tsidebar,\n\t\t\ttoggle,\n\t\t\tonTouchStart,\n\t\t\tonTouchMove,\n\t\t\tonTouchEnd,\n\t\t\tisPublic,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<div\n\t\tv-if=\"store.state.networks.length === 0\"\n\t\tclass=\"empty\"\n\t\trole=\"navigation\"\n\t\taria-label=\"Network and Channel list\"\n\t>\n\t\tYou are not connected to any networks yet.\n\t</div>\n\t<div v-else ref=\"networklist\" role=\"navigation\" aria-label=\"Network and Channel list\">\n\t\t<div v-if=\"store.state.settings.jumptoEabled\" class=\"jump-to-input\">\n\t\t\t<input\n\t\t\t\tref=\"searchInput\"\n\t\t\t\t:value=\"searchText\"\n\t\t\t\tplaceholder=\"Jump to...\"\n\t\t\t\ttype=\"search\"\n\t\t\t\tclass=\"search input mousetrap\"\n\t\t\t\taria-label=\"Search among the channel list\"\n\t\t\t\ttabindex=\"-1\"\n\t\t\t\t@input=\"setSearchText\"\n\t\t\t\t@keydown.up=\"navigateResults($event, -1)\"\n\t\t\t\t@keydown.down=\"navigateResults($event, 1)\"\n\t\t\t\t@keydown.page-up=\"navigateResults($event, -10)\"\n\t\t\t\t@keydown.page-down=\"navigateResults($event, 10)\"\n\t\t\t\t@keydown.enter=\"selectResult\"\n\t\t\t\t@keydown.escape=\"deactivateSearch\"\n\t\t\t\t@focus=\"activateSearch\"\n\t\t\t/>\n\t\t</div>\n\t\t<div v-if=\"searchText\" class=\"jump-to-results\">\n\t\t\t<div v-if=\"results.length\">\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"item in results\"\n\t\t\t\t\t:key=\"item.channel.id\"\n\t\t\t\t\t@mouseenter=\"setActiveSearchItem(item.channel)\"\n\t\t\t\t\t@click.prevent=\"selectResult\"\n\t\t\t\t>\n\t\t\t\t\t<Channel\n\t\t\t\t\t\tv-if=\"item.channel.type !== 'lobby'\"\n\t\t\t\t\t\t:channel=\"item.channel\"\n\t\t\t\t\t\t:network=\"item.network\"\n\t\t\t\t\t\t:active=\"item.channel === activeSearchItem\"\n\t\t\t\t\t\t:is-filtering=\"true\"\n\t\t\t\t\t/>\n\t\t\t\t\t<NetworkLobby\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:channel=\"item.channel\"\n\t\t\t\t\t\t:network=\"item.network\"\n\t\t\t\t\t\t:active=\"item.channel === activeSearchItem\"\n\t\t\t\t\t\t:is-filtering=\"true\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-else class=\"no-results\">No results found.</div>\n\t\t</div>\n\t\t<Draggable\n\t\t\tv-else\n\t\t\t:list=\"store.state.networks\"\n\t\t\t:delay=\"LONG_TOUCH_DURATION\"\n\t\t\t:delay-on-touch-only=\"true\"\n\t\t\t:touch-start-threshold=\"10\"\n\t\t\thandle=\".channel-list-item[data-type='lobby']\"\n\t\t\tdraggable=\".network\"\n\t\t\tghost-class=\"ui-sortable-ghost\"\n\t\t\tdrag-class=\"ui-sortable-dragging\"\n\t\t\tgroup=\"networks\"\n\t\t\tclass=\"networks\"\n\t\t\titem-key=\"uuid\"\n\t\t\t@change=\"onNetworkSort\"\n\t\t\t@choose=\"onDraggableChoose\"\n\t\t\t@unchoose=\"onDraggableUnchoose\"\n\t\t>\n\t\t\t<template v-slot:item=\"{element: network}\">\n\t\t\t\t<div\n\t\t\t\t\t:id=\"'network-' + network.uuid\"\n\t\t\t\t\t:key=\"network.uuid\"\n\t\t\t\t\t:class=\"{\n\t\t\t\t\t\tcollapsed: network.isCollapsed,\n\t\t\t\t\t\t'not-connected': !network.status.connected,\n\t\t\t\t\t\t'not-secure': !network.status.secure,\n\t\t\t\t\t}\"\n\t\t\t\t\tclass=\"network\"\n\t\t\t\t\trole=\"region\"\n\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t@touchstart=\"onDraggableTouchStart\"\n\t\t\t\t\t@touchmove=\"onDraggableTouchMove\"\n\t\t\t\t\t@touchend=\"onDraggableTouchEnd\"\n\t\t\t\t\t@touchcancel=\"onDraggableTouchEnd\"\n\t\t\t\t>\n\t\t\t\t\t<NetworkLobby\n\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t:is-join-channel-shown=\"network.isJoinChannelShown\"\n\t\t\t\t\t\t:active=\"\n\t\t\t\t\t\t\tstore.state.activeChannel &&\n\t\t\t\t\t\t\tnetwork.channels[0] === store.state.activeChannel.channel\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t@toggle-join-channel=\"\n\t\t\t\t\t\t\tnetwork.isJoinChannelShown = !network.isJoinChannelShown\n\t\t\t\t\t\t\"\n\t\t\t\t\t/>\n\t\t\t\t\t<JoinChannel\n\t\t\t\t\t\tv-if=\"network.isJoinChannelShown\"\n\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t:channel=\"network.channels[0]\"\n\t\t\t\t\t\t@toggle-join-channel=\"\n\t\t\t\t\t\t\tnetwork.isJoinChannelShown = !network.isJoinChannelShown\n\t\t\t\t\t\t\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t<Draggable\n\t\t\t\t\t\tdraggable=\".channel-list-item\"\n\t\t\t\t\t\tghost-class=\"ui-sortable-ghost\"\n\t\t\t\t\t\tdrag-class=\"ui-sortable-dragging\"\n\t\t\t\t\t\t:group=\"network.uuid\"\n\t\t\t\t\t\t:list=\"network.channels\"\n\t\t\t\t\t\t:delay=\"LONG_TOUCH_DURATION\"\n\t\t\t\t\t\t:delay-on-touch-only=\"true\"\n\t\t\t\t\t\t:touch-start-threshold=\"10\"\n\t\t\t\t\t\tclass=\"channels\"\n\t\t\t\t\t\titem-key=\"name\"\n\t\t\t\t\t\t@change=\"onChannelSort\"\n\t\t\t\t\t\t@choose=\"onDraggableChoose\"\n\t\t\t\t\t\t@unchoose=\"onDraggableUnchoose\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template v-slot:item=\"{element: channel, index}\">\n\t\t\t\t\t\t\t<Channel\n\t\t\t\t\t\t\t\tv-if=\"index > 0 && channel.type !== 'query'\"\n\t\t\t\t\t\t\t\t:key=\"channel.id\"\n\t\t\t\t\t\t\t\t:data-item=\"channel.id\"\n\t\t\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t\t:active=\"\n\t\t\t\t\t\t\t\t\tstore.state.activeChannel &&\n\t\t\t\t\t\t\t\t\tchannel === store.state.activeChannel.channel\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</Draggable>\n\n\t\t\t\t\t<DirectMessageSection\n\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t:queries=\"network.channels.filter((c) => c.type === 'query')\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</Draggable>\n\t</div>\n</template>\n\n<style>\n.jump-to-input {\n\tmargin: 8px;\n\tposition: relative;\n}\n\n.jump-to-input .input {\n\tmargin: 0;\n\twidth: 100%;\n\tborder: 0;\n\tcolor: #fff;\n\tbackground-color: rgb(255 255 255 / 10%);\n\tpadding-right: 35px;\n\tappearance: none;\n}\n\n.jump-to-input .input::placeholder {\n\tcolor: rgb(255 255 255 / 35%);\n}\n\n.jump-to-input::before {\n\tcontent: \"\\f002\"; /* http://fontawesome.io/icon/search/ */\n\tcolor: rgb(255 255 255 / 35%);\n\tposition: absolute;\n\tright: 8px;\n\ttop: 0;\n\tbottom: 0;\n\tpointer-events: none;\n\tline-height: 35px !important;\n}\n\n.jump-to-results {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n\toverflow: auto;\n}\n\n.jump-to-results .no-results {\n\tmargin: 14px 8px;\n\ttext-align: center;\n}\n\n.jump-to-results .channel-list-item.active {\n\tcursor: pointer;\n}\n\n.jump-to-results .channel-list-item .add-channel,\n.jump-to-results .channel-list-item .close-tooltip {\n\tdisplay: none;\n}\n\n.jump-to-results .channel-list-item[data-type=\"lobby\"] {\n\tpadding: 8px 14px;\n}\n\n.jump-to-results .channel-list-item[data-type=\"lobby\"]::before {\n\tcontent: \"\\f233\";\n}\n</style>\n\n<script lang=\"ts\">\nimport {computed, watch, defineComponent, nextTick, onBeforeUnmount, onMounted, ref} from \"vue\";\n\nimport Mousetrap from \"mousetrap\";\nimport Draggable from \"./Draggable.vue\";\nimport {filter as fuzzyFilter} from \"fuzzy\";\nimport NetworkLobby from \"./NetworkLobby.vue\";\nimport Channel from \"./Channel.vue\";\nimport JoinChannel from \"./JoinChannel.vue\";\nimport DirectMessageSection from \"./DirectMessageSection.vue\";\n\nimport socket from \"../js/socket\";\nimport collapseNetworkHelper from \"../js/helpers/collapseNetwork\";\nimport isIgnoredKeybind from \"../js/helpers/isIgnoredKeybind\";\nimport distance from \"../js/helpers/distance\";\nimport eventbus from \"../js/eventbus\";\nimport {ClientChan, NetChan, type SortableEvent} from \"../js/types\";\nimport {useStore} from \"../js/store\";\nimport {switchToChannel} from \"../js/router\";\nimport Sortable from \"sortablejs\";\n\nexport default defineComponent({\n\tname: \"NetworkList\",\n\tcomponents: {\n\t\tJoinChannel,\n\t\tNetworkLobby,\n\t\tChannel,\n\t\tDraggable,\n\t\tDirectMessageSection,\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\t\tconst searchText = ref(\"\");\n\t\tconst activeSearchItem = ref<ClientChan | null>();\n\t\t// Number of milliseconds a touch has to last to be considered long\n\t\tconst LONG_TOUCH_DURATION = 500;\n\n\t\tconst startDrag = ref<[number, number] | null>();\n\t\tconst searchInput = ref<HTMLInputElement | null>(null);\n\t\tconst networklist = ref<HTMLDivElement | null>(null);\n\n\t\tconst sidebarWasClosed = ref(false);\n\n\t\tconst moveItemInArray = <T,>(array: T[], from: number, to: number) => {\n\t\t\tconst item = array.splice(from, 1)[0];\n\t\t\tarray.splice(to, 0, item);\n\t\t};\n\n\t\tconst items = computed(() => {\n\t\t\tconst newItems: NetChan[] = [];\n\n\t\t\tfor (const network of store.state.networks) {\n\t\t\t\tfor (const channel of network.channels) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tstore.state.activeChannel &&\n\t\t\t\t\t\tchannel === store.state.activeChannel.channel\n\t\t\t\t\t) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tnewItems.push({network, channel});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn newItems;\n\t\t});\n\n\t\tconst results = computed(() => {\n\t\t\tconst newResults = fuzzyFilter(searchText.value, items.value, {\n\t\t\t\textract: (item) => item.channel.name,\n\t\t\t}).map((item) => item.original);\n\n\t\t\treturn newResults;\n\t\t});\n\n\t\tconst collapseNetwork = (event: Mousetrap.ExtendedKeyboardEvent) => {\n\t\t\tif (isIgnoredKeybind(event)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (store.state.activeChannel) {\n\t\t\t\tcollapseNetworkHelper(store.state.activeChannel.network, true);\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\tconst expandNetwork = (event: Mousetrap.ExtendedKeyboardEvent) => {\n\t\t\tif (isIgnoredKeybind(event)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (store.state.activeChannel) {\n\t\t\t\tcollapseNetworkHelper(store.state.activeChannel.network, false);\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\tconst onNetworkSort = (e: Sortable.SortableEvent) => {\n\t\t\tconst {oldIndex, newIndex} = e;\n\n\t\t\tif (oldIndex === undefined || newIndex === undefined || oldIndex === newIndex) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmoveItemInArray(store.state.networks, oldIndex, newIndex);\n\n\t\t\tsocket.emit(\"sort:networks\", {\n\t\t\t\torder: store.state.networks.map((n) => n.uuid),\n\t\t\t});\n\t\t};\n\n\t\tconst onChannelSort = (e: Sortable.SortableEvent) => {\n\t\t\tlet {oldIndex, newIndex} = e;\n\n\t\t\tif (oldIndex === undefined || newIndex === undefined || oldIndex === newIndex) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Indexes are offset by one due to the lobby\n\t\t\toldIndex += 1;\n\t\t\tnewIndex += 1;\n\n\t\t\tconst unparsedId = e.item.getAttribute(\"data-item\");\n\n\t\t\tif (!unparsedId) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst id = parseInt(unparsedId);\n\t\t\tconst netChan = store.getters.findChannel(id);\n\n\t\t\tif (!netChan) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmoveItemInArray(netChan.network.channels, oldIndex, newIndex);\n\n\t\t\tsocket.emit(\"sort:channels\", {\n\t\t\t\tnetwork: netChan.network.uuid,\n\t\t\t\torder: netChan.network.channels.map((c) => c.id),\n\t\t\t});\n\t\t};\n\n\t\tconst isTouchEvent = (event: Event): boolean => {\n\t\t\t// This is the same way Sortable.js detects a touch event. See\n\t\t\t// SortableJS/Sortable@daaefeda:/src/Sortable.js#L465\n\n\t\t\treturn !!(\n\t\t\t\t((event as TouchEvent).touches && (event as TouchEvent).touches[0]) ||\n\t\t\t\t((event as PointerEvent).pointerType &&\n\t\t\t\t\t(event as PointerEvent).pointerType === \"touch\")\n\t\t\t);\n\t\t};\n\n\t\tconst onDraggableChoose = (event: SortableEvent) => {\n\t\t\tconst original = event.originalEvent;\n\n\t\t\tif (isTouchEvent(original)) {\n\t\t\t\t// onDrag is only triggered when the user actually moves the\n\t\t\t\t// dragged object but onChoose is triggered as soon as the\n\t\t\t\t// item is eligible for dragging. This gives us an opportunity\n\t\t\t\t// to tell the user they've held the touch long enough.\n\t\t\t\tevent.item.classList.add(\"ui-sortable-dragging-touch-cue\");\n\n\t\t\t\tif (original instanceof TouchEvent && original.touches.length > 0) {\n\t\t\t\t\tstartDrag.value = [original.touches[0].clientX, original.touches[0].clientY];\n\t\t\t\t} else if (original instanceof PointerEvent) {\n\t\t\t\t\tstartDrag.value = [original.clientX, original.clientY];\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst onDraggableUnchoose = (event: SortableEvent) => {\n\t\t\tevent.item.classList.remove(\"ui-sortable-dragging-touch-cue\");\n\t\t\tstartDrag.value = null;\n\t\t};\n\n\t\tconst onDraggableTouchStart = (event: TouchEvent) => {\n\t\t\tif (event.touches.length === 1) {\n\t\t\t\t// This prevents an iOS long touch default behavior: selecting\n\t\t\t\t// the nearest selectable text.\n\t\t\t\tdocument.body.classList.add(\"force-no-select\");\n\t\t\t}\n\t\t};\n\n\t\tconst onDraggableTouchMove = (event: TouchEvent) => {\n\t\t\tif (startDrag.value && event.touches.length > 0) {\n\t\t\t\tconst touch = event.touches[0];\n\t\t\t\tconst currentPosition = [touch.clientX, touch.clientY];\n\n\t\t\t\tif (distance(startDrag.value, currentPosition as [number, number]) > 10) {\n\t\t\t\t\t// Context menu is shown on Android after long touch.\n\t\t\t\t\t// Dismiss it now that we're sure the user is dragging.\n\t\t\t\t\teventbus.emit(\"contextmenu:cancel\");\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst onDraggableTouchEnd = (event: TouchEvent) => {\n\t\t\tif (event.touches.length === 0) {\n\t\t\t\tdocument.body.classList.remove(\"force-no-select\");\n\t\t\t}\n\t\t};\n\n\t\tconst activateSearch = () => {\n\t\t\tif (searchInput.value === document.activeElement) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsidebarWasClosed.value = store.state.sidebarOpen ? false : true;\n\t\t\tstore.commit(\"sidebarOpen\", true);\n\n\t\t\tvoid nextTick(() => {\n\t\t\t\tsearchInput.value?.focus();\n\t\t\t});\n\t\t};\n\n\t\tconst deactivateSearch = () => {\n\t\t\tactiveSearchItem.value = null;\n\t\t\tsearchText.value = \"\";\n\t\t\tsearchInput.value?.blur();\n\n\t\t\tif (sidebarWasClosed.value) {\n\t\t\t\tstore.commit(\"sidebarOpen\", false);\n\t\t\t}\n\t\t};\n\n\t\tconst toggleSearch = (event: Mousetrap.ExtendedKeyboardEvent) => {\n\t\t\tif (isIgnoredKeybind(event)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (searchInput.value === document.activeElement) {\n\t\t\t\tdeactivateSearch();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tactivateSearch();\n\t\t\treturn false;\n\t\t};\n\n\t\tconst setSearchText = (e: Event) => {\n\t\t\tsearchText.value = (e.target as HTMLInputElement).value;\n\t\t};\n\n\t\tconst setActiveSearchItem = (channel?: ClientChan) => {\n\t\t\tif (!results.value.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!channel) {\n\t\t\t\tchannel = results.value[0].channel;\n\t\t\t}\n\n\t\t\tactiveSearchItem.value = channel;\n\t\t};\n\n\t\tconst scrollToActive = () => {\n\t\t\t// Scroll the list if needed after the active class is applied\n\t\t\tvoid nextTick(() => {\n\t\t\t\tconst el = networklist.value?.querySelector(\".channel-list-item.active\");\n\n\t\t\t\tif (el) {\n\t\t\t\t\tel.scrollIntoView({block: \"nearest\", inline: \"nearest\"});\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tconst selectResult = () => {\n\t\t\tif (!searchText.value || !results.value.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (activeSearchItem.value) {\n\t\t\t\tswitchToChannel(activeSearchItem.value);\n\t\t\t\tdeactivateSearch();\n\t\t\t\tscrollToActive();\n\t\t\t}\n\t\t};\n\n\t\tconst navigateResults = (event: Event, direction: number) => {\n\t\t\t// Prevent propagation to stop global keybind handler from capturing pagedown/pageup\n\t\t\t// and redirecting it to the message list container for scrolling\n\t\t\tevent.stopImmediatePropagation();\n\t\t\tevent.preventDefault();\n\n\t\t\tif (!searchText.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst channels = results.value.map((r) => r.channel);\n\n\t\t\t// Bail out if there's no channels to select\n\t\t\tif (!channels.length) {\n\t\t\t\tactiveSearchItem.value = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet currentIndex = activeSearchItem.value\n\t\t\t\t? channels.indexOf(activeSearchItem.value)\n\t\t\t\t: -1;\n\n\t\t\t// If there's no active channel select the first or last one depending on direction\n\t\t\tif (!activeSearchItem.value || currentIndex === -1) {\n\t\t\t\tactiveSearchItem.value = direction ? channels[0] : channels[channels.length - 1];\n\t\t\t\tscrollToActive();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcurrentIndex += direction;\n\n\t\t\t// Wrap around the list if necessary. Normaly each loop iterates once at most,\n\t\t\t// but might iterate more often if pgup or pgdown are used in a very short list\n\t\t\twhile (currentIndex < 0) {\n\t\t\t\tcurrentIndex += channels.length;\n\t\t\t}\n\n\t\t\twhile (currentIndex > channels.length - 1) {\n\t\t\t\tcurrentIndex -= channels.length;\n\t\t\t}\n\n\t\t\tactiveSearchItem.value = channels[currentIndex];\n\t\t\tscrollToActive();\n\t\t};\n\n\t\twatch(searchText, () => {\n\t\t\tsetActiveSearchItem();\n\t\t});\n\n\t\tonMounted(() => {\n\t\t\tMousetrap.bind(\"alt+shift+right\", expandNetwork);\n\t\t\tMousetrap.bind(\"alt+shift+left\", collapseNetwork);\n\t\t\tMousetrap.bind(\"alt+j\", toggleSearch);\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\tMousetrap.unbind(\"alt+shift+right\");\n\t\t\tMousetrap.unbind(\"alt+shift+left\");\n\t\t\tMousetrap.unbind(\"alt+j\");\n\t\t});\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tnetworklist,\n\t\t\tsearchInput,\n\t\t\tsearchText,\n\t\t\tresults,\n\t\t\tactiveSearchItem,\n\t\t\tLONG_TOUCH_DURATION,\n\n\t\t\tactivateSearch,\n\t\t\tdeactivateSearch,\n\t\t\ttoggleSearch,\n\t\t\tsetSearchText,\n\t\t\tsetActiveSearchItem,\n\t\t\tscrollToActive,\n\t\t\tselectResult,\n\t\t\tnavigateResults,\n\t\t\tonChannelSort,\n\t\t\tonNetworkSort,\n\t\t\tonDraggableTouchStart,\n\t\t\tonDraggableTouchMove,\n\t\t\tonDraggableTouchEnd,\n\t\t\tonDraggableChoose,\n\t\t\tonDraggableUnchoose,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<div ref=\"containerRef\" :class=\"$props.class\">\n\t\t<slot\n\t\t\tv-for=\"(item, index) of list\"\n\t\t\t:key=\"item[itemKey]\"\n\t\t\t:element=\"item\"\n\t\t\t:index=\"index\"\n\t\t\tname=\"item\"\n\t\t></slot>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, ref, PropType, watch, onBeforeUnmount} from \"vue\";\nimport Sortable from \"sortablejs\";\n\nconst Props = {\n\tdelay: {\n\t\ttype: Number,\n\t\tdefault: 0,\n\t\trequired: false,\n\t},\n\tdelayOnTouchOnly: {\n\t\ttype: Boolean,\n\t\tdefault: false,\n\t\trequired: false,\n\t},\n\ttouchStartThreshold: {\n\t\ttype: Number,\n\t\tdefault: 10,\n\t\trequired: false,\n\t},\n\thandle: {\n\t\ttype: String,\n\t\tdefault: \"\",\n\t\trequired: false,\n\t},\n\tdraggable: {\n\t\ttype: String,\n\t\tdefault: \"\",\n\t\trequired: false,\n\t},\n\tghostClass: {\n\t\ttype: String,\n\t\tdefault: \"\",\n\t\trequired: false,\n\t},\n\tdragClass: {\n\t\ttype: String,\n\t\tdefault: \"\",\n\t\trequired: false,\n\t},\n\tgroup: {\n\t\ttype: String,\n\t\tdefault: \"\",\n\t\trequired: false,\n\t},\n\tclass: {\n\t\ttype: String,\n\t\tdefault: \"\",\n\t\trequired: false,\n\t},\n\titemKey: {\n\t\ttype: String,\n\t\tdefault: \"\",\n\t\trequired: true,\n\t},\n\tlist: {\n\t\ttype: Array as PropType<Record<string, unknown>[]>,\n\t\tdefault: [],\n\t\trequired: true,\n\t},\n\tfilter: {\n\t\ttype: String,\n\t\tdefault: \"\",\n\t\trequired: false,\n\t},\n};\n\nexport default defineComponent({\n\tname: \"Draggable\",\n\tprops: Props,\n\temits: [\"change\", \"choose\", \"unchoose\"],\n\tsetup(props, {emit}) {\n\t\tconst containerRef = ref<HTMLElement | null>(null);\n\t\tconst sortable = ref<Sortable | null>(null);\n\n\t\twatch(containerRef, (newDraggable) => {\n\t\t\tif (newDraggable) {\n\t\t\t\tsortable.value = new Sortable(newDraggable, {\n\t\t\t\t\t...props,\n\n\t\t\t\t\tonChoose(event) {\n\t\t\t\t\t\temit(\"choose\", event);\n\t\t\t\t\t},\n\n\t\t\t\t\tonUnchoose(event) {\n\t\t\t\t\t\temit(\"unchoose\", event);\n\t\t\t\t\t},\n\n\t\t\t\t\tonEnd(event) {\n\t\t\t\t\t\temit(\"change\", event);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\tif (sortable.value) {\n\t\t\t\tsortable.value.destroy();\n\t\t\t\tcontainerRef.value = null;\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tcontainerRef,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./Draggable.vue?vue&type=template&id=1abd7f3a&ts=true\"\nimport script from \"./Draggable.vue?vue&type=script&lang=ts\"\nexport * from \"./Draggable.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<ChannelWrapper v-bind=\"$props\" :channel=\"channel\">\n\t\t<button\n\t\t\tv-if=\"network.channels.length > 1\"\n\t\t\t:aria-controls=\"'network-' + network.uuid\"\n\t\t\t:aria-label=\"getExpandLabel(network)\"\n\t\t\t:aria-expanded=\"!network.isCollapsed\"\n\t\t\tclass=\"collapse-network\"\n\t\t\t@click.stop=\"onCollapseClick\"\n\t\t>\n\t\t\t<span class=\"collapse-network-icon\" />\n\t\t</button>\n\t\t<span v-else class=\"collapse-network\" />\n\t\t<div class=\"lobby-wrap\">\n\t\t\t<span :title=\"channel.name\" class=\"name\">{{ channel.name }}</span>\n\t\t\t<span\n\t\t\t\tv-if=\"network.status.connected && !network.status.secure\"\n\t\t\t\tclass=\"not-secure-tooltip tooltipped tooltipped-w\"\n\t\t\t\taria-label=\"Insecure connection\"\n\t\t\t>\n\t\t\t\t<span class=\"not-secure-icon\" />\n\t\t\t</span>\n\t\t\t<span\n\t\t\t\tv-if=\"!network.status.connected\"\n\t\t\t\tclass=\"not-connected-tooltip tooltipped tooltipped-w\"\n\t\t\t\taria-label=\"Disconnected\"\n\t\t\t>\n\t\t\t\t<span class=\"not-connected-icon\" />\n\t\t\t</span>\n\t\t\t<span v-if=\"channel.unread\" :class=\"{highlight: channel.highlight}\" class=\"badge\">{{\n\t\t\t\tunreadCount\n\t\t\t}}</span>\n\t\t</div>\n\t\t<span\n\t\t\t:aria-label=\"joinChannelLabel\"\n\t\t\tclass=\"add-channel-tooltip tooltipped tooltipped-w tooltipped-no-touch\"\n\t\t>\n\t\t\t<button\n\t\t\t\t:class=\"['add-channel', {opened: isJoinChannelShown}]\"\n\t\t\t\t:aria-controls=\"'join-channel-' + channel.id\"\n\t\t\t\t:aria-label=\"joinChannelLabel\"\n\t\t\t\t@click.stop=\"$emit('toggle-join-channel')\"\n\t\t\t/>\n\t\t</span>\n\t</ChannelWrapper>\n</template>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, PropType} from \"vue\";\nimport collapseNetwork from \"../js/helpers/collapseNetwork\";\nimport roundBadgeNumber from \"../js/helpers/roundBadgeNumber\";\nimport ChannelWrapper from \"./ChannelWrapper.vue\";\n\nimport type {ClientNetwork} from \"../js/types\";\n\nexport default defineComponent({\n\tname: \"Channel\",\n\tcomponents: {\n\t\tChannelWrapper,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tisJoinChannelShown: Boolean,\n\t\tactive: Boolean,\n\t\tisFiltering: Boolean,\n\t},\n\temits: [\"toggle-join-channel\"],\n\tsetup(props) {\n\t\tconst channel = computed(() => {\n\t\t\treturn props.network.channels[0];\n\t\t});\n\n\t\tconst joinChannelLabel = computed(() => {\n\t\t\treturn props.isJoinChannelShown ? \"Cancel\" : \"Join a channel…\";\n\t\t});\n\n\t\tconst unreadCount = computed(() => {\n\t\t\treturn roundBadgeNumber(channel.value.unread);\n\t\t});\n\n\t\tconst onCollapseClick = () => {\n\t\t\tcollapseNetwork(props.network, !props.network.isCollapsed);\n\t\t};\n\n\t\tconst getExpandLabel = (network: ClientNetwork) => {\n\t\t\treturn network.isCollapsed ? \"Expand\" : \"Collapse\";\n\t\t};\n\n\t\treturn {\n\t\t\tchannel,\n\t\t\tjoinChannelLabel,\n\t\t\tunreadCount,\n\t\t\tonCollapseClick,\n\t\t\tgetExpandLabel,\n\t\t};\n\t},\n});\n</script>\n","import storage from \"../localStorage\";\n\nexport default (network, isCollapsed) => {\n\tconst stored = storage.get(\"thelounge.networks.collapsed\");\n\tconst networks = stored ? new Set(JSON.parse(stored)) : new Set();\n\n\tnetwork.isCollapsed = isCollapsed;\n\n\tif (isCollapsed) {\n\t\tnetworks.add(network.uuid);\n\t} else {\n\t\tnetworks.delete(network.uuid);\n\t}\n\n\tstorage.set(\"thelounge.networks.collapsed\", JSON.stringify([...networks]));\n};\n","export default (count: number) => {\n\tif (count < 1000) {\n\t\treturn count.toString();\n\t}\n\n\treturn (count / 1000).toFixed(2).slice(0, -1) + \"k\";\n};\n","import {store} from \"../store\";\n\nexport default (network, channel) => {\n\tif (!network.isCollapsed || channel.highlight || channel.type === \"lobby\") {\n\t\treturn false;\n\t}\n\n\tif (store.state.activeChannel && channel === store.state.activeChannel.channel) {\n\t\treturn false;\n\t}\n\n\treturn true;\n};\n","<template>\n\t<div id=\"sign-in\" class=\"window\" role=\"tabpanel\" aria-label=\"Sign-in\">\n\t\t<form class=\"container\" method=\"post\" action=\"\" @submit=\"onSubmit\">\n\t\t\t<img\n\t\t\t\tsrc=\"img/logo-vertical-transparent-bg.svg\"\n\t\t\t\tclass=\"logo\"\n\t\t\t\talt=\"The Lounge\"\n\t\t\t\twidth=\"256\"\n\t\t\t\theight=\"170\"\n\t\t\t/>\n\t\t\t<img\n\t\t\t\tsrc=\"img/logo-vertical-transparent-bg-inverted.svg\"\n\t\t\t\tclass=\"logo-inverted\"\n\t\t\t\talt=\"The Lounge\"\n\t\t\t\twidth=\"256\"\n\t\t\t\theight=\"170\"\n\t\t\t/>\n\n\t\t\t<label for=\"signin-username\">Username</label>\n\t\t\t<input\n\t\t\t\tid=\"signin-username\"\n\t\t\t\tv-model.trim=\"username\"\n\t\t\t\tclass=\"input\"\n\t\t\t\ttype=\"text\"\n\t\t\t\tname=\"username\"\n\t\t\t\tautocapitalize=\"none\"\n\t\t\t\tautocorrect=\"off\"\n\t\t\t\tautocomplete=\"username\"\n\t\t\t\trequired\n\t\t\t\tautofocus\n\t\t\t/>\n\n\t\t\t<div class=\"password-container\">\n\t\t\t\t<label for=\"signin-password\">Password</label>\n\t\t\t\t<RevealPassword v-slot:default=\"slotProps\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"signin-password\"\n\t\t\t\t\t\tv-model=\"password\"\n\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tautocapitalize=\"none\"\n\t\t\t\t\t\tautocorrect=\"off\"\n\t\t\t\t\t\tautocomplete=\"current-password\"\n\t\t\t\t\t\trequired\n\t\t\t\t\t/>\n\t\t\t\t</RevealPassword>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"errorShown\" class=\"error\">Authentication failed.</div>\n\n\t\t\t<button :disabled=\"inFlight\" type=\"submit\" class=\"btn\">Sign in</button>\n\t\t</form>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport storage from \"../../js/localStorage\";\nimport socket from \"../../js/socket\";\nimport RevealPassword from \"../RevealPassword.vue\";\nimport {defineComponent, onBeforeUnmount, onMounted, ref} from \"vue\";\n\nexport default defineComponent({\n\tname: \"SignIn\",\n\tcomponents: {\n\t\tRevealPassword,\n\t},\n\tsetup() {\n\t\tconst inFlight = ref(false);\n\t\tconst errorShown = ref(false);\n\n\t\tconst username = ref(storage.get(\"user\") || \"\");\n\t\tconst password = ref(\"\");\n\n\t\tconst onAuthFailed = () => {\n\t\t\tinFlight.value = false;\n\t\t\terrorShown.value = true;\n\t\t};\n\n\t\tconst onSubmit = (event: Event) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tif (!username.value || !password.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tinFlight.value = true;\n\t\t\terrorShown.value = false;\n\n\t\t\tconst values = {\n\t\t\t\tuser: username.value,\n\t\t\t\tpassword: password.value,\n\t\t\t};\n\n\t\t\tstorage.set(\"user\", values.user);\n\n\t\t\tsocket.emit(\"auth:perform\", values);\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\tsocket.on(\"auth:failed\", onAuthFailed);\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\tsocket.off(\"auth:failed\", onAuthFailed);\n\t\t});\n\n\t\treturn {\n\t\t\tinFlight,\n\t\t\terrorShown,\n\t\t\tusername,\n\t\t\tpassword,\n\t\t\tonSubmit,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<div>\n\t\t<slot :is-visible=\"isVisible\" />\n\t\t<span\n\t\t\tref=\"revealButton\"\n\t\t\ttype=\"button\"\n\t\t\t:class=\"[\n\t\t\t\t'reveal-password tooltipped tooltipped-n tooltipped-no-delay',\n\t\t\t\t{'reveal-password-visible': isVisible},\n\t\t\t]\"\n\t\t\t:aria-label=\"isVisible ? 'Hide password' : 'Show password'\"\n\t\t\t@click=\"onClick\"\n\t\t>\n\t\t\t<span :aria-label=\"isVisible ? 'Hide password' : 'Show password'\" />\n\t\t</span>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, ref} from \"vue\";\n\nexport default defineComponent({\n\tname: \"RevealPassword\",\n\tsetup() {\n\t\tconst isVisible = ref(false);\n\n\t\tconst onClick = () => {\n\t\t\tisVisible.value = !isVisible.value;\n\t\t};\n\n\t\treturn {\n\t\t\tisVisible,\n\t\t\tonClick,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./RevealPassword.vue?vue&type=template&id=5df695c1&ts=true\"\nimport script from \"./RevealPassword.vue?vue&type=script&lang=ts\"\nexport * from \"./RevealPassword.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./SignIn.vue?vue&type=template&id=125b45a5&ts=true\"\nimport script from \"./SignIn.vue?vue&type=script&lang=ts\"\nexport * from \"./SignIn.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div id=\"connect\" class=\"window\" role=\"tabpanel\" aria-label=\"Connect\">\n\t\t<div class=\"header\">\n\t\t\t<SidebarToggle />\n\t\t</div>\n\t\t<form class=\"container\" method=\"post\" action=\"\" @submit.prevent=\"onSubmit\">\n\t\t\t<h1 class=\"title\">\n\t\t\t\t<template v-if=\"defaults.uuid\">\n\t\t\t\t\t<input v-model=\"defaults.uuid\" type=\"hidden\" name=\"uuid\" />\n\t\t\t\t\tEdit {{ defaults.name }}\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\tConnect\n\t\t\t\t\t<template\n\t\t\t\t\t\tv-if=\"config?.lockNetwork && store?.state.serverConfiguration?.public\"\n\t\t\t\t\t>\n\t\t\t\t\t\tto {{ defaults.name }}\n\t\t\t\t\t</template>\n\t\t\t\t</template>\n\t\t\t</h1>\n\t\t\t<template v-if=\"!config?.lockNetwork\">\n\t\t\t\t<h2>Network settings</h2>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:name\">Name</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"connect:name\"\n\t\t\t\t\t\tv-model.trim=\"defaults.name\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:host\">Server</label>\n\t\t\t\t\t<div class=\"input-wrap\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:host\"\n\t\t\t\t\t\t\tv-model.trim=\"defaults.host\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\tname=\"host\"\n\t\t\t\t\t\t\taria-label=\"Server address\"\n\t\t\t\t\t\t\tmaxlength=\"255\"\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span id=\"connect:portseparator\">:</span>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:port\"\n\t\t\t\t\t\t\tv-model=\"defaults.port\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\t\tmax=\"65535\"\n\t\t\t\t\t\t\tname=\"port\"\n\t\t\t\t\t\t\taria-label=\"Server port\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:password\">Password</label>\n\t\t\t\t\t<RevealPassword\n\t\t\t\t\t\tv-slot:default=\"slotProps\"\n\t\t\t\t\t\tclass=\"input-wrap password-container\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:password\"\n\t\t\t\t\t\t\tv-model=\"defaults.password\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\tplaceholder=\"Server password (optional)\"\n\t\t\t\t\t\t\tname=\"password\"\n\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</RevealPassword>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label></label>\n\t\t\t\t\t<div class=\"input-wrap\">\n\t\t\t\t\t\t<label class=\"tls\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tv-model=\"defaults.tls\"\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\tname=\"tls\"\n\t\t\t\t\t\t\t\t:disabled=\"defaults.hasSTSPolicy\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\tUse secure connection (TLS)\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-if=\"defaults.hasSTSPolicy\"\n\t\t\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\t\t\taria-label=\"This network has a strict transport security policy, you will be unable to disable TLS\"\n\t\t\t\t\t\t\t\t>🔒 STS</span\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<label class=\"tls\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tv-model=\"defaults.rejectUnauthorized\"\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\tname=\"rejectUnauthorized\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\tOnly allow trusted certificates\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<h2>Proxy Settings</h2>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label></label>\n\t\t\t\t\t<div class=\"input-wrap\">\n\t\t\t\t\t\t<label for=\"connect:proxyEnabled\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"connect:proxyEnabled\"\n\t\t\t\t\t\t\t\tv-model=\"defaults.proxyEnabled\"\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\tname=\"proxyEnabled\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\tEnable Proxy\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<template v-if=\"defaults.proxyEnabled\">\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:proxyHost\">SOCKS Address</label>\n\t\t\t\t\t\t<div class=\"input-wrap\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"connect:proxyHost\"\n\t\t\t\t\t\t\t\tv-model.trim=\"defaults.proxyHost\"\n\t\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t\tname=\"proxyHost\"\n\t\t\t\t\t\t\t\taria-label=\"Proxy host\"\n\t\t\t\t\t\t\t\tmaxlength=\"255\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span id=\"connect:proxyPortSeparator\">:</span>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"connect:proxyPort\"\n\t\t\t\t\t\t\t\tv-model=\"defaults.proxyPort\"\n\t\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\t\t\tmax=\"65535\"\n\t\t\t\t\t\t\t\tname=\"proxyPort\"\n\t\t\t\t\t\t\t\taria-label=\"SOCKS port\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:proxyUsername\">Proxy username</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:proxyUsername\"\n\t\t\t\t\t\t\tref=\"proxyUsernameInput\"\n\t\t\t\t\t\t\tv-model.trim=\"defaults.proxyUsername\"\n\t\t\t\t\t\t\tclass=\"input username\"\n\t\t\t\t\t\t\tname=\"proxyUsername\"\n\t\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t\t\tplaceholder=\"Proxy username\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:proxyPassword\">Proxy password</label>\n\t\t\t\t\t\t<RevealPassword\n\t\t\t\t\t\t\tv-slot:default=\"slotProps\"\n\t\t\t\t\t\t\tclass=\"input-wrap password-container\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"connect:proxyPassword\"\n\t\t\t\t\t\t\t\tref=\"proxyPassword\"\n\t\t\t\t\t\t\t\tv-model=\"defaults.proxyPassword\"\n\t\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\t\tplaceholder=\"Proxy password\"\n\t\t\t\t\t\t\t\tname=\"proxyPassword\"\n\t\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</RevealPassword>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"config.lockNetwork && !store.state.serverConfiguration?.public\">\n\t\t\t\t<h2>Network settings</h2>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:name\">Name</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"connect:name\"\n\t\t\t\t\t\tv-model.trim=\"defaults.name\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:password\">Password</label>\n\t\t\t\t\t<RevealPassword\n\t\t\t\t\t\tv-slot:default=\"slotProps\"\n\t\t\t\t\t\tclass=\"input-wrap password-container\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:password\"\n\t\t\t\t\t\t\tv-model=\"defaults.password\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\tplaceholder=\"Server password (optional)\"\n\t\t\t\t\t\t\tname=\"password\"\n\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</RevealPassword>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<h2>User preferences</h2>\n\t\t\t<div class=\"connect-row\">\n\t\t\t\t<label for=\"connect:nick\">Nick</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"connect:nick\"\n\t\t\t\t\tv-model=\"defaults.nick\"\n\t\t\t\t\tclass=\"input nick\"\n\t\t\t\t\tname=\"nick\"\n\t\t\t\t\tpattern=\"[^\\s:!@]+\"\n\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\trequired\n\t\t\t\t\t@input=\"onNickChanged\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<template v-if=\"!config?.useHexIp\">\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:username\">Username</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"connect:username\"\n\t\t\t\t\t\tref=\"usernameInput\"\n\t\t\t\t\t\tv-model.trim=\"defaults.username\"\n\t\t\t\t\t\tclass=\"input username\"\n\t\t\t\t\t\tname=\"username\"\n\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<div class=\"connect-row\">\n\t\t\t\t<label for=\"connect:realname\">Real name</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"connect:realname\"\n\t\t\t\t\tv-model.trim=\"defaults.realname\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tname=\"realname\"\n\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div class=\"connect-row\">\n\t\t\t\t<label for=\"connect:leaveMessage\">Leave message</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"connect:leaveMessage\"\n\t\t\t\t\tv-model.trim=\"defaults.leaveMessage\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tname=\"leaveMessage\"\n\t\t\t\t\tplaceholder=\"The Lounge - https://thelounge.chat\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<template v-if=\"defaults.uuid && !store.state.serverConfiguration?.public\">\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:commands\">\n\t\t\t\t\t\tCommands\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"tooltipped tooltipped-ne tooltipped-no-delay\"\n\t\t\t\t\t\t\taria-label=\"One /command per line.\nEach command will be executed in\nthe server tab on new connection\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</label>\n\t\t\t\t\t<textarea\n\t\t\t\t\t\tid=\"connect:commands\"\n\t\t\t\t\t\tref=\"commandsInput\"\n\t\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\t\t:value=\"defaults.commands ? defaults.commands.join('\\n') : ''\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tname=\"commands\"\n\t\t\t\t\t\t@input=\"resizeCommandsInput\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"!defaults.uuid\">\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:channels\">Channels</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"connect:channels\"\n\t\t\t\t\t\tv-model.trim=\"defaults.join\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tname=\"join\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<h2>FiSH (Blowfish)</h2>\n\t\t\t<div class=\"connect-row\">\n\t\t\t\t<label for=\"connect:fishGlobalKey\">Global key</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"connect:fishGlobalKey\"\n\t\t\t\t\tv-model.trim=\"defaults.fishGlobalKey\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tname=\"fishGlobalKey\"\n\t\t\t\t\tplaceholder=\"Optional global key for this network\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div class=\"connect-row\" style=\"display: block\">\n\t\t\t\t<label for=\"connect:fishKeys\" style=\"margin-bottom: 5px\">\n\t\t\t\t\tPer-channel or User-Channels\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"tooltipped tooltipped-ne tooltipped-no-delay\"\n\t\t\t\t\t\taria-label=\"#channel key or nick key\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t\t<div class=\"fish-keys-section\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-for=\"(entry, index) in fishKeysEntries\"\n\t\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t\tclass=\"connect-row fish-key-row\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"input-wrap fish-key-inputs\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tv-model=\"entry.target\"\n\t\t\t\t\t\t\t\tclass=\"input fish-target-input\"\n\t\t\t\t\t\t\t\tplaceholder=\"#channel or nick\"\n\t\t\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t\t\t\taria-label=\"Channel or user name\"\n\t\t\t\t\t\t\t\tstyle=\"margin: 0\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tv-model=\"entry.key\"\n\t\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\t\tclass=\"input fish-key-input\"\n\t\t\t\t\t\t\t\tplaceholder=\"encryption key\"\n\t\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t\t\taria-label=\"Encryption key\"\n\t\t\t\t\t\t\t\tstyle=\"margin: 0\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"btn fish-remove-btn\"\n\t\t\t\t\t\t\t\t:disabled=\"fishKeysEntries.length <= 1\"\n\t\t\t\t\t\t\t\ttitle=\"Remove entry\"\n\t\t\t\t\t\t\t\tstyle=\"width: auto; margin: 0\"\n\t\t\t\t\t\t\t\t@click=\"removeFishKeyEntry(index)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tRemove\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<button type=\"button\" class=\"btn\" @click=\"addFishKeyEntry\">\n\t\t\t\t\t\t\tAdd Entry\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<template v-if=\"store.state.serverConfiguration?.public\">\n\t\t\t\t<template v-if=\"config?.lockNetwork\">\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label></label>\n\t\t\t\t\t\t<div class=\"input-wrap\">\n\t\t\t\t\t\t\t<label class=\"tls\">\n\t\t\t\t\t\t\t\t<input v-model=\"displayPasswordField\" type=\"checkbox\" />\n\t\t\t\t\t\t\t\tI have a password\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-if=\"displayPasswordField\" class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:password\">Password</label>\n\t\t\t\t\t\t<RevealPassword\n\t\t\t\t\t\t\tv-slot:default=\"slotProps\"\n\t\t\t\t\t\t\tclass=\"input-wrap password-container\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"connect:password\"\n\t\t\t\t\t\t\t\tref=\"publicPassword\"\n\t\t\t\t\t\t\t\tv-model=\"defaults.password\"\n\t\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\t\tplaceholder=\"Server password (optional)\"\n\t\t\t\t\t\t\t\tname=\"password\"\n\t\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</RevealPassword>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t</template>\n\t\t\t<template v-else>\n\t\t\t\t<h2 id=\"label-auth\">Authentication</h2>\n\t\t\t\t<div class=\"connect-row connect-auth\" role=\"group\" aria-labelledby=\"label-auth\">\n\t\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t:checked=\"!defaults.sasl\"\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\tname=\"sasl\"\n\t\t\t\t\t\t\tvalue=\"\"\n\t\t\t\t\t\t\t@change=\"setSaslAuth('')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tNo authentication\n\t\t\t\t\t</label>\n\t\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t:checked=\"defaults.sasl === 'plain'\"\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\tname=\"sasl\"\n\t\t\t\t\t\t\tvalue=\"plain\"\n\t\t\t\t\t\t\t@change=\"setSaslAuth('plain')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tUsername + password (SASL PLAIN)\n\t\t\t\t\t</label>\n\t\t\t\t\t<label\n\t\t\t\t\t\tv-if=\"!store.state.serverConfiguration?.public && defaults.tls\"\n\t\t\t\t\t\tclass=\"opt\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t:checked=\"defaults.sasl === 'external'\"\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\tname=\"sasl\"\n\t\t\t\t\t\t\tvalue=\"external\"\n\t\t\t\t\t\t\t@change=\"setSaslAuth('external')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tClient certificate (SASL EXTERNAL)\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\n\t\t\t\t<template v-if=\"defaults.sasl === 'plain'\">\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:username\">Account</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:saslAccount\"\n\t\t\t\t\t\t\tv-model.trim=\"defaults.saslAccount\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\tname=\"saslAccount\"\n\t\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:password\">Password</label>\n\t\t\t\t\t\t<RevealPassword\n\t\t\t\t\t\t\tv-slot:default=\"slotProps\"\n\t\t\t\t\t\t\tclass=\"input-wrap password-container\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"connect:saslPassword\"\n\t\t\t\t\t\t\t\tv-model=\"defaults.saslPassword\"\n\t\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\t\tname=\"saslPassword\"\n\t\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</RevealPassword>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t\t<div v-else-if=\"defaults.sasl === 'external'\" class=\"connect-sasl-external\">\n\t\t\t\t\t<p>The Lounge automatically generates and manages the client certificate.</p>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tOn the IRC server, you will need to tell the services to attach the\n\t\t\t\t\t\tcertificate fingerprint (certfp) to your account, for example:\n\t\t\t\t\t</p>\n\t\t\t\t\t<pre><code>/msg NickServ CERT ADD</code></pre>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<div>\n\t\t\t\t<button type=\"submit\" class=\"btn\" :disabled=\"disabled ? true : false\">\n\t\t\t\t\t<template v-if=\"defaults.uuid\">Save network</template>\n\t\t\t\t\t<template v-else>Connect</template>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</form>\n\t</div>\n</template>\n\n<style>\n#connect .connect-auth {\n\tdisplay: block;\n\tmargin-bottom: 10px;\n}\n\n#connect .connect-auth .opt {\n\tdisplay: block;\n\twidth: 100%;\n}\n\n#connect .connect-auth input {\n\tmargin: 3px 10px 0 0;\n}\n\n#connect .connect-sasl-external {\n\tpadding: 10px;\n\tborder-radius: 2px;\n\tbackground-color: #d9edf7;\n\tcolor: #31708f;\n}\n\n#connect .connect-sasl-external pre {\n\tmargin: 0;\n\tuser-select: text;\n}\n\n/* FiSH Keys section styles */\n.fish-keys-section {\n\twidth: 100%;\n\tpadding-top: 10px;\n}\n\n.fish-key-row {\n\tmargin-bottom: 5px;\n}\n\n.fish-key-label {\n\twidth: 25%;\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.fish-key-inputs {\n\tdisplay: flex;\n\tgap: 10px;\n\talign-items: center;\n}\n\n.fish-target-input {\n\tflex: 1;\n\tmin-width: 120px;\n}\n\n.fish-key-input {\n\tflex: 2;\n\tmin-width: 150px;\n}\n\n.fish-remove-btn {\n\tflex-shrink: 0;\n\tmin-width: 70px;\n\tmargin-left: 10px;\n}\n\n.fish-remove-btn:disabled {\n\topacity: 0.5;\n}\n\n.fish-remove-btn:disabled {\n\topacity: 0.5;\n}\n\n@media (width <= 768px) {\n\t.fish-key-inputs {\n\t\tflex-direction: column;\n\t\tgap: 5px;\n\t}\n\n\t.fish-target-input,\n\t.fish-key-input {\n\t\tmin-width: auto;\n\t}\n\n\t.fish-remove-btn {\n\t\tmargin-left: 0;\n\t\talign-self: stretch;\n\t}\n}\n</style>\n\n<script lang=\"ts\">\nimport RevealPassword from \"./RevealPassword.vue\";\nimport SidebarToggle from \"./SidebarToggle.vue\";\nimport {defineComponent, nextTick, PropType, ref, watch, computed} from \"vue\";\nimport {useStore} from \"../js/store\";\nimport {ClientNetwork} from \"../js/types\";\n\nexport type NetworkFormDefaults = Partial<ClientNetwork> & {\n\tjoin?: string;\n\tusername?: string;\n\thost?: string;\n\tcommands?: string[];\n\ttls?: boolean;\n\tport?: number;\n\tsasl?: string;\n\tpassword?: string;\n\thasSTSPolicy?: boolean;\n\tsaslAccount?: string;\n\tsaslPassword?: string;\n\tleaveMessage?: string;\n\trealname?: string;\n\tproxyEnabled?: boolean;\n\tproxyHost?: string;\n\tproxyPort?: number;\n\tproxyUsername?: string;\n\tproxyPassword?: string;\n\trejectUnauthorized?: boolean;\n\tfishGlobalKey?: string;\n\tfishKeys?: Record<string, string>;\n};\n\nexport default defineComponent({\n\tname: \"NetworkForm\",\n\tcomponents: {\n\t\tRevealPassword,\n\t\tSidebarToggle,\n\t},\n\tprops: {\n\t\thandleSubmit: {\n\t\t\ttype: Function as PropType<(network: ClientNetwork) => void>,\n\t\t\trequired: true,\n\t\t},\n\t\tdefaults: {\n\t\t\ttype: Object as PropType<NetworkFormDefaults>,\n\t\t\trequired: true,\n\t\t},\n\t\tdisabled: Boolean,\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\t\tconst config = ref(store.state.serverConfiguration);\n\t\tconst previousUsername = ref(props.defaults?.username);\n\t\tconst displayPasswordField = ref(false);\n\n\t\tconst publicPassword = ref<HTMLInputElement | null>(null);\n\n\t\twatch(displayPasswordField, (newValue) => {\n\t\t\tif (newValue) {\n\t\t\t\tvoid nextTick(() => {\n\t\t\t\t\tpublicPassword.value?.focus();\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tconst commandsInput = ref<HTMLInputElement | null>(null);\n\n\t\tconst resizeCommandsInput = () => {\n\t\t\tif (!commandsInput.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Reset height first so it can down size\n\t\t\tcommandsInput.value.style.height = \"\";\n\n\t\t\t// 2 pixels to account for the border\n\t\t\tcommandsInput.value.style.height = `${Math.ceil(\n\t\t\t\tcommandsInput.value.scrollHeight + 2\n\t\t\t)}px`;\n\t\t};\n\n\t\twatch(\n\t\t\t() => props.defaults?.commands,\n\t\t\t() => {\n\t\t\t\tvoid nextTick(() => {\n\t\t\t\t\tresizeCommandsInput();\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\n\t\twatch(\n\t\t\t() => props.defaults?.tls,\n\t\t\t(isSecureChecked) => {\n\t\t\t\tconst ports = [6667, 6697];\n\t\t\t\tconst newPort = isSecureChecked ? 0 : 1;\n\n\t\t\t\t// If you disable TLS and current port is 6697,\n\t\t\t\t// set it to 6667, and vice versa\n\t\t\t\tif (props.defaults?.port === ports[newPort]) {\n\t\t\t\t\tprops.defaults.port = ports[1 - newPort];\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\tconst setSaslAuth = (type: string) => {\n\t\t\tif (props.defaults) {\n\t\t\t\tprops.defaults.sasl = type;\n\t\t\t}\n\t\t};\n\n\t\tconst usernameInput = ref<HTMLInputElement | null>(null);\n\n\t\tconst onNickChanged = (event: Event) => {\n\t\t\tif (!usernameInput.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst usernameRef = usernameInput.value;\n\n\t\t\tif (!usernameRef.value || usernameRef.value === previousUsername.value) {\n\t\t\t\tusernameRef.value = (event.target as HTMLInputElement)?.value;\n\t\t\t}\n\n\t\t\tpreviousUsername.value = (event.target as HTMLInputElement)?.value;\n\t\t};\n\n\t\t// FiSH Keys table management\n\t\tinterface FishKeyEntry {\n\t\t\ttarget: string;\n\t\t\tkey: string;\n\t\t}\n\n\t\tconst fishKeysEntries = ref<FishKeyEntry[]>([]);\n\n\t\t// Parse fishKeys object into table entries\n\t\tconst parseFishKeys = (input: Record<string, string> | undefined): FishKeyEntry[] => {\n\t\t\tif (!input || Object.keys(input).length === 0) {\n\t\t\t\treturn [{target: \"\", key: \"\"}];\n\t\t\t}\n\n\t\t\tconst entries: FishKeyEntry[] = [];\n\n\t\t\tfor (const [target, key] of Object.entries(input)) {\n\t\t\t\tentries.push({target, key: String(key ?? \"\")});\n\t\t\t}\n\n\t\t\treturn entries.length > 0 ? entries : [{target: \"\", key: \"\"}];\n\t\t};\n\n\t\t// Convert table entries into mapping object\n\t\tconst fishKeysValue = computed(() => {\n\t\t\tconst map: Record<string, string> = {};\n\n\t\t\tfor (const entry of fishKeysEntries.value) {\n\t\t\t\tconst target = entry.target.trim();\n\t\t\t\tconst key = entry.key.trim();\n\n\t\t\t\tif (target && key) {\n\t\t\t\t\tmap[target] = key;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn map;\n\t\t});\n\n\t\t// Initialize entries from defaults\n\t\twatch(\n\t\t\t() => props.defaults.fishKeys,\n\t\t\t(newValue) => {\n\t\t\t\tfishKeysEntries.value = parseFishKeys(newValue);\n\t\t\t},\n\t\t\t{immediate: true}\n\t\t);\n\n\t\tconst addFishKeyEntry = () => {\n\t\t\tfishKeysEntries.value.push({target: \"\", key: \"\"});\n\t\t};\n\n\t\tconst removeFishKeyEntry = (index: number) => {\n\t\t\tif (fishKeysEntries.value.length > 1) {\n\t\t\t\tfishKeysEntries.value.splice(index, 1);\n\t\t\t}\n\t\t};\n\n\t\tconst onSubmit = (event: Event) => {\n\t\t\tconst formData = new FormData(event.target as HTMLFormElement);\n\t\t\tconst data: Partial<ClientNetwork> = {};\n\n\t\t\tformData.forEach((value, key) => {\n\t\t\t\tdata[key] = value;\n\t\t\t});\n\n\t\t\t// Attach FiSH keys mapping directly as an object\n\t\t\t(data as any).fishKeys = fishKeysValue.value;\n\n\t\t\tprops.handleSubmit(data as ClientNetwork);\n\t\t};\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tconfig,\n\t\t\tdisplayPasswordField,\n\t\t\tpublicPassword,\n\t\t\tcommandsInput,\n\t\t\tresizeCommandsInput,\n\t\t\tsetSaslAuth,\n\t\t\tusernameInput,\n\t\t\tonNickChanged,\n\t\t\tonSubmit,\n\t\t\tfishKeysEntries,\n\t\t\tfishKeysValue,\n\t\t\taddFishKeyEntry,\n\t\t\tremoveFishKeyEntry,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<button class=\"lt\" aria-label=\"Toggle channel list\" @click=\"store.commit('toggleSidebar')\" />\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent} from \"vue\";\nimport {useStore} from \"../js/store\";\n\nexport default defineComponent({\n\tname: \"SidebarToggle\",\n\tsetup() {\n\t\tconst store = useStore();\n\n\t\treturn {\n\t\t\tstore,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./SidebarToggle.vue?vue&type=template&id=5256e772&ts=true\"\nimport script from \"./SidebarToggle.vue?vue&type=script&lang=ts\"\nexport * from \"./SidebarToggle.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./NetworkForm.vue?vue&type=template&id=5dcfd032&ts=true\"\nimport script from \"./NetworkForm.vue?vue&type=script&lang=ts\"\nexport * from \"./NetworkForm.vue?vue&type=script&lang=ts\"\n\nimport \"./NetworkForm.vue?vue&type=style&index=0&id=5dcfd032&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<NetworkForm :handle-submit=\"handleSubmit\" :defaults=\"defaults\" :disabled=\"disabled\" />\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, ref} from \"vue\";\n\nimport socket from \"../../js/socket\";\nimport {useStore} from \"../../js/store\";\nimport NetworkForm, {NetworkFormDefaults} from \"../NetworkForm.vue\";\n\nexport default defineComponent({\n\tname: \"Connect\",\n\tcomponents: {\n\t\tNetworkForm,\n\t},\n\tprops: {\n\t\tqueryParams: Object,\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\n\t\tconst disabled = ref(false);\n\n\t\tconst handleSubmit = (data: NetworkFormDefaults) => {\n\t\t\tdisabled.value = true;\n\t\t\tsocket.emit(\"network:new\", data);\n\t\t};\n\n\t\tconst parseOverrideParams = (params?: Record<string, string>) => {\n\t\t\tif (!params) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\tconst parsedParams: Record<string, unknown> = {};\n\n\t\t\tfor (let key of Object.keys(params)) {\n\t\t\t\tlet value = params[key];\n\n\t\t\t\t// Param can contain multiple values in an array if its supplied more than once\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\tvalue = value[0];\n\t\t\t\t}\n\n\t\t\t\t// Support `channels` as a compatibility alias with other clients\n\t\t\t\tif (key === \"channels\") {\n\t\t\t\t\tkey = \"join\";\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t!Object.prototype.hasOwnProperty.call(\n\t\t\t\t\t\tstore.state.serverConfiguration?.defaults,\n\t\t\t\t\t\tkey\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// When the network is locked, URL overrides should not affect disabled fields\n\t\t\t\tif (\n\t\t\t\t\tstore.state.serverConfiguration?.lockNetwork &&\n\t\t\t\t\t[\"name\", \"host\", \"port\", \"tls\", \"rejectUnauthorized\"].includes(key)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (key === \"join\") {\n\t\t\t\t\tvalue = value\n\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t.map((chan) => {\n\t\t\t\t\t\t\tif (!chan.match(/^[#&!+]/)) {\n\t\t\t\t\t\t\t\treturn `#${chan}`;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn chan;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join(\", \");\n\t\t\t\t}\n\n\t\t\t\t// Override server provided defaults with parameters passed in the URL if they match the data type\n\t\t\t\tswitch (typeof store.state.serverConfiguration?.defaults[key]) {\n\t\t\t\t\tcase \"boolean\":\n\t\t\t\t\t\tif (value === \"0\" || value === \"false\") {\n\t\t\t\t\t\t\tparsedParams[key] = false;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tparsedParams[key] = !!value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\tparsedParams[key] = Number(value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"string\":\n\t\t\t\t\t\tparsedParams[key] = String(value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn parsedParams;\n\t\t};\n\n\t\tconst defaults = ref<Partial<NetworkFormDefaults>>(\n\t\t\tObject.assign(\n\t\t\t\t{},\n\t\t\t\tstore.state.serverConfiguration?.defaults,\n\t\t\t\tparseOverrideParams(props.queryParams)\n\t\t\t)\n\t\t);\n\n\t\treturn {\n\t\t\tdefaults,\n\t\t\tdisabled,\n\t\t\thandleSubmit,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./Connect.vue?vue&type=template&id=571b8e59&ts=true\"\nimport script from \"./Connect.vue?vue&type=script&lang=ts\"\nexport * from \"./Connect.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div id=\"settings\" class=\"window\" role=\"tabpanel\" aria-label=\"Settings\">\n\t\t<div class=\"header\">\n\t\t\t<SidebarToggle />\n\t\t</div>\n\t\t<Navigation />\n\n\t\t<div class=\"container\">\n\t\t\t<form ref=\"settingsForm\" autocomplete=\"off\" @change=\"onChange\" @submit.prevent>\n\t\t\t\t<router-view></router-view>\n\t\t\t</form>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent} from \"vue\";\nimport SidebarToggle from \"../SidebarToggle.vue\";\nimport Navigation from \"../Settings/Navigation.vue\";\nimport {useStore} from \"../../js/store\";\n\nexport default defineComponent({\n\tname: \"Settings\",\n\tcomponents: {\n\t\tSidebarToggle,\n\t\tNavigation,\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\n\t\tconst onChange = (event: Event) => {\n\t\t\tconst ignore = [\"old_password\", \"new_password\", \"verify_password\"];\n\n\t\t\tconst name = (event.target as HTMLInputElement).name;\n\n\t\t\tif (ignore.includes(name)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet value: boolean | string;\n\n\t\t\tif ((event.target as HTMLInputElement).type === \"checkbox\") {\n\t\t\t\tvalue = (event.target as HTMLInputElement).checked;\n\t\t\t} else {\n\t\t\t\tvalue = (event.target as HTMLInputElement).value;\n\t\t\t}\n\n\t\t\tvoid store.dispatch(\"settings/update\", {name, value, sync: true});\n\t\t};\n\n\t\treturn {\n\t\t\tonChange,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<!-- 220px is the width of the sidebar, and we add 100px to allow for the text -->\n\t<aside class=\"settings-menu\">\n\t\t<h2>Settings</h2>\n\t\t<ul role=\"navigation\" aria-label=\"Settings tabs\">\n\t\t\t<SettingTabItem name=\"General\" class-name=\"general\" to=\"\" />\n\t\t\t<SettingTabItem name=\"Appearance\" class-name=\"appearance\" to=\"appearance\" />\n\t\t\t<SettingTabItem name=\"Notifications\" class-name=\"notifications\" to=\"notifications\" />\n\t\t\t<SettingTabItem name=\"Account\" class-name=\"account\" to=\"account\" />\n\t\t</ul>\n\t</aside>\n</template>\n\n<style>\n.settings-menu {\n\tposition: fixed;\n\n\t/* top: Header + (padding bottom of h2 - border) */\n\ttop: calc(45px + 5px);\n\n\t/* Mid page minus width of container and 30 pixels for padding */\n\tmargin-left: calc(50% - 480px - 30px);\n}\n\n/** The calculation is mobile + 2/3 of container width. Fairly arbitrary. */\n@media screen and (width <= calc(768px + 320px)) {\n\t.settings-menu {\n\t\tposition: static;\n\t\twidth: min(480px, 100%);\n\t\talign-self: center;\n\t\tmargin: 0 auto;\n\t\tpadding: 0 15px;\n\t}\n}\n\n.settings-menu ul {\n\tpadding: 0;\n}\n\n.settings-menu li {\n\tfont-size: 18px;\n\tlist-style: none;\n}\n\n.settings-menu button {\n\tcolor: var(--body-color-muted);\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: inline-block;\n\ttext-align: left;\n}\n\n.settings-menu li:not(:last-of-type) button {\n\tmargin-bottom: 8px;\n}\n\n.settings-menu button::before {\n\twidth: 18px;\n\theight: 18px;\n\tdisplay: inline-block;\n\tcontent: \"\";\n\tmargin-right: 8px;\n}\n\n.settings-menu .appearance::before {\n\tcontent: \"\\f108\"; /* http://fontawesome.io/icon/desktop/ */\n}\n\n.settings-menu .account::before {\n\tcontent: \"\\f007\"; /* http://fontawesome.io/icon/user/ */\n}\n\n.settings-menu .messages::before {\n\tcontent: \"\\f0e0\"; /* http://fontawesome.io/icon/envelope/ */\n}\n\n.settings-menu .notifications::before {\n\tcontent: \"\\f0f3\"; /* http://fontawesome.io/icon/bell/ */\n}\n\n.settings-menu .general::before {\n\tcontent: \"\\f013\"; /* http://fontawesome.io/icon/cog/ */\n}\n\n.settings-menu button:hover,\n.settings-menu button.active {\n\tcolor: var(--body-color);\n}\n\n.settings-menu button.active {\n\tcursor: default;\n}\n</style>\n\n<script lang=\"ts\">\nimport SettingTabItem from \"./SettingTabItem.vue\";\nimport {defineComponent} from \"vue\";\n\nexport default defineComponent({\n\tname: \"SettingsTabs\",\n\tcomponents: {\n\t\tSettingTabItem,\n\t},\n});\n</script>\n","<template>\n\t<li :aria-label=\"name\" role=\"tab\" :aria-selected=\"route.name === name\" aria-controls=\"settings\">\n\t\t<router-link v-slot:default=\"{navigate, isExactActive}\" :to=\"'/settings/' + to\" custom>\n\t\t\t<button\n\t\t\t\t:class=\"['icon', className, {active: isExactActive}]\"\n\t\t\t\t@click=\"navigate\"\n\t\t\t\t@keypress.enter=\"navigate as (e?: KeyboardEvent) => void\"\n\t\t\t>\n\t\t\t\t{{ name }}\n\t\t\t</button>\n\t\t</router-link>\n\t</li>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent} from \"vue\";\nimport {useRoute} from \"vue-router\";\n\nexport default defineComponent({\n\tname: \"SettingTabListItem\",\n\tprops: {\n\t\tname: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tclassName: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tto: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst route = useRoute();\n\n\t\treturn {\n\t\t\troute,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./SettingTabItem.vue?vue&type=template&id=4806dcd4&ts=true\"\nimport script from \"./SettingTabItem.vue?vue&type=script&lang=ts\"\nexport * from \"./SettingTabItem.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Navigation.vue?vue&type=template&id=4ce2cfe0&ts=true\"\nimport script from \"./Navigation.vue?vue&type=script&lang=ts\"\nexport * from \"./Navigation.vue?vue&type=script&lang=ts\"\n\nimport \"./Navigation.vue?vue&type=style&index=0&id=4ce2cfe0&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Settings.vue?vue&type=template&id=7dcb681f&ts=true\"\nimport script from \"./Settings.vue?vue&type=script&lang=ts\"\nexport * from \"./Settings.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div id=\"help\" class=\"window\" role=\"tabpanel\" aria-label=\"Help\">\n\t\t<div class=\"header\">\n\t\t\t<SidebarToggle />\n\t\t</div>\n\t\t<div class=\"container\">\n\t\t\t<h1 class=\"title\">Help</h1>\n\n\t\t\t<h2 class=\"help-version-title\">\n\t\t\t\t<span>About The Lounge</span>\n\t\t\t\t<small>\n\t\t\t\t\tv{{ store.state.serverConfiguration?.version }} (<router-link\n\t\t\t\t\t\tid=\"view-changelog\"\n\t\t\t\t\t\tto=\"/changelog\"\n\t\t\t\t\t\t>release notes</router-link\n\t\t\t\t\t>)\n\t\t\t\t</small>\n\t\t\t</h2>\n\n\t\t\t<div class=\"about\">\n\t\t\t\t<VersionChecker />\n\n\t\t\t\t<template v-if=\"store.state.serverConfiguration?.gitCommit\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tThe Lounge is running from source (<a\n\t\t\t\t\t\t\t:href=\"`https://github.com/LordBex/thelounge/tree/${store.state.serverConfiguration?.gitCommit}`\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t>commit <code>{{ store.state.serverConfiguration?.gitCommit }}</code></a\n\t\t\t\t\t\t>).\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<ul>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\tCompare\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t:href=\"`https://github.com/LordBex/thelounge/compare/${store.state.serverConfiguration?.gitCommit}...master`\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t\t>between\n\t\t\t\t\t\t\t\t<code>{{ store.state.serverConfiguration?.gitCommit }}</code> and\n\t\t\t\t\t\t\t\t<code>master</code></a\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\tto see what you are missing\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\tCompare\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t:href=\"`https://github.com/LordBex/thelounge/compare/${store.state.serverConfiguration?.version}...${store.state.serverConfiguration?.gitCommit}`\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t\t>between\n\t\t\t\t\t\t\t\t<code>{{ store.state.serverConfiguration?.version }} </code> and\n\t\t\t\t\t\t\t\t<code>{{ store.state.serverConfiguration?.gitCommit }}</code></a\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\tto see your local changes\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</template>\n\n\t\t\t\t<p>\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"https://thelounge.chat/\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\tclass=\"website-link\"\n\t\t\t\t\t\t>Website</a\n\t\t\t\t\t>\n\t\t\t\t</p>\n\t\t\t\t<p>\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"https://thelounge.chat/docs/\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\tclass=\"documentation-link\"\n\t\t\t\t\t\t>Documentation</a\n\t\t\t\t\t>\n\t\t\t\t</p>\n\t\t\t\t<p>\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"https://github.com/LordBex/thelounge/issues/new\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\tclass=\"report-issue-link\"\n\t\t\t\t\t\t>Report an issue…</a\n\t\t\t\t\t>\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<h2 v-if=\"isTouch\">Gestures</h2>\n\n\t\t\t<div v-if=\"isTouch\" class=\"help-item\">\n\t\t\t\t<div class=\"subject gesture\">Single-Finger Swipe Left</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Hide sidebar.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"isTouch\" class=\"help-item\">\n\t\t\t\t<div class=\"subject gesture\">Single-Finger Swipe Right</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Show sidebar.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"isTouch\" class=\"help-item\">\n\t\t\t\t<div class=\"subject gesture\">Two-Finger Swipe Left</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the next window in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"isTouch\" class=\"help-item\">\n\t\t\t\t<div class=\"subject gesture\">Two-Finger Swipe Right</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the previous window in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<h2>Keyboard Shortcuts</h2>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>↓</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>↓</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the next lobby in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>↑</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>↑</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the previous lobby in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>←</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>←</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Collapse current network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>→</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>→</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Expand current network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>↓</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>↓</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the next window in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>↑</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>↑</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the previous window in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>Ctrl</kbd> <kbd>↓</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>⌘</kbd> <kbd>↓</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the next window with unread messages in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>Ctrl</kbd> <kbd>↑</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>⌘</kbd> <kbd>↑</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the previous window with unread messages in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>A</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>A</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the first window with unread messages.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>S</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>S</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Toggle sidebar.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>U</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>U</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Toggle channel user list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>J</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>J</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Toggle jump to channel switcher.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>M</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>M</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Toggle recent mentions popup.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>/</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>/</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the help menu.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span><kbd>Esc</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tClose current contextual window (context menu, image viewer, topic edit,\n\t\t\t\t\t\tetc) and remove focus from input.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<h2>Formatting Shortcuts</h2>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>K</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>K</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark any text typed after this shortcut to be colored. After hitting this\n\t\t\t\t\t\tshortcut, enter an integer in the range\n\t\t\t\t\t\t<code>0—15</code> to select the desired color, or use the autocompletion\n\t\t\t\t\t\tmenu to choose a color name (see below).\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tBackground color can be specified by putting a comma and another integer in\n\t\t\t\t\t\tthe range <code>0—15</code> after the foreground color number\n\t\t\t\t\t\t(autocompletion works too).\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tA color reference can be found\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"https://modern.ircdocs.horse/formatting.html#colors\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t>here</a\n\t\t\t\t\t\t>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>B</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>B</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut as\n\t\t\t\t\t\t<span class=\"irc-bold\">bold</span>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>U</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>U</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut as\n\t\t\t\t\t\t<span class=\"irc-underline\">underlined</span>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>I</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>I</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut as\n\t\t\t\t\t\t<span class=\"irc-italic\">italics</span>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>S</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>S</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut as\n\t\t\t\t\t\t<span class=\"irc-strikethrough\">struck through</span>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>M</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>M</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut as\n\t\t\t\t\t\t<span class=\"irc-monospace\">monospaced</span>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>O</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>O</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut to be reset to its original\n\t\t\t\t\t\tformatting.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<h2>Autocompletion</h2>\n\n\t\t\t<p>\n\t\t\t\tTo auto-complete nicknames, channels, commands, and emoji, type one of the\n\t\t\t\tcharacters below to open a suggestion list. Use the <kbd>↑</kbd> and\n\t\t\t\t<kbd>↓</kbd> keys to highlight an item, and insert it by pressing <kbd>Tab</kbd> or\n\t\t\t\t<kbd>Enter</kbd> (or by clicking the desired item).\n\t\t\t</p>\n\t\t\t<p>Autocompletion can be disabled in settings.</p>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>@</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Nickname</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>#</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Channel</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Commands (see list of commands below)</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>:</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tEmoji (note: requires two search characters, to avoid conflicting with\n\t\t\t\t\t\tcommon emoticons like <code>:)</code>)\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<h2>Commands</h2>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/away [message]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Mark yourself as away with an optional message.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/back</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Remove your away status (set with <code>/away</code>).</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/ban nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tBan (<code>+b</code>) a user from the current channel. This can be a\n\t\t\t\t\t\tnickname or a hostmask.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/banlist</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Load the banlist for the current channel.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/collapse</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tCollapse all previews in the current channel (opposite of\n\t\t\t\t\t\t<code>/expand</code>)\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/connect host [port]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tConnect to a new IRC network. If <code>port</code> starts with a\n\t\t\t\t\t\t<code>+</code> sign, the connection will be made secure using TLS.\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>Alias: <code>/server</code></p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/ctcp target cmd [args]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tSend a <abbr title=\"Client-to-client protocol\">CTCP</abbr>\n\t\t\t\t\t\trequest. Read more about this on\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"https://en.wikipedia.org/wiki/Client-to-client_protocol\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t>the dedicated Wikipedia article</a\n\t\t\t\t\t\t>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/deop nick [...nick]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tRemove op (<code>-o</code>) from one or several users in the current\n\t\t\t\t\t\tchannel.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/devoice nick [...nick]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tRemove voice (<code>-v</code>) from one or several users in the current\n\t\t\t\t\t\tchannel.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/disconnect [message]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Disconnect from the current network with an optionally-provided message.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/expand</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tExpand all previews in the current channel (opposite of\n\t\t\t\t\t\t<code>/collapse</code>)\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/invite nick [channel]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tInvite a user to the specified channel. If\n\t\t\t\t\t\t<code>channel</code> is omitted, user will be invited to the current\n\t\t\t\t\t\tchannel.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/ignore nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tBlock any messages from the specified user on the current network. This can\n\t\t\t\t\t\tbe a nickname or a hostmask.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/ignorelist</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Load the list of ignored users for the current network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/join channel [password]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tJoin a channel. Password is only needed in protected channels and can\n\t\t\t\t\t\tusually be omitted.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/kick nick [reason]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Kick a user from the current channel.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/kickban nick [reason]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tKick and ban (<code>+b</code>) a user from the current channel. Unlike\n\t\t\t\t\t\t<code>/ban</code>, only nicknames (and not host masks) can be used.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/list</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Retrieve a list of available channels on this network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/me message</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tSend an action message to the current channel. The Lounge will display it\n\t\t\t\t\t\tinline, as if the message was posted in the third person.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/mode flags [args]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tSet the given flags to the current channel if the active window is a\n\t\t\t\t\t\tchannel, another user if the active window is a private message window, or\n\t\t\t\t\t\tyourself if the current window is a server window.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/msg channel message</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Send a message to the specified channel.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/mute [...channel]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tPrevent messages from generating any feedback for a channel. This turns off\n\t\t\t\t\t\tthe highlight indicator, hides mentions and inhibits push notifications.\n\t\t\t\t\t\tMuting a network lobby mutes the entire network. Not specifying any channel\n\t\t\t\t\t\ttarget mutes the current channel. Revert with <code>/unmute</code>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/nick newnick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Change your nickname on the current network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/notice channel message</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Sends a notice message to the specified channel.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/op nick [...nick]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Give op (<code>+o</code>) to one or several users in the current channel.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/part [channel]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tClose the specified channel or private message window, or the current\n\t\t\t\t\t\tchannel if <code>channel</code> is omitted.\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>Aliases: <code>/close</code>, <code>/leave</code></p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/rejoin</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tLeave and immediately rejoin the current channel. Useful to quickly get op\n\t\t\t\t\t\tfrom ChanServ in an empty channel, for example.\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>Alias: <code>/cycle</code></p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/query nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Send a private message to the specified user.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/quit [message]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Disconnect from the current network with an optional message.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/raw message</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Send a raw message to the current IRC network.</p>\n\t\t\t\t\t<p>Aliases: <code>/quote</code>, <code>/send</code></p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/slap nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Slap someone in the current channel with a trout!</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"store.state.settings.searchEnabled\" class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/search query</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Search for messages in the current channel / user</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/topic [newtopic]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tGet the topic in the current channel. If <code>newtopic</code> is specified,\n\t\t\t\t\t\tsets the topic in the current channel.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/unban nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tUnban (<code>-b</code>) a user from the current channel. This can be a\n\t\t\t\t\t\tnickname or a hostmask.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/unignore nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tUnblock messages from the specified user on the current network. This can be\n\t\t\t\t\t\ta nickname or a hostmask.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/unmute [...channel]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tUn-mutes the given channel(s) or the current channel if no channel is\n\t\t\t\t\t\tprovided. See <code>/mute</code> for more information.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/voice nick [...nick]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tGive voice (<code>+v</code>) to one or several users in the current channel.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/whois nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Retrieve information about the given user on the current network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent} from \"vue\";\nimport {useStore} from \"../../js/store\";\nimport SidebarToggle from \"../SidebarToggle.vue\";\nimport VersionChecker from \"../VersionChecker.vue\";\n\nexport default defineComponent({\n\tname: \"Help\",\n\tcomponents: {\n\t\tSidebarToggle,\n\t\tVersionChecker,\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\t\tconst isApple = navigator.platform.match(/(Mac|iPhone|iPod|iPad)/i) || false;\n\t\tconst isTouch = navigator.maxTouchPoints > 0;\n\n\t\treturn {\n\t\t\tisApple,\n\t\t\tisTouch,\n\t\t\tstore,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<div id=\"version-checker\" :class=\"[store.state.versionStatus]\">\n\t\t<p v-if=\"store.state.versionStatus === 'loading'\">Checking for updates…</p>\n\t\t<p v-if=\"store.state.versionStatus === 'new-version'\">\n\t\t\tThe Lounge <b>{{ store.state.versionData?.latest?.version }} </b>\n\t\t\t<template v-if=\"store.state.versionData?.latest?.prerelease\"> (pre-release) </template>\n\t\t\tis now available.\n\t\t\t<br />\n\n\t\t\t<a :href=\"store.state.versionData?.latest?.url\" target=\"_blank\" rel=\"noopener\">\n\t\t\t\tRead more on GitHub\n\t\t\t</a>\n\t\t</p>\n\t\t<p v-if=\"store.state.versionStatus === 'new-packages'\">\n\t\t\tThe Lounge is up to date, but there are out of date packages Run\n\t\t\t<code>thelounge upgrade</code> on the server to upgrade packages.\n\t\t</p>\n\t\t<template v-if=\"store.state.versionStatus === 'up-to-date'\">\n\t\t\t<p>The Lounge is up to date!</p>\n\n\t\t\t<button\n\t\t\t\tv-if=\"store.state.versionDataExpired\"\n\t\t\t\tid=\"check-now\"\n\t\t\t\tclass=\"btn btn-small\"\n\t\t\t\t@click=\"checkNow\"\n\t\t\t>\n\t\t\t\tCheck now\n\t\t\t</button>\n\t\t</template>\n\t\t<template v-if=\"store.state.versionStatus === 'error'\">\n\t\t\t<p>Information about latest release could not be retrieved.</p>\n\n\t\t\t<button id=\"check-now\" class=\"btn btn-small\" @click=\"checkNow\">Try again</button>\n\t\t</template>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, onMounted} from \"vue\";\nimport socket from \"../js/socket\";\nimport {useStore} from \"../js/store\";\n\nexport default defineComponent({\n\tname: \"VersionChecker\",\n\tsetup() {\n\t\tconst store = useStore();\n\n\t\tconst checkNow = () => {\n\t\t\tstore.commit(\"versionData\", null);\n\t\t\tstore.commit(\"versionStatus\", \"loading\");\n\t\t\tsocket.emit(\"changelog\");\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\tif (!store.state.versionData) {\n\t\t\t\tcheckNow();\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tcheckNow,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./VersionChecker.vue?vue&type=template&id=06957aef&ts=true\"\nimport script from \"./VersionChecker.vue?vue&type=script&lang=ts\"\nexport * from \"./VersionChecker.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Help.vue?vue&type=template&id=edeb1a20&ts=true\"\nimport script from \"./Help.vue?vue&type=script&lang=ts\"\nexport * from \"./Help.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div id=\"changelog\" class=\"window\" aria-label=\"Changelog\">\n\t\t<div class=\"header\">\n\t\t\t<SidebarToggle />\n\t\t</div>\n\t\t<div class=\"container\">\n\t\t\t<router-link id=\"back-to-help\" to=\"/help\">« Help</router-link>\n\n\t\t\t<template\n\t\t\t\tv-if=\"store.state.versionData?.current && store.state.versionData?.current.version\"\n\t\t\t>\n\t\t\t\t<h1 class=\"title\">\n\t\t\t\t\tRelease notes for {{ store.state.versionData.current.version }}\n\t\t\t\t</h1>\n\n\t\t\t\t<template v-if=\"store.state.versionData.current.changelog\">\n\t\t\t\t\t<h3>Introduction</h3>\n\t\t\t\t\t<div\n\t\t\t\t\t\tref=\"changelog\"\n\t\t\t\t\t\tclass=\"changelog-text\"\n\t\t\t\t\t\tv-html=\"store.state.versionData.current.changelog\"\n\t\t\t\t\t></div>\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t<p>Unable to retrieve changelog for current release from GitHub.</p>\n\t\t\t\t\t<p>\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tv-if=\"store.state.serverConfiguration?.version\"\n\t\t\t\t\t\t\t:href=\"`https://github.com/LordBex/thelounge/releases/tag/v${store.state.serverConfiguration?.version}`\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t>View release notes for this version on GitHub</a\n\t\t\t\t\t\t>\n\t\t\t\t\t</p>\n\t\t\t\t</template>\n\t\t\t</template>\n\t\t\t<p v-else>Loading changelog…</p>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, onMounted, onUpdated, ref} from \"vue\";\nimport socket from \"../../js/socket\";\nimport {useStore} from \"../../js/store\";\nimport SidebarToggle from \"../SidebarToggle.vue\";\n\nexport default defineComponent({\n\tname: \"Changelog\",\n\tcomponents: {\n\t\tSidebarToggle,\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\t\tconst changelog = ref<HTMLDivElement | null>(null);\n\n\t\tconst patchChangelog = () => {\n\t\t\tif (!changelog.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst links = changelog.value.querySelectorAll(\"a\");\n\n\t\t\tlinks.forEach((link) => {\n\t\t\t\t// Make sure all links will open a new tab instead of exiting the application\n\t\t\t\tlink.setAttribute(\"target\", \"_blank\");\n\t\t\t\tlink.setAttribute(\"rel\", \"noopener\");\n\n\t\t\t\tif (link.querySelector(\"img\")) {\n\t\t\t\t\t// Add required metadata to image links, to support built-in image viewer\n\t\t\t\t\tlink.classList.add(\"toggle-thumbnail\");\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\tif (!store.state.versionData) {\n\t\t\t\tsocket.emit(\"changelog\");\n\t\t\t}\n\n\t\t\tpatchChangelog();\n\t\t});\n\n\t\tonUpdated(() => {\n\t\t\tpatchChangelog();\n\t\t});\n\n\t\treturn {\n\t\t\tstore,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./Changelog.vue?vue&type=template&id=eb1b4760&ts=true\"\nimport script from \"./Changelog.vue?vue&type=script&lang=ts\"\nexport * from \"./Changelog.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<NetworkForm\n\t\tv-if=\"networkData\"\n\t\t:handle-submit=\"handleSubmit\"\n\t\t:defaults=\"networkData\"\n\t\t:disabled=\"disabled\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, onMounted, ref, watch} from \"vue\";\nimport {useRoute} from \"vue-router\";\nimport {switchToChannel} from \"../../js/router\";\nimport socket from \"../../js/socket\";\nimport {useStore} from \"../../js/store\";\nimport NetworkForm, {NetworkFormDefaults} from \"../NetworkForm.vue\";\n\nexport default defineComponent({\n\tname: \"NetworkEdit\",\n\tcomponents: {\n\t\tNetworkForm,\n\t},\n\tsetup() {\n\t\tconst route = useRoute();\n\t\tconst store = useStore();\n\n\t\tconst disabled = ref(false);\n\t\tconst networkData = ref<NetworkFormDefaults | null>(null);\n\n\t\tconst setNetworkData = () => {\n\t\t\tsocket.emit(\"network:get\", String(route.params.uuid || \"\"));\n\t\t\tnetworkData.value = store.getters.findNetwork(String(route.params.uuid || \"\"));\n\t\t};\n\n\t\tconst handleSubmit = (data: {uuid: string; name: string}) => {\n\t\t\tdisabled.value = true;\n\t\t\tsocket.emit(\"network:edit\", data);\n\n\t\t\t// TODO: move networks to vuex and update state when the network info comes in\n\t\t\tconst network = store.getters.findNetwork(data.uuid);\n\n\t\t\tif (network) {\n\t\t\t\tnetwork.name = network.channels[0].name = data.name;\n\n\t\t\t\tswitchToChannel(network.channels[0]);\n\t\t\t}\n\t\t};\n\n\t\twatch(\n\t\t\t() => route.params.uuid,\n\t\t\t() => {\n\t\t\t\tsetNetworkData();\n\t\t\t}\n\t\t);\n\n\t\tonMounted(() => {\n\t\t\tsetNetworkData();\n\t\t});\n\n\t\treturn {\n\t\t\tdisabled,\n\t\t\tnetworkData,\n\t\t\thandleSubmit,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./NetworkEdit.vue?vue&type=template&id=11ec4a97&ts=true\"\nimport script from \"./NetworkEdit.vue?vue&type=script&lang=ts\"\nexport * from \"./NetworkEdit.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div id=\"chat-container\" class=\"window\">\n\t\t<div\n\t\t\tid=\"chat\"\n\t\t\t:class=\"{\n\t\t\t\t'time-seconds': store.state.settings.showSeconds,\n\t\t\t\t'time-12h': store.state.settings.use12hClock,\n\t\t\t}\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclass=\"chat-view\"\n\t\t\t\tdata-type=\"search-results\"\n\t\t\t\taria-label=\"Search results\"\n\t\t\t\trole=\"tabpanel\"\n\t\t\t>\n\t\t\t\t<div v-if=\"network && channel\" class=\"header\">\n\t\t\t\t\t<SidebarToggle />\n\t\t\t\t\t<span class=\"title\"\n\t\t\t\t\t\t>Searching in\n\t\t\t\t\t\t<span class=\"channel-name\">{{ channel.name }} </span> for</span\n\t\t\t\t\t>\n\t\t\t\t\t<span class=\"topic\">{{ route.query.q }} </span>\n\t\t\t\t\t<MessageSearchForm :network=\"network\" :channel=\"channel\" />\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"close\"\n\t\t\t\t\t\taria-label=\"Close search window\"\n\t\t\t\t\t\ttitle=\"Close search window\"\n\t\t\t\t\t\t@click=\"closeSearch\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"network && channel\" class=\"chat-content\">\n\t\t\t\t\t<div ref=\"chat\" class=\"chat\" tabindex=\"-1\">\n\t\t\t\t\t\t<div v-show=\"moreResultsAvailable\" class=\"show-more\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tref=\"loadMoreButton\"\n\t\t\t\t\t\t\t\t:disabled=\"\n\t\t\t\t\t\t\t\t\t!!store.state.messageSearchPendingQuery ||\n\t\t\t\t\t\t\t\t\t!store.state.isConnected\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\tclass=\"btn\"\n\t\t\t\t\t\t\t\t@click=\"onShowMoreClick\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span v-if=\"store.state.messageSearchPendingQuery\">Loading…</span>\n\t\t\t\t\t\t\t\t<span v-else>Show older messages</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"store.state.messageSearchPendingQuery && !offset\"\n\t\t\t\t\t\t\tclass=\"search-status\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSearching…\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div v-else-if=\"!messages.length && !offset\" class=\"search-status\">\n\t\t\t\t\t\t\tNo results found.\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"messages\"\n\t\t\t\t\t\t\trole=\"log\"\n\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\taria-relevant=\"additions\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tv-for=\"(message, id) in messages\"\n\t\t\t\t\t\t\t\t:key=\"message.id\"\n\t\t\t\t\t\t\t\tclass=\"result\"\n\t\t\t\t\t\t\t\t:data-jump-to=\"\n\t\t\t\t\t\t\t\t\tstore.state.settings.enableEnhancedSearch || undefined\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<DateMarker\n\t\t\t\t\t\t\t\t\tv-if=\"shouldDisplayDateMarker(message, id)\"\n\t\t\t\t\t\t\t\t\t:key=\"message.id + '-date'\"\n\t\t\t\t\t\t\t\t\t:message=\"message\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<Message\n\t\t\t\t\t\t\t\t\t:key=\"message.id\"\n\t\t\t\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t\t\t:message=\"message\"\n\t\t\t\t\t\t\t\t\t:data-id=\"message.id\"\n\t\t\t\t\t\t\t\t\t@click=\"jump(message)\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.channel-name {\n\tfont-weight: 700;\n}\n\n.result[data-jump-to] > .msg {\n\tcursor: pointer;\n\n\t&:hover {\n\t\tbackground-color: var(--highlight-bg-color) !important;\n\t}\n}\n\n.chat-view[data-type=\"search-results\"] .chat-content {\n\tmargin-top: 45px;\n}\n</style>\n\n<script lang=\"ts\">\nimport socket from \"../../js/socket\";\nimport eventbus from \"../../js/eventbus\";\n\nimport SidebarToggle from \"../SidebarToggle.vue\";\nimport Message from \"../Message.vue\";\nimport MessageSearchForm from \"../MessageSearchForm.vue\";\nimport DateMarker from \"../DateMarker.vue\";\nimport {watch, computed, defineComponent, nextTick, ref, onMounted, onUnmounted} from \"vue\";\nimport type {ClientMessage} from \"../../js/types\";\n\nimport {useStore} from \"../../js/store\";\nimport {useRoute} from \"vue-router\";\nimport {switchToChannel} from \"../../js/router\";\nimport {SearchQuery} from \"../../../shared/types/storage\";\n\nexport default defineComponent({\n\tname: \"SearchResults\",\n\tcomponents: {\n\t\tSidebarToggle,\n\t\tMessage,\n\t\tDateMarker,\n\t\tMessageSearchForm,\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\t\tconst route = useRoute();\n\n\t\tconst chat = ref<HTMLDivElement>();\n\n\t\tconst loadMoreButton = ref<HTMLButtonElement>();\n\n\t\tconst offset = ref(0);\n\t\tconst moreResultsAvailable = ref(false);\n\t\tconst oldScrollTop = ref(0);\n\t\tconst oldChatHeight = ref(0);\n\n\t\tconst messages = computed(() => {\n\t\t\tconst results = store.state.messageSearchResults?.results;\n\n\t\t\tif (!results) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn results;\n\t\t});\n\n\t\tconst chan = computed(() => {\n\t\t\tconst chanId = parseInt(String(route.params.id || \"\"), 10);\n\t\t\treturn store.getters.findChannel(chanId);\n\t\t});\n\n\t\tconst network = computed(() => {\n\t\t\tif (!chan.value) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn chan.value.network;\n\t\t});\n\n\t\tconst channel = computed(() => {\n\t\t\tif (!chan.value) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn chan.value.channel;\n\t\t});\n\n\t\tconst setActiveChannel = () => {\n\t\t\tif (!chan.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstore.commit(\"activeChannel\", chan.value);\n\t\t};\n\n\t\tconst closeSearch = () => {\n\t\t\tif (!channel.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tswitchToChannel(channel.value);\n\t\t};\n\n\t\tconst shouldDisplayDateMarker = (message: ClientMessage, id: number) => {\n\t\t\tconst previousMessage = messages.value[id - 1];\n\n\t\t\tif (!previousMessage) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn new Date(previousMessage.time).getDay() !== new Date(message.time).getDay();\n\t\t};\n\n\t\tconst clearSearchState = () => {\n\t\t\toffset.value = 0;\n\t\t\tstore.commit(\"messageSearchResults\", null);\n\t\t\tstore.commit(\"messageSearchPendingQuery\", null);\n\t\t};\n\n\t\tconst doSearch = () => {\n\t\t\tif (!network.value || !channel.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tclearSearchState(); // this is a new search, so we need to clear anything before that\n\t\t\tconst query: SearchQuery = {\n\t\t\t\tnetworkUuid: network.value.uuid,\n\t\t\t\tchannelName: channel.value.name,\n\t\t\t\tsearchTerm: String(route.query.q || \"\"),\n\t\t\t\toffset: offset.value,\n\t\t\t};\n\t\t\tstore.commit(\"messageSearchPendingQuery\", query);\n\t\t\tsocket.emit(\"search\", query);\n\t\t};\n\n\t\tconst onShowMoreClick = () => {\n\t\t\tif (!chat.value || !network.value || !channel.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\toffset.value += 100;\n\n\t\t\toldScrollTop.value = chat.value.scrollTop;\n\t\t\toldChatHeight.value = chat.value.scrollHeight;\n\n\t\t\tconst query: SearchQuery = {\n\t\t\t\tnetworkUuid: network.value.uuid,\n\t\t\t\tchannelName: channel.value.name,\n\t\t\t\tsearchTerm: String(route.query.q || \"\"),\n\t\t\t\toffset: offset.value,\n\t\t\t};\n\t\t\tstore.commit(\"messageSearchPendingQuery\", query);\n\t\t\tsocket.emit(\"search\", query);\n\t\t};\n\n\t\tconst jumpToBottom = async () => {\n\t\t\tawait nextTick();\n\n\t\t\tconst el = chat.value;\n\n\t\t\tif (!el) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tel.scrollTop = el.scrollHeight;\n\t\t};\n\n\t\t// Jump to a search result - navigate to channel with message ID and time\n\t\t// If message isn't in memory, MessageList will scroll to closest match by time\n\t\tconst jump = (message: ClientMessage) => {\n\t\t\tif (!store.state.settings.enableEnhancedSearch || !channel.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst messageTime = new Date(message.time).getTime();\n\t\t\tswitchToChannel(channel.value, message.id, messageTime);\n\t\t};\n\n\t\twatch(\n\t\t\t() => route.params.id,\n\t\t\t() => {\n\t\t\t\tdoSearch();\n\t\t\t\tsetActiveChannel();\n\t\t\t}\n\t\t);\n\n\t\twatch(\n\t\t\t() => route.query,\n\t\t\t() => {\n\t\t\t\tdoSearch();\n\t\t\t\tsetActiveChannel();\n\t\t\t}\n\t\t);\n\n\t\twatch(messages, async () => {\n\t\t\tmoreResultsAvailable.value = !!(\n\t\t\t\tmessages.value.length && !(messages.value.length % 100)\n\t\t\t);\n\n\t\t\tif (!offset.value) {\n\t\t\t\tawait jumpToBottom();\n\t\t\t} else {\n\t\t\t\tawait nextTick();\n\n\t\t\t\tconst el = chat.value;\n\n\t\t\t\tif (!el) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst currentChatHeight = el.scrollHeight;\n\t\t\t\tel.scrollTop = oldScrollTop.value + currentChatHeight - oldChatHeight.value;\n\t\t\t}\n\t\t});\n\n\t\tonMounted(() => {\n\t\t\tsetActiveChannel();\n\t\t\tdoSearch();\n\n\t\t\teventbus.on(\"escapekey\", closeSearch);\n\t\t\teventbus.on(\"re-search\", doSearch);\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\teventbus.off(\"escapekey\", closeSearch);\n\t\t\teventbus.off(\"re-search\", doSearch);\n\t\t\tclearSearchState();\n\t\t});\n\n\t\treturn {\n\t\t\tchat,\n\t\t\tloadMoreButton,\n\t\t\tmessages,\n\t\t\tmoreResultsAvailable,\n\t\t\tnetwork,\n\t\t\tchannel,\n\t\t\troute,\n\t\t\toffset,\n\t\t\tstore,\n\t\t\tsetActiveChannel,\n\t\t\tcloseSearch,\n\t\t\tshouldDisplayDateMarker,\n\t\t\tdoSearch,\n\t\t\tonShowMoreClick,\n\t\t\tjumpToBottom,\n\t\t\tjump,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<div\n\t\t:id=\"'msg-' + prettyMessage.id\"\n\t\t:class=\"[\n\t\t\t'msg',\n\t\t\t{\n\t\t\t\tself: prettyMessage.self,\n\t\t\t\thighlight: prettyMessage.highlight,\n\t\t\t\t'is-focused': isFocused,\n\t\t\t\t'previous-source': isPreviousSource,\n\t\t\t},\n\t\t]\"\n\t\t:data-type=\"prettyMessage.type\"\n\t\t:data-command=\"prettyMessage.command\"\n\t\t:data-from=\"\n\t\t\tprettyMessage.from &&\n\t\t\t(prettyMessage.from.shoutbox\n\t\t\t\t? prettyMessage.from.original_nick\n\t\t\t\t: prettyMessage.from.nick)\n\t\t\"\n\t\t:data-bridged=\"prettyMessage.from?.shoutbox\"\n\t>\n\t\t<span\n\t\t\taria-hidden=\"true\"\n\t\t\t:aria-label=\"messageTimeLocale\"\n\t\t\tclass=\"time tooltipped tooltipped-e\"\n\t\t\t>{{ `${messageTime} ` }}\n\t\t</span>\n\t\t<template v-if=\"prettyMessage.type === 'unhandled'\">\n\t\t\t<span class=\"from\">[{{ prettyMessage.command }}]</span>\n\t\t\t<span class=\"content\">\n\t\t\t\t<span v-for=\"(param, id) in prettyMessage.params\" :key=\"id\">{{\n\t\t\t\t\t` ${param} `\n\t\t\t\t}}</span>\n\t\t\t</span>\n\t\t</template>\n\t\t<template v-else-if=\"isAction()\">\n\t\t\t<span class=\"from\"><span class=\"only-copy\" aria-hidden=\"true\">*** </span></span>\n\t\t\t<component :is=\"messageComponent\" :network=\"network\" :message=\"prettyMessage\" />\n\t\t</template>\n\t\t<template v-else-if=\"prettyMessage.type === 'action'\">\n\t\t\t<span class=\"from\"><span class=\"only-copy\">* </span></span>\n\t\t\t<span class=\"content\" dir=\"auto\">\n\t\t\t\t<Username\n\t\t\t\t\t:user=\"prettyMessage.from\"\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\tdir=\"auto\"\n\t\t\t\t/> <ParsedMessage :message=\"prettyMessage\" />\n\t\t\t\t<LinkPreview\n\t\t\t\t\tv-for=\"preview in prettyMessage.previews\"\n\t\t\t\t\t:key=\"preview.link\"\n\t\t\t\t\t:keep-scroll-position=\"keepScrollPosition\"\n\t\t\t\t\t:link=\"preview\"\n\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t/>\n\t\t\t</span>\n\t\t</template>\n\t\t<template v-else>\n\t\t\t<span v-if=\"prettyMessage.type === 'message'\" class=\"from\">\n\t\t\t\t<template v-if=\"prettyMessage.from && prettyMessage.from.nick\">\n\t\t\t\t\t<span class=\"only-copy\" aria-hidden=\"true\"><</span>\n\t\t\t\t\t<Username :user=\"prettyMessage.from\" :network=\"network\" :channel=\"channel\" />\n\t\t\t\t\t<span class=\"only-copy\" aria-hidden=\"true\">> </span>\n\t\t\t\t</template>\n\t\t\t</span>\n\t\t\t<span v-else-if=\"prettyMessage.type === 'plugin'\" class=\"from\">\n\t\t\t\t<template v-if=\"prettyMessage.from && prettyMessage.from.nick\">\n\t\t\t\t\t<span class=\"only-copy\" aria-hidden=\"true\">[</span>\n\t\t\t\t\t{{ prettyMessage.from.nick }}\n\t\t\t\t\t<span class=\"only-copy\" aria-hidden=\"true\">] </span>\n\t\t\t\t</template>\n\t\t\t</span>\n\t\t\t<span v-else class=\"from\">\n\t\t\t\t<template v-if=\"prettyMessage.from && prettyMessage.from.nick\">\n\t\t\t\t\t<span class=\"only-copy\" aria-hidden=\"true\">-</span>\n\t\t\t\t\t<Username :user=\"prettyMessage.from\" :network=\"network\" :channel=\"channel\" />\n\t\t\t\t\t<span class=\"only-copy\" aria-hidden=\"true\">- </span>\n\t\t\t\t</template>\n\t\t\t</span>\n\t\t\t<span class=\"content\" dir=\"auto\">\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"prettyMessage.showInActive\"\n\t\t\t\t\taria-label=\"This message was shown in your active channel\"\n\t\t\t\t\tclass=\"msg-shown-in-active tooltipped tooltipped-e\"\n\t\t\t\t\t><span></span\n\t\t\t\t></span>\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"prettyMessage.statusmsgGroup\"\n\t\t\t\t\t:aria-label=\"`This message was only shown to users with ${prettyMessage.statusmsgGroup} mode`\"\n\t\t\t\t\tclass=\"msg-statusmsg tooltipped tooltipped-e\"\n\t\t\t\t\t><span>{{ prettyMessage.statusmsgGroup }}</span></span\n\t\t\t\t>\n\t\t\t\t<ParsedMessage :network=\"network\" :message=\"prettyMessage\" />\n\t\t\t\t<LinkPreview\n\t\t\t\t\tv-for=\"preview in prettyMessage.previews\"\n\t\t\t\t\t:key=\"preview.link\"\n\t\t\t\t\t:keep-scroll-position=\"keepScrollPosition\"\n\t\t\t\t\t:link=\"preview\"\n\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t/>\n\t\t\t</span>\n\t\t</template>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, PropType} from \"vue\";\nimport dayjs from \"dayjs\";\n\nimport constants from \"../js/constants\";\nimport localetime from \"../js/helpers/localetime\";\nimport Username from \"./Username.vue\";\nimport LinkPreview from \"./LinkPreview.vue\";\nimport ParsedMessage from \"./ParsedMessage.vue\";\nimport MessageTypes from \"./MessageTypes\";\n\nimport type {ClientChan, ClientMessage, ClientNetwork} from \"../js/types\";\nimport {useStore} from \"../js/store\";\nimport {MessageType} from \"../../shared/types/msg\";\nimport {parser as shoutboxParser} from \"../js/helpers/shoutbox-bridge/parser\";\nimport {ChanType} from \"../../shared/types/chan\";\n\nMessageTypes.ParsedMessage = ParsedMessage;\nMessageTypes.LinkPreview = LinkPreview;\nMessageTypes.Username = Username;\n\nexport default defineComponent({\n\tname: \"Message\",\n\tcomponents: MessageTypes,\n\tprops: {\n\t\tmessage: {type: Object as PropType<ClientMessage>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: false},\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tkeepScrollPosition: Function as PropType<() => void>,\n\t\tisPreviousSource: Boolean,\n\t\tisFocused: Boolean,\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\n\t\tconst timeFormat = computed(() => {\n\t\t\tlet format: keyof typeof constants.timeFormats;\n\n\t\t\tif (store.state.settings.use12hClock) {\n\t\t\t\tformat = store.state.settings.showSeconds ? \"msg12hWithSeconds\" : \"msg12h\";\n\t\t\t} else {\n\t\t\t\tformat = store.state.settings.showSeconds ? \"msgWithSeconds\" : \"msgDefault\";\n\t\t\t}\n\n\t\t\treturn constants.timeFormats[format];\n\t\t});\n\n\t\tconst messageTime = computed(() => {\n\t\t\treturn dayjs(props.message.time).format(timeFormat.value);\n\t\t});\n\n\t\tconst messageTimeLocale = computed(() => {\n\t\t\treturn localetime(props.message.time);\n\t\t});\n\n\t\tconst messageComponent = computed(() => {\n\t\t\treturn \"message-\" + (props.message.type || \"invalid\"); // TODO: force existence of type in sharedmsg\n\t\t});\n\n\t\tconst isAction = () => {\n\t\t\tif (!props.message.type) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn typeof MessageTypes[\"message-\" + props.message.type] !== \"undefined\";\n\t\t};\n\n\t\t// IRC Bridge formatter\n\t\tconst prettyMessage = computed(() => {\n\t\t\tif (\n\t\t\t\tprops.channel?.type !== ChanType.CHANNEL ||\n\t\t\t\t!store.state.settings.beautifyBridgedMessages ||\n\t\t\t\tprops.message.type !== MessageType.MESSAGE\n\t\t\t) {\n\t\t\t\treturn props.message;\n\t\t\t}\n\n\t\t\treturn shoutboxParser(props.message);\n\t\t});\n\n\t\treturn {\n\t\t\ttimeFormat,\n\t\t\tprettyMessage,\n\t\t\tmessageTime,\n\t\t\tmessageTimeLocale,\n\t\t\tmessageComponent,\n\t\t\tisAction,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<div\n\t\tv-if=\"link.shown\"\n\t\tv-show=\"link.sourceLoaded || link.type === 'link'\"\n\t\tref=\"container\"\n\t\tclass=\"preview\"\n\t\tdir=\"ltr\"\n\t>\n\t\t<div\n\t\t\tref=\"content\"\n\t\t\t:class=\"['toggle-content', 'toggle-type-' + link.type, {opened: isContentShown}]\"\n\t\t>\n\t\t\t<template v-if=\"link.type === 'link'\">\n\t\t\t\t<a\n\t\t\t\t\tv-if=\"link.thumb\"\n\t\t\t\t\tv-show=\"link.sourceLoaded\"\n\t\t\t\t\t:href=\"link.link\"\n\t\t\t\t\tclass=\"toggle-thumbnail\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t@click=\"onThumbnailClick\"\n\t\t\t\t>\n\t\t\t\t\t<img\n\t\t\t\t\t\t:src=\"link.thumb\"\n\t\t\t\t\t\tdecoding=\"async\"\n\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\tclass=\"thumb\"\n\t\t\t\t\t\t@error=\"onThumbnailError\"\n\t\t\t\t\t\t@abort=\"onThumbnailError\"\n\t\t\t\t\t\t@load=\"onPreviewReady\"\n\t\t\t\t\t/>\n\t\t\t\t</a>\n\t\t\t\t<div class=\"toggle-text\" dir=\"auto\">\n\t\t\t\t\t<div class=\"head\">\n\t\t\t\t\t\t<div class=\"overflowable\">\n\t\t\t\t\t\t\t<a :href=\"link.link\" :title=\"link.head\" target=\"_blank\" rel=\"noopener\"\n\t\t\t\t\t\t\t\t>{{ link.head }}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tv-if=\"showMoreButton\"\n\t\t\t\t\t\t\t:aria-expanded=\"isContentShown\"\n\t\t\t\t\t\t\t:aria-label=\"moreButtonLabel\"\n\t\t\t\t\t\t\tdir=\"auto\"\n\t\t\t\t\t\t\tclass=\"more\"\n\t\t\t\t\t\t\t@click=\"onMoreClick\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span class=\"more-caret\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"body overflowable\">\n\t\t\t\t\t\t<a :href=\"link.link\" :title=\"link.body\" target=\"_blank\" rel=\"noopener\"\n\t\t\t\t\t\t\t>{{ link.body }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"link.type === 'image'\">\n\t\t\t\t<a\n\t\t\t\t\t:href=\"link.link\"\n\t\t\t\t\tclass=\"toggle-thumbnail\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t@click=\"onThumbnailClick\"\n\t\t\t\t>\n\t\t\t\t\t<img\n\t\t\t\t\t\tv-show=\"link.sourceLoaded\"\n\t\t\t\t\t\t:src=\"link.thumb\"\n\t\t\t\t\t\tdecoding=\"async\"\n\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t@load=\"onPreviewReady\"\n\t\t\t\t\t/>\n\t\t\t\t</a>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"link.type === 'video'\">\n\t\t\t\t<video\n\t\t\t\t\tv-show=\"link.sourceLoaded\"\n\t\t\t\t\tpreload=\"metadata\"\n\t\t\t\t\tcontrols\n\t\t\t\t\t@canplay=\"onPreviewReady\"\n\t\t\t\t>\n\t\t\t\t\t<source :src=\"link.media\" :type=\"link.mediaType\" />\n\t\t\t\t</video>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"link.type === 'audio'\">\n\t\t\t\t<audio\n\t\t\t\t\tv-show=\"link.sourceLoaded\"\n\t\t\t\t\tcontrols\n\t\t\t\t\tpreload=\"metadata\"\n\t\t\t\t\t@canplay=\"onPreviewReady\"\n\t\t\t\t>\n\t\t\t\t\t<source :src=\"link.media\" :type=\"link.mediaType\" />\n\t\t\t\t</audio>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"link.type === 'error'\">\n\t\t\t\t<em v-if=\"link.error === 'image-too-big'\">\n\t\t\t\t\tThis image is larger than {{ imageMaxSize }}\n\n\t\t\t\t\tand cannot be previewed.\n\t\t\t\t\t<a :href=\"link.link\" target=\"_blank\" rel=\"noopener\">Click here</a>\n\t\t\t\t\tto open it in a new window.\n\t\t\t\t</em>\n\t\t\t\t<template v-else-if=\"link.error === 'message'\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<em>\n\t\t\t\t\t\t\tA preview could not be loaded.\n\t\t\t\t\t\t\t<a :href=\"link.link\" target=\"_blank\" rel=\"noopener\">Click here</a>\n\t\t\t\t\t\t\tto open it in a new window.\n\t\t\t\t\t\t</em>\n\t\t\t\t\t\t<br />\n\t\t\t\t\t\t<pre class=\"prefetch-error\"\n\t\t\t\t\t\t\t>{{ link.message }}\n\n</pre\n\t\t\t\t\t\t>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<button\n\t\t\t\t\t\t:aria-expanded=\"isContentShown\"\n\t\t\t\t\t\t:aria-label=\"moreButtonLabel\"\n\t\t\t\t\t\tclass=\"more\"\n\t\t\t\t\t\t@click=\"onMoreClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"more-caret\" />\n\t\t\t\t\t</button>\n\t\t\t\t</template>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {\n\tcomputed,\n\tdefineComponent,\n\tinject,\n\tnextTick,\n\tonBeforeUnmount,\n\tonMounted,\n\tonUnmounted,\n\tPropType,\n\tref,\n\twatch,\n} from \"vue\";\nimport {onBeforeRouteUpdate} from \"vue-router\";\nimport eventbus from \"../js/eventbus\";\nimport friendlysize from \"../js/helpers/friendlysize\";\nimport {useStore} from \"../js/store\";\nimport type {ClientChan, ClientLinkPreview} from \"../js/types\";\nimport {imageViewerKey} from \"./App.vue\";\n\nexport default defineComponent({\n\tname: \"LinkPreview\",\n\tprops: {\n\t\tlink: {\n\t\t\ttype: Object as PropType<ClientLinkPreview>,\n\t\t\trequired: true,\n\t\t},\n\t\tkeepScrollPosition: {\n\t\t\ttype: Function as PropType<() => void>,\n\t\t\trequired: true,\n\t\t},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\n\t\tconst showMoreButton = ref(false);\n\t\tconst isContentShown = ref(false);\n\t\tconst imageViewer = inject(imageViewerKey);\n\n\t\tonBeforeRouteUpdate((to, from, next) => {\n\t\t\t// cancel the navigation if the user is trying to close the image viewer\n\t\t\tif (imageViewer?.value?.link) {\n\t\t\t\timageViewer.value.closeViewer();\n\t\t\t\treturn next(false);\n\t\t\t}\n\n\t\t\tnext();\n\t\t});\n\n\t\tconst content = ref<HTMLDivElement | null>(null);\n\t\tconst container = ref<HTMLDivElement | null>(null);\n\n\t\tconst moreButtonLabel = computed(() => {\n\t\t\treturn isContentShown.value ? \"Less\" : \"More\";\n\t\t});\n\n\t\tconst imageMaxSize = computed(() => {\n\t\t\tif (!props.link.maxSize) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn friendlysize(props.link.maxSize);\n\t\t});\n\n\t\tconst handleResize = () => {\n\t\t\tnextTick(() => {\n\t\t\t\tif (!content.value || !container.value) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tshowMoreButton.value = content.value.offsetWidth >= container.value.offsetWidth;\n\t\t\t}).catch((e) => {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(\"Error in LinkPreview.handleResize\", e);\n\t\t\t});\n\t\t};\n\n\t\tconst onPreviewReady = () => {\n\t\t\tprops.link.sourceLoaded = true;\n\n\t\t\tprops.keepScrollPosition();\n\n\t\t\tif (props.link.type === \"link\") {\n\t\t\t\thandleResize();\n\t\t\t}\n\t\t};\n\n\t\tconst onPreviewUpdate = () => {\n\t\t\t// Don't display previews while they are loading on the server\n\t\t\tif (props.link.type === \"loading\") {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Error does not have any media to render\n\t\t\tif (props.link.type === \"error\") {\n\t\t\t\tonPreviewReady();\n\t\t\t}\n\n\t\t\t// If link doesn't have a thumbnail, render it\n\t\t\tif (props.link.type === \"link\") {\n\t\t\t\thandleResize();\n\t\t\t\tprops.keepScrollPosition();\n\t\t\t}\n\t\t};\n\n\t\tconst onThumbnailError = () => {\n\t\t\t// If thumbnail fails to load, hide it and show the preview without it\n\t\t\tprops.link.thumb = \"\";\n\t\t\tonPreviewReady();\n\t\t};\n\n\t\tconst onThumbnailClick = (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\n\t\t\tif (!imageViewer?.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\timageViewer.value.channel = props.channel;\n\t\t\timageViewer.value.link = props.link;\n\t\t};\n\n\t\tconst onMoreClick = () => {\n\t\t\tisContentShown.value = !isContentShown.value;\n\t\t\tprops.keepScrollPosition();\n\t\t};\n\n\t\tconst updateShownState = () => {\n\t\t\t// User has manually toggled the preview, do not apply default\n\t\t\tif (props.link.shown !== null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet defaultState = false;\n\n\t\t\tswitch (props.link.type) {\n\t\t\t\tcase \"error\":\n\t\t\t\t\t// Collapse all errors by default unless its a message about image being too big\n\t\t\t\t\tif (props.link.error === \"image-too-big\") {\n\t\t\t\t\t\tdefaultState = store.state.settings.media;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"link\":\n\t\t\t\t\tdefaultState = store.state.settings.links;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdefaultState = store.state.settings.media;\n\t\t\t}\n\n\t\t\tprops.link.shown = defaultState;\n\t\t};\n\n\t\tupdateShownState();\n\n\t\twatch(\n\t\t\t() => props.link.type,\n\t\t\t() => {\n\t\t\t\tupdateShownState();\n\t\t\t\tonPreviewUpdate();\n\t\t\t}\n\t\t);\n\n\t\tonMounted(() => {\n\t\t\teventbus.on(\"resize\", handleResize);\n\n\t\t\tonPreviewUpdate();\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\teventbus.off(\"resize\", handleResize);\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\t// Let this preview go through load/canplay events again,\n\t\t\t// Otherwise the browser can cause a resize on video elements\n\t\t\tprops.link.sourceLoaded = false;\n\t\t});\n\n\t\treturn {\n\t\t\tmoreButtonLabel,\n\t\t\timageMaxSize,\n\t\t\tonThumbnailClick,\n\t\t\tonThumbnailError,\n\t\t\tonMoreClick,\n\t\t\tonPreviewReady,\n\t\t\tonPreviewUpdate,\n\t\t\tshowMoreButton,\n\t\t\tisContentShown,\n\t\t\tcontent,\n\t\t\tcontainer,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./LinkPreview.vue?vue&type=template&id=5e54cfd6&ts=true\"\nimport script from \"./LinkPreview.vue?vue&type=script&lang=ts\"\nexport * from \"./LinkPreview.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import type {Component} from \"vue\";\n\n// This creates a version of `require()` in the context of the current\n// directory, so we iterate over its content, which is a map statically built by\n// Webpack.\n// Second argument says it's recursive, third makes sure we only load templates.\nconst requireViews = require.context(\".\", false, /\\.vue$/);\n\nexport default requireViews.keys().reduce((acc: Record<string, Component>, path) => {\n\tacc[\"message-\" + path.substring(2, path.length - 4)] = requireViews(path).default;\n\n\treturn acc;\n}, {});\n","export enum MessageType {\n\tUNHANDLED = \"unhandled\",\n\tACTION = \"action\",\n\tAWAY = \"away\",\n\tBACK = \"back\",\n\tERROR = \"error\",\n\tINVITE = \"invite\",\n\tJOIN = \"join\",\n\tKICK = \"kick\",\n\tLOGIN = \"login\",\n\tLOGOUT = \"logout\",\n\tMESSAGE = \"message\",\n\tMODE = \"mode\",\n\tMODE_CHANNEL = \"mode_channel\",\n\tMODE_USER = \"mode_user\", // RPL_UMODEIS\n\tMONOSPACE_BLOCK = \"monospace_block\",\n\tNICK = \"nick\",\n\tNOTICE = \"notice\",\n\tPART = \"part\",\n\tQUIT = \"quit\",\n\tCTCP = \"ctcp\",\n\tCTCP_REQUEST = \"ctcp_request\",\n\tCHGHOST = \"chghost\",\n\tTOPIC = \"topic\",\n\tTOPIC_SET_BY = \"topic_set_by\",\n\tWHOIS = \"whois\",\n\tRAW = \"raw\",\n\tPLUGIN = \"plugin\",\n\tWALLOPS = \"wallops\",\n\tMASS_EVENT = \"mass_event\",\n}\n\nexport type SharedUser = {\n\tmodes: string[];\n\t// Users in the channel have only one mode assigned\n\tmode: string;\n\taway: string;\n\tnick: string;\n\tlastMessage: number;\n};\n\nexport type UserInMessage = Partial<SharedUser> & {\n\tmode: string;\n\tshoutbox?: boolean;\n\toriginal_nick?: string;\n};\n\nexport type LinkPreview = {\n\ttype: string;\n\thead: string;\n\tbody: string;\n\tthumb: string;\n\tsize: number;\n\tlink: string; // Send original matched link to the client\n\tshown?: boolean | null;\n\terror?: string;\n\tmessage?: string;\n\n\tmedia?: string;\n\tmediaType?: string;\n\tmaxSize?: number;\n\tthumbActualUrl?: string;\n};\n\nexport interface WhoisData {\n\tnick: string;\n\terror?: boolean;\n\tidle?: number;\n\tlogon?: number;\n\twhowas?: boolean;\n\t[key: string]: unknown;\n}\n\nexport interface MassEventSummary {\n\tjoins: number;\n\tparts: number;\n\tquits: number;\n\tmodes: number;\n\tnicks: number;\n\tkicks: number;\n\tchghosts: number;\n\taway: number;\n\tback: number;\n\tduration: number;\n\tstartTime: Date;\n\tendTime: Date;\n}\n\nexport type SharedMsg = {\n\tfrom?: UserInMessage;\n\tid: number;\n\tpreviews?: LinkPreview[];\n\ttext?: string;\n\ttype?: MessageType;\n\tself?: boolean;\n\ttime: Date;\n\thostmask?: string;\n\ttarget?: UserInMessage;\n\t// TODO: new_nick is only on MessageType.NICK,\n\t// we should probably make Msgs that extend this class and use those\n\t// throughout. I'll leave any similar fields below.\n\tnew_nick?: string;\n\thighlight?: boolean;\n\tshowInActive?: boolean;\n\tnew_ident?: string;\n\tnew_host?: string;\n\tctcpMessage?: string;\n\tcommand?: string;\n\tinvitedYou?: boolean;\n\tgecos?: string;\n\taccount?: boolean;\n\n\t// these are all just for error:\n\terror?: string;\n\tnick?: string;\n\tchannel?: string;\n\treason?: string;\n\n\traw_modes?: string;\n\twhen?: Date;\n\twhois?: WhoisData;\n\n\tusers: string[];\n\n\tstatusmsgGroup?: string;\n\tparams?: string[];\n\tmassEventSummary?: MassEventSummary;\n};\n","import {type Matcher} from \"./types/matcher\";\n\n/**\n * Matchers for shoutbox messages\n */\nexport const matchers: Matcher[] = [\n\t{\n\t\ttype: \"basic\",\n\t\tname: \"Anthelion\",\n\t\tdescription: \"[ SB ] (<nick>): <message>\",\n\t\tmatches: [\"sauron\"],\n\t\tregex: /^.*?\\[.*?SB.*?\\][^(]+\\((?<nick>[^):]+)\\):.+?(?<content>.*)/,\n\t\ttransform(message) {\n\t\t\treturn typedGroups(message.text!.match(this.regex));\n\t\t},\n\t},\n\t{\n\t\ttype: \"basic\",\n\t\tname: \"BeyondHD + ReelFliX\",\n\t\tdescription: \"[SB] <nick>: <message> | [Chatbox] <nick>: <message>\",\n\t\tmatches: [\"willie\", \"wall-e\"],\n\t\tregex: /^.*?\\[(?:SB|Chatbox)\\][^\\w]+(?<nick>[^:]+): (?<content>.*)/,\n\t\ttransform(message) {\n\t\t\treturn typedGroups(message.text!.match(this.regex));\n\t\t},\n\t},\n\t{\n\t\ttype: \"basic\",\n\t\tname: \"UploadCX + LST + OnlyEncodes+ + HomiesHelpDesk + Aither + DarkPeers + Luminarr\",\n\t\tdescription: \"[nick] message | [nick]: message | nick: message | nick message\",\n\t\tmatches: [\"ulcx\", \"bot\", \"bridgebot\", \"bbot\", \"chatbot\", \"darkpeers\", \"luminarr\"],\n\t\tregex: /^\\[?(?<nick>[^:\\]]+)\\]?:? (?<content>.*)/,\n\t\ttransform(message) {\n\t\t\treturn typedGroups(message.text!.match(this.regex));\n\t\t},\n\t},\n\t{\n\t\ttype: \"basic\",\n\t\tname: \"RocketHD\",\n\t\tdescription: \"🛰️<nick>: <message>\",\n\t\tmatches: [\"rocketnouncer\"],\n\t\tregex: /^🛰️(?<nick>[^:]+?): (?<content>.*)/v,\n\t\ttransform(message) {\n\t\t\treturn typedGroups(message.text!.match(this.regex));\n\t\t},\n\t},\n\t{\n\t\ttype: \"basic\",\n\t\tname: \"DigitalCore\",\n\t\tdescription: \"<<nick>> <message>\",\n\t\tmatches: [\"endor\"],\n\t\tregex: /^<(?<nick>[^>]+?)> (?<content>.*)/,\n\t\ttransform(message) {\n\t\t\treturn typedGroups(message.text!.match(this.regex));\n\t\t},\n\t},\n\t{\n\t\ttype: \"basic\",\n\t\tname: \"HUNO (Discord)\",\n\t\tdescription: \"»<nick> (<rank>)« <message> | »<nick>« <message>\",\n\t\tmatches: [\"mellos\"],\n\t\tregex: /^»(?<nick>[^«]+?)(?: (?:\\p{RGI_Emoji}+|\\(.+?\\)))?« (?<content>.*)/v,\n\t\ttransform(message) {\n\t\t\treturn typedGroups(message.text!.match(this.regex));\n\t\t},\n\t},\n\t{\n\t\ttype: \"advanced\",\n\t\tname: \"HUNO (Web)\",\n\t\tdescription: \"Nicks in the format '<nick>-web'\",\n\t\tmatches(nick) {\n\t\t\treturn nick.endsWith(\"-web\") || nick.endsWith(\"-web\", nick.length - 2);\n\t\t},\n\t\ttransform(message) {\n\t\t\treturn {\n\t\t\t\tnick: message.from!.nick!.slice(0, -4),\n\t\t\t};\n\t\t},\n\t},\n];\n\n/**\n * Helper to get regex match groups with inferd types from return of parent\n */\nfunction typedGroups<T = RegExpMatchArray[\"groups\"]>(regexMatch: RegExpMatchArray | null) {\n\treturn regexMatch?.groups as T;\n}\n","import type {SharedMsg} from \"../../../../shared/types/msg\";\nimport {toRaw} from \"vue\";\nimport {matchers} from \"./matchers\";\n\n/**\n * Parse message aganst `Matchers` and edit the Nick and Content based on `transform` results\n */\nexport function parser(originalMessage: SharedMsg) {\n\tconst originalSender = originalMessage.from?.nick?.toLowerCase();\n\n\tif (!originalMessage.text || !originalSender) return originalMessage;\n\n\tconst matcher = matchers.find((m) => {\n\t\tif (m.type === \"basic\") return m.matches.includes(originalSender);\n\t\tif (m.type === \"advanced\") return m.matches(originalSender);\n\t});\n\tif (!matcher) return originalMessage;\n\n\tconst edit = matcher.transform(originalMessage);\n\tif (!edit || !edit.nick) return originalMessage;\n\n\tconst message = structuredClone(toRaw(originalMessage));\n\tmessage.text = edit.content ?? message.text;\n\tmessage.from = {\n\t\t...message.from!,\n\t\tnick: sanitizeNick(edit.nick),\n\t\tmode: \"\",\n\t\tshoutbox: true,\n\t\toriginal_nick: originalSender,\n\t};\n\n\treturn message;\n}\n\n/**\n * Helper to remove invalid chars from nick string\n */\nfunction sanitizeNick(nick: string) {\n\treturn nick.replaceAll(/[^0-9a-z_-|]/gi, \"\");\n}\n","import { render } from \"./Message.vue?vue&type=template&id=1b66bbdb&ts=true\"\nimport script from \"./Message.vue?vue&type=script&lang=ts\"\nexport * from \"./Message.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<form :class=\"['message-search', {opened: searchOpened}]\" @submit.prevent=\"searchMessages\">\n\t\t<div class=\"input-wrapper\">\n\t\t\t<input\n\t\t\t\tref=\"searchInputField\"\n\t\t\t\tv-model=\"searchInput\"\n\t\t\t\ttype=\"search\"\n\t\t\t\tname=\"search\"\n\t\t\t\tclass=\"input\"\n\t\t\t\tplaceholder=\"Search messages…\"\n\t\t\t\t@blur=\"closeSearch\"\n\t\t\t\t@keyup.esc=\"closeSearch\"\n\t\t\t/>\n\t\t</div>\n\t\t<button\n\t\t\tv-if=\"!onSearchPage\"\n\t\t\tclass=\"search\"\n\t\t\ttype=\"button\"\n\t\t\taria-label=\"Search messages in this channel\"\n\t\t\t@mousedown.prevent=\"toggleSearch\"\n\t\t/>\n\t</form>\n</template>\n\n<style>\nform.message-search {\n\tdisplay: flex;\n}\n\nform.message-search .input-wrapper {\n\tdisplay: flex;\n}\n\nform.message-search input {\n\twidth: 100%;\n\theight: auto !important;\n\tmargin: 7px 0;\n\tborder: 0;\n\tcolor: inherit;\n\tbackground-color: #fafafa;\n\tappearance: none;\n}\n\nform.message-search input::placeholder {\n\tcolor: rgb(0 0 0 / 35%);\n}\n\n@media (width >= 480px) {\n\tform.message-search input {\n\t\tmin-width: 140px;\n\t}\n\n\tform.message-search input:focus {\n\t\tmin-width: 220px;\n\t}\n}\n\nform.message-search .input-wrapper {\n\tposition: absolute;\n\ttop: 45px;\n\tleft: 0;\n\tright: 0;\n\tz-index: 1;\n\theight: 0;\n\toverflow: hidden;\n\tbackground: var(--window-bg-color);\n}\n\nform.message-search .input-wrapper input {\n\tmargin: 7px;\n}\n\nform.message-search.opened .input-wrapper {\n\theight: 50px;\n}\n\n#chat form.message-search button {\n\tdisplay: flex;\n\tcolor: #607992;\n}\n</style>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, onMounted, PropType, ref, watch} from \"vue\";\nimport {useRoute, useRouter} from \"vue-router\";\nimport eventbus from \"../js/eventbus\";\nimport {ClientNetwork, ClientChan} from \"../js/types\";\n\nexport default defineComponent({\n\tname: \"MessageSearchForm\",\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\tsetup(props) {\n\t\tconst searchOpened = ref(false);\n\t\tconst searchInput = ref(\"\");\n\t\tconst router = useRouter();\n\t\tconst route = useRoute();\n\n\t\tconst searchInputField = ref<HTMLInputElement | null>(null);\n\n\t\tconst onSearchPage = computed(() => {\n\t\t\treturn route.name === \"SearchResults\";\n\t\t});\n\n\t\twatch(route, (newValue) => {\n\t\t\tif (newValue.query.q) {\n\t\t\t\tsearchInput.value = String(newValue.query.q);\n\t\t\t}\n\t\t});\n\n\t\tonMounted(() => {\n\t\t\tsearchInput.value = String(route.query.q || \"\");\n\t\t\tsearchOpened.value = onSearchPage.value;\n\n\t\t\tif (searchInputField.value && !searchInput.value && searchOpened.value) {\n\t\t\t\tsearchInputField.value.focus();\n\t\t\t}\n\t\t});\n\n\t\tconst closeSearch = () => {\n\t\t\tif (!onSearchPage.value) {\n\t\t\t\tsearchInput.value = \"\";\n\t\t\t\tsearchOpened.value = false;\n\t\t\t}\n\t\t};\n\n\t\tconst toggleSearch = () => {\n\t\t\tif (searchOpened.value) {\n\t\t\t\tsearchInputField.value?.blur();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsearchOpened.value = true;\n\t\t\tsearchInputField.value?.focus();\n\t\t};\n\n\t\tconst searchMessages = (event: Event) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tif (!searchInput.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trouter\n\t\t\t\t.push({\n\t\t\t\t\tname: \"SearchResults\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tid: props.channel.id,\n\t\t\t\t\t},\n\t\t\t\t\tquery: {\n\t\t\t\t\t\tq: searchInput.value,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tif (err.name === \"NavigationDuplicated\") {\n\t\t\t\t\t\t// Search for the same query again\n\t\t\t\t\t\teventbus.emit(\"re-search\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t};\n\n\t\treturn {\n\t\t\tsearchOpened,\n\t\t\tsearchInput,\n\t\t\tsearchInputField,\n\t\t\tcloseSearch,\n\t\t\ttoggleSearch,\n\t\t\tsearchMessages,\n\t\t\tonSearchPage,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./MessageSearchForm.vue?vue&type=template&id=7ff02a4a&ts=true\"\nimport script from \"./MessageSearchForm.vue?vue&type=script&lang=ts\"\nexport * from \"./MessageSearchForm.vue?vue&type=script&lang=ts\"\n\nimport \"./MessageSearchForm.vue?vue&type=style&index=0&id=7ff02a4a&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div :aria-label=\"localeDate\" class=\"date-marker-container tooltipped tooltipped-s\">\n\t\t<div class=\"date-marker\">\n\t\t\t;\n\t\t\t<span :aria-label=\"friendlyDate()\" class=\"date-marker-text\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport dayjs from \"dayjs\";\nimport calendar from \"dayjs/plugin/calendar\";\nimport {computed, defineComponent, onBeforeUnmount, onMounted, PropType} from \"vue\";\nimport eventbus from \"../js/eventbus\";\nimport type {ClientMessage} from \"../js/types\";\n\ndayjs.extend(calendar);\n\nexport default defineComponent({\n\tname: \"DateMarker\",\n\tprops: {\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t\tisFocused: Boolean,\n\t},\n\tsetup(props) {\n\t\tconst localeDate = computed(() => dayjs(props.message.time).format(\"D MMMM YYYY\"));\n\n\t\tconst hoursPassed = () => {\n\t\t\treturn (Date.now() - Date.parse(props.message.time.toString())) / 3600000;\n\t\t};\n\n\t\tconst dayChange = () => {\n\t\t\tif (hoursPassed() >= 48) {\n\t\t\t\teventbus.off(\"daychange\", dayChange);\n\t\t\t}\n\t\t};\n\n\t\tconst friendlyDate = () => {\n\t\t\t// See http://momentjs.com/docs/#/displaying/calendar-time/\n\t\t\treturn dayjs(props.message.time).calendar(null, {\n\t\t\t\tsameDay: \"[Today]\",\n\t\t\t\tlastDay: \"[Yesterday]\",\n\t\t\t\tlastWeek: \"D MMMM YYYY\",\n\t\t\t\tsameElse: \"D MMMM YYYY\",\n\t\t\t});\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\tif (hoursPassed() < 48) {\n\t\t\t\teventbus.on(\"daychange\", dayChange);\n\t\t\t}\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\teventbus.off(\"daychange\", dayChange);\n\t\t});\n\n\t\treturn {\n\t\t\tlocaleDate,\n\t\t\tfriendlyDate,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./DateMarker.vue?vue&type=template&id=7c73401a&ts=true\"\nimport script from \"./DateMarker.vue?vue&type=script&lang=ts\"\nexport * from \"./DateMarker.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./SearchResults.vue?vue&type=template&id=1274a5a1&ts=true\"\nimport script from \"./SearchResults.vue?vue&type=script&lang=ts\"\nexport * from \"./SearchResults.vue?vue&type=script&lang=ts\"\n\nimport \"./SearchResults.vue?vue&type=style&index=0&id=1274a5a1&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div id=\"chat-container\" class=\"window\" :data-current-channel=\"channel.name\" lang=\"\">\n\t\t<div\n\t\t\tid=\"chat\"\n\t\t\t:class=\"{\n\t\t\t\t'hide-motd': !store.state.settings.motd,\n\t\t\t\t'time-seconds': store.state.settings.showSeconds,\n\t\t\t\t'time-12h': store.state.settings.use12hClock,\n\t\t\t\t'colored-nicks': true, // TODO temporarily fixes themes, to be removed in next major version\n\t\t\t}\"\n\t\t>\n\t\t\t<div\n\t\t\t\t:id=\"'chan-' + channel.id\"\n\t\t\t\tclass=\"chat-view\"\n\t\t\t\t:data-type=\"channel.type\"\n\t\t\t\t:aria-label=\"channel.name\"\n\t\t\t\trole=\"tabpanel\"\n\t\t\t>\n\t\t\t\t<div class=\"header\">\n\t\t\t\t\t<SidebarToggle />\n\t\t\t\t\t<span class=\"title\" :aria-label=\"'Currently open ' + channel.type\">{{\n\t\t\t\t\t\tchannel.name\n\t\t\t\t\t}}</span>\n\t\t\t\t\t<div v-if=\"channel.editTopic === true\" class=\"topic-container\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tref=\"topicInput\"\n\t\t\t\t\t\t\t:value=\"channel.topic\"\n\t\t\t\t\t\t\tclass=\"topic-input\"\n\t\t\t\t\t\t\tplaceholder=\"Set channel topic\"\n\t\t\t\t\t\t\tenterkeyhint=\"done\"\n\t\t\t\t\t\t\t@keyup.enter=\"saveTopic\"\n\t\t\t\t\t\t\t@keyup.esc=\"channel.editTopic = false\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span aria-label=\"Save topic\" class=\"save-topic\" @click=\"saveTopic\">\n\t\t\t\t\t\t\t<span type=\"button\" aria-label=\"Save topic\"></span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:title=\"channel.topic\"\n\t\t\t\t\t\t:class=\"{topic: true, empty: !channel.topic}\"\n\t\t\t\t\t\t@dblclick=\"editTopic\"\n\t\t\t\t\t\t><ParsedMessage\n\t\t\t\t\t\t\tv-if=\"channel.topic\"\n\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t:text=\"channel.topic\"\n\t\t\t\t\t/></span>\n\t\t\t\t\t<MessageSearchForm\n\t\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t\tstore.state.settings.searchEnabled &&\n\t\t\t\t\t\t\t['channel', 'query'].includes(channel.type)\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"mentions\"\n\t\t\t\t\t\taria-label=\"Open your mentions\"\n\t\t\t\t\t\t@click=\"openMentions\"\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"menu\"\n\t\t\t\t\t\taria-label=\"Open the context menu\"\n\t\t\t\t\t\t@click=\"openContextMenu\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-if=\"channel.type === 'channel'\"\n\t\t\t\t\t\tclass=\"rt-tooltip tooltipped tooltipped-w\"\n\t\t\t\t\t\taria-label=\"Toggle user list\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"rt\"\n\t\t\t\t\t\t\taria-label=\"Toggle user list\"\n\t\t\t\t\t\t\t@click=\"store.commit('toggleUserlist')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"channel.type === 'special'\" class=\"chat-content\">\n\t\t\t\t\t<div class=\"chat\">\n\t\t\t\t\t\t<div class=\"messages\">\n\t\t\t\t\t\t\t<div class=\"msg\">\n\t\t\t\t\t\t\t\t<component\n\t\t\t\t\t\t\t\t\t:is=\"specialComponent\"\n\t\t\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div v-else class=\"chat-content\">\n\t\t\t\t\t<div\n\t\t\t\t\t\t:class=\"[\n\t\t\t\t\t\t\t'scroll-down tooltipped tooltipped-w tooltipped-no-touch',\n\t\t\t\t\t\t\t{'scroll-down-shown': !channel.scrolledToBottom},\n\t\t\t\t\t\t]\"\n\t\t\t\t\t\taria-label=\"Jump to recent messages\"\n\t\t\t\t\t\t@click=\"messageList.jumpToBottom\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"scroll-down-arrow\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<ChatUserList v-if=\"channel.type === 'channel'\" :channel=\"channel\" />\n\t\t\t\t\t<template\n\t\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t\tstore.state.settings.searchEnabled &&\n\t\t\t\t\t\t\tstore.state.settings.enableEnhancedSearch\n\t\t\t\t\t\t\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<MessageList\n\t\t\t\t\t\t\tref=\"messageList\"\n\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t\t\t:is-focused=\"isFocused\"\n\t\t\t\t\t\t\t:focused-time=\"focusedTime\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t<MessageListBasic\n\t\t\t\t\t\t\tref=\"messageList\"\n\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t\t\t:is-focused=\"isFocused\"\n\t\t\t\t\t\t\t:focused-time=\"focusedTime\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"store.state.currentUserVisibleError\"\n\t\t\tid=\"user-visible-error\"\n\t\t\t@click=\"hideUserVisibleError\"\n\t\t>\n\t\t\t{{ store.state.currentUserVisibleError }}\n\t\t</div>\n\t\t<ChatInput :network=\"network\" :channel=\"channel\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport socket from \"../js/socket\";\nimport eventbus from \"../js/eventbus\";\nimport ParsedMessage from \"./ParsedMessage.vue\";\nimport MessageList from \"./MessageList.vue\";\nimport MessageListBasic from \"./MessageList_Basic.vue\";\nimport ChatInput from \"./ChatInput.vue\";\nimport ChatUserList from \"./ChatUserList.vue\";\nimport SidebarToggle from \"./SidebarToggle.vue\";\nimport MessageSearchForm from \"./MessageSearchForm.vue\";\nimport ListBans from \"./Special/ListBans.vue\";\nimport ListInvites from \"./Special/ListInvites.vue\";\nimport ListChannels from \"./Special/ListChannels.vue\";\nimport ListIgnored from \"./Special/ListIgnored.vue\";\nimport {defineComponent, PropType, ref, computed, watch, nextTick, onMounted, Component} from \"vue\";\nimport type {ClientNetwork, ClientChan} from \"../js/types\";\nimport {useStore} from \"../js/store\";\nimport {SpecialChanType, ChanType} from \"../../shared/types/chan\";\n\nexport default defineComponent({\n\tname: \"Chat\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tMessageList,\n\t\tMessageListBasic,\n\t\tChatInput,\n\t\tChatUserList,\n\t\tSidebarToggle,\n\t\tMessageSearchForm,\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t\tisFocused: Number,\n\t\tfocusedTime: Number,\n\t},\n\temits: [\"channel-changed\"],\n\tsetup(props, {emit}) {\n\t\tconst store = useStore();\n\n\t\tconst MessageListType = computed(() => {\n\t\t\tif (store.state.settings.searchEnabled && store.state.settings.enableEnhancedSearch)\n\t\t\t\treturn MessageList;\n\t\t\treturn MessageListBasic;\n\t\t});\n\n\t\tconst messageList = ref<typeof MessageListType.value>(MessageListType.value);\n\t\tconst topicInput = ref<HTMLInputElement | null>(null);\n\n\t\tconst specialComponent = computed(() => {\n\t\t\tswitch (props.channel.special) {\n\t\t\t\tcase SpecialChanType.BANLIST:\n\t\t\t\t\treturn ListBans as Component;\n\t\t\t\tcase SpecialChanType.INVITELIST:\n\t\t\t\t\treturn ListInvites as Component;\n\t\t\t\tcase SpecialChanType.CHANNELLIST:\n\t\t\t\t\treturn ListChannels as Component;\n\t\t\t\tcase SpecialChanType.IGNORELIST:\n\t\t\t\t\treturn ListIgnored as Component;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t});\n\n\t\tconst channelChanged = () => {\n\t\t\t// Triggered when active channel is set or changed\n\t\t\temit(\"channel-changed\", props.channel);\n\n\t\t\tsocket.emit(\"open\", props.channel.id);\n\n\t\t\tif (props.channel.usersOutdated) {\n\t\t\t\tprops.channel.usersOutdated = false;\n\n\t\t\t\tsocket.emit(\"names\", {\n\t\t\t\t\ttarget: props.channel.id,\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tconst hideUserVisibleError = () => {\n\t\t\tstore.commit(\"currentUserVisibleError\", null);\n\t\t};\n\n\t\tconst editTopic = () => {\n\t\t\tif (props.channel.type === ChanType.CHANNEL) {\n\t\t\t\tprops.channel.editTopic = true;\n\t\t\t}\n\t\t};\n\n\t\tconst saveTopic = () => {\n\t\t\tprops.channel.editTopic = false;\n\n\t\t\tif (!topicInput.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst newTopic = topicInput.value.value;\n\n\t\t\tif (props.channel.topic !== newTopic) {\n\t\t\t\tconst target = props.channel.id;\n\t\t\t\tconst text = `/topic ${newTopic}`;\n\t\t\t\tsocket.emit(\"input\", {target, text});\n\t\t\t}\n\t\t};\n\n\t\tconst openContextMenu = (event: MouseEvent) => {\n\t\t\teventbus.emit(\"contextmenu:channel\", {\n\t\t\t\tevent: event,\n\t\t\t\tchannel: props.channel,\n\t\t\t\tnetwork: props.network,\n\t\t\t});\n\t\t};\n\n\t\tconst openMentions = (event: MouseEvent) => {\n\t\t\teventbus.emit(\"mentions:toggle\", {\n\t\t\t\tevent: event,\n\t\t\t});\n\t\t};\n\n\t\twatch(\n\t\t\t() => props.channel,\n\t\t\t() => {\n\t\t\t\tchannelChanged();\n\t\t\t}\n\t\t);\n\n\t\twatch(\n\t\t\t() => props.channel.editTopic,\n\t\t\t(newTopic) => {\n\t\t\t\tif (newTopic) {\n\t\t\t\t\tvoid nextTick(() => {\n\t\t\t\t\t\ttopicInput.value?.focus();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\tonMounted(() => {\n\t\t\tchannelChanged();\n\n\t\t\tif (props.channel.editTopic) {\n\t\t\t\tvoid nextTick(() => {\n\t\t\t\t\ttopicInput.value?.focus();\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tmessageList,\n\t\t\tMessageListType,\n\t\t\ttopicInput,\n\t\t\tspecialComponent,\n\t\t\thideUserVisibleError,\n\t\t\teditTopic,\n\t\t\tsaveTopic,\n\t\t\topenContextMenu,\n\t\t\topenMentions,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<div ref=\"chat\" class=\"chat\" tabindex=\"-1\">\n\t\t<div v-show=\"showLoadMoreButton\" class=\"show-more\">\n\t\t\t<button\n\t\t\t\tref=\"loadMoreButton\"\n\t\t\t\t:disabled=\"channel.historyLoading || !store.state.isConnected\"\n\t\t\t\tclass=\"btn\"\n\t\t\t\t@click=\"onShowMoreClick\"\n\t\t\t>\n\t\t\t\t<span v-if=\"channel.historyLoading\">Loading…</span>\n\t\t\t\t<span v-else>Show older messages</span>\n\t\t\t</button>\n\t\t</div>\n\t\t<div\n\t\t\tclass=\"messages\"\n\t\t\trole=\"log\"\n\t\t\taria-live=\"polite\"\n\t\t\taria-relevant=\"additions\"\n\t\t\t@copy=\"onCopy\"\n\t\t>\n\t\t\t<template v-for=\"(message, idx) in displayedMessages\" :key=\"getMessageKey(message)\">\n\t\t\t\t<DateMarker\n\t\t\t\t\tv-if=\"shouldDisplayDateMarker(message, idx)\"\n\t\t\t\t\t:message=\"message as any\"\n\t\t\t\t\t:is-focused=\"isMessageFocused(message)\"\n\t\t\t\t/>\n\t\t\t\t<div v-if=\"shouldDisplayUnreadMarker(Number(message.id))\" class=\"unread-marker\">\n\t\t\t\t\t<span class=\"unread-marker-text\" />\n\t\t\t\t</div>\n\n\t\t\t\t<MessageCondensed\n\t\t\t\t\tv-if=\"message.type === 'condensed'\"\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:keep-scroll-position=\"keepScrollPosition\"\n\t\t\t\t\t:messages=\"message.messages\"\n\t\t\t\t\t:is-focused=\"isMessageFocused(message)\"\n\t\t\t\t/>\n\t\t\t\t<Message\n\t\t\t\t\tv-else\n\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:message=\"message\"\n\t\t\t\t\t:keep-scroll-position=\"keepScrollPosition\"\n\t\t\t\t\t:is-previous-source=\"isPreviousSource(message, idx)\"\n\t\t\t\t\t:is-focused=\"isMessageFocused(message)\"\n\t\t\t\t\t@toggle-link-preview=\"onLinkPreviewToggle\"\n\t\t\t\t/>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {condensedTypes} from \"../../shared/irc\";\nimport {ChanType} from \"../../shared/types/chan\";\nimport {MessageType, SharedMsg} from \"../../shared/types/msg\";\n\nimport eventbus from \"../js/eventbus\";\nimport clipboard from \"../js/clipboard\";\nimport socket from \"../js/socket\";\nimport Message from \"./Message.vue\";\nimport MessageCondensed from \"./MessageCondensed.vue\";\nimport DateMarker from \"./DateMarker.vue\";\nimport {\n\tcomputed,\n\tdefineComponent,\n\tnextTick,\n\tonBeforeUnmount,\n\tonBeforeUpdate,\n\tonMounted,\n\tonUnmounted,\n\tPropType,\n\tref,\n\twatch,\n} from \"vue\";\nimport {useStore} from \"../js/store\";\nimport {ClientChan, ClientMessage, ClientNetwork, ClientLinkPreview} from \"../js/types\";\n\ntype CondensedMessageContainer = {\n\ttype: \"condensed\";\n\ttime: Date;\n\tmessages: ClientMessage[];\n\tid?: number;\n};\n\n// Render at most this many messages - keeps DOM manageable\nconst MAX_RENDERED_MESSAGES = 500;\n\nexport default defineComponent({\n\tname: \"MessageList\",\n\tcomponents: {\n\t\tMessage,\n\t\tMessageCondensed,\n\t\tDateMarker,\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t\tisFocused: Number,\n\t\tfocusedTime: Number,\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\n\t\tconst chat = ref<HTMLDivElement | null>(null);\n\t\tconst loadMoreButton = ref<HTMLButtonElement | null>(null);\n\t\tconst historyObserver = ref<IntersectionObserver | null>(null);\n\n\t\t// The currently focused/highlighted message ID (primary) or time (fallback)\n\t\tconst focusedMsgId = ref<number | null>(null);\n\t\tconst focusedMsgTime = ref<number | null>(null);\n\n\t\t// Flag to prevent scroll handler during programmatic scrolls\n\t\tconst isScrolling = ref(false);\n\n\t\t// Window start index for virtual scrolling - tracks which message index to start from\n\t\tconst windowStartIndex = ref(0);\n\n\t\t// Track if we're currently adjusting the window (to prevent scroll handler interference)\n\t\tconst isAdjustingWindow = ref(false);\n\n\t\t// Threshold for triggering window shifts (in pixels from edge)\n\t\tconst SCROLL_THRESHOLD = 200;\n\n\t\tlet unreadMarkerShown = false;\n\n\t\t// Build condensed message list (all messages, before windowing)\n\t\tconst allCondensedMessages = computed(() => {\n\t\t\tif (props.channel.type !== ChanType.CHANNEL && props.channel.type !== ChanType.QUERY) {\n\t\t\t\treturn props.channel.messages;\n\t\t\t}\n\n\t\t\tif (store.state.settings.statusMessages === \"hidden\") {\n\t\t\t\treturn props.channel.messages.filter(\n\t\t\t\t\t(message) => !condensedTypes.has(message.type || \"\")\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (store.state.settings.statusMessages !== \"condensed\") {\n\t\t\t\treturn props.channel.messages;\n\t\t\t}\n\n\t\t\tlet lastCondensedContainer: CondensedMessageContainer | null = null;\n\t\t\tconst condensed: (ClientMessage | CondensedMessageContainer)[] = [];\n\n\t\t\tfor (const message of props.channel.messages) {\n\t\t\t\tif (message.self || message.highlight || !condensedTypes.has(message.type || \"\")) {\n\t\t\t\t\tlastCondensedContainer = null;\n\t\t\t\t\tcondensed.push(message);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!lastCondensedContainer) {\n\t\t\t\t\tlastCondensedContainer = {\n\t\t\t\t\t\ttime: message.time,\n\t\t\t\t\t\ttype: \"condensed\",\n\t\t\t\t\t\tmessages: [],\n\t\t\t\t\t};\n\t\t\t\t\tcondensed.push(lastCondensedContainer);\n\t\t\t\t}\n\n\t\t\t\tlastCondensedContainer.messages.push(message);\n\t\t\t\tlastCondensedContainer.id = message.id;\n\n\t\t\t\tif (message.id === props.channel.firstUnread) {\n\t\t\t\t\tlastCondensedContainer = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn condensed.map((message) => {\n\t\t\t\tif (message.type === \"condensed\" && message.messages.length === 1) {\n\t\t\t\t\treturn message.messages[0];\n\t\t\t\t}\n\n\t\t\t\treturn message;\n\t\t\t});\n\t\t});\n\n\t\t// Windowed messages for rendering - show MAX_RENDERED_MESSAGES from windowStartIndex\n\t\t// This does NOT depend on scrolledToBottom to avoid reactivity issues\n\t\tconst displayedMessages = computed(() => {\n\t\t\tconst all = allCondensedMessages.value;\n\t\t\tconst total = all.length;\n\n\t\t\tif (total <= MAX_RENDERED_MESSAGES) {\n\t\t\t\treturn all;\n\t\t\t}\n\n\t\t\t// Use the window start index, clamped to valid range\n\t\t\tconst start = Math.max(\n\t\t\t\t0,\n\t\t\t\tMath.min(windowStartIndex.value, total - MAX_RENDERED_MESSAGES)\n\t\t\t);\n\t\t\treturn all.slice(start, start + MAX_RENDERED_MESSAGES);\n\t\t});\n\n\t\t// Check if we can scroll further back in the window (not at start of all messages)\n\t\tconst canScrollBack = computed(() => {\n\t\t\treturn windowStartIndex.value > 0;\n\t\t});\n\n\t\t// Check if we're showing the latest messages\n\t\tconst isAtEnd = computed(() => {\n\t\t\tconst total = allCondensedMessages.value.length;\n\t\t\treturn (\n\t\t\t\ttotal <= MAX_RENDERED_MESSAGES ||\n\t\t\t\twindowStartIndex.value >= total - MAX_RENDERED_MESSAGES\n\t\t\t);\n\t\t});\n\n\t\t// Should we show the \"load more\" button?\n\t\t// Only show when at the start of all loaded messages AND server has more\n\t\tconst showLoadMoreButton = computed(() => {\n\t\t\treturn props.channel.moreHistoryAvailable && windowStartIndex.value === 0;\n\t\t});\n\n\t\t// Helper to get a unique key for each message\n\t\tconst getMessageKey = (message: ClientMessage | CondensedMessageContainer) => {\n\t\t\tif (message.type === \"condensed\") {\n\t\t\t\treturn `condensed-${message.messages[0]?.id}-${new Date(message.time).getTime()}`;\n\t\t\t}\n\n\t\t\t// Use time as part of key since IDs can be inconsistent\n\t\t\treturn `${message.id}-${new Date(message.time).getTime()}`;\n\t\t};\n\n\t\t// Check if a message is focused (by ID first, then timestamp fallback)\n\t\tconst isMessageFocused = (message: ClientMessage | CondensedMessageContainer): boolean => {\n\t\t\t// Check by ID first (preferred)\n\t\t\tif (focusedMsgId.value !== null) {\n\t\t\t\tif (message.type === \"condensed\") {\n\t\t\t\t\treturn message.messages.some((inner) => inner.id === focusedMsgId.value);\n\t\t\t\t}\n\n\t\t\t\treturn message.id === focusedMsgId.value;\n\t\t\t}\n\n\t\t\t// Fallback to time-based matching\n\t\t\tif (!focusedMsgTime.value) return false;\n\n\t\t\tconst msgTime = new Date(message.time).getTime();\n\n\t\t\t// Allow 1 second tolerance\n\t\t\tif (Math.abs(msgTime - focusedMsgTime.value) < 1000) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Check inside condensed messages\n\t\t\tif (message.type === \"condensed\") {\n\t\t\t\tfor (const inner of message.messages) {\n\t\t\t\t\tconst innerTime = new Date(inner.time).getTime();\n\n\t\t\t\t\tif (Math.abs(innerTime - focusedMsgTime.value) < 1000) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\t// Scroll to bottom of the current DOM\n\t\tconst scrollToBottom = () => {\n\t\t\tif (chat.value) {\n\t\t\t\tisScrolling.value = true;\n\t\t\t\tchat.value.scrollTop = chat.value.scrollHeight;\n\n\t\t\t\t// Reset after a short delay to allow the scroll event to fire\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tisScrolling.value = false;\n\t\t\t\t}, 50);\n\t\t\t}\n\t\t};\n\n\t\t// Jump to the absolute bottom (latest messages) and mark as at bottom\n\t\tconst jumpToBottom = async () => {\n\t\t\tconst total = allCondensedMessages.value.length;\n\t\t\twindowStartIndex.value = Math.max(0, total - MAX_RENDERED_MESSAGES);\n\t\t\tprops.channel.scrolledToBottom = true;\n\t\t\tisAdjustingWindow.value = true;\n\t\t\tawait nextTick();\n\t\t\tscrollToBottom();\n\t\t\tisAdjustingWindow.value = false;\n\t\t};\n\n\t\t// Shift window up (show older messages) while preserving scroll position\n\t\tconst shiftWindowUp = async (amount: number = 100) => {\n\t\t\tif (isAdjustingWindow.value || windowStartIndex.value <= 0) return;\n\n\t\t\tconst el = chat.value;\n\t\t\tif (!el) return;\n\n\t\t\tisAdjustingWindow.value = true;\n\t\t\tconst oldScrollHeight = el.scrollHeight;\n\t\t\tconst oldScrollTop = el.scrollTop;\n\n\t\t\t// Shift window up\n\t\t\tconst newStart = Math.max(0, windowStartIndex.value - amount);\n\t\t\tconst actualShift = windowStartIndex.value - newStart;\n\n\t\t\tif (actualShift === 0) {\n\t\t\t\tisAdjustingWindow.value = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twindowStartIndex.value = newStart;\n\t\t\tprops.channel.scrolledToBottom = false;\n\n\t\t\tawait nextTick();\n\n\t\t\t// Restore scroll position relative to the content that was visible\n\t\t\tconst newScrollHeight = el.scrollHeight;\n\t\t\tconst heightDiff = newScrollHeight - oldScrollHeight;\n\t\t\tel.scrollTop = oldScrollTop + heightDiff;\n\n\t\t\tisAdjustingWindow.value = false;\n\t\t};\n\n\t\t// Shift window down (show newer messages) while preserving scroll position\n\t\tconst shiftWindowDown = async (amount: number = 100) => {\n\t\t\tif (isAdjustingWindow.value) return;\n\n\t\t\tconst total = allCondensedMessages.value.length;\n\t\t\tconst maxStart = Math.max(0, total - MAX_RENDERED_MESSAGES);\n\t\t\tif (windowStartIndex.value >= maxStart) return;\n\n\t\t\tconst el = chat.value;\n\t\t\tif (!el) return;\n\n\t\t\tisAdjustingWindow.value = true;\n\t\t\tconst oldScrollHeight = el.scrollHeight;\n\t\t\tconst oldScrollTop = el.scrollTop;\n\n\t\t\t// Shift window down\n\t\t\tconst newStart = Math.min(maxStart, windowStartIndex.value + amount);\n\t\t\twindowStartIndex.value = newStart;\n\n\t\t\t// Check if we're now at the end\n\t\t\tif (newStart >= maxStart) {\n\t\t\t\tprops.channel.scrolledToBottom = true;\n\t\t\t}\n\n\t\t\tawait nextTick();\n\n\t\t\t// Restore scroll position relative to the content that was visible\n\t\t\tconst newScrollHeight = el.scrollHeight;\n\t\t\tconst heightDiff = oldScrollHeight - newScrollHeight;\n\t\t\tel.scrollTop = oldScrollTop - heightDiff;\n\n\t\t\tisAdjustingWindow.value = false;\n\t\t};\n\n\t\t// Find and scroll to a message by ID\n\t\tconst jumpToMessage = async (msgId: number, fallbackTime?: number): Promise<boolean> => {\n\t\t\tfocusedMsgId.value = msgId;\n\t\t\tfocusedMsgTime.value = fallbackTime || null;\n\t\t\tprops.channel.scrolledToBottom = false;\n\t\t\tisAdjustingWindow.value = true;\n\n\t\t\t// Find the message index in all messages\n\t\t\tconst all = allCondensedMessages.value;\n\t\t\tlet targetIndex = -1;\n\n\t\t\tfor (let i = 0; i < all.length; i++) {\n\t\t\t\tconst msg = all[i];\n\n\t\t\t\tif (msg.type === \"condensed\") {\n\t\t\t\t\tif (msg.messages.some((inner) => inner.id === msgId)) {\n\t\t\t\t\t\ttargetIndex = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else if (msg.id === msgId) {\n\t\t\t\t\ttargetIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If not found by ID and we have a fallback time, try time-based search\n\t\t\tif (targetIndex === -1 && fallbackTime) {\n\t\t\t\tfor (let i = 0; i < all.length; i++) {\n\t\t\t\t\tconst msg = all[i];\n\t\t\t\t\tconst msgTime = new Date(msg.time).getTime();\n\n\t\t\t\t\tif (Math.abs(msgTime - fallbackTime) < 1000) {\n\t\t\t\t\t\ttargetIndex = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (msg.type === \"condensed\") {\n\t\t\t\t\t\tfor (const inner of msg.messages) {\n\t\t\t\t\t\t\tconst innerTime = new Date(inner.time).getTime();\n\n\t\t\t\t\t\t\tif (Math.abs(innerTime - fallbackTime) < 1000) {\n\t\t\t\t\t\t\t\ttargetIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (targetIndex !== -1) break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (targetIndex === -1) {\n\t\t\t\t// Message not found in current messages\n\t\t\t\tisAdjustingWindow.value = false;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Adjust window to include the target message (center it if possible)\n\t\t\tif (all.length > MAX_RENDERED_MESSAGES) {\n\t\t\t\tconst halfWindow = Math.floor(MAX_RENDERED_MESSAGES / 2);\n\t\t\t\twindowStartIndex.value = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.min(targetIndex - halfWindow, all.length - MAX_RENDERED_MESSAGES)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait nextTick();\n\n\t\t\t// Find and scroll to the element\n\t\t\tif (chat.value) {\n\t\t\t\tconst el = chat.value.querySelector(`#msg-${msgId}`) as HTMLElement;\n\n\t\t\t\tif (el) {\n\t\t\t\t\tisScrolling.value = true;\n\t\t\t\t\tel.scrollIntoView({behavior: \"instant\", block: \"center\"});\n\n\t\t\t\t\t// BUGBUG: prevent the chat window offset bugging when scrolling to items near the bottom of the chat\n\t\t\t\t\tconst container = chat.value.closest(\"#chat-container\");\n\t\t\t\t\tif (container) container.scrollTop = 0;\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tisScrolling.value = false;\n\t\t\t\t\t\tisAdjustingWindow.value = false;\n\t\t\t\t\t}, 50);\n\n\t\t\t\t\t// Clear highlight after a few seconds\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tfocusedMsgId.value = null;\n\t\t\t\t\t\tfocusedMsgTime.value = null;\n\t\t\t\t\t}, 3000);\n\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tisAdjustingWindow.value = false;\n\t\t\treturn false;\n\t\t};\n\n\t\t// Find and scroll to a message by timestamp (legacy fallback)\n\t\tconst jumpToMessageByTime = async (timestamp: number): Promise<boolean> => {\n\t\t\tfocusedMsgTime.value = timestamp;\n\t\t\tprops.channel.scrolledToBottom = false;\n\t\t\tisAdjustingWindow.value = true;\n\n\t\t\t// Find the message index in all messages by time\n\t\t\tconst all = allCondensedMessages.value;\n\t\t\tlet targetIndex = -1;\n\n\t\t\tfor (let i = 0; i < all.length; i++) {\n\t\t\t\tconst msg = all[i];\n\t\t\t\tconst msgTime = new Date(msg.time).getTime();\n\n\t\t\t\tif (Math.abs(msgTime - timestamp) < 1000) {\n\t\t\t\t\ttargetIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (msg.type === \"condensed\") {\n\t\t\t\t\tfor (const inner of msg.messages) {\n\t\t\t\t\t\tconst innerTime = new Date(inner.time).getTime();\n\n\t\t\t\t\t\tif (Math.abs(innerTime - timestamp) < 1000) {\n\t\t\t\t\t\t\ttargetIndex = i;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (targetIndex !== -1) break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (targetIndex === -1) {\n\t\t\t\tisAdjustingWindow.value = false;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Adjust window to include the target message\n\t\t\tif (all.length > MAX_RENDERED_MESSAGES) {\n\t\t\t\tconst halfWindow = Math.floor(MAX_RENDERED_MESSAGES / 2);\n\t\t\t\twindowStartIndex.value = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.min(targetIndex - halfWindow, all.length - MAX_RENDERED_MESSAGES)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait nextTick();\n\n\t\t\t// Find and scroll to the element\n\t\t\tif (chat.value) {\n\t\t\t\tconst messages = chat.value.querySelectorAll(\".msg[id^='msg-']\");\n\n\t\t\t\tfor (const el of messages) {\n\t\t\t\t\tconst msgId = el.id.replace(\"msg-\", \"\");\n\t\t\t\t\tconst msg = displayedMessages.value.find((m) => {\n\t\t\t\t\t\tif (m.type === \"condensed\") {\n\t\t\t\t\t\t\treturn m.messages.some((inner) => String(inner.id) === msgId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn String(m.id) === msgId;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (msg) {\n\t\t\t\t\t\tconst msgTime = new Date(msg.time).getTime();\n\n\t\t\t\t\t\tif (Math.abs(msgTime - timestamp) < 1000) {\n\t\t\t\t\t\t\tisScrolling.value = true;\n\t\t\t\t\t\t\tel.scrollIntoView({behavior: \"instant\", block: \"center\"});\n\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\tisScrolling.value = false;\n\t\t\t\t\t\t\t\tisAdjustingWindow.value = false;\n\t\t\t\t\t\t\t}, 50);\n\n\t\t\t\t\t\t\t// Clear highlight after a few seconds\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\tfocusedMsgTime.value = null;\n\t\t\t\t\t\t\t}, 3000);\n\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tisAdjustingWindow.value = false;\n\t\t\treturn false;\n\t\t};\n\n\t\t// Handle scroll events - triggers window shifting when near edges\n\t\tconst handleScroll = () => {\n\t\t\t// Skip if we're doing a programmatic scroll or adjusting the window\n\t\t\tif (isScrolling.value || isAdjustingWindow.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst el = chat.value;\n\t\t\tif (!el) return;\n\n\t\t\tconst scrollTop = el.scrollTop;\n\t\t\tconst scrollHeight = el.scrollHeight;\n\t\t\tconst clientHeight = el.clientHeight;\n\t\t\tconst distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n\t\t\tconst distanceFromTop = scrollTop;\n\n\t\t\t// Update scrolledToBottom state - only when actually at the DOM bottom AND at end of messages\n\t\t\tconst atDOMBottom = distanceFromBottom <= 30;\n\n\t\t\tif (atDOMBottom && isAtEnd.value) {\n\t\t\t\tif (!props.channel.scrolledToBottom) {\n\t\t\t\t\tprops.channel.scrolledToBottom = true;\n\t\t\t\t}\n\t\t\t} else if (props.channel.scrolledToBottom && distanceFromBottom > 100) {\n\t\t\t\t// Only unset if user scrolled significantly away from bottom\n\t\t\t\tprops.channel.scrolledToBottom = false;\n\t\t\t}\n\n\t\t\t// Dynamic window shifting - shift when user scrolls near edges\n\t\t\t// Shift up (load older) when near top and there are more messages above\n\t\t\tif (distanceFromTop < SCROLL_THRESHOLD && canScrollBack.value) {\n\t\t\t\tvoid shiftWindowUp(50);\n\t\t\t}\n\t\t\t// Shift down (load newer) when near bottom but not at end\n\t\t\telse if (distanceFromBottom < SCROLL_THRESHOLD && !isAtEnd.value) {\n\t\t\t\tvoid shiftWindowDown(50);\n\t\t\t}\n\t\t};\n\n\t\t// Load more from server\n\t\tconst onShowMoreClick = () => {\n\t\t\tif (!store.state.isConnected) return;\n\n\t\t\tlet lastMessage = -1;\n\n\t\t\tfor (const message of props.channel.messages) {\n\t\t\t\tif (!message.showInActive) {\n\t\t\t\t\tlastMessage = message.id;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprops.channel.historyLoading = true;\n\t\t\tsocket.emit(\"more\", {\n\t\t\t\ttarget: props.channel.id,\n\t\t\t\tlastId: lastMessage,\n\t\t\t\tcondensed: store.state.settings.statusMessages !== \"shown\",\n\t\t\t});\n\t\t};\n\n\t\tconst shouldDisplayDateMarker = (\n\t\t\tmessage: SharedMsg | CondensedMessageContainer,\n\t\t\tidx: number\n\t\t) => {\n\t\t\tconst previousMessage = displayedMessages.value[idx - 1];\n\n\t\t\tif (!previousMessage) return true;\n\n\t\t\tconst oldDate = new Date(previousMessage.time);\n\t\t\tconst newDate = new Date(message.time);\n\n\t\t\treturn (\n\t\t\t\toldDate.getDate() !== newDate.getDate() ||\n\t\t\t\toldDate.getMonth() !== newDate.getMonth() ||\n\t\t\t\toldDate.getFullYear() !== newDate.getFullYear()\n\t\t\t);\n\t\t};\n\n\t\tconst shouldDisplayUnreadMarker = (id: number) => {\n\t\t\tif (!unreadMarkerShown && id > props.channel.firstUnread) {\n\t\t\t\tunreadMarkerShown = true;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\tconst isPreviousSource = (currentMessage: ClientMessage, idx: number) => {\n\t\t\tconst previousMessage = displayedMessages.value[idx - 1];\n\t\t\treturn (\n\t\t\t\tpreviousMessage &&\n\t\t\t\tcurrentMessage.type === MessageType.MESSAGE &&\n\t\t\t\tpreviousMessage.type === MessageType.MESSAGE &&\n\t\t\t\tcurrentMessage.from &&\n\t\t\t\tpreviousMessage.from &&\n\t\t\t\tcurrentMessage.from.nick === previousMessage.from.nick\n\t\t\t);\n\t\t};\n\n\t\tconst onCopy = () => {\n\t\t\tif (chat.value) {\n\t\t\t\tclipboard(chat.value);\n\t\t\t}\n\t\t};\n\n\t\tconst keepScrollPosition = async () => {\n\t\t\tif (props.channel.scrolledToBottom) {\n\t\t\t\tawait jumpToBottom();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst el = chat.value;\n\t\t\tif (!el) return;\n\n\t\t\t// Maintain relative scroll position\n\t\t\tisAdjustingWindow.value = true;\n\t\t\tconst scrollBottom = el.scrollHeight - el.scrollTop;\n\t\t\tawait nextTick();\n\t\t\tisScrolling.value = true;\n\t\t\tel.scrollTop = el.scrollHeight - scrollBottom;\n\t\t\tsetTimeout(() => {\n\t\t\t\tisScrolling.value = false;\n\t\t\t\tisAdjustingWindow.value = false;\n\t\t\t}, 50);\n\t\t};\n\n\t\tconst onLinkPreviewToggle = async (preview: ClientLinkPreview, message: ClientMessage) => {\n\t\t\tawait keepScrollPosition();\n\t\t\tsocket.emit(\"msg:preview:toggle\", {\n\t\t\t\ttarget: props.channel.id,\n\t\t\t\tmsgId: message.id,\n\t\t\t\tlink: preview.link,\n\t\t\t\tshown: preview.shown,\n\t\t\t});\n\t\t};\n\n\t\tconst handleResize = () => {\n\t\t\tif (props.channel.scrolledToBottom) {\n\t\t\t\tvoid jumpToBottom();\n\t\t\t}\n\t\t};\n\n\t\t// Initialize\n\t\tonMounted(async () => {\n\t\t\tchat.value?.addEventListener(\"scroll\", handleScroll, {passive: true});\n\t\t\teventbus.on(\"resize\", handleResize);\n\n\t\t\t// Handle initial focus from search - try ID first, then time fallback\n\t\t\tif (props.isFocused && !isNaN(props.isFocused)) {\n\t\t\t\tawait nextTick();\n\t\t\t\tawait jumpToMessage(props.isFocused, props.focusedTime);\n\t\t\t} else if (props.focusedTime && !isNaN(props.focusedTime)) {\n\t\t\t\tawait nextTick();\n\t\t\t\tawait jumpToMessageByTime(props.focusedTime);\n\t\t\t} else {\n\t\t\t\t// Default: scroll to bottom\n\t\t\t\tprops.channel.scrolledToBottom = true;\n\t\t\t\twindowStartIndex.value = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tallCondensedMessages.value.length - MAX_RENDERED_MESSAGES\n\t\t\t\t);\n\t\t\t\tawait nextTick();\n\t\t\t\tscrollToBottom();\n\t\t\t}\n\n\t\t\t// Set up intersection observer for auto-loading history\n\t\t\tawait nextTick();\n\n\t\t\tif (window.IntersectionObserver && loadMoreButton.value) {\n\t\t\t\thistoryObserver.value = new IntersectionObserver(\n\t\t\t\t\t(entries) => {\n\t\t\t\t\t\tentries.forEach((entry) => {\n\t\t\t\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\t\t\t\tonShowMoreClick();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\t{root: chat.value}\n\t\t\t\t);\n\t\t\t\thistoryObserver.value.observe(loadMoreButton.value);\n\t\t\t}\n\t\t});\n\n\t\t// Channel switch - scroll to bottom and reset window\n\t\twatch(\n\t\t\t() => props.channel.id,\n\t\t\tasync () => {\n\t\t\t\tprops.channel.scrolledToBottom = true;\n\t\t\t\tfocusedMsgId.value = null;\n\t\t\t\tfocusedMsgTime.value = null;\n\t\t\t\twindowStartIndex.value = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tallCondensedMessages.value.length - MAX_RENDERED_MESSAGES\n\t\t\t\t);\n\t\t\t\tawait nextTick();\n\t\t\t\tscrollToBottom();\n\n\t\t\t\tif (historyObserver.value && loadMoreButton.value) {\n\t\t\t\t\thistoryObserver.value.unobserve(loadMoreButton.value);\n\t\t\t\t\thistoryObserver.value.observe(loadMoreButton.value);\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\t// Track the first message ID to detect when history is loaded\n\t\tconst firstMessageId = computed(() => {\n\t\t\tconst msgs = props.channel.messages;\n\t\t\treturn msgs.length > 0 ? msgs[0].id : null;\n\t\t});\n\n\t\t// When history is loaded (messages prepended), adjust window to maintain position\n\t\twatch(firstMessageId, async (newFirstId, oldFirstId) => {\n\t\t\tif (oldFirstId === null || newFirstId === null) return;\n\t\t\tif (newFirstId === oldFirstId) return;\n\n\t\t\t// History was loaded - messages were prepended\n\t\t\t// Adjust windowStartIndex to keep the same messages visible\n\t\t\tconst el = chat.value;\n\t\t\tif (!el) return;\n\n\t\t\tisAdjustingWindow.value = true;\n\t\t\tconst oldScrollTop = el.scrollTop;\n\t\t\tconst oldScrollHeight = el.scrollHeight;\n\n\t\t\t// The window start needs to shift by the number of new messages\n\t\t\t// to keep viewing the same content\n\t\t\tconst total = allCondensedMessages.value.length;\n\t\t\tconst maxStart = Math.max(0, total - MAX_RENDERED_MESSAGES);\n\n\t\t\t// If we were viewing the oldest loaded messages, keep the window at 0\n\t\t\t// so the user can see the newly loaded history\n\t\t\tif (windowStartIndex.value === 0) {\n\t\t\t\t// Don't shift - let user see new history\n\t\t\t} else {\n\t\t\t\t// Shift the window to compensate for new messages\n\t\t\t\twindowStartIndex.value = Math.min(maxStart, windowStartIndex.value);\n\t\t\t}\n\n\t\t\tawait nextTick();\n\n\t\t\t// Restore scroll position\n\t\t\tconst newScrollHeight = el.scrollHeight;\n\t\t\tconst heightDiff = newScrollHeight - oldScrollHeight;\n\t\t\tisScrolling.value = true;\n\t\t\tel.scrollTop = oldScrollTop + heightDiff;\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tisScrolling.value = false;\n\t\t\t\tisAdjustingWindow.value = false;\n\t\t\t}, 50);\n\t\t});\n\n\t\t// New messages at the end - stay at bottom if we were at bottom\n\t\twatch(\n\t\t\t() => props.channel.messages.length,\n\t\t\tasync (newLen, oldLen) => {\n\t\t\t\tif (props.channel.scrolledToBottom) {\n\t\t\t\t\t// Keep window at the end when new messages come in\n\t\t\t\t\tconst total = allCondensedMessages.value.length;\n\t\t\t\t\twindowStartIndex.value = Math.max(0, total - MAX_RENDERED_MESSAGES);\n\t\t\t\t\tawait nextTick();\n\t\t\t\t\tscrollToBottom();\n\t\t\t\t} else if (oldLen !== undefined && newLen > oldLen) {\n\t\t\t\t\t// Messages were added (likely at the end) but we're not at bottom\n\t\t\t\t\t// Don't change window or scroll - user is reading history\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\t// Handle focused message ID (from search results - primary)\n\t\twatch(\n\t\t\t() => props.isFocused,\n\t\t\tasync (focused) => {\n\t\t\t\tif (!focused || isNaN(focused)) return;\n\t\t\t\tawait nextTick();\n\t\t\t\tawait jumpToMessage(focused, props.focusedTime);\n\t\t\t}\n\t\t);\n\n\t\t// Handle focused time (from search results - fallback for old messages)\n\t\twatch(\n\t\t\t() => props.focusedTime,\n\t\t\tasync (focusedTime) => {\n\t\t\t\t// Only use time if no ID was provided\n\t\t\t\tif (props.isFocused && !isNaN(props.isFocused)) return;\n\t\t\t\tif (!focusedTime || isNaN(focusedTime)) return;\n\t\t\t\tawait nextTick();\n\t\t\t\tawait jumpToMessageByTime(focusedTime);\n\t\t\t}\n\t\t);\n\n\t\tonBeforeUpdate(() => {\n\t\t\tunreadMarkerShown = false;\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\teventbus.off(\"resize\", handleResize);\n\t\t\tchat.value?.removeEventListener(\"scroll\", handleScroll);\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\thistoryObserver.value?.disconnect();\n\t\t});\n\n\t\treturn {\n\t\t\tchat,\n\t\t\tstore,\n\t\t\tloadMoreButton,\n\t\t\tdisplayedMessages,\n\t\t\tshowLoadMoreButton,\n\t\t\tgetMessageKey,\n\t\t\tisMessageFocused,\n\t\t\tonShowMoreClick,\n\t\t\tonCopy,\n\t\t\tshouldDisplayDateMarker,\n\t\t\tshouldDisplayUnreadMarker,\n\t\t\tkeepScrollPosition,\n\t\t\tisPreviousSource,\n\t\t\tjumpToBottom,\n\t\t\tonLinkPreviewToggle,\n\t\t};\n\t},\n});\n</script>\n","const matchFormatting =\n\t/\\x02|\\x1D|\\x1F|\\x16|\\x0F|\\x11|\\x1E|\\x03(?:[0-9]{1,2}(?:,[0-9]{1,2})?)?|\\x04(?:[0-9a-f]{6}(?:,[0-9a-f]{6})?)?/gi;\n\nexport function cleanIrcMessage(message: string) {\n\treturn message.replace(matchFormatting, \"\").trim();\n}\n\nexport const condensedTypes = new Set([\n\t\"away\",\n\t\"back\",\n\t\"chghost\",\n\t\"join\",\n\t\"kick\",\n\t\"mass_event\",\n\t\"mode\",\n\t\"nick\",\n\t\"part\",\n\t\"quit\",\n]);\n","export default function (chat: HTMLDivElement) {\n\t// Disable in Firefox as it already copies flex text correctly\n\t// Check if InstallTrigger exists as a property on window (Firefox-specific)\n\tif (\"InstallTrigger\" in window) {\n\t\treturn;\n\t}\n\n\tconst selection = window.getSelection();\n\n\tif (!selection) {\n\t\treturn;\n\t}\n\n\t// If selection does not span multiple elements, do nothing\n\tif (selection.anchorNode === selection.focusNode) {\n\t\treturn;\n\t}\n\n\tconst range = selection.getRangeAt(0);\n\tconst documentFragment = range.cloneContents();\n\tconst div = document.createElement(\"div\");\n\n\tdiv.id = \"js-copy-hack\";\n\tdiv.appendChild(documentFragment);\n\tchat.appendChild(div);\n\n\tselection.selectAllChildren(div);\n\n\twindow.setTimeout(() => {\n\t\tchat.removeChild(div);\n\t\tselection.removeAllRanges();\n\t\tselection.addRange(range);\n\t}, 0);\n}\n","<template>\n\t<div :class=\"['msg', {closed: isCollapsed, 'is-focused': isFocused}]\" data-type=\"condensed\">\n\t\t<div class=\"condensed-summary\">\n\t\t\t<span class=\"time\" />\n\t\t\t<span class=\"from\" />\n\t\t\t<span class=\"content\" @click=\"onCollapseClick\"\n\t\t\t\t>{{ condensedText }}\n\n\t\t\t\t<button class=\"toggle-button\" aria-label=\"Toggle status messages\"\n\t\t\t/></span>\n\t\t</div>\n\t\t<Message\n\t\t\tv-for=\"message in messages\"\n\t\t\t:key=\"message.id\"\n\t\t\t:network=\"network\"\n\t\t\t:message=\"message\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, PropType, ref} from \"vue\";\nimport {condensedTypes} from \"../../shared/irc\";\nimport {MessageType} from \"../../shared/types/msg\";\nimport {ClientMessage, ClientNetwork} from \"../js/types\";\nimport Message from \"./Message.vue\";\n\nexport default defineComponent({\n\tname: \"MessageCondensed\",\n\tcomponents: {\n\t\tMessage,\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tmessages: {\n\t\t\ttype: Array as PropType<ClientMessage[]>,\n\t\t\trequired: true,\n\t\t},\n\t\tkeepScrollPosition: {\n\t\t\ttype: Function as PropType<() => void>,\n\t\t\trequired: true,\n\t\t},\n\t\tisFocused: Boolean,\n\t},\n\tsetup(props) {\n\t\tconst isCollapsed = ref(true);\n\n\t\tconst onCollapseClick = () => {\n\t\t\tisCollapsed.value = !isCollapsed.value;\n\t\t\tprops.keepScrollPosition();\n\t\t};\n\n\t\tconst condensedText = computed(() => {\n\t\t\tconst obj: Record<string, number> = {};\n\n\t\t\tcondensedTypes.forEach((type) => {\n\t\t\t\tobj[type] = 0;\n\t\t\t});\n\n\t\t\tfor (const message of props.messages) {\n\t\t\t\t// special case since one MODE message can change multiple modes\n\t\t\t\tif (message.type === MessageType.MODE) {\n\t\t\t\t\t// syntax: +vv-t maybe-some targets\n\t\t\t\t\t// we want the number of mode changes in the message, so count the\n\t\t\t\t\t// number of chars other than + and - before the first space\n\t\t\t\t\tconst text = message.text ? message.text : \"\";\n\t\t\t\t\tconst modeChangesCount = text\n\t\t\t\t\t\t.split(\" \")[0]\n\t\t\t\t\t\t.split(\"\")\n\t\t\t\t\t\t.filter((char) => char !== \"+\" && char !== \"-\").length;\n\t\t\t\t\tobj[message.type] += modeChangesCount;\n\t\t\t\t}\n\n\t\t\t\t// special case since one MASS_EVENT message can have multiple effects\n\t\t\t\telse if (message.type === MessageType.MASS_EVENT) {\n\t\t\t\t\t// Add mass joins/parts/modes/etc to counts\n\t\t\t\t\tconst summary = message.massEventSummary!;\n\t\t\t\t\tObject.keys(summary).forEach((group) => {\n\t\t\t\t\t\tif (group === \"startTime\" || group === \"endTime\" || group === \"duration\")\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\tif (group === \"away\" || group === \"back\") {\n\t\t\t\t\t\t\treturn (obj[group] += summary[group]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tobj[group.slice(0, -1)] += summary[group];\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tif (!message.type) {\n\t\t\t\t\t\t/* eslint-disable no-console */\n\t\t\t\t\t\tconsole.log(`empty message type, this should not happen: ${message.id}`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tobj[message.type]++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Count quits as parts in condensed messages to reduce information density\n\t\t\tobj.part += obj.quit;\n\n\t\t\tconst strings: string[] = [];\n\t\t\tcondensedTypes.forEach((type) => {\n\t\t\t\tif (obj[type]) {\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\tcase \"chghost\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tString(obj[type]) +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1\n\t\t\t\t\t\t\t\t\t\t? \" users have changed hostname\"\n\t\t\t\t\t\t\t\t\t\t: \" user has changed hostname\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"join\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tString(obj[type]) +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1 ? \" users have joined\" : \" user has joined\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"part\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tString(obj[type]) +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1 ? \" users have left\" : \" user has left\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"nick\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tString(obj[type]) +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1\n\t\t\t\t\t\t\t\t\t\t? \" users have changed nick\"\n\t\t\t\t\t\t\t\t\t\t: \" user has changed nick\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"kick\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tString(obj[type]) +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1 ? \" users were kicked\" : \" user was kicked\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"mode\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tString(obj[type]) +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1 ? \" modes were set\" : \" mode was set\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"away\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\t\"marked away \" +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1 ? String(obj[type]) + \" times\" : \"once\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"back\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\t\"marked back \" +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1 ? String(obj[type]) + \" times\" : \"once\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (strings.length) {\n\t\t\t\tlet text = strings.pop();\n\n\t\t\t\tif (strings.length) {\n\t\t\t\t\ttext = strings.join(\", \") + \", and \" + text!;\n\t\t\t\t}\n\n\t\t\t\treturn text;\n\t\t\t}\n\n\t\t\treturn \"\";\n\t\t});\n\n\t\treturn {\n\t\t\tisCollapsed,\n\t\t\tcondensedText,\n\t\t\tonCollapseClick,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./MessageCondensed.vue?vue&type=template&id=13928d8e&ts=true\"\nimport script from \"./MessageCondensed.vue?vue&type=script&lang=ts\"\nexport * from \"./MessageCondensed.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./MessageList.vue?vue&type=template&id=597e43ca&ts=true\"\nimport script from \"./MessageList.vue?vue&type=script&lang=ts\"\nexport * from \"./MessageList.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div ref=\"chat\" class=\"chat\" tabindex=\"-1\">\n\t\t<div v-show=\"channel.moreHistoryAvailable\" class=\"show-more\">\n\t\t\t<button\n\t\t\t\tref=\"loadMoreButton\"\n\t\t\t\t:disabled=\"channel.historyLoading || !store.state.isConnected\"\n\t\t\t\tclass=\"btn\"\n\t\t\t\t@click=\"onShowMoreClick\"\n\t\t\t>\n\t\t\t\t<span v-if=\"channel.historyLoading\">Loading…</span>\n\t\t\t\t<span v-else>Show older messages</span>\n\t\t\t</button>\n\t\t</div>\n\t\t<div\n\t\t\tclass=\"messages\"\n\t\t\trole=\"log\"\n\t\t\taria-live=\"polite\"\n\t\t\taria-relevant=\"additions\"\n\t\t\t@copy=\"onCopy\"\n\t\t>\n\t\t\t<template v-for=\"(message, id) in condensedMessages\">\n\t\t\t\t<DateMarker\n\t\t\t\t\tv-if=\"shouldDisplayDateMarker(message, id)\"\n\t\t\t\t\t:key=\"message.id + '-date'\"\n\t\t\t\t\t:message=\"message as any\"\n\t\t\t\t\t:focused=\"message.id === focused\"\n\t\t\t\t/>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"shouldDisplayUnreadMarker(Number(message.id))\"\n\t\t\t\t\t:key=\"message.id + '-unread'\"\n\t\t\t\t\tclass=\"unread-marker\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"unread-marker-text\" />\n\t\t\t\t</div>\n\n\t\t\t\t<MessageCondensed\n\t\t\t\t\tv-if=\"message.type === 'condensed'\"\n\t\t\t\t\t:key=\"message.messages[0].id\"\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:keep-scroll-position=\"keepScrollPosition\"\n\t\t\t\t\t:messages=\"message.messages\"\n\t\t\t\t\t:focused=\"message.id === focused\"\n\t\t\t\t/>\n\t\t\t\t<Message\n\t\t\t\t\tv-else\n\t\t\t\t\t:key=\"message.id\"\n\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:message=\"message\"\n\t\t\t\t\t:keep-scroll-position=\"keepScrollPosition\"\n\t\t\t\t\t:is-previous-source=\"isPreviousSource(message, id)\"\n\t\t\t\t\t:focused=\"message.id === focused\"\n\t\t\t\t\t@toggle-link-preview=\"onLinkPreviewToggle\"\n\t\t\t\t/>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {condensedTypes} from \"../../shared/irc\";\nimport {ChanType} from \"../../shared/types/chan\";\nimport {MessageType, SharedMsg} from \"../../shared/types/msg\";\n\nimport eventbus from \"../js/eventbus\";\nimport clipboard from \"../js/clipboard\";\nimport socket from \"../js/socket\";\nimport Message from \"./Message.vue\";\nimport MessageCondensed from \"./MessageCondensed.vue\";\nimport DateMarker from \"./DateMarker.vue\";\nimport {\n\tcomputed,\n\tdefineComponent,\n\tnextTick,\n\tonBeforeUnmount,\n\tonBeforeUpdate,\n\tonMounted,\n\tonUnmounted,\n\tPropType,\n\tref,\n\twatch,\n} from \"vue\";\nimport {useStore} from \"../js/store\";\nimport {ClientChan, ClientMessage, ClientNetwork, ClientLinkPreview} from \"../js/types\";\n\ntype CondensedMessageContainer = {\n\ttype: \"condensed\";\n\ttime: Date;\n\tmessages: ClientMessage[];\n\tid?: number;\n};\n\nexport default defineComponent({\n\tname: \"MessageListBasic\",\n\tcomponents: {\n\t\tMessage,\n\t\tMessageCondensed,\n\t\tDateMarker,\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t\tfocused: Number,\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\n\t\tconst chat = ref<HTMLDivElement | null>(null);\n\t\tconst loadMoreButton = ref<HTMLButtonElement | null>(null);\n\t\tconst historyObserver = ref<IntersectionObserver | null>(null);\n\t\tconst skipNextScrollEvent = ref(false);\n\t\tconst isWaitingForNextTick = ref(false);\n\n\t\tlet unreadMarkerShown = false;\n\n\t\tconst jumpToBottom = () => {\n\t\t\tskipNextScrollEvent.value = true;\n\t\t\tprops.channel.scrolledToBottom = true;\n\n\t\t\tconst el = chat.value;\n\n\t\t\tif (el) {\n\t\t\t\tel.scrollTop = el.scrollHeight;\n\t\t\t}\n\t\t};\n\n\t\tconst onShowMoreClick = () => {\n\t\t\tif (!store.state.isConnected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet lastMessage = -1;\n\n\t\t\t// Find the id of first message that isn't showInActive\n\t\t\t// If showInActive is set, this message is actually in another channel\n\t\t\tfor (const message of props.channel.messages) {\n\t\t\t\tif (!message.showInActive) {\n\t\t\t\t\tlastMessage = message.id;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprops.channel.historyLoading = true;\n\n\t\t\tsocket.emit(\"more\", {\n\t\t\t\ttarget: props.channel.id,\n\t\t\t\tlastId: lastMessage,\n\t\t\t\tcondensed: store.state.settings.statusMessages !== \"shown\",\n\t\t\t});\n\t\t};\n\n\t\tconst onLoadButtonObserved = (entries: IntersectionObserverEntry[]) => {\n\t\t\tentries.forEach((entry) => {\n\t\t\t\tif (!entry.isIntersecting) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tonShowMoreClick();\n\t\t\t});\n\t\t};\n\n\t\tnextTick(() => {\n\t\t\tif (!chat.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (window.IntersectionObserver) {\n\t\t\t\thistoryObserver.value = new window.IntersectionObserver(onLoadButtonObserved, {\n\t\t\t\t\troot: chat.value,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tjumpToBottom();\n\t\t}).catch((e) => {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(\"Error in new IntersectionObserver\", e);\n\t\t});\n\n\t\tconst condensedMessages = computed(() => {\n\t\t\tif (props.channel.type !== ChanType.CHANNEL && props.channel.type !== ChanType.QUERY) {\n\t\t\t\treturn props.channel.messages;\n\t\t\t}\n\n\t\t\t// If actions are hidden, just return a message list with them excluded\n\t\t\tif (store.state.settings.statusMessages === \"hidden\") {\n\t\t\t\treturn props.channel.messages.filter(\n\t\t\t\t\t(message) => !condensedTypes.has(message.type || \"\")\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// If actions are not condensed, just return raw message list\n\t\t\tif (store.state.settings.statusMessages !== \"condensed\") {\n\t\t\t\treturn props.channel.messages;\n\t\t\t}\n\n\t\t\tlet lastCondensedContainer: CondensedMessageContainer | null = null;\n\n\t\t\tconst condensed: (ClientMessage | CondensedMessageContainer)[] = [];\n\n\t\t\tfor (const message of props.channel.messages) {\n\t\t\t\t// If this message is not condensable, or its an action affecting our user,\n\t\t\t\t// then just append the message to container and be done with it\n\t\t\t\tif (message.self || message.highlight || !condensedTypes.has(message.type || \"\")) {\n\t\t\t\t\tlastCondensedContainer = null;\n\n\t\t\t\t\tcondensed.push(message);\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!lastCondensedContainer) {\n\t\t\t\t\tlastCondensedContainer = {\n\t\t\t\t\t\ttime: message.time,\n\t\t\t\t\t\ttype: \"condensed\",\n\t\t\t\t\t\tmessages: [],\n\t\t\t\t\t};\n\n\t\t\t\t\tcondensed.push(lastCondensedContainer);\n\t\t\t\t}\n\n\t\t\t\tlastCondensedContainer.messages.push(message);\n\n\t\t\t\t// Set id of the condensed container to last message id,\n\t\t\t\t// which is required for the unread marker to work correctly\n\t\t\t\tlastCondensedContainer.id = message.id;\n\n\t\t\t\t// If this message is the unread boundary, create a split condensed container\n\t\t\t\tif (message.id === props.channel.firstUnread) {\n\t\t\t\t\tlastCondensedContainer = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn condensed.map((message) => {\n\t\t\t\t// Skip condensing single messages, it doesn't save any\n\t\t\t\t// space but makes useful information harder to see\n\t\t\t\tif (message.type === \"condensed\" && message.messages.length === 1) {\n\t\t\t\t\treturn message.messages[0];\n\t\t\t\t}\n\n\t\t\t\treturn message;\n\t\t\t});\n\t\t});\n\n\t\tconst shouldDisplayDateMarker = (\n\t\t\tmessage: SharedMsg | CondensedMessageContainer,\n\t\t\tid: number\n\t\t) => {\n\t\t\tconst previousMessage = condensedMessages.value[id - 1];\n\n\t\t\tif (!previousMessage) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst oldDate = new Date(previousMessage.time);\n\t\t\tconst newDate = new Date(message.time);\n\n\t\t\treturn (\n\t\t\t\toldDate.getDate() !== newDate.getDate() ||\n\t\t\t\toldDate.getMonth() !== newDate.getMonth() ||\n\t\t\t\toldDate.getFullYear() !== newDate.getFullYear()\n\t\t\t);\n\t\t};\n\n\t\tconst shouldDisplayUnreadMarker = (id: number) => {\n\t\t\tif (!unreadMarkerShown && id > props.channel.firstUnread) {\n\t\t\t\tunreadMarkerShown = true;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\tconst isPreviousSource = (currentMessage: ClientMessage, id: number) => {\n\t\t\tconst previousMessage = condensedMessages.value[id - 1];\n\n\t\t\treturn (\n\t\t\t\tpreviousMessage &&\n\t\t\t\tcurrentMessage.type === MessageType.MESSAGE &&\n\t\t\t\tpreviousMessage.type === MessageType.MESSAGE &&\n\t\t\t\tcurrentMessage.from &&\n\t\t\t\tpreviousMessage.from &&\n\t\t\t\tcurrentMessage.from.nick === previousMessage.from.nick\n\t\t\t);\n\t\t};\n\n\t\tconst onCopy = () => {\n\t\t\tif (chat.value) {\n\t\t\t\tclipboard(chat.value);\n\t\t\t}\n\t\t};\n\n\t\tconst keepScrollPosition = async () => {\n\t\t\tif (isWaitingForNextTick.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst el = chat.value;\n\n\t\t\tif (!el) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!props.channel.scrolledToBottom) {\n\t\t\t\tif (props.channel.historyLoading) {\n\t\t\t\t\tconst heightOld = el.scrollHeight - el.scrollTop;\n\n\t\t\t\t\tisWaitingForNextTick.value = true;\n\n\t\t\t\t\tawait nextTick();\n\n\t\t\t\t\tisWaitingForNextTick.value = false;\n\t\t\t\t\tskipNextScrollEvent.value = true;\n\n\t\t\t\t\tel.scrollTop = el.scrollHeight - heightOld;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tisWaitingForNextTick.value = true;\n\t\t\tawait nextTick();\n\t\t\tisWaitingForNextTick.value = false;\n\n\t\t\tjumpToBottom();\n\t\t};\n\n\t\tconst onLinkPreviewToggle = async (preview: ClientLinkPreview, message: ClientMessage) => {\n\t\t\tawait keepScrollPosition();\n\n\t\t\t// Tell the server we're toggling so it remembers at page reload\n\t\t\tsocket.emit(\"msg:preview:toggle\", {\n\t\t\t\ttarget: props.channel.id,\n\t\t\t\tmsgId: message.id,\n\t\t\t\tlink: preview.link,\n\t\t\t\tshown: preview.shown,\n\t\t\t});\n\t\t};\n\n\t\tconst handleScroll = () => {\n\t\t\t// Setting scrollTop also triggers scroll event\n\t\t\t// We don't want to perform calculations for that\n\t\t\tif (skipNextScrollEvent.value) {\n\t\t\t\tskipNextScrollEvent.value = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst el = chat.value;\n\n\t\t\tif (!el) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tprops.channel.scrolledToBottom = el.scrollHeight - el.scrollTop - el.offsetHeight <= 30;\n\t\t};\n\n\t\tconst handleResize = () => {\n\t\t\t// Keep message list scrolled to bottom on resize\n\t\t\tif (props.channel.scrolledToBottom) {\n\t\t\t\tjumpToBottom();\n\t\t\t}\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\tchat.value?.addEventListener(\"scroll\", handleScroll, {passive: true});\n\n\t\t\teventbus.on(\"resize\", handleResize);\n\n\t\t\tvoid nextTick(() => {\n\t\t\t\tif (historyObserver.value && loadMoreButton.value) {\n\t\t\t\t\thistoryObserver.value.observe(loadMoreButton.value);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\twatch(\n\t\t\t() => props.channel.id,\n\t\t\t() => {\n\t\t\t\tprops.channel.scrolledToBottom = true;\n\n\t\t\t\t// Re-add the intersection observer to trigger the check again on channel switch\n\t\t\t\tif (historyObserver.value && loadMoreButton.value) {\n\t\t\t\t\thistoryObserver.value.unobserve(loadMoreButton.value);\n\t\t\t\t\thistoryObserver.value.observe(loadMoreButton.value);\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\twatch(\n\t\t\t() => props.channel.messages,\n\t\t\tasync () => {\n\t\t\t\tawait keepScrollPosition();\n\t\t\t},\n\t\t\t{\n\t\t\t\tdeep: true,\n\t\t\t}\n\t\t);\n\n\t\twatch(\n\t\t\t() => props.channel.pendingMessage,\n\t\t\tasync () => {\n\t\t\t\tawait keepScrollPosition();\n\t\t\t}\n\t\t);\n\n\t\tonBeforeUpdate(() => {\n\t\t\tunreadMarkerShown = false;\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\teventbus.off(\"resize\", handleResize);\n\t\t\tchat.value?.removeEventListener(\"scroll\", handleScroll);\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\tif (historyObserver.value) {\n\t\t\t\thistoryObserver.value.disconnect();\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tchat,\n\t\t\tstore,\n\t\t\tonShowMoreClick,\n\t\t\tloadMoreButton,\n\t\t\tonCopy,\n\t\t\tcondensedMessages,\n\t\t\tshouldDisplayDateMarker,\n\t\t\tshouldDisplayUnreadMarker,\n\t\t\tkeepScrollPosition,\n\t\t\tisPreviousSource,\n\t\t\tjumpToBottom,\n\t\t\tonLinkPreviewToggle,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./MessageList_Basic.vue?vue&type=template&id=da9200d4&ts=true\"\nimport script from \"./MessageList_Basic.vue?vue&type=script&lang=ts\"\nexport * from \"./MessageList_Basic.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<form id=\"form\" method=\"post\" action=\"\" @submit.prevent=\"onSubmit\">\n\t\t<span id=\"upload-progressbar\" />\n\t\t<span v-if=\"store.state.settings.showInputNick\" id=\"nick\">{{ network.nick }}</span>\n\t\t<textarea\n\t\t\tid=\"input\"\n\t\t\tref=\"input\"\n\t\t\tdir=\"auto\"\n\t\t\tclass=\"mousetrap\"\n\t\t\tenterkeyhint=\"send\"\n\t\t\t:value=\"channel.pendingMessage\"\n\t\t\t:placeholder=\"getInputPlaceholder(channel)\"\n\t\t\t:aria-label=\"getInputPlaceholder(channel)\"\n\t\t\t@input=\"setPendingMessage\"\n\t\t\t@keypress.enter.exact.prevent=\"onSubmit\"\n\t\t\t@blur=\"onBlur\"\n\t\t/>\n\t\t<span\n\t\t\tv-if=\"store.state.serverConfiguration?.fileUpload\"\n\t\t\tid=\"upload-tooltip\"\n\t\t\tclass=\"tooltipped tooltipped-w tooltipped-no-touch\"\n\t\t\taria-label=\"Upload file\"\n\t\t\t@click=\"openFileUpload\"\n\t\t>\n\t\t\t<input\n\t\t\t\tid=\"upload-input\"\n\t\t\t\tref=\"uploadInput\"\n\t\t\t\ttype=\"file\"\n\t\t\t\taria-labelledby=\"upload\"\n\t\t\t\tmultiple\n\t\t\t\t@change=\"onUploadInputChange\"\n\t\t\t/>\n\t\t\t<button\n\t\t\t\tid=\"upload\"\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-label=\"Upload file\"\n\t\t\t\t:disabled=\"!store.state.isConnected\"\n\t\t\t/>\n\t\t</span>\n\t\t<span\n\t\t\tid=\"submit-tooltip\"\n\t\t\tclass=\"tooltipped tooltipped-w tooltipped-no-touch\"\n\t\t\taria-label=\"Send message\"\n\t\t>\n\t\t\t<button\n\t\t\t\tid=\"submit\"\n\t\t\t\ttype=\"submit\"\n\t\t\t\taria-label=\"Send message\"\n\t\t\t\t:disabled=\"!store.state.isConnected\"\n\t\t\t/>\n\t\t</span>\n\t</form>\n</template>\n\n<script lang=\"ts\">\nimport Mousetrap from \"mousetrap\";\nimport {wrapCursor} from \"undate\";\nimport autocompletion from \"../js/autocompletion\";\nimport {commands} from \"../js/commands/index\";\nimport socket from \"../js/socket\";\nimport upload from \"../js/upload\";\nimport eventbus from \"../js/eventbus\";\nimport {watch, defineComponent, nextTick, onMounted, PropType, ref, onUnmounted} from \"vue\";\nimport type {ClientNetwork, ClientChan} from \"../js/types\";\nimport {useStore} from \"../js/store\";\nimport {ChanType} from \"../../shared/types/chan\";\n\nconst formattingHotkeys = {\n\t\"mod+k\": \"\\x03\",\n\t\"mod+b\": \"\\x02\",\n\t\"mod+u\": \"\\x1F\",\n\t\"mod+i\": \"\\x1D\",\n\t\"mod+o\": \"\\x0F\",\n\t\"mod+s\": \"\\x1e\",\n\t\"mod+m\": \"\\x11\",\n\t\"mod+r\": \"/rainbow\",\n};\n\n// Autocomplete bracket and quote characters like in a modern IDE\n// For example, select `text`, press `[` key, and it becomes `[text]`\nconst bracketWraps = {\n\t'\"': '\"',\n\t\"'\": \"'\",\n\t\"(\": \")\",\n\t\"<\": \">\",\n\t\"[\": \"]\",\n\t\"{\": \"}\",\n\t\"*\": \"*\",\n\t\"`\": \"`\",\n\t\"~\": \"~\",\n\t_: \"_\",\n};\n\nexport default defineComponent({\n\tname: \"ChatInput\",\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\t\tconst input = ref<HTMLTextAreaElement>();\n\t\tconst uploadInput = ref<HTMLInputElement>();\n\t\tconst autocompletionRef = ref<ReturnType<typeof autocompletion>>();\n\n\t\tconst setInputSize = () => {\n\t\t\tvoid nextTick(() => {\n\t\t\t\tif (!input.value) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst style = window.getComputedStyle(input.value);\n\t\t\t\tconst lineHeight = parseFloat(style.lineHeight) || 1;\n\n\t\t\t\t// Start by resetting height before computing as scrollHeight does not\n\t\t\t\t// decrease when deleting characters\n\t\t\t\tinput.value.style.height = \"\";\n\n\t\t\t\t// Use scrollHeight to calculate how many lines there are in input, and ceil the value\n\t\t\t\t// because some browsers tend to incorrently round the values when using high density\n\t\t\t\t// displays or using page zoom feature\n\t\t\t\tinput.value.style.height = `${\n\t\t\t\t\tMath.ceil(input.value.scrollHeight / lineHeight) * lineHeight\n\t\t\t\t}px`;\n\t\t\t});\n\t\t};\n\n\t\tconst setPendingMessage = (e: Event) => {\n\t\t\tprops.channel.pendingMessage = (e.target as HTMLInputElement).value;\n\t\t\tprops.channel.inputHistoryPosition = 0;\n\t\t\tsetInputSize();\n\t\t};\n\n\t\tconst getInputPlaceholder = (channel: ClientChan) => {\n\t\t\tif (channel.type === ChanType.CHANNEL || channel.type === ChanType.QUERY) {\n\t\t\t\treturn `Write to ${channel.name}`;\n\t\t\t}\n\n\t\t\treturn \"\";\n\t\t};\n\n\t\tconst onSubmit = () => {\n\t\t\tif (!input.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Triggering click event opens the virtual keyboard on mobile\n\t\t\t// This can only be called from another interactive event (e.g. button click)\n\t\t\tinput.value.click();\n\t\t\tinput.value.focus();\n\n\t\t\tif (!store.state.isConnected) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst target = props.channel.id;\n\t\t\tconst text = props.channel.pendingMessage;\n\n\t\t\tif (text.length === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (autocompletionRef.value) {\n\t\t\t\tautocompletionRef.value.hide();\n\t\t\t}\n\n\t\t\tprops.channel.inputHistoryPosition = 0;\n\t\t\tprops.channel.pendingMessage = \"\";\n\t\t\tinput.value.value = \"\";\n\t\t\tsetInputSize();\n\n\t\t\t// Store new message in history if last message isn't already equal\n\t\t\tif (props.channel.inputHistory[1] !== text) {\n\t\t\t\tprops.channel.inputHistory.splice(1, 0, text);\n\t\t\t}\n\n\t\t\t// Limit input history to a 100 entries\n\t\t\tif (props.channel.inputHistory.length > 100) {\n\t\t\t\tprops.channel.inputHistory.pop();\n\t\t\t}\n\n\t\t\tif (text[0] === \"/\") {\n\t\t\t\tconst args = text.substring(1).split(\" \");\n\t\t\t\tconst cmd = args.shift()?.toLowerCase();\n\n\t\t\t\tif (!cmd) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(commands, cmd) && commands[cmd](args)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsocket.emit(\"input\", {target, text});\n\t\t};\n\n\t\tconst onUploadInputChange = () => {\n\t\t\tif (!uploadInput.value || !uploadInput.value.files) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst files = Array.from(uploadInput.value.files);\n\t\t\tupload.triggerUpload(files);\n\t\t\tuploadInput.value.value = \"\"; // Reset <input> element so you can upload the same file\n\t\t};\n\n\t\tconst openFileUpload = () => {\n\t\t\tuploadInput.value?.click();\n\t\t};\n\n\t\tconst blurInput = () => {\n\t\t\tinput.value?.blur();\n\t\t};\n\n\t\tconst onBlur = (e: FocusEvent) => {\n\t\t\t// Don't hide autocomplete if clicking on the autocomplete menu itself\n\t\t\t// The click event needs to complete before we hide the menu\n\t\t\tconst eventTarget = e.target as HTMLElement;\n\n\t\t\tif (eventTarget.id === \"input\" && eventTarget.classList.contains(\"mousetrap\")) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (autocompletionRef.value) {\n\t\t\t\tautocompletionRef.value.hide();\n\t\t\t}\n\t\t};\n\n\t\twatch(\n\t\t\t() => props.channel.id,\n\t\t\t() => {\n\t\t\t\tif (autocompletionRef.value) {\n\t\t\t\t\tautocompletionRef.value.hide();\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\twatch(\n\t\t\t() => props.channel.pendingMessage,\n\t\t\t() => {\n\t\t\t\tsetInputSize();\n\t\t\t}\n\t\t);\n\n\t\tonMounted(() => {\n\t\t\teventbus.on(\"escapekey\", blurInput);\n\n\t\t\tif (store.state.settings.autocomplete) {\n\t\t\t\tif (!input.value) {\n\t\t\t\t\tthrow new Error(\"ChatInput autocomplete: input element is not available\");\n\t\t\t\t}\n\n\t\t\t\tautocompletionRef.value = autocompletion(input.value);\n\t\t\t}\n\n\t\t\tconst inputTrap = Mousetrap(input.value);\n\n\t\t\tlet enabledHotkeys = Object.keys(formattingHotkeys);\n\n\t\t\t// Allow disable /rainbow hotkey\n\t\t\tif (store.state.settings.enableRainbowHotkey === false) {\n\t\t\t\tenabledHotkeys = enabledHotkeys.filter((k) => k !== \"mod+r\");\n\t\t\t}\n\n\t\t\tinputTrap.bind(enabledHotkeys, function (e, key) {\n\t\t\t\tconst modifier = formattingHotkeys[key];\n\n\t\t\t\tif (!e.target) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\tif (modifier === \"/rainbow\" && input.value != null) {\n\t\t\t\t\tif (input.value.value.startsWith(modifier)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tinput.value.value = `${modifier} ${input.value.value}`;\n\t\t\t\t\tsetPendingMessage(e);\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\twrapCursor(\n\t\t\t\t\te.target as HTMLTextAreaElement,\n\t\t\t\t\tmodifier,\n\t\t\t\t\t(e.target as HTMLTextAreaElement).selectionStart ===\n\t\t\t\t\t\t(e.target as HTMLTextAreaElement).selectionEnd\n\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t: modifier\n\t\t\t\t);\n\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\tinputTrap.bind(Object.keys(bracketWraps), function (e, key) {\n\t\t\t\tif (\n\t\t\t\t\t(e.target as HTMLTextAreaElement)?.selectionStart !==\n\t\t\t\t\t(e.target as HTMLTextAreaElement).selectionEnd\n\t\t\t\t) {\n\t\t\t\t\twrapCursor(e.target as HTMLTextAreaElement, key, bracketWraps[key]);\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tinputTrap.bind([\"up\", \"down\"], (e, key) => {\n\t\t\t\tif (\n\t\t\t\t\tstore.state.isAutoCompleting ||\n\t\t\t\t\t(e.target as HTMLTextAreaElement).selectionStart !==\n\t\t\t\t\t\t(e.target as HTMLTextAreaElement).selectionEnd ||\n\t\t\t\t\t!input.value\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst onRow = (\n\t\t\t\t\tinput.value.value.slice(undefined, input.value.selectionStart).match(/\\n/g) ||\n\t\t\t\t\t[]\n\t\t\t\t).length;\n\t\t\t\tconst totalRows = (input.value.value.match(/\\n/g) || []).length;\n\n\t\t\t\tconst {channel} = props;\n\n\t\t\t\tif (channel.inputHistoryPosition === 0) {\n\t\t\t\t\tchannel.inputHistory[channel.inputHistoryPosition] = channel.pendingMessage;\n\t\t\t\t}\n\n\t\t\t\tif (key === \"up\" && onRow === 0) {\n\t\t\t\t\tif (channel.inputHistoryPosition < channel.inputHistory.length - 1) {\n\t\t\t\t\t\tchannel.inputHistoryPosition++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else if (\n\t\t\t\t\tkey === \"down\" &&\n\t\t\t\t\tchannel.inputHistoryPosition > 0 &&\n\t\t\t\t\tonRow === totalRows\n\t\t\t\t) {\n\t\t\t\t\tchannel.inputHistoryPosition--;\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tchannel.pendingMessage = channel.inputHistory[channel.inputHistoryPosition];\n\t\t\t\tinput.value.value = channel.pendingMessage;\n\t\t\t\tsetInputSize();\n\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\tif (store.state.serverConfiguration?.fileUpload) {\n\t\t\t\tupload.mounted();\n\t\t\t}\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\teventbus.off(\"escapekey\", blurInput);\n\n\t\t\tif (autocompletionRef.value) {\n\t\t\t\tautocompletionRef.value.destroy();\n\t\t\t\tautocompletionRef.value = undefined;\n\t\t\t}\n\n\t\t\tupload.unmounted();\n\t\t\tupload.abort();\n\t\t});\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tinput,\n\t\t\tuploadInput,\n\t\t\tonUploadInputChange,\n\t\t\topenFileUpload,\n\t\t\tblurInput,\n\t\t\tonBlur,\n\t\t\tsetInputSize,\n\t\t\tupload,\n\t\t\tgetInputPlaceholder,\n\t\t\tonSubmit,\n\t\t\tsetPendingMessage,\n\t\t};\n\t},\n});\n</script>\n","import constants from \"./constants\";\n\nimport Mousetrap from \"mousetrap\";\nimport {Textcomplete, StrategyProps} from \"@textcomplete/core\";\nimport {TextareaEditor} from \"@textcomplete/textarea\";\n\nimport fuzzy from \"fuzzy\";\n\nimport emojiMap from \"./helpers/simplemap.json\" with {type: \"json\"};\nimport {store} from \"./store\";\nimport {ChanType} from \"../../shared/types/chan\";\n\nexport default enableAutocomplete;\n\nconst emojiSearchTerms = Object.keys(emojiMap);\nconst emojiStrategy: StrategyProps = {\n\tid: \"emoji\",\n\tmatch: /(^|\\s):([-+\\w:?]{2,}):?$/,\n\tsearch(term: string, callback: (matches) => void) {\n\t\t// Trim colon from the matched term,\n\t\t// as we are unable to get a clean string from match regex\n\t\tterm = term.replace(/:$/, \"\");\n\t\tcallback(fuzzyGrep(term, emojiSearchTerms));\n\t},\n\ttemplate([string, original]: [string, string]) {\n\t\treturn `<span class=\"emoji\">${String(emojiMap[original])}</span> ${string}`;\n\t},\n\treplace([, original]: [string, string]) {\n\t\treturn \"$1\" + String(emojiMap[original]);\n\t},\n\tindex: 2,\n};\n\nconst nicksStrategy: StrategyProps = {\n\tid: \"nicks\",\n\tmatch: /(^|\\s)(@([a-zA-Z_[\\]\\\\^{}|`@][a-zA-Z0-9_[\\]\\\\^{}|`-]*)?)$/,\n\tsearch(term: string, callback: (matches: string[] | string[][]) => void) {\n\t\tterm = term.slice(1);\n\n\t\tif (term[0] === \"@\") {\n\t\t\t// TODO: type\n\t\t\tcallback(completeNicks(term.slice(1), true).map((val) => [\"@\" + val[0], \"@\" + val[1]]));\n\t\t} else {\n\t\t\tcallback(completeNicks(term, true));\n\t\t}\n\t},\n\ttemplate([string]: [string, string]) {\n\t\treturn string;\n\t},\n\treplace([, original]: [string, string]) {\n\t\treturn \"$1\" + replaceNick(original);\n\t},\n\tindex: 2,\n};\n\nconst chanStrategy: StrategyProps = {\n\tid: \"chans\",\n\tmatch: /(^|\\s)((?:#|\\+|&|![A-Z0-9]{5})(?:[^\\s]+)?)$/,\n\tsearch(term: string, callback: (matches: string[][]) => void) {\n\t\tcallback(completeChans(term));\n\t},\n\ttemplate([string]: [string, string]) {\n\t\treturn string;\n\t},\n\treplace([, original]: [string, string]) {\n\t\treturn \"$1\" + original;\n\t},\n\tindex: 2,\n};\n\nconst commandStrategy: StrategyProps = {\n\tid: \"commands\",\n\tmatch: /^\\/(\\w*)$/,\n\tsearch(term: string, callback: (matches: string[][]) => void) {\n\t\tcallback(completeCommands(\"/\" + term));\n\t},\n\ttemplate([string]: [string, string]) {\n\t\treturn string;\n\t},\n\treplace([, original]: [string, string]) {\n\t\treturn original;\n\t},\n\tindex: 1,\n};\n\nconst foregroundColorStrategy: StrategyProps = {\n\tid: \"foreground-colors\",\n\tmatch: /\\x03(\\d{0,2}|[A-Za-z ]{0,10})$/,\n\tsearch(term: string, callback: (matches: string[][]) => void) {\n\t\tterm = term.toLowerCase();\n\n\t\tconst matchingColorCodes = constants.colorCodeMap\n\t\t\t.filter((i) => fuzzy.test(term, i[0]) || fuzzy.test(term, i[1]))\n\t\t\t.map((i) => {\n\t\t\t\tif (fuzzy.test(term, i[1])) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\ti[0],\n\t\t\t\t\t\tfuzzy.match(term, i[1], {\n\t\t\t\t\t\t\tpre: \"<b>\",\n\t\t\t\t\t\t\tpost: \"</b>\",\n\t\t\t\t\t\t}).rendered,\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\treturn i;\n\t\t\t});\n\n\t\tcallback(matchingColorCodes);\n\t},\n\ttemplate(value: string[]) {\n\t\treturn `<span class=\"irc-fg${parseInt(value[0], 10)}\">${value[1]}</span>`;\n\t},\n\treplace(value: string) {\n\t\treturn \"\\x03\" + value[0];\n\t},\n\tindex: 1,\n};\n\nconst backgroundColorStrategy: StrategyProps = {\n\tid: \"background-colors\",\n\tmatch: /\\x03(\\d{2}),(\\d{0,2}|[A-Za-z ]{0,10})$/,\n\tsearch(term: string, callback: (matchingColorCodes: string[][]) => void, match: string[]) {\n\t\tterm = term.toLowerCase();\n\t\tconst matchingColorCodes = constants.colorCodeMap\n\t\t\t.filter((i) => fuzzy.test(term, i[0]) || fuzzy.test(term, i[1]))\n\t\t\t.map((pair) => {\n\t\t\t\tif (fuzzy.test(term, pair[1])) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tpair[0],\n\t\t\t\t\t\tfuzzy.match(term, pair[1], {\n\t\t\t\t\t\t\tpre: \"<b>\",\n\t\t\t\t\t\t\tpost: \"</b>\",\n\t\t\t\t\t\t}).rendered,\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\treturn pair;\n\t\t\t})\n\t\t\t.map((pair) => pair.concat(match[1])); // Needed to pass fg color to `template`...\n\n\t\tcallback(matchingColorCodes);\n\t},\n\ttemplate(value: string[]) {\n\t\treturn `<span class=\"irc-fg${parseInt(value[2], 10)} irc-bg irc-bg${parseInt(\n\t\t\tvalue[0],\n\t\t\t10\n\t\t)}\">${value[1]}</span>`;\n\t},\n\treplace(value: string[]) {\n\t\treturn \"\\x03$1,\" + value[0];\n\t},\n\tindex: 2,\n};\n\nfunction enableAutocomplete(input: HTMLTextAreaElement) {\n\tlet tabCount = 0;\n\tlet lastMatch = \"\";\n\tlet currentMatches: string[] | string[][] = [];\n\n\tinput.addEventListener(\"input\", (e) => {\n\t\tif ((e as CustomEvent).detail === \"autocomplete\") {\n\t\t\treturn;\n\t\t}\n\n\t\ttabCount = 0;\n\t\tcurrentMatches = [];\n\t\tlastMatch = \"\";\n\t});\n\n\tMousetrap(input).bind(\n\t\t\"tab\",\n\t\t(e) => {\n\t\t\tif (store.state.isAutoCompleting) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.preventDefault();\n\n\t\t\tconst text = input.value;\n\n\t\t\tif (tabCount === 0) {\n\t\t\t\tlastMatch = text.substring(0, input.selectionStart).split(/\\s/).pop() || \"\";\n\n\t\t\t\tif (lastMatch.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcurrentMatches = completeNicks(lastMatch, false);\n\n\t\t\t\tif (currentMatches.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst position = input.selectionStart - lastMatch.length;\n\t\t\tconst newMatch = replaceNick(\n\t\t\t\t// TODO: type this properly\n\t\t\t\tString(currentMatches[tabCount % currentMatches.length]),\n\t\t\t\tposition\n\t\t\t);\n\t\t\tconst remainder = text.substring(input.selectionStart);\n\n\t\t\tinput.value = text.substr(0, position) + newMatch + remainder;\n\n\t\t\tinput.selectionStart -= remainder.length;\n\t\t\tinput.selectionEnd = input.selectionStart;\n\n\t\t\t// Propagate change to Vue model\n\t\t\tinput.dispatchEvent(\n\t\t\t\tnew CustomEvent(\"input\", {\n\t\t\t\t\tdetail: \"autocomplete\",\n\t\t\t\t})\n\t\t\t);\n\n\t\t\tlastMatch = newMatch;\n\t\t\ttabCount++;\n\t\t},\n\t\t\"keydown\"\n\t);\n\n\tconst strategies = [\n\t\temojiStrategy,\n\t\tnicksStrategy,\n\t\tchanStrategy,\n\t\tcommandStrategy,\n\t\tforegroundColorStrategy,\n\t\tbackgroundColorStrategy,\n\t];\n\n\tconst editor = new TextareaEditor(input);\n\tconst textcomplete = new Textcomplete(editor, strategies, {\n\t\tdropdown: {\n\t\t\tclassName: \"textcomplete-menu\",\n\t\t\tplacement: \"top\",\n\t\t},\n\t});\n\n\ttextcomplete.on(\"show\", () => {\n\t\tstore.commit(\"isAutoCompleting\", true);\n\t});\n\n\ttextcomplete.on(\"hidden\", () => {\n\t\tstore.commit(\"isAutoCompleting\", false);\n\t});\n\n\treturn {\n\t\thide() {\n\t\t\ttextcomplete.hide();\n\t\t},\n\t\tdestroy() {\n\t\t\ttextcomplete.destroy();\n\t\t\tstore.commit(\"isAutoCompleting\", false);\n\t\t},\n\t};\n}\n\nfunction replaceNick(original: string, position = 1) {\n\t// If no postfix specified, return autocompleted nick as-is\n\tif (!store.state.settings.nickPostfix) {\n\t\treturn original;\n\t}\n\n\t// If there is whitespace in the input already, append space to nick\n\tif (position > 0 && /\\s/.test(store.state.activeChannel?.channel.pendingMessage || \"\")) {\n\t\treturn original + \" \";\n\t}\n\n\t// If nick is first in the input, append specified postfix\n\treturn original + store.state.settings.nickPostfix;\n}\n\nfunction fuzzyGrep<T>(term: string, array: Array<T>) {\n\tconst results = fuzzy.filter(term, array, {\n\t\tpre: \"<b>\",\n\t\tpost: \"</b>\",\n\t});\n\treturn results.map((el) => [el.string, el.original]);\n}\n\nfunction rawNicks() {\n\tif (!store.state.activeChannel) {\n\t\treturn [];\n\t}\n\n\tconst channel = store.state.activeChannel.channel;\n\n\tif (channel.users && channel.users.length > 0) {\n\t\tconst users = channel.users.slice();\n\n\t\treturn users.sort((a, b) => b.lastMessage - a.lastMessage).map((u) => u.nick);\n\t}\n\n\tconst me = store.state.activeChannel.network.nick;\n\tconst otherUser = channel.name;\n\n\t// If this is a query, add their name to autocomplete\n\tif (me !== otherUser && channel.type === ChanType.QUERY) {\n\t\treturn [otherUser, me];\n\t}\n\n\t// Return our own name by default for anything that isn't a channel or query\n\treturn [me];\n}\n\nfunction completeNicks(word: string, isFuzzy: boolean) {\n\tconst users = rawNicks();\n\tword = word.toLowerCase();\n\n\tif (isFuzzy) {\n\t\treturn fuzzyGrep(word, users);\n\t}\n\n\treturn users.filter((w) => !w.toLowerCase().indexOf(word));\n}\n\nfunction getCommands() {\n\tlet cmds = constants.commands.slice();\n\n\tif (!store.state.settings.searchEnabled) {\n\t\tcmds = cmds.filter((c) => c !== \"/search\");\n\t}\n\n\treturn cmds;\n}\n\nfunction completeCommands(word: string) {\n\tconst commands = getCommands();\n\treturn fuzzyGrep(word, commands);\n}\n\nfunction completeChans(word: string) {\n\tconst words: string[] = [];\n\n\tif (store.state.activeChannel) {\n\t\tfor (const channel of store.state.activeChannel.network.channels) {\n\t\t\t// Push all channels that start with the same CHANTYPE\n\t\t\tif (channel.type === ChanType.CHANNEL && channel.name[0] === word[0]) {\n\t\t\t\twords.push(channel.name);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fuzzyGrep(word, words);\n}\n","import {input as collapse} from \"./collapse\";\nimport {input as expand} from \"./expand\";\nimport {input as join} from \"./join\";\nimport {input as search} from \"./search\";\n\nexport const commands = {\n\tcollapse: collapse,\n\texpand: expand,\n\tjoin: join,\n\tsearch: search,\n};\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nexport function input(): boolean {\n\tif (!store.state.activeChannel) {\n\t\treturn false;\n\t}\n\n\tconst messageIds: number[] = [];\n\n\tfor (const message of store.state.activeChannel.channel.messages) {\n\t\tlet toggled = false;\n\n\t\tfor (const preview of message.previews || []) {\n\t\t\tif (preview.shown) {\n\t\t\t\tpreview.shown = false;\n\t\t\t\ttoggled = true;\n\t\t\t}\n\t\t}\n\n\t\tif (toggled) {\n\t\t\tmessageIds.push(message.id);\n\t\t}\n\t}\n\n\t// Tell the server we're toggling so it remembers at page reload\n\tif (!document.body.classList.contains(\"public\") && messageIds.length > 0) {\n\t\tsocket.emit(\"msg:preview:toggle\", {\n\t\t\ttarget: store.state.activeChannel?.channel.id,\n\t\t\tmessageIds: messageIds,\n\t\t\tshown: false,\n\t\t});\n\t}\n\n\treturn true;\n}\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nexport function input(): boolean {\n\tif (!store.state.activeChannel) {\n\t\treturn false;\n\t}\n\n\tconst messageIds: number[] = [];\n\n\tfor (const message of store.state.activeChannel.channel.messages) {\n\t\tlet toggled = false;\n\n\t\tfor (const preview of message.previews || []) {\n\t\t\tif (!preview.shown) {\n\t\t\t\tpreview.shown = true;\n\t\t\t\ttoggled = true;\n\t\t\t}\n\t\t}\n\n\t\tif (toggled) {\n\t\t\tmessageIds.push(message.id);\n\t\t}\n\t}\n\n\t// Tell the server we're toggling so it remembers at page reload\n\tif (!document.body.classList.contains(\"public\") && messageIds.length > 0) {\n\t\tsocket.emit(\"msg:preview:toggle\", {\n\t\t\ttarget: store.state.activeChannel?.channel.id,\n\t\t\tmessageIds: messageIds,\n\t\t\tshown: true,\n\t\t});\n\t}\n\n\treturn true;\n}\n","import socket from \"../socket\";\nimport {store} from \"../store\";\nimport {switchToChannel} from \"../router\";\nimport {ChanType} from \"../../../shared/types/chan\";\n\nexport function input(args: string[]): boolean {\n\tif (args.length > 0) {\n\t\tlet channels = args[0];\n\n\t\tif (channels.length > 0) {\n\t\t\tconst chanTypes = store.state.activeChannel?.network.serverOptions.CHANTYPES;\n\t\t\tconst channelList = args[0].split(\",\");\n\n\t\t\tif (chanTypes && chanTypes.length > 0) {\n\t\t\t\tfor (let c = 0; c < channelList.length; c++) {\n\t\t\t\t\tif (!chanTypes.includes(channelList[c][0])) {\n\t\t\t\t\t\tchannelList[c] = chanTypes[0] + channelList[c];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchannels = channelList.join(\",\");\n\n\t\t\tconst chan = store.getters.findChannelOnCurrentNetwork(channels);\n\n\t\t\tif (chan) {\n\t\t\t\tswitchToChannel(chan);\n\t\t\t} else {\n\t\t\t\tif (store.state.activeChannel) {\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttext: `/join ${channels} ${args.length > 1 ? args[1] : \"\"}`,\n\t\t\t\t\t\ttarget: store.state.activeChannel.channel.id,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t} else if (store.state.activeChannel?.channel.type === ChanType.CHANNEL) {\n\t\t// If `/join` command is used without any arguments, re-join current channel\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: store.state.activeChannel.channel.id,\n\t\t\ttext: `/join ${store.state.activeChannel.channel.name}`,\n\t\t});\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n","import {store} from \"../store\";\nimport {router} from \"../router\";\n\nexport function input(args: string[]): boolean {\n\tif (!store.state.settings.searchEnabled) {\n\t\treturn false;\n\t}\n\n\trouter\n\t\t.push({\n\t\t\tname: \"SearchResults\",\n\t\t\tparams: {\n\t\t\t\tid: store.state.activeChannel?.channel.id,\n\t\t\t},\n\t\t\tquery: {\n\t\t\t\tq: args.join(\" \"),\n\t\t\t},\n\t\t})\n\t\t.catch((e: Error) => {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(`Failed to push SearchResults route: ${e.message}`);\n\t\t});\n\n\treturn true;\n}\n","import {update as updateCursor} from \"undate\";\n\nimport socket from \"./socket\";\nimport {store} from \"./store\";\n\nclass Uploader {\n\txhr: XMLHttpRequest | null = null;\n\tfileQueue: File[] = [];\n\ttokenKeepAlive: NodeJS.Timeout | null = null;\n\n\toverlay: HTMLDivElement | null = null;\n\tuploadProgressbar: HTMLSpanElement | null = null;\n\n\tonDragEnter = (e: DragEvent) => this.dragEnter(e);\n\tonDragOver = (e: DragEvent) => this.dragOver(e);\n\tonDragLeave = (e: DragEvent) => this.dragLeave(e);\n\tonDrop = (e: DragEvent) => this.drop(e);\n\tonPaste = (e: ClipboardEvent) => this.paste(e);\n\n\tinit() {\n\t\tsocket.on(\"upload:auth\", (token) => this.uploadNextFileInQueue(token));\n\t}\n\n\tmounted() {\n\t\tthis.overlay = document.getElementById(\"upload-overlay\") as HTMLDivElement;\n\t\tthis.uploadProgressbar = document.getElementById(\"upload-progressbar\") as HTMLSpanElement;\n\n\t\tdocument.addEventListener(\"dragenter\", this.onDragEnter);\n\t\tdocument.addEventListener(\"dragover\", this.onDragOver);\n\t\tdocument.addEventListener(\"dragleave\", this.onDragLeave);\n\t\tdocument.addEventListener(\"drop\", this.onDrop);\n\t\tdocument.addEventListener(\"paste\", this.onPaste);\n\t}\n\n\tunmounted() {\n\t\tdocument.removeEventListener(\"dragenter\", this.onDragEnter);\n\t\tdocument.removeEventListener(\"dragover\", this.onDragOver);\n\t\tdocument.removeEventListener(\"dragleave\", this.onDragLeave);\n\t\tdocument.removeEventListener(\"drop\", this.onDrop);\n\t\tdocument.removeEventListener(\"paste\", this.onPaste);\n\t}\n\n\tdragOver(event: DragEvent) {\n\t\tif (event.dataTransfer?.types.includes(\"Files\")) {\n\t\t\t// Prevent dragover event completely and do nothing with it\n\t\t\t// This stops the browser from trying to guess which cursor to show\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n\n\tdragEnter(event: DragEvent) {\n\t\t// relatedTarget is the target where we entered the drag from\n\t\t// when dragging from another window, the target is null, otherwise its a DOM element\n\t\tif (!event.relatedTarget && event.dataTransfer?.types.includes(\"Files\")) {\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.overlay?.classList.add(\"is-dragover\");\n\t\t}\n\t}\n\n\tdragLeave(event: DragEvent) {\n\t\t// If relatedTarget is null, that means we are no longer dragging over the page\n\t\tif (!event.relatedTarget) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.overlay?.classList.remove(\"is-dragover\");\n\t\t}\n\t}\n\n\tdrop(event: DragEvent) {\n\t\tif (!event.dataTransfer?.types.includes(\"Files\")) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tthis.overlay?.classList.remove(\"is-dragover\");\n\n\t\tlet files: (File | null)[];\n\n\t\tif (event.dataTransfer.items) {\n\t\t\tfiles = Array.from(event.dataTransfer.items)\n\t\t\t\t.filter((item) => item.kind === \"file\")\n\t\t\t\t.map((item) => item.getAsFile());\n\t\t} else {\n\t\t\tfiles = Array.from(event.dataTransfer.files);\n\t\t}\n\n\t\tthis.triggerUpload(files);\n\t}\n\n\tpaste(event: ClipboardEvent) {\n\t\tconst items = event.clipboardData?.items;\n\t\tconst files: (File | null)[] = [];\n\n\t\tif (!items) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tif (items[i].kind === \"file\") {\n\t\t\t\tfiles.push(items[i].getAsFile());\n\t\t\t}\n\t\t}\n\n\t\tif (files.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tthis.triggerUpload(files);\n\t}\n\n\ttriggerUpload(files: (File | null)[]) {\n\t\tif (!files.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!store.state.isConnected) {\n\t\t\tthis.handleResponse({\n\t\t\t\terror: `You are currently disconnected, unable to initiate upload process.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst wasQueueEmpty = this.fileQueue.length === 0;\n\t\tconst maxFileSize = store.state.serverConfiguration?.fileUploadMaxFileSize || 0;\n\n\t\tfor (const file of files) {\n\t\t\tif (!file) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (maxFileSize > 0 && file.size > maxFileSize) {\n\t\t\t\tthis.handleResponse({\n\t\t\t\t\terror: `File ${file.name} is over the maximum allowed size`,\n\t\t\t\t});\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.fileQueue.push(file);\n\t\t}\n\n\t\t// if the queue was empty and we added some files to it, and there currently\n\t\t// is no upload in process, request a token to start the upload process\n\t\tif (wasQueueEmpty && this.xhr === null && this.fileQueue.length > 0) {\n\t\t\tthis.requestToken();\n\t\t}\n\t}\n\n\trequestToken() {\n\t\tsocket.emit(\"upload:auth\");\n\t}\n\n\tsetProgress(value: number) {\n\t\tif (!this.uploadProgressbar) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.uploadProgressbar.classList.toggle(\"upload-progressbar-visible\", value > 0);\n\t\tthis.uploadProgressbar.style.width = `${value}%`;\n\t}\n\n\tuploadNextFileInQueue(token: string) {\n\t\tconst file = this.fileQueue.shift();\n\n\t\tif (!file) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Tell the server that we are still upload to this token\n\t\t// so it does not become invalidated and fail the upload.\n\t\t// This issue only happens if The Lounge is proxied through other software\n\t\t// as it may buffer the upload before the upload request will be processed by The Lounge.\n\t\tthis.tokenKeepAlive = setInterval(() => socket.emit(\"upload:ping\", token), 40 * 1000);\n\n\t\tif (\n\t\t\tstore.state.settings.uploadCanvas &&\n\t\t\tfile.type.startsWith(\"image/\") &&\n\t\t\t!file.type.includes(\"svg\") &&\n\t\t\tfile.type !== \"image/gif\"\n\t\t) {\n\t\t\tthis.renderImage(file, (newFile) => this.performUpload(token, newFile));\n\t\t} else {\n\t\t\tthis.performUpload(token, file);\n\t\t}\n\t}\n\n\trenderImage(file: File, callback: (file: File) => void) {\n\t\tconst fileReader = new FileReader();\n\n\t\tfileReader.onabort = () => callback(file);\n\t\tfileReader.onerror = () => fileReader.abort();\n\n\t\tfileReader.onload = () => {\n\t\t\tconst img = new Image();\n\n\t\t\timg.onerror = () => callback(file);\n\n\t\t\timg.onload = () => {\n\t\t\t\tconst canvas = document.createElement(\"canvas\");\n\t\t\t\tcanvas.width = img.width;\n\t\t\t\tcanvas.height = img.height;\n\t\t\t\tconst ctx = canvas.getContext(\"2d\");\n\n\t\t\t\tif (!ctx) {\n\t\t\t\t\tthrow new Error(\"Could not get canvas context in upload\");\n\t\t\t\t}\n\n\t\t\t\tctx.drawImage(img, 0, 0);\n\n\t\t\t\tcanvas.toBlob((blob) => {\n\t\t\t\t\tcallback(new File([blob!], file.name));\n\t\t\t\t}, file.type);\n\t\t\t};\n\n\t\t\t// readAsDataURL always returns a string (data: URL)\n\t\t\tif (typeof fileReader.result === \"string\") {\n\t\t\t\timg.src = fileReader.result;\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Expected string result from readAsDataURL\");\n\t\t\t}\n\t\t};\n\n\t\tfileReader.readAsDataURL(file);\n\t}\n\n\tperformUpload(token: string, file: File) {\n\t\tthis.xhr = new XMLHttpRequest();\n\n\t\tthis.xhr.upload.addEventListener(\n\t\t\t\"progress\",\n\t\t\t(e) => {\n\t\t\t\tconst percent = Math.floor((e.loaded / e.total) * 1000) / 10;\n\t\t\t\tthis.setProgress(percent);\n\t\t\t},\n\t\t\tfalse\n\t\t);\n\n\t\tthis.xhr.onreadystatechange = () => {\n\t\t\tif (this.xhr?.readyState === XMLHttpRequest.DONE) {\n\t\t\t\tlet response;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponse = JSON.parse(this.xhr.responseText);\n\t\t\t\t} catch {\n\t\t\t\t\t// This is just a safe guard and should not happen if server doesn't throw any errors.\n\t\t\t\t\t// Browsers break the HTTP spec by aborting the request without reading any response data,\n\t\t\t\t\t// if there is still data to be uploaded. Servers will only error in extreme cases like bad\n\t\t\t\t\t// authentication or server-side errors.\n\t\t\t\t\tresponse = {\n\t\t\t\t\t\terror: `Upload aborted: ${this.xhr.statusText} (HTTP ${this.xhr.status})`,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tthis.handleResponse(response);\n\n\t\t\t\tthis.xhr = null;\n\n\t\t\t\t// this file was processed, if we still have files in the queue, upload the next one\n\t\t\t\tif (this.fileQueue.length > 0) {\n\t\t\t\t\tthis.requestToken();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst formData = new FormData();\n\t\tformData.append(\"file\", file);\n\t\tthis.xhr.open(\"POST\", `uploads/new/${token}`);\n\t\tthis.xhr.send(formData);\n\t}\n\n\thandleResponse(response: {error?: string; url?: string}) {\n\t\tthis.setProgress(0);\n\n\t\tif (this.tokenKeepAlive) {\n\t\t\tclearInterval(this.tokenKeepAlive);\n\t\t\tthis.tokenKeepAlive = null;\n\t\t}\n\n\t\tif (response.error) {\n\t\t\tstore.commit(\"currentUserVisibleError\", response.error);\n\t\t\treturn;\n\t\t}\n\n\t\tif (response.url) {\n\t\t\tthis.insertUploadUrl(response.url);\n\t\t}\n\t}\n\n\tinsertUploadUrl(url: string) {\n\t\tconst fullURL = new URL(url, location.toString()).toString();\n\t\tconst textbox = document.getElementById(\"input\");\n\n\t\tif (!(textbox instanceof HTMLTextAreaElement)) {\n\t\t\tthrow new Error(\"Could not find textbox in upload\");\n\t\t}\n\n\t\tconst initStart = textbox.selectionStart;\n\n\t\t// Get the text before the cursor, and add a space if it's not in the beginning\n\t\tconst headToCursor = initStart > 0 ? textbox.value.substring(0, initStart) + \" \" : \"\";\n\n\t\t// Get the remaining text after the cursor\n\t\tconst cursorToTail = textbox.value.substring(initStart);\n\n\t\t// Construct the value until the point where we want the cursor to be\n\t\tconst textBeforeTail = headToCursor + fullURL + \" \";\n\n\t\tupdateCursor(textbox, textBeforeTail + cursorToTail);\n\n\t\t// Set the cursor after the link and a space\n\t\ttextbox.selectionStart = textbox.selectionEnd = textBeforeTail.length;\n\t}\n\n\t// TODO: This is a temporary hack while Vue porting is finalized\n\tabort() {\n\t\tthis.fileQueue = [];\n\n\t\tif (this.xhr) {\n\t\t\tthis.xhr.abort();\n\t\t\tthis.xhr = null;\n\t\t}\n\t}\n}\n\nconst instance = new Uploader();\n\nexport default {\n\tabort: () => instance.abort(),\n\tinitialize: () => instance.init(),\n\tmounted: () => instance.mounted(),\n\tunmounted: () => instance.unmounted(),\n\ttriggerUpload: (files) => instance.triggerUpload(files),\n};\n","import { render } from \"./ChatInput.vue?vue&type=template&id=758f40fe&ts=true\"\nimport script from \"./ChatInput.vue?vue&type=script&lang=ts\"\nexport * from \"./ChatInput.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<aside\n\t\tref=\"userlist\"\n\t\tclass=\"userlist\"\n\t\t:aria-label=\"'User list for ' + channel.name\"\n\t\t@mouseleave=\"removeHoverUser\"\n\t>\n\t\t<div class=\"count\">\n\t\t\t<input\n\t\t\t\tref=\"input\"\n\t\t\t\t:value=\"userSearchInput\"\n\t\t\t\t:placeholder=\"\n\t\t\t\t\tchannel.users.length + ' user' + (channel.users.length === 1 ? '' : 's')\n\t\t\t\t\"\n\t\t\t\ttype=\"search\"\n\t\t\t\tclass=\"search\"\n\t\t\t\taria-label=\"Search among the user list\"\n\t\t\t\ttabindex=\"-1\"\n\t\t\t\t@input=\"setUserSearchInput\"\n\t\t\t\t@keydown.up=\"navigateUserList($event, -1)\"\n\t\t\t\t@keydown.down=\"navigateUserList($event, 1)\"\n\t\t\t\t@keydown.page-up=\"navigateUserList($event, -10)\"\n\t\t\t\t@keydown.page-down=\"navigateUserList($event, 10)\"\n\t\t\t\t@keydown.enter=\"selectUser\"\n\t\t\t/>\n\t\t</div>\n\t\t<div class=\"names\">\n\t\t\t<!-- Custom groups from SPGROUPS -->\n\t\t\t<template v-if=\"hasCustomGroups\">\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"(users, group) in groupedUsers\"\n\t\t\t\t\t:key=\"'group-' + group\"\n\t\t\t\t\t:class=\"['user-mode', 'custom-group', 'group-' + getGroupSlug(group)]\"\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"users.length > 0\"\n\t\t\t\t\t\t:class=\"['custom-group-header', 'group-header-' + getGroupSlug(group)]\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ group }}\n\t\t\t\t\t</div>\n\t\t\t\t\t<template v-if=\"userSearchInput.length > 0\">\n\t\t\t\t\t\t<!-- eslint-disable vue/no-v-text-v-html-on-component -->\n\t\t\t\t\t\t<Username\n\t\t\t\t\t\t\tv-for=\"user in users\"\n\t\t\t\t\t\t\t:key=\"user.original!.nick + '-search'\"\n\t\t\t\t\t\t\t:on-hover=\"hoverUser\"\n\t\t\t\t\t\t\t:active=\"user.original === activeUser\"\n\t\t\t\t\t\t\t:user=\"user.original!\"\n\t\t\t\t\t\t\tv-html=\"user.string\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<!-- eslint-enable -->\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t<Username\n\t\t\t\t\t\t\tv-for=\"user in users\"\n\t\t\t\t\t\t\t:key=\"user.nick\"\n\t\t\t\t\t\t\t:on-hover=\"hoverUser\"\n\t\t\t\t\t\t\t:active=\"user === activeUser\"\n\t\t\t\t\t\t\t:user=\"user\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<!-- Default IRC modes fallback -->\n\t\t\t<template v-else>\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"(users, mode) in groupedUsers\"\n\t\t\t\t\t:key=\"mode\"\n\t\t\t\t\t:class=\"['user-mode', getModeClass(String(mode))]\"\n\t\t\t\t>\n\t\t\t\t\t<template v-if=\"userSearchInput.length > 0\">\n\t\t\t\t\t\t<!-- eslint-disable vue/no-v-text-v-html-on-component -->\n\t\t\t\t\t\t<Username\n\t\t\t\t\t\t\tv-for=\"user in users\"\n\t\t\t\t\t\t\t:key=\"user.original.nick + '-search'\"\n\t\t\t\t\t\t\t:on-hover=\"hoverUser\"\n\t\t\t\t\t\t\t:active=\"user.original === activeUser\"\n\t\t\t\t\t\t\t:user=\"user.original\"\n\t\t\t\t\t\t\tv-html=\"user.string\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<!-- eslint-enable -->\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t<Username\n\t\t\t\t\t\t\tv-for=\"user in users\"\n\t\t\t\t\t\t\t:key=\"user.nick\"\n\t\t\t\t\t\t\t:on-hover=\"hoverUser\"\n\t\t\t\t\t\t\t:active=\"user === activeUser\"\n\t\t\t\t\t\t\t:user=\"user\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</div>\n\t</aside>\n</template>\n\n<style lang=\"css\">\n.custom-group-header {\n\tbackground: var(--window-bg-color);\n\tcolor: var(--body-color-muted);\n\tdisplay: flex;\n\tfont-weight: 700;\n\tpadding: 8px 14px 8px 10px;\n\tposition: sticky;\n\ttop: 0;\n\n\t&::before {\n\t\tfont-weight: 900;\n\t\tfont-family: \"Font Awesome 6 Pro\";\n\t\tdisplay: var(--fa-display, inline-block);\n\t\tfont-style: normal;\n\t\tfont-variant: normal;\n\t\ttext-rendering: auto;\n\t\tmargin-right: 6px;\n\t\talign-self: center;\n\t}\n\n\t&::after {\n\t\tcontent: \"\";\n\t\theight: 1px;\n\t\tbackground: currentColor;\n\t\tmargin: 0 0 0 10px;\n\t\topacity: 0.5;\n\t\tflex-grow: 1;\n\t\talign-self: center;\n\t}\n}\n</style>\n\n<script lang=\"ts\">\nimport {filter as fuzzyFilter} from \"fuzzy\";\nimport {computed, defineComponent, nextTick, PropType, ref} from \"vue\";\nimport type {UserInMessage} from \"../../shared/types/msg\";\nimport type {ClientChan, ClientUser} from \"../js/types\";\nimport Username from \"./Username.vue\";\nimport {useStore} from \"../js/store\";\n\nconst modes = {\n\t\"~\": \"owner\",\n\t\"&\": \"admin\",\n\t\"!\": \"admin\",\n\t\"@\": \"op\",\n\t\"%\": \"half-op\",\n\t\"+\": \"voice\",\n\t\"\": \"normal\",\n};\n\nexport default defineComponent({\n\tname: \"ChatUserList\",\n\tcomponents: {\n\t\tUsername,\n\t},\n\tprops: {\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\t\tconst userSearchInput = ref(\"\");\n\t\tconst activeUser = ref<UserInMessage | null>();\n\t\tconst userlist = ref<HTMLDivElement>();\n\n\t\t// Check if we have custom groups from SPGROUPS\n\t\tconst hasCustomGroups = computed(() => {\n\t\t\treturn (\n\t\t\t\tstore.state.settings.enhancedUserListEnabled &&\n\t\t\t\tprops.channel.groups &&\n\t\t\t\tprops.channel.groups.length > 0\n\t\t\t);\n\t\t});\n\n\t\tconst filteredUsers = computed(() => {\n\t\t\tif (!userSearchInput.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn fuzzyFilter(userSearchInput.value, props.channel.users, {\n\t\t\t\tpre: \"<b>\",\n\t\t\t\tpost: \"</b>\",\n\t\t\t\textract: (u) => u.nick,\n\t\t\t});\n\t\t});\n\n\t\t// CSS safe group name cache\n\t\tconst groupNameSlugs = new Map<string, string>();\n\n\t\t// Convert group to CSS-safe name\n\t\tconst slugify = (group: string) => {\n\t\t\tif (groupNameSlugs.has(group)) return;\n\n\t\t\tconst groupNormalized = group.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n\t\t\tconst groupCSSSafe = groupNormalized.replace(/^-|-$/g, \"\");\n\n\t\t\treturn groupNameSlugs.set(group, groupCSSSafe);\n\t\t};\n\n\t\t// Get CSS-safe group name\n\t\tconst getGroupSlug = (group: string) => {\n\t\t\treturn groupNameSlugs.get(group) ?? slugify(group);\n\t\t};\n\n\t\tconst customGroupedUsers = computed(() => {\n\t\t\tconst groups = {};\n\n\t\t\tif (hasCustomGroups.value) {\n\t\t\t\tif (userSearchInput.value && filteredUsers.value) {\n\t\t\t\t\tconst filtered = filteredUsers.value.filter((user) => user.original.nick);\n\n\t\t\t\t\tfor (const {name, users} of props.channel.groups ?? []) {\n\t\t\t\t\t\tgroups[name] ??= [];\n\t\t\t\t\t\tslugify(name);\n\n\t\t\t\t\t\tfor (const user of filtered) {\n\t\t\t\t\t\t\tif (!users.includes(user.original.nick)) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tgroups[name].push(user);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (const {name, users} of props.channel.groups ?? []) {\n\t\t\t\t\t\tgroups[name] ??= [];\n\t\t\t\t\t\tslugify(name);\n\n\t\t\t\t\t\tfor (const user of props.channel.users) {\n\t\t\t\t\t\t\tif (!users.includes(user.nick)) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tgroups[name].push(user);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn groups as {\n\t\t\t\t[group: string]: (ClientUser & {\n\t\t\t\t\toriginal: UserInMessage;\n\t\t\t\t\tstring: string;\n\t\t\t\t})[];\n\t\t\t};\n\t\t});\n\n\t\tconst standardGroupedUsers = computed(() => {\n\t\t\tconst groups = {};\n\n\t\t\tif (!hasCustomGroups.value) {\n\t\t\t\tif (userSearchInput.value && filteredUsers.value) {\n\t\t\t\t\tconst result = filteredUsers.value;\n\n\t\t\t\t\tfor (const user of result) {\n\t\t\t\t\t\tconst mode: string = user.original.modes[0] || \"\";\n\t\t\t\t\t\tgroups[mode] ??= [];\n\n\t\t\t\t\t\t// Prepend user mode to search result\n\t\t\t\t\t\tuser.string = mode + user.string;\n\t\t\t\t\t\tgroups[mode].push(user);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (const user of props.channel.users) {\n\t\t\t\t\t\tconst mode = user.modes[0] || \"\";\n\n\t\t\t\t\t\tgroups[mode] ??= [];\n\t\t\t\t\t\tgroups[mode].push(user);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn groups as {\n\t\t\t\t[mode: string]: (ClientUser & {\n\t\t\t\t\toriginal: UserInMessage;\n\t\t\t\t\tstring: string;\n\t\t\t\t})[];\n\t\t\t};\n\t\t});\n\n\t\tconst groupedUsers = computed(() => {\n\t\t\treturn hasCustomGroups.value ? customGroupedUsers.value : standardGroupedUsers.value;\n\t\t});\n\n\t\tconst setUserSearchInput = (e: Event) => {\n\t\t\tuserSearchInput.value = (e.target as HTMLInputElement).value;\n\t\t};\n\n\t\tconst getModeClass = (mode: string) => {\n\t\t\treturn modes[mode] as typeof modes;\n\t\t};\n\n\t\tconst selectUser = () => {\n\t\t\t// Simulate a click on the active user to open the context menu.\n\t\t\t// Coordinates are provided to position the menu correctly.\n\t\t\tif (!activeUser.value || !userlist.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst el = userlist.value.querySelector(\".active\");\n\n\t\t\tif (!el) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\tconst ev = new MouseEvent(\"click\", {\n\t\t\t\tview: window,\n\t\t\t\tbubbles: true,\n\t\t\t\tcancelable: true,\n\t\t\t\tclientX: rect.left,\n\t\t\t\tclientY: rect.top + rect.height,\n\t\t\t});\n\t\t\tel.dispatchEvent(ev);\n\t\t};\n\n\t\tconst hoverUser = (user: UserInMessage) => {\n\t\t\tactiveUser.value = user;\n\t\t};\n\n\t\tconst removeHoverUser = () => {\n\t\t\tactiveUser.value = null;\n\t\t};\n\n\t\tconst scrollToActiveUser = () => {\n\t\t\t// Scroll the list if needed after the active class is applied\n\t\t\tvoid nextTick(() => {\n\t\t\t\tconst el = userlist.value?.querySelector(\".active\");\n\t\t\t\tel?.scrollIntoView({block: \"nearest\", inline: \"nearest\"});\n\t\t\t});\n\t\t};\n\n\t\tconst navigateUserList = (event: Event, direction: number) => {\n\t\t\t// Prevent propagation to stop global keybind handler from capturing pagedown/pageup\n\t\t\t// and redirecting it to the message list container for scrolling\n\t\t\tevent.stopImmediatePropagation();\n\t\t\tevent.preventDefault();\n\n\t\t\tlet users = props.channel.users;\n\n\t\t\t// Only using filteredUsers when we have to avoids filtering when it's not needed\n\t\t\tif (userSearchInput.value && filteredUsers.value) {\n\t\t\t\tusers = filteredUsers.value.map((result) => result.original);\n\t\t\t}\n\n\t\t\t// Bail out if there's no users to select\n\t\t\tif (!users.length) {\n\t\t\t\tactiveUser.value = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst abort = () => {\n\t\t\t\tactiveUser.value = direction ? users[0] : users[users.length - 1];\n\t\t\t\tscrollToActiveUser();\n\t\t\t};\n\n\t\t\t// If there's no active user select the first or last one depending on direction\n\t\t\tif (!activeUser.value) {\n\t\t\t\tabort();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet currentIndex = users.indexOf(activeUser.value as ClientUser);\n\n\t\t\tif (currentIndex === -1) {\n\t\t\t\tabort();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcurrentIndex += direction;\n\n\t\t\t// Wrap around the list if necessary. Normaly each loop iterates once at most,\n\t\t\t// but might iterate more often if pgup or pgdown are used in a very short user list\n\t\t\twhile (currentIndex < 0) {\n\t\t\t\tcurrentIndex += users.length;\n\t\t\t}\n\n\t\t\twhile (currentIndex > users.length - 1) {\n\t\t\t\tcurrentIndex -= users.length;\n\t\t\t}\n\n\t\t\tactiveUser.value = users[currentIndex];\n\t\t\tscrollToActiveUser();\n\t\t};\n\n\t\treturn {\n\t\t\tfilteredUsers,\n\t\t\tgroupedUsers,\n\t\t\thasCustomGroups,\n\t\t\tuserSearchInput,\n\t\t\tactiveUser,\n\t\t\tuserlist,\n\t\t\tgetGroupSlug,\n\t\t\tsetUserSearchInput,\n\t\t\tgetModeClass,\n\t\t\tselectUser,\n\t\t\thoverUser,\n\t\t\tremoveHoverUser,\n\t\t\tnavigateUserList,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./ChatUserList.vue?vue&type=template&id=09f4e1e4&ts=true\"\nimport script from \"./ChatUserList.vue?vue&type=script&lang=ts\"\nexport * from \"./ChatUserList.vue?vue&type=script&lang=ts\"\n\nimport \"./ChatUserList.vue?vue&type=style&index=0&id=09f4e1e4&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<table class=\"ban-list\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th class=\"hostmask\">Banned</th>\n\t\t\t\t<th class=\"banned_by\">Banned By</th>\n\t\t\t\t<th class=\"banned_at\">Banned At</th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr v-for=\"ban in channel.data as any\" :key=\"ban.hostmask\">\n\t\t\t\t<td class=\"hostmask\"><ParsedMessage :network=\"network\" :text=\"ban.hostmask\" /></td>\n\t\t\t\t<td class=\"banned_by\">{{ ban.banned_by }}</td>\n\t\t\t\t<td class=\"banned_at\">{{ localetime(ban.banned_at) }}</td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</template>\n\n<script lang=\"ts\">\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport localeTime from \"../../js/helpers/localetime\";\nimport {defineComponent, PropType} from \"vue\";\nimport type {ClientNetwork, ClientChan} from \"../../js/types\";\n\nexport default defineComponent({\n\tname: \"ListBans\",\n\tcomponents: {\n\t\tParsedMessage,\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\tsetup() {\n\t\tconst localetime = (date: number | Date) => {\n\t\t\treturn localeTime(date);\n\t\t};\n\n\t\treturn {\n\t\t\tlocaletime,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./ListBans.vue?vue&type=template&id=36cb587c&ts=true\"\nimport script from \"./ListBans.vue?vue&type=script&lang=ts\"\nexport * from \"./ListBans.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<table class=\"invite-list\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th class=\"hostmask\">Invited</th>\n\t\t\t\t<th class=\"invitened_by\">Invited By</th>\n\t\t\t\t<th class=\"invitened_at\">Invited At</th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr v-for=\"invite in channel.data as any\" :key=\"invite.hostmask\">\n\t\t\t\t<td class=\"hostmask\">\n\t\t\t\t\t<ParsedMessage :network=\"network\" :text=\"invite.hostmask\" />\n\t\t\t\t</td>\n\t\t\t\t<td class=\"invitened_by\">{{ invite.invited_by }}</td>\n\t\t\t\t<td class=\"invitened_at\">{{ localetime(invite.invited_at) }}</td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</template>\n\n<script lang=\"ts\">\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport localetime from \"../../js/helpers/localetime\";\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientChan} from \"../../js/types\";\n\nexport default defineComponent({\n\tname: \"ListInvites\",\n\tcomponents: {\n\t\tParsedMessage,\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\tsetup() {\n\t\treturn {\n\t\t\tlocaletime: (date: Date) => localetime(date),\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./ListInvites.vue?vue&type=template&id=082bb5a3&ts=true\"\nimport script from \"./ListInvites.vue?vue&type=script&lang=ts\"\nexport * from \"./ListInvites.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span v-if=\"channelData.text\">{{ channelData.text }} </span>\n\t<table v-else class=\"channel-list\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th class=\"channel\">Channel</th>\n\t\t\t\t<th class=\"users\">Users</th>\n\t\t\t\t<th class=\"topic\">Topic</th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr v-for=\"chan in channelData\" :key=\"chan.channel\">\n\t\t\t\t<td class=\"channel\"><ParsedMessage :network=\"network\" :text=\"chan.channel\" /></td>\n\t\t\t\t<td class=\"users\">{{ chan.num_users }}</td>\n\t\t\t\t<td class=\"topic\"><ParsedMessage :network=\"network\" :text=\"chan.topic\" /></td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientChan, ClientNetwork} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\n\nexport default defineComponent({\n\tname: \"ListChannels\",\n\tcomponents: {\n\t\tParsedMessage,\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\tsetup(props) {\n\t\treturn {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\tchannelData: props.channel.data as any,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./ListChannels.vue?vue&type=template&id=0b45f7bb&ts=true\"\nimport script from \"./ListChannels.vue?vue&type=script&lang=ts\"\nexport * from \"./ListChannels.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<table class=\"ignore-list\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th class=\"hostmask\">Hostmask</th>\n\t\t\t\t<th class=\"when\">Ignored At</th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr v-for=\"user in channel.data as any\" :key=\"user.hostmask\">\n\t\t\t\t<td class=\"hostmask\"><ParsedMessage :network=\"network\" :text=\"user.hostmask\" /></td>\n\t\t\t\t<td class=\"when\">{{ localetime(user.when) }}</td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</template>\n\n<script lang=\"ts\">\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport localetime from \"../../js/helpers/localetime\";\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientChan} from \"../../js/types\";\n\nexport default defineComponent({\n\tname: \"ListIgnored\",\n\tcomponents: {\n\t\tParsedMessage,\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\tsetup() {\n\t\treturn {\n\t\t\tlocaletime,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./ListIgnored.vue?vue&type=template&id=560fe250&ts=true\"\nimport script from \"./ListIgnored.vue?vue&type=script&lang=ts\"\nexport * from \"./ListIgnored.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Chat.vue?vue&type=template&id=03bfba32&ts=true\"\nimport script from \"./Chat.vue?vue&type=script&lang=ts\"\nexport * from \"./Chat.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<Chat\n\t\tv-if=\"activeChannel\"\n\t\t:network=\"activeChannel.network\"\n\t\t:channel=\"activeChannel.channel\"\n\t\t:is-focused=\"parseInt(String(route.query.focused), 10)\"\n\t\t:focused-time=\"parseInt(String(route.query.focusedTime), 10)\"\n\t\t@channel-changed=\"channelChanged\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport {watch, computed, defineComponent, onMounted} from \"vue\";\nimport {useRoute} from \"vue-router\";\nimport {useStore} from \"../js/store\";\nimport {ClientChan} from \"../js/types\";\n\n// Temporary component for routing channels and lobbies\nimport Chat from \"./Chat.vue\";\n\nexport default defineComponent({\n\tname: \"RoutedChat\",\n\tcomponents: {\n\t\tChat,\n\t},\n\tsetup() {\n\t\tconst route = useRoute();\n\t\tconst store = useStore();\n\n\t\tconst activeChannel = computed(() => {\n\t\t\tconst chanId = parseInt(String(route.params.id || \"\"), 10);\n\t\t\tconst channel = store.getters.findChannel(chanId);\n\t\t\treturn channel;\n\t\t});\n\n\t\tconst setActiveChannel = () => {\n\t\t\tif (activeChannel.value) {\n\t\t\t\tstore.commit(\"activeChannel\", activeChannel.value);\n\t\t\t}\n\t\t};\n\n\t\twatch(activeChannel, () => {\n\t\t\tsetActiveChannel();\n\t\t});\n\n\t\tonMounted(() => {\n\t\t\tsetActiveChannel();\n\t\t});\n\n\t\tconst channelChanged = (channel: ClientChan) => {\n\t\t\tconst chanId = channel.id;\n\t\t\tconst chanInStore = store.getters.findChannel(chanId);\n\n\t\t\tif (chanInStore?.channel) {\n\t\t\t\tchanInStore.channel.unread = 0;\n\t\t\t\tchanInStore.channel.highlight = 0;\n\t\t\t}\n\t\t};\n\n\t\treturn {\n\t\t\troute,\n\t\t\tactiveChannel,\n\t\t\tchannelChanged,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./RoutedChat.vue?vue&type=template&id=09d59c3e&ts=true\"\nimport script from \"./RoutedChat.vue?vue&type=script&lang=ts\"\nexport * from \"./RoutedChat.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div>\n\t\t<h2>Messages</h2>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input :checked=\"store.state.settings.motd\" type=\"checkbox\" name=\"motd\" />\n\t\t\t\tShow <abbr title=\"Message Of The Day\">MOTD</abbr>\n\t\t\t</label>\n\t\t</div>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.showSeconds\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"showSeconds\"\n\t\t\t\t/>\n\t\t\t\tInclude seconds in timestamp\n\t\t\t</label>\n\t\t</div>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.use12hClock\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"use12hClock\"\n\t\t\t\t/>\n\t\t\t\tUse 12-hour timestamps\n\t\t\t</label>\n\t\t</div>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.beautifyBridgedMessages\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"beautifyBridgedMessages\"\n\t\t\t\t/>\n\t\t\t\tBeautify supported bridged shoutbox messages\n\t\t\t</label>\n\t\t\t<div role=\"group\" style=\"padding-left: 1.5rem\">\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:disabled=\"!store.state.settings.beautifyBridgedMessages || undefined\"\n\t\t\t\t\t\t:checked=\"store.state.settings.bridgedMessageNicksStyle === 'parentheses'\"\n\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\tname=\"bridgedMessageNicksStyle\"\n\t\t\t\t\t\tvalue=\"parentheses\"\n\t\t\t\t\t/>\n\t\t\t\t\tShow bridged nicknames in parentheses\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\taria-label=\"example: (nick)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:disabled=\"!store.state.settings.beautifyBridgedMessages || undefined\"\n\t\t\t\t\t\t:checked=\"store.state.settings.bridgedMessageNicksStyle === 'normal'\"\n\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\tname=\"bridgedMessageNicksStyle\"\n\t\t\t\t\t\tvalue=\"normal\"\n\t\t\t\t\t/>\n\t\t\t\t\tShow bridged nicknames like a normal user\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\taria-label=\"example: nick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t</div>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.disableMutedUnread\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"disableMutedUnread\"\n\t\t\t\t/>\n\t\t\t\tDon't show unread badges on muted channels\n\t\t\t</label>\n\t\t</div>\n\t\t<template v-if=\"store.state.serverConfiguration?.prefetch\">\n\t\t\t<h2>Link previews</h2>\n\t\t\t<div>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input :checked=\"store.state.settings.media\" type=\"checkbox\" name=\"media\" />\n\t\t\t\t\tAuto-expand media\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input :checked=\"store.state.settings.links\" type=\"checkbox\" name=\"links\" />\n\t\t\t\t\tAuto-expand websites\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t</template>\n\t\t<h2 id=\"label-status-messages\">\n\t\t\tStatus messages\n\t\t\t<span\n\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\taria-label=\"Joins, parts, quits, kicks, nick changes, and mode changes\"\n\t\t\t>\n\t\t\t\t<button class=\"extra-help\" />\n\t\t\t</span>\n\t\t</h2>\n\t\t<div role=\"group\" aria-labelledby=\"label-status-messages\">\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.statusMessages === 'shown'\"\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\tname=\"statusMessages\"\n\t\t\t\t\tvalue=\"shown\"\n\t\t\t\t/>\n\t\t\t\tShow all status messages individually\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.statusMessages === 'condensed'\"\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\tname=\"statusMessages\"\n\t\t\t\t\tvalue=\"condensed\"\n\t\t\t\t/>\n\t\t\t\tCondense status messages together\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.statusMessages === 'hidden'\"\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\tname=\"statusMessages\"\n\t\t\t\t\tvalue=\"hidden\"\n\t\t\t\t/>\n\t\t\t\tHide all status messages\n\t\t\t</label>\n\t\t</div>\n\t\t<h2>Layout</h2>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.enhancedUserListEnabled\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"enhancedUserListEnabled\"\n\t\t\t\t/>\n\t\t\t\tUse enhanced user list when available\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.enhancedContextMenuEnabled\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"enhancedContextMenuEnabled\"\n\t\t\t\t/>\n\t\t\t\tUse enhanced context menu\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.showInputNick\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"showInputNick\"\n\t\t\t\t/>\n\t\t\t\tShow current nick in the input box\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.jumptoEabled\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"jumptoEabled\"\n\t\t\t\t/>\n\t\t\t\tEnable \"Jump to\" in sidebar\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.filterdmsEnabled\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"filterdmsEnabled\"\n\t\t\t\t/>\n\t\t\t\tEnable \"Filter DMs\" in DM section\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.showAllDMs\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"showAllDMs\"\n\t\t\t\t/>\n\t\t\t\tAlways show all DM channels in sidebar\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.compactSidebar\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"compactSidebar\"\n\t\t\t\t/>\n\t\t\t\tUse compact sidebar on Desktop\n\t\t\t</label>\n\t\t</div>\n\t\t<h2>Visual Aids</h2>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.coloredNicks\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"coloredNicks\"\n\t\t\t\t/>\n\t\t\t\tEnable colored nicknames\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.autocomplete\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"autocomplete\"\n\t\t\t\t/>\n\t\t\t\tEnable autocomplete\n\t\t\t</label>\n\t\t</div>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<label for=\"nickPostfix\" class=\"opt\">\n\t\t\t\t\tNick autocomplete postfix\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\taria-label=\"Nick autocomplete postfix (for example a comma)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"nickPostfix\"\n\t\t\t\t\t:value=\"store.state.settings.nickPostfix\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tname=\"nickPostfix\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tplaceholder=\"Nick autocomplete postfix (e.g. ', ')\"\n\t\t\t\t/>\n\t\t\t</label>\n\t\t</div>\n\n\t\t<h2>Theme</h2>\n\t\t<div>\n\t\t\t<label for=\"theme-select\" class=\"sr-only\">Theme</label>\n\t\t\t<select\n\t\t\t\tid=\"theme-select\"\n\t\t\t\t:value=\"store.state.settings.theme\"\n\t\t\t\tname=\"theme\"\n\t\t\t\tclass=\"input\"\n\t\t\t>\n\t\t\t\t<option\n\t\t\t\t\tv-for=\"theme in store.state.serverConfiguration?.themes\"\n\t\t\t\t\t:key=\"theme.name\"\n\t\t\t\t\t:value=\"theme.name\"\n\t\t\t\t>\n\t\t\t\t\t{{ theme.displayName }}\n\t\t\t\t</option>\n\t\t\t</select>\n\t\t</div>\n\n\t\t<div>\n\t\t\t<h2>Custom Stylesheet</h2>\n\t\t\t<label for=\"user-specified-css-input\" class=\"sr-only\">\n\t\t\t\tCustom stylesheet. You can override any style with CSS here.\n\t\t\t</label>\n\t\t\t<textarea\n\t\t\t\tid=\"user-specified-css-input\"\n\t\t\t\t:value=\"store.state.settings.userStyles\"\n\t\t\t\tclass=\"input\"\n\t\t\t\tname=\"userStyles\"\n\t\t\t\tplaceholder=\"/* You can override any style with CSS here */\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\ntextarea#user-specified-css-input {\n\theight: 100px;\n}\n</style>\n\n<script lang=\"ts\">\nimport {defineComponent} from \"vue\";\nimport {useStore} from \"../../js/store\";\n\nexport default defineComponent({\n\tname: \"AppearanceSettings\",\n\tsetup() {\n\t\tconst store = useStore();\n\t\treturn {\n\t\t\tstore,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./Appearance.vue?vue&type=template&id=828a95a0&ts=true\"\nimport script from \"./Appearance.vue?vue&type=script&lang=ts\"\nexport * from \"./Appearance.vue?vue&type=script&lang=ts\"\n\nimport \"./Appearance.vue?vue&type=style&index=0&id=828a95a0&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div>\n\t\t<div v-if=\"canRegisterProtocol || hasInstallPromptEvent\">\n\t\t\t<h2>Native app</h2>\n\t\t\t<button\n\t\t\t\tv-if=\"hasInstallPromptEvent\"\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"btn\"\n\t\t\t\t@click.prevent=\"nativeInstallPrompt\"\n\t\t\t>\n\t\t\t\tAdd The Lounge to Home screen\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\tv-if=\"canRegisterProtocol\"\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"btn\"\n\t\t\t\t@click.prevent=\"registerProtocol\"\n\t\t\t>\n\t\t\t\tOpen irc:// URLs with The Lounge\n\t\t\t</button>\n\t\t</div>\n\t\t<div v-if=\"store.state.serverConfiguration?.fileUpload\">\n\t\t\t<h2>File uploads</h2>\n\t\t\t<div>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"store.state.settings.uploadCanvas\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"uploadCanvas\"\n\t\t\t\t\t/>\n\t\t\t\t\tAttempt to remove metadata from images before uploading\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\taria-label=\"This option renders the image into a canvas element to remove metadata from the image.\n\tThis may break orientation if your browser does not support that.\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-if=\"store.state.settings.searchEnabled\">\n\t\t\t<h2>Enhanced search</h2>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.enableEnhancedSearch\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"enableEnhancedSearch\"\n\t\t\t\t/>\n\t\t\t\tEnable enhanced search with 'Jump to message'\n\t\t\t</label>\n\t\t</div>\n\t\t<div v-if=\"store.state.settings.searchEnabled\">\n\t\t\t<h2>Input</h2>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.enableRainbowHotkey\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"enableRainbowHotkey\"\n\t\t\t\t/>\n\t\t\t\tEnable rainbow messages with 'Ctrl+R' hotkey\n\t\t\t\t<span\n\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\taria-label=\"You can still use rainbow text with '/rainbow' or '/rgb'\"\n\t\t\t\t>\n\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t</div>\n\t\t<div v-if=\"!store.state.serverConfiguration?.public\">\n\t\t\t<h2>Settings synchronisation</h2>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.syncSettings\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"syncSettings\"\n\t\t\t\t/>\n\t\t\t\tSynchronize settings with other clients\n\t\t\t</label>\n\t\t\t<template v-if=\"!store.state.settings.syncSettings\">\n\t\t\t\t<div v-if=\"store.state.serverHasSettings\" class=\"settings-sync-panel\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\t<strong>Warning:</strong> Checking this box will override the settings of\n\t\t\t\t\t\tthis client with those stored on the server.\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tUse the button below to enable synchronization, and override any settings\n\t\t\t\t\t\talready synced to the server.\n\t\t\t\t\t</p>\n\t\t\t\t\t<button type=\"button\" class=\"btn btn-small\" @click=\"onForceSyncClick\">\n\t\t\t\t\t\tSync settings and enable\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div v-else class=\"settings-sync-panel\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\t<strong>Warning:</strong> No settings have been synced before. Enabling this\n\t\t\t\t\t\twill sync all settings of this client as the base for other clients.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</div>\n\t\t<div v-if=\"!store.state.serverConfiguration?.public\">\n\t\t\t<h2>Automatic away message</h2>\n\n\t\t\t<label class=\"opt\">\n\t\t\t\t<label for=\"awayMessage\" class=\"sr-only\">Automatic away message</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"awayMessage\"\n\t\t\t\t\t:value=\"store.state.settings.awayMessage\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tname=\"awayMessage\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tplaceholder=\"Away message if The Lounge is not open\"\n\t\t\t\t/>\n\t\t\t</label>\n\t\t</div>\n\t</div>\n</template>\n\n<style></style>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, onMounted, ref} from \"vue\";\nimport {useStore} from \"../../js/store\";\nimport {BeforeInstallPromptEvent} from \"../../js/types\";\n\nlet installPromptEvent: BeforeInstallPromptEvent | null = null;\n\nwindow.addEventListener(\"beforeinstallprompt\", (e) => {\n\te.preventDefault();\n\tinstallPromptEvent = e as BeforeInstallPromptEvent;\n});\n\nexport default defineComponent({\n\tname: \"GeneralSettings\",\n\tsetup() {\n\t\tconst store = useStore();\n\t\tconst canRegisterProtocol = ref(false);\n\n\t\tconst hasInstallPromptEvent = computed(() => {\n\t\t\t// TODO: This doesn't hide the button after clicking\n\t\t\treturn installPromptEvent !== null;\n\t\t});\n\n\t\tonMounted(() => {\n\t\t\t// Enable protocol handler registration if supported,\n\t\t\t// and the network configuration is not locked\n\t\t\tcanRegisterProtocol.value =\n\t\t\t\t!!window.navigator.registerProtocolHandler &&\n\t\t\t\t!store.state.serverConfiguration?.lockNetwork;\n\t\t});\n\n\t\tconst nativeInstallPrompt = () => {\n\t\t\tif (!installPromptEvent) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tinstallPromptEvent.prompt().catch((e) => {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(e);\n\t\t\t});\n\n\t\t\tinstallPromptEvent = null;\n\t\t};\n\n\t\tconst onForceSyncClick = () => {\n\t\t\tstore.dispatch(\"settings/syncAll\", true).catch((e) => {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(e);\n\t\t\t});\n\n\t\t\tstore\n\t\t\t\t.dispatch(\"settings/update\", {\n\t\t\t\t\tname: \"syncSettings\",\n\t\t\t\t\tvalue: true,\n\t\t\t\t\tsync: true,\n\t\t\t\t})\n\t\t\t\t.catch((e) => {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t});\n\t\t};\n\n\t\tconst registerProtocol = () => {\n\t\t\tconst uri = document.location.origin + document.location.pathname + \"?uri=%s\";\n\t\t\t// The third argument was deprecated and has been removed from the spec\n\t\t\twindow.navigator.registerProtocolHandler(\"irc\", uri);\n\t\t\twindow.navigator.registerProtocolHandler(\"ircs\", uri);\n\t\t};\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tcanRegisterProtocol,\n\t\t\thasInstallPromptEvent,\n\t\t\tnativeInstallPrompt,\n\t\t\tonForceSyncClick,\n\t\t\tregisterProtocol,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./General.vue?vue&type=template&id=7e6cb977&ts=true\"\nimport script from \"./General.vue?vue&type=script&lang=ts\"\nexport * from \"./General.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div>\n\t\t<div\n\t\t\tv-if=\"\n\t\t\t\t!store.state.serverConfiguration?.public &&\n\t\t\t\t!store.state.serverConfiguration?.ldapEnabled\n\t\t\t\"\n\t\t\tid=\"change-password\"\n\t\t\trole=\"group\"\n\t\t\taria-labelledby=\"label-change-password\"\n\t\t>\n\t\t\t<h2 id=\"label-change-password\">Change password</h2>\n\t\t\t<div class=\"password-container\">\n\t\t\t\t<label for=\"current-password\" class=\"sr-only\"> Enter current password </label>\n\t\t\t\t<RevealPassword v-slot:default=\"slotProps\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"current-password\"\n\t\t\t\t\t\tv-model=\"old_password\"\n\t\t\t\t\t\tautocomplete=\"current-password\"\n\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\tname=\"old_password\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tplaceholder=\"Enter current password\"\n\t\t\t\t\t/>\n\t\t\t\t</RevealPassword>\n\t\t\t</div>\n\t\t\t<div class=\"password-container\">\n\t\t\t\t<label for=\"new-password\" class=\"sr-only\"> Enter desired new password </label>\n\t\t\t\t<RevealPassword v-slot:default=\"slotProps\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"new-password\"\n\t\t\t\t\t\tv-model=\"new_password\"\n\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\tname=\"new_password\"\n\t\t\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tplaceholder=\"Enter desired new password\"\n\t\t\t\t\t/>\n\t\t\t\t</RevealPassword>\n\t\t\t</div>\n\t\t\t<div class=\"password-container\">\n\t\t\t\t<label for=\"new-password-verify\" class=\"sr-only\"> Repeat new password </label>\n\t\t\t\t<RevealPassword v-slot:default=\"slotProps\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"new-password-verify\"\n\t\t\t\t\t\tv-model=\"verify_password\"\n\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\tname=\"verify_password\"\n\t\t\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tplaceholder=\"Repeat new password\"\n\t\t\t\t\t/>\n\t\t\t\t</RevealPassword>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-if=\"passwordChangeStatus && passwordChangeStatus.success\"\n\t\t\t\tclass=\"feedback success\"\n\t\t\t>\n\t\t\t\tSuccessfully updated your password\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-else-if=\"passwordChangeStatus && passwordChangeStatus.error\"\n\t\t\t\tclass=\"feedback error\"\n\t\t\t>\n\t\t\t\t{{ passwordErrors[passwordChangeStatus.error] }}\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<button type=\"submit\" class=\"btn\" @click.prevent=\"changePassword\">\n\t\t\t\t\tChange password\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div v-if=\"!store.state.serverConfiguration?.public\" class=\"session-list\" role=\"group\">\n\t\t\t<h2>Sessions</h2>\n\n\t\t\t<h3>Current session</h3>\n\t\t\t<Session v-if=\"currentSession\" :session=\"currentSession\" />\n\n\t\t\t<template v-if=\"activeSessions.length > 0\">\n\t\t\t\t<h3>active sessions</h3>\n\t\t\t\t<session;\n\t\t\t\t\tv-for=\"session in activeSessions\"\n\t\t\t\t\t:key=\"session.token\"\n\t\t\t\t\t:session=\"session\"\n\t\t\t\t/>\n\t\t\t</template>\n\n\t\t\t<h3>other sessions</h3>\n\t\t\t<p v-if=\"store.state.sessions.length === 0\">loading…</p>\n\t\t\t<p v-else-if=\"otherSessions.length === 0\">\n\t\t\t\t<em>you are not currently logged in to any other device.</em>\n\t\t\t</p>\n\t\t\t<session\n\t\t\t\tv-for=\"session in otherSessions\"\n\t\t\t\tv-else\n\t\t\t\t:key=\"session.token\"\n\t\t\t\t:session=\"session\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport socket from \"../../js/socket\";\nimport RevealPassword from \"../RevealPassword.vue\";\nimport Session from \"../Session.vue\";\nimport {computed, defineComponent, onMounted, ref} from \"vue\";\nimport {useStore} from \"../../js/store\";\n\nexport default defineComponent({\n\tname: \"UserSettings\",\n\tcomponents: {\n\t\tRevealPassword,\n\t\tSession,\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\n\t\tconst passwordErrors = {\n\t\t\tmissing_fields: \"Please fill in all fields\",\n\t\t\tpassword_mismatch: \"Both new password fields must match\",\n\t\t\tpassword_incorrect: \"The current password field does not match your account password\",\n\t\t\tupdate_failed: \"Failed to update your password\",\n\t\t};\n\n\t\ttype PasswordChangeResponse = {\n\t\t\tsuccess: boolean;\n\t\t\terror: keyof typeof passwordErrors;\n\t\t};\n\n\t\tconst passwordChangeStatus = ref<PasswordChangeResponse>();\n\n\t\tconst old_password = ref(\"\");\n\t\tconst new_password = ref(\"\");\n\t\tconst verify_password = ref(\"\");\n\n\t\tconst currentSession = computed(() => {\n\t\t\treturn store.state.sessions.find((item) => item.current);\n\t\t});\n\n\t\tconst activeSessions = computed(() => {\n\t\t\treturn store.state.sessions.filter((item) => !item.current && item.active > 0);\n\t\t});\n\n\t\tconst otherSessions = computed(() => {\n\t\t\treturn store.state.sessions.filter((item) => !item.current && !item.active);\n\t\t});\n\n\t\tonMounted(() => {\n\t\t\tsocket.emit(\"sessions:get\");\n\t\t});\n\n\t\tconst changePassword = () => {\n\t\t\tconst data = {\n\t\t\t\told_password: old_password.value,\n\t\t\t\tnew_password: new_password.value,\n\t\t\t\tverify_password: verify_password.value,\n\t\t\t};\n\n\t\t\tif (!data.old_password || !data.new_password || !data.verify_password) {\n\t\t\t\tpasswordChangeStatus.value = {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: \"missing_fields\",\n\t\t\t\t};\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (data.new_password !== data.verify_password) {\n\t\t\t\tpasswordChangeStatus.value = {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: \"password_mismatch\",\n\t\t\t\t};\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsocket.once(\"change-password\", (response) => {\n\t\t\t\t// TODO type\n\t\t\t\tpasswordChangeStatus.value = response as PasswordChangeResponse;\n\t\t\t});\n\n\t\t\tsocket.emit(\"change-password\", data);\n\t\t};\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tpasswordChangeStatus,\n\t\t\tpasswordErrors,\n\t\t\tcurrentSession,\n\t\t\tactiveSessions,\n\t\t\totherSessions,\n\t\t\tchangePassword,\n\t\t\told_password,\n\t\t\tnew_password,\n\t\t\tverify_password,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<div class=\"session-item\">\n\t\t<div class=\"session-item-info\">\n\t\t\t<strong>{{ session.agent }}</strong>\n\n\t\t\t<a :href=\"'https://ipinfo.io/' + session.ip\" target=\"_blank\" rel=\"noopener\">\n\t\t\t\t{{ session.ip }}\n\t\t\t</a>\n\n\t\t\t<p v-if=\"session.active > 1\" class=\"session-usage\">\n\t\t\t\tActive in {{ session.active }} browsers\n\t\t\t</p>\n\t\t\t<p v-else-if=\"!session.current && !session.active\" class=\"session-usage\">\n\t\t\t\tLast used on <time>{{ lastUse }} </time>\n\t\t\t</p>\n\t\t</div>\n\t\t<div class=\"session-item-btn\">\n\t\t\t<button class=\"btn\" @click.prevent=\"signOut\">\n\t\t\t\t<template v-if=\"session.current\">Sign out</template>\n\t\t\t\t<template v-else>Revoke</template>\n\t\t\t</button>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.session-list .session-item {\n\tdisplay: flex;\n\tfont-size: 14px;\n}\n\n.session-list .session-item-info {\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex-grow: 1;\n}\n\n.session-list .session-item-btn {\n\tflex-shrink: 0;\n}\n\n.session-list .session-usage {\n\tfont-style: italic;\n\tcolor: var(--body-color-muted);\n}\n</style>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, PropType} from \"vue\";\nimport localetime from \"../js/helpers/localetime\";\nimport Auth from \"../js/auth\";\nimport socket from \"../js/socket\";\nimport {ClientSession} from \"../js/store\";\n\nexport default defineComponent({\n\tname: \"Session\",\n\tprops: {\n\t\tsession: {\n\t\t\ttype: Object as PropType<ClientSession>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst lastUse = computed(() => {\n\t\t\treturn localetime(props.session.lastUse);\n\t\t});\n\n\t\tconst signOut = () => {\n\t\t\tif (!props.session.current) {\n\t\t\t\tsocket.emit(\"sign-out\", props.session.token);\n\t\t\t} else {\n\t\t\t\tsocket.emit(\"sign-out\");\n\t\t\t\tAuth.signout();\n\t\t\t}\n\t\t};\n\n\t\treturn {\n\t\t\tlastUse,\n\t\t\tsignOut,\n\t\t};\n\t},\n});\n</script>\n","// This is a thin wrapper around `window.location`, in order to contain the\n// side-effects. Do not add logic to it as it cannot be tested, only mocked.\nexport default {\n\treload() {\n\t\twindow.location.reload();\n\t},\n};\n","import storage from \"./localStorage\";\nimport location from \"./location\";\n\nexport default class Auth {\n\tstatic signout() {\n\t\tstorage.clear();\n\t\tlocation.reload();\n\t}\n}\n","import { render } from \"./Session.vue?vue&type=template&id=079a21f1&ts=true\"\nimport script from \"./Session.vue?vue&type=script&lang=ts\"\nexport * from \"./Session.vue?vue&type=script&lang=ts\"\n\nimport \"./Session.vue?vue&type=style&index=0&id=079a21f1&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Account.vue?vue&type=template&id=f0edddd0&ts=true\"\nimport script from \"./Account.vue?vue&type=script&lang=ts\"\nexport * from \"./Account.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div>\n\t\t<template v-if=\"!store.state.serverConfiguration?.public\">\n\t\t\t<h2>Push Notifications</h2>\n\t\t\t<div>\n\t\t\t\t<button\n\t\t\t\t\tid=\"pushNotifications\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"btn\"\n\t\t\t\t\t:disabled=\"\n\t\t\t\t\t\tstore.state.pushNotificationState !== 'supported' &&\n\t\t\t\t\t\tstore.state.pushNotificationState !== 'subscribed'\n\t\t\t\t\t\"\n\t\t\t\t\t@click=\"onPushButtonClick\"\n\t\t\t\t>\n\t\t\t\t\t<template v-if=\"store.state.pushNotificationState === 'subscribed'\">\n\t\t\t\t\t\tUnsubscribe from push notifications\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-else-if=\"store.state.pushNotificationState === 'loading'\">\n\t\t\t\t\t\tLoading…\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-else> Subscribe to push notifications </template>\n\t\t\t\t</button>\n\t\t\t\t<div v-if=\"store.state.pushNotificationState === 'nohttps'\" class=\"error\">\n\t\t\t\t\t<strong>Warning</strong>: Push notifications are only supported over HTTPS\n\t\t\t\t\tconnections.\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"store.state.pushNotificationState === 'unsupported'\" class=\"error\">\n\t\t\t\t\t<strong>Warning</strong>:\n\t\t\t\t\t<span>Push notifications are not supported by your browser.</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<h2>Browser Notifications</h2>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\tid=\"desktopNotifications\"\n\t\t\t\t\t:checked=\"store.state.settings.desktopNotifications\"\n\t\t\t\t\t:disabled=\"store.state.desktopNotificationState === 'nohttps'\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"desktopNotifications\"\n\t\t\t\t/>\n\t\t\t\tEnable browser notifications<br />\n\t\t\t\t<div v-if=\"store.state.desktopNotificationState === 'unsupported'\" class=\"error\">\n\t\t\t\t\t<strong>Warning</strong>: Notifications are not supported by your browser.\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"store.state.desktopNotificationState === 'nohttps'\"\n\t\t\t\t\tid=\"warnBlockedDesktopNotifications\"\n\t\t\t\t\tclass=\"error\"\n\t\t\t\t>\n\t\t\t\t\t<strong>Warning</strong>: Notifications are only supported over HTTPS\n\t\t\t\t\tconnections.\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"store.state.desktopNotificationState === 'blocked'\"\n\t\t\t\t\tid=\"warnBlockedDesktopNotifications\"\n\t\t\t\t\tclass=\"error\"\n\t\t\t\t>\n\t\t\t\t\t<strong>Warning</strong>: Notifications are blocked by your browser.\n\t\t\t\t</div>\n\t\t\t</label>\n\t\t</div>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.notification\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"notification\"\n\t\t\t\t/>\n\t\t\t\tEnable notification sound\n\t\t\t</label>\n\t\t</div>\n\t\t<div>\n\t\t\t<div class=\"opt\">\n\t\t\t\t<button id=\"play\" @click.prevent=\"playNotification\">Play sound</button>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.notifyAllMessages\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"notifyAllMessages\"\n\t\t\t\t/>\n\t\t\t\tEnable notification for all messages\n\t\t\t</label>\n\t\t</div>\n\n\t\t<div v-if=\"!store.state.serverConfiguration?.public\">\n\t\t\t<label class=\"opt\">\n\t\t\t\t<label for=\"highlights\" class=\"opt\">\n\t\t\t\t\tCustom highlights\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\taria-label=\"If a message contains any of these comma-separated\nexpressions, it will trigger a highlight.\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"highlights\"\n\t\t\t\t\t:value=\"store.state.settings.highlights\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tname=\"highlights\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\tplaceholder=\"Comma-separated, e.g.: word, some more words, anotherword\"\n\t\t\t\t/>\n\t\t\t</label>\n\t\t</div>\n\n\t\t<div v-if=\"!store.state.serverConfiguration?.public\">\n\t\t\t<label class=\"opt\">\n\t\t\t\t<label for=\"highlightExceptions\" class=\"opt\">\n\t\t\t\t\tHighlight exceptions\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\taria-label=\"If a message contains any of these comma-separated\nexpressions, it will not trigger a highlight even if it contains\nyour nickname or expressions defined in custom highlights.\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"highlightExceptions\"\n\t\t\t\t\t:value=\"store.state.settings.highlightExceptions\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tname=\"highlightExceptions\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\tplaceholder=\"Comma-separated, e.g.: word, some more words, anotherword\"\n\t\t\t\t/>\n\t\t\t</label>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {computed, defineComponent} from \"vue\";\nimport {useStore} from \"../../js/store\";\nimport webpush from \"../../js/webpush\";\n\nexport default defineComponent({\n\tname: \"NotificationSettings\",\n\tsetup() {\n\t\tconst store = useStore();\n\n\t\tconst isIOS = computed(\n\t\t\t() =>\n\t\t\t\t[\n\t\t\t\t\t\"iPad Simulator\",\n\t\t\t\t\t\"iPhone Simulator\",\n\t\t\t\t\t\"iPod Simulator\",\n\t\t\t\t\t\"iPad\",\n\t\t\t\t\t\"iPhone\",\n\t\t\t\t\t\"iPod\",\n\t\t\t\t].includes(navigator.platform) ||\n\t\t\t\t// iPad on iOS 13 detection\n\t\t\t\t(navigator.userAgent.includes(\"Mac\") && \"ontouchend\" in document)\n\t\t);\n\n\t\tconst playNotification = () => {\n\t\t\tconst pop = new Audio();\n\t\t\tpop.src = \"audio/pop.wav\";\n\n\t\t\t// eslint-disable-next-line\n\t\t\tpop.play();\n\t\t};\n\n\t\tconst onPushButtonClick = () => {\n\t\t\twebpush.togglePushSubscription();\n\t\t};\n\n\t\treturn {\n\t\t\tisIOS,\n\t\t\tstore,\n\t\t\tplayNotification,\n\t\t\tonPushButtonClick,\n\t\t};\n\t},\n});\n</script>\n","import socket from \"./socket\";\nimport {store} from \"./store\";\n\nexport default {togglePushSubscription};\n\nsocket.once(\"push:issubscribed\", function (hasSubscriptionOnServer) {\n\tif (!isAllowedServiceWorkersHost()) {\n\t\tstore.commit(\"pushNotificationState\", \"nohttps\");\n\t\treturn;\n\t}\n\n\tif (!(\"serviceWorker\" in navigator)) {\n\t\treturn;\n\t}\n\n\tnavigator.serviceWorker\n\t\t.register(\"service-worker.js\")\n\t\t.then((registration) => {\n\t\t\tstore.commit(\"hasServiceWorker\");\n\n\t\t\tif (!registration.pushManager) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn registration.pushManager.getSubscription().then((subscription) => {\n\t\t\t\t// If client has push registration but the server knows nothing about it,\n\t\t\t\t// this subscription is broken and client has to register again\n\t\t\t\tif (subscription && hasSubscriptionOnServer === false) {\n\t\t\t\t\tvoid subscription.unsubscribe().then((successful) => {\n\t\t\t\t\t\tstore.commit(\n\t\t\t\t\t\t\t\"pushNotificationState\",\n\t\t\t\t\t\t\tsuccessful ? \"supported\" : \"unsupported\"\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tstore.commit(\n\t\t\t\t\t\t\"pushNotificationState\",\n\t\t\t\t\t\tsubscription ? \"subscribed\" : \"supported\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t})\n\t\t.catch((err) => {\n\t\t\tstore.commit(\"pushNotificationState\", \"unsupported\");\n\t\t\tconsole.error(err); // eslint-disable-line no-console\n\t\t});\n});\n\nfunction togglePushSubscription() {\n\tstore.commit(\"pushNotificationState\", \"loading\");\n\n\tnavigator.serviceWorker.ready\n\t\t.then((registration) =>\n\t\t\tregistration.pushManager.getSubscription().then((existingSubscription) => {\n\t\t\t\tif (existingSubscription) {\n\t\t\t\t\tsocket.emit(\"push:unregister\");\n\n\t\t\t\t\treturn existingSubscription.unsubscribe().then((successful) => {\n\t\t\t\t\t\tstore.commit(\n\t\t\t\t\t\t\t\"pushNotificationState\",\n\t\t\t\t\t\t\tsuccessful ? \"supported\" : \"unsupported\"\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn registration.pushManager\n\t\t\t\t\t.subscribe({\n\t\t\t\t\t\tapplicationServerKey: store.state.serverConfiguration?.applicationServerKey,\n\t\t\t\t\t\tuserVisibleOnly: true,\n\t\t\t\t\t})\n\t\t\t\t\t.then((subscription) => {\n\t\t\t\t\t\tsocket.emit(\"push:register\", subscription.toJSON());\n\t\t\t\t\t\tstore.commit(\"pushNotificationState\", \"subscribed\");\n\t\t\t\t\t\tstore.commit(\"refreshDesktopNotificationState\");\n\t\t\t\t\t});\n\t\t\t})\n\t\t)\n\t\t.catch((err) => {\n\t\t\tstore.commit(\"pushNotificationState\", \"unsupported\");\n\t\t\tstore.commit(\"refreshDesktopNotificationState\");\n\t\t\tconsole.error(err); // eslint-disable-line no-console\n\t\t});\n}\n\nfunction isAllowedServiceWorkersHost() {\n\treturn (\n\t\tlocation.protocol === \"https:\" ||\n\t\tlocation.hostname === \"localhost\" ||\n\t\tlocation.hostname === \"127.0.0.1\"\n\t);\n}\n","import { render } from \"./Notifications.vue?vue&type=template&id=1d0bfea8&ts=true\"\nimport script from \"./Notifications.vue?vue&type=script&lang=ts\"\nexport * from \"./Notifications.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import constants from \"./constants\";\n\nimport {createRouter, createWebHashHistory, type RouteParamsRawGeneric} from \"vue-router\";\nimport SignIn from \"../components/Windows/SignIn.vue\";\nimport Connect from \"../components/Windows/Connect.vue\";\nimport Settings from \"../components/Windows/Settings.vue\";\nimport Help from \"../components/Windows/Help.vue\";\nimport Changelog from \"../components/Windows/Changelog.vue\";\nimport NetworkEdit from \"../components/Windows/NetworkEdit.vue\";\nimport SearchResults from \"../components/Windows/SearchResults.vue\";\nimport RoutedChat from \"../components/RoutedChat.vue\";\nimport {store} from \"./store\";\n\nimport AppearanceSettings from \"../components/Settings/Appearance.vue\";\nimport GeneralSettings from \"../components/Settings/General.vue\";\nimport AccountSettings from \"../components/Settings/Account.vue\";\nimport NotificationSettings from \"../components/Settings/Notifications.vue\";\nimport {ClientChan} from \"./types\";\n\nconst router = createRouter({\n\thistory: createWebHashHistory(),\n\troutes: [\n\t\t{\n\t\t\tname: \"SignIn\",\n\t\t\tpath: \"/sign-in\",\n\t\t\tcomponent: SignIn,\n\t\t\tbeforeEnter(to, from, next) {\n\t\t\t\t// Prevent navigating to sign-in when already signed in\n\t\t\t\tif (store.state.appLoaded) {\n\t\t\t\t\tnext(false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tnext();\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Connect\",\n\t\t\tpath: \"/connect\",\n\t\t\tcomponent: Connect,\n\t\t\tprops: (route) => ({queryParams: route.query}),\n\t\t},\n\t\t{\n\t\t\tpath: \"/settings\",\n\t\t\tcomponent: Settings,\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tname: \"General\",\n\t\t\t\t\tpath: \"\",\n\t\t\t\t\tcomponent: GeneralSettings,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"Appearance\",\n\t\t\t\t\tpath: \"appearance\",\n\t\t\t\t\tcomponent: AppearanceSettings,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"Account\",\n\t\t\t\t\tpath: \"account\",\n\t\t\t\t\tcomponent: AccountSettings,\n\t\t\t\t\tprops: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"Notifications\",\n\t\t\t\t\tpath: \"notifications\",\n\t\t\t\t\tcomponent: NotificationSettings,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tname: \"Help\",\n\t\t\tpath: \"/help\",\n\t\t\tcomponent: Help,\n\t\t},\n\t\t{\n\t\t\tname: \"Changelog\",\n\t\t\tpath: \"/changelog\",\n\t\t\tcomponent: Changelog,\n\t\t},\n\t\t{\n\t\t\tname: \"NetworkEdit\",\n\t\t\tpath: \"/edit-network/:uuid\",\n\t\t\tcomponent: NetworkEdit,\n\t\t},\n\t\t{\n\t\t\tname: \"RoutedChat\",\n\t\t\tpath: \"/chan-:id\",\n\t\t\tcomponent: RoutedChat,\n\t\t},\n\t\t{\n\t\t\tname: \"SearchResults\",\n\t\t\tpath: \"/chan-:id/search\",\n\t\t\tcomponent: SearchResults,\n\t\t},\n\t],\n});\n\nrouter.beforeEach((to, from, next) => {\n\t// If user is not yet signed in, wait for appLoaded state to change\n\t// unless they are trying to open SignIn (which can be triggered in auth.js)\n\tif (!store.state.appLoaded && to.name !== \"SignIn\") {\n\t\tstore.watch(\n\t\t\t(state) => state.appLoaded,\n\t\t\t() => next()\n\t\t);\n\n\t\treturn;\n\t}\n\n\tnext();\n});\n\nrouter.beforeEach((to) => {\n\t// Disallow navigating to non-existing routes\n\tif (!to.matched.length) {\n\t\treturn false;\n\t}\n\n\t// Disallow navigating to invalid channels\n\tif (to.name === \"RoutedChat\" && !store.getters.findChannel(Number(to.params.id))) {\n\t\treturn false;\n\t}\n\n\t// Disallow navigating to invalid networks\n\tif (to.name === \"NetworkEdit\" && !store.getters.findNetwork(String(to.params.uuid))) {\n\t\treturn false;\n\t}\n\n\treturn true;\n});\n\nrouter.afterEach((to) => {\n\tif (store.state.appLoaded) {\n\t\tif (window.innerWidth <= constants.mobileViewportPixels) {\n\t\t\tstore.commit(\"sidebarOpen\", false);\n\t\t}\n\t}\n\n\tif (store.state.activeChannel) {\n\t\tconst channel = store.state.activeChannel.channel;\n\n\t\tif (to.name !== \"RoutedChat\") {\n\t\t\tstore.commit(\"activeChannel\", undefined);\n\t\t}\n\n\t\t// When switching out of a channel, mark everything as read\n\t\tif (channel.messages?.length > 0) {\n\t\t\tchannel.firstUnread = channel.messages[channel.messages.length - 1].id;\n\t\t}\n\n\t\tif (store.state.settings.searchEnabled && store.state.settings.enableEnhancedSearch) {\n\t\t\t// If Enhanced Search is enabled dont truncate messages\n\t\t\t// keep messages in memory for search/navigation purposes\n\t\t} else {\n\t\t\tif (channel.messages?.length > 100) {\n\t\t\t\tchannel.messages.splice(0, channel.messages.length - 100);\n\t\t\t\tchannel.moreHistoryAvailable = true;\n\t\t\t}\n\t\t}\n\t}\n});\n\nasync function navigate(\n\trouteName: string,\n\tparams: RouteParamsRawGeneric = {},\n\tquery: Record<string, string | number> = {}\n) {\n\tif (router.currentRoute.value.name) {\n\t\tawait router.push({name: routeName, params, query});\n\t} else {\n\t\t// If current route is null, replace the history entry\n\t\t// This prevents invalid entries from lingering in history,\n\t\t// and then the route guard preventing proper navigation\n\t\tawait router.replace({name: routeName, params, query}).catch(() => {});\n\t}\n}\n\nfunction switchToChannel(\n\tchannel: ClientChan,\n\tfocusedMessageId?: number,\n\tfocusedMessageTime?: number\n) {\n\tconst query: Record<string, number> = {};\n\n\tif (focusedMessageId) {\n\t\tquery.focused = focusedMessageId;\n\t}\n\n\tif (focusedMessageTime) {\n\t\tquery.focusedTime = focusedMessageTime;\n\t}\n\n\tvoid navigate(\"RoutedChat\", {id: channel.id}, query);\n}\n\nif (\"serviceWorker\" in navigator) {\n\tnavigator.serviceWorker.addEventListener(\"message\", (event) => {\n\t\tif (event.data && event.data.type === \"open\") {\n\t\t\tconst id = parseInt(event.data.channel.substring(5), 10); // remove \"chan-\" prefix\n\n\t\t\tconst channelTarget = store.getters.findChannel(id);\n\n\t\t\tif (channelTarget) {\n\t\t\t\tswitchToChannel(channelTarget.channel);\n\t\t\t}\n\t\t}\n\t});\n}\n\nexport {router, navigate, switchToChannel};\n","<template>\n\t<!-- TODO: move closed style to it's own class -->\n\t<div\n\t\tv-if=\"isChannelVisible\"\n\t\tref=\"element\"\n\t\t:class=\"[\n\t\t\t'channel-list-item',\n\t\t\t{active: active},\n\t\t\t{'parted-channel': channel.type === 'channel' && channel.state === 0},\n\t\t\t{'has-draft': channel.pendingMessage},\n\t\t\t{'has-unread': channel.unread},\n\t\t\t{'has-highlight': channel.highlight},\n\t\t\t{\n\t\t\t\t'not-secure':\n\t\t\t\t\tchannel.type === 'lobby' && network.status.connected && !network.status.secure,\n\t\t\t},\n\t\t\t{'not-connected': channel.type === 'lobby' && !network.status.connected},\n\t\t\t{'is-muted': channel.muted},\n\t\t]\"\n\t\t:aria-label=\"getAriaLabel()\"\n\t\t:title=\"getAriaLabel()\"\n\t\t:data-name=\"channel.name\"\n\t\t:data-type=\"channel.type\"\n\t\t:aria-controls=\"'#chan-' + channel.id\"\n\t\t:aria-selected=\"active\"\n\t\t:style=\"channel.closed ? {transition: 'none', opacity: 0.4} : undefined\"\n\t\trole=\"tab\"\n\t\t@click=\"click\"\n\t\t@contextmenu.prevent=\"openContextMenu\"\n\t>\n\t\t<slot :network=\"network\" :channel=\"channel\" :active-channel=\"activeChannel\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport eventbus from \"../js/eventbus\";\nimport isChannelCollapsed from \"../js/helpers/isChannelCollapsed\";\nimport {ClientNetwork, ClientChan} from \"../js/types\";\nimport {computed, defineComponent, PropType} from \"vue\";\nimport {useStore} from \"../js/store\";\nimport {switchToChannel} from \"../js/router\";\n\nexport default defineComponent({\n\tname: \"ChannelWrapper\",\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tchannel: {\n\t\t\ttype: Object as PropType<ClientChan>,\n\t\t\trequired: true,\n\t\t},\n\t\tactive: Boolean,\n\t\tisFiltering: Boolean,\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\t\tconst activeChannel = computed(() => store.state.activeChannel);\n\t\tconst isChannelVisible = computed(\n\t\t\t() => props.isFiltering || !isChannelCollapsed(props.network, props.channel)\n\t\t);\n\n\t\tconst getAriaLabel = () => {\n\t\t\tconst extra: string[] = [];\n\t\t\tconst type = props.channel.type;\n\n\t\t\tif (props.channel.unread > 0) {\n\t\t\t\tif (props.channel.unread > 1) {\n\t\t\t\t\textra.push(`${props.channel.unread} unread messages`);\n\t\t\t\t} else {\n\t\t\t\t\textra.push(`${props.channel.unread} unread message`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (props.channel.highlight > 0) {\n\t\t\t\tif (props.channel.highlight > 1) {\n\t\t\t\t\textra.push(`${props.channel.highlight} mentions`);\n\t\t\t\t} else {\n\t\t\t\t\textra.push(`${props.channel.highlight} mention`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn `${type}: ${props.channel.name} ${extra.length ? `(${extra.join(\", \")})` : \"\"}`;\n\t\t};\n\n\t\tconst click = () => {\n\t\t\tif (props.isFiltering) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tswitchToChannel(props.channel);\n\t\t};\n\n\t\tconst openContextMenu = (event: MouseEvent) => {\n\t\t\teventbus.emit(\"contextmenu:channel\", {\n\t\t\t\tevent: event,\n\t\t\t\tchannel: props.channel,\n\t\t\t\tnetwork: props.network,\n\t\t\t});\n\t\t};\n\n\t\treturn {\n\t\t\tactiveChannel,\n\t\t\tisChannelVisible,\n\t\t\tgetAriaLabel,\n\t\t\tclick,\n\t\t\topenContextMenu,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./ChannelWrapper.vue?vue&type=template&id=27b55c3c&ts=true\"\nimport script from \"./ChannelWrapper.vue?vue&type=script&lang=ts\"\nexport * from \"./ChannelWrapper.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./NetworkLobby.vue?vue&type=template&id=2fe27d7a&ts=true\"\nimport script from \"./NetworkLobby.vue?vue&type=script&lang=ts\"\nexport * from \"./NetworkLobby.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<!-- TODO: investigate -->\n\t<ChannelWrapper ref=\"wrapper\" v-bind=\"$props\">\n\t\t<span class=\"name\">{{ channel.name }}</span>\n\t\t<span\n\t\t\tv-if=\"\n\t\t\t\tchannel.unread &&\n\t\t\t\t(store.state.settings.disableMutedUnread !== true || !channel.muted)\n\t\t\t\"\n\t\t\t:class=\"{highlight: channel.highlight && !channel.muted}\"\n\t\t\tclass=\"badge\"\n\t\t\t>{{ unreadCount }}\n\t\t</span>\n\t\t<template v-if=\"channel.type === 'channel'\">\n\t\t\t<span\n\t\t\t\tv-if=\"channel.state === 0\"\n\t\t\t\tclass=\"parted-channel-tooltip tooltipped tooltipped-w\"\n\t\t\t\taria-label=\"Not currently joined\"\n\t\t\t>\n\t\t\t\t<span class=\"parted-channel-icon\" />\n\t\t\t</span>\n\t\t\t<span class=\"close-tooltip tooltipped tooltipped-w\" aria-label=\"Leave\">\n\t\t\t\t<button class=\"close\" aria-label=\"Leave\" @click.stop=\"close\" />\n\t\t\t</span>\n\t\t</template>\n\t\t<template v-else>\n\t\t\t<span class=\"close-tooltip tooltipped tooltipped-w\" aria-label=\"Close\">\n\t\t\t\t<button class=\"close\" aria-label=\"Close\" @click.stop=\"close\" />\n\t\t\t</span>\n\t\t</template>\n\t</ChannelWrapper>\n</template>\n\n<script lang=\"ts\">\nimport {PropType, defineComponent, computed} from \"vue\";\nimport roundBadgeNumber from \"../js/helpers/roundBadgeNumber\";\nimport useCloseChannel from \"../js/hooks/use-close-channel\";\nimport {ClientChan, ClientNetwork} from \"../js/types\";\nimport ChannelWrapper from \"./ChannelWrapper.vue\";\nimport {useStore} from \"../js/store\";\n\nexport default defineComponent({\n\tname: \"Channel\",\n\tcomponents: {\n\t\tChannelWrapper,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tchannel: {\n\t\t\ttype: Object as PropType<ClientChan>,\n\t\t\trequired: true,\n\t\t},\n\t\tactive: Boolean,\n\t\tisFiltering: Boolean,\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\t\tconst unreadCount = computed(() => roundBadgeNumber(props.channel.unread));\n\t\tconst close = useCloseChannel(props.channel);\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tunreadCount,\n\t\t\tclose,\n\t\t};\n\t},\n});\n</script>\n","import eventbus from \"../eventbus\";\nimport socket from \"../socket\";\nimport {ClientChan} from \"../types\";\nimport {ChanType} from \"../../../shared/types/chan\";\n\nexport default function useCloseChannel(channel: ClientChan) {\n\treturn () => {\n\t\tif (channel.type === ChanType.LOBBY) {\n\t\t\teventbus.emit(\n\t\t\t\t\"confirm-dialog\",\n\t\t\t\t{\n\t\t\t\t\ttitle: \"Remove network\",\n\t\t\t\t\ttext: `Are you sure you want to quit and remove ${channel.name}? This cannot be undone.`,\n\t\t\t\t\tbutton: \"Remove network\",\n\t\t\t\t},\n\t\t\t\t(result: boolean) => {\n\t\t\t\t\tif (!result) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tchannel.closed = true;\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: Number(channel.id),\n\t\t\t\t\t\ttext: \"/quit\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t);\n\n\t\t\treturn;\n\t\t}\n\n\t\tchannel.closed = true;\n\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: Number(channel.id),\n\t\t\ttext: \"/close\",\n\t\t});\n\t};\n}\n","import { render } from \"./Channel.vue?vue&type=template&id=b4fac96a&ts=true\"\nimport script from \"./Channel.vue?vue&type=script&lang=ts\"\nexport * from \"./Channel.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<form\n\t\t:id=\"'join-channel-' + channel.id\"\n\t\tclass=\"join-form\"\n\t\tmethod=\"post\"\n\t\taction=\"\"\n\t\tautocomplete=\"off\"\n\t\t@keydown.esc.prevent=\"$emit('toggle-join-channel')\"\n\t\t@submit.prevent=\"onSubmit\"\n\t>\n\t\t<input\n\t\t\tv-model=\"inputChannel\"\n\t\t\tv-focus\n\t\t\ttype=\"text\"\n\t\t\tclass=\"input\"\n\t\t\tname=\"channel\"\n\t\t\tplaceholder=\"Channel\"\n\t\t\tpattern=\"[^\\s]+\"\n\t\t\tmaxlength=\"200\"\n\t\t\ttitle=\"The channel name may not contain spaces\"\n\t\t\trequired\n\t\t/>\n\t\t<input\n\t\t\tv-model=\"inputPassword\"\n\t\t\ttype=\"password\"\n\t\t\tclass=\"input\"\n\t\t\tname=\"key\"\n\t\t\tplaceholder=\"Password (optional)\"\n\t\t\tpattern=\"[^\\s]+\"\n\t\t\tmaxlength=\"200\"\n\t\t\ttitle=\"The channel password may not contain spaces\"\n\t\t\tautocomplete=\"new-password\"\n\t\t/>\n\t\t<button type=\"submit\" class=\"btn btn-small\">Join</button>\n\t</form>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType, ref} from \"vue\";\nimport {switchToChannel} from \"../js/router\";\nimport socket from \"../js/socket\";\nimport {useStore} from \"../js/store\";\nimport {ClientNetwork, ClientChan} from \"../js/types\";\n\nexport default defineComponent({\n\tname: \"JoinChannel\",\n\tdirectives: {\n\t\tfocus: {\n\t\t\tmounted: (el: HTMLFormElement) => el.focus(),\n\t\t},\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\temits: [\"toggle-join-channel\"],\n\tsetup(props, {emit}) {\n\t\tconst store = useStore();\n\t\tconst inputChannel = ref(\"\");\n\t\tconst inputPassword = ref(\"\");\n\n\t\tconst onSubmit = () => {\n\t\t\tconst existingChannel = store.getters.findChannelOnCurrentNetwork(inputChannel.value);\n\n\t\t\tif (existingChannel) {\n\t\t\t\tswitchToChannel(existingChannel);\n\t\t\t} else {\n\t\t\t\tconst chanTypes = props.network.serverOptions.CHANTYPES;\n\t\t\t\tlet channel = inputChannel.value;\n\n\t\t\t\tif (chanTypes && chanTypes.length > 0 && !chanTypes.includes(channel[0])) {\n\t\t\t\t\tchannel = chanTypes[0] + channel;\n\t\t\t\t}\n\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttext: `/join ${channel} ${inputPassword.value}`,\n\t\t\t\t\ttarget: props.channel.id,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tinputChannel.value = \"\";\n\t\t\tinputPassword.value = \"\";\n\t\t\temit(\"toggle-join-channel\");\n\t\t};\n\n\t\treturn {\n\t\t\tinputChannel,\n\t\t\tinputPassword,\n\t\t\tonSubmit,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./JoinChannel.vue?vue&type=template&id=310e4234&ts=true\"\nimport script from \"./JoinChannel.vue?vue&type=script&lang=ts\"\nexport * from \"./JoinChannel.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div\n\t\tv-if=\"\n\t\t\t(queries.length > 0 && !network.isCollapsed) ||\n\t\t\t(network.isCollapsed && (hasUnread || hasActiveQuery))\n\t\t\"\n\t\tclass=\"dm-section\"\n\t\t:class=\"{collapsed: isCollapsed}\"\n\t>\n\t\t<div\n\t\t\tclass=\"channel-list-item dm-section-header\"\n\t\t\t:class=\"hasUnread ? 'has-unread has-highlight' : ''\"\n\t\t\t:title=\"'Total Queries: ' + queries.length + ' - Total Unread: ' + totalUnreadCount\"\n\t\t\t@click.stop=\"toggleCollapsed\"\n\t\t>\n\t\t\t<span class=\"dm-collapse-icon\" :class=\"{'is-collapsed': isCollapsed}\"></span>\n\t\t\t<span class=\"dm-section-title\">Direct Messages</span>\n\t\t\t<span v-if=\"hasUnread\" class=\"dm-unread-badge highlight badge\">{{\n\t\t\t\ttotalUnreadCount\n\t\t\t}}</span>\n\t\t</div>\n\n\t\t<template v-if=\"!isCollapsed || hasActiveQuery || hasUnread\">\n\t\t\t<div\n\t\t\t\tv-if=\"queries.length > 2 && store.state.settings.filterdmsEnabled && !isCollapsed\"\n\t\t\t\tclass=\"dm-filter\"\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\tref=\"filterInput\"\n\t\t\t\t\tv-model=\"filterText\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tplaceholder=\"Filter DMs...\"\n\t\t\t\t\tclass=\"dm-filter-input input\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<Draggable\n\t\t\t\t:list=\"sortedQueries\"\n\t\t\t\t:delay=\"500\"\n\t\t\t\t:delay-on-touch-only=\"true\"\n\t\t\t\t:touch-start-threshold=\"10\"\n\t\t\t\tdraggable=\".dm-channel-wrapper\"\n\t\t\t\tghost-class=\"ui-sortable-ghost\"\n\t\t\t\tdrag-class=\"ui-sortable-dragging\"\n\t\t\t\t:group=\"uuid\"\n\t\t\t\tclass=\"dm-list\"\n\t\t\t\titem-key=\"id\"\n\t\t\t\t@change=\"onDMSort\"\n\t\t\t>\n\t\t\t\t<template v-slot:item=\"{element: channel}\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"shouldShowChannel(channel)\"\n\t\t\t\t\t\tclass=\"dm-channel-wrapper\"\n\t\t\t\t\t\t:class=\"{'is-pinned': channel.pinned}\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Channel\n\t\t\t\t\t\t\t:key=\"channel.id\"\n\t\t\t\t\t\t\t:data-item=\"channel.id\"\n\t\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t:active=\"\n\t\t\t\t\t\t\t\tstore.state.activeChannel &&\n\t\t\t\t\t\t\t\tchannel === store.state.activeChannel.channel\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t</Draggable>\n\n\t\t\t<div\n\t\t\t\tv-if=\"hasHiddenChannels\"\n\t\t\t\tclass=\"channel-list-item dm-show-more\"\n\t\t\t\t@click=\"showAll = !showAll\"\n\t\t\t>\n\t\t\t\t{{ showAll ? \"Show less\" : `Show ${hiddenCount} more...` }}\n\t\t\t</div>\n\t\t</template>\n\t</div>\n</template>\n\n<style scoped>\n.dm-section {\n\tmargin-top: 4px;\n}\n\n.dm-section-header {\n\tcolor: rgb(255 255 255 / 70%);\n\tuser-select: none;\n}\n\n.dm-collapse-icon {\n\tfont-family: FontAwesome;\n\tmargin: 0 11px 0 2px;\n\tfont-size: initial;\n\twidth: 12px;\n\topacity: 0.8;\n\ttransition: transform 0.2s ease;\n}\n\n.dm-collapse-icon::before {\n\tcontent: \"\\f0d7\"; /* caret-down */\n}\n\n.dm-collapse-icon.is-collapsed::before {\n\tcontent: \"\\f0da\"; /* caret-right */\n}\n\n.dm-section-header:hover .dm-collapse-icon {\n\topacity: 1;\n}\n\n.dm-section-title {\n\tflex-grow: 1;\n\tmargin-right: 5px;\n\toverflow: hidden;\n\tposition: relative;\n\twhite-space: nowrap;\n\tfont-size: 14px;\n\tfont-weight: 700;\n\ttext-transform: capitalize;\n\tmask-image: linear-gradient(270deg, #0000, #000 20px);\n}\n\n.dm-filter {\n\tmargin: 8px;\n\tposition: relative;\n\n\t&::before {\n\t\tbottom: 0;\n\t\tcolor: rgb(255 255 255 / 34.9%);\n\t\tcontent: \"\\f0b0\";\n\t\tfont-family: FontAwesome;\n\t\tline-height: 35px !important;\n\t\tpointer-events: none;\n\t\tposition: absolute;\n\t\tright: 8px;\n\t\ttop: 0;\n\t}\n}\n\n.dm-filter-input {\n\tappearance: none;\n\tbackground-color: rgb(255 255 255 / 10.2%);\n\tborder: 0;\n\tcolor: rgb(255 255 255);\n\tmargin: 0;\n\tpadding-right: 35px;\n\twidth: 100%;\n}\n\n.dm-filter-input::placeholder {\n\tcolor: rgb(255 255 255 / 35%);\n}\n\n.dm-filter-input:focus {\n\toutline: none;\n\tbackground-color: rgb(255 255 255 / 15%);\n}\n\n.dm-list {\n\t/* Inherit channel list styling */\n}\n\n.dm-show-more {\n\tcolor: rgb(255 255 255 / 50%);\n\tfont-size: 0.85em;\n\tjustify-content: center;\n}\n\n/* DM channel wrapper for pinned indicator */\n.dm-channel-wrapper {\n\tposition: relative;\n}\n\n.dm-channel-wrapper.is-pinned :deep(.channel-list-item:not(.has-draft:not(.active))) {\n\tpadding: 8px 14px;\n\n\t/* Pinned indicator, replace message icon */\n\t&::before {\n\t\tcontent: \"\\f08d\";\n\t\trotate: 45deg;\n\t\ttransform: translate(2px, 2px);\n\t}\n}\n</style>\n\n<script lang=\"ts\">\nimport storage from \"../js/localStorage\";\nimport {computed, defineComponent, PropType, ref} from \"vue\";\nimport {filter as fuzzyFilter} from \"fuzzy\";\nimport Draggable from \"./Draggable.vue\";\nimport Channel from \"./Channel.vue\";\nimport socket from \"../js/socket\";\nimport {ClientChan, ClientNetwork} from \"../js/types\";\nimport {useStore} from \"../js/store\";\nimport roundBadgeNumber from \"../js/helpers/roundBadgeNumber\";\n\nexport default defineComponent({\n\tname: \"DirectMessageSection\",\n\tcomponents: {\n\t\tDraggable,\n\t\tChannel,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tqueries: {\n\t\t\ttype: Array as PropType<ClientChan[]>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst uuid = props.network.uuid + \"-dms\";\n\t\tconst PERSISTENT_STORAGE = \"thelounge.directMessages.collapsed\";\n\n\t\tconst getIsCollapsed = () => {\n\t\t\tconst stored = storage.get(PERSISTENT_STORAGE);\n\t\t\tconst directMessages = stored ? new Set(JSON.parse(stored)) : new Set();\n\n\t\t\treturn directMessages.has(uuid);\n\t\t};\n\n\t\tconst store = useStore();\n\t\tconst isCollapsed = ref(getIsCollapsed());\n\t\tconst filterText = ref(\"\");\n\t\tconst showAll = ref(false);\n\t\tconst maxVisible = computed(() =>\n\t\t\tstore.state.settings.showAllDMs ? Number.MAX_SAFE_INTEGER : 5\n\t\t);\n\n\t\tconst hasActiveQuery = computed(() => {\n\t\t\treturn (\n\t\t\t\tprops.queries.find((q) => q.id === store.state.activeChannel?.channel.id) !==\n\t\t\t\tundefined\n\t\t\t);\n\t\t});\n\n\t\t// Count of unique conversations with unread messages (not total lines)\n\t\t// Skip muted channels - they shouldn't contribute to the unread badge\n\t\tconst hasUnread = computed(() => {\n\t\t\treturn props.queries.filter((q) => q.unread > 0 && !q.muted).length > 0;\n\t\t});\n\t\tconst totalUnreadCount = computed(() => {\n\t\t\treturn roundBadgeNumber(props.queries.filter((q) => q.unread > 0 && !q.muted).length);\n\t\t});\n\n\t\tconst filteredQueries = computed(() => {\n\t\t\tif (!filterText.value) {\n\t\t\t\treturn props.queries;\n\t\t\t}\n\n\t\t\tconst results = fuzzyFilter(filterText.value, props.queries, {\n\t\t\t\textract: (q) => q.name,\n\t\t\t});\n\n\t\t\treturn results.map((r) => r.original);\n\t\t});\n\n\t\tconst sortedQueries = computed(() => {\n\t\t\tconst queries = [...filteredQueries.value];\n\n\t\t\t// Sort: pinned first, then by unread, then by name\n\t\t\treturn queries.sort((a, b) => {\n\t\t\t\t// Pinned always first\n\t\t\t\tif (a.pinned && !b.pinned) return -1;\n\t\t\t\tif (!a.pinned && b.pinned) return 1;\n\n\t\t\t\t// Then by unread status\n\t\t\t\tif (a.unread > 0 && b.unread === 0) return -1;\n\t\t\t\tif (a.unread === 0 && b.unread > 0) return 1;\n\n\t\t\t\t// Then alphabetically\n\t\t\t\treturn a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n\t\t\t});\n\t\t});\n\n\t\tconst visibleQueries = computed(() => {\n\t\t\tif (showAll.value || filterText.value) {\n\t\t\t\treturn sortedQueries.value;\n\t\t\t}\n\n\t\t\t// Always show pinned + unread + up to maxVisible\n\t\t\tconst pinned = sortedQueries.value.filter((q) => q.pinned);\n\t\t\tconst unread = sortedQueries.value.filter((q) => !q.pinned && q.unread > 0);\n\t\t\tconst rest = sortedQueries.value.filter((q) => !q.pinned && q.unread === 0);\n\n\t\t\tconst remaining = maxVisible.value - pinned.length - unread.length;\n\n\t\t\tif (remaining <= 0) {\n\t\t\t\treturn [...pinned, ...unread];\n\t\t\t}\n\n\t\t\treturn [...pinned, ...unread, ...rest.slice(0, remaining)];\n\t\t});\n\n\t\tconst hiddenCount = computed(() => {\n\t\t\treturn sortedQueries.value.length - visibleQueries.value.length;\n\t\t});\n\n\t\tconst hasHiddenChannels = computed(() => {\n\t\t\treturn hiddenCount.value > 0 && !filterText.value;\n\t\t});\n\n\t\tconst shouldShowChannel = (channel: ClientChan) => {\n\t\t\tif (isCollapsed.value && channel.highlight) return true;\n\t\t\tif (isCollapsed.value && !channel.highlight) return false;\n\n\t\t\treturn visibleQueries.value.includes(channel);\n\t\t};\n\n\t\tconst toggleCollapsed = () => {\n\t\t\tisCollapsed.value = !isCollapsed.value;\n\n\t\t\tconst stored = storage.get(PERSISTENT_STORAGE);\n\t\t\tconst directMessages = stored ? new Set(JSON.parse(stored)) : new Set();\n\n\t\t\tif (isCollapsed.value) {\n\t\t\t\tdirectMessages.add(uuid);\n\t\t\t} else {\n\t\t\t\tdirectMessages.delete(uuid);\n\t\t\t}\n\n\t\t\tstorage.set(PERSISTENT_STORAGE, JSON.stringify([...directMessages]));\n\t\t};\n\n\t\tconst onDMSort = (e: {oldIndex?: number; newIndex?: number}) => {\n\t\t\tconst {oldIndex, newIndex} = e;\n\n\t\t\tif (oldIndex === undefined || newIndex === undefined || oldIndex === newIndex) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Emit sort event to server\n\t\t\tsocket.emit(\"sort:channels\", {\n\t\t\t\tnetwork: props.network.uuid,\n\t\t\t\torder: props.network.channels.map((c) => c.id),\n\t\t\t});\n\t\t};\n\n\t\treturn {\n\t\t\tuuid,\n\t\t\tstore,\n\t\t\tisCollapsed,\n\t\t\tfilterText,\n\t\t\tshowAll,\n\t\t\thasUnread,\n\t\t\ttotalUnreadCount,\n\t\t\tsortedQueries,\n\t\t\thiddenCount,\n\t\t\thasActiveQuery,\n\t\t\thasHiddenChannels,\n\t\t\tshouldShowChannel,\n\t\t\ttoggleCollapsed,\n\t\t\tonDMSort,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./DirectMessageSection.vue?vue&type=template&id=e4cbcea8&scoped=true&ts=true\"\nimport script from \"./DirectMessageSection.vue?vue&type=script&lang=ts\"\nexport * from \"./DirectMessageSection.vue?vue&type=script&lang=ts\"\n\nimport \"./DirectMessageSection.vue?vue&type=style&index=0&id=e4cbcea8&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-e4cbcea8\"]])\n\nexport default __exports__","function distance([x1, y1]: [number, number], [x2, y2]: [number, number]) {\n\treturn Math.hypot(x1 - x2, y1 - y2);\n}\n\nexport default distance;\n","import { render } from \"./NetworkList.vue?vue&type=template&id=4376ebeb&ts=true\"\nimport script from \"./NetworkList.vue?vue&type=script&lang=ts\"\nexport * from \"./NetworkList.vue?vue&type=script&lang=ts\"\n\nimport \"./NetworkList.vue?vue&type=style&index=0&id=4376ebeb&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Sidebar.vue?vue&type=template&id=c75840d6&ts=true\"\nimport script from \"./Sidebar.vue?vue&type=script&lang=ts\"\nexport * from \"./Sidebar.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div\n\t\tid=\"image-viewer\"\n\t\tref=\"viewer\"\n\t\t:class=\"{opened: link !== null}\"\n\t\t@wheel=\"onMouseWheel\"\n\t\t@touchstart.passive=\"onTouchStart\"\n\t\t@click=\"onClick\"\n\t>\n\t\t<template v-if=\"link !== null\">\n\t\t\t<button class=\"close-btn\" aria-label=\"Close\"></button>\n\n\t\t\t<button\n\t\t\t\tv-if=\"previousImage\"\n\t\t\t\tclass=\"previous-image-btn\"\n\t\t\t\taria-label=\"Previous image\"\n\t\t\t\t@click.stop=\"previous\"\n\t\t\t></button>\n\t\t\t<button\n\t\t\t\tv-if=\"nextImage\"\n\t\t\t\tclass=\"next-image-btn\"\n\t\t\t\taria-label=\"Next image\"\n\t\t\t\t@click.stop=\"next\"\n\t\t\t></button>\n\n\t\t\t<a class=\"open-btn\" :href=\"link.link\" target=\"_blank\" rel=\"noopener\"></a>\n\n\t\t\t<img\n\t\t\t\tref=\"image\"\n\t\t\t\t:src=\"link.thumb\"\n\t\t\t\talt=\"\"\n\t\t\t\t:style=\"computeImageStyles\"\n\t\t\t\t@load=\"onImageLoad\"\n\t\t\t\t@mousedown=\"onImageMouseDown\"\n\t\t\t\t@touchstart.passive=\"onImageTouchStart\"\n\t\t\t/>\n\t\t</template>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport Mousetrap from \"mousetrap\";\nimport {computed, defineComponent, ref, watch} from \"vue\";\nimport eventbus from \"../js/eventbus\";\nimport {ClientChan, ClientLinkPreview} from \"../js/types\";\nimport {SharedMsg} from \"../../shared/types/msg\";\n\nexport default defineComponent({\n\tname: \"ImageViewer\",\n\tsetup() {\n\t\tconst viewer = ref<HTMLDivElement>();\n\t\tconst image = ref<HTMLImageElement>();\n\n\t\tconst link = ref<ClientLinkPreview | null>(null);\n\t\tconst previousImage = ref<ClientLinkPreview | null>();\n\t\tconst nextImage = ref<ClientLinkPreview | null>();\n\t\tconst channel = ref<ClientChan | null>();\n\n\t\tconst position = ref<{\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t}>({\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t});\n\n\t\tconst transform = ref<{\n\t\t\tscale: number;\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t}>({\n\t\t\tscale: 1,\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t});\n\n\t\tconst computeImageStyles = computed(() => {\n\t\t\t// Sub pixels may cause the image to blur in certain browsers\n\t\t\t// round it down to prevent that\n\t\t\tconst transformX = Math.floor(transform.value.x);\n\t\t\tconst transformY = Math.floor(transform.value.y);\n\n\t\t\treturn {\n\t\t\t\tleft: `${position.value.x}px`,\n\t\t\t\ttop: `${position.value.y}px`,\n\t\t\t\ttransform: `translate3d(${transformX}px, ${transformY}px, 0) scale3d(${transform.value.scale}, ${transform.value.scale}, 1)`,\n\t\t\t};\n\t\t});\n\n\t\tconst closeViewer = () => {\n\t\t\tif (link.value === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tchannel.value = null;\n\t\t\tpreviousImage.value = null;\n\t\t\tnextImage.value = null;\n\t\t\tlink.value = null;\n\t\t};\n\n\t\tconst setPrevNextImages = () => {\n\t\t\tif (!channel.value || !link.value) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst links = channel.value.messages\n\t\t\t\t.map((msg: SharedMsg) => msg.previews)\n\t\t\t\t.flat()\n\t\t\t\t.filter((preview) => preview && preview.thumb);\n\n\t\t\tconst currentIndex = links.indexOf(link.value);\n\n\t\t\tpreviousImage.value = links[currentIndex - 1] || null;\n\t\t\tnextImage.value = links[currentIndex + 1] || null;\n\t\t};\n\n\t\tconst previous = () => {\n\t\t\tif (previousImage.value) {\n\t\t\t\tlink.value = previousImage.value;\n\t\t\t}\n\t\t};\n\n\t\tconst next = () => {\n\t\t\tif (nextImage.value) {\n\t\t\t\tlink.value = nextImage.value;\n\t\t\t}\n\t\t};\n\n\t\tconst prepareImage = () => {\n\t\t\tconst viewerEl = viewer.value;\n\t\t\tconst imageEl = image.value;\n\n\t\t\tif (!viewerEl || !imageEl) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst width = viewerEl.offsetWidth;\n\t\t\tconst height = viewerEl.offsetHeight;\n\t\t\tconst scale = Math.min(1, width / imageEl.width, height / imageEl.height);\n\n\t\t\tposition.value.x = Math.floor(-image.value!.naturalWidth / 2);\n\t\t\tposition.value.y = Math.floor(-image.value!.naturalHeight / 2);\n\t\t\ttransform.value.scale = Math.max(scale, 0.1);\n\t\t\ttransform.value.x = width / 2;\n\t\t\ttransform.value.y = height / 2;\n\t\t};\n\n\t\tconst onImageLoad = () => {\n\t\t\tprepareImage();\n\t\t};\n\n\t\tconst calculateZoomShift = (newScale: number, x: number, y: number, oldScale: number) => {\n\t\t\tif (!image.value || !viewer.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst imageWidth = image.value.width;\n\t\t\tconst centerX = viewer.value.offsetWidth / 2;\n\t\t\tconst centerY = viewer.value.offsetHeight / 2;\n\n\t\t\treturn {\n\t\t\t\tx:\n\t\t\t\t\tcenterX -\n\t\t\t\t\t((centerX - (y - (imageWidth * x) / 2)) / x) * newScale +\n\t\t\t\t\t(imageWidth * newScale) / 2,\n\t\t\t\ty:\n\t\t\t\t\tcenterY -\n\t\t\t\t\t((centerY - (oldScale - (imageWidth * x) / 2)) / x) * newScale +\n\t\t\t\t\t(imageWidth * newScale) / 2,\n\t\t\t};\n\t\t};\n\n\t\tconst correctPosition = () => {\n\t\t\tconst imageEl = image.value;\n\t\t\tconst viewerEl = viewer.value;\n\n\t\t\tif (!imageEl || !viewerEl) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst widthScaled = imageEl.width * transform.value.scale;\n\t\t\tconst heightScaled = imageEl.height * transform.value.scale;\n\t\t\tconst containerWidth = viewerEl.offsetWidth;\n\t\t\tconst containerHeight = viewerEl.offsetHeight;\n\n\t\t\tif (widthScaled < containerWidth) {\n\t\t\t\ttransform.value.x = containerWidth / 2;\n\t\t\t} else if (transform.value.x - widthScaled / 2 > 0) {\n\t\t\t\ttransform.value.x = widthScaled / 2;\n\t\t\t} else if (transform.value.x + widthScaled / 2 < containerWidth) {\n\t\t\t\ttransform.value.x = containerWidth - widthScaled / 2;\n\t\t\t}\n\n\t\t\tif (heightScaled < containerHeight) {\n\t\t\t\ttransform.value.y = containerHeight / 2;\n\t\t\t} else if (transform.value.y - heightScaled / 2 > 0) {\n\t\t\t\ttransform.value.y = heightScaled / 2;\n\t\t\t} else if (transform.value.y + heightScaled / 2 < containerHeight) {\n\t\t\t\ttransform.value.y = containerHeight - heightScaled / 2;\n\t\t\t}\n\t\t};\n\n\t\t// Reduce multiple touch points into a single x/y/scale\n\t\tconst reduceTouches = (touches: TouchList) => {\n\t\t\tlet totalX = 0;\n\t\t\tlet totalY = 0;\n\t\t\tlet totalScale = 0;\n\n\t\t\tfor (let i = 0; i < touches.length; i++) {\n\t\t\t\tconst x = touches[i].clientX;\n\t\t\t\tconst y = touches[i].clientY;\n\n\t\t\t\ttotalX += x;\n\t\t\t\ttotalY += y;\n\n\t\t\t\tfor (let i2 = 0; i2 < touches.length; i2++) {\n\t\t\t\t\tif (i !== i2) {\n\t\t\t\t\t\tconst x2 = touches[i2].clientX;\n\t\t\t\t\t\tconst y2 = touches[i2].clientY;\n\t\t\t\t\t\ttotalScale += Math.sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (totalScale === 0) {\n\t\t\t\ttotalScale = 1;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tx: totalX / touches.length,\n\t\t\t\ty: totalY / touches.length,\n\t\t\t\tscale: totalScale / touches.length,\n\t\t\t};\n\t\t};\n\n\t\tconst onTouchStart = (e: TouchEvent) => {\n\t\t\t// prevent sidebar touchstart event, we don't want to interact with sidebar while in image viewer\n\t\t\te.stopImmediatePropagation();\n\t\t};\n\n\t\t// Touch image manipulation:\n\t\t// 1. Move around by dragging it with one finger\n\t\t// 2. Change image scale by using two fingers\n\t\tconst onImageTouchStart = (e: TouchEvent) => {\n\t\t\tconst img = image.value;\n\t\t\tlet touch = reduceTouches(e.touches);\n\t\t\tlet currentTouches = e.touches;\n\t\t\tlet touchEndFingers = 0;\n\n\t\t\tconst currentTransform = {\n\t\t\t\tx: touch.x,\n\t\t\t\ty: touch.y,\n\t\t\t\tscale: touch.scale,\n\t\t\t};\n\n\t\t\tconst startTransform = {\n\t\t\t\tx: transform.value.x,\n\t\t\t\ty: transform.value.y,\n\t\t\t\tscale: transform.value.scale,\n\t\t\t};\n\n\t\t\tconst touchMove = (moveEvent) => {\n\t\t\t\ttouch = reduceTouches(moveEvent.touches);\n\n\t\t\t\tif (currentTouches.length !== moveEvent.touches.length) {\n\t\t\t\t\tcurrentTransform.x = touch.x;\n\t\t\t\t\tcurrentTransform.y = touch.y;\n\t\t\t\t\tcurrentTransform.scale = touch.scale;\n\t\t\t\t\tstartTransform.x = transform.value.x;\n\t\t\t\t\tstartTransform.y = transform.value.y;\n\t\t\t\t\tstartTransform.scale = transform.value.scale;\n\t\t\t\t}\n\n\t\t\t\tconst deltaX = touch.x - currentTransform.x;\n\t\t\t\tconst deltaY = touch.y - currentTransform.y;\n\t\t\t\tconst deltaScale = touch.scale / currentTransform.scale;\n\t\t\t\tcurrentTouches = moveEvent.touches;\n\t\t\t\ttouchEndFingers = 0;\n\n\t\t\t\tconst newScale = Math.min(3, Math.max(0.1, startTransform.scale * deltaScale));\n\n\t\t\t\tconst fixedPosition = calculateZoomShift(\n\t\t\t\t\tnewScale,\n\t\t\t\t\tstartTransform.scale,\n\t\t\t\t\tstartTransform.x,\n\t\t\t\t\tstartTransform.y\n\t\t\t\t);\n\n\t\t\t\tif (!fixedPosition) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttransform.value.x = fixedPosition.x + deltaX;\n\t\t\t\ttransform.value.y = fixedPosition.y + deltaY;\n\t\t\t\ttransform.value.scale = newScale;\n\t\t\t\tcorrectPosition();\n\t\t\t};\n\n\t\t\tconst touchEnd = (endEvent: TouchEvent) => {\n\t\t\t\tconst changedTouches = endEvent.changedTouches.length;\n\n\t\t\t\tif (currentTouches.length > changedTouches + touchEndFingers) {\n\t\t\t\t\ttouchEndFingers += changedTouches;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// todo: this is swipe to close, but it's not working very well due to unfinished delta calculation\n\t\t\t\t/* if (\n\t\t\t\t\ttransform.value.scale <= 1 &&\n\t\t\t\t\tendEvent.changedTouches[0].clientY - startTransform.y <= -70\n\t\t\t\t) {\n\t\t\t\t\treturn this.closeViewer();\n\t\t\t\t}*/\n\n\t\t\t\tcorrectPosition();\n\n\t\t\t\timg?.removeEventListener(\"touchmove\", touchMove);\n\t\t\t\timg?.removeEventListener(\"touchend\", touchEnd);\n\t\t\t};\n\n\t\t\timg?.addEventListener(\"touchmove\", touchMove, {passive: true});\n\t\t\timg?.addEventListener(\"touchend\", touchEnd, {passive: true});\n\t\t};\n\n\t\t// Image mouse manipulation:\n\t\t// 1. Mouse wheel scrolling will zoom in and out\n\t\t// 2. If image is zoomed in, simply dragging it will move it around\n\t\tconst onImageMouseDown = (e: MouseEvent) => {\n\t\t\t// todo: ignore if in touch event currently?\n\n\t\t\t// only left mouse\n\t\t\t// TODO: e.buttons?\n\t\t\tif (e.which !== 1) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\n\t\t\tconst viewerEl = viewer.value;\n\t\t\tconst imageEl = image.value;\n\n\t\t\tif (!viewerEl || !imageEl) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst startX = e.clientX;\n\t\t\tconst startY = e.clientY;\n\t\t\tconst startTransformX = transform.value.x;\n\t\t\tconst startTransformY = transform.value.y;\n\t\t\tconst widthScaled = imageEl.width * transform.value.scale;\n\t\t\tconst heightScaled = imageEl.height * transform.value.scale;\n\t\t\tconst containerWidth = viewerEl.offsetWidth;\n\t\t\tconst containerHeight = viewerEl.offsetHeight;\n\t\t\tconst centerX = transform.value.x - widthScaled / 2;\n\t\t\tconst centerY = transform.value.y - heightScaled / 2;\n\t\t\tlet movedDistance = 0;\n\n\t\t\tconst mouseMove = (moveEvent: MouseEvent) => {\n\t\t\t\tmoveEvent.stopPropagation();\n\t\t\t\tmoveEvent.preventDefault();\n\n\t\t\t\tconst newX = moveEvent.clientX - startX;\n\t\t\t\tconst newY = moveEvent.clientY - startY;\n\n\t\t\t\tmovedDistance = Math.max(movedDistance, Math.abs(newX), Math.abs(newY));\n\n\t\t\t\tif (centerX < 0 || widthScaled + centerX > containerWidth) {\n\t\t\t\t\ttransform.value.x = startTransformX + newX;\n\t\t\t\t}\n\n\t\t\t\tif (centerY < 0 || heightScaled + centerY > containerHeight) {\n\t\t\t\t\ttransform.value.y = startTransformY + newY;\n\t\t\t\t}\n\n\t\t\t\tcorrectPosition();\n\t\t\t};\n\n\t\t\tconst mouseUp = (upEvent: MouseEvent) => {\n\t\t\t\tcorrectPosition();\n\n\t\t\t\tif (movedDistance < 2 && upEvent.button === 0) {\n\t\t\t\t\tcloseViewer();\n\t\t\t\t}\n\n\t\t\t\timage.value?.removeEventListener(\"mousemove\", mouseMove);\n\t\t\t\timage.value?.removeEventListener(\"mouseup\", mouseUp);\n\t\t\t};\n\n\t\t\timage.value?.addEventListener(\"mousemove\", mouseMove);\n\t\t\timage.value?.addEventListener(\"mouseup\", mouseUp);\n\t\t};\n\n\t\t// If image is zoomed in, holding ctrl while scrolling will move the image up and down\n\t\tconst onMouseWheel = (e: WheelEvent) => {\n\t\t\t// if image viewer is closing (css animation), you can still trigger mousewheel\n\t\t\t// TODO: Figure out a better fix for this\n\t\t\tif (link.value === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.preventDefault(); // TODO: Can this be passive?\n\n\t\t\tif (e.ctrlKey) {\n\t\t\t\ttransform.value.y += e.deltaY;\n\t\t\t} else {\n\t\t\t\tconst delta = e.deltaY > 0 ? 0.1 : -0.1;\n\t\t\t\tconst newScale = Math.min(3, Math.max(0.1, transform.value.scale + delta));\n\t\t\t\tconst fixedPosition = calculateZoomShift(\n\t\t\t\t\tnewScale,\n\t\t\t\t\ttransform.value.scale,\n\t\t\t\t\ttransform.value.x,\n\t\t\t\t\ttransform.value.y\n\t\t\t\t);\n\n\t\t\t\tif (!fixedPosition) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttransform.value.scale = newScale;\n\t\t\t\ttransform.value.x = fixedPosition.x;\n\t\t\t\ttransform.value.y = fixedPosition.y;\n\t\t\t}\n\n\t\t\tcorrectPosition();\n\t\t};\n\n\t\tconst onClick = (e: Event) => {\n\t\t\t// If click triggers on the image, ignore it\n\t\t\tif (e.target === image.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcloseViewer();\n\t\t};\n\n\t\twatch(link, (newLink, oldLink) => {\n\t\t\t// TODO: history.pushState\n\t\t\tif (newLink === null) {\n\t\t\t\teventbus.off(\"escapekey\", closeViewer);\n\t\t\t\teventbus.off(\"resize\", correctPosition);\n\t\t\t\tMousetrap.unbind(\"left\");\n\t\t\t\tMousetrap.unbind(\"right\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetPrevNextImages();\n\n\t\t\tif (!oldLink) {\n\t\t\t\teventbus.on(\"escapekey\", closeViewer);\n\t\t\t\teventbus.on(\"resize\", correctPosition);\n\t\t\t\tMousetrap.bind(\"left\", previous);\n\t\t\t\tMousetrap.bind(\"right\", next);\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tlink,\n\t\t\tchannel,\n\t\t\timage,\n\t\t\ttransform,\n\t\t\tcloseViewer,\n\t\t\tnext,\n\t\t\tprevious,\n\t\t\tonImageLoad,\n\t\t\tonImageMouseDown,\n\t\t\tonMouseWheel,\n\t\t\tonClick,\n\t\t\tonTouchStart,\n\t\t\tpreviousImage,\n\t\t\tnextImage,\n\t\t\tonImageTouchStart,\n\t\t\tcomputeImageStyles,\n\t\t\tviewer,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./ImageViewer.vue?vue&type=template&id=99d1f304&ts=true\"\nimport script from \"./ImageViewer.vue?vue&type=script&lang=ts\"\nexport * from \"./ImageViewer.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div\n\t\tv-if=\"isOpen\"\n\t\tid=\"context-menu-container\"\n\t\t:class=\"{passthrough}\"\n\t\t@click=\"containerClick\"\n\t\t@contextmenu.prevent=\"containerClick\"\n\t\t@keydown.exact.up.prevent=\"navigateMenu(-1)\"\n\t\t@keydown.exact.down.prevent=\"navigateMenu(1)\"\n\t\t@keydown.exact.tab.prevent=\"navigateMenu(1)\"\n\t\t@keydown.shift.tab.prevent=\"navigateMenu(-1)\"\n\t>\n\t\t<ul\n\t\t\tid=\"context-menu\"\n\t\t\tref=\"contextMenu\"\n\t\t\trole=\"menu\"\n\t\t\t:style=\"{\n\t\t\t\ttop: style.top + 'px',\n\t\t\t\tleft: style.left + 'px',\n\t\t\t}\"\n\t\t\ttabindex=\"-1\"\n\t\t\t:aria-activedescendant=\"activeItem > -1 ? `context-menu-item-${activeItem}` : undefined\"\n\t\t\t@mouseleave=\"activeItem = -1\"\n\t\t\t@keydown.enter.prevent=\"clickActiveItem\"\n\t\t>\n\t\t\t<!-- TODO: type -->\n\t\t\t<template v-for=\"(item, id) of items as any\" :key=\"item.name\">\n\t\t\t\t<li\n\t\t\t\t\t:id=\"`context-menu-item-${id}`\"\n\t\t\t\t\t:class=\"[\n\t\t\t\t\t\t'context-menu-' + item.type,\n\t\t\t\t\t\titem.class ? 'context-menu-' + item.class : null,\n\t\t\t\t\t\t{active: id === activeItem},\n\t\t\t\t\t]\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t@mouseenter=\"hoverItem(id as number)\"\n\t\t\t\t\t@click=\"clickItem(item)\"\n\t\t\t\t>\n\t\t\t\t\t{{ item.label }}\n\t\t\t\t</li>\n\t\t\t</template>\n\t\t</ul>\n\t</div>\n</template>\n\n<style lang=\"css\">\n.context-menu-item[class*=\"context-menu-group-\"] {\n\t&,\n\t&:hover {\n\t\ttext-align: center;\n\t\tbackground-color: initial;\n\t\tcursor: default;\n\t}\n}\n</style>\n\n<script lang=\"ts\">\nimport {\n\tgenerateUserContextMenu,\n\tgenerateChannelContextMenu,\n\tgenerateInlineChannelContextMenu,\n\tContextMenuItem,\n} from \"../js/helpers/contextMenu\";\nimport eventbus from \"../js/eventbus\";\nimport {defineComponent, nextTick, onMounted, onUnmounted, PropType, ref} from \"vue\";\nimport {ClientChan, ClientMessage, ClientNetwork, ClientUser} from \"../js/types\";\nimport {useStore} from \"../js/store\";\nimport {useRouter} from \"vue-router\";\n\nexport default defineComponent({\n\tname: \"ContextMenu\",\n\tprops: {\n\t\tmessage: {\n\t\t\trequired: false,\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\t\tconst router = useRouter();\n\n\t\tconst isOpen = ref(false);\n\t\tconst passthrough = ref(false);\n\n\t\tconst contextMenu = ref<HTMLUListElement | null>();\n\t\tconst previousActiveElement = ref<HTMLElement | null>();\n\t\tconst items = ref<ContextMenuItem[]>([]);\n\t\tconst activeItem = ref(-1);\n\t\tconst style = ref({\n\t\t\ttop: 0,\n\t\t\tleft: 0,\n\t\t});\n\n\t\tconst close = () => {\n\t\t\tif (!isOpen.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tisOpen.value = false;\n\t\t\titems.value = [];\n\n\t\t\tif (previousActiveElement.value) {\n\t\t\t\tpreviousActiveElement.value.focus();\n\t\t\t\tpreviousActiveElement.value = null;\n\t\t\t}\n\t\t};\n\n\t\tconst enablePointerEvents = () => {\n\t\t\tpassthrough.value = false;\n\t\t\tdocument.body.removeEventListener(\"pointerup\", enablePointerEvents);\n\t\t};\n\n\t\tconst containerClick = (event: MouseEvent) => {\n\t\t\tif (event.currentTarget === event.target) {\n\t\t\t\tclose();\n\t\t\t}\n\t\t};\n\n\t\tconst positionContextMenu = (event: MouseEvent) => {\n\t\t\tconst element = event.target as HTMLElement;\n\n\t\t\tif (!contextMenu.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst menuWidth = contextMenu.value?.offsetWidth;\n\t\t\tconst menuHeight = contextMenu.value?.offsetHeight;\n\n\t\t\tif (element && element.classList.contains(\"menu\")) {\n\t\t\t\treturn {\n\t\t\t\t\tleft: element.getBoundingClientRect().left - (menuWidth - element.offsetWidth),\n\t\t\t\t\ttop: element.getBoundingClientRect().top + element.offsetHeight,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst offset = {left: event.pageX, top: event.pageY};\n\n\t\t\tif (\n\t\t\t\tstore.state.settings.enhancedContextMenuEnabled &&\n\t\t\t\tcontextMenu.value.querySelector('[class*=\"context-menu-group-\"]')\n\t\t\t) {\n\t\t\t\toffset.top -= 45;\n\t\t\t}\n\n\t\t\tif (window.innerWidth - offset.left < menuWidth) {\n\t\t\t\toffset.left = window.innerWidth - menuWidth;\n\t\t\t}\n\n\t\t\tif (window.innerHeight - offset.top < menuHeight) {\n\t\t\t\toffset.top = window.innerHeight - menuHeight;\n\t\t\t}\n\n\t\t\treturn offset;\n\t\t};\n\n\t\tconst hoverItem = (id: number) => {\n\t\t\tactiveItem.value = id;\n\t\t};\n\n\t\tconst clickItem = (item: ContextMenuItem) => {\n\t\t\tclose();\n\n\t\t\tif (\"action\" in item && item.action) {\n\t\t\t\titem.action();\n\t\t\t} else if (\"link\" in item && item.link) {\n\t\t\t\trouter.push(item.link).catch(() => {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error(\"Failed to navigate to\", item.link);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tconst clickActiveItem = () => {\n\t\t\tif (items.value[activeItem.value]) {\n\t\t\t\tclickItem(items.value[activeItem.value]);\n\t\t\t}\n\t\t};\n\n\t\tconst open = (event: MouseEvent, newItems: ContextMenuItem[]) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tpreviousActiveElement.value = document.activeElement as HTMLElement;\n\t\t\titems.value = newItems;\n\t\t\tactiveItem.value = 0;\n\t\t\tisOpen.value = true;\n\n\t\t\t// Position the menu and set the focus on the first item after it's size has updated\n\t\t\tnextTick(() => {\n\t\t\t\tconst pos = positionContextMenu(event);\n\n\t\t\t\tif (!pos) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tstyle.value.left = pos.left;\n\t\t\t\tstyle.value.top = pos.top;\n\t\t\t\tcontextMenu.value?.focus();\n\t\t\t}).catch((e) => {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(e);\n\t\t\t});\n\t\t};\n\n\t\tconst openChannelContextMenu = (data: {\n\t\t\tevent: MouseEvent;\n\t\t\tchannel: ClientChan;\n\t\t\tnetwork: ClientNetwork;\n\t\t}) => {\n\t\t\tif (data.event.type === \"contextmenu\") {\n\t\t\t\t// Pass through all pointer events to allow the network list's\n\t\t\t\t// dragging events to continue triggering.\n\t\t\t\tpassthrough.value = true;\n\t\t\t\tdocument.body.addEventListener(\"pointerup\", enablePointerEvents, {\n\t\t\t\t\tpassive: true,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst newItems = generateChannelContextMenu(data.channel, data.network);\n\t\t\topen(data.event, newItems);\n\t\t};\n\n\t\tconst openInlineChannelContextMenu = (data: {channel: string; event: MouseEvent}) => {\n\t\t\tconst {network} = store.state.activeChannel!;\n\t\t\tconst newItems = generateInlineChannelContextMenu(store, data.channel, network);\n\n\t\t\topen(data.event, newItems);\n\t\t};\n\n\t\tconst openUserContextMenu = (data: {\n\t\t\tuser: Pick<ClientUser, \"nick\" | \"modes\">;\n\t\t\tevent: MouseEvent;\n\t\t}) => {\n\t\t\tconst {network, channel} = store.state.activeChannel!;\n\n\t\t\tconst newItems = generateUserContextMenu(\n\t\t\t\tstore,\n\t\t\t\tchannel,\n\t\t\t\tnetwork,\n\t\t\t\tchannel.users.find((u) => u.nick === data.user.nick) || {\n\t\t\t\t\tnick: data.user.nick,\n\t\t\t\t\tmodes: [],\n\t\t\t\t}\n\t\t\t);\n\t\t\topen(data.event, newItems);\n\t\t};\n\n\t\tconst navigateMenu = (direction: number) => {\n\t\t\tlet currentIndex = activeItem.value;\n\n\t\t\tcurrentIndex += direction;\n\n\t\t\tconst nextItem = items.value[currentIndex];\n\n\t\t\t// If the next item we would select is a divider, skip over it\n\t\t\tif (nextItem && \"type\" in nextItem && nextItem.type === \"divider\") {\n\t\t\t\tcurrentIndex += direction;\n\t\t\t}\n\n\t\t\tif (currentIndex < 0) {\n\t\t\t\tcurrentIndex += items.value.length;\n\t\t\t}\n\n\t\t\tif (currentIndex > items.value.length - 1) {\n\t\t\t\tcurrentIndex -= items.value.length;\n\t\t\t}\n\n\t\t\tactiveItem.value = currentIndex;\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\teventbus.on(\"escapekey\", close);\n\t\t\teventbus.on(\"contextmenu:cancel\", close);\n\t\t\teventbus.on(\"contextmenu:user\", <(...evt: unknown[]) => void>openUserContextMenu);\n\t\t\teventbus.on(\"contextmenu:channel\", <(...evt: unknown[]) => void>openChannelContextMenu);\n\t\t\teventbus.on(\n\t\t\t\t\"contextmenu:inline-channel\",\n\t\t\t\t<(...evt: unknown[]) => void>openInlineChannelContextMenu\n\t\t\t);\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\teventbus.off(\"escapekey\", close);\n\t\t\teventbus.off(\"contextmenu:cancel\", close);\n\t\t\teventbus.off(\"contextmenu:user\", <(...evt: unknown[]) => void>openUserContextMenu);\n\t\t\teventbus.off(\n\t\t\t\t\"contextmenu:channel\",\n\t\t\t\t<(...evt: unknown[]) => void>openChannelContextMenu\n\t\t\t);\n\t\t\teventbus.off(\n\t\t\t\t\"contextmenu:inline-channel\",\n\t\t\t\t<(...evt: unknown[]) => void>openInlineChannelContextMenu\n\t\t\t);\n\n\t\t\tclose();\n\t\t});\n\n\t\treturn {\n\t\t\tisOpen,\n\t\t\titems,\n\t\t\tactiveItem,\n\t\t\tstyle,\n\t\t\tcontextMenu,\n\t\t\tpassthrough,\n\t\t\tclose,\n\t\t\tcontainerClick,\n\t\t\tnavigateMenu,\n\t\t\thoverItem,\n\t\t\tclickItem,\n\t\t\tclickActiveItem,\n\t\t};\n\t},\n});\n</script>\n","import socket from \"../socket\";\nimport eventbus from \"../eventbus\";\nimport type {ClientChan, ClientNetwork, ClientUser} from \"../types\";\nimport {switchToChannel} from \"../router\";\nimport {TypedStore} from \"../store\";\nimport useCloseChannel from \"../hooks/use-close-channel\";\nimport {ChanType} from \"../../../shared/types/chan\";\nimport {openInNewTab} from \"./openInNewTab\";\n\ntype BaseContextMenuItem = {\n\tlabel: string;\n\ttype: string;\n\tclass: string;\n};\n\ntype ContextMenuItemWithAction = BaseContextMenuItem & {\n\taction: () => void;\n};\n\ntype ContextMenuItemWithLink = BaseContextMenuItem & {\n\tlink?: string;\n};\n\ntype ContextMenuDividerItem = {\n\ttype: \"divider\";\n};\n\nexport type ContextMenuItem =\n\t| ContextMenuItemWithAction\n\t| ContextMenuItemWithLink\n\t| ContextMenuDividerItem;\n\nexport function generateChannelContextMenu(\n\tchannel: ClientChan,\n\tnetwork: ClientNetwork\n): ContextMenuItem[] {\n\tconst closeChannel = useCloseChannel(channel);\n\n\tconst typeMap = {\n\t\tlobby: \"network\",\n\t\tchannel: \"chan\",\n\t\tquery: \"query\",\n\t\tspecial: \"chan\",\n\t};\n\n\tconst closeMap = {\n\t\tlobby: \"Remove\",\n\t\tchannel: \"Leave\",\n\t\tquery: \"Close\",\n\t\tspecial: \"Close\",\n\t};\n\n\tlet items: ContextMenuItem[] = [\n\t\t{\n\t\t\tlabel: channel.name,\n\t\t\ttype: \"item\",\n\t\t\tclass: typeMap[channel.type],\n\t\t\tlink: `/chan-${channel.id}`,\n\t\t},\n\t\t{\n\t\t\ttype: \"divider\",\n\t\t},\n\t];\n\n\t// Add menu items for lobbies\n\tif (channel.type === ChanType.LOBBY) {\n\t\titems = [\n\t\t\t...items,\n\t\t\t{\n\t\t\t\tlabel: \"Edit this network…\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"edit\",\n\t\t\t\tlink: `/edit-network/${network.uuid}`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"Join a channel…\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"join\",\n\t\t\t\taction: () => (network.isJoinChannelShown = true),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"List all channels\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"list\",\n\t\t\t\taction: () =>\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/list\",\n\t\t\t\t\t}),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"List ignored users\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"list\",\n\t\t\t\taction: () =>\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/ignorelist\",\n\t\t\t\t\t}),\n\t\t\t},\n\t\t\tnetwork.status.connected\n\t\t\t\t? {\n\t\t\t\t\t\tlabel: \"Disconnect\",\n\t\t\t\t\t\ttype: \"item\",\n\t\t\t\t\t\tclass: \"disconnect\",\n\t\t\t\t\t\taction: () =>\n\t\t\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\t\t\ttext: \"/disconnect\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tlabel: \"Connect\",\n\t\t\t\t\t\ttype: \"item\",\n\t\t\t\t\t\tclass: \"connect\",\n\t\t\t\t\t\taction: () =>\n\t\t\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\t\t\ttext: \"/connect\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t];\n\t}\n\n\t// Add menu items for channels\n\tif (channel.type === ChanType.CHANNEL) {\n\t\titems.push({\n\t\t\tlabel: \"Edit topic\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"edit\",\n\t\t\taction() {\n\t\t\t\tchannel.editTopic = true;\n\t\t\t\tswitchToChannel(channel);\n\t\t\t},\n\t\t});\n\t\titems.push({\n\t\t\tlabel: \"List banned users\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"list\",\n\t\t\taction() {\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\ttext: \"/banlist\",\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\n\t// Add menu items for queries\n\tif (channel.type === ChanType.QUERY) {\n\t\titems.push(\n\t\t\t{\n\t\t\t\tlabel: \"User information\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-whois\",\n\t\t\t\taction() {\n\t\t\t\t\tswitchToChannel(channel);\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/whois \" + channel.name,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"Ignore user\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-ignore\",\n\t\t\t\taction() {\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/ignore \" + channel.name,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: channel.pinned ? \"Unpin conversation\" : \"Pin conversation\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"pin\",\n\t\t\t\taction() {\n\t\t\t\t\tsocket.emit(\"pin:change\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\tsetPinnedTo: !channel.pinned,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t}\n\t\t);\n\t}\n\n\tif (channel.type === ChanType.CHANNEL || channel.type === ChanType.QUERY) {\n\t\titems.push({\n\t\t\tlabel: \"Clear history\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"clear-history\",\n\t\t\taction() {\n\t\t\t\teventbus.emit(\n\t\t\t\t\t\"confirm-dialog\",\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: \"Clear history\",\n\t\t\t\t\t\ttext: `Are you sure you want to clear history for ${channel.name}? This cannot be undone.`,\n\t\t\t\t\t\tbutton: \"Clear history\",\n\t\t\t\t\t},\n\t\t\t\t\t(result) => {\n\t\t\t\t\t\tif (!result) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsocket.emit(\"history:clear\", {\n\t\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t}\n\n\tconst humanFriendlyChanTypeMap: Record<string, string> = {\n\t\tlobby: \"network\",\n\t\tchannel: \"channel\",\n\t\tquery: \"conversation\",\n\t};\n\n\t// We don't allow the muting of ChanType.SPECIAL channels\n\tconst mutableChanTypes = Object.keys(humanFriendlyChanTypeMap);\n\n\tif (mutableChanTypes.includes(channel.type)) {\n\t\tconst chanType = humanFriendlyChanTypeMap[channel.type];\n\n\t\titems.push({\n\t\t\tlabel: channel.muted ? `Unmute ${chanType}` : `Mute ${chanType}`,\n\t\t\ttype: \"item\",\n\t\t\tclass: \"mute\",\n\t\t\taction() {\n\t\t\t\tsocket.emit(\"mute:change\", {\n\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\tsetMutedTo: !channel.muted,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\n\t// Add close menu item\n\titems.push({\n\t\tlabel: closeMap[channel.type],\n\t\ttype: \"item\",\n\t\tclass: \"close\",\n\t\taction() {\n\t\t\tcloseChannel();\n\t\t},\n\t});\n\n\treturn items;\n}\n\nexport function generateInlineChannelContextMenu(\n\tstore: TypedStore,\n\tchan: string,\n\tnetwork: ClientNetwork\n): ContextMenuItem[] {\n\tconst join = () => {\n\t\tconst channel = network.channels.find((c) => c.name === chan);\n\n\t\tif (channel) {\n\t\t\tswitchToChannel(channel);\n\t\t}\n\n\t\tif (store.state.activeChannel) {\n\t\t\tsocket.emit(\"input\", {\n\t\t\t\ttarget: store.state.activeChannel.channel.id,\n\t\t\t\ttext: \"/join \" + chan,\n\t\t\t});\n\t\t} else {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(\"Unable to join channel: activeChannel is undefined\");\n\t\t}\n\t};\n\n\tconst channel = network.channels.find((c) => c.name === chan);\n\n\tif (channel) {\n\t\treturn [\n\t\t\t{\n\t\t\t\tlabel: \"Go to channel\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"chan\",\n\t\t\t\tlink: `/chan-${channel.id}`,\n\t\t\t},\n\t\t];\n\t}\n\n\treturn [\n\t\t{\n\t\t\tlabel: \"Join channel\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"join\",\n\t\t\taction: join,\n\t\t},\n\t];\n}\n\nexport function generateUserContextMenu(\n\tstore: TypedStore,\n\tchannel: ClientChan,\n\tnetwork: ClientNetwork,\n\tuser: Pick<ClientUser, \"nick\" | \"modes\">\n): ContextMenuItem[] {\n\tconst currentChannelUser: ClientUser | Record<string, never> = channel\n\t\t? channel.users.find((u) => u.nick === network.nick) || {}\n\t\t: {};\n\n\tconst userContextMenuEntrys = () => {\n\t\tconst defualt = {\n\t\t\tlabel: user.nick,\n\t\t\ttype: \"item\",\n\t\t\tclass: \"user\",\n\t\t\taction() {},\n\t\t};\n\n\t\tif (\n\t\t\tstore.state.settings.enhancedContextMenuEnabled &&\n\t\t\tBoolean(network.channels.find((c) => (c.groups?.length ?? 0) > 0))\n\t\t) {\n\t\t\tconst customInspect = {\n\t\t\t\tlabel: user.nick,\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"user\",\n\t\t\t\taction() {\n\t\t\t\t\tif (channel.type !== ChanType.CHANNEL) return;\n\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: `!user ${user.nick}`,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst customTrackerProfile = {\n\t\t\t\tlabel: `Tracker Profile`,\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-open\",\n\t\t\t\taction() {\n\t\t\t\t\topenInNewTab(`https://brr.red/${user.nick}`);\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst userGroup =\n\t\t\t\tnetwork.channels\n\t\t\t\t\t.find((c) => c.users.find((u) => u.nick === user.nick))\n\t\t\t\t\t?.groups?.find((g) => g.users.includes(user.nick))?.name ?? \"Offline\";\n\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: userGroup,\n\t\t\t\t\ttype: \"item\",\n\t\t\t\t\tclass: `group-${userGroup.toLowerCase()}`,\n\t\t\t\t\taction() {},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: \"divider\",\n\t\t\t\t},\n\t\t\t\tcustomInspect,\n\t\t\t\tcustomTrackerProfile,\n\t\t\t] as ContextMenuItem[];\n\t\t}\n\n\t\treturn [defualt];\n\t};\n\n\t// Extra entries for enhanced context menu\n\tconst additionalContextMenuEntrys = () => {\n\t\tif (!store.state.settings.enhancedContextMenuEnabled) return [];\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tlabel: `Slap ${user.nick}`,\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-slap\",\n\t\t\t\taction() {\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/slap \" + user.nick,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t};\n\n\tconst items: ContextMenuItem[] = [\n\t\t...userContextMenuEntrys(),\n\t\t{\n\t\t\ttype: \"divider\",\n\t\t},\n\t\t{\n\t\t\tlabel: \"Direct messages\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"action-query\",\n\t\t\taction() {\n\t\t\t\tconst chan = store.getters.findChannelOnCurrentNetwork(user.nick);\n\n\t\t\t\tif (chan) {\n\t\t\t\t\tswitchToChannel(chan);\n\t\t\t\t}\n\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\ttext: \"/query \" + user.nick,\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t\t...additionalContextMenuEntrys(),\n\t\t{\n\t\t\ttype: \"divider\",\n\t\t},\n\t\t{\n\t\t\tlabel: \"User information\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"action-whois\",\n\t\t\taction() {\n\t\t\t\tconst chan = network.channels.find((c) => c.name === user.nick);\n\n\t\t\t\tif (chan) {\n\t\t\t\t\tswitchToChannel(chan);\n\t\t\t\t}\n\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\ttext: \"/whois \" + user.nick,\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tlabel: \"Ignore user\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"action-ignore\",\n\t\t\taction() {\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\ttext: \"/ignore \" + user.nick,\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t];\n\n\t// Bail because we're in a query or we don't have a special mode.\n\tif (!currentChannelUser.modes || currentChannelUser.modes.length < 1) {\n\t\treturn items;\n\t}\n\n\t// Names of the standard modes we are able to change\n\tconst modeCharToName = {\n\t\t\"~\": \"owner\",\n\t\t\"&\": \"admin\",\n\t\t\"@\": \"operator\",\n\t\t\"%\": \"half-op\",\n\t\t\"+\": \"voice\",\n\t};\n\n\t// Labels for the mode changes. For example .rev({mode: \"a\", symbol: \"&\"}) => 'Revoke admin (-a)'\n\tconst modeTextTemplate = {\n\t\trevoke(m: {symbol: string; mode: string}) {\n\t\t\tconst name = modeCharToName[m.symbol];\n\n\t\t\tif (typeof name !== \"string\") {\n\t\t\t\treturn \"\";\n\t\t\t}\n\n\t\t\tconst res = name ? `Revoke ${name} (-${m.mode})` : `Mode -${m.mode}`;\n\t\t\treturn res;\n\t\t},\n\t\tgive(m: {symbol: string; mode: string}) {\n\t\t\tconst name = modeCharToName[m.symbol];\n\n\t\t\tif (typeof name !== \"string\") {\n\t\t\t\treturn \"\";\n\t\t\t}\n\n\t\t\tconst res = name ? `Give ${name} (+${m.mode})` : `Mode +${m.mode}`;\n\t\t\treturn res;\n\t\t},\n\t};\n\n\tconst networkModeSymbols = network.serverOptions.PREFIX.symbols;\n\n\t/**\n\t * Determine whether the prefix of mode p1 has access to perform actions on p2.\n\t *\n\t * EXAMPLE:\n\t * compare('@', '@') => true\n\t * compare('&', '@') => true\n\t * compare('+', '~') => false\n\t * @param {string} p1 The mode performing an action\n\t * @param {string} p2 The target mode\n\t *\n\t * @return {boolean} whether p1 can perform an action on p2\n\t */\n\tfunction compare(p1: string, p2: string): boolean {\n\t\t// The modes ~ and @ can perform actions on their own mode. The others on modes below.\n\t\treturn \"~@\".indexOf(p1) > -1\n\t\t\t? networkModeSymbols.indexOf(p1) <= networkModeSymbols.indexOf(p2)\n\t\t\t: networkModeSymbols.indexOf(p1) < networkModeSymbols.indexOf(p2);\n\t}\n\n\tnetwork.serverOptions.PREFIX.prefix.forEach((mode) => {\n\t\tif (!compare(currentChannelUser.modes[0], mode.symbol)) {\n\t\t\t// Our highest mode is below the current mode. Bail.\n\t\t\treturn;\n\t\t}\n\n\t\tif (!user.modes.includes(mode.symbol)) {\n\t\t\t// The target doesn't already have this mode, therefore we can set it.\n\t\t\titems.push({\n\t\t\t\tlabel: modeTextTemplate.give(mode),\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-set-mode\",\n\t\t\t\taction() {\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/mode +\" + mode.mode + \" \" + user.nick,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\titems.push({\n\t\t\t\tlabel: modeTextTemplate.revoke(mode),\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-revoke-mode\",\n\t\t\t\taction() {\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/mode -\" + mode.mode + \" \" + user.nick,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t});\n\n\t// Determine if we are half-op or op depending on the network modes so we can kick.\n\tif (!compare(networkModeSymbols.indexOf(\"%\") > -1 ? \"%\" : \"@\", currentChannelUser.modes[0])) {\n\t\t// Check if the target user has no mode or a mode lower than ours.\n\t\tif (user.modes.length === 0 || compare(currentChannelUser.modes[0], user.modes[0])) {\n\t\t\titems.push({\n\t\t\t\tlabel: \"Kick\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-kick\",\n\t\t\t\taction() {\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/kick \" + user.nick,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\treturn items;\n}\n","export function openInNewTab(href: string) {\n\tObject.assign(document.createElement(\"a\"), {\n\t\ttarget: \"_blank\",\n\t\trel: \"noopener noreferrer\",\n\t\thref: href,\n\t}).click();\n}\n","import { render } from \"./ContextMenu.vue?vue&type=template&id=ddf3aad2&ts=true\"\nimport script from \"./ContextMenu.vue?vue&type=script&lang=ts\"\nexport * from \"./ContextMenu.vue?vue&type=script&lang=ts\"\n\nimport \"./ContextMenu.vue?vue&type=style&index=0&id=ddf3aad2&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div id=\"confirm-dialog-overlay\" :class=\"{opened: !!data}\">\n\t\t<div v-if=\"data !== null\" id=\"confirm-dialog\">\n\t\t\t<div class=\"confirm-text\">\n\t\t\t\t<div class=\"confirm-text-title\">{{ data?.title }}</div>\n\t\t\t\t<p>{{ data?.text }}</p>\n\t\t\t</div>\n\t\t\t<div class=\"confirm-buttons\">\n\t\t\t\t<button class=\"btn btn-cancel\" @click=\"close(false)\">Cancel</button>\n\t\t\t\t<button class=\"btn btn-danger\" @click=\"close(true)\">{{ data?.button }}</button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n#confirm-dialog {\n\tbackground: var(--body-bg-color);\n\tcolor: #fff;\n\tmargin: 10px;\n\tborder-radius: 5px;\n\tmax-width: 500px;\n}\n\n#confirm-dialog .confirm-text {\n\tpadding: 15px;\n\tuser-select: text;\n}\n\n#confirm-dialog .confirm-text-title {\n\tfont-size: 20px;\n\tfont-weight: 700;\n\tmargin-bottom: 10px;\n}\n\n#confirm-dialog .confirm-buttons {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\tpadding: 15px;\n\tbackground: rgb(0 0 0 / 30%);\n}\n\n#confirm-dialog .confirm-buttons .btn {\n\tmargin-bottom: 0;\n\tmargin-left: 10px;\n}\n\n#confirm-dialog .confirm-buttons .btn-cancel {\n\tborder-color: transparent;\n}\n</style>\n\n<script lang=\"ts\">\nimport eventbus from \"../js/eventbus\";\nimport {defineComponent, onMounted, onUnmounted, ref} from \"vue\";\n\ntype ConfirmDialogData = {\n\ttitle: string;\n\ttext: string;\n\tbutton: string;\n};\n\ntype ConfirmDialogCallback = {\n\t(confirmed: boolean): void;\n};\n\nexport default defineComponent({\n\tname: \"ConfirmDialog\",\n\tsetup() {\n\t\tconst data = ref<ConfirmDialogData>();\n\t\tconst callback = ref<ConfirmDialogCallback>();\n\n\t\tconst open = (incoming: ConfirmDialogData, cb: ConfirmDialogCallback) => {\n\t\t\tdata.value = incoming;\n\t\t\tcallback.value = cb;\n\t\t};\n\n\t\tconst close = (result: boolean) => {\n\t\t\tdata.value = undefined;\n\n\t\t\tif (callback.value) {\n\t\t\t\tcallback.value(!!result);\n\t\t\t}\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\teventbus.on(\"escapekey\", <(...evt: unknown[]) => void>close);\n\t\t\teventbus.on(\"confirm-dialog\", <(...evt: unknown[]) => void>open);\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\teventbus.off(\"escapekey\", <(...evt: unknown[]) => void>close);\n\t\t\teventbus.off(\"confirm-dialog\", <(...evt: unknown[]) => void>open);\n\t\t});\n\n\t\treturn {\n\t\t\tdata,\n\t\t\tclose,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./ConfirmDialog.vue?vue&type=template&id=36ab3920&ts=true\"\nimport script from \"./ConfirmDialog.vue?vue&type=script&lang=ts\"\nexport * from \"./ConfirmDialog.vue?vue&type=script&lang=ts\"\n\nimport \"./ConfirmDialog.vue?vue&type=style&index=0&id=36ab3920&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div\n\t\tv-if=\"isOpen\"\n\t\tid=\"mentions-popup-container\"\n\t\t@click=\"containerClick\"\n\t\t@contextmenu=\"containerClick\"\n\t>\n\t\t<div class=\"mentions-popup\">\n\t\t\t<div class=\"mentions-popup-title\">\n\t\t\t\tRecent mentions\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"resolvedMessages.length\"\n\t\t\t\t\tclass=\"btn dismiss-all-mentions\"\n\t\t\t\t\t@click=\"dismissAllMentions()\"\n\t\t\t\t>\n\t\t\t\t\tDismiss all\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<template v-if=\"resolvedMessages.length === 0\">\n\t\t\t\t<p v-if=\"isLoading\">Loading…</p>\n\t\t\t\t<p v-else>You have no recent mentions.</p>\n\t\t\t</template>\n\t\t\t<template v-for=\"message in resolvedMessages\" v-else :key=\"message.msgId\">\n\t\t\t\t<div :class=\"['msg', message.type]\">\n\t\t\t\t\t<div class=\"mentions-info\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<span class=\"from\">\n\t\t\t\t\t\t\t\t<Username :user=\"message.from\" />\n\t\t\t\t\t\t\t\t<template v-if=\"message.channel\">\n\t\t\t\t\t\t\t\t\tin {{ message.channel.channel.name }}\n\n\t\t\t\t\t\t\t\t\ton\n\t\t\t\t\t\t\t\t\t{{ message.channel.network.name }}\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t<template v-else> in unknown channel </template> </span\n\t\t\t\t\t\t\t>{{ ` ` }}\n\n\t\t\t\t\t\t\t<span :title=\"message.localetime\" class=\"time\">\n\t\t\t\t\t\t\t\t{{ messageTime(message.time.toString()) }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclass=\"close-tooltip tooltipped tooltipped-w\"\n\t\t\t\t\t\t\t\taria-label=\"Dismiss this mention\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"msg-dismiss\"\n\t\t\t\t\t\t\t\t\taria-label=\"Dismiss this mention\"\n\t\t\t\t\t\t\t\t\t@click=\"dismissMention(message)\"\n\t\t\t\t\t\t\t\t></button>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"content\"\n\t\t\t\t\t\tdir=\"auto\"\n\t\t\t\t\t\t:data-jump-to=\"\n\t\t\t\t\t\t\t(store.state.settings.searchEnabled &&\n\t\t\t\t\t\t\t\tstore.state.settings.enableEnhancedSearch) ||\n\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t@click=\"jumpToMention(message)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ParsedMessage :message=\"message as any\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n#mentions-popup-container {\n\tz-index: 8;\n}\n\n.mentions-popup {\n\tbackground-color: var(--window-bg-color);\n\tposition: absolute;\n\twidth: 400px;\n\tright: 80px;\n\ttop: 55px;\n\tmax-height: 400px;\n\toverflow-y: auto;\n\tz-index: 2;\n\tpadding: 10px;\n}\n\n.mentions-popup > .mentions-popup-title {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\tmargin-bottom: 10px;\n\tfont-size: 20px;\n}\n\n.mentions-popup .mentions-info {\n\tdisplay: flex;\n\tjustify-content: space-between;\n}\n\n.mentions-popup .msg {\n\tmargin-bottom: 15px;\n\tuser-select: text;\n}\n\n.mentions-popup .msg:last-child {\n\tmargin-bottom: 0;\n}\n\n.mentions-popup .msg .content {\n\tbackground-color: var(--highlight-bg-color);\n\tborder-radius: 5px;\n\tpadding: 6px;\n\tmargin-top: 2px;\n\tword-wrap: break-word;\n\tword-break: break-word; /* Webkit-specific */\n\tcursor: pointer;\n\n\t&[data-jump-to]:hover {\n\t\t/** WIP */\n\t\tcolor: var(--highlight-bg-color);\n\t\tbackground-color: var(--highlight-border-color);\n\t}\n}\n\n.mentions-popup .msg-dismiss::before {\n\tfont-size: 20px;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tline-height: 16px;\n\ttext-align: center;\n\tcontent: \"×\";\n}\n\n.mentions-popup .msg-dismiss:hover {\n\tcolor: var(--link-color);\n}\n\n.mentions-popup .dismiss-all-mentions {\n\tmargin: 0;\n\tpadding: 4px 6px;\n}\n\n@media (height >= 500px) {\n\t.mentions-popup {\n\t\tmax-height: 60vh;\n\t}\n}\n\n@media (width <= 768px) {\n\t.mentions-popup {\n\t\tborder-radius: 0;\n\t\tborder: 0;\n\t\tbox-shadow: none;\n\t\twidth: 100%;\n\t\tmax-height: none;\n\t\tinset: 45px 0 0; /* header height */\n\t}\n}\n</style>\n\n<script lang=\"ts\">\nimport Username from \"./Username.vue\";\nimport ParsedMessage from \"./ParsedMessage.vue\";\nimport socket from \"../js/socket\";\nimport eventbus from \"../js/eventbus\";\nimport localetime from \"../js/helpers/localetime\";\nimport dayjs from \"dayjs\";\nimport relativeTime from \"dayjs/plugin/relativeTime\";\nimport {computed, watch, defineComponent, ref, onMounted, onUnmounted} from \"vue\";\nimport {useStore} from \"../js/store\";\nimport {ClientMention} from \"../js/types\";\nimport {switchToChannel} from \"../js/router\";\n\ndayjs.extend(relativeTime);\n\nexport default defineComponent({\n\tname: \"Mentions\",\n\tcomponents: {\n\t\tUsername,\n\t\tParsedMessage,\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\t\tconst isOpen = ref(false);\n\t\tconst isLoading = ref(false);\n\t\tconst resolvedMessages = computed(() => {\n\t\t\tconst messages = store.state.mentions.slice().reverse();\n\n\t\t\tfor (const message of messages) {\n\t\t\t\tmessage.localetime = localetime(message.time);\n\t\t\t\tmessage.channel = store.getters.findChannel(message.chanId);\n\t\t\t}\n\n\t\t\treturn messages.filter((message) => !message.channel?.channel.muted);\n\t\t});\n\n\t\twatch(\n\t\t\t() => store.state.mentions,\n\t\t\t() => {\n\t\t\t\tisLoading.value = false;\n\t\t\t}\n\t\t);\n\n\t\tconst messageTime = (time: string) => {\n\t\t\treturn dayjs(time).fromNow();\n\t\t};\n\n\t\tconst dismissMention = (message: ClientMention) => {\n\t\t\tstore.state.mentions.splice(\n\t\t\t\tstore.state.mentions.findIndex((m) => m.msgId === message.msgId),\n\t\t\t\t1\n\t\t\t);\n\n\t\t\tsocket.emit(\"mentions:dismiss\", message.msgId);\n\t\t};\n\n\t\tconst dismissAllMentions = () => {\n\t\t\tstore.state.mentions = [];\n\t\t\tsocket.emit(\"mentions:dismiss_all\");\n\t\t};\n\n\t\tconst jumpToMention = (message: ClientMention) => {\n\t\t\tif (!store.state.settings.enableEnhancedSearch || !message.channel) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Navigate to the channel with the focused message\n\t\t\tswitchToChannel(message.channel.channel, message.msgId);\n\n\t\t\t// Close the popup\n\t\t\tisOpen.value = false;\n\t\t};\n\n\t\tconst containerClick = (event: Event) => {\n\t\t\tif (event.currentTarget === event.target) {\n\t\t\t\tisOpen.value = false;\n\t\t\t}\n\t\t};\n\n\t\tconst togglePopup = () => {\n\t\t\tisOpen.value = !isOpen.value;\n\n\t\t\tif (isOpen.value) {\n\t\t\t\tisLoading.value = true;\n\t\t\t\tsocket.emit(\"mentions:get\");\n\t\t\t}\n\t\t};\n\n\t\tconst closePopup = () => {\n\t\t\tisOpen.value = false;\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\teventbus.on(\"mentions:toggle\", togglePopup);\n\t\t\teventbus.on(\"escapekey\", closePopup);\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\teventbus.off(\"mentions:toggle\", togglePopup);\n\t\t\teventbus.off(\"escapekey\", closePopup);\n\t\t});\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tisOpen,\n\t\t\tisLoading,\n\t\t\tresolvedMessages,\n\t\t\tmessageTime,\n\t\t\tdismissMention,\n\t\t\tdismissAllMentions,\n\t\t\tjumpToMention,\n\t\t\tcontainerClick,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./Mentions.vue?vue&type=template&id=531ebca8&ts=true\"\nimport script from \"./Mentions.vue?vue&type=script&lang=ts\"\nexport * from \"./Mentions.vue?vue&type=script&lang=ts\"\n\nimport \"./Mentions.vue?vue&type=style&index=0&id=531ebca8&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div id=\"viewport\" :class=\"viewportClasses\" role=\"tablist\">\n\t\t<Sidebar v-if=\"store.state.appLoaded\" :overlay=\"overlay\" />\n\t\t<div\n\t\t\tid=\"sidebar-overlay\"\n\t\t\tref=\"overlay\"\n\t\t\taria-hidden=\"true\"\n\t\t\t@click=\"store.commit('sidebarOpen', false)\"\n\t\t/>\n\t\t<router-view ref=\"loungeWindow\"></router-view>\n\t\t<Mentions />\n\t\t<ImageViewer ref=\"imageViewer\" />\n\t\t<ContextMenu ref=\"contextMenu\" />\n\t\t<ConfirmDialog ref=\"confirmDialog\" />\n\t\t<div id=\"upload-overlay\"></div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport constants from \"../js/constants\";\nimport eventbus from \"../js/eventbus\";\nimport Mousetrap, {ExtendedKeyboardEvent} from \"mousetrap\";\nimport throttle from \"lodash/throttle\";\nimport storage from \"../js/localStorage\";\nimport isIgnoredKeybind from \"../js/helpers/isIgnoredKeybind\";\n\nimport Sidebar from \"./Sidebar.vue\";\nimport ImageViewer from \"./ImageViewer.vue\";\nimport ContextMenu from \"./ContextMenu.vue\";\nimport ConfirmDialog from \"./ConfirmDialog.vue\";\nimport Mentions from \"./Mentions.vue\";\nimport {\n\tcomputed,\n\tprovide,\n\tdefineComponent,\n\tonBeforeUnmount,\n\tonMounted,\n\tref,\n\tRef,\n\tInjectionKey,\n} from \"vue\";\nimport {useStore} from \"../js/store\";\nimport type {DebouncedFunc} from \"lodash\";\n\nexport const imageViewerKey = Symbol() as InjectionKey<Ref<typeof ImageViewer | null>>;\nconst contextMenuKey = Symbol() as InjectionKey<Ref<typeof ContextMenu | null>>;\nconst confirmDialogKey = Symbol() as InjectionKey<Ref<typeof ConfirmDialog | null>>;\n\nexport default defineComponent({\n\tname: \"App\",\n\tcomponents: {\n\t\tSidebar,\n\t\tImageViewer,\n\t\tContextMenu,\n\t\tConfirmDialog,\n\t\tMentions,\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\t\tconst overlay = ref(null);\n\t\tconst loungeWindow = ref(null);\n\t\tconst imageViewer = ref(null);\n\t\tconst contextMenu = ref(null);\n\t\tconst confirmDialog = ref(null);\n\n\t\tprovide(imageViewerKey, imageViewer);\n\t\tprovide(contextMenuKey, contextMenu);\n\t\tprovide(confirmDialogKey, confirmDialog);\n\n\t\tconst viewportClasses = computed(() => {\n\t\t\treturn {\n\t\t\t\tnotified: store.getters.highlightCount > 0,\n\t\t\t\t\"menu-open\": store.state.appLoaded && store.state.sidebarOpen,\n\t\t\t\t\"menu-dragging\": store.state.sidebarDragging,\n\t\t\t\t\"userlist-open\": store.state.userlistOpen,\n\t\t\t};\n\t\t});\n\n\t\tconst debouncedResize = ref<DebouncedFunc<() => void>>();\n\t\tconst dayChangeTimeout = ref<ReturnType<typeof setTimeout>>();\n\n\t\tconst escapeKey = () => {\n\t\t\teventbus.emit(\"escapekey\");\n\t\t};\n\n\t\tconst toggleSidebar = (e: ExtendedKeyboardEvent) => {\n\t\t\tif (isIgnoredKeybind(e)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tstore.commit(\"toggleSidebar\");\n\n\t\t\treturn false;\n\t\t};\n\n\t\tconst toggleUserList = (e: ExtendedKeyboardEvent) => {\n\t\t\tif (isIgnoredKeybind(e)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tstore.commit(\"toggleUserlist\");\n\n\t\t\treturn false;\n\t\t};\n\n\t\tconst toggleMentions = () => {\n\t\t\tif (store.state.networks.length !== 0) {\n\t\t\t\teventbus.emit(\"mentions:toggle\");\n\t\t\t}\n\t\t};\n\n\t\tconst msUntilNextDay = () => {\n\t\t\t// Compute how many milliseconds are remaining until the next day starts\n\t\t\tconst today = new Date();\n\t\t\tconst tommorow = new Date(\n\t\t\t\ttoday.getFullYear(),\n\t\t\t\ttoday.getMonth(),\n\t\t\t\ttoday.getDate() + 1\n\t\t\t).getTime();\n\n\t\t\treturn tommorow - today.getTime();\n\t\t};\n\n\t\tconst prepareOpenStates = () => {\n\t\t\tconst viewportWidth = window.innerWidth;\n\t\t\tlet isUserlistOpen = storage.get(\"thelounge.state.userlist\");\n\n\t\t\tif (viewportWidth > constants.mobileViewportPixels) {\n\t\t\t\tstore.commit(\"sidebarOpen\", storage.get(\"thelounge.state.sidebar\") !== \"false\");\n\t\t\t}\n\n\t\t\t// If The Lounge is opened on a small screen (less than 1024px), and we don't have stored\n\t\t\t// user list state, close it by default\n\t\t\tif (viewportWidth >= 1024 && isUserlistOpen !== \"true\" && isUserlistOpen !== \"false\") {\n\t\t\t\tisUserlistOpen = \"true\";\n\t\t\t}\n\n\t\t\tstore.commit(\"userlistOpen\", isUserlistOpen === \"true\");\n\t\t};\n\n\t\tprepareOpenStates();\n\n\t\tonMounted(() => {\n\t\t\tMousetrap.bind(\"esc\", escapeKey);\n\t\t\tMousetrap.bind(\"alt+u\", toggleUserList);\n\t\t\tMousetrap.bind(\"alt+s\", toggleSidebar);\n\t\t\tMousetrap.bind(\"alt+m\", toggleMentions);\n\n\t\t\tdebouncedResize.value = throttle(() => {\n\t\t\t\teventbus.emit(\"resize\");\n\t\t\t}, 100);\n\n\t\t\twindow.addEventListener(\"resize\", debouncedResize.value, {passive: true});\n\n\t\t\t// Emit a daychange event every time the day changes so date markers know when to update themselves\n\t\t\tconst emitDayChange = () => {\n\t\t\t\teventbus.emit(\"daychange\");\n\t\t\t\t// This should always be 24h later but re-computing exact value just in case\n\t\t\t\tdayChangeTimeout.value = setTimeout(emitDayChange, msUntilNextDay());\n\t\t\t};\n\n\t\t\tdayChangeTimeout.value = setTimeout(emitDayChange, msUntilNextDay());\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\tMousetrap.unbind(\"esc\");\n\t\t\tMousetrap.unbind(\"alt+u\");\n\t\t\tMousetrap.unbind(\"alt+s\");\n\t\t\tMousetrap.unbind(\"alt+m\");\n\n\t\t\tif (debouncedResize.value) {\n\t\t\t\twindow.removeEventListener(\"resize\", debouncedResize.value);\n\t\t\t}\n\n\t\t\tif (dayChangeTimeout.value) {\n\t\t\t\tclearTimeout(dayChangeTimeout.value);\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tviewportClasses,\n\t\t\tescapeKey,\n\t\t\ttoggleSidebar,\n\t\t\ttoggleUserList,\n\t\t\ttoggleMentions,\n\t\t\tstore,\n\t\t\toverlay,\n\t\t\tloungeWindow,\n\t\t\timageViewer,\n\t\t\tcontextMenu,\n\t\t\tconfirmDialog,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./App.vue?vue&type=template&id=9dbf2ed8&ts=true\"\nimport script from \"./App.vue?vue&type=script&lang=ts\"\nexport * from \"./App.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import {store} from \"../store\";\nimport socket from \"../socket\";\n\nsocket.on(\"disconnect\", handleDisconnect);\nsocket.on(\"connect_error\", handleDisconnect);\nsocket.on(\"error\", handleDisconnect);\n\nsocket.io.on(\"reconnect_attempt\", function (attempt) {\n\tstore.commit(\"currentUserVisibleError\", `Reconnecting… (attempt ${attempt})`);\n\tupdateLoadingMessage();\n});\n\nsocket.on(\"connecting\", function () {\n\tstore.commit(\"currentUserVisibleError\", \"Connecting…\");\n\tupdateLoadingMessage();\n});\n\nsocket.on(\"connect\", function () {\n\t// Clear send buffer when reconnecting, socket.io would emit these\n\t// immediately upon connection and it will have no effect, so we ensure\n\t// nothing is sent to the server that might have happened.\n\tsocket.sendBuffer = [];\n\n\tstore.commit(\"currentUserVisibleError\", \"Finalizing connection…\");\n\tupdateLoadingMessage();\n});\n\nfunction handleDisconnect(data) {\n\tconst message = String(data.message || data);\n\n\tstore.commit(\"isConnected\", false);\n\n\tif (!socket.io.reconnection()) {\n\t\tstore.commit(\n\t\t\t\"currentUserVisibleError\",\n\t\t\t`Disconnected from the server (${message}), The Lounge does not reconnect in public mode.`\n\t\t);\n\t\tupdateLoadingMessage();\n\t\treturn;\n\t}\n\n\tstore.commit(\"currentUserVisibleError\", `Waiting to reconnect… (${message})`);\n\tupdateLoadingMessage();\n\n\t// If the server shuts down, socket.io skips reconnection\n\t// and we have to manually call connect to start the process\n\t// However, do not reconnect if TL client manually closed the connection\n\t// Access private skipReconnect property through double type assertion\n\tif (\n\t\t(socket.io as unknown as {skipReconnect?: boolean}).skipReconnect &&\n\t\tmessage !== \"io client disconnect\"\n\t) {\n\t\trequestIdleCallback(() => socket.connect(), 2000);\n\t}\n}\n\nfunction requestIdleCallback(callback, timeout) {\n\tif (window.requestIdleCallback) {\n\t\t// During an idle period the user agent will run idle callbacks in FIFO order\n\t\t// until either the idle period ends or there are no more idle callbacks eligible to be run.\n\t\twindow.requestIdleCallback(callback, {timeout});\n\t} else {\n\t\tcallback();\n\t}\n}\n\nfunction updateLoadingMessage() {\n\tconst loading = document.getElementById(\"loading-page-message\");\n\n\tif (loading) {\n\t\tloading.textContent = store.state.currentUserVisibleError;\n\t}\n}\n","import socket from \"../socket\";\nimport storage from \"../localStorage\";\nimport {router, navigate} from \"../router\";\nimport {store} from \"../store\";\nimport location from \"../location\";\nlet lastServerHash: number | null = null;\n\ndeclare global {\n\tinterface Window {\n\t\tg_TheLoungeRemoveLoading?: () => void;\n\t}\n}\n\nsocket.on(\"auth:success\", function () {\n\tstore.commit(\"currentUserVisibleError\", \"Loading messages…\");\n\tupdateLoadingMessage();\n});\n\nsocket.on(\"auth:failed\", async function () {\n\tstorage.remove(\"token\");\n\n\tif (store.state.appLoaded) {\n\t\treturn reloadPage(\"Authentication failed, reloading…\");\n\t}\n\n\tawait showSignIn();\n});\n\nsocket.on(\"auth:start\", async function (serverHash) {\n\t// If we reconnected and serverHash differs, that means the server restarted\n\t// And we will reload the page to grab the latest version\n\tif (lastServerHash && serverHash !== lastServerHash) {\n\t\treturn reloadPage(\"Server restarted, reloading…\");\n\t}\n\n\tlastServerHash = serverHash;\n\n\tconst user = storage.get(\"user\");\n\tconst token = storage.get(\"token\");\n\tconst doFastAuth = user && token;\n\n\t// If we reconnect and no longer have a stored token, reload the page\n\tif (store.state.appLoaded && !doFastAuth) {\n\t\treturn reloadPage(\"Authentication failed, reloading…\");\n\t}\n\n\t// If we have user and token stored, perform auth without showing sign-in first\n\tif (doFastAuth) {\n\t\tstore.commit(\"currentUserVisibleError\", \"Authorizing…\");\n\t\tupdateLoadingMessage();\n\n\t\tlet lastMessage = -1;\n\n\t\tfor (const network of store.state.networks) {\n\t\t\tfor (const chan of network.channels) {\n\t\t\t\tif (chan.messages.length > 0) {\n\t\t\t\t\tconst id = chan.messages[chan.messages.length - 1].id;\n\n\t\t\t\t\tif (lastMessage < id) {\n\t\t\t\t\t\tlastMessage = id;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst openChannel =\n\t\t\t(store.state.activeChannel && store.state.activeChannel.channel.id) || null;\n\n\t\tsocket.emit(\"auth:perform\", {\n\t\t\tuser,\n\t\t\ttoken,\n\t\t\tlastMessage,\n\t\t\topenChannel,\n\t\t\thasConfig: store.state.serverConfiguration !== null,\n\t\t});\n\t} else {\n\t\tawait showSignIn();\n\t}\n});\n\nasync function showSignIn() {\n\t// TODO: this flashes grey background because it takes a little time for vue to mount signin\n\tif (window.g_TheLoungeRemoveLoading) {\n\t\twindow.g_TheLoungeRemoveLoading();\n\t}\n\n\tif (router.currentRoute.value.name !== \"SignIn\") {\n\t\tawait navigate(\"SignIn\");\n\t}\n}\n\nfunction reloadPage(message: string) {\n\tsocket.disconnect();\n\tstore.commit(\"currentUserVisibleError\", message);\n\tlocation.reload();\n}\n\nfunction updateLoadingMessage() {\n\tconst loading = document.getElementById(\"loading-page-message\");\n\n\tif (loading) {\n\t\tloading.textContent = store.state.currentUserVisibleError;\n\t}\n}\n","import socket from \"../socket\";\nimport {cleanIrcMessage} from \"../../../shared/irc\";\nimport {store} from \"../store\";\nimport {switchToChannel} from \"../router\";\nimport {ClientChan, NetChan, ClientMessage} from \"../types\";\nimport {SharedMsg, MessageType} from \"../../../shared/types/msg\";\nimport {ChanType} from \"../../../shared/types/chan\";\n\nlet pop;\n\ntry {\n\tpop = new Audio();\n\tpop.src = \"audio/pop.wav\";\n} catch {\n\tpop = {\n\t\tplay() {},\n\t};\n}\n\nsocket.on(\"msg\", function (data) {\n\tconst receivingChannel = store.getters.findChannel(data.chan);\n\n\tif (!receivingChannel) {\n\t\treturn;\n\t}\n\n\tlet channel = receivingChannel.channel;\n\tlet isActiveChannel =\n\t\tstore.state.activeChannel && store.state.activeChannel.channel === channel;\n\n\t// Display received notices and errors in currently active channel.\n\t// Reloading the page will put them back into the lobby window.\n\tif (data.msg.showInActive) {\n\t\t// We only want to put errors/notices in active channel if they arrive on the same network\n\t\tif (\n\t\t\tstore.state.activeChannel &&\n\t\t\tstore.state.activeChannel.network === receivingChannel.network\n\t\t) {\n\t\t\tchannel = store.state.activeChannel.channel;\n\n\t\t\t// Do not update unread/highlight counters for this channel\n\t\t\t// as we are putting this message in the active channel\n\t\t\tisActiveChannel = true;\n\n\t\t\tif (data.chan === channel.id) {\n\t\t\t\t// If active channel is the intended channel for this message,\n\t\t\t\t// remove the showInActive flag\n\t\t\t\tdelete data.msg.showInActive;\n\t\t\t} else {\n\t\t\t\tdata.chan = channel.id;\n\t\t\t}\n\t\t} else {\n\t\t\tdelete data.msg.showInActive;\n\t\t}\n\t}\n\n\t// Do not set unread counter for channel if it is currently active on this client\n\t// It may increase on the server before it processes channel open event from this client\n\tif (!isActiveChannel) {\n\t\tif (typeof data.highlight !== \"undefined\") {\n\t\t\tchannel.highlight = data.highlight;\n\t\t}\n\n\t\tif (typeof data.unread !== \"undefined\") {\n\t\t\tchannel.unread = data.unread;\n\t\t}\n\t}\n\n\tchannel.messages.push(data.msg);\n\n\tif (data.msg.self) {\n\t\tchannel.firstUnread = data.msg.id;\n\t} else {\n\t\tnotifyMessage(data.chan, channel, store.state.activeChannel, data.msg);\n\t}\n\n\tlet messageLimit = 0;\n\n\tif (store.state.settings.searchEnabled && store.state.settings.enableEnhancedSearch) {\n\t\t// Keep messages in memory for search/navigation - windowing (kind of) handles render performance\n\t\t// Only trim if we have an excessive amount (>10000) to prevent memory issues\n\t\tmessageLimit = 10000;\n\t} else {\n\t\t// if enhanced search is disabled we can be more conservitive\n\t\t// with the amount of messages kept in memory\n\t\tif (!isActiveChannel) {\n\t\t\t// If message arrives in non active channel, keep only 100 messages\n\t\t\tmessageLimit = 100;\n\t\t} else if (channel.scrolledToBottom) {\n\t\t\t// If message arrives in active channel, keep 1500 messages if scroll is currently at the bottom\n\t\t\t// One history load may load up to 1000 messages at once if condendesed or hidden events are enabled\n\t\t\tmessageLimit = 1500;\n\t\t}\n\t}\n\n\tif (messageLimit > 0 && channel.messages.length > messageLimit) {\n\t\tchannel.messages.splice(0, channel.messages.length - messageLimit);\n\t\tchannel.moreHistoryAvailable = true;\n\t}\n\n\tif (channel.type === ChanType.CHANNEL) {\n\t\tupdateUserList(channel, data.msg);\n\t}\n});\n\ndeclare global {\n\t// this extends the interface from lib.dom with additional stuff which is not\n\t// exactly standard but implemented in some browsers\n\tinterface NotificationOptions {\n\t\ttimestamp?: number; // chrome has it, other browsers ignore it\n\t}\n}\n\nfunction notifyMessage(\n\ttargetId: number,\n\tchannel: ClientChan,\n\tactiveChannel: NetChan | undefined,\n\tmsg: ClientMessage\n) {\n\tif (channel.muted) {\n\t\treturn;\n\t}\n\n\tif (\n\t\tmsg.highlight ||\n\t\t(store.state.settings.notifyAllMessages && msg.type === MessageType.MESSAGE)\n\t) {\n\t\tif (!document.hasFocus() || !activeChannel || activeChannel.channel !== channel) {\n\t\t\tif (store.state.settings.notification) {\n\t\t\t\ttry {\n\t\t\t\t\tpop.play();\n\t\t\t\t} catch {\n\t\t\t\t\t// On mobile, sounds can not be played without user interaction.\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tstore.state.settings.desktopNotifications &&\n\t\t\t\t\"Notification\" in window &&\n\t\t\t\tNotification.permission === \"granted\"\n\t\t\t) {\n\t\t\t\tlet title: string;\n\t\t\t\tlet body: string;\n\t\t\t\t// TODO: fix msg type and get rid of that conditional\n\t\t\t\tconst nick = msg.from && msg.from.nick ? msg.from.nick : \"unkonown\";\n\n\t\t\t\tif (msg.type === MessageType.INVITE) {\n\t\t\t\t\ttitle = \"New channel invite:\";\n\t\t\t\t\tbody = nick + \" invited you to \" + msg.channel;\n\t\t\t\t} else {\n\t\t\t\t\ttitle = nick;\n\n\t\t\t\t\tif (channel.type !== ChanType.QUERY) {\n\t\t\t\t\t\ttitle += ` (${channel.name})`;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (msg.type === MessageType.MESSAGE) {\n\t\t\t\t\t\ttitle += \" says:\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// TODO: fix msg type and get rid of that conditional\n\t\t\t\t\tbody = cleanIrcMessage(msg.text ? msg.text : \"\");\n\t\t\t\t}\n\n\t\t\t\tconst timestamp = Date.parse(String(msg.time));\n\n\t\t\t\ttry {\n\t\t\t\t\tif (store.state.hasServiceWorker) {\n\t\t\t\t\t\tnavigator.serviceWorker.ready\n\t\t\t\t\t\t\t.then((registration) => {\n\t\t\t\t\t\t\t\tregistration.active?.postMessage({\n\t\t\t\t\t\t\t\t\ttype: \"notification\",\n\t\t\t\t\t\t\t\t\tchanId: targetId,\n\t\t\t\t\t\t\t\t\ttimestamp: timestamp,\n\t\t\t\t\t\t\t\t\ttitle: title,\n\t\t\t\t\t\t\t\t\tbody: body,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\t\t// no-op\n\t\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst notify = new Notification(title, {\n\t\t\t\t\t\t\ttag: `chan-${targetId}`,\n\t\t\t\t\t\t\tbadge: \"img/icon-alerted-black-transparent-bg-72x72px.png\",\n\t\t\t\t\t\t\ticon: \"img/icon-alerted-grey-bg-192x192px.png\",\n\t\t\t\t\t\t\tbody: body,\n\t\t\t\t\t\t\ttimestamp: timestamp,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tnotify.addEventListener(\"click\", function () {\n\t\t\t\t\t\t\tthis.close();\n\t\t\t\t\t\t\twindow.focus();\n\n\t\t\t\t\t\t\tconst channelTarget = store.getters.findChannel(targetId);\n\n\t\t\t\t\t\t\tif (channelTarget) {\n\t\t\t\t\t\t\t\tswitchToChannel(channelTarget.channel);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// `new Notification(...)` is not supported and should be silenced.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction updateUserList(channel: ClientChan, msg: SharedMsg) {\n\tswitch (msg.type) {\n\t\tcase MessageType.MESSAGE: // fallthrough\n\n\t\tcase MessageType.ACTION: {\n\t\t\tconst user = channel.users.find((u) => u.nick === msg.from?.nick);\n\n\t\t\tif (user) {\n\t\t\t\tuser.lastMessage = new Date(msg.time).getTime() || Date.now();\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase MessageType.QUIT: // fallthrough\n\n\t\tcase MessageType.PART: {\n\t\t\tconst idx = channel.users.findIndex((u) => u.nick === msg.from?.nick);\n\n\t\t\tif (idx > -1) {\n\t\t\t\tchannel.users.splice(idx, 1);\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase MessageType.KICK: {\n\t\t\tconst idx = channel.users.findIndex((u) => u.nick === msg.target?.nick);\n\n\t\t\tif (idx > -1) {\n\t\t\t\tchannel.users.splice(idx, 1);\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t}\n}\n","import {ClientChan, ClientMessage} from \"./types\";\nimport {SharedNetworkChan} from \"../../shared/types/network\";\nimport {SharedMsg, MessageType} from \"../../shared/types/msg\";\nimport {ChanType} from \"../../shared/types/chan\";\n\nexport function toClientChan(shared: SharedNetworkChan): ClientChan {\n\tconst history: string[] = [\"\"].concat(\n\t\tshared.messages\n\t\t\t.filter((m) => m.self && m.text && m.type === MessageType.MESSAGE)\n\t\t\t// TS is too stupid to see the nil guard on filter... so we monkey patch it\n\t\t\t.map((m): string => (m.text ? m.text : \"\"))\n\t\t\t.reverse()\n\t\t\t.slice(0, 99)\n\t);\n\t// filter the unused vars\n\tconst {messages, ...props} = shared;\n\tconst channel: ClientChan = {\n\t\t...props,\n\t\teditTopic: false,\n\t\tpendingMessage: \"\",\n\t\tinputHistoryPosition: 0,\n\t\thistoryLoading: false,\n\t\tscrolledToBottom: true,\n\t\tusers: [],\n\t\tusersOutdated: shared.type === ChanType.CHANNEL ? true : false,\n\t\tmoreHistoryAvailable: shared.totalMessages > shared.messages.length,\n\t\tinputHistory: history,\n\t\tmessages: sharedMsgToClientMsg(messages),\n\t\t// Initialize groups for reactivity (will be populated by SPGROUPS)\n\t\tgroups: shared.groups || undefined,\n\t};\n\treturn channel;\n}\n\nfunction sharedMsgToClientMsg(shared: SharedMsg[]): ClientMessage[] {\n\t// TODO: this is a stub for now, we will want to populate client specific stuff here\n\treturn shared;\n}\n","import socket from \"../socket\";\nimport storage from \"../localStorage\";\nimport {toClientChan} from \"../chan\";\nimport {router, switchToChannel, navigate} from \"../router\";\nimport {store} from \"../store\";\nimport parseIrcUri from \"../helpers/parseIrcUri\";\nimport {ClientNetwork, ClientChan} from \"../types\";\nimport {SharedNetwork, SharedNetworkChan} from \"../../../shared/types/network\";\n\nsocket.on(\"init\", async function (data) {\n\tstore.commit(\"networks\", mergeNetworkData(data.networks));\n\tstore.commit(\"isConnected\", true);\n\tstore.commit(\"currentUserVisibleError\", null);\n\n\tif (data.token) {\n\t\tstorage.set(\"token\", data.token);\n\t}\n\n\tif (!store.state.appLoaded) {\n\t\tstore.commit(\"appLoaded\");\n\n\t\tsocket.emit(\"setting:get\");\n\n\t\ttry {\n\t\t\tawait router.isReady();\n\t\t} catch {\n\t\t\t// if the router throws an error, it means the route isn't matched,\n\t\t\t// so we can continue on.\n\t\t}\n\n\t\tif (window.g_TheLoungeRemoveLoading) {\n\t\t\twindow.g_TheLoungeRemoveLoading();\n\t\t}\n\n\t\tif (await handleQueryParams()) {\n\t\t\t// If we handled query parameters like irc:// links or just general\n\t\t\t// connect parameters in public mode, then nothing to do here\n\t\t\treturn;\n\t\t}\n\n\t\t// If we are on an unknown route or still on SignIn component\n\t\t// then we can open last known channel on server, or Connect window if none\n\t\tif (!router.currentRoute?.value?.name || router.currentRoute?.value?.name === \"SignIn\") {\n\t\t\tconst channel = store.getters.findChannel(data.active);\n\n\t\t\tif (channel) {\n\t\t\t\tswitchToChannel(channel.channel);\n\t\t\t} else if (store.state.networks.length > 0) {\n\t\t\t\t// Server is telling us to open a channel that does not exist\n\t\t\t\t// For example, it can be unset if you first open the page after server start\n\t\t\t\tswitchToChannel(store.state.networks[0].channels[0]);\n\t\t\t} else {\n\t\t\t\tawait navigate(\"Connect\");\n\t\t\t}\n\t\t}\n\t}\n});\n\nfunction mergeNetworkData(newNetworks: SharedNetwork[]): ClientNetwork[] {\n\tconst stored = storage.get(\"thelounge.networks.collapsed\");\n\tconst collapsedNetworks = stored ? new Set(JSON.parse(stored)) : new Set();\n\tconst result: ReturnType<typeof mergeNetworkData> = [];\n\n\tfor (const sharedNet of newNetworks) {\n\t\tconst currentNetwork = store.getters.findNetwork(sharedNet.uuid);\n\n\t\t// If this network is new, set some default variables and initalize channel variables\n\t\tif (!currentNetwork) {\n\t\t\tconst newNet: ClientNetwork = {\n\t\t\t\t...sharedNet,\n\t\t\t\tchannels: sharedNet.channels.map(toClientChan),\n\t\t\t\tisJoinChannelShown: false,\n\t\t\t\tisCollapsed: collapsedNetworks.has(sharedNet.uuid),\n\t\t\t};\n\t\t\tresult.push(newNet);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Merge received network object into existing network object on the client\n\t\t// so the object reference stays the same (e.g. for currentChannel state)\n\t\tfor (const key in sharedNet) {\n\t\t\tif (!Object.prototype.hasOwnProperty.call(sharedNet, key)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Channels require extra care to be merged correctly\n\t\t\tif (key === \"channels\") {\n\t\t\t\tcurrentNetwork.channels = mergeChannelData(\n\t\t\t\t\tcurrentNetwork.channels,\n\t\t\t\t\tsharedNet.channels\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcurrentNetwork[key] = sharedNet[key];\n\t\t\t}\n\t\t}\n\n\t\tresult.push(currentNetwork);\n\t}\n\n\treturn result;\n}\n\nfunction mergeChannelData(\n\toldChannels: ClientChan[],\n\tnewChannels: SharedNetworkChan[]\n): ClientChan[] {\n\tconst result: ReturnType<typeof mergeChannelData> = [];\n\n\tfor (const newChannel of newChannels) {\n\t\tconst currentChannel = oldChannels.find((chan) => chan.id === newChannel.id);\n\n\t\tif (!currentChannel) {\n\t\t\t// This is a new channel that was joined while client was disconnected, initialize it\n\t\t\tconst current = toClientChan(newChannel);\n\t\t\tresult.push(current);\n\t\t\temitNamesOrMarkUsersOudated(current); // TODO: this should not carry logic like that\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Merge received channel object into existing currentChannel\n\t\t// so the object references are exactly the same (e.g. in store.state.activeChannel)\n\n\t\temitNamesOrMarkUsersOudated(currentChannel); // TODO: this should not carry logic like that\n\n\t\t// Reconnection only sends new messages, so merge it on the client\n\t\t// Only concat if server sent us less than 100 messages so we don't introduce gaps\n\t\tif (currentChannel.messages && newChannel.messages.length < 100) {\n\t\t\tcurrentChannel.messages = currentChannel.messages.concat(newChannel.messages);\n\t\t} else {\n\t\t\tcurrentChannel.messages = newChannel.messages;\n\t\t}\n\n\t\t// TODO: this is copies more than what the compiler knows about\n\t\tfor (const key in newChannel) {\n\t\t\tif (!Object.hasOwn(currentChannel, key)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (key === \"messages\") {\n\t\t\t\t// already handled\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcurrentChannel[key] = newChannel[key];\n\t\t}\n\n\t\tresult.push(currentChannel);\n\t}\n\n\treturn result;\n}\n\nfunction emitNamesOrMarkUsersOudated(chan: ClientChan) {\n\tif (store.state.activeChannel && store.state.activeChannel.channel === chan) {\n\t\t// For currently open channel, request the user list straight away\n\t\tsocket.emit(\"names\", {\n\t\t\ttarget: chan.id,\n\t\t});\n\t\tchan.usersOutdated = false;\n\t\treturn;\n\t}\n\n\t// For all other channels, mark the user list as outdated\n\t// so an update will be requested whenever user switches to these channels\n\tchan.usersOutdated = true;\n}\n\nasync function handleQueryParams() {\n\tif (!(\"URLSearchParams\" in window)) {\n\t\treturn false;\n\t}\n\n\tconst params = new URLSearchParams(document.location.search);\n\n\tif (params.has(\"uri\")) {\n\t\t// Set default connection settings from IRC protocol links\n\t\tconst uri = params.get(\"uri\");\n\t\tconst queryParams = parseIrcUri(String(uri));\n\t\tremoveQueryParams();\n\t\tawait router.push({name: \"Connect\", query: queryParams});\n\t\treturn true;\n\t}\n\n\tif (document.body.classList.contains(\"public\") && document.location.search) {\n\t\t// Set default connection settings from url params\n\t\tconst queryParams = Object.fromEntries(params.entries());\n\t\tremoveQueryParams();\n\t\tawait router.push({name: \"Connect\", query: queryParams});\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n// Remove query parameters from url without reloading the page\nfunction removeQueryParams() {\n\tconst cleanUri = window.location.origin + window.location.pathname + window.location.hash;\n\twindow.history.replaceState(null, \"\", cleanUri);\n}\n","import constants from \"../constants\";\nimport socket from \"../socket\";\n\nsocket.on(\"commands\", function (commands) {\n\tif (commands) {\n\t\tconstants.commands = commands;\n\t}\n});\n","export default (stringUri: string) => {\n\tconst data = {\n\t\tname: \"\",\n\t\thost: \"\",\n\t\tport: \"\",\n\t\tjoin: \"\",\n\t\ttls: false,\n\t};\n\n\ttry {\n\t\t// https://tools.ietf.org/html/draft-butcher-irc-url-04\n\t\tconst uri = new URL(stringUri);\n\n\t\t// Replace protocol with a \"special protocol\" (that's what it's called in WHATWG spec)\n\t\t// So that the uri can be properly parsed\n\t\tif (uri.protocol === \"irc:\") {\n\t\t\turi.protocol = \"http:\";\n\n\t\t\tif (!uri.port) {\n\t\t\t\turi.port = \"6667\";\n\t\t\t}\n\t\t} else if (uri.protocol === \"ircs:\") {\n\t\t\turi.protocol = \"https:\";\n\n\t\t\tif (!uri.port) {\n\t\t\t\turi.port = \"6697\";\n\t\t\t}\n\n\t\t\tdata.tls = true;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!uri.hostname) {\n\t\t\treturn {};\n\t\t}\n\n\t\tdata.host = data.name = uri.hostname;\n\t\tdata.port = uri.port;\n\n\t\tlet channel = \"\";\n\n\t\tif (uri.pathname.length > 1) {\n\t\t\tchannel = uri.pathname.substr(1); // Remove slash\n\t\t}\n\n\t\tif (uri.hash.length > 1) {\n\t\t\tchannel += uri.hash;\n\t\t}\n\n\t\t// We don't split channels or append # here because the connect window takes care of that\n\t\tdata.join = channel;\n\t} catch {\n\t\t// do nothing on invalid uri\n\t}\n\n\treturn data;\n};\n","import socket from \"../socket\";\nimport {store} from \"../store\";\nimport {switchToChannel} from \"../router\";\nimport {ClientChan} from \"../types\";\nimport {toClientChan} from \"../chan\";\n\nsocket.on(\"join\", function (data) {\n\tconst network = store.getters.findNetwork(data.network);\n\n\tif (!network) {\n\t\treturn;\n\t}\n\n\tconst clientChan: ClientChan = toClientChan(data.chan);\n\tnetwork.channels.splice(data.index || -1, 0, clientChan);\n\n\t// Queries do not automatically focus, unless the user did a whois\n\tif (data.chan.type === \"query\" && !data.shouldOpen) {\n\t\treturn;\n\t}\n\n\tconst chan = store.getters.findChannel(data.chan.id);\n\n\tif (chan) {\n\t\tswitchToChannel(chan.channel);\n\t} else {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(\"Could not find channel\", data.chan.id);\n\t}\n});\n","import {nextTick} from \"vue\";\n\nimport socket from \"../socket\";\nimport {store} from \"../store\";\nimport {MessageType} from \"../../../shared/types/msg\";\n\nsocket.on(\"more\", async (data) => {\n\tconst channel = store.getters.findChannel(data.chan)?.channel;\n\n\tif (!channel) {\n\t\treturn;\n\t}\n\n\tchannel.inputHistory = channel.inputHistory.concat(\n\t\tdata.messages\n\t\t\t.filter((m) => m.self && m.text && m.type === MessageType.MESSAGE)\n\t\t\t// TS is too stupid to see the guard in .filter(), so we monkey patch it\n\t\t\t// to please the compiler\n\t\t\t.map((m) => (m.text ? m.text : \"\"))\n\t\t\t.reverse()\n\t\t\t.slice(0, 100 - channel.inputHistory.length)\n\t);\n\tchannel.moreHistoryAvailable =\n\t\tdata.totalMessages > channel.messages.length + data.messages.length;\n\tchannel.messages.unshift(...data.messages);\n\n\tawait nextTick();\n\tchannel.historyLoading = false;\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\nimport {ClientMention} from \"../types\";\nimport {SharedMention} from \"../../../shared/types/mention\";\n\nsocket.on(\"mentions:list\", function (data) {\n\tstore.commit(\"mentions\", data.map(sharedToClientMention));\n});\n\nfunction sharedToClientMention(shared: SharedMention): ClientMention {\n\tconst mention: ClientMention = {\n\t\t...shared,\n\t\tlocaletime: \"\", // TODO: can't be right\n\t\tchannel: null,\n\t};\n\treturn mention;\n}\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"msg:preview\", function (data) {\n\tconst netChan = store.getters.findChannel(data.chan);\n\tconst message = netChan?.channel.messages.find((m) => m.id === data.id);\n\n\tif (!message || !message.previews) {\n\t\treturn;\n\t}\n\n\tconst previewIndex = message.previews.findIndex((m) => m.link === data.preview.link);\n\n\tif (previewIndex > -1) {\n\t\tmessage.previews[previewIndex] = data.preview;\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\nimport {switchToChannel} from \"../router\";\n\nsocket.on(\"msg:special\", function (data) {\n\tconst netChan = store.getters.findChannel(data.chan);\n\n\tif (!netChan) {\n\t\treturn;\n\t}\n\n\tnetChan.channel.data = data.data;\n\tswitchToChannel(netChan.channel);\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"names\", function (data) {\n\tconst netChan = store.getters.findChannel(data.id);\n\n\tif (netChan) {\n\t\tnetChan.channel.users = data.users;\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\nimport {switchToChannel} from \"../router\";\nimport {toClientChan} from \"../chan\";\nimport {ClientNetwork} from \"../types\";\nimport {ChanState} from \"../../../shared/types/chan\";\n\nsocket.on(\"network\", function (data) {\n\tconst network: ClientNetwork = {\n\t\t...data.network,\n\t\tchannels: data.network.channels.map(toClientChan),\n\t\tisJoinChannelShown: false,\n\t\tisCollapsed: false,\n\t};\n\n\tstore.commit(\"networks\", [...store.state.networks, network]);\n\n\t// Open last channel specified in `join`\n\tswitchToChannel(network.channels[network.channels.length - 1]);\n});\n\nsocket.on(\"network:options\", function (data) {\n\tconst network = store.getters.findNetwork(data.network);\n\n\tif (network) {\n\t\tnetwork.serverOptions = data.serverOptions;\n\t}\n});\n\nsocket.on(\"network:status\", function (data) {\n\tconst network = store.getters.findNetwork(data.network);\n\n\tif (!network) {\n\t\treturn;\n\t}\n\n\tnetwork.status.connected = data.connected;\n\tnetwork.status.secure = data.secure;\n\n\tif (!data.connected) {\n\t\tnetwork.channels.forEach((channel) => {\n\t\t\tchannel.users = []; // TODO: untangle this\n\t\t\tchannel.state = ChanState.PARTED;\n\t\t});\n\t}\n});\n\nsocket.on(\"channel:state\", function (data) {\n\tconst channel = store.getters.findChannel(data.chan);\n\n\tif (channel) {\n\t\tchannel.channel.state = data.state;\n\t}\n});\n\nsocket.on(\"network:info\", function (data) {\n\tconst network = store.getters.findNetwork(data.uuid);\n\n\tif (!network) {\n\t\treturn;\n\t}\n\n\tfor (const key in data) {\n\t\tnetwork[key] = data[key];\n\t}\n});\n\nsocket.on(\"network:name\", function (data) {\n\tconst network = store.getters.findNetwork(data.uuid);\n\n\tif (network) {\n\t\tnetwork.name = network.channels[0].name = data.name;\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"nick\", function (data) {\n\tconst network = store.getters.findNetwork(data.network);\n\n\tif (network) {\n\t\tnetwork.nick = data.nick;\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\n// Sync unread badge and marker when other clients open a channel\nsocket.on(\"open\", function (id) {\n\tif (id < 1) {\n\t\treturn;\n\t}\n\n\t// Don't do anything if the channel is active on this client\n\tif (store.state.activeChannel && store.state.activeChannel.channel.id === id) {\n\t\treturn;\n\t}\n\n\t// Clear the unread badge\n\tconst channel = store.getters.findChannel(id);\n\n\tif (channel) {\n\t\tchannel.channel.highlight = 0;\n\t\tchannel.channel.unread = 0;\n\n\t\tif (channel.channel.messages.length > 0) {\n\t\t\tchannel.channel.firstUnread =\n\t\t\t\tchannel.channel.messages[channel.channel.messages.length - 1].id;\n\t\t}\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\nimport {switchToChannel} from \"../router\";\n\nsocket.on(\"part\", async function (data) {\n\t// When parting from the active channel/query, jump to the network's lobby\n\tif (store.state.activeChannel && store.state.activeChannel.channel.id === data.chan) {\n\t\tswitchToChannel(store.state.activeChannel.network.channels[0]);\n\t}\n\n\tconst channel = store.getters.findChannel(data.chan);\n\n\tif (!channel) {\n\t\treturn;\n\t}\n\n\tconst index = channel.network.channels.findIndex((c) => c.id === data.chan);\n\tchannel.network.channels.splice(index, 1);\n\n\tawait store.dispatch(\"partChannel\", channel);\n});\n","import socket from \"../socket\";\nimport {switchToChannel, navigate} from \"../router\";\nimport {store} from \"../store\";\n\nsocket.on(\"quit\", async function (data) {\n\t// If we're in a channel, and it's on the network that is being removed,\n\t// then open another channel window\n\tconst isCurrentNetworkBeingRemoved =\n\t\tstore.state.activeChannel && store.state.activeChannel.network.uuid === data.network;\n\n\tstore.commit(\"removeNetwork\", data.network);\n\n\tif (!isCurrentNetworkBeingRemoved) {\n\t\treturn;\n\t}\n\n\tif (store.state.networks.length > 0) {\n\t\tswitchToChannel(store.state.networks[0].channels[0]);\n\t} else {\n\t\tawait navigate(\"Connect\");\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"sync_sort:networks\", function (data) {\n\tstore.commit(\"sortNetworks\", (a, b) => data.order.indexOf(a.uuid) - data.order.indexOf(b.uuid));\n});\n\nsocket.on(\"sync_sort:channels\", function (data) {\n\tconst network = store.getters.findNetwork(data.network);\n\n\tif (!network) {\n\t\treturn;\n\t}\n\n\tnetwork.channels.sort((a, b) => data.order.indexOf(a.id) - data.order.indexOf(b.id));\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"topic\", function (data) {\n\tconst channel = store.getters.findChannel(data.chan);\n\n\tif (channel) {\n\t\tchannel.channel.topic = data.topic;\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"users\", function (data) {\n\tif (store.state.activeChannel && store.state.activeChannel.channel.id === data.chan) {\n\t\treturn socket.emit(\"names\", {\n\t\t\ttarget: data.chan,\n\t\t});\n\t}\n\n\tconst channel = store.getters.findChannel(data.chan);\n\n\tif (channel) {\n\t\tchannel.channel.usersOutdated = true;\n\t}\n});\n","import socket from \"../socket\";\nimport Auth from \"../auth\";\n\nsocket.on(\"sign-out\", function () {\n\tAuth.signout();\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"sessions:list\", function (data) {\n\tdata.sort((a, b) => b.lastUse - a.lastUse);\n\tstore.commit(\"sessions\", data);\n});\n","import socket from \"../socket\";\nimport upload from \"../upload\";\nimport {store} from \"../store\";\n\nsocket.once(\"configuration\", function (data) {\n\tstore.commit(\"serverConfiguration\", data);\n\n\t// 'theme' setting depends on serverConfiguration.themes so\n\t// settings cannot be applied before this point\n\tvoid store.dispatch(\"settings/applyAll\");\n\n\tif (data.fileUpload) {\n\t\tupload.initialize();\n\t}\n\n\t// If localStorage contains a theme that does not exist on this server, switch\n\t// back to its default theme.\n\tconst currentTheme = data.themes.find((t) => t.name === store.state.settings.theme);\n\n\tif (currentTheme === undefined) {\n\t\tvoid store.dispatch(\"settings/update\", {\n\t\t\tname: \"theme\",\n\t\t\tvalue: data.defaultTheme,\n\t\t\tsync: true,\n\t\t});\n\t} else if (currentTheme.themeColor) {\n\t\t(document.querySelector('meta[name=\"theme-color\"]') as HTMLMetaElement).content =\n\t\t\tcurrentTheme.themeColor;\n\t}\n\n\tif (document.body.classList.contains(\"public\")) {\n\t\twindow.addEventListener(\"beforeunload\", (e) => {\n\t\t\te.preventDefault();\n\t\t\te.returnValue = \"Are you sure you want to navigate away from this page?\";\n\t\t});\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"changelog\", function (data) {\n\tstore.commit(\"versionData\", data);\n\tstore.commit(\"versionDataExpired\", false);\n\n\tlet status;\n\n\tif (data.latest) {\n\t\tstatus = \"new-version\";\n\t} else if (data.packages) {\n\t\tstatus = \"new-packages\";\n\t} else if (data.current.changelog) {\n\t\tstatus = \"up-to-date\";\n\t} else {\n\t\tstatus = \"error\";\n\t}\n\n\tstore.commit(\"versionStatus\", status);\n\n\t// When there is a button to refresh the checker available, display it when\n\t// data is expired. Before that, server would return same information anyway.\n\tif (data.expiresAt) {\n\t\tconst expires = data.expiresAt - Date.now();\n\n\t\tif (expires > 0) {\n\t\t\tsetTimeout(() => store.commit(\"versionDataExpired\", true), expires);\n\t\t} else {\n\t\t\tstore.commit(\"versionDataExpired\", true);\n\t\t}\n\t}\n});\n\nsocket.on(\"changelog:newversion\", () => {\n\tif (!store.state.serverConfiguration) {\n\t\treturn;\n\t}\n\n\tstore.state.serverConfiguration.isUpdateAvailable = true;\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"setting:new\", async function (data) {\n\tconst name = data.name;\n\tconst value = data.value;\n\tawait store.dispatch(\"settings/update\", {name, value, sync: false});\n});\n\nsocket.on(\"setting:all\", async function (settings) {\n\tconst serverHasSettings = Object.keys(settings).length > 0;\n\n\tstore.commit(\"serverHasSettings\", serverHasSettings);\n\n\tif (serverHasSettings) {\n\t\tfor (const name in settings) {\n\t\t\tawait store.dispatch(\"settings/update\", {name, value: settings[name], sync: false});\n\t\t}\n\t} else {\n\t\tawait store.dispatch(\"settings/syncAll\");\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"history:clear\", function (data) {\n\tconst netChan = store.getters.findChannel(data.target);\n\n\tif (netChan?.channel) {\n\t\tnetChan.channel.messages = [];\n\t\tnetChan.channel.unread = 0;\n\t\tnetChan.channel.highlight = 0;\n\t\tnetChan.channel.firstUnread = 0;\n\t\tnetChan.channel.moreHistoryAvailable = false;\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"search:results\", (response) => {\n\tconst pendingQuery = store.state.messageSearchPendingQuery;\n\n\tif (\n\t\t!pendingQuery ||\n\t\tpendingQuery.channelName !== response.channelName ||\n\t\tpendingQuery.networkUuid !== response.networkUuid ||\n\t\tpendingQuery.offset !== response.offset ||\n\t\tpendingQuery.searchTerm !== response.searchTerm\n\t) {\n\t\t// This is a response from a search that we are not interested in.\n\t\t// The user may have entered a different search while one was still in flight.\n\t\t// We can simply drop it on the floor.\n\t\treturn;\n\t}\n\n\tstore.commit(\"messageSearchPendingQuery\", null);\n\n\tif (store.state.messageSearchResults) {\n\t\tstore.commit(\"addMessageSearchResults\", response);\n\t\treturn;\n\t}\n\n\tstore.commit(\"messageSearchResults\", {results: response.results});\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\nimport {ChanType} from \"../../../shared/types/chan\";\n\nsocket.on(\"mute:changed\", (response) => {\n\tconst {target, status} = response;\n\n\tconst netChan = store.getters.findChannel(target);\n\n\tif (netChan?.channel.type === ChanType.LOBBY) {\n\t\tfor (const chan of netChan.network.channels) {\n\t\t\tif (chan.type !== ChanType.SPECIAL) {\n\t\t\t\tchan.muted = status;\n\t\t\t}\n\t\t}\n\t} else if (netChan) {\n\t\tnetChan.channel.muted = status;\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"pin:changed\", (response) => {\n\tconst {target, status} = response;\n\n\tconst netChan = store.getters.findChannel(target);\n\n\tif (netChan) {\n\t\tnetChan.channel.pinned = status;\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\n// Handle channel groups from seedpool/enhanced capable servers\nsocket.on(\"channel:groups\", (data) => {\n\tconst channel = store.getters.findChannel(data.chan)?.channel;\n\n\tif (!channel) {\n\t\treturn;\n\t}\n\n\t// Create a new array to ensure Vue reactivity detects the change\n\tchannel.groups = [...data.groups];\n});\n","import Mousetrap from \"mousetrap\";\n\nimport {store} from \"./store\";\nimport {switchToChannel, router, navigate} from \"./router\";\nimport isChannelCollapsed from \"./helpers/isChannelCollapsed\";\nimport isIgnoredKeybind from \"./helpers/isIgnoredKeybind\";\nimport listenForTwoFingerSwipes from \"./helpers/listenForTwoFingerSwipes\";\nimport {ClientChan} from \"./types\";\nimport {ChanType} from \"../../shared/types/chan\";\n\n// Switch to the next/previous window in the channel list.\nMousetrap.bind([\"alt+up\", \"alt+down\"], function (e, keys) {\n\tif (isIgnoredKeybind(e)) {\n\t\treturn true;\n\t}\n\n\tnavigateWindow(keys.split(\"+\").pop() === \"up\" ? -1 : 1);\n\n\treturn false;\n});\n\nlistenForTwoFingerSwipes(function (cardinalDirection: string) {\n\tif (cardinalDirection === \"e\" || cardinalDirection === \"w\") {\n\t\tnavigateWindow(cardinalDirection === \"e\" ? -1 : 1);\n\t}\n});\n\nfunction navigateWindow(direction: number) {\n\tif (store.state.networks.length === 0) {\n\t\treturn;\n\t}\n\n\tconst flatChannels: ClientChan[] = [];\n\tlet index = -1;\n\n\tfor (const network of store.state.networks) {\n\t\tfor (const channel of network.channels) {\n\t\t\tif (isChannelCollapsed(network, channel)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (index === -1 && store.state.activeChannel?.channel === channel) {\n\t\t\t\tindex = flatChannels.length;\n\t\t\t}\n\n\t\t\tflatChannels.push(channel);\n\t\t}\n\t}\n\n\t// Circular array, and a modulo bug workaround because in JS it stays negative\n\tconst length = flatChannels.length;\n\tindex = (((index + direction) % length) + length) % length;\n\n\tjumpToChannel(flatChannels[index]);\n}\n\n// Switch to the next/previous lobby in the channel list\nMousetrap.bind([\"alt+shift+up\", \"alt+shift+down\"], function (e, keys) {\n\tif (isIgnoredKeybind(e)) {\n\t\treturn true;\n\t}\n\n\tconst length = store.state.networks.length;\n\n\tif (length === 0) {\n\t\treturn false;\n\t}\n\n\tconst direction = keys.split(\"+\").pop() === \"up\" ? -1 : 1;\n\tlet index = 0;\n\n\t// If we're in another window, jump to first lobby\n\tif (store.state.activeChannel) {\n\t\tindex = store.state.networks.findIndex((n) => n === store.state.activeChannel?.network);\n\n\t\t// If we're in a channel, and it's not the lobby, jump to lobby of this network when going up\n\t\tif (direction !== -1 || store.state.activeChannel?.channel.type === ChanType.LOBBY) {\n\t\t\tindex = (((index + direction) % length) + length) % length;\n\t\t}\n\t}\n\n\tjumpToChannel(store.state.networks[index].channels[0]);\n\n\treturn false;\n});\n\n// Switch to the next/previous unread chat\nMousetrap.bind([\"alt+mod+up\", \"alt+mod+down\"], function (e, keys) {\n\tif (isIgnoredKeybind(e)) {\n\t\treturn true;\n\t}\n\n\tconst channels = store.state.networks\n\t\t.map((net) =>\n\t\t\tnet.channels.filter(\n\t\t\t\t(chan) => chan.unread || chan === store.state.activeChannel?.channel\n\t\t\t)\n\t\t)\n\t\t.flat();\n\n\tif (channels.length === 0) {\n\t\treturn;\n\t}\n\n\tlet index = channels.findIndex((chan) => chan === store.state.activeChannel?.channel);\n\n\tconst length = channels.length;\n\tconst direction = keys.split(\"+\").pop() === \"up\" ? -1 : 1;\n\tindex = (((index + direction) % length) + length) % length;\n\n\tjumpToChannel(channels[index]);\n\n\treturn false;\n});\n\n// Jump to the first window with a highlight in it, or the first with unread\n// activity if there are none with highlights.\nMousetrap.bind([\"alt+a\"], function (e) {\n\tif (isIgnoredKeybind(e)) {\n\t\treturn true;\n\t}\n\n\tlet targetChannel;\n\n\touter_loop: for (const network of store.state.networks) {\n\t\tfor (const chan of network.channels) {\n\t\t\tif (chan.highlight) {\n\t\t\t\ttargetChannel = chan;\n\t\t\t\tbreak outer_loop;\n\t\t\t}\n\n\t\t\tif (chan.unread && !targetChannel) {\n\t\t\t\ttargetChannel = chan;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (targetChannel) {\n\t\tjumpToChannel(targetChannel);\n\t}\n\n\treturn false;\n});\n\n// Show the help menu.\nMousetrap.bind([\"alt+/\"], function (e) {\n\tif (isIgnoredKeybind(e)) {\n\t\treturn true;\n\t}\n\n\t/* eslint-disable no-console */\n\tnavigate(\"Help\").catch((err) => console.log(err));\n\treturn false;\n});\n\nfunction jumpToChannel(targetChannel: ClientChan) {\n\tswitchToChannel(targetChannel);\n\n\tconst element = document.querySelector(\n\t\t`#sidebar .channel-list-item[aria-controls=\"#chan-${targetChannel.id}\"]`\n\t);\n\n\tif (element) {\n\t\tscrollIntoViewNicely(element);\n\t}\n}\n\n// Ignored keys which should not automatically focus the input bar\nconst ignoredKeys = {\n\t8: true, // Backspace\n\t9: true, // Tab\n\t12: true, // Clear\n\t16: true, // Shift\n\t17: true, // Control\n\t18: true, // Alt\n\t19: true, // Pause\n\t20: true, // CapsLock\n\t27: true, // Escape\n\t35: true, // End\n\t36: true, // Home\n\t37: true, // ArrowLeft\n\t38: true, // ArrowUp\n\t39: true, // ArrowRight\n\t40: true, // ArrowDown\n\t45: true, // Insert\n\t46: true, // Delete\n\t112: true, // F1\n\t113: true, // F2\n\t114: true, // F3\n\t115: true, // F4\n\t116: true, // F5\n\t117: true, // F6\n\t118: true, // F7\n\t119: true, // F8\n\t120: true, // F9\n\t121: true, // F10\n\t122: true, // F11\n\t123: true, // F12\n\t144: true, // NumLock\n\t145: true, // ScrollLock\n\t224: true, // Meta\n};\n\ndocument.addEventListener(\"keydown\", (e) => {\n\t// Allow navigating back to the previous page when on the help screen.\n\tif (e.key === \"Escape\" && router.currentRoute.value.name === \"Help\") {\n\t\trouter.go(-1);\n\t\treturn;\n\t}\n\n\t// Ignore any key that uses alt modifier\n\t// Ignore keys defined above\n\tif (e.altKey || ignoredKeys[e.which]) {\n\t\treturn;\n\t}\n\n\t// Ignore all ctrl keys except for ctrl+v to allow pasting\n\tif ((e.ctrlKey || e.metaKey) && e.which !== 86) {\n\t\treturn;\n\t}\n\n\t// Redirect pagedown/pageup keys to messages container so it scrolls\n\tif (e.which === 33 || e.which === 34) {\n\t\tconst chat = document.querySelector(\".window .chat-content .chat\");\n\n\t\tif (chat) {\n\t\t\t(chat as HTMLDivElement).focus();\n\t\t}\n\n\t\treturn;\n\t}\n\n\tconst tagName = (e.target as HTMLElement).tagName;\n\n\t// Ignore if we're already typing into <input> or <textarea>\n\tif (tagName === \"INPUT\" || tagName === \"TEXTAREA\") {\n\t\treturn;\n\t}\n\n\tconst input = document.getElementById(\"input\");\n\n\tif (!input) {\n\t\treturn;\n\t}\n\n\tinput.focus();\n\n\t// On enter, focus the input but do not propagate the event\n\t// This way, a new line is not inserted\n\tif (e.which === 13) {\n\t\te.preventDefault();\n\t}\n});\n\nfunction scrollIntoViewNicely(el) {\n\t// Ideally this would use behavior: \"smooth\", but that does not consistently work in e.g. Chrome\n\t// https://github.com/iamdustan/smoothscroll/issues/28#issuecomment-364061459\n\tel.scrollIntoView({block: \"center\", inline: \"nearest\"});\n}\n","import distance from \"./distance\";\n\n// onTwoFingerSwipe will be called with a cardinal direction (\"n\", \"e\", \"s\" or\n// \"w\") as its only argument.\nfunction listenForTwoFingerSwipes(onTwoFingerSwipe) {\n\tlet history: {\n\t\tcenter: number[];\n\t\ttimestamp: number;\n\t}[] = [];\n\n\tdocument.body.addEventListener(\n\t\t\"touchmove\",\n\t\tfunction (event) {\n\t\t\tif (event.touches.length !== 2) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst a = event.touches.item(0);\n\t\t\tconst b = event.touches.item(1);\n\n\t\t\tif (!a || !b) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst timestamp = window.performance.now();\n\t\t\tconst center = [(a.screenX + b.screenX) / 2, (a.screenY + b.screenY) / 2];\n\n\t\t\tif (history.length > 0) {\n\t\t\t\tconst last = history[history.length - 1];\n\t\t\t\tconst centersAreEqual =\n\t\t\t\t\tlast.center[0] === center[0] && last.center[1] === center[1];\n\n\t\t\t\tif (last.timestamp === timestamp || centersAreEqual) {\n\t\t\t\t\t// Touches with the same timestamps or center don't help us\n\t\t\t\t\t// see the speed of movement. Ignore them.\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thistory.push({timestamp, center});\n\t\t},\n\t\t{passive: true}\n\t);\n\n\tdocument.body.addEventListener(\n\t\t\"touchend\",\n\t\tfunction (event) {\n\t\t\tif (event.touches.length >= 2) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst direction = getSwipe(history);\n\n\t\t\t\tif (direction) {\n\t\t\t\t\tonTwoFingerSwipe(direction);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\thistory = [];\n\t\t\t}\n\t\t},\n\t\t{passive: true}\n\t);\n\n\tdocument.body.addEventListener(\n\t\t\"touchcancel\",\n\t\tfunction () {\n\t\t\thistory = [];\n\t\t},\n\t\t{passive: true}\n\t);\n}\n\n// Returns the cardinal direction of the swipe or null if there is no swipe.\nfunction getSwipe(hist) {\n\t// Speed is in pixels/millisecond. Must be maintained throughout swipe.\n\tconst MIN_SWIPE_SPEED = 0.2;\n\n\tif (hist.length < 2) {\n\t\treturn null;\n\t}\n\n\tfor (let i = 1; i < hist.length; ++i) {\n\t\tconst previous = hist[i - 1];\n\t\tconst current = hist[i];\n\n\t\tconst speed =\n\t\t\tdistance(previous.center, current.center) /\n\t\t\tMath.abs(previous.timestamp - current.timestamp);\n\n\t\tif (speed < MIN_SWIPE_SPEED) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn getCardinalDirection(hist[0].center, hist[hist.length - 1].center);\n}\n\nfunction getCardinalDirection([x1, y1], [x2, y2]) {\n\t// If θ is the angle of the vector then this is tan(θ)\n\tconst tangent = (y2 - y1) / (x2 - x1);\n\n\t// All values of |tan(-45° to 45°)| are less than 1, same for 145° to 225°\n\tif (Math.abs(tangent) < 1) {\n\t\treturn x1 < x2 ? \"e\" : \"w\";\n\t}\n\n\treturn y1 < y2 ? \"s\" : \"n\";\n}\n\nexport default listenForTwoFingerSwipes;\n","import constants from \"./constants\";\n\nimport \"../css/style.css\";\nimport {createApp} from \"vue\";\nimport {store, CallableGetters, key} from \"./store\";\nimport App from \"../components/App.vue\";\nimport storage from \"./localStorage\";\nimport {router} from \"./router\";\nimport socket from \"./socket\";\nimport \"./socket-events\"; // this sets up all socket event listeners, do not remove\nimport eventbus from \"./eventbus\";\n\nimport \"./webpush\";\nimport \"./keybinds\";\nimport {LoungeWindow} from \"./types\";\n\nconst favicon = document.getElementById(\"favicon\");\nconst faviconNormal = favicon?.getAttribute(\"href\") || \"\";\nconst faviconAlerted = favicon?.dataset.other || \"\";\n\nexport const VueApp = createApp(App);\n\nVueApp.use(router);\nVueApp.use(store, key);\n\nVueApp.mount(\"#app\");\nsocket.open();\n\nstore.watch(\n\t(state) => state.sidebarOpen,\n\t(sidebarOpen) => {\n\t\tif (window.innerWidth > constants.mobileViewportPixels) {\n\t\t\tstorage.set(\"thelounge.state.sidebar\", sidebarOpen.toString());\n\t\t\teventbus.emit(\"resize\");\n\t\t}\n\t}\n);\n\nstore.watch(\n\t(state) => state.userlistOpen,\n\t(userlistOpen) => {\n\t\tstorage.set(\"thelounge.state.userlist\", userlistOpen.toString());\n\t\teventbus.emit(\"resize\");\n\t}\n);\n\nstore.watch(\n\t(_, getters: CallableGetters) => getters.title,\n\t(title) => {\n\t\tdocument.title = title;\n\t}\n);\n\n// Toggles the favicon to red when there are unread notifications\nstore.watch(\n\t(_, getters: CallableGetters) => getters.highlightCount,\n\t(highlightCount) => {\n\t\tfavicon?.setAttribute(\"href\", highlightCount > 0 ? faviconAlerted : faviconNormal);\n\n\t\tconst nav: LoungeWindow[\"navigator\"] = window.navigator;\n\n\t\tif (nav.setAppBadge) {\n\t\t\tif (highlightCount > 0) {\n\t\t\t\tnav.setAppBadge(highlightCount).catch(() => {});\n\t\t\t} else {\n\t\t\t\tif (nav.clearAppBadge) {\n\t\t\t\t\tnav.clearAppBadge().catch(() => {});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n);\n\nVueApp.config.errorHandler = function (e) {\n\tif (e instanceof Error) {\n\t\tstore.commit(\"currentUserVisibleError\", `Vue error: ${e.message}`);\n\t} else {\n\t\tstore.commit(\"currentUserVisibleError\", `Vue error: ${String(e)}`);\n\t}\n\n\t// eslint-disable-next-line no-console\n\tconsole.error(e);\n};\n","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\t<i class=\"hostmask\"> (<ParsedMessage :network=\"network\" :text=\"message.hostmask\" />)</i>\n\t\t<template v-if=\"message.account\">\n\t\t\t<i class=\"account\"> [{{ message.account }}]</i>\n\t\t</template>\n\t\t<template v-if=\"message.gecos\">\n\t\t\t<i class=\"realname\"> ({{ message.gecos }})</i>\n\t\t</template>\n\t\thas joined the channel\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeJoin\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./join.vue?vue&type=template&id=fa953800&ts=true\"\nimport script from \"./join.vue?vue&type=script&lang=ts\"\nexport * from \"./join.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\tsent a <abbr title=\"Client-to-client protocol\">CTCP</abbr> request:\n\t\t<span class=\"ctcp-message\"><ParsedMessage :text=\"message.ctcpMessage\" /></span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeRequestCTCP\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./ctcp_request.vue?vue&type=template&id=03fe2148&ts=true\"\nimport script from \"./ctcp_request.vue?vue&type=script&lang=ts\"\nexport * from \"./ctcp_request.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">{{ message.text }} </span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\n\nexport default defineComponent({\n\tname: \"MessageTypeRaw\",\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./raw.vue?vue&type=template&id=5aa1fa37&ts=true\"\nimport script from \"./raw.vue?vue&type=script&lang=ts\"\nexport * from \"./raw.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","// This is a simple localStorage wrapper because browser can throw errors\n// in different situations, including:\n// - Unable to store data if storage is full\n// - Local storage is blocked if \"third-party cookies and site data\" is disabled\n//\n// For more details, see:\n// https://stackoverflow.com/q/14555347/1935861\n// https://github.com/thelounge/thelounge/issues/2699\n// https://www.chromium.org/for-testers/bug-reporting-guidelines/uncaught-securityerror-failed-to-read-the-localstorage-property-from-window-access-is-denied-for-this-document\n\nexport default {\n\tset(key: string, value: string) {\n\t\ttry {\n\t\t\twindow.localStorage.setItem(key, value);\n\t\t} catch {\n\t\t\t//\n\t\t}\n\t},\n\tget(key: string) {\n\t\ttry {\n\t\t\treturn window.localStorage.getItem(key);\n\t\t} catch {\n\t\t\t// Return null as if data is not set\n\t\t\treturn null;\n\t\t}\n\t},\n\tremove(key: string) {\n\t\ttry {\n\t\t\twindow.localStorage.removeItem(key);\n\t\t} catch {\n\t\t\t//\n\t\t}\n\t},\n\tclear() {\n\t\ttry {\n\t\t\twindow.localStorage.clear();\n\t\t} catch {\n\t\t\t//\n\t\t}\n\t},\n};\n","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\tis now known as\n\t\t<Username :user=\"{nick: message.new_nick, mode: message.from!.mode}\" />\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeNick\",\n\tcomponents: {\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./nick.vue?vue&type=template&id=7be86b22&ts=true\"\nimport script from \"./nick.vue?vue&type=script&lang=ts\"\nexport * from \"./nick.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\thas kicked;\n\t\t<Username :user=\"message.target!\" />\n\t\t<i v-if=\"message.text\" class=\"part-reason\"\n\t\t\t>  (<ParsedMessage :network=\"network\" :message=\"message\" />)</i\n\t\t>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeKick\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./kick.vue?vue&type=template&id=1a7740c4&ts=true\"\nimport script from \"./kick.vue?vue&type=script&lang=ts\"\nexport * from \"./kick.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t936: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunk_lordbex_thelounge\"] = self[\"webpackChunk_lordbex_thelounge\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [110], () => (__webpack_require__(7421)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","defaultSettingConfig","apply","default","sync","defaultConfig","syncSettings","store","value","auto","socket","emit","advanced","autocomplete","nickPostfix","coloredNicks","desktopNotifications","commit","root","window","Notification","permission","requestPermission","catch","e","console","error","highlights","highlightExceptions","awayMessage","links","motd","notification","notifyAllMessages","showSeconds","use12hClock","statusMessages","theme","document","getElementById","dataset","serverTheme","themeEl","themeUrl","HTMLLinkElement","Error","hrefAttr","attributes","getNamedItem","state","serverConfiguration","newTheme","themes","filter","name","metaSelector","querySelector","HTMLMetaElement","themeColor","content","media","uploadCanvas","userStyles","test","location","search","element","innerHTML","searchEnabled","jumptoEabled","filterdmsEnabled","showAllDMs","showInputNick","disableMutedUnread","compactSidebar","beautifyBridgedMessages","bridgedMessageNicksStyle","enhancedUserListEnabled","enhancedContextMenuEnabled","enableEnhancedSearch","enableRainbowHotkey","config","obj","newConfig","settingName","normalizeConfig","createState","loadFromLocalStorage","storedSettings","JSON","parse","storage","get","remove","join","assignStoredSettings","defaultSettings","newSettings","key","appName","title","DesktopNotificationState","detectDesktopNotificationState","Granted","isSecureContext","Blocked","NoHttps","Unsupported","getters","findChannelOnCurrentNetwork","toLowerCase","activeChannel","network","channels","find","c","findChannelOnNetwork","networkUuid","channelName","networks","uuid","channel","findChannel","id","findNetwork","highlightCount","muted","highlight","toString","storePattern","appLoaded","undefined","currentUserVisibleError","desktopNotificationState","isAutoCompleting","isConnected","mentions","hasServiceWorker","pushNotificationState","sessions","sidebarOpen","sidebarDragging","userlistOpen","versionData","versionStatus","versionDataExpired","serverHasSettings","messageSearchResults","messageSearchPendingQuery","mutations","netChan","refreshDesktopNotificationState","payload","removeNetwork","networkId","splice","findIndex","n","sortNetworks","sortFn","sort","toggleSidebar","toggleUserlist","addMessageSearchResults","results","actions","partChannel","msg","chanId","Symbol","createStore","settingsStore","namespaced","set","syncAll","force","applyAll","update","settingConfig","stringify","createSettingsStore","useStore","baseUseStore","registerModule","io","transports","body","path","pathname","autoConnect","reconnection","classList","contains","class","defineComponent","components","ParsedMessage","Username","props","type","Object","required","message","_createElementBlock","_hoisted_1","_createVNode","_component_Username","user","_ctx","from","_component_ParsedMessage","_createElementVNode","_hoisted_2","text","hostmask","_hoisted_3","self","_createBlock","_Fragment","map","webpackContext","req","webpackContextResolve","__webpack_require__","o","code","keys","resolve","module","exports","ChanType","SpecialChanType","ChanState","setup","summaryParts","computed","parts","summary","massEventSummary","joins","push","quits","kicks","nicks","modes","chghosts","away","back","length","formattedDuration","duration","seconds","Math","round","minutes","floor","remainingSeconds","_renderList","item","index","_toDisplayString","errorMessage","chan","nick","command","reason","new_ident","new_host","_hoisted_4","events","Map","on","handler","has","off","evt","slice","localetime","date","whois","whowas","account","ident","hostname","actual_hostname","_hoisted_5","href","actual_ip","target","rel","_hoisted_6","_hoisted_7","actual_username","real_name","registered_nick","special","operator","helpop","bot","secure","certfps","certfp","server","server_info","logonTime","idle","idleTime","cleanText","lines","split","every","line","substring","replace","sizes","size","i","log","parseFloat","pow","toFixed","invitedYou","colorRx","hexColorRx","controlCodesRx","properties","escapeRegExpCharSet","raw","escapeRegExp","linkify","LinkifyIt","tlds","commonSchemes","schema","add","makeLinkPart","url","start","end","lastIndex","link","validate","pos","webSchemaRe","linkEnd","testSchemaAt","normalize","match","indexOf","__schemas__","regExp","emojiRegExp","nickRegExp","a","b","sortParts","emits","ariaLabel","shown","onClick","_normalizeClass","opened","_cache","args","Number","previewSize","friendlysize","String","openContextMenu","event","eventbus","dir","role","tabindex","_withModifiers","onContextmenu","_renderSlot","$slots","emojiModifiersRegex","styleFragments","result","colorCodes","bold","textColor","bgColor","hexColor","hexBgColor","italic","underline","strikethrough","monospace","position","resetStyle","emitFragment","processedText","fragmentStart","toUpperCase","tmp","parseStyle","reduce","prev","curr","lastEntry","concat","fragment","channelParts","channelPrefixes","userModes","userModePattern","channelPrefixPattern","channelRegExp","RegExp","exec","findChannels","serverOptions","CHANTYPES","PREFIX","prefix","pref","symbol","linkParts","matches","findLinks","emojiParts","emoji","findEmoji","nameParts","findNames","users","filled","existingEntries","acc","textSegment","fill","some","p","anyIntersection","part","fragments","textPart","fragStart","max","min","assign","merge","classes","data","style","hasData","color","createElement","createFragment","preview","previews","linkEls","LinkPreviewFileSize","LinkPreviewToggle","InlineChannel","isEmojiPart","emojiWithoutModifiers","emojiMap","isNamePart","functional","render","context","raw_modes","ctcpMessage","active","Boolean","onHover","Function","mode","nickColor","str","hash","charCodeAt","colorClass","settings","shoutbox","JOINED","u","lastMessage","Date","now","displayNick","umode","hover","_mergeProps","_toHandlers","mouseenter","messageTimeLocale","when","time","dayjs","format","colorCodeMap","commands","timeFormats","msgDefault","msgWithSeconds","msg12h","msg12hWithSeconds","mobileViewportPixels","tagName","ref","Props","delay","delayOnTouchOnly","touchStartThreshold","handle","draggable","ghostClass","dragClass","group","itemKey","list","Array","containerRef","sortable","watch","newDraggable","Sortable","onChoose","onUnchoose","onEnd","onBeforeUnmount","destroy","$props","isCollapsed","stored","Set","delete","count","isVisible","RevealPassword","inFlight","errorShown","username","password","onAuthFailed","onMounted","onSubmit","preventDefault","values","method","action","src","alt","width","height","for","$event","autocapitalize","autocorrect","autofocus","trim","_component_RevealPassword","_withCtx","slotProps","disabled","SidebarToggle","handleSubmit","defaults","previousUsername","displayPasswordField","publicPassword","newValue","nextTick","focus","commandsInput","resizeCommandsInput","ceil","scrollHeight","tls","isSecureChecked","ports","newPort","port","usernameInput","fishKeysEntries","fishKeysValue","entry","fishKeys","input","entries","parseFishKeys","immediate","setSaslAuth","sasl","onNickChanged","usernameRef","formData","FormData","forEach","addFishKeyEntry","removeFishKeyEntry","_component_SidebarToggle","lockNetwork","public","_hoisted_23","maxlength","_hoisted_24","placeholder","host","_hoisted_9","_hoisted_10","_hoisted_11","hasSTSPolicy","_hoisted_13","_hoisted_14","rejectUnauthorized","_hoisted_15","_hoisted_16","_hoisted_17","proxyEnabled","_hoisted_18","_hoisted_19","proxyHost","proxyPort","_hoisted_20","proxyUsername","_hoisted_21","proxyPassword","_hoisted_26","pattern","onInput","useHexIp","_hoisted_27","_hoisted_28","realname","_hoisted_29","leaveMessage","_hoisted_30","_hoisted_32","_hoisted_33","fishGlobalKey","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_46","_hoisted_47","checked","onChange","_hoisted_49","_hoisted_51","_hoisted_53","saslAccount","_hoisted_54","saslPassword","_hoisted_56","NetworkForm","queryParams","params","parsedParams","isArray","prototype","hasOwnProperty","call","includes","parseOverrideParams","_component_NetworkForm","className","to","route","useRoute","_component_router_link","custom","navigate","isExactActive","onKeypress","_withKeys","SettingTabItem","_component_SettingTabItem","Navigation","dispatch","_component_Navigation","_component_router_view","checkNow","latest","version","prerelease","VersionChecker","isApple","navigator","platform","isTouch","maxTouchPoints","_component_VersionChecker","gitCommit","_hoisted_12","_hoisted_22","_hoisted_25","_hoisted_31","_hoisted_37","_hoisted_38","_hoisted_45","_hoisted_48","_hoisted_50","_hoisted_52","_hoisted_55","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_61","_hoisted_60","_hoisted_62","_hoisted_63","_hoisted_65","_hoisted_64","_hoisted_66","_hoisted_67","_hoisted_69","_hoisted_68","_hoisted_70","_hoisted_71","_hoisted_73","_hoisted_72","_hoisted_74","_hoisted_75","_hoisted_77","_hoisted_76","_hoisted_78","_hoisted_79","_hoisted_81","_hoisted_80","_hoisted_82","_hoisted_83","_hoisted_85","_hoisted_84","_hoisted_86","_hoisted_87","_hoisted_89","_hoisted_88","_hoisted_90","_hoisted_91","_hoisted_93","_hoisted_92","_hoisted_94","_hoisted_95","_hoisted_97","_hoisted_96","_hoisted_98","changelog","patchChangelog","querySelectorAll","setAttribute","onUpdated","current","networkData","setNetworkData","switchToChannel","keepScrollPosition","showMoreButton","isContentShown","imageViewer","inject","imageViewerKey","onBeforeRouteUpdate","next","closeViewer","container","moreButtonLabel","imageMaxSize","maxSize","handleResize","offsetWidth","onPreviewReady","sourceLoaded","onPreviewUpdate","updateShownState","defaultState","onUnmounted","onThumbnailClick","onThumbnailError","thumb","onMoreClick","decoding","onError","onAbort","onLoad","head","preload","controls","onCanplay","mediaType","requireViews","require","MessageType","matchers","description","regex","transform","typedGroups","this","endsWith","regexMatch","groups","MessageTypes","LinkPreview","isPreviousSource","isFocused","timeFormat","constants","messageTime","messageComponent","prettyMessage","CHANNEL","MESSAGE","originalMessage","originalSender","matcher","m","edit","structuredClone","toRaw","replaceAll","original_nick","shoutboxParser","isAction","param","_resolveDynamicComponent","_component_LinkPreview","_hoisted_8","showInActive","statusmsgGroup","searchOpened","searchInput","router","useRouter","searchInputField","onSearchPage","query","q","closeSearch","toggleSearch","blur","searchMessages","err","onBlur","onKeyup","onMousedown","calendar","localeDate","hoursPassed","dayChange","friendlyDate","sameDay","lastDay","lastWeek","sameElse","Message","DateMarker","MessageSearchForm","chat","loadMoreButton","offset","moreResultsAvailable","oldScrollTop","oldChatHeight","messages","parseInt","setActiveChannel","clearSearchState","doSearch","searchTerm","jumpToBottom","async","el","scrollTop","currentChatHeight","shouldDisplayDateMarker","previousMessage","getDay","onShowMoreClick","jump","getTime","_component_MessageSearchForm","_component_DateMarker","_component_Message","matchFormatting","condensedTypes","selection","getSelection","anchorNode","focusNode","range","getRangeAt","documentFragment","cloneContents","div","appendChild","selectAllChildren","setTimeout","removeChild","removeAllRanges","addRange","condensedText","MODE","modeChangesCount","char","MASS_EVENT","quit","strings","pop","onCollapseClick","closed","MAX_RENDERED_MESSAGES","MessageCondensed","focusedTime","historyObserver","focusedMsgId","focusedMsgTime","isScrolling","windowStartIndex","isAdjustingWindow","unreadMarkerShown","allCondensedMessages","QUERY","lastCondensedContainer","condensed","firstUnread","displayedMessages","all","total","canScrollBack","isAtEnd","showLoadMoreButton","moreHistoryAvailable","scrollToBottom","scrolledToBottom","jumpToMessage","msgId","fallbackTime","targetIndex","inner","msgTime","abs","innerTime","halfWindow","scrollIntoView","behavior","block","closest","jumpToMessageByTime","timestamp","handleScroll","distanceFromBottom","clientHeight","distanceFromTop","amount","oldScrollHeight","newStart","heightDiff","shiftWindowUp","maxStart","shiftWindowDown","historyLoading","lastId","scrollBottom","addEventListener","passive","isNaN","IntersectionObserver","isIntersecting","observe","unobserve","firstMessageId","msgs","newFirstId","oldFirstId","newLen","oldLen","focused","onBeforeUpdate","removeEventListener","disconnect","getMessageKey","isMessageFocused","onCopy","clipboard","idx","oldDate","newDate","getDate","getMonth","getFullYear","shouldDisplayUnreadMarker","currentMessage","onLinkPreviewToggle","_component_MessageCondensed","onToggleLinkPreview","skipNextScrollEvent","isWaitingForNextTick","onLoadButtonObserved","condensedMessages","heightOld","offsetHeight","deep","pendingMessage","emojiSearchTerms","emojiStrategy","term","callback","fuzzyGrep","template","string","original","nicksStrategy","completeNicks","val","replaceNick","chanStrategy","word","words","completeChans","commandStrategy","cmds","getCommands","foregroundColorStrategy","fuzzy","pre","post","rendered","backgroundColorStrategy","pair","array","isFuzzy","me","otherUser","rawNicks","w","collapse","messageIds","toggled","expand","chanTypes","channelList","instance","xhr","fileQueue","tokenKeepAlive","overlay","uploadProgressbar","onDragEnter","dragEnter","onDragOver","dragOver","onDragLeave","dragLeave","onDrop","drop","onPaste","paste","init","token","uploadNextFileInQueue","mounted","unmounted","dataTransfer","types","relatedTarget","files","items","kind","getAsFile","triggerUpload","clipboardData","handleResponse","wasQueueEmpty","maxFileSize","fileUploadMaxFileSize","file","requestToken","setProgress","toggle","shift","setInterval","startsWith","renderImage","newFile","performUpload","fileReader","FileReader","onabort","onerror","abort","onload","img","Image","canvas","ctx","getContext","drawImage","toBlob","blob","File","readAsDataURL","XMLHttpRequest","upload","percent","loaded","onreadystatechange","readyState","DONE","response","responseText","statusText","status","append","open","send","clearInterval","insertUploadUrl","fullURL","URL","textbox","HTMLTextAreaElement","initStart","selectionStart","headToCursor","cursorToTail","textBeforeTail","updateCursor","selectionEnd","initialize","formattingHotkeys","bracketWraps","_","uploadInput","autocompletionRef","setInputSize","getComputedStyle","lineHeight","setPendingMessage","inputHistoryPosition","blurInput","hide","tabCount","lastMatch","currentMatches","detail","Mousetrap","bind","newMatch","remainder","substr","dispatchEvent","CustomEvent","strategies","editor","TextareaEditor","textcomplete","Textcomplete","dropdown","placement","autocompletion","inputTrap","enabledHotkeys","k","modifier","wrapCursor","onRow","totalRows","inputHistory","fileUpload","onUploadInputChange","openFileUpload","click","eventTarget","getInputPlaceholder","cmd","enterkeyhint","multiple","userSearchInput","activeUser","userlist","hasCustomGroups","filteredUsers","fuzzyFilter","extract","groupNameSlugs","slugify","groupCSSSafe","customGroupedUsers","filtered","standardGroupedUsers","groupedUsers","scrollToActiveUser","inline","getGroupSlug","setUserSearchInput","getModeClass","selectUser","rect","getBoundingClientRect","ev","MouseEvent","view","bubbles","cancelable","clientX","left","clientY","top","hoverUser","removeHoverUser","navigateUserList","direction","stopImmediatePropagation","currentIndex","onMouseleave","onKeydown","localeTime","ban","banned_by","banned_at","invite","invited_by","invited_at","channelData","num_users","topic","MessageList","MessageListBasic","ChatInput","ChatUserList","MessageListType","messageList","topicInput","specialComponent","BANLIST","ListBans","INVITELIST","ListInvites","CHANNELLIST","ListChannels","IGNORELIST","ListIgnored","channelChanged","usersOutdated","editTopic","newTopic","hideUserVisibleError","saveTopic","openMentions","lang","empty","onDblclick","_component_ChatUserList","_component_MessageList","_component_MessageListBasic","_component_ChatInput","Chat","chanInStore","unread","_component_Chat","onChannelChanged","prefetch","displayName","installPromptEvent","canRegisterProtocol","hasInstallPromptEvent","registerProtocolHandler","nativeInstallPrompt","prompt","onForceSyncClick","registerProtocol","uri","origin","reload","Auth","signout","clear","session","lastUse","signOut","agent","ip","Session","passwordChangeStatus","old_password","new_password","verify_password","currentSession","activeSessions","otherSessions","passwordErrors","missing_fields","password_mismatch","password_incorrect","update_failed","changePassword","once","success","ldapEnabled","_component_Session","_component_session59","_component_session","serviceWorker","ready","then","registration","pushManager","getSubscription","existingSubscription","unsubscribe","successful","subscribe","applicationServerKey","userVisibleOnly","subscription","toJSON","hasSubscriptionOnServer","protocol","register","isIOS","userAgent","playNotification","Audio","play","onPushButtonClick","webpush","createRouter","history","createWebHashHistory","routes","component","SignIn","beforeEnter","Connect","Settings","children","GeneralSettings","AppearanceSettings","AccountSettings","NotificationSettings","Help","Changelog","NetworkEdit","RoutedChat","SearchResults","routeName","currentRoute","focusedMessageId","focusedMessageTime","beforeEach","matched","afterEach","innerWidth","channelTarget","isFiltering","isChannelVisible","isChannelCollapsed","getAriaLabel","extra","connected","_normalizeStyle","transition","opacity","ChannelWrapper","isJoinChannelShown","joinChannelLabel","unreadCount","roundBadgeNumber","collapseNetwork","getExpandLabel","_component_ChannelWrapper","$emit","useCloseChannel","LOBBY","button","close","directives","inputChannel","inputPassword","existingChannel","Draggable","Channel","queries","PERSISTENT_STORAGE","getIsCollapsed","filterText","showAll","maxVisible","MAX_SAFE_INTEGER","hasActiveQuery","hasUnread","totalUnreadCount","filteredQueries","r","sortedQueries","pinned","localeCompare","visibleQueries","rest","remaining","hiddenCount","hasHiddenChannels","shouldShowChannel","toggleCollapsed","directMessages","onDMSort","oldIndex","newIndex","order","collapsed","_component_Draggable","_component_Channel","x1","y1","x2","y2","hypot","JoinChannel","NetworkLobby","DirectMessageSection","searchText","activeSearchItem","startDrag","networklist","sidebarWasClosed","moveItemInArray","newItems","isIgnoredKeybind","collapseNetworkHelper","expandNetwork","activateSearch","activeElement","deactivateSearch","setActiveSearchItem","scrollToActive","LONG_TOUCH_DURATION","setSearchText","selectResult","navigateResults","onChannelSort","unparsedId","getAttribute","onNetworkSort","onDraggableTouchStart","touches","onDraggableTouchMove","touch","currentPosition","distance","onDraggableTouchEnd","onDraggableChoose","originalEvent","pointerType","isTouchEvent","TouchEvent","PointerEvent","onDraggableUnchoose","onFocus","onMouseenter","_component_NetworkLobby","onTouchstart","onTouchmove","onTouchend","onTouchcancel","onToggleJoinChannel","_component_JoinChannel","_component_DirectMessageSection","NetworkList","touchStartPos","touchCurPos","touchStartTime","menuWidth","menuIsMoving","menuIsAbsolute","sidebar","onTouchMove","screenX","screenY","distX","distY","onTouchEnd","devicePixelRatio","diff","absDiff","onTouchStart","styles","isDevelopment","process","isPublic","_component_NetworkList","isActive","isUpdateAvailable","viewer","image","previousImage","nextImage","x","y","scale","computeImageStyles","transformX","transformY","previous","calculateZoomShift","newScale","oldScale","imageWidth","centerX","centerY","correctPosition","imageEl","viewerEl","widthScaled","heightScaled","containerWidth","containerHeight","reduceTouches","totalX","totalY","totalScale","i2","sqrt","newLink","oldLink","setPrevNextImages","flat","onImageLoad","prepareImage","naturalWidth","naturalHeight","onImageMouseDown","which","stopPropagation","startX","startY","startTransformX","startTransformY","movedDistance","mouseMove","moveEvent","newX","newY","mouseUp","upEvent","onMouseWheel","ctrlKey","deltaY","delta","fixedPosition","onImageTouchStart","currentTouches","touchEndFingers","currentTransform","startTransform","touchMove","deltaX","deltaScale","touchEnd","endEvent","changedTouches","onWheel","isOpen","passthrough","contextMenu","previousActiveElement","activeItem","enablePointerEvents","clickItem","menuHeight","pageX","pageY","innerHeight","positionContextMenu","openChannelContextMenu","closeChannel","label","lobby","setPinnedTo","humanFriendlyChanTypeMap","chanType","setMutedTo","generateChannelContextMenu","openInlineChannelContextMenu","generateInlineChannelContextMenu","openUserContextMenu","currentChannelUser","userContextMenuEntrys","defualt","customInspect","customTrackerProfile","userGroup","g","modeCharToName","modeTextTemplate","revoke","give","networkModeSymbols","symbols","compare","p1","p2","generateUserContextMenu","containerClick","currentTarget","navigateMenu","nextItem","hoverItem","clickActiveItem","incoming","cb","relativeTime","isLoading","resolvedMessages","reverse","togglePopup","closePopup","fromNow","dismissMention","dismissAllMentions","jumpToMention","contextMenuKey","confirmDialogKey","Sidebar","ImageViewer","ContextMenu","ConfirmDialog","Mentions","loungeWindow","confirmDialog","provide","viewportClasses","notified","debouncedResize","dayChangeTimeout","escapeKey","toggleUserList","toggleMentions","msUntilNextDay","today","prepareOpenStates","viewportWidth","isUserlistOpen","throttle","emitDayChange","clearTimeout","_component_Sidebar","_component_Mentions","_component_ImageViewer","_component_ContextMenu","_component_ConfirmDialog","handleDisconnect","updateLoadingMessage","skipReconnect","connect","requestIdleCallback","timeout","loading","textContent","attempt","sendBuffer","lastServerHash","showSignIn","g_TheLoungeRemoveLoading","reloadPage","toClientChan","shared","totalMessages","mergeChannelData","oldChannels","newChannels","newChannel","currentChannel","emitNamesOrMarkUsersOudated","hasOwn","removeQueryParams","cleanUri","replaceState","serverHash","doFastAuth","openChannel","hasConfig","newNetworks","collapsedNetworks","sharedNet","currentNetwork","newNet","mergeNetworkData","isReady","URLSearchParams","stringUri","parseIrcUri","fromEntries","handleQueryParams","clientChan","shouldOpen","unshift","sharedToClientMention","receivingChannel","isActiveChannel","targetId","hasFocus","INVITE","postMessage","tag","badge","icon","notifyMessage","messageLimit","ACTION","QUIT","PART","KICK","updateUserList","previewIndex","PARTED","isCurrentNetworkBeingRemoved","currentTheme","t","defaultTheme","returnValue","packages","expiresAt","expires","pendingQuery","SPECIAL","navigateWindow","flatChannels","jumpToChannel","targetChannel","onTwoFingerSwipe","performance","center","last","centersAreEqual","hist","tangent","getCardinalDirection","getSwipe","listenForTwoFingerSwipes","cardinalDirection","net","outer_loop","ignoredKeys","go","altKey","metaKey","favicon","faviconNormal","faviconAlerted","other","VueApp","createApp","App","use","mount","nav","setAppBadge","clearAppBadge","errorHandler","gecos","localStorage","setItem","getItem","removeItem","new_nick","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","getter","__esModule","d","definition","defineProperty","enumerable","globalThis","prop","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"js/bundle.js","mappings":"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","sources":["webpack://@lordbex/thelounge/webpack/runtime/chunk loaded","webpack://@lordbex/thelounge/./client/js/settings.ts","webpack://@lordbex/thelounge/./client/js/store-settings.ts","webpack://@lordbex/thelounge/./client/js/store.ts","webpack://@lordbex/thelounge/./client/js/socket.ts","webpack://@lordbex/thelounge/./client/components/MessageTypes/mode.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/mode.vue?86d9","webpack://@lordbex/thelounge/./client/components/MessageTypes/quit.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/quit.vue?6cc8","webpack://@lordbex/thelounge/./client/components/MessageTypes/away.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/away.vue?c451","webpack://@lordbex/thelounge/./client/components/MessageTypes/ sync nonrecursive \\.vue$","webpack://@lordbex/thelounge/./client/components/MessageTypes/back.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/back.vue?a43b","webpack://@lordbex/thelounge/./shared/types/chan.ts","webpack://@lordbex/thelounge/./client/components/MessageTypes/mass_event.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/mass_event.vue?ad07","webpack://@lordbex/thelounge/./client/components/MessageTypes/error.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/error.vue?3d38","webpack://@lordbex/thelounge/./client/components/MessageTypes/chghost.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/chghost.vue?ab01","webpack://@lordbex/thelounge/./client/js/eventbus.ts","webpack://@lordbex/thelounge/./client/components/MessageTypes/whois.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/whois.vue?a6be","webpack://@lordbex/thelounge/./client/components/MessageTypes/monospace_block.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/monospace_block.vue?5357","webpack://@lordbex/thelounge/./client/js/helpers/friendlysize.ts","webpack://@lordbex/thelounge/./client/components/MessageTypes/invite.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/invite.vue?0d58","webpack://@lordbex/thelounge/./client/js/helpers/ircmessageparser/parseStyle.ts","webpack://@lordbex/thelounge/./client/js/helpers/ircmessageparser/findChannels.ts","webpack://@lordbex/thelounge/./shared/linkify.ts","webpack://@lordbex/thelounge/./client/js/helpers/ircmessageparser/findEmoji.ts","webpack://@lordbex/thelounge/./client/js/helpers/ircmessageparser/findNames.ts","webpack://@lordbex/thelounge/./client/js/helpers/ircmessageparser/anyIntersection.ts","webpack://@lordbex/thelounge/./client/js/helpers/ircmessageparser/merge.ts","webpack://@lordbex/thelounge/./client/components/LinkPreviewToggle.vue","webpack://@lordbex/thelounge/./client/components/LinkPreviewToggle.vue?bfed","webpack://@lordbex/thelounge/./client/components/LinkPreviewFileSize.vue","webpack://@lordbex/thelounge/./client/components/LinkPreviewFileSize.vue?6888","webpack://@lordbex/thelounge/./client/components/InlineChannel.vue","webpack://@lordbex/thelounge/./client/components/InlineChannel.vue?b1e5","webpack://@lordbex/thelounge/./client/js/helpers/parse.ts","webpack://@lordbex/thelounge/./client/js/helpers/ircmessageparser/fill.ts","webpack://@lordbex/thelounge/./client/components/ParsedMessage.vue?11f7","webpack://@lordbex/thelounge/./client/components/ParsedMessage.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/topic.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/topic.vue?2f75","webpack://@lordbex/thelounge/./client/components/MessageTypes/part.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/part.vue?e2a6","webpack://@lordbex/thelounge/./client/components/MessageTypes/mode_user.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/mode_user.vue?70f4","webpack://@lordbex/thelounge/./client/components/MessageTypes/ctcp.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/ctcp.vue?cacf","webpack://@lordbex/thelounge/./client/components/Username.vue","webpack://@lordbex/thelounge/./client/js/helpers/colorClass.ts","webpack://@lordbex/thelounge/./client/components/Username.vue?2f83","webpack://@lordbex/thelounge/./client/components/MessageTypes/topic_set_by.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/topic_set_by.vue?2f65","webpack://@lordbex/thelounge/./client/components/MessageTypes/mode_channel.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/mode_channel.vue?8348","webpack://@lordbex/thelounge/./client/js/helpers/localetime.ts","webpack://@lordbex/thelounge/./client/components/MessageTypes/join.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/join.vue?8f48","webpack://@lordbex/thelounge/./client/components/MessageTypes/ctcp_request.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/ctcp_request.vue?2dcb","webpack://@lordbex/thelounge/./client/js/constants.ts","webpack://@lordbex/thelounge/./client/js/helpers/isIgnoredKeybind.ts","webpack://@lordbex/thelounge/./client/components/Sidebar.vue","webpack://@lordbex/thelounge/./client/components/NetworkList.vue","webpack://@lordbex/thelounge/./client/components/Draggable.vue","webpack://@lordbex/thelounge/./client/components/Draggable.vue?a413","webpack://@lordbex/thelounge/./client/components/NetworkLobby.vue","webpack://@lordbex/thelounge/./client/js/helpers/collapseNetwork.ts","webpack://@lordbex/thelounge/./client/js/helpers/roundBadgeNumber.ts","webpack://@lordbex/thelounge/./client/js/helpers/isChannelCollapsed.ts","webpack://@lordbex/thelounge/./client/components/Windows/SignIn.vue","webpack://@lordbex/thelounge/./client/components/RevealPassword.vue","webpack://@lordbex/thelounge/./client/components/RevealPassword.vue?c069","webpack://@lordbex/thelounge/./client/components/Windows/SignIn.vue?15cf","webpack://@lordbex/thelounge/./client/components/NetworkForm.vue","webpack://@lordbex/thelounge/./client/components/SidebarToggle.vue","webpack://@lordbex/thelounge/./client/components/SidebarToggle.vue?5dae","webpack://@lordbex/thelounge/./client/components/NetworkForm.vue?97fe","webpack://@lordbex/thelounge/./client/components/Windows/Connect.vue","webpack://@lordbex/thelounge/./client/components/Windows/Connect.vue?3910","webpack://@lordbex/thelounge/./client/components/Windows/Settings.vue","webpack://@lordbex/thelounge/./client/components/Settings/Navigation.vue","webpack://@lordbex/thelounge/./client/components/Settings/SettingTabItem.vue","webpack://@lordbex/thelounge/./client/components/Settings/SettingTabItem.vue?8598","webpack://@lordbex/thelounge/./client/components/Settings/Navigation.vue?538b","webpack://@lordbex/thelounge/./client/components/Windows/Settings.vue?b26a","webpack://@lordbex/thelounge/./client/components/Windows/Help.vue","webpack://@lordbex/thelounge/./client/components/VersionChecker.vue","webpack://@lordbex/thelounge/./client/components/VersionChecker.vue?f024","webpack://@lordbex/thelounge/./client/components/Windows/Help.vue?3de4","webpack://@lordbex/thelounge/./client/components/Windows/Changelog.vue","webpack://@lordbex/thelounge/./client/components/Windows/Changelog.vue?eb05","webpack://@lordbex/thelounge/./client/components/Windows/NetworkEdit.vue","webpack://@lordbex/thelounge/./client/components/Windows/NetworkEdit.vue?3546","webpack://@lordbex/thelounge/./client/components/Windows/SearchResults.vue","webpack://@lordbex/thelounge/./client/components/Message.vue","webpack://@lordbex/thelounge/./client/components/LinkPreview.vue","webpack://@lordbex/thelounge/./client/components/LinkPreview.vue?77b7","webpack://@lordbex/thelounge/./client/components/MessageTypes/index.ts","webpack://@lordbex/thelounge/./shared/types/msg.ts","webpack://@lordbex/thelounge/./client/js/helpers/shoutbox-bridge/matchers.ts","webpack://@lordbex/thelounge/./client/js/helpers/shoutbox-bridge/parser.ts","webpack://@lordbex/thelounge/./client/components/Message.vue?dd80","webpack://@lordbex/thelounge/./client/components/MessageSearchForm.vue","webpack://@lordbex/thelounge/./client/components/MessageSearchForm.vue?6f16","webpack://@lordbex/thelounge/./client/components/DateMarker.vue","webpack://@lordbex/thelounge/./client/components/DateMarker.vue?205b","webpack://@lordbex/thelounge/./client/components/Windows/SearchResults.vue?abb7","webpack://@lordbex/thelounge/./client/components/Chat.vue","webpack://@lordbex/thelounge/./client/components/MessageList.vue","webpack://@lordbex/thelounge/./shared/irc.ts","webpack://@lordbex/thelounge/./client/js/clipboard.ts","webpack://@lordbex/thelounge/./client/components/MessageCondensed.vue","webpack://@lordbex/thelounge/./client/components/MessageCondensed.vue?0c2b","webpack://@lordbex/thelounge/./client/components/MessageList.vue?f60d","webpack://@lordbex/thelounge/./client/components/MessageList_Basic.vue","webpack://@lordbex/thelounge/./client/components/MessageList_Basic.vue?59cd","webpack://@lordbex/thelounge/./client/components/ChatInput.vue","webpack://@lordbex/thelounge/./client/js/autocompletion.ts","webpack://@lordbex/thelounge/./client/js/commands/index.ts","webpack://@lordbex/thelounge/./client/js/commands/collapse.ts","webpack://@lordbex/thelounge/./client/js/commands/expand.ts","webpack://@lordbex/thelounge/./client/js/commands/join.ts","webpack://@lordbex/thelounge/./client/js/commands/search.ts","webpack://@lordbex/thelounge/./client/js/upload.ts","webpack://@lordbex/thelounge/./client/components/ChatInput.vue?83df","webpack://@lordbex/thelounge/./client/components/ChatUserList.vue","webpack://@lordbex/thelounge/./client/components/ChatUserList.vue?ef74","webpack://@lordbex/thelounge/./client/components/Special/ListBans.vue","webpack://@lordbex/thelounge/./client/components/Special/ListBans.vue?e125","webpack://@lordbex/thelounge/./client/components/Special/ListInvites.vue","webpack://@lordbex/thelounge/./client/components/Special/ListInvites.vue?3ace","webpack://@lordbex/thelounge/./client/components/Special/ListChannels.vue","webpack://@lordbex/thelounge/./client/components/Special/ListChannels.vue?727e","webpack://@lordbex/thelounge/./client/components/Special/ListIgnored.vue","webpack://@lordbex/thelounge/./client/components/Special/ListIgnored.vue?78d6","webpack://@lordbex/thelounge/./client/components/Chat.vue?9f2a","webpack://@lordbex/thelounge/./client/components/RoutedChat.vue","webpack://@lordbex/thelounge/./client/components/RoutedChat.vue?f310","webpack://@lordbex/thelounge/./client/components/Settings/Appearance.vue","webpack://@lordbex/thelounge/./client/components/Settings/Appearance.vue?aba1","webpack://@lordbex/thelounge/./client/components/Settings/General.vue","webpack://@lordbex/thelounge/./client/components/Settings/General.vue?e603","webpack://@lordbex/thelounge/./client/components/Settings/Account.vue","webpack://@lordbex/thelounge/./client/components/Session.vue","webpack://@lordbex/thelounge/./client/js/location.ts","webpack://@lordbex/thelounge/./client/js/auth.ts","webpack://@lordbex/thelounge/./client/components/Session.vue?1e0d","webpack://@lordbex/thelounge/./client/components/Settings/Account.vue?8037","webpack://@lordbex/thelounge/./client/components/Settings/Notifications.vue","webpack://@lordbex/thelounge/./client/js/webpush.ts","webpack://@lordbex/thelounge/./client/components/Settings/Notifications.vue?6626","webpack://@lordbex/thelounge/./client/js/router.ts","webpack://@lordbex/thelounge/./client/components/ChannelWrapper.vue","webpack://@lordbex/thelounge/./client/components/ChannelWrapper.vue?8bb7","webpack://@lordbex/thelounge/./client/components/NetworkLobby.vue?7d17","webpack://@lordbex/thelounge/./client/components/Channel.vue","webpack://@lordbex/thelounge/./client/js/hooks/use-close-channel.ts","webpack://@lordbex/thelounge/./client/components/Channel.vue?19d6","webpack://@lordbex/thelounge/./client/components/JoinChannel.vue","webpack://@lordbex/thelounge/./client/components/JoinChannel.vue?d18e","webpack://@lordbex/thelounge/./client/components/DirectMessageSection.vue","webpack://@lordbex/thelounge/./client/components/DirectMessageSection.vue?a2c7","webpack://@lordbex/thelounge/./client/js/helpers/distance.ts","webpack://@lordbex/thelounge/./client/components/NetworkList.vue?403b","webpack://@lordbex/thelounge/./client/components/Sidebar.vue?9985","webpack://@lordbex/thelounge/./client/components/ImageViewer.vue","webpack://@lordbex/thelounge/./client/components/ImageViewer.vue?2dfc","webpack://@lordbex/thelounge/./client/components/ContextMenu.vue","webpack://@lordbex/thelounge/./client/js/helpers/contextMenu.ts","webpack://@lordbex/thelounge/./client/js/helpers/openInNewTab.ts","webpack://@lordbex/thelounge/./client/components/ContextMenu.vue?fdba","webpack://@lordbex/thelounge/./client/components/ConfirmDialog.vue","webpack://@lordbex/thelounge/./client/components/ConfirmDialog.vue?36a8","webpack://@lordbex/thelounge/./client/components/Mentions.vue","webpack://@lordbex/thelounge/./client/components/Mentions.vue?dcdf","webpack://@lordbex/thelounge/./client/components/App.vue","webpack://@lordbex/thelounge/./client/components/App.vue?37fa","webpack://@lordbex/thelounge/./client/js/socket-events/connection.ts","webpack://@lordbex/thelounge/./client/js/socket-events/auth.ts","webpack://@lordbex/thelounge/./client/js/socket-events/msg.ts","webpack://@lordbex/thelounge/./client/js/chan.ts","webpack://@lordbex/thelounge/./client/js/socket-events/init.ts","webpack://@lordbex/thelounge/./client/js/socket-events/commands.ts","webpack://@lordbex/thelounge/./client/js/helpers/parseIrcUri.ts","webpack://@lordbex/thelounge/./client/js/socket-events/join.ts","webpack://@lordbex/thelounge/./client/js/socket-events/more.ts","webpack://@lordbex/thelounge/./client/js/socket-events/mentions.ts","webpack://@lordbex/thelounge/./client/js/socket-events/msg_preview.ts","webpack://@lordbex/thelounge/./client/js/socket-events/msg_special.ts","webpack://@lordbex/thelounge/./client/js/socket-events/names.ts","webpack://@lordbex/thelounge/./client/js/socket-events/network.ts","webpack://@lordbex/thelounge/./client/js/socket-events/nick.ts","webpack://@lordbex/thelounge/./client/js/socket-events/open.ts","webpack://@lordbex/thelounge/./client/js/socket-events/part.ts","webpack://@lordbex/thelounge/./client/js/socket-events/quit.ts","webpack://@lordbex/thelounge/./client/js/socket-events/sync_sort.ts","webpack://@lordbex/thelounge/./client/js/socket-events/topic.ts","webpack://@lordbex/thelounge/./client/js/socket-events/users.ts","webpack://@lordbex/thelounge/./client/js/socket-events/sign_out.ts","webpack://@lordbex/thelounge/./client/js/socket-events/sessions_list.ts","webpack://@lordbex/thelounge/./client/js/socket-events/configuration.ts","webpack://@lordbex/thelounge/./client/js/socket-events/changelog.ts","webpack://@lordbex/thelounge/./client/js/socket-events/setting.ts","webpack://@lordbex/thelounge/./client/js/socket-events/history_clear.ts","webpack://@lordbex/thelounge/./client/js/socket-events/search.ts","webpack://@lordbex/thelounge/./client/js/socket-events/mute_changed.ts","webpack://@lordbex/thelounge/./client/js/socket-events/pin_changed.ts","webpack://@lordbex/thelounge/./client/js/socket-events/channel_groups.ts","webpack://@lordbex/thelounge/./client/js/keybinds.ts","webpack://@lordbex/thelounge/./client/js/helpers/listenForTwoFingerSwipes.ts","webpack://@lordbex/thelounge/./client/js/vue.ts","webpack://@lordbex/thelounge/./client/components/MessageTypes/raw.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/raw.vue?56b1","webpack://@lordbex/thelounge/./client/js/localStorage.ts","webpack://@lordbex/thelounge/./client/components/MessageTypes/nick.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/nick.vue?d15a","webpack://@lordbex/thelounge/./client/components/MessageTypes/kick.vue","webpack://@lordbex/thelounge/./client/components/MessageTypes/kick.vue?24a1","webpack://@lordbex/thelounge/webpack/bootstrap","webpack://@lordbex/thelounge/webpack/runtime/compat get default export","webpack://@lordbex/thelounge/webpack/runtime/define property getters","webpack://@lordbex/thelounge/webpack/runtime/global","webpack://@lordbex/thelounge/webpack/runtime/hasOwnProperty shorthand","webpack://@lordbex/thelounge/webpack/runtime/make namespace object","webpack://@lordbex/thelounge/webpack/runtime/jsonp chunk loading","webpack://@lordbex/thelounge/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","import socket from \"./socket\";\nimport type {TypedStore} from \"./store\";\n\nconst defaultSettingConfig = {\n\tapply() {},\n\tdefault: null,\n\tsync: null,\n};\n\nconst defaultConfig = {\n\tsyncSettings: {\n\t\tdefault: true,\n\t\tsync: \"never\",\n\t\tapply(store: TypedStore, value: boolean, auto = false) {\n\t\t\t// If applied by settings/applyAll, do not emit to server\n\t\t\tif (value && !auto) {\n\t\t\t\tsocket.emit(\"setting:get\");\n\t\t\t}\n\t\t},\n\t},\n\tadvanced: {\n\t\tdefault: false,\n\t},\n\tautocomplete: {\n\t\tdefault: true,\n\t},\n\tnickPostfix: {\n\t\tdefault: \"\",\n\t},\n\tcoloredNicks: {\n\t\tdefault: true,\n\t},\n\tdesktopNotifications: {\n\t\tdefault: false,\n\t\tsync: \"never\",\n\t\tapply(store: TypedStore, value: boolean) {\n\t\t\t// Commit a mutation. options can have root: true that allows to commit root mutations in namespaced modules.\n\t\t\t// https://vuex.vuejs.org/api/#store-instance-methods. not typed?\n\t\t\tstore.commit(\"refreshDesktopNotificationState\", null, {root: true});\n\n\t\t\tif (\"Notification\" in window && value && Notification.permission !== \"granted\") {\n\t\t\t\tNotification.requestPermission(() =>\n\t\t\t\t\tstore.commit(\"refreshDesktopNotificationState\", null, {root: true})\n\t\t\t\t).catch((e) => {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t},\n\thighlights: {\n\t\tdefault: \"\",\n\t\tsync: \"always\",\n\t},\n\thighlightExceptions: {\n\t\tdefault: \"\",\n\t\tsync: \"always\",\n\t},\n\tawayMessage: {\n\t\tdefault: \"\",\n\t\tsync: \"always\",\n\t},\n\tlinks: {\n\t\tdefault: true,\n\t},\n\tmotd: {\n\t\tdefault: true,\n\t},\n\tnotification: {\n\t\tdefault: true,\n\t\tsync: \"never\",\n\t},\n\tnotifyAllMessages: {\n\t\tdefault: false,\n\t},\n\tshowSeconds: {\n\t\tdefault: false,\n\t},\n\tuse12hClock: {\n\t\tdefault: false,\n\t},\n\tstatusMessages: {\n\t\tdefault: \"condensed\",\n\t},\n\ttheme: {\n\t\tdefault: document.getElementById(\"theme\")?.dataset.serverTheme,\n\t\tapply(store: TypedStore, value: string) {\n\t\t\tconst themeEl = document.getElementById(\"theme\");\n\t\t\tconst themeUrl = `themes/${value}.css`;\n\n\t\t\tif (!(themeEl instanceof HTMLLinkElement)) {\n\t\t\t\tthrow new Error(\"theme element is not a link\");\n\t\t\t}\n\n\t\t\tconst hrefAttr = themeEl.attributes.getNamedItem(\"href\");\n\n\t\t\tif (!hrefAttr) {\n\t\t\t\tthrow new Error(\"theme is missing href attribute\");\n\t\t\t}\n\n\t\t\tif (hrefAttr.value === themeUrl) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\threfAttr.value = themeUrl;\n\n\t\t\tif (!store.state.serverConfiguration) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst newTheme = store.state.serverConfiguration?.themes.filter(\n\t\t\t\t(theme) => theme.name === value\n\t\t\t)[0];\n\n\t\t\tconst metaSelector = document.querySelector('meta[name=\"theme-color\"]');\n\n\t\t\tif (!(metaSelector instanceof HTMLMetaElement)) {\n\t\t\t\tthrow new Error(\"theme meta element is not a meta element\");\n\t\t\t}\n\n\t\t\tif (metaSelector) {\n\t\t\t\tconst themeColor = newTheme.themeColor || metaSelector.content;\n\t\t\t\tmetaSelector.content = themeColor;\n\t\t\t}\n\t\t},\n\t},\n\tmedia: {\n\t\tdefault: true,\n\t},\n\tuploadCanvas: {\n\t\tdefault: true,\n\t},\n\tuserStyles: {\n\t\tdefault: \"\",\n\t\tapply(store: TypedStore, value: string) {\n\t\t\tif (!/[?&]nocss/.test(window.location.search)) {\n\t\t\t\tconst element = document.getElementById(\"user-specified-css\");\n\n\t\t\t\tif (element) {\n\t\t\t\t\telement.innerHTML = value;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n\tsearchEnabled: {\n\t\tdefault: false,\n\t},\n\tjumptoEabled: {\n\t\tdefault: true,\n\t},\n\tfilterdmsEnabled: {\n\t\tdefault: true,\n\t},\n\tshowAllDMs: {\n\t\tdefault: false,\n\t},\n\tshowInputNick: {\n\t\tdefault: true,\n\t},\n\tdisableMutedUnread: {\n\t\tdefault: false,\n\t},\n\tcompactSidebar: {\n\t\tdefault: false,\n\t},\n\tbeautifyBridgedMessages: {\n\t\tdefault: true,\n\t},\n\tbridgedMessageNicksStyle: {\n\t\tdefault: \"parentheses\",\n\t},\n\tenhancedUserListEnabled: {\n\t\tdefault: true,\n\t},\n\tenhancedContextMenuEnabled: {\n\t\tdefault: true,\n\t},\n\tenableEnhancedSearch: {\n\t\t// disable by default for performance reasons\n\t\tdefault: false,\n\t},\n\tenableRainbowHotkey: {\n\t\tdefault: true,\n\t},\n};\n\nexport const config = normalizeConfig(defaultConfig);\n\nexport function createState() {\n\tconst state = {};\n\n\tfor (const settingName in config) {\n\t\tstate[settingName] = config[settingName].default;\n\t}\n\n\treturn state;\n}\n\nfunction normalizeConfig(obj: Record<string, Record<string, unknown>>) {\n\tconst newConfig: Partial<typeof defaultConfig> = {};\n\n\tfor (const settingName in obj) {\n\t\tnewConfig[settingName] = {...defaultSettingConfig, ...obj[settingName]};\n\t}\n\n\treturn newConfig as typeof defaultConfig;\n}\n\n// flatten to type of default\nexport type SettingsState = {\n\t[key in keyof typeof defaultConfig]: (typeof defaultConfig)[key][\"default\"];\n};\n","import storage from \"./localStorage\";\nimport socket from \"./socket\";\nimport {config, createState, SettingsState} from \"./settings\";\nimport {Store} from \"vuex\";\nimport {State} from \"./store\";\n\nexport function createSettingsStore(store: Store<State>) {\n\treturn {\n\t\tnamespaced: true,\n\t\tstate: assignStoredSettings(createState() as SettingsState, loadFromLocalStorage()),\n\t\tmutations: {\n\t\t\tset(state, {name, value}) {\n\t\t\t\tstate[name] = value;\n\t\t\t},\n\t\t},\n\t\tactions: {\n\t\t\tsyncAll({state}, force = false) {\n\t\t\t\tif (state.syncSettings === false && force === false) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tstore.commit(\"serverHasSettings\", true);\n\n\t\t\t\tfor (const name in state) {\n\t\t\t\t\tif (config[name].sync !== \"never\" || config[name].sync === \"always\") {\n\t\t\t\t\t\tsocket.emit(\"setting:set\", {name, value: state[name]});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tapplyAll({state}) {\n\t\t\t\tfor (const settingName in config) {\n\t\t\t\t\tconfig[settingName].apply(store, state[settingName], true);\n\t\t\t\t}\n\t\t\t},\n\t\t\tupdate({state, commit}, {name, value, sync = false}) {\n\t\t\t\tif (state[name] === value) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst settingConfig = config[name];\n\n\t\t\t\t// Trying to update a non existing setting (e.g. server has an old key)\n\t\t\t\tif (!settingConfig) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tsync === false &&\n\t\t\t\t\t(state.syncSettings === false || settingConfig.sync === \"never\")\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcommit(\"set\", {name, value});\n\t\t\t\tstorage.set(\"settings\", JSON.stringify(state));\n\t\t\t\tsettingConfig.apply(store, value);\n\n\t\t\t\tif (!sync) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t(state.syncSettings && settingConfig.sync !== \"never\") ||\n\t\t\t\t\tsettingConfig.sync === \"always\"\n\t\t\t\t) {\n\t\t\t\t\tsocket.emit(\"setting:set\", {name, value});\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t};\n}\n\nfunction loadFromLocalStorage(): Record<string, unknown> {\n\tlet storedSettings: Record<string, unknown> = {};\n\n\ttry {\n\t\tstoredSettings = JSON.parse(storage.get(\"settings\") || \"{}\");\n\t} catch {\n\t\tstorage.remove(\"settings\");\n\t}\n\n\tif (!storedSettings) {\n\t\treturn {};\n\t}\n\n\t// Older The Lounge versions converted highlights to an array, turn it back into a string\n\tif (storedSettings.highlights !== null && typeof storedSettings.highlights === \"object\") {\n\t\tstoredSettings.highlights = (storedSettings.highlights as string[]).join(\", \");\n\t}\n\n\treturn storedSettings;\n}\n\n/**\n * Essentially Object.assign but does not overwrite and only assigns\n * if key exists in both supplied objects and types match\n *\n * @param {object} defaultSettings\n * @param {object} storedSettings\n */\nfunction assignStoredSettings(\n\tdefaultSettings: SettingsState,\n\tstoredSettings: Record<string, unknown>\n) {\n\tconst newSettings = {...defaultSettings};\n\n\tfor (const key in defaultSettings) {\n\t\t// Make sure the setting in local storage has the same type that the code expects\n\t\tif (\n\t\t\ttypeof storedSettings[key] !== \"undefined\" &&\n\t\t\ttypeof defaultSettings[key] === typeof storedSettings[key]\n\t\t) {\n\t\t\tnewSettings[key] = storedSettings[key];\n\t\t}\n\t}\n\n\treturn newSettings;\n}\n","/* eslint-disable @typescript-eslint/no-shadow */\n\nimport {ActionContext, createStore, Store, useStore as baseUseStore} from \"vuex\";\nimport {createSettingsStore} from \"./store-settings\";\nimport storage from \"./localStorage\";\nimport type {ClientChan, ClientNetwork, NetChan, ClientMention, ClientMessage} from \"./types\";\nimport type {InjectionKey} from \"vue\";\n\nimport {SettingsState} from \"./settings\";\nimport {SearchQuery} from \"../../shared/types/storage\";\nimport {SharedConfiguration, LockedSharedConfiguration} from \"../../shared/types/config\";\n\nconst appName = document.title;\n\nenum DesktopNotificationState {\n\tUnsupported = \"unsupported\",\n\tBlocked = \"blocked\",\n\tNoHttps = \"nohttps\",\n\tGranted = \"granted\",\n}\n\nfunction detectDesktopNotificationState(): DesktopNotificationState {\n\tif (!(\"Notification\" in window)) {\n\t\treturn DesktopNotificationState.Unsupported;\n\t} else if (Notification.permission === \"granted\") {\n\t\treturn DesktopNotificationState.Granted;\n\t} else if (!window.isSecureContext) {\n\t\treturn DesktopNotificationState.NoHttps;\n\t}\n\n\treturn DesktopNotificationState.Blocked;\n}\n\nexport type ClientSession = {\n\tcurrent: boolean;\n\tactive: number;\n\tlastUse: number;\n\tip: string;\n\tagent: string;\n\ttoken: string;\n};\n\nexport type State = {\n\tappLoaded: boolean;\n\tactiveChannel?: NetChan;\n\tcurrentUserVisibleError: string | null;\n\tdesktopNotificationState: DesktopNotificationState;\n\tisAutoCompleting: boolean;\n\tisConnected: boolean;\n\tnetworks: ClientNetwork[];\n\t// TODO: type\n\tmentions: ClientMention[];\n\thasServiceWorker: boolean;\n\tpushNotificationState: string;\n\tserverConfiguration: SharedConfiguration | LockedSharedConfiguration | null;\n\tsessions: ClientSession[];\n\tsidebarOpen: boolean;\n\tsidebarDragging: boolean;\n\tuserlistOpen: boolean;\n\tversionData:\n\t\t| null\n\t\t| undefined\n\t\t| {\n\t\t\t\tlatest?: {\n\t\t\t\t\tversion: string;\n\t\t\t\t\tprerelease: boolean;\n\t\t\t\t\turl: string;\n\t\t\t\t};\n\t\t\t\tcurrent?: {\n\t\t\t\t\tversion: string;\n\t\t\t\t\tprerelease: boolean;\n\t\t\t\t\turl: string;\n\t\t\t\t\tchangelog?: string;\n\t\t\t\t};\n\t\t };\n\tversionStatus: \"loading\" | \"new-version\" | \"new-packages\" | \"up-to-date\" | \"error\";\n\tversionDataExpired: boolean;\n\tserverHasSettings: boolean;\n\tmessageSearchResults: {\n\t\tresults: ClientMessage[];\n\t} | null;\n\tmessageSearchPendingQuery: SearchQuery | null;\n\tsearchEnabled: boolean;\n};\n\nconst state = (): State => ({\n\tappLoaded: false,\n\tactiveChannel: undefined,\n\tcurrentUserVisibleError: null,\n\tdesktopNotificationState: detectDesktopNotificationState(),\n\tisAutoCompleting: false,\n\tisConnected: false,\n\tnetworks: [],\n\tmentions: [],\n\thasServiceWorker: false,\n\tpushNotificationState: \"unsupported\",\n\tserverConfiguration: null,\n\tsessions: [],\n\tsidebarOpen: false,\n\tsidebarDragging: false,\n\tuserlistOpen: storage.get(\"thelounge.state.userlist\") !== \"false\",\n\tversionData: null,\n\tversionStatus: \"loading\",\n\tversionDataExpired: false,\n\tserverHasSettings: false,\n\tmessageSearchResults: null,\n\tmessageSearchPendingQuery: null,\n\tsearchEnabled: false,\n});\n\ntype Getters = {\n\tfindChannelOnCurrentNetwork: (state: State) => (name: string) => ClientChan | undefined;\n\tfindChannelOnNetwork: (state: State) => (\n\t\tnetworkUuid: string,\n\t\tchannelName: string\n\t) => {\n\t\tnetwork: ClientNetwork;\n\t\tchannel: ClientChan;\n\t} | null;\n\tfindChannel: (state: State) => (id: number) => {\n\t\tnetwork: ClientNetwork;\n\t\tchannel: ClientChan;\n\t} | null;\n\tfindNetwork: (state: State) => (uuid: string) => ClientNetwork | null;\n\thighlightCount(state: State): number;\n\ttitle(state: State, getters: Omit<Getters, \"title\">): string;\n};\n\n// getters without the state argument\nexport type CallableGetters = {\n\t[K in keyof Getters]: ReturnType<Getters[K]>;\n};\n\nconst getters: Getters = {\n\tfindChannelOnCurrentNetwork: (state) => (name: string) => {\n\t\tname = name.toLowerCase();\n\t\treturn state.activeChannel?.network.channels.find((c) => c.name.toLowerCase() === name);\n\t},\n\tfindChannelOnNetwork: (state) => (networkUuid: string, channelName: string) => {\n\t\tfor (const network of state.networks) {\n\t\t\tif (network.uuid !== networkUuid) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (const channel of network.channels) {\n\t\t\t\tif (channel.name === channelName) {\n\t\t\t\t\treturn {network, channel};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t},\n\tfindChannel: (state) => (id: number) => {\n\t\tfor (const network of state.networks) {\n\t\t\tfor (const channel of network.channels) {\n\t\t\t\tif (channel.id === id) {\n\t\t\t\t\treturn {network, channel};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t},\n\tfindNetwork: (state) => (uuid: string) => {\n\t\tfor (const network of state.networks) {\n\t\t\tif (network.uuid === uuid) {\n\t\t\t\treturn network;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t},\n\thighlightCount(state) {\n\t\tlet highlightCount = 0;\n\n\t\tfor (const network of state.networks) {\n\t\t\tfor (const channel of network.channels) {\n\t\t\t\tif (channel.muted) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\thighlightCount += channel.highlight;\n\t\t\t}\n\t\t}\n\n\t\treturn highlightCount;\n\t},\n\ttitle(state, getters) {\n\t\tconst alertEventCount = getters.highlightCount\n\t\t\t? `(${getters.highlightCount.toString()}) `\n\t\t\t: \"\";\n\t\tconst channelname = state.activeChannel ? `${state.activeChannel.channel.name} — ` : \"\";\n\n\t\treturn alertEventCount + channelname + appName;\n\t},\n};\n\ntype Mutations = {\n\tappLoaded(state: State): void;\n\tactiveChannel(state: State, netChan: State[\"activeChannel\"]): void;\n\tcurrentUserVisibleError(state: State, error: State[\"currentUserVisibleError\"]): void;\n\trefreshDesktopNotificationState(state: State): void;\n\tisAutoCompleting(state: State, isAutoCompleting: State[\"isAutoCompleting\"]): void;\n\tisConnected(state: State, payload: State[\"isConnected\"]): void;\n\tnetworks(state: State, networks: State[\"networks\"]): void;\n\tmentions(state: State, mentions: State[\"mentions\"]): void;\n\n\tremoveNetwork(state: State, networkUuid: string): void;\n\tsortNetworks(\n\t\tstate: State,\n\t\tsortFn: (a: State[\"networks\"][0], b: State[\"networks\"][0]) => number\n\t): void;\n\thasServiceWorker(state: State): void;\n\tpushNotificationState(\n\t\tstate: State,\n\t\tpushNotificationState: State[\"pushNotificationState\"]\n\t): void;\n\tserverConfiguration(state: State, serverConfiguration: State[\"serverConfiguration\"]): void;\n\tsessions(state: State, payload: State[\"sessions\"]): void;\n\tsidebarOpen(state: State, payload: State[\"sidebarOpen\"]): void;\n\tsidebarDragging(state: State, payload: State[\"sidebarDragging\"]): void;\n\ttoggleSidebar(state: State): void;\n\ttoggleUserlist(state: State): void;\n\tuserlistOpen(state: State, payload: State[\"userlistOpen\"]): void;\n\tversionData(state: State, payload: State[\"versionData\"]): void;\n\tversionStatus(state: State, payload: State[\"versionStatus\"]): void;\n\tversionDataExpired(state: State, payload: State[\"versionDataExpired\"]): void;\n\tserverHasSettings(state: State, value: State[\"serverHasSettings\"]): void;\n\tmessageSearchPendingQuery(state: State, value: State[\"messageSearchPendingQuery\"]): void;\n\tmessageSearchResults(state: State, value: State[\"messageSearchResults\"]): void;\n\taddMessageSearchResults(state: State, value: NonNullable<State[\"messageSearchResults\"]>): void;\n};\n\nconst mutations: Mutations = {\n\tappLoaded(state) {\n\t\tstate.appLoaded = true;\n\t},\n\tactiveChannel(state, netChan) {\n\t\tstate.activeChannel = netChan;\n\t},\n\tcurrentUserVisibleError(state, error) {\n\t\tstate.currentUserVisibleError = error;\n\t},\n\trefreshDesktopNotificationState(state) {\n\t\tstate.desktopNotificationState = detectDesktopNotificationState();\n\t},\n\tisAutoCompleting(state, isAutoCompleting) {\n\t\tstate.isAutoCompleting = isAutoCompleting;\n\t},\n\tisConnected(state, payload) {\n\t\tstate.isConnected = payload;\n\t},\n\tnetworks(state, networks) {\n\t\tstate.networks = networks;\n\t},\n\tmentions(state, mentions) {\n\t\tstate.mentions = mentions;\n\t},\n\tremoveNetwork(state, networkId) {\n\t\tstate.networks.splice(\n\t\t\tstate.networks.findIndex((n) => n.uuid === networkId),\n\t\t\t1\n\t\t);\n\t},\n\tsortNetworks(state, sortFn) {\n\t\tstate.networks.sort(sortFn);\n\t},\n\thasServiceWorker(state) {\n\t\tstate.hasServiceWorker = true;\n\t},\n\tpushNotificationState(state, pushNotificationState) {\n\t\tstate.pushNotificationState = pushNotificationState;\n\t},\n\tserverConfiguration(state, serverConfiguration) {\n\t\tstate.serverConfiguration = serverConfiguration;\n\t},\n\tsessions(state, payload) {\n\t\tstate.sessions = payload;\n\t},\n\tsidebarOpen(state, payload) {\n\t\tstate.sidebarOpen = payload;\n\t},\n\tsidebarDragging(state, payload) {\n\t\tstate.sidebarDragging = payload;\n\t},\n\ttoggleSidebar(state) {\n\t\tstate.sidebarOpen = !state.sidebarOpen;\n\t},\n\ttoggleUserlist(state) {\n\t\tstate.userlistOpen = !state.userlistOpen;\n\t},\n\tuserlistOpen(state, payload) {\n\t\tstate.userlistOpen = payload;\n\t},\n\tversionData(state, payload) {\n\t\tstate.versionData = payload;\n\t},\n\tversionStatus(state, payload) {\n\t\tstate.versionStatus = payload;\n\t},\n\tversionDataExpired(state, payload) {\n\t\tstate.versionDataExpired = payload;\n\t},\n\tserverHasSettings(state, value) {\n\t\tstate.serverHasSettings = value;\n\t},\n\tmessageSearchPendingQuery(state, value) {\n\t\tstate.messageSearchPendingQuery = value;\n\t},\n\tmessageSearchResults(state, value) {\n\t\tstate.messageSearchResults = value;\n\t},\n\taddMessageSearchResults(state, value) {\n\t\t// Append the search results and add networks and channels to new messages\n\t\tif (!state.messageSearchResults) {\n\t\t\tstate.messageSearchResults = {results: []};\n\t\t}\n\n\t\tif (!value) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst results = [...value.results, ...state.messageSearchResults.results];\n\n\t\tstate.messageSearchResults = {\n\t\t\tresults,\n\t\t};\n\t},\n};\n\nexport type TypedCommit = <T extends keyof Mutations>(\n\ttype: T,\n\tpayload?: Parameters<Mutations[T]>[1] | null,\n\toptions?: {root?: boolean}\n) => ReturnType<Mutations[T]>;\ntype TypedActionContext = Omit<ActionContext<State, State>, \"commit\"> & {\n\tcommit: TypedCommit;\n};\n\ntype Actions = {\n\tpartChannel(context: TypedActionContext, payload: NetChan): void;\n};\n\nconst actions: Actions = {\n\tpartChannel({commit, state}, netChan) {\n\t\tconst mentions = state.mentions.filter((msg) => !(msg.chanId === netChan.channel.id));\n\t\tcommit(\"mentions\", mentions);\n\t},\n};\n\nconst storePattern = {\n\tstate,\n\tmutations,\n\tactions,\n\tgetters,\n};\n\n// https://vuex.vuejs.org/guide/typescript-support.html#typing-usestore-composition-function\nexport const key: InjectionKey<Store<State>> = Symbol();\n\n// vuex types getters as any\nexport type TypedStore = Omit<Store<State>, \"getters\" | \"commit\"> & {\n\tgetters: CallableGetters;\n\tcommit: TypedCommit;\n\tstate: State & {\n\t\tsettings: SettingsState;\n\t};\n};\n\nexport const store = createStore(storePattern) as TypedStore;\n\nconst settingsStore = createSettingsStore(store);\n\n// Settings module is registered dynamically because it benefits\n// from a direct reference to the store\nstore.registerModule(\"settings\", settingsStore);\n\nexport function useStore() {\n\treturn baseUseStore(key) as TypedStore;\n}\n","import io, {Socket as rawSocket} from \"socket.io-client\";\nimport type {ServerToClientEvents, ClientToServerEvents} from \"../../shared/types/socket-events\";\n\ntype Socket = rawSocket<ServerToClientEvents, ClientToServerEvents>;\n\nconst socket: Socket = io({\n\ttransports: JSON.parse(document.body.dataset.transports || \"['polling', 'websocket']\"),\n\tpath: window.location.pathname + \"socket.io/\",\n\tautoConnect: false,\n\treconnection: !document.body.classList.contains(\"public\"),\n});\n\n// Ease debugging socket during development\nif (process.env.NODE_ENV === \"development\") {\n\twindow.socket = socket;\n}\n\ndeclare global {\n\tinterface Window {\n\t\tsocket: Socket;\n\t}\n}\n\nexport default socket;\n","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\tsets mode\n\t\t<ParsedMessage :message=\"message\" />\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeMode\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./mode.vue?vue&type=template&id=8e1c6f3a&ts=true\"\nimport script from \"./mode.vue?vue&type=script&lang=ts\"\nexport * from \"./mode.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\t<i class=\"hostmask\"> (<ParsedMessage :network=\"network\" :text=\"message.hostmask\" />)</i> has\n\t\tquit\n\t\t<i v-if=\"message.text\" class=\"quit-reason\"\n\t\t\t>(<ParsedMessage :network=\"network\" :message=\"message\" />)</i\n\t\t>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport type {ClientMessage, ClientNetwork} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeQuit\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./quit.vue?vue&type=template&id=d273c630&ts=true\"\nimport script from \"./quit.vue?vue&type=script&lang=ts\"\nexport * from \"./quit.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<ParsedMessage v-if=\"message.self\" :network=\"network\" :message=\"message\" />\n\t\t<template v-else>\n\t\t\t<Username :user=\"message.from!\" />\n\t\t\tis away\n\t\t\t<i class=\"away-message\">(<ParsedMessage :network=\"network\" :message=\"message\" />)</i>\n\t\t</template>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport type {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeAway\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./away.vue?vue&type=template&id=41304132&ts=true\"\nimport script from \"./away.vue?vue&type=script&lang=ts\"\nexport * from \"./away.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","var map = {\n\t\"./away.vue\": 991,\n\t\"./back.vue\": 1344,\n\t\"./chghost.vue\": 2462,\n\t\"./ctcp.vue\": 6455,\n\t\"./ctcp_request.vue\": 8078,\n\t\"./error.vue\": 2429,\n\t\"./invite.vue\": 3393,\n\t\"./join.vue\": 7902,\n\t\"./kick.vue\": 9971,\n\t\"./mass_event.vue\": 1740,\n\t\"./mode.vue\": 514,\n\t\"./mode_channel.vue\": 7062,\n\t\"./mode_user.vue\": 5506,\n\t\"./monospace_block.vue\": 3107,\n\t\"./nick.vue\": 9956,\n\t\"./part.vue\": 5182,\n\t\"./quit.vue\": 875,\n\t\"./raw.vue\": 9207,\n\t\"./topic.vue\": 4379,\n\t\"./topic_set_by.vue\": 6789,\n\t\"./whois.vue\": 2837\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1191;","<template>\n\t<span class=\"content\">\n\t\t<ParsedMessage v-if=\"message.self\" :network=\"network\" :message=\"message\" />\n\t\t<template v-else>\n\t\t\t<Username :user=\"message.from!\" />\n\t\t\tis back\n\t\t</template>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeBack\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./back.vue?vue&type=template&id=7723954c&ts=true\"\nimport script from \"./back.vue?vue&type=script&lang=ts\"\nexport * from \"./back.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import {SharedMsg} from \"./msg\";\n\n// User groups sent by seedpool/enhanced capable servers\nexport type UserGroup = {\n\tname: string;\n\tposition: number;\n\tusers: string[];\n};\n\nexport enum ChanType {\n\tCHANNEL = \"channel\",\n\tLOBBY = \"lobby\",\n\tQUERY = \"query\",\n\tSPECIAL = \"special\",\n}\n\nexport enum SpecialChanType {\n\tBANLIST = \"list_bans\",\n\tINVITELIST = \"list_invites\",\n\tCHANNELLIST = \"list_channels\",\n\tIGNORELIST = \"list_ignored\",\n}\n\nexport enum ChanState {\n\tPARTED = 0,\n\tJOINED = 1,\n}\n\nexport type SharedChan = {\n\t// TODO: don't force existence, figure out how to make TS infer it.\n\tid: number;\n\tmessages: SharedMsg[];\n\tname: string;\n\tkey: string;\n\ttopic: string;\n\tfirstUnread: number;\n\tunread: number;\n\thighlight: number;\n\tmuted: boolean;\n\ttype: ChanType;\n\tstate: ChanState;\n\tpinned: boolean;\n\n\tspecial?: SpecialChanType;\n\tdata?: unknown;\n\tclosed?: boolean;\n\tnum_users?: number;\n\tgroups?: UserGroup[];\n};\n","<template>\n\t<span class=\"content mass-event-summary\">\n\t\t<strong>Mass event:</strong>\n\t\t<span v-for=\"(item, index) in summaryParts\" :key=\"index\">\n\t\t\t{{ index > 0 ? \", \" : \" \" }}{{ item }}\n\t\t</span>\n\t\t<i class=\"mass-event-duration\"> ({{ formattedDuration }})</i>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, PropType} from \"vue\";\nimport type {ClientMessage, ClientNetwork} from \"../../js/types\";\nimport {useStore} from \"../../js/store\";\n\nexport default defineComponent({\n\tname: \"MessageTypeMassEvent\",\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\t\tconst summaryParts = computed(() => {\n\t\t\tconst parts: string[] = [];\n\t\t\tconst summary = props.message.massEventSummary;\n\n\t\t\tif (!summary) {\n\t\t\t\treturn [\"No summary data\"];\n\t\t\t}\n\n\t\t\tif (summary.joins > 0) {\n\t\t\t\tparts.push(`${summary.joins} user${summary.joins !== 1 ? \"s\" : \"\"} joined`);\n\t\t\t}\n\n\t\t\tif (summary.parts > 0) {\n\t\t\t\tparts.push(`${summary.parts} user${summary.parts !== 1 ? \"s\" : \"\"} left`);\n\t\t\t}\n\n\t\t\tif (summary.quits > 0) {\n\t\t\t\tparts.push(`${summary.quits} user${summary.quits !== 1 ? \"s\" : \"\"} quit`);\n\t\t\t}\n\n\t\t\tif (summary.kicks > 0) {\n\t\t\t\tparts.push(`${summary.kicks} user${summary.kicks !== 1 ? \"s\" : \"\"} kicked`);\n\t\t\t}\n\n\t\t\tif (summary.nicks > 0) {\n\t\t\t\tparts.push(`${summary.nicks} nick change${summary.nicks !== 1 ? \"s\" : \"\"}`);\n\t\t\t}\n\n\t\t\tif (summary.modes > 0) {\n\t\t\t\tparts.push(`${summary.modes} mode change${summary.modes !== 1 ? \"s\" : \"\"}`);\n\t\t\t}\n\n\t\t\tif (summary.chghosts > 0) {\n\t\t\t\tparts.push(`${summary.chghosts} host change${summary.chghosts !== 1 ? \"s\" : \"\"}`);\n\t\t\t}\n\n\t\t\tif (summary.away > 0) {\n\t\t\t\tparts.push(`${summary.away} user${summary.away !== 1 ? \"s\" : \"\"} away`);\n\t\t\t}\n\n\t\t\tif (summary.back > 0) {\n\t\t\t\tparts.push(`${summary.back} user${summary.back !== 1 ? \"s\" : \"\"} back`);\n\t\t\t}\n\n\t\t\treturn parts.length > 0 ? parts : [\"No events\"];\n\t\t});\n\n\t\tconst formattedDuration = computed(() => {\n\t\t\tconst summary = props.message.massEventSummary;\n\n\t\t\tif (!summary || !summary.duration) {\n\t\t\t\treturn \"0s\";\n\t\t\t}\n\n\t\t\tconst seconds = Math.round(summary.duration / 1000);\n\n\t\t\tif (seconds < 60) {\n\t\t\t\treturn `${seconds}s`;\n\t\t\t}\n\n\t\t\tconst minutes = Math.floor(seconds / 60);\n\t\t\tconst remainingSeconds = seconds % 60;\n\n\t\t\tif (remainingSeconds === 0) {\n\t\t\t\treturn `${minutes}m`;\n\t\t\t}\n\n\t\t\treturn `${minutes}m ${remainingSeconds}s`;\n\t\t});\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tsummaryParts,\n\t\t\tformattedDuration,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./mass_event.vue?vue&type=template&id=57600f0e&ts=true\"\nimport script from \"./mass_event.vue?vue&type=script&lang=ts\"\nexport * from \"./mass_event.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<ParsedMessage :network=\"network\" :message=\"message\" :text=\"errorMessage\" />\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport {computed, defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\n\nexport default defineComponent({\n\tname: \"MessageTypeError\",\n\tcomponents: {\n\t\tParsedMessage,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst errorMessage = computed(() => {\n\t\t\t// TODO: enforce chan and nick fields so that we can get rid of that\n\t\t\tconst chan = props.message.channel || \"!UNKNOWN_CHAN\";\n\t\t\tconst nick = props.message.nick || \"!UNKNOWN_NICK\";\n\n\t\t\tswitch (props.message.error) {\n\t\t\t\tcase \"bad_channel_key\":\n\t\t\t\t\treturn `Cannot join ${chan} - Bad channel key.`;\n\t\t\t\tcase \"banned_from_channel\":\n\t\t\t\t\treturn `Cannot join ${chan} - You have been banned from the channel.`;\n\t\t\t\tcase \"cannot_send_to_channel\":\n\t\t\t\t\treturn `Cannot send to channel ${chan}`;\n\t\t\t\tcase \"channel_is_full\":\n\t\t\t\t\treturn `Cannot join ${chan} - Channel is full.`;\n\t\t\t\tcase \"chanop_privs_needed\":\n\t\t\t\t\treturn \"Cannot perform action: You're not a channel operator.\";\n\t\t\t\tcase \"invite_only_channel\":\n\t\t\t\t\treturn `Cannot join ${chan} - Channel is invite only.`;\n\t\t\t\tcase \"no_such_nick\":\n\t\t\t\t\treturn `User ${nick} hasn't logged in or does not exist.`;\n\t\t\t\tcase \"not_on_channel\":\n\t\t\t\t\treturn \"Cannot perform action: You're not on the channel.\";\n\t\t\t\tcase \"password_mismatch\":\n\t\t\t\t\treturn \"Password mismatch.\";\n\t\t\t\tcase \"too_many_channels\":\n\t\t\t\t\treturn `Cannot join ${chan} - You've already reached the maximum number of channels allowed.`;\n\t\t\t\tcase \"unknown_command\":\n\t\t\t\t\t// TODO: not having message.command should never happen, so force existence\n\t\t\t\t\treturn `Unknown command: ${props.message.command || \"!UNDEFINED_COMMAND_BUG\"}`;\n\t\t\t\tcase \"user_not_in_channel\":\n\t\t\t\t\treturn `User ${nick} is not on the channel.`;\n\t\t\t\tcase \"user_on_channel\":\n\t\t\t\t\treturn `User ${nick} is already on the channel.`;\n\t\t\t\tdefault:\n\t\t\t\t\tif (props.message.reason) {\n\t\t\t\t\t\treturn `${props.message.reason} (${\n\t\t\t\t\t\t\tprops.message.error || \"!UNDEFINED_ERR\"\n\t\t\t\t\t\t})`;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn props.message.error;\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\terrorMessage,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./error.vue?vue&type=template&id=af61be5a&ts=true\"\nimport script from \"./error.vue?vue&type=script&lang=ts\"\nexport * from \"./error.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\thas changed\n\t\t<span v-if=\"message.new_ident\"\n\t\t\t>username to <b>{{ message.new_ident }} </b></span\n\t\t>\n\t\t<span v-if=\"message.new_host\"\n\t\t\t>hostname to\n\t\t\t<i class=\"hostmask\"><ParsedMessage :network=\"network\" :text=\"message.new_host\" /></i\n\t\t></span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeChangeHost\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./chghost.vue?vue&type=template&id=eaff81c8&ts=true\"\nimport script from \"./chghost.vue?vue&type=script&lang=ts\"\nexport * from \"./chghost.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","const events = new Map();\n\nclass EventBus {\n\t/**\n\t * Register an event handler for the given type.\n\t *\n\t * @param {String} type Type of event to listen for.\n\t * @param {Function} handler Function to call in response to given event.\n\t */\n\ton(type: string, handler: (...evt: unknown[]) => void) {\n\t\tif (events.has(type)) {\n\t\t\tevents.get(type).push(handler);\n\t\t} else {\n\t\t\tevents.set(type, [handler]);\n\t\t}\n\t}\n\n\t/**\n\t * Remove an event handler for the given type.\n\t *\n\t * @param {String} type Type of event to unregister `handler` from.\n\t * @param {Function} handler Handler function to remove.\n\t */\n\toff(type: string, handler: (...evt: unknown[]) => void) {\n\t\tif (events.has(type)) {\n\t\t\tevents.set(\n\t\t\t\ttype,\n\t\t\t\tevents.get(type).filter((item: (...evt: unknown[]) => void) => item !== handler)\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Invoke all handlers for the given type.\n\t *\n\t * @param {String} type The event type to invoke.\n\t * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler.\n\t */\n\temit(type: string, ...evt: unknown[]) {\n\t\tif (events.has(type)) {\n\t\t\tevents\n\t\t\t\t.get(type)\n\t\t\t\t.slice()\n\t\t\t\t.map((handler: (...evts: unknown[]) => void) => {\n\t\t\t\t\thandler(...evt);\n\t\t\t\t});\n\t\t}\n\t}\n}\n\nexport default new EventBus();\n","<template>\n\t<span class=\"content\">\n\t\t<p>\n\t\t\t<Username :user=\"{nick: message.whois!.nick}\" />\n\t\t\t<span v-if=\"message.whois!.whowas\"> is offline, last information:</span>\n\t\t</p>\n\n\t\t<dl class=\"whois\">\n\t\t\t<template v-if=\"message.whois!.account\">\n\t\t\t\t<dt>Logged in as:</dt>\n\t\t\t\t<dd>{{ message.whois!.account }}</dd>\n\t\t\t</template>\n\n\t\t\t<dt>Host mask:</dt>\n\t\t\t<dd class=\"hostmask\">\n\t\t\t\t<ParsedMessage\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:text=\"message.whois!.ident + '@' + message.whois!.hostname\"\n\t\t\t\t/>\n\t\t\t</dd>\n\n\t\t\t<template v-if=\"message.whois!.actual_hostname\">\n\t\t\t\t<dt>Actual host:</dt>\n\t\t\t\t<dd class=\"hostmask\">\n\t\t\t\t\t<a\n\t\t\t\t\t\t:href=\"'https://ipinfo.io/' + message.whois!.actual_ip\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t>{{ message.whois!.actual_ip }}</a\n\t\t\t\t\t>\n\t\t\t\t\t<i v-if=\"message.whois!.actual_hostname != message.whois!.actual_ip\">\n\t\t\t\t\t\t({{ message.whois!.actual_hostname }})</i\n\t\t\t\t\t>\n\t\t\t\t</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.actual_username\">\n\t\t\t\t<dt>Actual username:</dt>\n\t\t\t\t<dd>{{ message.whois!.actual_username }}</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.real_name\">\n\t\t\t\t<dt>Real name:</dt>\n\t\t\t\t<dd>\n\t\t\t\t\t<ParsedMessage :network=\"network\" :text=\"message.whois!.real_name as string\" />\n\t\t\t\t</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.registered_nick\">\n\t\t\t\t<dt>Registered nick:</dt>\n\t\t\t\t<dd>{{ message.whois!.registered_nick }}</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.channels\">\n\t\t\t\t<dt>Channels:</dt>\n\t\t\t\t<dd>\n\t\t\t\t\t<ParsedMessage :network=\"network\" :text=\"message.whois!.channels as string\" />\n\t\t\t\t</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.modes\">\n\t\t\t\t<dt>Modes:</dt>\n\t\t\t\t<dd>{{ message.whois!.modes }}</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.special\">\n\t\t\t\t<template v-for=\"special in message.whois!.special\" :key=\"special\">\n\t\t\t\t\t<dt>Special:</dt>\n\t\t\t\t\t<dd>{{ special }}</dd>\n\t\t\t\t</template>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.operator\">\n\t\t\t\t<dt>Operator:</dt>\n\t\t\t\t<dd>{{ message.whois!.operator }}</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.helpop\">\n\t\t\t\t<dt>Available for help:</dt>\n\t\t\t\t<dd>Yes</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.bot\">\n\t\t\t\t<dt>Is a bot:</dt>\n\t\t\t\t<dd>Yes</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.away\">\n\t\t\t\t<dt>Away:</dt>\n\t\t\t\t<dd><ParsedMessage :network=\"network\" :text=\"message.whois!.away as string\" /></dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.secure\">\n\t\t\t\t<dt>Secure connection:</dt>\n\t\t\t\t<dd>Yes</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.certfps\">\n\t\t\t\t<template v-for=\"certfp in message.whois!.certfps\" :key=\"certfp\">\n\t\t\t\t\t<dt>Certificate:</dt>\n\t\t\t\t\t<dd>{{ certfp }}</dd>\n\t\t\t\t</template>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.server\">\n\t\t\t\t<dt>Connected to:</dt>\n\t\t\t\t<dd>\n\t\t\t\t\t{{ message.whois!.server }} <i>({{ message.whois!.server_info }})</i>\n\t\t\t\t</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.logonTime\">\n\t\t\t\t<dt>Connected at:</dt>\n\t\t\t\t<dd>{{ localetime(message.whois!.logonTime as Date) }}</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois!.idle\">\n\t\t\t\t<dt>Idle since:</dt>\n\t\t\t\t<dd>{{ localetime(message.whois!.idleTime as Date) }}</dd>\n\t\t\t</template>\n\t\t</dl>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport localetime from \"../../js/helpers/localetime\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeWhois\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup() {\n\t\treturn {\n\t\t\tlocaletime: (date: Date) => localetime(date),\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./whois.vue?vue&type=template&id=4544ec98&ts=true\"\nimport script from \"./whois.vue?vue&type=script&lang=ts\"\nexport * from \"./whois.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<span class=\"text\"><ParsedMessage :network=\"network\" :text=\"cleanText\" /></span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeMonospaceBlock\",\n\tcomponents: {\n\t\tParsedMessage,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst cleanText = computed(() => {\n\t\t\tlet lines = props.message.text!.split(\"\\n\");\n\n\t\t\t// If all non-empty lines of the MOTD start with a hyphen (which is common\n\t\t\t// across MOTDs), remove all the leading hyphens.\n\t\t\tif (lines.every((line) => line === \"\" || line[0] === \"-\")) {\n\t\t\t\tlines = lines.map((line) => line.substring(2));\n\t\t\t}\n\n\t\t\t// Remove empty lines around the MOTD (but not within it)\n\t\t\treturn lines\n\t\t\t\t.map((line) => line.replace(/\\s*$/, \"\"))\n\t\t\t\t.join(\"\\n\")\n\t\t\t\t.replace(/^[\\r\\n]+|[\\r\\n]+$/g, \"\");\n\t\t});\n\n\t\treturn {\n\t\t\tcleanText,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./monospace_block.vue?vue&type=template&id=63c82b2a&ts=true\"\nimport script from \"./monospace_block.vue?vue&type=script&lang=ts\"\nexport * from \"./monospace_block.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","const sizes = [\"Bytes\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\"];\n\nexport default (size: number) => {\n\t// Loosely inspired from https://stackoverflow.com/a/18650828/1935861\n\tconst i = size > 0 ? Math.floor(Math.log(size) / Math.log(1024)) : 0;\n\tconst fixedSize = parseFloat((size / Math.pow(1024, i)).toFixed(1));\n\treturn `${fixedSize} ${sizes[i]}`;\n};\n","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\tinvited\n\t\t<span v-if=\"message.invitedYou\">you</span>\n\t\t<Username v-else :user=\"message.target!\" />\n\t\tto <ParsedMessage :network=\"network\" :text=\"message.channel\" />\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeInvite\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./invite.vue?vue&type=template&id=1d873497&ts=true\"\nimport script from \"./invite.vue?vue&type=script&lang=ts\"\nexport * from \"./invite.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","// Styling control codes\nconst BOLD = \"\\x02\";\nconst COLOR = \"\\x03\";\nconst HEX_COLOR = \"\\x04\";\nconst RESET = \"\\x0f\";\nconst REVERSE = \"\\x16\";\nconst ITALIC = \"\\x1d\";\nconst UNDERLINE = \"\\x1f\";\nconst STRIKETHROUGH = \"\\x1e\";\nconst MONOSPACE = \"\\x11\";\n\nexport type ParsedStyle = {\n\tbold?: boolean;\n\ttextColor?: string;\n\tbgColor?: string;\n\thexColor?: string;\n\thexBgColor?: string;\n\titalic?: boolean;\n\tunderline?: boolean;\n\tstrikethrough?: boolean;\n\tmonospace?: boolean;\n\ttext: string;\n\tstart: number;\n\tend: number;\n};\n\n// Color code matcher, with format `XX,YY` where both `XX` and `YY` are\n// integers, `XX` is the text color and `YY` is an optional background color.\nconst colorRx = /^(\\d{1,2})(?:,(\\d{1,2}))?/;\n\n// 6-char Hex color code matcher\nconst hexColorRx = /^([0-9a-f]{6})(?:,([0-9a-f]{6}))?/i;\n\n// Represents all other control codes that to be ignored/filtered from the text\n// This regex allows line feed character\nconst controlCodesRx = /[\\u0000-\\u0009\\u000B-\\u001F]/g;\n\n// Converts a given text into an array of objects, each of them representing a\n// similarly styled section of the text. Each object carries the `text`, style\n// information (`bold`, `textColor`, `bgcolor`, `italic`,\n// `underline`, `strikethrough`, `monospace`), and `start`/`end` cursors.\nfunction parseStyle(text: string) {\n\tconst result: ParsedStyle[] = [];\n\tlet start = 0;\n\tlet position = 0;\n\n\t// At any given time, these carry style information since last time a styling\n\t// control code was met.\n\tlet colorCodes,\n\t\tbold,\n\t\ttextColor,\n\t\tbgColor,\n\t\thexColor,\n\t\thexBgColor,\n\t\titalic,\n\t\tunderline,\n\t\tstrikethrough,\n\t\tmonospace;\n\n\tconst resetStyle = () => {\n\t\tbold = false;\n\t\ttextColor = undefined;\n\t\tbgColor = undefined;\n\t\thexColor = undefined;\n\t\thexBgColor = undefined;\n\t\titalic = false;\n\t\tunderline = false;\n\t\tstrikethrough = false;\n\t\tmonospace = false;\n\t};\n\n\tresetStyle();\n\n\t// When called, this \"closes\" the current fragment by adding an entry to the\n\t// `result` array using the styling information set last time a control code\n\t// was met.\n\tconst emitFragment = () => {\n\t\t// Uses the text fragment starting from the last control code position up to\n\t\t// the current position\n\t\tconst textPart = text.slice(start, position);\n\n\t\t// Filters out all non-style related control codes present in this text\n\t\tconst processedText = textPart.replace(controlCodesRx, \" \");\n\n\t\tif (processedText.length) {\n\t\t\t// Current fragment starts where the previous one ends, or at 0 if none\n\t\t\tconst fragmentStart = result.length ? result[result.length - 1].end : 0;\n\n\t\t\tresult.push({\n\t\t\t\tbold,\n\t\t\t\ttextColor,\n\t\t\t\tbgColor,\n\t\t\t\thexColor,\n\t\t\t\thexBgColor,\n\t\t\t\titalic,\n\t\t\t\tunderline,\n\t\t\t\tstrikethrough,\n\t\t\t\tmonospace,\n\t\t\t\ttext: processedText,\n\t\t\t\tstart: fragmentStart,\n\t\t\t\tend: fragmentStart + processedText.length,\n\t\t\t});\n\t\t}\n\n\t\t// Now that a fragment has been \"closed\", the next one will start after that\n\t\tstart = position + 1;\n\t};\n\n\t// This loop goes through each character of the given text one by one by\n\t// bumping the `position` cursor. Every time a new special \"styling\" character\n\t// is met, an object gets created (with `emitFragment()`)information on text\n\t// encountered since the previous styling character.\n\twhile (position < text.length) {\n\t\tswitch (text[position]) {\n\t\t\tcase RESET:\n\t\t\t\temitFragment();\n\t\t\t\tresetStyle();\n\t\t\t\tbreak;\n\n\t\t\t// Meeting a BOLD character means that the ongoing text is either going to\n\t\t\t// be in bold or that the previous one was in bold and the following one\n\t\t\t// must be reset.\n\t\t\t// This same behavior applies to COLOR, REVERSE, ITALIC, and UNDERLINE.\n\t\t\tcase BOLD:\n\t\t\t\temitFragment();\n\t\t\t\tbold = !bold;\n\t\t\t\tbreak;\n\n\t\t\tcase COLOR:\n\t\t\t\temitFragment();\n\n\t\t\t\t// Go one step further to find the corresponding color\n\t\t\t\tcolorCodes = text.slice(position + 1).match(colorRx);\n\n\t\t\t\tif (colorCodes) {\n\t\t\t\t\ttextColor = Number(colorCodes[1]);\n\n\t\t\t\t\tif (colorCodes[2]) {\n\t\t\t\t\t\tbgColor = Number(colorCodes[2]);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Color code length is > 1, so bump the current position cursor by as\n\t\t\t\t\t// much (and reset the start cursor for the current text block as well)\n\t\t\t\t\tposition += colorCodes[0].length;\n\t\t\t\t\tstart = position + 1;\n\t\t\t\t} else {\n\t\t\t\t\t// If no color codes were found, toggles back to no colors (like BOLD).\n\t\t\t\t\ttextColor = undefined;\n\t\t\t\t\tbgColor = undefined;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase HEX_COLOR:\n\t\t\t\temitFragment();\n\n\t\t\t\tcolorCodes = text.slice(position + 1).match(hexColorRx);\n\n\t\t\t\tif (colorCodes) {\n\t\t\t\t\thexColor = colorCodes[1].toUpperCase();\n\n\t\t\t\t\tif (colorCodes[2]) {\n\t\t\t\t\t\thexBgColor = colorCodes[2].toUpperCase();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Color code length is > 1, so bump the current position cursor by as\n\t\t\t\t\t// much (and reset the start cursor for the current text block as well)\n\t\t\t\t\tposition += colorCodes[0].length;\n\t\t\t\t\tstart = position + 1;\n\t\t\t\t} else {\n\t\t\t\t\t// If no color codes were found, toggles back to no colors (like BOLD).\n\t\t\t\t\thexColor = undefined;\n\t\t\t\t\thexBgColor = undefined;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase REVERSE: {\n\t\t\t\temitFragment();\n\t\t\t\tconst tmp = bgColor;\n\t\t\t\tbgColor = textColor;\n\t\t\t\ttextColor = tmp;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase ITALIC:\n\t\t\t\temitFragment();\n\t\t\t\titalic = !italic;\n\t\t\t\tbreak;\n\n\t\t\tcase UNDERLINE:\n\t\t\t\temitFragment();\n\t\t\t\tunderline = !underline;\n\t\t\t\tbreak;\n\n\t\t\tcase STRIKETHROUGH:\n\t\t\t\temitFragment();\n\t\t\t\tstrikethrough = !strikethrough;\n\t\t\t\tbreak;\n\n\t\t\tcase MONOSPACE:\n\t\t\t\temitFragment();\n\t\t\t\tmonospace = !monospace;\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Evaluate the next character at the next iteration\n\t\tposition += 1;\n\t}\n\n\t// The entire text has been parsed, so we finalize the current text fragment.\n\temitFragment();\n\n\treturn result;\n}\n\nconst properties = [\n\t\"bold\",\n\t\"textColor\",\n\t\"bgColor\",\n\t\"hexColor\",\n\t\"hexBgColor\",\n\t\"italic\",\n\t\"underline\",\n\t\"strikethrough\",\n\t\"monospace\",\n];\n\nfunction prepare(text: string) {\n\treturn (\n\t\tparseStyle(text)\n\t\t\t// This optimizes fragments by combining them together when all their values\n\t\t\t// for the properties defined above are equal.\n\t\t\t.reduce((prev: ParsedStyle[], curr) => {\n\t\t\t\tif (prev.length) {\n\t\t\t\t\tconst lastEntry = prev[prev.length - 1];\n\n\t\t\t\t\tif (properties.every((key) => curr[key] === lastEntry[key])) {\n\t\t\t\t\t\tlastEntry.text += curr.text;\n\t\t\t\t\t\tlastEntry.end += curr.text.length;\n\t\t\t\t\t\treturn prev;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn prev.concat([curr]);\n\t\t\t}, [])\n\t);\n}\n\nexport default prepare;\n","// Escapes the RegExp special characters \"^\", \"$\", \"\", \".\", \"*\", \"+\", \"?\", \"(\",\n// \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in string.\n// See https://lodash.com/docs/#escapeRegExp\nimport escapeRegExp from \"lodash/escapeRegExp.js\";\nimport {Part} from \"./merge\";\n\nexport type ChannelPart = Part & {\n\tchannel: string;\n};\n\n// escapes a regex in a way that's compatible to shove it in\n// a regex char set (meaning it also escapes -)\nfunction escapeRegExpCharSet(raw: string): string {\n\tconst escaped: string = escapeRegExp(raw);\n\treturn escaped.replace(\"-\", \"\\\\-\");\n}\n\n// Given an array of channel prefixes (such as \"#\" and \"&\") and an array of user\n// modes (such as \"@\" and \"+\"), this function extracts channels and nicks from a\n// text.\n// It returns an array of objects for each channel found with their start index,\n// end index and channel name.\nfunction findChannels(text: string, channelPrefixes: string[], userModes: string[]) {\n\t// `userModePattern` is necessary to ignore user modes in /whois responses.\n\t// For example, a voiced user in #thelounge will have a /whois response of:\n\t// > foo is on the following channels: +#thelounge\n\t// We need to explicitly ignore user modes to parse such channels correctly.\n\tconst userModePattern = userModes.map(escapeRegExpCharSet).join(\"\");\n\tconst channelPrefixPattern = channelPrefixes.map(escapeRegExpCharSet).join(\"\");\n\tconst channelPattern = `(?:^|\\\\s)[${userModePattern}]*([${channelPrefixPattern}][^ \\u0007]+)`;\n\tconst channelRegExp = new RegExp(channelPattern, \"g\");\n\n\tconst result: ChannelPart[] = [];\n\tlet match: RegExpExecArray | null;\n\n\tdo {\n\t\t// With global (\"g\") regexes, calling `exec` multiple times will find\n\t\t// successive matches in the same string.\n\t\tmatch = channelRegExp.exec(text);\n\n\t\tif (match) {\n\t\t\tresult.push({\n\t\t\t\tstart: match.index + match[0].length - match[1].length,\n\t\t\t\tend: match.index + match[0].length,\n\t\t\t\tchannel: match[1],\n\t\t\t});\n\t\t}\n\t} while (match);\n\n\treturn result;\n}\n\nexport default findChannels;\n","import LinkifyIt, {Match, type Validate} from \"linkify-it\";\nimport tlds from \"tlds/index.json\" with {type: \"json\"};\n\nexport type LinkPart = {\n\tstart: number;\n\tend: number;\n\tlink: string;\n};\n\nconst linkify = LinkifyIt().tlds(tlds).tlds(\"onion\", true);\n\n// Known schemes to detect in text\nconst commonSchemes = [\n\t\"sftp\",\n\t\"smb\",\n\t\"file\",\n\t\"irc\",\n\t\"ircs\",\n\t\"svn\",\n\t\"git\",\n\t\"steam\",\n\t\"mumble\",\n\t\"ts3server\",\n\t\"svn+ssh\",\n\t\"ssh\",\n\t\"gopher\",\n\t\"gemini\",\n];\n\nfor (const schema of commonSchemes) {\n\tlinkify.add(schema + \":\", \"http:\");\n}\n\nlinkify.add(\"web+\", {\n\tvalidate(text: string, pos: number, self: LinkifyIt.LinkifyIt) {\n\t\tconst webSchemaRe = /^[a-z]+:/gi;\n\n\t\tif (!webSchemaRe.test(text.slice(pos))) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst linkEnd = self.testSchemaAt(text, \"http:\", pos + webSchemaRe.lastIndex);\n\n\t\tif (linkEnd === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn webSchemaRe.lastIndex + linkEnd;\n\t},\n\tnormalize(match) {\n\t\tmatch.schema = match.text.slice(0, match.text.indexOf(\":\") + 1);\n\t},\n});\n\n// we must rewrite protocol less urls to http, else if TL is hosted\n// on https, this would incorrectly use https for the remote link.\n// See https://github.com/thelounge/thelounge/issues/2525\n//\n// We take the validation logic from linkify and just add our own\n// normalizer.\nlinkify.add(\"//\", {\n\tvalidate: (linkify as unknown as {__schemas__: Record<string, {validate: Validate}>})\n\t\t.__schemas__[\"//\"].validate,\n\tnormalize(match) {\n\t\tmatch.schema = \"\"; // this counts as not having a schema\n\t\tmatch.url = \"http:\" + match.url;\n\t},\n});\n\nexport function findLinks(text: string) {\n\tconst matches = linkify.match(text);\n\n\tif (!matches) {\n\t\treturn [];\n\t}\n\n\treturn matches.map(makeLinkPart);\n}\n\nexport function findLinksWithSchema(text: string) {\n\tconst matches = linkify.match(text);\n\n\tif (!matches) {\n\t\treturn [];\n\t}\n\n\treturn matches.filter((url) => !!url.schema).map(makeLinkPart);\n}\n\nfunction makeLinkPart(url: Match): LinkPart {\n\treturn {\n\t\tstart: url.index,\n\t\tend: url.lastIndex,\n\t\tlink: url.url,\n\t};\n}\n","import emojiRegExp from \"emoji-regex\";\nimport {Part} from \"./merge\";\n\nconst regExp = emojiRegExp();\n\nexport type EmojiPart = Part & {\n\temoji: string;\n};\n\nfunction findEmoji(text: string) {\n\tconst result: EmojiPart[] = [];\n\tlet match: RegExpExecArray | null;\n\n\twhile ((match = regExp.exec(text))) {\n\t\tresult.push({\n\t\t\tstart: match.index,\n\t\t\tend: match.index + match[0].length,\n\t\t\temoji: match[0],\n\t\t});\n\t}\n\n\treturn result;\n}\n\nexport default findEmoji;\n","import {Part} from \"./merge\";\n\nconst nickRegExp = /([\\w[\\]\\\\`^{|}-]+)/g;\n\nexport type NamePart = Part & {\n\tnick: string;\n};\n\nfunction findNames(text: string, nicks: string[]): NamePart[] {\n\tconst result: NamePart[] = [];\n\n\t// Return early if we don't have any nicknames to find\n\tif (nicks.length === 0) {\n\t\treturn result;\n\t}\n\n\tlet match: RegExpExecArray | null;\n\n\twhile ((match = nickRegExp.exec(text))) {\n\t\tif (nicks.indexOf(match[1]) > -1) {\n\t\t\tresult.push({\n\t\t\t\tstart: match.index,\n\t\t\t\tend: match.index + match[1].length,\n\t\t\t\tnick: match[1],\n\t\t\t});\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport default findNames;\n","// Return true if any section of \"a\" or \"b\" parts (defined by their start/end\n\nimport {Part} from \"./merge\";\n\n// markers) intersect each other, false otherwise.\nfunction anyIntersection(a: Part, b: Part) {\n\treturn (\n\t\t(a.start <= b.start && b.start < a.end) ||\n\t\t(a.start < b.end && b.end <= a.end) ||\n\t\t(b.start <= a.start && a.start < b.end) ||\n\t\t(b.start < a.end && a.end <= b.end)\n\t);\n}\n\nexport default anyIntersection;\n","import anyIntersection from \"./anyIntersection\";\nimport fill from \"./fill\";\nimport {ChannelPart} from \"./findChannels\";\nimport {EmojiPart} from \"./findEmoji\";\nimport {LinkPart} from \"../../../../shared/linkify\";\nimport {NamePart} from \"./findNames\";\n\nexport type Part = {\n\tstart: number;\n\tend: number;\n};\n\ntype TextPart = Part & {\n\ttext: string;\n};\n\ntype Fragment = {\n\tstart: number;\n\tend: number;\n\ttext: string;\n};\n\n// Merge text part information within a styling fragment\nfunction assign(textPart: Part, fragment: Fragment) {\n\tconst fragStart = fragment.start;\n\tconst start = Math.max(fragment.start, textPart.start);\n\tconst end = Math.min(fragment.end, textPart.end);\n\tconst text = fragment.text.slice(start - fragStart, end - fragStart);\n\n\treturn Object.assign({}, fragment, {start, end, text});\n}\n\nfunction sortParts(a: Part, b: Part) {\n\treturn a.start - b.start || b.end - a.end;\n}\n\nexport type MergedParts = (TextPart | NamePart | EmojiPart | ChannelPart | LinkPart)[];\n\ntype MergedPart = (TextPart | NamePart | EmojiPart | ChannelPart | LinkPart) & {\n\tfragments: Fragment[];\n};\n\n// Merge the style fragments within the text parts, taking into account\n// boundaries and text sections that have not matched to links or channels.\n// For example, given a string \"foobar\" where \"foo\" and \"bar\" have been\n// identified as parts (channels, links, etc.) and \"fo\", \"ob\" and \"ar\" have 3\n// different styles, the first resulting part will contain fragments \"fo\" and\n// \"o\", and the second resulting part will contain \"b\" and \"ar\". \"o\" and \"b\"\n// fragments will contain duplicate styling attributes.\nfunction merge(parts: MergedParts, styleFragments: Fragment[], cleanText: string): MergedPart[] {\n\t// Remove overlapping parts\n\tparts = parts.sort(sortParts).reduce<MergedParts>((prev, curr) => {\n\t\tconst intersection = prev.some((p) => anyIntersection(p, curr));\n\n\t\tif (intersection) {\n\t\t\treturn prev;\n\t\t}\n\n\t\treturn prev.concat([curr]);\n\t}, []);\n\n\t// Every section of the original text that has not been captured in a \"part\"\n\t// is filled with \"text\" parts, dummy objects with start/end but no extra\n\t// metadata.\n\n\tconst filled = fill(parts, cleanText) as TextPart[];\n\tconst allParts: MergedParts = [...parts, ...filled].sort(sortParts); // Sort all parts identified based on their position in the original text\n\n\t// Distribute the style fragments within the text parts\n\treturn allParts.map((part) => {\n\t\tconst fragments = styleFragments\n\t\t\t.filter((fragment) => anyIntersection(part, fragment))\n\t\t\t.map((fragment) => assign(part, fragment));\n\n\t\treturn {...part, fragments} as MergedPart;\n\t});\n}\n\nexport default merge;\n","<template>\n\t<button\n\t\tv-if=\"link.type !== 'loading'\"\n\t\t:class=\"['toggle-button', 'toggle-preview', {opened: link.shown}]\"\n\t\t:aria-label=\"ariaLabel\"\n\t\t@click=\"onClick\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, PropType} from \"vue\";\nimport {ClientMessage, ClientLinkPreview} from \"../js/types\";\n\nexport default defineComponent({\n\tname: \"LinkPreviewToggle\",\n\tprops: {\n\t\tlink: {type: Object as PropType<ClientLinkPreview>, required: true},\n\t\tmessage: {type: Object as PropType<ClientMessage>, required: true},\n\t},\n\temits: [\"toggle-link-preview\"],\n\tsetup(props, {emit}) {\n\t\tconst ariaLabel = computed(() => {\n\t\t\treturn props.link.shown ? \"Collapse preview\" : \"Expand preview\";\n\t\t});\n\n\t\tconst onClick = () => {\n\t\t\tprops.link.shown = !props.link.shown;\n\t\t\temit(\"toggle-link-preview\", props.link, props.message);\n\t\t};\n\n\t\treturn {\n\t\t\tariaLabel,\n\t\t\tonClick,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./LinkPreviewToggle.vue?vue&type=template&id=1ba6c5b8&ts=true\"\nimport script from \"./LinkPreviewToggle.vue?vue&type=script&lang=ts\"\nexport * from \"./LinkPreviewToggle.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"preview-size\">({{ previewSize }})</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent} from \"vue\";\nimport friendlysize from \"../js/helpers/friendlysize\";\n\nexport default defineComponent({\n\tname: \"LinkPreviewFileSize\",\n\tprops: {\n\t\tsize: {type: Number, required: true},\n\t},\n\tsetup(props) {\n\t\tconst previewSize = friendlysize(props.size);\n\n\t\treturn {\n\t\t\tpreviewSize,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./LinkPreviewFileSize.vue?vue&type=template&id=19e7dc56&ts=true\"\nimport script from \"./LinkPreviewFileSize.vue?vue&type=script&lang=ts\"\nexport * from \"./LinkPreviewFileSize.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span\n\t\tclass=\"inline-channel\"\n\t\tdir=\"auto\"\n\t\trole=\"button\"\n\t\ttabindex=\"0\"\n\t\t@click.prevent=\"openContextMenu\"\n\t\t@contextmenu.prevent=\"openContextMenu\"\n\t\t><slot></slot\n\t></span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent} from \"vue\";\nimport eventbus from \"../js/eventbus\";\n\nexport default defineComponent({\n\tname: \"InlineChannel\",\n\tprops: {\n\t\tchannel: String,\n\t},\n\tsetup(props) {\n\t\tconst openContextMenu = (event) => {\n\t\t\teventbus.emit(\"contextmenu:inline-channel\", {\n\t\t\t\tevent: event,\n\t\t\t\tchannel: props.channel,\n\t\t\t});\n\t\t};\n\n\t\treturn {\n\t\t\topenContextMenu,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./InlineChannel.vue?vue&type=template&id=e318f974&ts=true\"\nimport script from \"./InlineChannel.vue?vue&type=script&lang=ts\"\nexport * from \"./InlineChannel.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import {h as createElement, VNode} from \"vue\";\nimport parseStyle from \"./ircmessageparser/parseStyle\";\nimport findChannels, {ChannelPart} from \"./ircmessageparser/findChannels\";\nimport {findLinks, LinkPart} from \"../../../shared/linkify\";\nimport findEmoji, {EmojiPart} from \"./ircmessageparser/findEmoji\";\nimport findNames, {NamePart} from \"./ircmessageparser/findNames\";\nimport merge, {MergedParts} from \"./ircmessageparser/merge\";\nimport emojiMap from \"./fullnamemap.json\" with {type: \"json\"};\nimport LinkPreviewToggle from \"../../components/LinkPreviewToggle.vue\";\nimport LinkPreviewFileSize from \"../../components/LinkPreviewFileSize.vue\";\nimport InlineChannel from \"../../components/InlineChannel.vue\";\nimport Username from \"../../components/Username.vue\";\nimport {ClientMessage, ClientNetwork} from \"../types\";\n\nconst emojiModifiersRegex = /[\\u{1f3fb}-\\u{1f3ff}]|\\u{fe0f}/gu;\n\ntype FragmentType = {\n\tstart: number;\n\tend: number;\n\ttext: string;\n};\n\n// Type guards for proper type narrowing\nfunction isLinkPart(part: {\n\tfragments: FragmentType[];\n\t[key: string]: unknown;\n}): part is LinkPart & {fragments: FragmentType[]} {\n\treturn \"link\" in part;\n}\n\nfunction isChannelPart(part: {\n\tfragments: FragmentType[];\n\t[key: string]: unknown;\n}): part is ChannelPart & {fragments: FragmentType[]} {\n\treturn \"channel\" in part;\n}\n\nfunction isEmojiPart(part: {\n\tfragments: FragmentType[];\n\t[key: string]: unknown;\n}): part is EmojiPart & {fragments: FragmentType[]} {\n\treturn \"emoji\" in part;\n}\n\nfunction isNamePart(part: {\n\tfragments: FragmentType[];\n\t[key: string]: unknown;\n}): part is NamePart & {fragments: FragmentType[]} {\n\treturn \"nick\" in part;\n}\n\ntype Fragment = {\n\tclass?: string[];\n\ttext?: string;\n};\n\ntype StyledFragment = Fragment & {\n\ttextColor?: string;\n\tbgColor?: string;\n\thexColor?: string;\n\thexBgColor?: string;\n\n\tbold?: boolean;\n\titalic?: boolean;\n\tunderline?: boolean;\n\tmonospace?: boolean;\n\tstrikethrough?: boolean;\n};\n\n// Create an HTML `span` with styling information for a given fragment\nfunction createFragment(fragment: StyledFragment): VNode | string | undefined {\n\tconst classes: string[] = [];\n\n\tif (fragment.bold) {\n\t\tclasses.push(\"irc-bold\");\n\t}\n\n\tif (fragment.textColor !== undefined) {\n\t\tclasses.push(\"irc-fg\" + fragment.textColor);\n\t}\n\n\tif (fragment.bgColor !== undefined) {\n\t\tclasses.push(\"irc-bg\" + fragment.bgColor);\n\t}\n\n\tif (fragment.italic) {\n\t\tclasses.push(\"irc-italic\");\n\t}\n\n\tif (fragment.underline) {\n\t\tclasses.push(\"irc-underline\");\n\t}\n\n\tif (fragment.strikethrough) {\n\t\tclasses.push(\"irc-strikethrough\");\n\t}\n\n\tif (fragment.monospace) {\n\t\tclasses.push(\"irc-monospace\");\n\t}\n\n\tconst data: {\n\t\tclass?: string[];\n\t\tstyle?: Record<string, string>;\n\t} = {\n\t\tclass: undefined,\n\t\tstyle: undefined,\n\t};\n\n\tlet hasData = false;\n\n\tif (classes.length > 0) {\n\t\thasData = true;\n\t\tdata.class = classes;\n\t}\n\n\tif (fragment.hexColor) {\n\t\thasData = true;\n\t\tdata.style = {\n\t\t\tcolor: `#${fragment.hexColor}`,\n\t\t};\n\n\t\tif (fragment.hexBgColor) {\n\t\t\tdata.style[\"background-color\"] = `#${fragment.hexBgColor}`;\n\t\t}\n\t}\n\n\treturn hasData ? createElement(\"span\", data, fragment.text) : fragment.text;\n}\n\n// Transform an IRC message potentially filled with styling control codes, URLs,\n// nicknames, and channels into a string of HTML elements to display on the client.\nfunction parse(text: string, message?: ClientMessage, network?: ClientNetwork) {\n\t// Extract the styling information and get the plain text version from it\n\tconst styleFragments = parseStyle(text);\n\tconst cleanText = styleFragments.map((fragment) => fragment.text).join(\"\");\n\n\t// On the plain text, find channels and URLs, returned as \"parts\". Parts are\n\t// arrays of objects containing start and end markers, as well as metadata\n\t// depending on what was found (channel or link).\n\tconst channelPrefixes = network ? network.serverOptions.CHANTYPES : [\"#\", \"&\"];\n\tconst userModes = network\n\t\t? network.serverOptions.PREFIX?.prefix?.map((pref) => pref.symbol)\n\t\t: [\"!\", \"@\", \"%\", \"+\"];\n\tconst channelParts = findChannels(cleanText, channelPrefixes, userModes);\n\tconst linkParts = findLinks(cleanText);\n\tconst emojiParts = findEmoji(cleanText);\n\tconst nameParts = findNames(cleanText, message ? message.users || [] : []);\n\n\tconst parts = (channelParts as MergedParts)\n\t\t.concat(linkParts)\n\t\t.concat(emojiParts)\n\t\t.concat(nameParts);\n\n\t// Merge the styling information with the channels / URLs / nicks / text objects and\n\t// generate HTML strings with the resulting fragments\n\treturn merge(parts, styleFragments, cleanText).map((textPart) => {\n\t\tconst fragments = textPart.fragments.map((fragment) => createFragment(fragment));\n\n\t\t// Wrap these potentially styled fragments with links and channel buttons\n\t\tif (isLinkPart(textPart)) {\n\t\t\tconst preview =\n\t\t\t\tmessage &&\n\t\t\t\tmessage.previews &&\n\t\t\t\tmessage.previews.find((p) => p.link === textPart.link);\n\t\t\tconst link = createElement(\n\t\t\t\t\"a\",\n\t\t\t\t{\n\t\t\t\t\thref: textPart.link,\n\t\t\t\t\tdir: preview ? null : \"auto\",\n\t\t\t\t\ttarget: \"_blank\",\n\t\t\t\t\trel: \"noopener\",\n\t\t\t\t},\n\t\t\t\tfragments\n\t\t\t);\n\n\t\t\tif (!preview) {\n\t\t\t\treturn link;\n\t\t\t}\n\n\t\t\tconst linkEls = [link];\n\n\t\t\tif (preview.size > 0) {\n\t\t\t\tlinkEls.push(\n\t\t\t\t\tcreateElement(LinkPreviewFileSize, {\n\t\t\t\t\t\tsize: preview.size,\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tlinkEls.push(\n\t\t\t\tcreateElement(LinkPreviewToggle, {\n\t\t\t\t\tlink: preview,\n\t\t\t\t\tmessage: message,\n\t\t\t\t})\n\t\t\t);\n\n\t\t\t// We wrap the link, size, and the toggle button into <span dir=\"auto\">\n\t\t\t// to correctly keep the left-to-right order of these elements\n\t\t\treturn createElement(\n\t\t\t\t\"span\",\n\t\t\t\t{\n\t\t\t\t\tdir: \"auto\",\n\t\t\t\t},\n\t\t\t\tlinkEls\n\t\t\t);\n\t\t} else if (isChannelPart(textPart)) {\n\t\t\treturn createElement(\n\t\t\t\tInlineChannel,\n\t\t\t\t{\n\t\t\t\t\tchannel: textPart.channel,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdefault: () => fragments,\n\t\t\t\t}\n\t\t\t);\n\t\t} else if (isEmojiPart(textPart)) {\n\t\t\tconst emojiWithoutModifiers = textPart.emoji.replace(emojiModifiersRegex, \"\");\n\t\t\tconst title = emojiMap[emojiWithoutModifiers]\n\t\t\t\t? `Emoji: ${emojiMap[emojiWithoutModifiers]}`\n\t\t\t\t: null;\n\n\t\t\treturn createElement(\n\t\t\t\t\"span\",\n\t\t\t\t{\n\t\t\t\t\tclass: [\"emoji\"],\n\t\t\t\t\trole: \"img\",\n\t\t\t\t\t\"aria-label\": title,\n\t\t\t\t\ttitle: title,\n\t\t\t\t},\n\t\t\t\tfragments\n\t\t\t);\n\t\t} else if (isNamePart(textPart)) {\n\t\t\treturn createElement(\n\t\t\t\tUsername,\n\t\t\t\t{\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tnick: textPart.nick,\n\t\t\t\t\t},\n\t\t\t\t\tdir: \"auto\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdefault: () => fragments,\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\treturn fragments;\n\t});\n}\n\nexport default parse;\n","// Create plain text entries corresponding to areas of the text that match no\n// existing entries. Returns an empty array if all parts of the text have been\n\nimport {Part} from \"./merge\";\n\n// parsed into recognizable entries already.\nfunction fill(existingEntries: Part[], text: string) {\n\tlet position = 0;\n\n\t// Fill inner parts of the text. For example, if text is `foobarbaz` and both\n\t// `foo` and `baz` have matched into an entry, this will return a dummy entry\n\t// corresponding to `bar`.\n\tconst result = existingEntries.reduce<Part[]>((acc, textSegment) => {\n\t\tif (textSegment.start > position) {\n\t\t\tacc.push({\n\t\t\t\tstart: position,\n\t\t\t\tend: textSegment.start,\n\t\t\t});\n\t\t}\n\n\t\tposition = textSegment.end;\n\t\treturn acc;\n\t}, []);\n\n\t// Complete the unmatched end of the text with a dummy entry\n\tif (position < text.length) {\n\t\tresult.push({\n\t\t\tstart: position,\n\t\t\tend: text.length,\n\t\t});\n\t}\n\n\treturn result;\n}\n\nexport default fill;\n","import script from \"./ParsedMessage.vue?vue&type=script&lang=ts\"\nexport * from \"./ParsedMessage.vue?vue&type=script&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport parse from \"../js/helpers/parse\";\nimport type {ClientMessage, ClientNetwork} from \"../js/types\";\n\nexport default defineComponent({\n\tname: \"ParsedMessage\",\n\tfunctional: true,\n\tprops: {\n\t\ttext: String,\n\t\tmessage: {type: Object as PropType<ClientMessage | string>, required: false},\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: false},\n\t},\n\trender(context) {\n\t\treturn parse(\n\t\t\ttypeof context.text !== \"undefined\" ? context.text : context.message.text,\n\t\t\tcontext.message,\n\t\t\tcontext.network\n\t\t);\n\t},\n});\n</script>\n","<template>\n\t<span class=\"content\">\n\t\t<template v-if=\"message.from && message.from.nick\"\n\t\t\t><Username :user=\"message.from\" /> has changed the topic to:\n\t\t</template>\n\t\t<template v-else>The topic is: </template>\n\t\t<span v-if=\"message.text\" class=\"new-topic\"\n\t\t\t><ParsedMessage :network=\"network\" :message=\"message\"\n\t\t/></span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport type {ClientMessage, ClientNetwork} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeTopic\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./topic.vue?vue&type=template&id=fd1370ea&ts=true\"\nimport script from \"./topic.vue?vue&type=script&lang=ts\"\nexport * from \"./topic.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\t<i class=\"hostmask\"> (<ParsedMessage :network=\"network\" :text=\"message.hostmask\" />)</i> has\n\t\tleft the channel\n\t\t<i v-if=\"message.text\" class=\"part-reason\"\n\t\t\t>(<ParsedMessage :network=\"network\" :message=\"message\" />)</i\n\t\t>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypePart\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./part.vue?vue&type=template&id=0912be24&ts=true\"\nimport script from \"./part.vue?vue&type=script&lang=ts\"\nexport * from \"./part.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\tyour user mode is <b>{{ message.raw_modes }} </b>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\n\nexport default defineComponent({\n\tname: \"MessageChannelMode\",\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./mode_user.vue?vue&type=template&id=afc2368a&ts=true\"\nimport script from \"./mode_user.vue?vue&type=script&lang=ts\"\nexport * from \"./mode_user.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\t{{ ` ` }}\n\n\t\t<span class=\"ctcp-message\"><ParsedMessage :text=\"message.ctcpMessage\" /></span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeCTCP\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./ctcp.vue?vue&type=template&id=5cc606e9&ts=true\"\nimport script from \"./ctcp.vue?vue&type=script&lang=ts\"\nexport * from \"./ctcp.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span\n\t\t:class=\"['user', {[nickColor]: store.state.settings.coloredNicks}, {active: active}]\"\n\t\t:data-name=\"user.nick\"\n\t\trole=\"button\"\n\t\tv-on=\"onHover ? {mouseenter: hover} : {}\"\n\t\t@click.prevent=\"openContextMenu\"\n\t\t@contextmenu.prevent=\"openContextMenu\"\n\t\t><slot>{{ displayNick }} </slot></span\n\t>\n</template>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, PropType} from \"vue\";\nimport {UserInMessage} from \"../../shared/types/msg\";\nimport eventbus from \"../js/eventbus\";\nimport colorClass from \"../js/helpers/colorClass\";\nimport type {ClientChan, ClientNetwork} from \"../js/types\";\nimport {useStore} from \"../js/store\";\nimport {ChanState} from \"../../shared/types/chan\";\n\ntype UsernameUser = Partial<UserInMessage> & {\n\tmode?: string;\n\tnick: string;\n};\n\nexport default defineComponent({\n\tname: \"Username\",\n\tprops: {\n\t\tuser: {\n\t\t\t// TODO: UserInMessage shouldn't be necessary here.\n\t\t\ttype: Object as PropType<UsernameUser | UserInMessage>,\n\t\t\trequired: true,\n\t\t},\n\t\tactive: Boolean,\n\t\tonHover: {\n\t\t\ttype: Function as PropType<(user: UserInMessage) => void>,\n\t\t\trequired: false,\n\t\t},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: false},\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: false},\n\t},\n\tsetup(props) {\n\t\tconst mode = computed(() => {\n\t\t\t// Message objects have a singular mode, but user objects have modes array\n\t\t\tif (props.user.modes) {\n\t\t\t\treturn props.user.modes[0];\n\t\t\t}\n\n\t\t\treturn props.user.mode;\n\t\t});\n\n\t\t// TODO: Nick must be ! because our user prop union includes UserInMessage\n\t\tconst nickColor = computed(() => colorClass(props.user.nick));\n\n\t\tconst hover = () => {\n\t\t\tif (props.onHover) {\n\t\t\t\treturn props.onHover(props.user as UserInMessage);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\n\t\tconst openContextMenu = (event: Event) => {\n\t\t\teventbus.emit(\"contextmenu:user\", {\n\t\t\t\tevent: event,\n\t\t\t\tuser: props.user,\n\t\t\t\tnetwork: props.network,\n\t\t\t\tchannel: props.channel,\n\t\t\t});\n\t\t};\n\n\t\tconst store = useStore();\n\n\t\t// Add to autocomplete for bridged users (need to switch channel after connect if channel active on connect)\n\t\tif (\n\t\t\tstore.state.settings.beautifyBridgedMessages &&\n\t\t\tprops.user.shoutbox &&\n\t\t\tstore.state.activeChannel?.channel.state === ChanState.JOINED &&\n\t\t\t!store.state.activeChannel?.channel.users.find((u) => u.nick === props.user.nick)\n\t\t) {\n\t\t\tstore.state.activeChannel?.channel.users.push({\n\t\t\t\tnick: props.user.nick!,\n\t\t\t\tmodes: [],\n\t\t\t\tlastMessage: Date.now(),\n\t\t\t\tmode: \"\",\n\t\t\t\taway: \"\",\n\t\t\t});\n\t\t}\n\n\t\t// Allow adjusting nick display via setting\n\t\tconst displayNick = computed(() => {\n\t\t\tconst umode = mode.value ?? \"\";\n\t\t\tconst nick = props.user.nick!;\n\n\t\t\tif (\n\t\t\t\tstore.state.settings.beautifyBridgedMessages &&\n\t\t\t\tprops.user.shoutbox &&\n\t\t\t\tstore.state.settings.bridgedMessageNicksStyle === \"parentheses\"\n\t\t\t) {\n\t\t\t\treturn `(${umode}${nick})`;\n\t\t\t}\n\n\t\t\treturn `${umode}${nick}`;\n\t\t});\n\n\t\treturn {\n\t\t\tdisplayNick,\n\t\t\tmode,\n\t\t\tnickColor,\n\t\t\thover,\n\t\t\topenContextMenu,\n\t\t\tstore,\n\t\t};\n\t},\n});\n</script>\n","// Generates a string from \"color-1\" to \"color-32\" based on an input string\nexport default (str: string) => {\n\tlet hash = 0;\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\thash += str.charCodeAt(i);\n\t}\n\n\t/*\n\t\tModulo 32 lets us be case insensitive for ascii\n\t\tdue to A being ascii 65 (100 0001)\n\t\t while a being ascii 97 (110 0001)\n\t*/\n\treturn \"color-\" + (1 + (hash % 32)).toString();\n};\n","import { render } from \"./Username.vue?vue&type=template&id=1bc7b953&ts=true\"\nimport script from \"./Username.vue?vue&type=script&lang=ts\"\nexport * from \"./Username.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\tTopic set by\n\t\t<Username :user=\"message.from!\" />\n\t\ton {{ messageTimeLocale }}\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport localetime from \"../../js/helpers/localetime\";\nimport {computed, defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeTopicSetBy\",\n\tcomponents: {\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst messageTimeLocale = computed(() => localetime(props.message.when!));\n\n\t\treturn {\n\t\t\tmessageTimeLocale,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./topic_set_by.vue?vue&type=template&id=59d2c9b3&ts=true\"\nimport script from \"./topic_set_by.vue?vue&type=script&lang=ts\"\nexport * from \"./topic_set_by.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\tchannel mode is <b>{{ message.text }} </b>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\n\nexport default defineComponent({\n\tname: \"MessageChannelMode\",\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./mode_channel.vue?vue&type=template&id=08285cb4&ts=true\"\nimport script from \"./mode_channel.vue?vue&type=script&lang=ts\"\nexport * from \"./mode_channel.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import dayjs from \"dayjs\";\n\nexport default (time: Date | number) => dayjs(time).format(\"D MMMM YYYY, HH:mm:ss\");\n","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\t<i class=\"hostmask\"> (<ParsedMessage :network=\"network\" :text=\"message.hostmask\" />)</i>\n\t\t<template v-if=\"message.account\">\n\t\t\t<i class=\"account\"> [{{ message.account }}]</i>\n\t\t</template>\n\t\t<template v-if=\"message.gecos\">\n\t\t\t<i class=\"realname\"> ({{ message.gecos }})</i>\n\t\t</template>\n\t\thas joined the channel\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeJoin\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./join.vue?vue&type=template&id=fa953800&ts=true\"\nimport script from \"./join.vue?vue&type=script&lang=ts\"\nexport * from \"./join.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\tsent a <abbr title=\"Client-to-client protocol\">CTCP</abbr> request:\n\t\t<span class=\"ctcp-message\"><ParsedMessage :text=\"message.ctcpMessage\" /></span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeRequestCTCP\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./ctcp_request.vue?vue&type=template&id=03fe2148&ts=true\"\nimport script from \"./ctcp_request.vue?vue&type=script&lang=ts\"\nexport * from \"./ctcp_request.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","const colorCodeMap = [\n\t[\"00\", \"White\"],\n\t[\"01\", \"Black\"],\n\t[\"02\", \"Blue\"],\n\t[\"03\", \"Green\"],\n\t[\"04\", \"Red\"],\n\t[\"05\", \"Brown\"],\n\t[\"06\", \"Magenta\"],\n\t[\"07\", \"Orange\"],\n\t[\"08\", \"Yellow\"],\n\t[\"09\", \"Light Green\"],\n\t[\"10\", \"Cyan\"],\n\t[\"11\", \"Light Cyan\"],\n\t[\"12\", \"Light Blue\"],\n\t[\"13\", \"Pink\"],\n\t[\"14\", \"Grey\"],\n\t[\"15\", \"Light Grey\"],\n];\n\nconst timeFormats = {\n\tmsgDefault: \"HH:mm\",\n\tmsgWithSeconds: \"HH:mm:ss\",\n\tmsg12h: \"hh:mm A\",\n\tmsg12hWithSeconds: \"hh:mm:ss A\",\n};\n\nexport default {\n\tcolorCodeMap,\n\tcommands: [] as string[],\n\ttimeFormats,\n\t// Same value as media query in CSS that forces sidebars to become overlays\n\tmobileViewportPixels: 768,\n};\n","export default (event: MouseEvent | Mousetrap.ExtendedKeyboardEvent) => {\n\tif (\n\t\t(event.target as HTMLElement).tagName !== \"TEXTAREA\" &&\n\t\t(event.target as HTMLElement).tagName !== \"INPUT\"\n\t) {\n\t\treturn false;\n\t}\n\n\t// If focus is in a textarea, do not handle keybinds if user has typed anything\n\t// This is done to prevent keyboard layout binds conflicting with ours\n\t// For example alt+shift+left on macos selects a word\n\treturn !!(event.target as HTMLInputElement | HTMLTextAreaElement).value;\n};\n","<template>\n\t<aside id=\"sidebar\" ref=\"sidebar\" :class=\"store.state.settings.compactSidebar ? 'compact' : ''\">\n\t\t<div class=\"scrollable-area\">\n\t\t\t<div class=\"logo-container\">\n\t\t\t\t<img\n\t\t\t\t\t:src=\"`img/logo-${isPublic() ? 'horizontal-' : ''}transparent-bg.svg`\"\n\t\t\t\t\tclass=\"logo\"\n\t\t\t\t\talt=\"The Lounge\"\n\t\t\t\t\trole=\"presentation\"\n\t\t\t\t/>\n\t\t\t\t<img\n\t\t\t\t\t:src=\"`img/logo-${isPublic() ? 'horizontal-' : ''}transparent-bg-inverted.svg`\"\n\t\t\t\t\tclass=\"logo-inverted\"\n\t\t\t\t\talt=\"The Lounge\"\n\t\t\t\t\trole=\"presentation\"\n\t\t\t\t/>\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"isDevelopment\"\n\t\t\t\t\ttitle=\"The Lounge has been built in development mode\"\n\t\t\t\t\t:style=\"{\n\t\t\t\t\t\tbackgroundColor: '#ff9e18',\n\t\t\t\t\t\tcolor: '#000',\n\t\t\t\t\t\tpadding: '2px',\n\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\tfontSize: '12px',\n\t\t\t\t\t}\"\n\t\t\t\t\t>DEVELOPER</span\n\t\t\t\t>\n\t\t\t</div>\n\t\t\t<NetworkList />\n\t\t</div>\n\t\t<footer id=\"footer\">\n\t\t\t<span\n\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-touch\"\n\t\t\t\taria-label=\"Connect to network\"\n\t\t\t\t><router-link\n\t\t\t\t\tv-slot:default=\"{navigate, isActive}\"\n\t\t\t\t\tto=\"/connect\"\n\t\t\t\t\trole=\"tab\"\n\t\t\t\t\taria-controls=\"connect\"\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\t:class=\"['icon', 'connect', {active: isActive}]\"\n\t\t\t\t\t\t:aria-selected=\"isActive\"\n\t\t\t\t\t\t@click=\"navigate\"\n\t\t\t\t\t\t@keypress.enter=\"navigate as (e?: KeyboardEvent) => void\"\n\t\t\t\t\t/> </router-link\n\t\t\t></span>\n\t\t\t<span class=\"tooltipped tooltipped-n tooltipped-no-touch\" aria-label=\"Settings\"\n\t\t\t\t><router-link\n\t\t\t\t\tv-slot:default=\"{navigate, isActive}\"\n\t\t\t\t\tto=\"/settings\"\n\t\t\t\t\trole=\"tab\"\n\t\t\t\t\taria-controls=\"settings\"\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\t:class=\"['icon', 'settings', {active: isActive}]\"\n\t\t\t\t\t\t:aria-selected=\"isActive\"\n\t\t\t\t\t\t@click=\"navigate\"\n\t\t\t\t\t\t@keypress.enter=\"navigate as (e?: KeyboardEvent) => void\"\n\t\t\t\t\t></button> </router-link\n\t\t\t></span>\n\t\t\t<span\n\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-touch\"\n\t\t\t\t:aria-label=\"\n\t\t\t\t\tstore.state.serverConfiguration?.isUpdateAvailable\n\t\t\t\t\t\t? 'Help\\n(update available)'\n\t\t\t\t\t\t: 'Help'\n\t\t\t\t\"\n\t\t\t\t><router-link\n\t\t\t\t\tv-slot:default=\"{navigate, isActive}\"\n\t\t\t\t\tto=\"/help\"\n\t\t\t\t\trole=\"tab\"\n\t\t\t\t\taria-controls=\"help\"\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\t:aria-selected=\"route.name === 'Help'\"\n\t\t\t\t\t\t:class=\"[\n\t\t\t\t\t\t\t'icon',\n\t\t\t\t\t\t\t'help',\n\t\t\t\t\t\t\t{notified: store.state.serverConfiguration?.isUpdateAvailable},\n\t\t\t\t\t\t\t{active: isActive},\n\t\t\t\t\t\t]\"\n\t\t\t\t\t\t@click=\"navigate\"\n\t\t\t\t\t\t@keypress.enter=\"navigate as (e?: KeyboardEvent) => void\"\n\t\t\t\t\t></button> </router-link\n\t\t\t></span>\n\t\t</footer>\n\t</aside>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, nextTick, onMounted, onUnmounted, PropType, ref} from \"vue\";\nimport {useRoute} from \"vue-router\";\nimport {useStore} from \"../js/store\";\nimport NetworkList from \"./NetworkList.vue\";\n\nexport default defineComponent({\n\tname: \"Sidebar\",\n\tcomponents: {\n\t\tNetworkList,\n\t},\n\tprops: {\n\t\toverlay: {type: Object as PropType<HTMLElement | null>, required: true},\n\t},\n\tsetup(props) {\n\t\tconst isDevelopment = process.env.NODE_ENV !== \"production\";\n\n\t\tconst store = useStore();\n\t\tconst route = useRoute();\n\n\t\tconst touchStartPos = ref<Touch | null>();\n\t\tconst touchCurPos = ref<Touch | null>();\n\t\tconst touchStartTime = ref<number>(0);\n\t\tconst menuWidth = ref<number>(0);\n\t\tconst menuIsMoving = ref<boolean>(false);\n\t\tconst menuIsAbsolute = ref<boolean>(false);\n\n\t\tconst sidebar = ref<HTMLElement | null>(null);\n\n\t\tconst toggle = (state: boolean) => {\n\t\t\tstore.commit(\"sidebarOpen\", state);\n\t\t};\n\n\t\tconst onTouchMove = (e: TouchEvent) => {\n\t\t\tconst touch = (touchCurPos.value = e.touches.item(0));\n\n\t\t\tif (\n\t\t\t\t!touch ||\n\t\t\t\t!touchStartPos.value ||\n\t\t\t\t!touchStartPos.value.screenX ||\n\t\t\t\t!touchStartPos.value.screenY\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet distX = touch.screenX - touchStartPos.value.screenX;\n\t\t\tconst distY = touch.screenY - touchStartPos.value.screenY;\n\n\t\t\tif (!menuIsMoving.value) {\n\t\t\t\t// tan(45°) is 1. Gestures in 0°-45° (< 1) are considered horizontal, so\n\t\t\t\t// menu must be open; gestures in 45°-90° (>1) are considered vertical, so\n\t\t\t\t// chat windows must be scrolled.\n\t\t\t\tif (Math.abs(distY / distX) >= 1) {\n\t\t\t\t\t// eslint-disable-next-line no-use-before-define\n\t\t\t\t\tonTouchEnd();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst devicePixelRatio = window.devicePixelRatio || 2;\n\n\t\t\t\tif (Math.abs(distX) > devicePixelRatio) {\n\t\t\t\t\tstore.commit(\"sidebarDragging\", true);\n\t\t\t\t\tmenuIsMoving.value = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Do not animate the menu on desktop view\n\t\t\tif (!menuIsAbsolute.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (store.state.sidebarOpen) {\n\t\t\t\tdistX += menuWidth.value;\n\t\t\t}\n\n\t\t\tif (distX > menuWidth.value) {\n\t\t\t\tdistX = menuWidth.value;\n\t\t\t} else if (distX < 0) {\n\t\t\t\tdistX = 0;\n\t\t\t}\n\n\t\t\tif (sidebar.value) {\n\t\t\t\tsidebar.value.style.transform = \"translate3d(\" + distX.toString() + \"px, 0, 0)\";\n\t\t\t}\n\n\t\t\tif (props.overlay) {\n\t\t\t\tprops.overlay.style.opacity = `${distX / menuWidth.value}`;\n\t\t\t}\n\t\t};\n\n\t\tconst onTouchEnd = () => {\n\t\t\tif (!touchStartPos.value?.screenX || !touchCurPos.value?.screenX) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst diff = touchCurPos.value.screenX - touchStartPos.value.screenX;\n\t\t\tconst absDiff = Math.abs(diff);\n\n\t\t\tif (\n\t\t\t\tabsDiff > menuWidth.value / 2 ||\n\t\t\t\t(Date.now() - touchStartTime.value < 180 && absDiff > 50)\n\t\t\t) {\n\t\t\t\ttoggle(diff > 0);\n\t\t\t}\n\n\t\t\tdocument.body.removeEventListener(\"touchmove\", onTouchMove);\n\t\t\tdocument.body.removeEventListener(\"touchend\", onTouchEnd);\n\n\t\t\tstore.commit(\"sidebarDragging\", false);\n\n\t\t\ttouchStartPos.value = null;\n\t\t\ttouchCurPos.value = null;\n\t\t\ttouchStartTime.value = 0;\n\t\t\tmenuIsMoving.value = false;\n\n\t\t\tvoid nextTick(() => {\n\t\t\t\tif (sidebar.value) {\n\t\t\t\t\tsidebar.value.style.transform = \"\";\n\t\t\t\t}\n\n\t\t\t\tif (props.overlay) {\n\t\t\t\t\tprops.overlay.style.opacity = \"\";\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tconst onTouchStart = (e: TouchEvent) => {\n\t\t\tif (!sidebar.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttouchStartPos.value = touchCurPos.value = e.touches.item(0);\n\n\t\t\tif (e.touches.length !== 1) {\n\t\t\t\tonTouchEnd();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst styles = window.getComputedStyle(sidebar.value);\n\n\t\t\tmenuWidth.value = parseFloat(styles.width);\n\t\t\tmenuIsAbsolute.value = styles.position === \"absolute\";\n\n\t\t\tif (\n\t\t\t\t!store.state.sidebarOpen ||\n\t\t\t\t(touchStartPos.value?.screenX && touchStartPos.value.screenX > menuWidth.value)\n\t\t\t) {\n\t\t\t\ttouchStartTime.value = Date.now();\n\n\t\t\t\tdocument.body.addEventListener(\"touchmove\", onTouchMove, {passive: true});\n\t\t\t\tdocument.body.addEventListener(\"touchend\", onTouchEnd, {passive: true});\n\t\t\t}\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\tdocument.body.addEventListener(\"touchstart\", onTouchStart, {passive: true});\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\tdocument.body.removeEventListener(\"touchstart\", onTouchStart);\n\t\t});\n\n\t\tconst isPublic = () => document.body.classList.contains(\"public\");\n\n\t\treturn {\n\t\t\tisDevelopment,\n\t\t\tstore,\n\t\t\troute,\n\t\t\tsidebar,\n\t\t\ttoggle,\n\t\t\tonTouchStart,\n\t\t\tonTouchMove,\n\t\t\tonTouchEnd,\n\t\t\tisPublic,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<div\n\t\tv-if=\"store.state.networks.length === 0\"\n\t\tclass=\"empty\"\n\t\trole=\"navigation\"\n\t\taria-label=\"Network and Channel list\"\n\t>\n\t\tYou are not connected to any networks yet.\n\t</div>\n\t<div v-else ref=\"networklist\" role=\"navigation\" aria-label=\"Network and Channel list\">\n\t\t<div v-if=\"store.state.settings.jumptoEabled\" class=\"jump-to-input\">\n\t\t\t<input\n\t\t\t\tref=\"searchInput\"\n\t\t\t\t:value=\"searchText\"\n\t\t\t\tplaceholder=\"Jump to...\"\n\t\t\t\ttype=\"search\"\n\t\t\t\tclass=\"search input mousetrap\"\n\t\t\t\taria-label=\"Search among the channel list\"\n\t\t\t\ttabindex=\"-1\"\n\t\t\t\t@input=\"setSearchText\"\n\t\t\t\t@keydown.up=\"navigateResults($event, -1)\"\n\t\t\t\t@keydown.down=\"navigateResults($event, 1)\"\n\t\t\t\t@keydown.page-up=\"navigateResults($event, -10)\"\n\t\t\t\t@keydown.page-down=\"navigateResults($event, 10)\"\n\t\t\t\t@keydown.enter=\"selectResult\"\n\t\t\t\t@keydown.escape=\"deactivateSearch\"\n\t\t\t\t@focus=\"activateSearch\"\n\t\t\t/>\n\t\t</div>\n\t\t<div v-if=\"searchText\" class=\"jump-to-results\">\n\t\t\t<div v-if=\"results.length\">\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"item in results\"\n\t\t\t\t\t:key=\"item.channel.id\"\n\t\t\t\t\t@mouseenter=\"setActiveSearchItem(item.channel)\"\n\t\t\t\t\t@click.prevent=\"selectResult\"\n\t\t\t\t>\n\t\t\t\t\t<Channel\n\t\t\t\t\t\tv-if=\"item.channel.type !== 'lobby'\"\n\t\t\t\t\t\t:channel=\"item.channel\"\n\t\t\t\t\t\t:network=\"item.network\"\n\t\t\t\t\t\t:active=\"item.channel === activeSearchItem\"\n\t\t\t\t\t\t:is-filtering=\"true\"\n\t\t\t\t\t/>\n\t\t\t\t\t<NetworkLobby\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:channel=\"item.channel\"\n\t\t\t\t\t\t:network=\"item.network\"\n\t\t\t\t\t\t:active=\"item.channel === activeSearchItem\"\n\t\t\t\t\t\t:is-filtering=\"true\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-else class=\"no-results\">No results found.</div>\n\t\t</div>\n\t\t<Draggable\n\t\t\tv-else\n\t\t\t:list=\"store.state.networks\"\n\t\t\t:delay=\"LONG_TOUCH_DURATION\"\n\t\t\t:delay-on-touch-only=\"true\"\n\t\t\t:touch-start-threshold=\"10\"\n\t\t\thandle=\".channel-list-item[data-type='lobby']\"\n\t\t\tdraggable=\".network\"\n\t\t\tghost-class=\"ui-sortable-ghost\"\n\t\t\tdrag-class=\"ui-sortable-dragging\"\n\t\t\tgroup=\"networks\"\n\t\t\tclass=\"networks\"\n\t\t\titem-key=\"uuid\"\n\t\t\t@change=\"onNetworkSort\"\n\t\t\t@choose=\"onDraggableChoose\"\n\t\t\t@unchoose=\"onDraggableUnchoose\"\n\t\t>\n\t\t\t<template v-slot:item=\"{element: network}\">\n\t\t\t\t<div\n\t\t\t\t\t:id=\"'network-' + network.uuid\"\n\t\t\t\t\t:key=\"network.uuid\"\n\t\t\t\t\t:class=\"{\n\t\t\t\t\t\tcollapsed: network.isCollapsed,\n\t\t\t\t\t\t'not-connected': !network.status.connected,\n\t\t\t\t\t\t'not-secure': !network.status.secure,\n\t\t\t\t\t}\"\n\t\t\t\t\tclass=\"network\"\n\t\t\t\t\trole=\"region\"\n\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t@touchstart=\"onDraggableTouchStart\"\n\t\t\t\t\t@touchmove=\"onDraggableTouchMove\"\n\t\t\t\t\t@touchend=\"onDraggableTouchEnd\"\n\t\t\t\t\t@touchcancel=\"onDraggableTouchEnd\"\n\t\t\t\t>\n\t\t\t\t\t<NetworkLobby\n\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t:is-join-channel-shown=\"network.isJoinChannelShown\"\n\t\t\t\t\t\t:active=\"\n\t\t\t\t\t\t\tstore.state.activeChannel &&\n\t\t\t\t\t\t\tnetwork.channels[0] === store.state.activeChannel.channel\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t@toggle-join-channel=\"\n\t\t\t\t\t\t\tnetwork.isJoinChannelShown = !network.isJoinChannelShown\n\t\t\t\t\t\t\"\n\t\t\t\t\t/>\n\t\t\t\t\t<JoinChannel\n\t\t\t\t\t\tv-if=\"network.isJoinChannelShown\"\n\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t:channel=\"network.channels[0]\"\n\t\t\t\t\t\t@toggle-join-channel=\"\n\t\t\t\t\t\t\tnetwork.isJoinChannelShown = !network.isJoinChannelShown\n\t\t\t\t\t\t\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t<Draggable\n\t\t\t\t\t\tdraggable=\".channel-list-item\"\n\t\t\t\t\t\tghost-class=\"ui-sortable-ghost\"\n\t\t\t\t\t\tdrag-class=\"ui-sortable-dragging\"\n\t\t\t\t\t\t:group=\"network.uuid\"\n\t\t\t\t\t\t:list=\"network.channels\"\n\t\t\t\t\t\t:delay=\"LONG_TOUCH_DURATION\"\n\t\t\t\t\t\t:delay-on-touch-only=\"true\"\n\t\t\t\t\t\t:touch-start-threshold=\"10\"\n\t\t\t\t\t\tclass=\"channels\"\n\t\t\t\t\t\titem-key=\"name\"\n\t\t\t\t\t\t@change=\"onChannelSort\"\n\t\t\t\t\t\t@choose=\"onDraggableChoose\"\n\t\t\t\t\t\t@unchoose=\"onDraggableUnchoose\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template v-slot:item=\"{element: channel, index}\">\n\t\t\t\t\t\t\t<Channel\n\t\t\t\t\t\t\t\tv-if=\"index > 0 && channel.type !== 'query'\"\n\t\t\t\t\t\t\t\t:key=\"channel.id\"\n\t\t\t\t\t\t\t\t:data-item=\"channel.id\"\n\t\t\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t\t:active=\"\n\t\t\t\t\t\t\t\t\tstore.state.activeChannel &&\n\t\t\t\t\t\t\t\t\tchannel === store.state.activeChannel.channel\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</Draggable>\n\n\t\t\t\t\t<DirectMessageSection\n\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t:queries=\"network.channels.filter((c) => c.type === 'query')\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</Draggable>\n\t</div>\n</template>\n\n<style>\n.jump-to-input {\n\tmargin: 8px;\n\tposition: relative;\n}\n\n.jump-to-input .input {\n\tmargin: 0;\n\twidth: 100%;\n\tborder: 0;\n\tcolor: #fff;\n\tbackground-color: rgb(255 255 255 / 10%);\n\tpadding-right: 35px;\n\tappearance: none;\n}\n\n.jump-to-input .input::placeholder {\n\tcolor: rgb(255 255 255 / 35%);\n}\n\n.jump-to-input::before {\n\tcontent: \"\\f002\"; /* http://fontawesome.io/icon/search/ */\n\tcolor: rgb(255 255 255 / 35%);\n\tposition: absolute;\n\tright: 8px;\n\ttop: 0;\n\tbottom: 0;\n\tpointer-events: none;\n\tline-height: 35px !important;\n}\n\n.jump-to-results {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n\toverflow: auto;\n}\n\n.jump-to-results .no-results {\n\tmargin: 14px 8px;\n\ttext-align: center;\n}\n\n.jump-to-results .channel-list-item.active {\n\tcursor: pointer;\n}\n\n.jump-to-results .channel-list-item .add-channel,\n.jump-to-results .channel-list-item .close-tooltip {\n\tdisplay: none;\n}\n\n.jump-to-results .channel-list-item[data-type=\"lobby\"] {\n\tpadding: 8px 14px;\n}\n\n.jump-to-results .channel-list-item[data-type=\"lobby\"]::before {\n\tcontent: \"\\f233\";\n}\n</style>\n\n<script lang=\"ts\">\nimport {computed, watch, defineComponent, nextTick, onBeforeUnmount, onMounted, ref} from \"vue\";\n\nimport Mousetrap from \"mousetrap\";\nimport Draggable from \"./Draggable.vue\";\nimport {filter as fuzzyFilter} from \"fuzzy\";\nimport NetworkLobby from \"./NetworkLobby.vue\";\nimport Channel from \"./Channel.vue\";\nimport JoinChannel from \"./JoinChannel.vue\";\nimport DirectMessageSection from \"./DirectMessageSection.vue\";\n\nimport socket from \"../js/socket\";\nimport collapseNetworkHelper from \"../js/helpers/collapseNetwork\";\nimport isIgnoredKeybind from \"../js/helpers/isIgnoredKeybind\";\nimport distance from \"../js/helpers/distance\";\nimport eventbus from \"../js/eventbus\";\nimport {ClientChan, NetChan, type SortableEvent} from \"../js/types\";\nimport {useStore} from \"../js/store\";\nimport {switchToChannel} from \"../js/router\";\nimport Sortable from \"sortablejs\";\n\nexport default defineComponent({\n\tname: \"NetworkList\",\n\tcomponents: {\n\t\tJoinChannel,\n\t\tNetworkLobby,\n\t\tChannel,\n\t\tDraggable,\n\t\tDirectMessageSection,\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\t\tconst searchText = ref(\"\");\n\t\tconst activeSearchItem = ref<ClientChan | null>();\n\t\t// Number of milliseconds a touch has to last to be considered long\n\t\tconst LONG_TOUCH_DURATION = 500;\n\n\t\tconst startDrag = ref<[number, number] | null>();\n\t\tconst searchInput = ref<HTMLInputElement | null>(null);\n\t\tconst networklist = ref<HTMLDivElement | null>(null);\n\n\t\tconst sidebarWasClosed = ref(false);\n\n\t\tconst moveItemInArray = <T,>(array: T[], from: number, to: number) => {\n\t\t\tconst item = array.splice(from, 1)[0];\n\t\t\tarray.splice(to, 0, item);\n\t\t};\n\n\t\tconst items = computed(() => {\n\t\t\tconst newItems: NetChan[] = [];\n\n\t\t\tfor (const network of store.state.networks) {\n\t\t\t\tfor (const channel of network.channels) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tstore.state.activeChannel &&\n\t\t\t\t\t\tchannel === store.state.activeChannel.channel\n\t\t\t\t\t) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tnewItems.push({network, channel});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn newItems;\n\t\t});\n\n\t\tconst results = computed(() => {\n\t\t\tconst newResults = fuzzyFilter(searchText.value, items.value, {\n\t\t\t\textract: (item) => item.channel.name,\n\t\t\t}).map((item) => item.original);\n\n\t\t\treturn newResults;\n\t\t});\n\n\t\tconst collapseNetwork = (event: Mousetrap.ExtendedKeyboardEvent) => {\n\t\t\tif (isIgnoredKeybind(event)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (store.state.activeChannel) {\n\t\t\t\tcollapseNetworkHelper(store.state.activeChannel.network, true);\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\tconst expandNetwork = (event: Mousetrap.ExtendedKeyboardEvent) => {\n\t\t\tif (isIgnoredKeybind(event)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (store.state.activeChannel) {\n\t\t\t\tcollapseNetworkHelper(store.state.activeChannel.network, false);\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\tconst onNetworkSort = (e: Sortable.SortableEvent) => {\n\t\t\tconst {oldIndex, newIndex} = e;\n\n\t\t\tif (oldIndex === undefined || newIndex === undefined || oldIndex === newIndex) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmoveItemInArray(store.state.networks, oldIndex, newIndex);\n\n\t\t\tsocket.emit(\"sort:networks\", {\n\t\t\t\torder: store.state.networks.map((n) => n.uuid),\n\t\t\t});\n\t\t};\n\n\t\tconst onChannelSort = (e: Sortable.SortableEvent) => {\n\t\t\tlet {oldIndex, newIndex} = e;\n\n\t\t\tif (oldIndex === undefined || newIndex === undefined || oldIndex === newIndex) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Indexes are offset by one due to the lobby\n\t\t\toldIndex += 1;\n\t\t\tnewIndex += 1;\n\n\t\t\tconst unparsedId = e.item.getAttribute(\"data-item\");\n\n\t\t\tif (!unparsedId) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst id = parseInt(unparsedId);\n\t\t\tconst netChan = store.getters.findChannel(id);\n\n\t\t\tif (!netChan) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmoveItemInArray(netChan.network.channels, oldIndex, newIndex);\n\n\t\t\tsocket.emit(\"sort:channels\", {\n\t\t\t\tnetwork: netChan.network.uuid,\n\t\t\t\torder: netChan.network.channels.map((c) => c.id),\n\t\t\t});\n\t\t};\n\n\t\tconst isTouchEvent = (event: Event): boolean => {\n\t\t\t// This is the same way Sortable.js detects a touch event. See\n\t\t\t// SortableJS/Sortable@daaefeda:/src/Sortable.js#L465\n\n\t\t\treturn !!(\n\t\t\t\t((event as TouchEvent).touches && (event as TouchEvent).touches[0]) ||\n\t\t\t\t((event as PointerEvent).pointerType &&\n\t\t\t\t\t(event as PointerEvent).pointerType === \"touch\")\n\t\t\t);\n\t\t};\n\n\t\tconst onDraggableChoose = (event: SortableEvent) => {\n\t\t\tconst original = event.originalEvent;\n\n\t\t\tif (isTouchEvent(original)) {\n\t\t\t\t// onDrag is only triggered when the user actually moves the\n\t\t\t\t// dragged object but onChoose is triggered as soon as the\n\t\t\t\t// item is eligible for dragging. This gives us an opportunity\n\t\t\t\t// to tell the user they've held the touch long enough.\n\t\t\t\tevent.item.classList.add(\"ui-sortable-dragging-touch-cue\");\n\n\t\t\t\tif (original instanceof TouchEvent && original.touches.length > 0) {\n\t\t\t\t\tstartDrag.value = [original.touches[0].clientX, original.touches[0].clientY];\n\t\t\t\t} else if (original instanceof PointerEvent) {\n\t\t\t\t\tstartDrag.value = [original.clientX, original.clientY];\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst onDraggableUnchoose = (event: SortableEvent) => {\n\t\t\tevent.item.classList.remove(\"ui-sortable-dragging-touch-cue\");\n\t\t\tstartDrag.value = null;\n\t\t};\n\n\t\tconst onDraggableTouchStart = (event: TouchEvent) => {\n\t\t\tif (event.touches.length === 1) {\n\t\t\t\t// This prevents an iOS long touch default behavior: selecting\n\t\t\t\t// the nearest selectable text.\n\t\t\t\tdocument.body.classList.add(\"force-no-select\");\n\t\t\t}\n\t\t};\n\n\t\tconst onDraggableTouchMove = (event: TouchEvent) => {\n\t\t\tif (startDrag.value && event.touches.length > 0) {\n\t\t\t\tconst touch = event.touches[0];\n\t\t\t\tconst currentPosition = [touch.clientX, touch.clientY];\n\n\t\t\t\tif (distance(startDrag.value, currentPosition as [number, number]) > 10) {\n\t\t\t\t\t// Context menu is shown on Android after long touch.\n\t\t\t\t\t// Dismiss it now that we're sure the user is dragging.\n\t\t\t\t\teventbus.emit(\"contextmenu:cancel\");\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst onDraggableTouchEnd = (event: TouchEvent) => {\n\t\t\tif (event.touches.length === 0) {\n\t\t\t\tdocument.body.classList.remove(\"force-no-select\");\n\t\t\t}\n\t\t};\n\n\t\tconst activateSearch = () => {\n\t\t\tif (searchInput.value === document.activeElement) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsidebarWasClosed.value = store.state.sidebarOpen ? false : true;\n\t\t\tstore.commit(\"sidebarOpen\", true);\n\n\t\t\tvoid nextTick(() => {\n\t\t\t\tsearchInput.value?.focus();\n\t\t\t});\n\t\t};\n\n\t\tconst deactivateSearch = () => {\n\t\t\tactiveSearchItem.value = null;\n\t\t\tsearchText.value = \"\";\n\t\t\tsearchInput.value?.blur();\n\n\t\t\tif (sidebarWasClosed.value) {\n\t\t\t\tstore.commit(\"sidebarOpen\", false);\n\t\t\t}\n\t\t};\n\n\t\tconst toggleSearch = (event: Mousetrap.ExtendedKeyboardEvent) => {\n\t\t\tif (isIgnoredKeybind(event)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (searchInput.value === document.activeElement) {\n\t\t\t\tdeactivateSearch();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tactivateSearch();\n\t\t\treturn false;\n\t\t};\n\n\t\tconst setSearchText = (e: Event) => {\n\t\t\tsearchText.value = (e.target as HTMLInputElement).value;\n\t\t};\n\n\t\tconst setActiveSearchItem = (channel?: ClientChan) => {\n\t\t\tif (!results.value.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!channel) {\n\t\t\t\tchannel = results.value[0].channel;\n\t\t\t}\n\n\t\t\tactiveSearchItem.value = channel;\n\t\t};\n\n\t\tconst scrollToActive = () => {\n\t\t\t// Scroll the list if needed after the active class is applied\n\t\t\tvoid nextTick(() => {\n\t\t\t\tconst el = networklist.value?.querySelector(\".channel-list-item.active\");\n\n\t\t\t\tif (el) {\n\t\t\t\t\tel.scrollIntoView({block: \"nearest\", inline: \"nearest\"});\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tconst selectResult = () => {\n\t\t\tif (!searchText.value || !results.value.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (activeSearchItem.value) {\n\t\t\t\tswitchToChannel(activeSearchItem.value);\n\t\t\t\tdeactivateSearch();\n\t\t\t\tscrollToActive();\n\t\t\t}\n\t\t};\n\n\t\tconst navigateResults = (event: Event, direction: number) => {\n\t\t\t// Prevent propagation to stop global keybind handler from capturing pagedown/pageup\n\t\t\t// and redirecting it to the message list container for scrolling\n\t\t\tevent.stopImmediatePropagation();\n\t\t\tevent.preventDefault();\n\n\t\t\tif (!searchText.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst channels = results.value.map((r) => r.channel);\n\n\t\t\t// Bail out if there's no channels to select\n\t\t\tif (!channels.length) {\n\t\t\t\tactiveSearchItem.value = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet currentIndex = activeSearchItem.value\n\t\t\t\t? channels.indexOf(activeSearchItem.value)\n\t\t\t\t: -1;\n\n\t\t\t// If there's no active channel select the first or last one depending on direction\n\t\t\tif (!activeSearchItem.value || currentIndex === -1) {\n\t\t\t\tactiveSearchItem.value = direction ? channels[0] : channels[channels.length - 1];\n\t\t\t\tscrollToActive();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcurrentIndex += direction;\n\n\t\t\t// Wrap around the list if necessary. Normaly each loop iterates once at most,\n\t\t\t// but might iterate more often if pgup or pgdown are used in a very short list\n\t\t\twhile (currentIndex < 0) {\n\t\t\t\tcurrentIndex += channels.length;\n\t\t\t}\n\n\t\t\twhile (currentIndex > channels.length - 1) {\n\t\t\t\tcurrentIndex -= channels.length;\n\t\t\t}\n\n\t\t\tactiveSearchItem.value = channels[currentIndex];\n\t\t\tscrollToActive();\n\t\t};\n\n\t\twatch(searchText, () => {\n\t\t\tsetActiveSearchItem();\n\t\t});\n\n\t\tonMounted(() => {\n\t\t\tMousetrap.bind(\"alt+shift+right\", expandNetwork);\n\t\t\tMousetrap.bind(\"alt+shift+left\", collapseNetwork);\n\t\t\tMousetrap.bind(\"alt+j\", toggleSearch);\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\tMousetrap.unbind(\"alt+shift+right\");\n\t\t\tMousetrap.unbind(\"alt+shift+left\");\n\t\t\tMousetrap.unbind(\"alt+j\");\n\t\t});\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tnetworklist,\n\t\t\tsearchInput,\n\t\t\tsearchText,\n\t\t\tresults,\n\t\t\tactiveSearchItem,\n\t\t\tLONG_TOUCH_DURATION,\n\n\t\t\tactivateSearch,\n\t\t\tdeactivateSearch,\n\t\t\ttoggleSearch,\n\t\t\tsetSearchText,\n\t\t\tsetActiveSearchItem,\n\t\t\tscrollToActive,\n\t\t\tselectResult,\n\t\t\tnavigateResults,\n\t\t\tonChannelSort,\n\t\t\tonNetworkSort,\n\t\t\tonDraggableTouchStart,\n\t\t\tonDraggableTouchMove,\n\t\t\tonDraggableTouchEnd,\n\t\t\tonDraggableChoose,\n\t\t\tonDraggableUnchoose,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<div ref=\"containerRef\" :class=\"$props.class\">\n\t\t<slot\n\t\t\tv-for=\"(item, index) of list\"\n\t\t\t:key=\"item[itemKey]\"\n\t\t\t:element=\"item\"\n\t\t\t:index=\"index\"\n\t\t\tname=\"item\"\n\t\t></slot>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, ref, PropType, watch, onBeforeUnmount} from \"vue\";\nimport Sortable from \"sortablejs\";\n\nconst Props = {\n\tdelay: {\n\t\ttype: Number,\n\t\tdefault: 0,\n\t\trequired: false,\n\t},\n\tdelayOnTouchOnly: {\n\t\ttype: Boolean,\n\t\tdefault: false,\n\t\trequired: false,\n\t},\n\ttouchStartThreshold: {\n\t\ttype: Number,\n\t\tdefault: 10,\n\t\trequired: false,\n\t},\n\thandle: {\n\t\ttype: String,\n\t\tdefault: \"\",\n\t\trequired: false,\n\t},\n\tdraggable: {\n\t\ttype: String,\n\t\tdefault: \"\",\n\t\trequired: false,\n\t},\n\tghostClass: {\n\t\ttype: String,\n\t\tdefault: \"\",\n\t\trequired: false,\n\t},\n\tdragClass: {\n\t\ttype: String,\n\t\tdefault: \"\",\n\t\trequired: false,\n\t},\n\tgroup: {\n\t\ttype: String,\n\t\tdefault: \"\",\n\t\trequired: false,\n\t},\n\tclass: {\n\t\ttype: String,\n\t\tdefault: \"\",\n\t\trequired: false,\n\t},\n\titemKey: {\n\t\ttype: String,\n\t\tdefault: \"\",\n\t\trequired: true,\n\t},\n\tlist: {\n\t\ttype: Array as PropType<Record<string, unknown>[]>,\n\t\tdefault: [],\n\t\trequired: true,\n\t},\n\tfilter: {\n\t\ttype: String,\n\t\tdefault: \"\",\n\t\trequired: false,\n\t},\n};\n\nexport default defineComponent({\n\tname: \"Draggable\",\n\tprops: Props,\n\temits: [\"change\", \"choose\", \"unchoose\"],\n\tsetup(props, {emit}) {\n\t\tconst containerRef = ref<HTMLElement | null>(null);\n\t\tconst sortable = ref<Sortable | null>(null);\n\n\t\twatch(containerRef, (newDraggable) => {\n\t\t\tif (newDraggable) {\n\t\t\t\tsortable.value = new Sortable(newDraggable, {\n\t\t\t\t\t...props,\n\n\t\t\t\t\tonChoose(event) {\n\t\t\t\t\t\temit(\"choose\", event);\n\t\t\t\t\t},\n\n\t\t\t\t\tonUnchoose(event) {\n\t\t\t\t\t\temit(\"unchoose\", event);\n\t\t\t\t\t},\n\n\t\t\t\t\tonEnd(event) {\n\t\t\t\t\t\temit(\"change\", event);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\tif (sortable.value) {\n\t\t\t\tsortable.value.destroy();\n\t\t\t\tcontainerRef.value = null;\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tcontainerRef,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./Draggable.vue?vue&type=template&id=1abd7f3a&ts=true\"\nimport script from \"./Draggable.vue?vue&type=script&lang=ts\"\nexport * from \"./Draggable.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<ChannelWrapper v-bind=\"$props\" :channel=\"channel\">\n\t\t<button\n\t\t\tv-if=\"network.channels.length > 1\"\n\t\t\t:aria-controls=\"'network-' + network.uuid\"\n\t\t\t:aria-label=\"getExpandLabel(network)\"\n\t\t\t:aria-expanded=\"!network.isCollapsed\"\n\t\t\tclass=\"collapse-network\"\n\t\t\t@click.stop=\"onCollapseClick\"\n\t\t>\n\t\t\t<span class=\"collapse-network-icon\" />\n\t\t</button>\n\t\t<span v-else class=\"collapse-network\" />\n\t\t<div class=\"lobby-wrap\">\n\t\t\t<span :title=\"channel.name\" class=\"name\">{{ channel.name }}</span>\n\t\t\t<span\n\t\t\t\tv-if=\"network.status.connected && !network.status.secure\"\n\t\t\t\tclass=\"not-secure-tooltip tooltipped tooltipped-w\"\n\t\t\t\taria-label=\"Insecure connection\"\n\t\t\t>\n\t\t\t\t<span class=\"not-secure-icon\" />\n\t\t\t</span>\n\t\t\t<span\n\t\t\t\tv-if=\"!network.status.connected\"\n\t\t\t\tclass=\"not-connected-tooltip tooltipped tooltipped-w\"\n\t\t\t\taria-label=\"Disconnected\"\n\t\t\t>\n\t\t\t\t<span class=\"not-connected-icon\" />\n\t\t\t</span>\n\t\t\t<span v-if=\"channel.unread\" :class=\"{highlight: channel.highlight}\" class=\"badge\">{{\n\t\t\t\tunreadCount\n\t\t\t}}</span>\n\t\t</div>\n\t\t<span\n\t\t\t:aria-label=\"joinChannelLabel\"\n\t\t\tclass=\"add-channel-tooltip tooltipped tooltipped-w tooltipped-no-touch\"\n\t\t>\n\t\t\t<button\n\t\t\t\t:class=\"['add-channel', {opened: isJoinChannelShown}]\"\n\t\t\t\t:aria-controls=\"'join-channel-' + channel.id\"\n\t\t\t\t:aria-label=\"joinChannelLabel\"\n\t\t\t\t@click.stop=\"$emit('toggle-join-channel')\"\n\t\t\t/>\n\t\t</span>\n\t</ChannelWrapper>\n</template>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, PropType} from \"vue\";\nimport collapseNetwork from \"../js/helpers/collapseNetwork\";\nimport roundBadgeNumber from \"../js/helpers/roundBadgeNumber\";\nimport ChannelWrapper from \"./ChannelWrapper.vue\";\n\nimport type {ClientNetwork} from \"../js/types\";\n\nexport default defineComponent({\n\tname: \"Channel\",\n\tcomponents: {\n\t\tChannelWrapper,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tisJoinChannelShown: Boolean,\n\t\tactive: Boolean,\n\t\tisFiltering: Boolean,\n\t},\n\temits: [\"toggle-join-channel\"],\n\tsetup(props) {\n\t\tconst channel = computed(() => {\n\t\t\treturn props.network.channels[0];\n\t\t});\n\n\t\tconst joinChannelLabel = computed(() => {\n\t\t\treturn props.isJoinChannelShown ? \"Cancel\" : \"Join a channel…\";\n\t\t});\n\n\t\tconst unreadCount = computed(() => {\n\t\t\treturn roundBadgeNumber(channel.value.unread);\n\t\t});\n\n\t\tconst onCollapseClick = () => {\n\t\t\tcollapseNetwork(props.network, !props.network.isCollapsed);\n\t\t};\n\n\t\tconst getExpandLabel = (network: ClientNetwork) => {\n\t\t\treturn network.isCollapsed ? \"Expand\" : \"Collapse\";\n\t\t};\n\n\t\treturn {\n\t\t\tchannel,\n\t\t\tjoinChannelLabel,\n\t\t\tunreadCount,\n\t\t\tonCollapseClick,\n\t\t\tgetExpandLabel,\n\t\t};\n\t},\n});\n</script>\n","import storage from \"../localStorage\";\n\nexport default (network, isCollapsed) => {\n\tconst stored = storage.get(\"thelounge.networks.collapsed\");\n\tconst networks = stored ? new Set(JSON.parse(stored)) : new Set();\n\n\tnetwork.isCollapsed = isCollapsed;\n\n\tif (isCollapsed) {\n\t\tnetworks.add(network.uuid);\n\t} else {\n\t\tnetworks.delete(network.uuid);\n\t}\n\n\tstorage.set(\"thelounge.networks.collapsed\", JSON.stringify([...networks]));\n};\n","export default (count: number) => {\n\tif (count < 1000) {\n\t\treturn count.toString();\n\t}\n\n\treturn (count / 1000).toFixed(2).slice(0, -1) + \"k\";\n};\n","import {store} from \"../store\";\n\nexport default (network, channel) => {\n\tif (!network.isCollapsed || channel.highlight || channel.type === \"lobby\") {\n\t\treturn false;\n\t}\n\n\tif (store.state.activeChannel && channel === store.state.activeChannel.channel) {\n\t\treturn false;\n\t}\n\n\treturn true;\n};\n","<template>\n\t<div id=\"sign-in\" class=\"window\" role=\"tabpanel\" aria-label=\"Sign-in\">\n\t\t<form class=\"container\" method=\"post\" action=\"\" @submit=\"onSubmit\">\n\t\t\t<img\n\t\t\t\tsrc=\"img/logo-vertical-transparent-bg.svg\"\n\t\t\t\tclass=\"logo\"\n\t\t\t\talt=\"The Lounge\"\n\t\t\t\twidth=\"256\"\n\t\t\t\theight=\"170\"\n\t\t\t/>\n\t\t\t<img\n\t\t\t\tsrc=\"img/logo-vertical-transparent-bg-inverted.svg\"\n\t\t\t\tclass=\"logo-inverted\"\n\t\t\t\talt=\"The Lounge\"\n\t\t\t\twidth=\"256\"\n\t\t\t\theight=\"170\"\n\t\t\t/>\n\n\t\t\t<label for=\"signin-username\">Username</label>\n\t\t\t<input\n\t\t\t\tid=\"signin-username\"\n\t\t\t\tv-model.trim=\"username\"\n\t\t\t\tclass=\"input\"\n\t\t\t\ttype=\"text\"\n\t\t\t\tname=\"username\"\n\t\t\t\tautocapitalize=\"none\"\n\t\t\t\tautocorrect=\"off\"\n\t\t\t\tautocomplete=\"username\"\n\t\t\t\trequired\n\t\t\t\tautofocus\n\t\t\t/>\n\n\t\t\t<div class=\"password-container\">\n\t\t\t\t<label for=\"signin-password\">Password</label>\n\t\t\t\t<RevealPassword v-slot:default=\"slotProps\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"signin-password\"\n\t\t\t\t\t\tv-model=\"password\"\n\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tautocapitalize=\"none\"\n\t\t\t\t\t\tautocorrect=\"off\"\n\t\t\t\t\t\tautocomplete=\"current-password\"\n\t\t\t\t\t\trequired\n\t\t\t\t\t/>\n\t\t\t\t</RevealPassword>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"errorShown\" class=\"error\">Authentication failed.</div>\n\n\t\t\t<button :disabled=\"inFlight\" type=\"submit\" class=\"btn\">Sign in</button>\n\t\t</form>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport storage from \"../../js/localStorage\";\nimport socket from \"../../js/socket\";\nimport RevealPassword from \"../RevealPassword.vue\";\nimport {defineComponent, onBeforeUnmount, onMounted, ref} from \"vue\";\n\nexport default defineComponent({\n\tname: \"SignIn\",\n\tcomponents: {\n\t\tRevealPassword,\n\t},\n\tsetup() {\n\t\tconst inFlight = ref(false);\n\t\tconst errorShown = ref(false);\n\n\t\tconst username = ref(storage.get(\"user\") || \"\");\n\t\tconst password = ref(\"\");\n\n\t\tconst onAuthFailed = () => {\n\t\t\tinFlight.value = false;\n\t\t\terrorShown.value = true;\n\t\t};\n\n\t\tconst onSubmit = (event: Event) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tif (!username.value || !password.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tinFlight.value = true;\n\t\t\terrorShown.value = false;\n\n\t\t\tconst values = {\n\t\t\t\tuser: username.value,\n\t\t\t\tpassword: password.value,\n\t\t\t};\n\n\t\t\tstorage.set(\"user\", values.user);\n\n\t\t\tsocket.emit(\"auth:perform\", values);\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\tsocket.on(\"auth:failed\", onAuthFailed);\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\tsocket.off(\"auth:failed\", onAuthFailed);\n\t\t});\n\n\t\treturn {\n\t\t\tinFlight,\n\t\t\terrorShown,\n\t\t\tusername,\n\t\t\tpassword,\n\t\t\tonSubmit,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<div>\n\t\t<slot :is-visible=\"isVisible\" />\n\t\t<span\n\t\t\tref=\"revealButton\"\n\t\t\ttype=\"button\"\n\t\t\t:class=\"[\n\t\t\t\t'reveal-password tooltipped tooltipped-n tooltipped-no-delay',\n\t\t\t\t{'reveal-password-visible': isVisible},\n\t\t\t]\"\n\t\t\t:aria-label=\"isVisible ? 'Hide password' : 'Show password'\"\n\t\t\t@click=\"onClick\"\n\t\t>\n\t\t\t<span :aria-label=\"isVisible ? 'Hide password' : 'Show password'\" />\n\t\t</span>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, ref} from \"vue\";\n\nexport default defineComponent({\n\tname: \"RevealPassword\",\n\tsetup() {\n\t\tconst isVisible = ref(false);\n\n\t\tconst onClick = () => {\n\t\t\tisVisible.value = !isVisible.value;\n\t\t};\n\n\t\treturn {\n\t\t\tisVisible,\n\t\t\tonClick,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./RevealPassword.vue?vue&type=template&id=5df695c1&ts=true\"\nimport script from \"./RevealPassword.vue?vue&type=script&lang=ts\"\nexport * from \"./RevealPassword.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./SignIn.vue?vue&type=template&id=125b45a5&ts=true\"\nimport script from \"./SignIn.vue?vue&type=script&lang=ts\"\nexport * from \"./SignIn.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div id=\"connect\" class=\"window\" role=\"tabpanel\" aria-label=\"Connect\">\n\t\t<div class=\"header\">\n\t\t\t<SidebarToggle />\n\t\t</div>\n\t\t<form class=\"container\" method=\"post\" action=\"\" @submit.prevent=\"onSubmit\">\n\t\t\t<h1 class=\"title\">\n\t\t\t\t<template v-if=\"defaults.uuid\">\n\t\t\t\t\t<input v-model=\"defaults.uuid\" type=\"hidden\" name=\"uuid\" />\n\t\t\t\t\tEdit {{ defaults.name }}\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\tConnect\n\t\t\t\t\t<template\n\t\t\t\t\t\tv-if=\"config?.lockNetwork && store?.state.serverConfiguration?.public\"\n\t\t\t\t\t>\n\t\t\t\t\t\tto {{ defaults.name }}\n\t\t\t\t\t</template>\n\t\t\t\t</template>\n\t\t\t</h1>\n\t\t\t<template v-if=\"!config?.lockNetwork\">\n\t\t\t\t<h2>Network settings</h2>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:name\">Name</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"connect:name\"\n\t\t\t\t\t\tv-model.trim=\"defaults.name\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:host\">Server</label>\n\t\t\t\t\t<div class=\"input-wrap\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:host\"\n\t\t\t\t\t\t\tv-model.trim=\"defaults.host\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\tname=\"host\"\n\t\t\t\t\t\t\taria-label=\"Server address\"\n\t\t\t\t\t\t\tmaxlength=\"255\"\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span id=\"connect:portseparator\">:</span>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:port\"\n\t\t\t\t\t\t\tv-model=\"defaults.port\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\t\tmax=\"65535\"\n\t\t\t\t\t\t\tname=\"port\"\n\t\t\t\t\t\t\taria-label=\"Server port\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:password\">Password</label>\n\t\t\t\t\t<RevealPassword\n\t\t\t\t\t\tv-slot:default=\"slotProps\"\n\t\t\t\t\t\tclass=\"input-wrap password-container\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:password\"\n\t\t\t\t\t\t\tv-model=\"defaults.password\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\tplaceholder=\"Server password (optional)\"\n\t\t\t\t\t\t\tname=\"password\"\n\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</RevealPassword>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label></label>\n\t\t\t\t\t<div class=\"input-wrap\">\n\t\t\t\t\t\t<label class=\"tls\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tv-model=\"defaults.tls\"\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\tname=\"tls\"\n\t\t\t\t\t\t\t\t:disabled=\"defaults.hasSTSPolicy\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\tUse secure connection (TLS)\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-if=\"defaults.hasSTSPolicy\"\n\t\t\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\t\t\taria-label=\"This network has a strict transport security policy, you will be unable to disable TLS\"\n\t\t\t\t\t\t\t\t>🔒 STS</span\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<label class=\"tls\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tv-model=\"defaults.rejectUnauthorized\"\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\tname=\"rejectUnauthorized\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\tOnly allow trusted certificates\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<h2>Proxy Settings</h2>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label></label>\n\t\t\t\t\t<div class=\"input-wrap\">\n\t\t\t\t\t\t<label for=\"connect:proxyEnabled\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"connect:proxyEnabled\"\n\t\t\t\t\t\t\t\tv-model=\"defaults.proxyEnabled\"\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\tname=\"proxyEnabled\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\tEnable Proxy\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<template v-if=\"defaults.proxyEnabled\">\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:proxyHost\">SOCKS Address</label>\n\t\t\t\t\t\t<div class=\"input-wrap\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"connect:proxyHost\"\n\t\t\t\t\t\t\t\tv-model.trim=\"defaults.proxyHost\"\n\t\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t\tname=\"proxyHost\"\n\t\t\t\t\t\t\t\taria-label=\"Proxy host\"\n\t\t\t\t\t\t\t\tmaxlength=\"255\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span id=\"connect:proxyPortSeparator\">:</span>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"connect:proxyPort\"\n\t\t\t\t\t\t\t\tv-model=\"defaults.proxyPort\"\n\t\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\t\t\tmax=\"65535\"\n\t\t\t\t\t\t\t\tname=\"proxyPort\"\n\t\t\t\t\t\t\t\taria-label=\"SOCKS port\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:proxyUsername\">Proxy username</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:proxyUsername\"\n\t\t\t\t\t\t\tref=\"proxyUsernameInput\"\n\t\t\t\t\t\t\tv-model.trim=\"defaults.proxyUsername\"\n\t\t\t\t\t\t\tclass=\"input username\"\n\t\t\t\t\t\t\tname=\"proxyUsername\"\n\t\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t\t\tplaceholder=\"Proxy username\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:proxyPassword\">Proxy password</label>\n\t\t\t\t\t\t<RevealPassword\n\t\t\t\t\t\t\tv-slot:default=\"slotProps\"\n\t\t\t\t\t\t\tclass=\"input-wrap password-container\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"connect:proxyPassword\"\n\t\t\t\t\t\t\t\tref=\"proxyPassword\"\n\t\t\t\t\t\t\t\tv-model=\"defaults.proxyPassword\"\n\t\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\t\tplaceholder=\"Proxy password\"\n\t\t\t\t\t\t\t\tname=\"proxyPassword\"\n\t\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</RevealPassword>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"config.lockNetwork && !store.state.serverConfiguration?.public\">\n\t\t\t\t<h2>Network settings</h2>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:name\">Name</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"connect:name\"\n\t\t\t\t\t\tv-model.trim=\"defaults.name\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:password\">Password</label>\n\t\t\t\t\t<RevealPassword\n\t\t\t\t\t\tv-slot:default=\"slotProps\"\n\t\t\t\t\t\tclass=\"input-wrap password-container\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:password\"\n\t\t\t\t\t\t\tv-model=\"defaults.password\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\tplaceholder=\"Server password (optional)\"\n\t\t\t\t\t\t\tname=\"password\"\n\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</RevealPassword>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<h2>User preferences</h2>\n\t\t\t<div class=\"connect-row\">\n\t\t\t\t<label for=\"connect:nick\">Nick</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"connect:nick\"\n\t\t\t\t\tv-model=\"defaults.nick\"\n\t\t\t\t\tclass=\"input nick\"\n\t\t\t\t\tname=\"nick\"\n\t\t\t\t\tpattern=\"[^\\s:!@]+\"\n\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\trequired\n\t\t\t\t\t@input=\"onNickChanged\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<template v-if=\"!config?.useHexIp\">\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:username\">Username</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"connect:username\"\n\t\t\t\t\t\tref=\"usernameInput\"\n\t\t\t\t\t\tv-model.trim=\"defaults.username\"\n\t\t\t\t\t\tclass=\"input username\"\n\t\t\t\t\t\tname=\"username\"\n\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<div class=\"connect-row\">\n\t\t\t\t<label for=\"connect:realname\">Real name</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"connect:realname\"\n\t\t\t\t\tv-model.trim=\"defaults.realname\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tname=\"realname\"\n\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div class=\"connect-row\">\n\t\t\t\t<label for=\"connect:leaveMessage\">Leave message</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"connect:leaveMessage\"\n\t\t\t\t\tv-model.trim=\"defaults.leaveMessage\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tname=\"leaveMessage\"\n\t\t\t\t\tplaceholder=\"The Lounge - https://thelounge.chat\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<template v-if=\"defaults.uuid && !store.state.serverConfiguration?.public\">\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:commands\">\n\t\t\t\t\t\tCommands\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"tooltipped tooltipped-ne tooltipped-no-delay\"\n\t\t\t\t\t\t\taria-label=\"One /command per line.\nEach command will be executed in\nthe server tab on new connection\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</label>\n\t\t\t\t\t<textarea\n\t\t\t\t\t\tid=\"connect:commands\"\n\t\t\t\t\t\tref=\"commandsInput\"\n\t\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\t\t:value=\"defaults.commands ? defaults.commands.join('\\n') : ''\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tname=\"commands\"\n\t\t\t\t\t\t@input=\"resizeCommandsInput\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"!defaults.uuid\">\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:channels\">Channels</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"connect:channels\"\n\t\t\t\t\t\tv-model.trim=\"defaults.join\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tname=\"join\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<h2>FiSH (Blowfish)</h2>\n\t\t\t<div class=\"connect-row\">\n\t\t\t\t<label for=\"connect:fishGlobalKey\">Global key</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"connect:fishGlobalKey\"\n\t\t\t\t\tv-model.trim=\"defaults.fishGlobalKey\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tname=\"fishGlobalKey\"\n\t\t\t\t\tplaceholder=\"Optional global key for this network\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div class=\"connect-row\" style=\"display: block\">\n\t\t\t\t<label for=\"connect:fishKeys\" style=\"margin-bottom: 5px\">\n\t\t\t\t\tPer-channel or User-Channels\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"tooltipped tooltipped-ne tooltipped-no-delay\"\n\t\t\t\t\t\taria-label=\"#channel key or nick key\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t\t<div class=\"fish-keys-section\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-for=\"(entry, index) in fishKeysEntries\"\n\t\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t\tclass=\"connect-row fish-key-row\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"input-wrap fish-key-inputs\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tv-model=\"entry.target\"\n\t\t\t\t\t\t\t\tclass=\"input fish-target-input\"\n\t\t\t\t\t\t\t\tplaceholder=\"#channel or nick\"\n\t\t\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t\t\t\taria-label=\"Channel or user name\"\n\t\t\t\t\t\t\t\tstyle=\"margin: 0\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tv-model=\"entry.key\"\n\t\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\t\tclass=\"input fish-key-input\"\n\t\t\t\t\t\t\t\tplaceholder=\"encryption key\"\n\t\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t\t\taria-label=\"Encryption key\"\n\t\t\t\t\t\t\t\tstyle=\"margin: 0\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"btn fish-remove-btn\"\n\t\t\t\t\t\t\t\t:disabled=\"fishKeysEntries.length <= 1\"\n\t\t\t\t\t\t\t\ttitle=\"Remove entry\"\n\t\t\t\t\t\t\t\tstyle=\"width: auto; margin: 0\"\n\t\t\t\t\t\t\t\t@click=\"removeFishKeyEntry(index)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tRemove\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<button type=\"button\" class=\"btn\" @click=\"addFishKeyEntry\">\n\t\t\t\t\t\t\tAdd Entry\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<template v-if=\"store.state.serverConfiguration?.public\">\n\t\t\t\t<template v-if=\"config?.lockNetwork\">\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label></label>\n\t\t\t\t\t\t<div class=\"input-wrap\">\n\t\t\t\t\t\t\t<label class=\"tls\">\n\t\t\t\t\t\t\t\t<input v-model=\"displayPasswordField\" type=\"checkbox\" />\n\t\t\t\t\t\t\t\tI have a password\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-if=\"displayPasswordField\" class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:password\">Password</label>\n\t\t\t\t\t\t<RevealPassword\n\t\t\t\t\t\t\tv-slot:default=\"slotProps\"\n\t\t\t\t\t\t\tclass=\"input-wrap password-container\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"connect:password\"\n\t\t\t\t\t\t\t\tref=\"publicPassword\"\n\t\t\t\t\t\t\t\tv-model=\"defaults.password\"\n\t\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\t\tplaceholder=\"Server password (optional)\"\n\t\t\t\t\t\t\t\tname=\"password\"\n\t\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</RevealPassword>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t</template>\n\t\t\t<template v-else>\n\t\t\t\t<h2 id=\"label-auth\">Authentication</h2>\n\t\t\t\t<div class=\"connect-row connect-auth\" role=\"group\" aria-labelledby=\"label-auth\">\n\t\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t:checked=\"!defaults.sasl\"\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\tname=\"sasl\"\n\t\t\t\t\t\t\tvalue=\"\"\n\t\t\t\t\t\t\t@change=\"setSaslAuth('')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tNo authentication\n\t\t\t\t\t</label>\n\t\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t:checked=\"defaults.sasl === 'plain'\"\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\tname=\"sasl\"\n\t\t\t\t\t\t\tvalue=\"plain\"\n\t\t\t\t\t\t\t@change=\"setSaslAuth('plain')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tUsername + password (SASL PLAIN)\n\t\t\t\t\t</label>\n\t\t\t\t\t<label\n\t\t\t\t\t\tv-if=\"!store.state.serverConfiguration?.public && defaults.tls\"\n\t\t\t\t\t\tclass=\"opt\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t:checked=\"defaults.sasl === 'external'\"\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\tname=\"sasl\"\n\t\t\t\t\t\t\tvalue=\"external\"\n\t\t\t\t\t\t\t@change=\"setSaslAuth('external')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tClient certificate (SASL EXTERNAL)\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\n\t\t\t\t<template v-if=\"defaults.sasl === 'plain'\">\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:username\">Account</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:saslAccount\"\n\t\t\t\t\t\t\tv-model.trim=\"defaults.saslAccount\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\tname=\"saslAccount\"\n\t\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:password\">Password</label>\n\t\t\t\t\t\t<RevealPassword\n\t\t\t\t\t\t\tv-slot:default=\"slotProps\"\n\t\t\t\t\t\t\tclass=\"input-wrap password-container\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"connect:saslPassword\"\n\t\t\t\t\t\t\t\tv-model=\"defaults.saslPassword\"\n\t\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\t\tname=\"saslPassword\"\n\t\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</RevealPassword>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t\t<div v-else-if=\"defaults.sasl === 'external'\" class=\"connect-sasl-external\">\n\t\t\t\t\t<p>The Lounge automatically generates and manages the client certificate.</p>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tOn the IRC server, you will need to tell the services to attach the\n\t\t\t\t\t\tcertificate fingerprint (certfp) to your account, for example:\n\t\t\t\t\t</p>\n\t\t\t\t\t<pre><code>/msg NickServ CERT ADD</code></pre>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<div>\n\t\t\t\t<button type=\"submit\" class=\"btn\" :disabled=\"disabled ? true : false\">\n\t\t\t\t\t<template v-if=\"defaults.uuid\">Save network</template>\n\t\t\t\t\t<template v-else>Connect</template>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</form>\n\t</div>\n</template>\n\n<style>\n#connect .connect-auth {\n\tdisplay: block;\n\tmargin-bottom: 10px;\n}\n\n#connect .connect-auth .opt {\n\tdisplay: block;\n\twidth: 100%;\n}\n\n#connect .connect-auth input {\n\tmargin: 3px 10px 0 0;\n}\n\n#connect .connect-sasl-external {\n\tpadding: 10px;\n\tborder-radius: 2px;\n\tbackground-color: #d9edf7;\n\tcolor: #31708f;\n}\n\n#connect .connect-sasl-external pre {\n\tmargin: 0;\n\tuser-select: text;\n}\n\n/* FiSH Keys section styles */\n.fish-keys-section {\n\twidth: 100%;\n\tpadding-top: 10px;\n}\n\n.fish-key-row {\n\tmargin-bottom: 5px;\n}\n\n.fish-key-label {\n\twidth: 25%;\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.fish-key-inputs {\n\tdisplay: flex;\n\tgap: 10px;\n\talign-items: center;\n}\n\n.fish-target-input {\n\tflex: 1;\n\tmin-width: 120px;\n}\n\n.fish-key-input {\n\tflex: 2;\n\tmin-width: 150px;\n}\n\n.fish-remove-btn {\n\tflex-shrink: 0;\n\tmin-width: 70px;\n\tmargin-left: 10px;\n}\n\n.fish-remove-btn:disabled {\n\topacity: 0.5;\n}\n\n.fish-remove-btn:disabled {\n\topacity: 0.5;\n}\n\n@media (width <= 768px) {\n\t.fish-key-inputs {\n\t\tflex-direction: column;\n\t\tgap: 5px;\n\t}\n\n\t.fish-target-input,\n\t.fish-key-input {\n\t\tmin-width: auto;\n\t}\n\n\t.fish-remove-btn {\n\t\tmargin-left: 0;\n\t\talign-self: stretch;\n\t}\n}\n</style>\n\n<script lang=\"ts\">\nimport RevealPassword from \"./RevealPassword.vue\";\nimport SidebarToggle from \"./SidebarToggle.vue\";\nimport {defineComponent, nextTick, PropType, ref, watch, computed} from \"vue\";\nimport {useStore} from \"../js/store\";\nimport {ClientNetwork} from \"../js/types\";\n\nexport type NetworkFormDefaults = Partial<ClientNetwork> & {\n\tjoin?: string;\n\tusername?: string;\n\thost?: string;\n\tcommands?: string[];\n\ttls?: boolean;\n\tport?: number;\n\tsasl?: string;\n\tpassword?: string;\n\thasSTSPolicy?: boolean;\n\tsaslAccount?: string;\n\tsaslPassword?: string;\n\tleaveMessage?: string;\n\trealname?: string;\n\tproxyEnabled?: boolean;\n\tproxyHost?: string;\n\tproxyPort?: number;\n\tproxyUsername?: string;\n\tproxyPassword?: string;\n\trejectUnauthorized?: boolean;\n\tfishGlobalKey?: string;\n\tfishKeys?: Record<string, string>;\n};\n\nexport default defineComponent({\n\tname: \"NetworkForm\",\n\tcomponents: {\n\t\tRevealPassword,\n\t\tSidebarToggle,\n\t},\n\tprops: {\n\t\thandleSubmit: {\n\t\t\ttype: Function as PropType<(network: ClientNetwork) => void>,\n\t\t\trequired: true,\n\t\t},\n\t\tdefaults: {\n\t\t\ttype: Object as PropType<NetworkFormDefaults>,\n\t\t\trequired: true,\n\t\t},\n\t\tdisabled: Boolean,\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\t\tconst config = ref(store.state.serverConfiguration);\n\t\tconst previousUsername = ref(props.defaults?.username);\n\t\tconst displayPasswordField = ref(false);\n\n\t\tconst publicPassword = ref<HTMLInputElement | null>(null);\n\n\t\twatch(displayPasswordField, (newValue) => {\n\t\t\tif (newValue) {\n\t\t\t\tvoid nextTick(() => {\n\t\t\t\t\tpublicPassword.value?.focus();\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tconst commandsInput = ref<HTMLInputElement | null>(null);\n\n\t\tconst resizeCommandsInput = () => {\n\t\t\tif (!commandsInput.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Reset height first so it can down size\n\t\t\tcommandsInput.value.style.height = \"\";\n\n\t\t\t// 2 pixels to account for the border\n\t\t\tcommandsInput.value.style.height = `${Math.ceil(\n\t\t\t\tcommandsInput.value.scrollHeight + 2\n\t\t\t)}px`;\n\t\t};\n\n\t\twatch(\n\t\t\t() => props.defaults?.commands,\n\t\t\t() => {\n\t\t\t\tvoid nextTick(() => {\n\t\t\t\t\tresizeCommandsInput();\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\n\t\twatch(\n\t\t\t() => props.defaults?.tls,\n\t\t\t(isSecureChecked) => {\n\t\t\t\tconst ports = [6667, 6697];\n\t\t\t\tconst newPort = isSecureChecked ? 0 : 1;\n\n\t\t\t\t// If you disable TLS and current port is 6697,\n\t\t\t\t// set it to 6667, and vice versa\n\t\t\t\tif (props.defaults?.port === ports[newPort]) {\n\t\t\t\t\tprops.defaults.port = ports[1 - newPort];\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\tconst setSaslAuth = (type: string) => {\n\t\t\tif (props.defaults) {\n\t\t\t\tprops.defaults.sasl = type;\n\t\t\t}\n\t\t};\n\n\t\tconst usernameInput = ref<HTMLInputElement | null>(null);\n\n\t\tconst onNickChanged = (event: Event) => {\n\t\t\tif (!usernameInput.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst usernameRef = usernameInput.value;\n\n\t\t\tif (!usernameRef.value || usernameRef.value === previousUsername.value) {\n\t\t\t\tusernameRef.value = (event.target as HTMLInputElement)?.value;\n\t\t\t}\n\n\t\t\tpreviousUsername.value = (event.target as HTMLInputElement)?.value;\n\t\t};\n\n\t\t// FiSH Keys table management\n\t\tinterface FishKeyEntry {\n\t\t\ttarget: string;\n\t\t\tkey: string;\n\t\t}\n\n\t\tconst fishKeysEntries = ref<FishKeyEntry[]>([]);\n\n\t\t// Parse fishKeys object into table entries\n\t\tconst parseFishKeys = (input: Record<string, string> | undefined): FishKeyEntry[] => {\n\t\t\tif (!input || Object.keys(input).length === 0) {\n\t\t\t\treturn [{target: \"\", key: \"\"}];\n\t\t\t}\n\n\t\t\tconst entries: FishKeyEntry[] = [];\n\n\t\t\tfor (const [target, key] of Object.entries(input)) {\n\t\t\t\tentries.push({target, key: String(key ?? \"\")});\n\t\t\t}\n\n\t\t\treturn entries.length > 0 ? entries : [{target: \"\", key: \"\"}];\n\t\t};\n\n\t\t// Convert table entries into mapping object\n\t\tconst fishKeysValue = computed(() => {\n\t\t\tconst map: Record<string, string> = {};\n\n\t\t\tfor (const entry of fishKeysEntries.value) {\n\t\t\t\tconst target = entry.target.trim();\n\t\t\t\tconst key = entry.key.trim();\n\n\t\t\t\tif (target && key) {\n\t\t\t\t\tmap[target] = key;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn map;\n\t\t});\n\n\t\t// Initialize entries from defaults\n\t\twatch(\n\t\t\t() => props.defaults.fishKeys,\n\t\t\t(newValue) => {\n\t\t\t\tfishKeysEntries.value = parseFishKeys(newValue);\n\t\t\t},\n\t\t\t{immediate: true}\n\t\t);\n\n\t\tconst addFishKeyEntry = () => {\n\t\t\tfishKeysEntries.value.push({target: \"\", key: \"\"});\n\t\t};\n\n\t\tconst removeFishKeyEntry = (index: number) => {\n\t\t\tif (fishKeysEntries.value.length > 1) {\n\t\t\t\tfishKeysEntries.value.splice(index, 1);\n\t\t\t}\n\t\t};\n\n\t\tconst onSubmit = (event: Event) => {\n\t\t\tconst formData = new FormData(event.target as HTMLFormElement);\n\t\t\tconst data: Partial<ClientNetwork> = {};\n\n\t\t\tformData.forEach((value, key) => {\n\t\t\t\tdata[key] = value;\n\t\t\t});\n\n\t\t\tprops.handleSubmit({...data, fishKeys: fishKeysValue.value} as ClientNetwork);\n\t\t};\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tconfig,\n\t\t\tdisplayPasswordField,\n\t\t\tpublicPassword,\n\t\t\tcommandsInput,\n\t\t\tresizeCommandsInput,\n\t\t\tsetSaslAuth,\n\t\t\tusernameInput,\n\t\t\tonNickChanged,\n\t\t\tonSubmit,\n\t\t\tfishKeysEntries,\n\t\t\tfishKeysValue,\n\t\t\taddFishKeyEntry,\n\t\t\tremoveFishKeyEntry,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<button class=\"lt\" aria-label=\"Toggle channel list\" @click=\"store.commit('toggleSidebar')\" />\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent} from \"vue\";\nimport {useStore} from \"../js/store\";\n\nexport default defineComponent({\n\tname: \"SidebarToggle\",\n\tsetup() {\n\t\tconst store = useStore();\n\n\t\treturn {\n\t\t\tstore,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./SidebarToggle.vue?vue&type=template&id=5256e772&ts=true\"\nimport script from \"./SidebarToggle.vue?vue&type=script&lang=ts\"\nexport * from \"./SidebarToggle.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./NetworkForm.vue?vue&type=template&id=e855b82c&ts=true\"\nimport script from \"./NetworkForm.vue?vue&type=script&lang=ts\"\nexport * from \"./NetworkForm.vue?vue&type=script&lang=ts\"\n\nimport \"./NetworkForm.vue?vue&type=style&index=0&id=e855b82c&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<NetworkForm :handle-submit=\"handleSubmit\" :defaults=\"defaults\" :disabled=\"disabled\" />\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, ref} from \"vue\";\n\nimport socket from \"../../js/socket\";\nimport {useStore} from \"../../js/store\";\nimport NetworkForm, {NetworkFormDefaults} from \"../NetworkForm.vue\";\n\nexport default defineComponent({\n\tname: \"Connect\",\n\tcomponents: {\n\t\tNetworkForm,\n\t},\n\tprops: {\n\t\tqueryParams: Object,\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\n\t\tconst disabled = ref(false);\n\n\t\tconst handleSubmit = (data: NetworkFormDefaults) => {\n\t\t\tdisabled.value = true;\n\t\t\tsocket.emit(\"network:new\", data);\n\t\t};\n\n\t\tconst parseOverrideParams = (params?: Record<string, string>) => {\n\t\t\tif (!params) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\tconst parsedParams: Record<string, unknown> = {};\n\n\t\t\tfor (let key of Object.keys(params)) {\n\t\t\t\tlet value = params[key];\n\n\t\t\t\t// Param can contain multiple values in an array if its supplied more than once\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\tvalue = value[0];\n\t\t\t\t}\n\n\t\t\t\t// Support `channels` as a compatibility alias with other clients\n\t\t\t\tif (key === \"channels\") {\n\t\t\t\t\tkey = \"join\";\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t!Object.prototype.hasOwnProperty.call(\n\t\t\t\t\t\tstore.state.serverConfiguration?.defaults,\n\t\t\t\t\t\tkey\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// When the network is locked, URL overrides should not affect disabled fields\n\t\t\t\tif (\n\t\t\t\t\tstore.state.serverConfiguration?.lockNetwork &&\n\t\t\t\t\t[\"name\", \"host\", \"port\", \"tls\", \"rejectUnauthorized\"].includes(key)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (key === \"join\") {\n\t\t\t\t\tvalue = value\n\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t.map((chan) => {\n\t\t\t\t\t\t\tif (!chan.match(/^[#&!+]/)) {\n\t\t\t\t\t\t\t\treturn `#${chan}`;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn chan;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join(\", \");\n\t\t\t\t}\n\n\t\t\t\t// Override server provided defaults with parameters passed in the URL if they match the data type\n\t\t\t\tswitch (typeof store.state.serverConfiguration?.defaults[key]) {\n\t\t\t\t\tcase \"boolean\":\n\t\t\t\t\t\tif (value === \"0\" || value === \"false\") {\n\t\t\t\t\t\t\tparsedParams[key] = false;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tparsedParams[key] = !!value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\tparsedParams[key] = Number(value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"string\":\n\t\t\t\t\t\tparsedParams[key] = String(value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn parsedParams;\n\t\t};\n\n\t\tconst defaults = ref<Partial<NetworkFormDefaults>>(\n\t\t\tObject.assign(\n\t\t\t\t{},\n\t\t\t\tstore.state.serverConfiguration?.defaults,\n\t\t\t\tparseOverrideParams(props.queryParams)\n\t\t\t)\n\t\t);\n\n\t\treturn {\n\t\t\tdefaults,\n\t\t\tdisabled,\n\t\t\thandleSubmit,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./Connect.vue?vue&type=template&id=571b8e59&ts=true\"\nimport script from \"./Connect.vue?vue&type=script&lang=ts\"\nexport * from \"./Connect.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div id=\"settings\" class=\"window\" role=\"tabpanel\" aria-label=\"Settings\">\n\t\t<div class=\"header\">\n\t\t\t<SidebarToggle />\n\t\t</div>\n\t\t<Navigation />\n\n\t\t<div class=\"container\">\n\t\t\t<form ref=\"settingsForm\" autocomplete=\"off\" @change=\"onChange\" @submit.prevent>\n\t\t\t\t<router-view></router-view>\n\t\t\t</form>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent} from \"vue\";\nimport SidebarToggle from \"../SidebarToggle.vue\";\nimport Navigation from \"../Settings/Navigation.vue\";\nimport {useStore} from \"../../js/store\";\n\nexport default defineComponent({\n\tname: \"Settings\",\n\tcomponents: {\n\t\tSidebarToggle,\n\t\tNavigation,\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\n\t\tconst onChange = (event: Event) => {\n\t\t\tconst ignore = [\"old_password\", \"new_password\", \"verify_password\"];\n\n\t\t\tconst name = (event.target as HTMLInputElement).name;\n\n\t\t\tif (ignore.includes(name)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet value: boolean | string;\n\n\t\t\tif ((event.target as HTMLInputElement).type === \"checkbox\") {\n\t\t\t\tvalue = (event.target as HTMLInputElement).checked;\n\t\t\t} else {\n\t\t\t\tvalue = (event.target as HTMLInputElement).value;\n\t\t\t}\n\n\t\t\tvoid store.dispatch(\"settings/update\", {name, value, sync: true});\n\t\t};\n\n\t\treturn {\n\t\t\tonChange,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<!-- 220px is the width of the sidebar, and we add 100px to allow for the text -->\n\t<aside class=\"settings-menu\">\n\t\t<h2>Settings</h2>\n\t\t<ul role=\"navigation\" aria-label=\"Settings tabs\">\n\t\t\t<SettingTabItem name=\"General\" class-name=\"general\" to=\"\" />\n\t\t\t<SettingTabItem name=\"Appearance\" class-name=\"appearance\" to=\"appearance\" />\n\t\t\t<SettingTabItem name=\"Notifications\" class-name=\"notifications\" to=\"notifications\" />\n\t\t\t<SettingTabItem name=\"Account\" class-name=\"account\" to=\"account\" />\n\t\t</ul>\n\t</aside>\n</template>\n\n<style>\n.settings-menu {\n\tposition: fixed;\n\n\t/* top: Header + (padding bottom of h2 - border) */\n\ttop: calc(45px + 5px);\n\n\t/* Mid page minus width of container and 30 pixels for padding */\n\tmargin-left: calc(50% - 480px - 30px);\n}\n\n/** The calculation is mobile + 2/3 of container width. Fairly arbitrary. */\n@media screen and (width <= calc(768px + 320px)) {\n\t.settings-menu {\n\t\tposition: static;\n\t\twidth: min(480px, 100%);\n\t\talign-self: center;\n\t\tmargin: 0 auto;\n\t\tpadding: 0 15px;\n\t}\n}\n\n.settings-menu ul {\n\tpadding: 0;\n}\n\n.settings-menu li {\n\tfont-size: 18px;\n\tlist-style: none;\n}\n\n.settings-menu button {\n\tcolor: var(--body-color-muted);\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: inline-block;\n\ttext-align: left;\n}\n\n.settings-menu li:not(:last-of-type) button {\n\tmargin-bottom: 8px;\n}\n\n.settings-menu button::before {\n\twidth: 18px;\n\theight: 18px;\n\tdisplay: inline-block;\n\tcontent: \"\";\n\tmargin-right: 8px;\n}\n\n.settings-menu .appearance::before {\n\tcontent: \"\\f108\"; /* http://fontawesome.io/icon/desktop/ */\n}\n\n.settings-menu .account::before {\n\tcontent: \"\\f007\"; /* http://fontawesome.io/icon/user/ */\n}\n\n.settings-menu .messages::before {\n\tcontent: \"\\f0e0\"; /* http://fontawesome.io/icon/envelope/ */\n}\n\n.settings-menu .notifications::before {\n\tcontent: \"\\f0f3\"; /* http://fontawesome.io/icon/bell/ */\n}\n\n.settings-menu .general::before {\n\tcontent: \"\\f013\"; /* http://fontawesome.io/icon/cog/ */\n}\n\n.settings-menu button:hover,\n.settings-menu button.active {\n\tcolor: var(--body-color);\n}\n\n.settings-menu button.active {\n\tcursor: default;\n}\n</style>\n\n<script lang=\"ts\">\nimport SettingTabItem from \"./SettingTabItem.vue\";\nimport {defineComponent} from \"vue\";\n\nexport default defineComponent({\n\tname: \"SettingsTabs\",\n\tcomponents: {\n\t\tSettingTabItem,\n\t},\n});\n</script>\n","<template>\n\t<li :aria-label=\"name\" role=\"tab\" :aria-selected=\"route.name === name\" aria-controls=\"settings\">\n\t\t<router-link v-slot:default=\"{navigate, isExactActive}\" :to=\"'/settings/' + to\" custom>\n\t\t\t<button\n\t\t\t\t:class=\"['icon', className, {active: isExactActive}]\"\n\t\t\t\t@click=\"navigate\"\n\t\t\t\t@keypress.enter=\"navigate as (e?: KeyboardEvent) => void\"\n\t\t\t>\n\t\t\t\t{{ name }}\n\t\t\t</button>\n\t\t</router-link>\n\t</li>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent} from \"vue\";\nimport {useRoute} from \"vue-router\";\n\nexport default defineComponent({\n\tname: \"SettingTabListItem\",\n\tprops: {\n\t\tname: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tclassName: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tto: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst route = useRoute();\n\n\t\treturn {\n\t\t\troute,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./SettingTabItem.vue?vue&type=template&id=4806dcd4&ts=true\"\nimport script from \"./SettingTabItem.vue?vue&type=script&lang=ts\"\nexport * from \"./SettingTabItem.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Navigation.vue?vue&type=template&id=4ce2cfe0&ts=true\"\nimport script from \"./Navigation.vue?vue&type=script&lang=ts\"\nexport * from \"./Navigation.vue?vue&type=script&lang=ts\"\n\nimport \"./Navigation.vue?vue&type=style&index=0&id=4ce2cfe0&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Settings.vue?vue&type=template&id=7dcb681f&ts=true\"\nimport script from \"./Settings.vue?vue&type=script&lang=ts\"\nexport * from \"./Settings.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div id=\"help\" class=\"window\" role=\"tabpanel\" aria-label=\"Help\">\n\t\t<div class=\"header\">\n\t\t\t<SidebarToggle />\n\t\t</div>\n\t\t<div class=\"container\">\n\t\t\t<h1 class=\"title\">Help</h1>\n\n\t\t\t<h2 class=\"help-version-title\">\n\t\t\t\t<span>About The Lounge</span>\n\t\t\t\t<small>\n\t\t\t\t\tv{{ store.state.serverConfiguration?.version }} (<router-link\n\t\t\t\t\t\tid=\"view-changelog\"\n\t\t\t\t\t\tto=\"/changelog\"\n\t\t\t\t\t\t>release notes</router-link\n\t\t\t\t\t>)\n\t\t\t\t</small>\n\t\t\t</h2>\n\n\t\t\t<div class=\"about\">\n\t\t\t\t<VersionChecker />\n\n\t\t\t\t<template v-if=\"store.state.serverConfiguration?.gitCommit\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tThe Lounge is running from source (<a\n\t\t\t\t\t\t\t:href=\"`https://github.com/LordBex/thelounge/tree/${store.state.serverConfiguration?.gitCommit}`\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t>commit <code>{{ store.state.serverConfiguration?.gitCommit }}</code></a\n\t\t\t\t\t\t>).\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<ul>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\tCompare\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t:href=\"`https://github.com/LordBex/thelounge/compare/${store.state.serverConfiguration?.gitCommit}...master`\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t\t>between\n\t\t\t\t\t\t\t\t<code>{{ store.state.serverConfiguration?.gitCommit }}</code> and\n\t\t\t\t\t\t\t\t<code>master</code></a\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\tto see what you are missing\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\tCompare\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t:href=\"`https://github.com/LordBex/thelounge/compare/${store.state.serverConfiguration?.version}...${store.state.serverConfiguration?.gitCommit}`\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t\t>between\n\t\t\t\t\t\t\t\t<code>{{ store.state.serverConfiguration?.version }} </code> and\n\t\t\t\t\t\t\t\t<code>{{ store.state.serverConfiguration?.gitCommit }}</code></a\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\tto see your local changes\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</template>\n\n\t\t\t\t<p>\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"https://thelounge.chat/\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\tclass=\"website-link\"\n\t\t\t\t\t\t>Website</a\n\t\t\t\t\t>\n\t\t\t\t</p>\n\t\t\t\t<p>\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"https://thelounge.chat/docs/\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\tclass=\"documentation-link\"\n\t\t\t\t\t\t>Documentation</a\n\t\t\t\t\t>\n\t\t\t\t</p>\n\t\t\t\t<p>\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"https://github.com/LordBex/thelounge/issues/new\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\tclass=\"report-issue-link\"\n\t\t\t\t\t\t>Report an issue…</a\n\t\t\t\t\t>\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<h2 v-if=\"isTouch\">Gestures</h2>\n\n\t\t\t<div v-if=\"isTouch\" class=\"help-item\">\n\t\t\t\t<div class=\"subject gesture\">Single-Finger Swipe Left</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Hide sidebar.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"isTouch\" class=\"help-item\">\n\t\t\t\t<div class=\"subject gesture\">Single-Finger Swipe Right</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Show sidebar.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"isTouch\" class=\"help-item\">\n\t\t\t\t<div class=\"subject gesture\">Two-Finger Swipe Left</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the next window in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"isTouch\" class=\"help-item\">\n\t\t\t\t<div class=\"subject gesture\">Two-Finger Swipe Right</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the previous window in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<h2>Keyboard Shortcuts</h2>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>↓</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>↓</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the next lobby in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>↑</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>↑</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the previous lobby in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>←</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>←</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Collapse current network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>→</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>→</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Expand current network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>↓</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>↓</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the next window in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>↑</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>↑</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the previous window in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>Ctrl</kbd> <kbd>↓</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>⌘</kbd> <kbd>↓</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the next window with unread messages in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>Ctrl</kbd> <kbd>↑</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>⌘</kbd> <kbd>↑</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the previous window with unread messages in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>A</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>A</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the first window with unread messages.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>S</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>S</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Toggle sidebar.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>U</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>U</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Toggle channel user list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>J</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>J</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Toggle jump to channel switcher.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>M</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>M</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Toggle recent mentions popup.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>/</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>/</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the help menu.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span><kbd>Esc</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tClose current contextual window (context menu, image viewer, topic edit,\n\t\t\t\t\t\tetc) and remove focus from input.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<h2>Formatting Shortcuts</h2>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>K</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>K</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark any text typed after this shortcut to be colored. After hitting this\n\t\t\t\t\t\tshortcut, enter an integer in the range\n\t\t\t\t\t\t<code>0—15</code> to select the desired color, or use the autocompletion\n\t\t\t\t\t\tmenu to choose a color name (see below).\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tBackground color can be specified by putting a comma and another integer in\n\t\t\t\t\t\tthe range <code>0—15</code> after the foreground color number\n\t\t\t\t\t\t(autocompletion works too).\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tA color reference can be found\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"https://modern.ircdocs.horse/formatting.html#colors\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t>here</a\n\t\t\t\t\t\t>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>B</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>B</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut as\n\t\t\t\t\t\t<span class=\"irc-bold\">bold</span>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>U</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>U</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut as\n\t\t\t\t\t\t<span class=\"irc-underline\">underlined</span>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>I</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>I</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut as\n\t\t\t\t\t\t<span class=\"irc-italic\">italics</span>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>S</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>S</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut as\n\t\t\t\t\t\t<span class=\"irc-strikethrough\">struck through</span>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>M</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>M</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut as\n\t\t\t\t\t\t<span class=\"irc-monospace\">monospaced</span>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>O</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>O</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut to be reset to its original\n\t\t\t\t\t\tformatting.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<h2>Autocompletion</h2>\n\n\t\t\t<p>\n\t\t\t\tTo auto-complete nicknames, channels, commands, and emoji, type one of the\n\t\t\t\tcharacters below to open a suggestion list. Use the <kbd>↑</kbd> and\n\t\t\t\t<kbd>↓</kbd> keys to highlight an item, and insert it by pressing <kbd>Tab</kbd> or\n\t\t\t\t<kbd>Enter</kbd> (or by clicking the desired item).\n\t\t\t</p>\n\t\t\t<p>Autocompletion can be disabled in settings.</p>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>@</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Nickname</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>#</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Channel</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Commands (see list of commands below)</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>:</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tEmoji (note: requires two search characters, to avoid conflicting with\n\t\t\t\t\t\tcommon emoticons like <code>:)</code>)\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<h2>Commands</h2>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/away [message]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Mark yourself as away with an optional message.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/back</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Remove your away status (set with <code>/away</code>).</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/ban nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tBan (<code>+b</code>) a user from the current channel. This can be a\n\t\t\t\t\t\tnickname or a hostmask.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/banlist</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Load the banlist for the current channel.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/collapse</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tCollapse all previews in the current channel (opposite of\n\t\t\t\t\t\t<code>/expand</code>)\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/connect host [port]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tConnect to a new IRC network. If <code>port</code> starts with a\n\t\t\t\t\t\t<code>+</code> sign, the connection will be made secure using TLS.\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>Alias: <code>/server</code></p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/ctcp target cmd [args]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tSend a <abbr title=\"Client-to-client protocol\">CTCP</abbr>\n\t\t\t\t\t\trequest. Read more about this on\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"https://en.wikipedia.org/wiki/Client-to-client_protocol\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t>the dedicated Wikipedia article</a\n\t\t\t\t\t\t>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/deop nick [...nick]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tRemove op (<code>-o</code>) from one or several users in the current\n\t\t\t\t\t\tchannel.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/devoice nick [...nick]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tRemove voice (<code>-v</code>) from one or several users in the current\n\t\t\t\t\t\tchannel.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/disconnect [message]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Disconnect from the current network with an optionally-provided message.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/expand</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tExpand all previews in the current channel (opposite of\n\t\t\t\t\t\t<code>/collapse</code>)\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/invite nick [channel]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tInvite a user to the specified channel. If\n\t\t\t\t\t\t<code>channel</code> is omitted, user will be invited to the current\n\t\t\t\t\t\tchannel.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/ignore nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tBlock any messages from the specified user on the current network. This can\n\t\t\t\t\t\tbe a nickname or a hostmask.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/ignorelist</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Load the list of ignored users for the current network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/join channel [password]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tJoin a channel. Password is only needed in protected channels and can\n\t\t\t\t\t\tusually be omitted.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/kick nick [reason]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Kick a user from the current channel.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/kickban nick [reason]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tKick and ban (<code>+b</code>) a user from the current channel. Unlike\n\t\t\t\t\t\t<code>/ban</code>, only nicknames (and not host masks) can be used.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/list</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Retrieve a list of available channels on this network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/me message</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tSend an action message to the current channel. The Lounge will display it\n\t\t\t\t\t\tinline, as if the message was posted in the third person.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/mode flags [args]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tSet the given flags to the current channel if the active window is a\n\t\t\t\t\t\tchannel, another user if the active window is a private message window, or\n\t\t\t\t\t\tyourself if the current window is a server window.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/msg channel message</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Send a message to the specified channel.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/mute [...channel]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tPrevent messages from generating any feedback for a channel. This turns off\n\t\t\t\t\t\tthe highlight indicator, hides mentions and inhibits push notifications.\n\t\t\t\t\t\tMuting a network lobby mutes the entire network. Not specifying any channel\n\t\t\t\t\t\ttarget mutes the current channel. Revert with <code>/unmute</code>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/nick newnick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Change your nickname on the current network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/notice channel message</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Sends a notice message to the specified channel.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/op nick [...nick]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Give op (<code>+o</code>) to one or several users in the current channel.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/part [channel]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tClose the specified channel or private message window, or the current\n\t\t\t\t\t\tchannel if <code>channel</code> is omitted.\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>Aliases: <code>/close</code>, <code>/leave</code></p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/rejoin</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tLeave and immediately rejoin the current channel. Useful to quickly get op\n\t\t\t\t\t\tfrom ChanServ in an empty channel, for example.\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>Alias: <code>/cycle</code></p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/query nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Send a private message to the specified user.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/quit [message]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Disconnect from the current network with an optional message.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/raw message</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Send a raw message to the current IRC network.</p>\n\t\t\t\t\t<p>Aliases: <code>/quote</code>, <code>/send</code></p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/slap nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Slap someone in the current channel with a trout!</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"store.state.settings.searchEnabled\" class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/search query</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Search for messages in the current channel / user</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/topic [newtopic]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tGet the topic in the current channel. If <code>newtopic</code> is specified,\n\t\t\t\t\t\tsets the topic in the current channel.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/unban nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tUnban (<code>-b</code>) a user from the current channel. This can be a\n\t\t\t\t\t\tnickname or a hostmask.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/unignore nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tUnblock messages from the specified user on the current network. This can be\n\t\t\t\t\t\ta nickname or a hostmask.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/unmute [...channel]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tUn-mutes the given channel(s) or the current channel if no channel is\n\t\t\t\t\t\tprovided. See <code>/mute</code> for more information.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/voice nick [...nick]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tGive voice (<code>+v</code>) to one or several users in the current channel.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/whois nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Retrieve information about the given user on the current network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent} from \"vue\";\nimport {useStore} from \"../../js/store\";\nimport SidebarToggle from \"../SidebarToggle.vue\";\nimport VersionChecker from \"../VersionChecker.vue\";\n\nexport default defineComponent({\n\tname: \"Help\",\n\tcomponents: {\n\t\tSidebarToggle,\n\t\tVersionChecker,\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\t\tconst isApple = navigator.platform.match(/(Mac|iPhone|iPod|iPad)/i) || false;\n\t\tconst isTouch = navigator.maxTouchPoints > 0;\n\n\t\treturn {\n\t\t\tisApple,\n\t\t\tisTouch,\n\t\t\tstore,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<div id=\"version-checker\" :class=\"[store.state.versionStatus]\">\n\t\t<p v-if=\"store.state.versionStatus === 'loading'\">Checking for updates…</p>\n\t\t<p v-if=\"store.state.versionStatus === 'new-version'\">\n\t\t\tThe Lounge <b>{{ store.state.versionData?.latest?.version }} </b>\n\t\t\t<template v-if=\"store.state.versionData?.latest?.prerelease\"> (pre-release) </template>\n\t\t\tis now available.\n\t\t\t<br />\n\n\t\t\t<a :href=\"store.state.versionData?.latest?.url\" target=\"_blank\" rel=\"noopener\">\n\t\t\t\tRead more on GitHub\n\t\t\t</a>\n\t\t</p>\n\t\t<p v-if=\"store.state.versionStatus === 'new-packages'\">\n\t\t\tThe Lounge is up to date, but there are out of date packages Run\n\t\t\t<code>thelounge upgrade</code> on the server to upgrade packages.\n\t\t</p>\n\t\t<template v-if=\"store.state.versionStatus === 'up-to-date'\">\n\t\t\t<p>The Lounge is up to date!</p>\n\n\t\t\t<button\n\t\t\t\tv-if=\"store.state.versionDataExpired\"\n\t\t\t\tid=\"check-now\"\n\t\t\t\tclass=\"btn btn-small\"\n\t\t\t\t@click=\"checkNow\"\n\t\t\t>\n\t\t\t\tCheck now\n\t\t\t</button>\n\t\t</template>\n\t\t<template v-if=\"store.state.versionStatus === 'error'\">\n\t\t\t<p>Information about latest release could not be retrieved.</p>\n\n\t\t\t<button id=\"check-now\" class=\"btn btn-small\" @click=\"checkNow\">Try again</button>\n\t\t</template>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, onMounted} from \"vue\";\nimport socket from \"../js/socket\";\nimport {useStore} from \"../js/store\";\n\nexport default defineComponent({\n\tname: \"VersionChecker\",\n\tsetup() {\n\t\tconst store = useStore();\n\n\t\tconst checkNow = () => {\n\t\t\tstore.commit(\"versionData\", null);\n\t\t\tstore.commit(\"versionStatus\", \"loading\");\n\t\t\tsocket.emit(\"changelog\");\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\tif (!store.state.versionData) {\n\t\t\t\tcheckNow();\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tcheckNow,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./VersionChecker.vue?vue&type=template&id=06957aef&ts=true\"\nimport script from \"./VersionChecker.vue?vue&type=script&lang=ts\"\nexport * from \"./VersionChecker.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Help.vue?vue&type=template&id=edeb1a20&ts=true\"\nimport script from \"./Help.vue?vue&type=script&lang=ts\"\nexport * from \"./Help.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div id=\"changelog\" class=\"window\" aria-label=\"Changelog\">\n\t\t<div class=\"header\">\n\t\t\t<SidebarToggle />\n\t\t</div>\n\t\t<div class=\"container\">\n\t\t\t<router-link id=\"back-to-help\" to=\"/help\">« Help</router-link>\n\n\t\t\t<template\n\t\t\t\tv-if=\"store.state.versionData?.current && store.state.versionData?.current.version\"\n\t\t\t>\n\t\t\t\t<h1 class=\"title\">\n\t\t\t\t\tRelease notes for {{ store.state.versionData.current.version }}\n\t\t\t\t</h1>\n\n\t\t\t\t<template v-if=\"store.state.versionData.current.changelog\">\n\t\t\t\t\t<h3>Introduction</h3>\n\t\t\t\t\t<div\n\t\t\t\t\t\tref=\"changelog\"\n\t\t\t\t\t\tclass=\"changelog-text\"\n\t\t\t\t\t\tv-html=\"store.state.versionData.current.changelog\"\n\t\t\t\t\t></div>\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t<p>Unable to retrieve changelog for current release from GitHub.</p>\n\t\t\t\t\t<p>\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tv-if=\"store.state.serverConfiguration?.version\"\n\t\t\t\t\t\t\t:href=\"`https://github.com/LordBex/thelounge/releases/tag/v${store.state.serverConfiguration?.version}`\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t>View release notes for this version on GitHub</a\n\t\t\t\t\t\t>\n\t\t\t\t\t</p>\n\t\t\t\t</template>\n\t\t\t</template>\n\t\t\t<p v-else>Loading changelog…</p>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, onMounted, onUpdated, ref} from \"vue\";\nimport socket from \"../../js/socket\";\nimport {useStore} from \"../../js/store\";\nimport SidebarToggle from \"../SidebarToggle.vue\";\n\nexport default defineComponent({\n\tname: \"Changelog\",\n\tcomponents: {\n\t\tSidebarToggle,\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\t\tconst changelog = ref<HTMLDivElement | null>(null);\n\n\t\tconst patchChangelog = () => {\n\t\t\tif (!changelog.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst links = changelog.value.querySelectorAll(\"a\");\n\n\t\t\tlinks.forEach((link) => {\n\t\t\t\t// Make sure all links will open a new tab instead of exiting the application\n\t\t\t\tlink.setAttribute(\"target\", \"_blank\");\n\t\t\t\tlink.setAttribute(\"rel\", \"noopener\");\n\n\t\t\t\tif (link.querySelector(\"img\")) {\n\t\t\t\t\t// Add required metadata to image links, to support built-in image viewer\n\t\t\t\t\tlink.classList.add(\"toggle-thumbnail\");\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\tif (!store.state.versionData) {\n\t\t\t\tsocket.emit(\"changelog\");\n\t\t\t}\n\n\t\t\tpatchChangelog();\n\t\t});\n\n\t\tonUpdated(() => {\n\t\t\tpatchChangelog();\n\t\t});\n\n\t\treturn {\n\t\t\tstore,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./Changelog.vue?vue&type=template&id=eb1b4760&ts=true\"\nimport script from \"./Changelog.vue?vue&type=script&lang=ts\"\nexport * from \"./Changelog.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<NetworkForm\n\t\tv-if=\"networkData\"\n\t\t:handle-submit=\"handleSubmit\"\n\t\t:defaults=\"networkData\"\n\t\t:disabled=\"disabled\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, onMounted, ref, watch} from \"vue\";\nimport {useRoute} from \"vue-router\";\nimport {switchToChannel} from \"../../js/router\";\nimport socket from \"../../js/socket\";\nimport {useStore} from \"../../js/store\";\nimport NetworkForm, {NetworkFormDefaults} from \"../NetworkForm.vue\";\n\nexport default defineComponent({\n\tname: \"NetworkEdit\",\n\tcomponents: {\n\t\tNetworkForm,\n\t},\n\tsetup() {\n\t\tconst route = useRoute();\n\t\tconst store = useStore();\n\n\t\tconst disabled = ref(false);\n\t\tconst networkData = ref<NetworkFormDefaults | null>(null);\n\n\t\tconst setNetworkData = () => {\n\t\t\tsocket.emit(\"network:get\", String(route.params.uuid || \"\"));\n\t\t\tnetworkData.value = store.getters.findNetwork(String(route.params.uuid || \"\"));\n\t\t};\n\n\t\tconst handleSubmit = (data: {uuid: string; name: string}) => {\n\t\t\tdisabled.value = true;\n\t\t\tsocket.emit(\"network:edit\", data);\n\n\t\t\t// TODO: move networks to vuex and update state when the network info comes in\n\t\t\tconst network = store.getters.findNetwork(data.uuid);\n\n\t\t\tif (network) {\n\t\t\t\tnetwork.name = network.channels[0].name = data.name;\n\n\t\t\t\tswitchToChannel(network.channels[0]);\n\t\t\t}\n\t\t};\n\n\t\twatch(\n\t\t\t() => route.params.uuid,\n\t\t\t() => {\n\t\t\t\tsetNetworkData();\n\t\t\t}\n\t\t);\n\n\t\tonMounted(() => {\n\t\t\tsetNetworkData();\n\t\t});\n\n\t\treturn {\n\t\t\tdisabled,\n\t\t\tnetworkData,\n\t\t\thandleSubmit,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./NetworkEdit.vue?vue&type=template&id=11ec4a97&ts=true\"\nimport script from \"./NetworkEdit.vue?vue&type=script&lang=ts\"\nexport * from \"./NetworkEdit.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div id=\"chat-container\" class=\"window\">\n\t\t<div\n\t\t\tid=\"chat\"\n\t\t\t:class=\"{\n\t\t\t\t'time-seconds': store.state.settings.showSeconds,\n\t\t\t\t'time-12h': store.state.settings.use12hClock,\n\t\t\t}\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclass=\"chat-view\"\n\t\t\t\tdata-type=\"search-results\"\n\t\t\t\taria-label=\"Search results\"\n\t\t\t\trole=\"tabpanel\"\n\t\t\t>\n\t\t\t\t<div v-if=\"network && channel\" class=\"header\">\n\t\t\t\t\t<SidebarToggle />\n\t\t\t\t\t<span class=\"title\"\n\t\t\t\t\t\t>Searching in\n\t\t\t\t\t\t<span class=\"channel-name\">{{ channel.name }} </span> for</span\n\t\t\t\t\t>\n\t\t\t\t\t<span class=\"topic\">{{ route.query.q }} </span>\n\t\t\t\t\t<MessageSearchForm :network=\"network\" :channel=\"channel\" />\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"close\"\n\t\t\t\t\t\taria-label=\"Close search window\"\n\t\t\t\t\t\ttitle=\"Close search window\"\n\t\t\t\t\t\t@click=\"closeSearch\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"network && channel\" class=\"chat-content\">\n\t\t\t\t\t<div ref=\"chat\" class=\"chat\" tabindex=\"-1\">\n\t\t\t\t\t\t<div v-show=\"moreResultsAvailable\" class=\"show-more\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tref=\"loadMoreButton\"\n\t\t\t\t\t\t\t\t:disabled=\"\n\t\t\t\t\t\t\t\t\t!!store.state.messageSearchPendingQuery ||\n\t\t\t\t\t\t\t\t\t!store.state.isConnected\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\tclass=\"btn\"\n\t\t\t\t\t\t\t\t@click=\"onShowMoreClick\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span v-if=\"store.state.messageSearchPendingQuery\">Loading…</span>\n\t\t\t\t\t\t\t\t<span v-else>Show older messages</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"store.state.messageSearchPendingQuery && !offset\"\n\t\t\t\t\t\t\tclass=\"search-status\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSearching…\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div v-else-if=\"!messages.length && !offset\" class=\"search-status\">\n\t\t\t\t\t\t\tNo results found.\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"messages\"\n\t\t\t\t\t\t\trole=\"log\"\n\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\taria-relevant=\"additions\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tv-for=\"(message, id) in messages\"\n\t\t\t\t\t\t\t\t:key=\"message.id\"\n\t\t\t\t\t\t\t\tclass=\"result\"\n\t\t\t\t\t\t\t\t:data-jump-to=\"\n\t\t\t\t\t\t\t\t\tstore.state.settings.enableEnhancedSearch || undefined\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<DateMarker\n\t\t\t\t\t\t\t\t\tv-if=\"shouldDisplayDateMarker(message, id)\"\n\t\t\t\t\t\t\t\t\t:key=\"message.id + '-date'\"\n\t\t\t\t\t\t\t\t\t:message=\"message\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<Message\n\t\t\t\t\t\t\t\t\t:key=\"message.id\"\n\t\t\t\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t\t\t:message=\"message\"\n\t\t\t\t\t\t\t\t\t:data-id=\"message.id\"\n\t\t\t\t\t\t\t\t\t@click=\"jump(message)\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.channel-name {\n\tfont-weight: 700;\n}\n\n.result[data-jump-to] > .msg {\n\tcursor: pointer;\n\n\t&:hover {\n\t\tbackground-color: var(--highlight-bg-color) !important;\n\t}\n}\n\n.chat-view[data-type=\"search-results\"] .chat-content {\n\tmargin-top: 45px;\n}\n</style>\n\n<script lang=\"ts\">\nimport socket from \"../../js/socket\";\nimport eventbus from \"../../js/eventbus\";\n\nimport SidebarToggle from \"../SidebarToggle.vue\";\nimport Message from \"../Message.vue\";\nimport MessageSearchForm from \"../MessageSearchForm.vue\";\nimport DateMarker from \"../DateMarker.vue\";\nimport {watch, computed, defineComponent, nextTick, ref, onMounted, onUnmounted} from \"vue\";\nimport type {ClientMessage} from \"../../js/types\";\n\nimport {useStore} from \"../../js/store\";\nimport {useRoute} from \"vue-router\";\nimport {switchToChannel} from \"../../js/router\";\nimport {SearchQuery} from \"../../../shared/types/storage\";\n\nexport default defineComponent({\n\tname: \"SearchResults\",\n\tcomponents: {\n\t\tSidebarToggle,\n\t\tMessage,\n\t\tDateMarker,\n\t\tMessageSearchForm,\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\t\tconst route = useRoute();\n\n\t\tconst chat = ref<HTMLDivElement>();\n\n\t\tconst loadMoreButton = ref<HTMLButtonElement>();\n\n\t\tconst offset = ref(0);\n\t\tconst moreResultsAvailable = ref(false);\n\t\tconst oldScrollTop = ref(0);\n\t\tconst oldChatHeight = ref(0);\n\n\t\tconst messages = computed(() => {\n\t\t\tconst results = store.state.messageSearchResults?.results;\n\n\t\t\tif (!results) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn results;\n\t\t});\n\n\t\tconst chan = computed(() => {\n\t\t\tconst chanId = parseInt(String(route.params.id || \"\"), 10);\n\t\t\treturn store.getters.findChannel(chanId);\n\t\t});\n\n\t\tconst network = computed(() => {\n\t\t\tif (!chan.value) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn chan.value.network;\n\t\t});\n\n\t\tconst channel = computed(() => {\n\t\t\tif (!chan.value) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn chan.value.channel;\n\t\t});\n\n\t\tconst setActiveChannel = () => {\n\t\t\tif (!chan.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstore.commit(\"activeChannel\", chan.value);\n\t\t};\n\n\t\tconst closeSearch = () => {\n\t\t\tif (!channel.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tswitchToChannel(channel.value);\n\t\t};\n\n\t\tconst shouldDisplayDateMarker = (message: ClientMessage, id: number) => {\n\t\t\tconst previousMessage = messages.value[id - 1];\n\n\t\t\tif (!previousMessage) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn new Date(previousMessage.time).getDay() !== new Date(message.time).getDay();\n\t\t};\n\n\t\tconst clearSearchState = () => {\n\t\t\toffset.value = 0;\n\t\t\tstore.commit(\"messageSearchResults\", null);\n\t\t\tstore.commit(\"messageSearchPendingQuery\", null);\n\t\t};\n\n\t\tconst doSearch = () => {\n\t\t\tif (!network.value || !channel.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tclearSearchState(); // this is a new search, so we need to clear anything before that\n\t\t\tconst query: SearchQuery = {\n\t\t\t\tnetworkUuid: network.value.uuid,\n\t\t\t\tchannelName: channel.value.name,\n\t\t\t\tsearchTerm: String(route.query.q || \"\"),\n\t\t\t\toffset: offset.value,\n\t\t\t};\n\t\t\tstore.commit(\"messageSearchPendingQuery\", query);\n\t\t\tsocket.emit(\"search\", query);\n\t\t};\n\n\t\tconst onShowMoreClick = () => {\n\t\t\tif (!chat.value || !network.value || !channel.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\toffset.value += 100;\n\n\t\t\toldScrollTop.value = chat.value.scrollTop;\n\t\t\toldChatHeight.value = chat.value.scrollHeight;\n\n\t\t\tconst query: SearchQuery = {\n\t\t\t\tnetworkUuid: network.value.uuid,\n\t\t\t\tchannelName: channel.value.name,\n\t\t\t\tsearchTerm: String(route.query.q || \"\"),\n\t\t\t\toffset: offset.value,\n\t\t\t};\n\t\t\tstore.commit(\"messageSearchPendingQuery\", query);\n\t\t\tsocket.emit(\"search\", query);\n\t\t};\n\n\t\tconst jumpToBottom = async () => {\n\t\t\tawait nextTick();\n\n\t\t\tconst el = chat.value;\n\n\t\t\tif (!el) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tel.scrollTop = el.scrollHeight;\n\t\t};\n\n\t\t// Jump to a search result - navigate to channel with message ID and time\n\t\t// If message isn't in memory, MessageList will scroll to closest match by time\n\t\tconst jump = (message: ClientMessage) => {\n\t\t\tif (!store.state.settings.enableEnhancedSearch || !channel.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst messageTime = new Date(message.time).getTime();\n\t\t\tswitchToChannel(channel.value, message.id, messageTime);\n\t\t};\n\n\t\twatch(\n\t\t\t() => route.params.id,\n\t\t\t() => {\n\t\t\t\tdoSearch();\n\t\t\t\tsetActiveChannel();\n\t\t\t}\n\t\t);\n\n\t\twatch(\n\t\t\t() => route.query,\n\t\t\t() => {\n\t\t\t\tdoSearch();\n\t\t\t\tsetActiveChannel();\n\t\t\t}\n\t\t);\n\n\t\twatch(messages, async () => {\n\t\t\tmoreResultsAvailable.value = !!(\n\t\t\t\tmessages.value.length && !(messages.value.length % 100)\n\t\t\t);\n\n\t\t\tif (!offset.value) {\n\t\t\t\tawait jumpToBottom();\n\t\t\t} else {\n\t\t\t\tawait nextTick();\n\n\t\t\t\tconst el = chat.value;\n\n\t\t\t\tif (!el) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst currentChatHeight = el.scrollHeight;\n\t\t\t\tel.scrollTop = oldScrollTop.value + currentChatHeight - oldChatHeight.value;\n\t\t\t}\n\t\t});\n\n\t\tonMounted(() => {\n\t\t\tsetActiveChannel();\n\t\t\tdoSearch();\n\n\t\t\teventbus.on(\"escapekey\", closeSearch);\n\t\t\teventbus.on(\"re-search\", doSearch);\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\teventbus.off(\"escapekey\", closeSearch);\n\t\t\teventbus.off(\"re-search\", doSearch);\n\t\t\tclearSearchState();\n\t\t});\n\n\t\treturn {\n\t\t\tchat,\n\t\t\tloadMoreButton,\n\t\t\tmessages,\n\t\t\tmoreResultsAvailable,\n\t\t\tnetwork,\n\t\t\tchannel,\n\t\t\troute,\n\t\t\toffset,\n\t\t\tstore,\n\t\t\tsetActiveChannel,\n\t\t\tcloseSearch,\n\t\t\tshouldDisplayDateMarker,\n\t\t\tdoSearch,\n\t\t\tonShowMoreClick,\n\t\t\tjumpToBottom,\n\t\t\tjump,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<div\n\t\t:id=\"'msg-' + prettyMessage.id\"\n\t\t:class=\"[\n\t\t\t'msg',\n\t\t\t{\n\t\t\t\tself: prettyMessage.self,\n\t\t\t\thighlight: prettyMessage.highlight,\n\t\t\t\t'is-focused': isFocused,\n\t\t\t\t'previous-source': isPreviousSource,\n\t\t\t},\n\t\t]\"\n\t\t:data-type=\"prettyMessage.type\"\n\t\t:data-command=\"prettyMessage.command\"\n\t\t:data-from=\"\n\t\t\tprettyMessage.from &&\n\t\t\t(prettyMessage.from.shoutbox\n\t\t\t\t? prettyMessage.from.original_nick\n\t\t\t\t: prettyMessage.from.nick)\n\t\t\"\n\t\t:data-bridged=\"prettyMessage.from?.shoutbox\"\n\t>\n\t\t<span\n\t\t\taria-hidden=\"true\"\n\t\t\t:aria-label=\"messageTimeLocale\"\n\t\t\tclass=\"time tooltipped tooltipped-e\"\n\t\t\t>{{ `${messageTime} ` }}\n\t\t</span>\n\t\t<template v-if=\"prettyMessage.type === 'unhandled'\">\n\t\t\t<span class=\"from\">[{{ prettyMessage.command }}]</span>\n\t\t\t<span class=\"content\">\n\t\t\t\t<span v-for=\"(param, id) in prettyMessage.params\" :key=\"id\">{{\n\t\t\t\t\t` ${param} `\n\t\t\t\t}}</span>\n\t\t\t</span>\n\t\t</template>\n\t\t<template v-else-if=\"isAction()\">\n\t\t\t<span class=\"from\"><span class=\"only-copy\" aria-hidden=\"true\">*** </span></span>\n\t\t\t<component :is=\"messageComponent\" :network=\"network\" :message=\"prettyMessage\" />\n\t\t</template>\n\t\t<template v-else-if=\"prettyMessage.type === 'action'\">\n\t\t\t<span class=\"from\"><span class=\"only-copy\">* </span></span>\n\t\t\t<span class=\"content\" dir=\"auto\">\n\t\t\t\t<Username\n\t\t\t\t\t:user=\"prettyMessage.from\"\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\tdir=\"auto\"\n\t\t\t\t/> <ParsedMessage :message=\"prettyMessage\" />\n\t\t\t\t<LinkPreview\n\t\t\t\t\tv-for=\"preview in prettyMessage.previews\"\n\t\t\t\t\t:key=\"preview.link\"\n\t\t\t\t\t:keep-scroll-position=\"keepScrollPosition\"\n\t\t\t\t\t:link=\"preview\"\n\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t/>\n\t\t\t</span>\n\t\t</template>\n\t\t<template v-else>\n\t\t\t<span v-if=\"prettyMessage.type === 'message'\" class=\"from\">\n\t\t\t\t<template v-if=\"prettyMessage.from && prettyMessage.from.nick\">\n\t\t\t\t\t<span class=\"only-copy\" aria-hidden=\"true\"><</span>\n\t\t\t\t\t<Username :user=\"prettyMessage.from\" :network=\"network\" :channel=\"channel\" />\n\t\t\t\t\t<span class=\"only-copy\" aria-hidden=\"true\">> </span>\n\t\t\t\t</template>\n\t\t\t</span>\n\t\t\t<span v-else-if=\"prettyMessage.type === 'plugin'\" class=\"from\">\n\t\t\t\t<template v-if=\"prettyMessage.from && prettyMessage.from.nick\">\n\t\t\t\t\t<span class=\"only-copy\" aria-hidden=\"true\">[</span>\n\t\t\t\t\t{{ prettyMessage.from.nick }}\n\t\t\t\t\t<span class=\"only-copy\" aria-hidden=\"true\">] </span>\n\t\t\t\t</template>\n\t\t\t</span>\n\t\t\t<span v-else class=\"from\">\n\t\t\t\t<template v-if=\"prettyMessage.from && prettyMessage.from.nick\">\n\t\t\t\t\t<span class=\"only-copy\" aria-hidden=\"true\">-</span>\n\t\t\t\t\t<Username :user=\"prettyMessage.from\" :network=\"network\" :channel=\"channel\" />\n\t\t\t\t\t<span class=\"only-copy\" aria-hidden=\"true\">- </span>\n\t\t\t\t</template>\n\t\t\t</span>\n\t\t\t<span class=\"content\" dir=\"auto\">\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"prettyMessage.showInActive\"\n\t\t\t\t\taria-label=\"This message was shown in your active channel\"\n\t\t\t\t\tclass=\"msg-shown-in-active tooltipped tooltipped-e\"\n\t\t\t\t\t><span></span\n\t\t\t\t></span>\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"prettyMessage.statusmsgGroup\"\n\t\t\t\t\t:aria-label=\"`This message was only shown to users with ${prettyMessage.statusmsgGroup} mode`\"\n\t\t\t\t\tclass=\"msg-statusmsg tooltipped tooltipped-e\"\n\t\t\t\t\t><span>{{ prettyMessage.statusmsgGroup }}</span></span\n\t\t\t\t>\n\t\t\t\t<ParsedMessage :network=\"network\" :message=\"prettyMessage\" />\n\t\t\t\t<LinkPreview\n\t\t\t\t\tv-for=\"preview in prettyMessage.previews\"\n\t\t\t\t\t:key=\"preview.link\"\n\t\t\t\t\t:keep-scroll-position=\"keepScrollPosition\"\n\t\t\t\t\t:link=\"preview\"\n\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t/>\n\t\t\t</span>\n\t\t</template>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, PropType} from \"vue\";\nimport dayjs from \"dayjs\";\n\nimport constants from \"../js/constants\";\nimport localetime from \"../js/helpers/localetime\";\nimport Username from \"./Username.vue\";\nimport LinkPreview from \"./LinkPreview.vue\";\nimport ParsedMessage from \"./ParsedMessage.vue\";\nimport MessageTypes from \"./MessageTypes\";\n\nimport type {ClientChan, ClientMessage, ClientNetwork} from \"../js/types\";\nimport {useStore} from \"../js/store\";\nimport {MessageType} from \"../../shared/types/msg\";\nimport {parser as shoutboxParser} from \"../js/helpers/shoutbox-bridge/parser\";\nimport {ChanType} from \"../../shared/types/chan\";\n\nMessageTypes.ParsedMessage = ParsedMessage;\nMessageTypes.LinkPreview = LinkPreview;\nMessageTypes.Username = Username;\n\nexport default defineComponent({\n\tname: \"Message\",\n\tcomponents: MessageTypes,\n\tprops: {\n\t\tmessage: {type: Object as PropType<ClientMessage>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: false},\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tkeepScrollPosition: Function as PropType<() => void>,\n\t\tisPreviousSource: Boolean,\n\t\tisFocused: Boolean,\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\n\t\tconst timeFormat = computed(() => {\n\t\t\tlet format: keyof typeof constants.timeFormats;\n\n\t\t\tif (store.state.settings.use12hClock) {\n\t\t\t\tformat = store.state.settings.showSeconds ? \"msg12hWithSeconds\" : \"msg12h\";\n\t\t\t} else {\n\t\t\t\tformat = store.state.settings.showSeconds ? \"msgWithSeconds\" : \"msgDefault\";\n\t\t\t}\n\n\t\t\treturn constants.timeFormats[format];\n\t\t});\n\n\t\tconst messageTime = computed(() => {\n\t\t\treturn dayjs(props.message.time).format(timeFormat.value);\n\t\t});\n\n\t\tconst messageTimeLocale = computed(() => {\n\t\t\treturn localetime(props.message.time);\n\t\t});\n\n\t\tconst messageComponent = computed(() => {\n\t\t\treturn \"message-\" + (props.message.type || \"invalid\"); // TODO: force existence of type in sharedmsg\n\t\t});\n\n\t\tconst isAction = () => {\n\t\t\tif (!props.message.type) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn typeof MessageTypes[\"message-\" + props.message.type] !== \"undefined\";\n\t\t};\n\n\t\t// IRC Bridge formatter\n\t\tconst prettyMessage = computed(() => {\n\t\t\tif (\n\t\t\t\tprops.channel?.type !== ChanType.CHANNEL ||\n\t\t\t\t!store.state.settings.beautifyBridgedMessages ||\n\t\t\t\tprops.message.type !== MessageType.MESSAGE\n\t\t\t) {\n\t\t\t\treturn props.message;\n\t\t\t}\n\n\t\t\treturn shoutboxParser(props.message);\n\t\t});\n\n\t\treturn {\n\t\t\ttimeFormat,\n\t\t\tprettyMessage,\n\t\t\tmessageTime,\n\t\t\tmessageTimeLocale,\n\t\t\tmessageComponent,\n\t\t\tisAction,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<div\n\t\tv-if=\"link.shown\"\n\t\tv-show=\"link.sourceLoaded || link.type === 'link'\"\n\t\tref=\"container\"\n\t\tclass=\"preview\"\n\t\tdir=\"ltr\"\n\t>\n\t\t<div\n\t\t\tref=\"content\"\n\t\t\t:class=\"['toggle-content', 'toggle-type-' + link.type, {opened: isContentShown}]\"\n\t\t>\n\t\t\t<template v-if=\"link.type === 'link'\">\n\t\t\t\t<a\n\t\t\t\t\tv-if=\"link.thumb\"\n\t\t\t\t\tv-show=\"link.sourceLoaded\"\n\t\t\t\t\t:href=\"link.link\"\n\t\t\t\t\tclass=\"toggle-thumbnail\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t@click=\"onThumbnailClick\"\n\t\t\t\t>\n\t\t\t\t\t<img\n\t\t\t\t\t\t:src=\"link.thumb\"\n\t\t\t\t\t\tdecoding=\"async\"\n\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\tclass=\"thumb\"\n\t\t\t\t\t\t@error=\"onThumbnailError\"\n\t\t\t\t\t\t@abort=\"onThumbnailError\"\n\t\t\t\t\t\t@load=\"onPreviewReady\"\n\t\t\t\t\t/>\n\t\t\t\t</a>\n\t\t\t\t<div class=\"toggle-text\" dir=\"auto\">\n\t\t\t\t\t<div class=\"head\">\n\t\t\t\t\t\t<div class=\"overflowable\">\n\t\t\t\t\t\t\t<a :href=\"link.link\" :title=\"link.head\" target=\"_blank\" rel=\"noopener\"\n\t\t\t\t\t\t\t\t>{{ link.head }}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tv-if=\"showMoreButton\"\n\t\t\t\t\t\t\t:aria-expanded=\"isContentShown\"\n\t\t\t\t\t\t\t:aria-label=\"moreButtonLabel\"\n\t\t\t\t\t\t\tdir=\"auto\"\n\t\t\t\t\t\t\tclass=\"more\"\n\t\t\t\t\t\t\t@click=\"onMoreClick\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span class=\"more-caret\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"body overflowable\">\n\t\t\t\t\t\t<a :href=\"link.link\" :title=\"link.body\" target=\"_blank\" rel=\"noopener\"\n\t\t\t\t\t\t\t>{{ link.body }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"link.type === 'image'\">\n\t\t\t\t<a\n\t\t\t\t\t:href=\"link.link\"\n\t\t\t\t\tclass=\"toggle-thumbnail\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t@click=\"onThumbnailClick\"\n\t\t\t\t>\n\t\t\t\t\t<img\n\t\t\t\t\t\tv-show=\"link.sourceLoaded\"\n\t\t\t\t\t\t:src=\"link.thumb\"\n\t\t\t\t\t\tdecoding=\"async\"\n\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t@load=\"onPreviewReady\"\n\t\t\t\t\t/>\n\t\t\t\t</a>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"link.type === 'video'\">\n\t\t\t\t<video\n\t\t\t\t\tv-show=\"link.sourceLoaded\"\n\t\t\t\t\tpreload=\"metadata\"\n\t\t\t\t\tcontrols\n\t\t\t\t\t@canplay=\"onPreviewReady\"\n\t\t\t\t>\n\t\t\t\t\t<source :src=\"link.media\" :type=\"link.mediaType\" />\n\t\t\t\t</video>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"link.type === 'audio'\">\n\t\t\t\t<audio\n\t\t\t\t\tv-show=\"link.sourceLoaded\"\n\t\t\t\t\tcontrols\n\t\t\t\t\tpreload=\"metadata\"\n\t\t\t\t\t@canplay=\"onPreviewReady\"\n\t\t\t\t>\n\t\t\t\t\t<source :src=\"link.media\" :type=\"link.mediaType\" />\n\t\t\t\t</audio>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"link.type === 'error'\">\n\t\t\t\t<em v-if=\"link.error === 'image-too-big'\">\n\t\t\t\t\tThis image is larger than {{ imageMaxSize }}\n\n\t\t\t\t\tand cannot be previewed.\n\t\t\t\t\t<a :href=\"link.link\" target=\"_blank\" rel=\"noopener\">Click here</a>\n\t\t\t\t\tto open it in a new window.\n\t\t\t\t</em>\n\t\t\t\t<template v-else-if=\"link.error === 'message'\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<em>\n\t\t\t\t\t\t\tA preview could not be loaded.\n\t\t\t\t\t\t\t<a :href=\"link.link\" target=\"_blank\" rel=\"noopener\">Click here</a>\n\t\t\t\t\t\t\tto open it in a new window.\n\t\t\t\t\t\t</em>\n\t\t\t\t\t\t<br />\n\t\t\t\t\t\t<pre class=\"prefetch-error\"\n\t\t\t\t\t\t\t>{{ link.message }}\n\n</pre\n\t\t\t\t\t\t>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<button\n\t\t\t\t\t\t:aria-expanded=\"isContentShown\"\n\t\t\t\t\t\t:aria-label=\"moreButtonLabel\"\n\t\t\t\t\t\tclass=\"more\"\n\t\t\t\t\t\t@click=\"onMoreClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"more-caret\" />\n\t\t\t\t\t</button>\n\t\t\t\t</template>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {\n\tcomputed,\n\tdefineComponent,\n\tinject,\n\tnextTick,\n\tonBeforeUnmount,\n\tonMounted,\n\tonUnmounted,\n\tPropType,\n\tref,\n\twatch,\n} from \"vue\";\nimport {onBeforeRouteUpdate} from \"vue-router\";\nimport eventbus from \"../js/eventbus\";\nimport friendlysize from \"../js/helpers/friendlysize\";\nimport {useStore} from \"../js/store\";\nimport type {ClientChan, ClientLinkPreview} from \"../js/types\";\nimport {imageViewerKey} from \"./App.vue\";\n\nexport default defineComponent({\n\tname: \"LinkPreview\",\n\tprops: {\n\t\tlink: {\n\t\t\ttype: Object as PropType<ClientLinkPreview>,\n\t\t\trequired: true,\n\t\t},\n\t\tkeepScrollPosition: {\n\t\t\ttype: Function as PropType<() => void>,\n\t\t\trequired: true,\n\t\t},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\n\t\tconst showMoreButton = ref(false);\n\t\tconst isContentShown = ref(false);\n\t\tconst imageViewer = inject(imageViewerKey);\n\n\t\tonBeforeRouteUpdate((to, from, next) => {\n\t\t\t// cancel the navigation if the user is trying to close the image viewer\n\t\t\tif (imageViewer?.value?.link) {\n\t\t\t\timageViewer.value.closeViewer();\n\t\t\t\treturn next(false);\n\t\t\t}\n\n\t\t\tnext();\n\t\t});\n\n\t\tconst content = ref<HTMLDivElement | null>(null);\n\t\tconst container = ref<HTMLDivElement | null>(null);\n\n\t\tconst moreButtonLabel = computed(() => {\n\t\t\treturn isContentShown.value ? \"Less\" : \"More\";\n\t\t});\n\n\t\tconst imageMaxSize = computed(() => {\n\t\t\tif (!props.link.maxSize) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn friendlysize(props.link.maxSize);\n\t\t});\n\n\t\tconst handleResize = () => {\n\t\t\tnextTick(() => {\n\t\t\t\tif (!content.value || !container.value) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tshowMoreButton.value = content.value.offsetWidth >= container.value.offsetWidth;\n\t\t\t}).catch((e) => {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(\"Error in LinkPreview.handleResize\", e);\n\t\t\t});\n\t\t};\n\n\t\tconst onPreviewReady = () => {\n\t\t\tprops.link.sourceLoaded = true;\n\n\t\t\tprops.keepScrollPosition();\n\n\t\t\tif (props.link.type === \"link\") {\n\t\t\t\thandleResize();\n\t\t\t}\n\t\t};\n\n\t\tconst onPreviewUpdate = () => {\n\t\t\t// Don't display previews while they are loading on the server\n\t\t\tif (props.link.type === \"loading\") {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Error does not have any media to render\n\t\t\tif (props.link.type === \"error\") {\n\t\t\t\tonPreviewReady();\n\t\t\t}\n\n\t\t\t// If link doesn't have a thumbnail, render it\n\t\t\tif (props.link.type === \"link\") {\n\t\t\t\thandleResize();\n\t\t\t\tprops.keepScrollPosition();\n\t\t\t}\n\t\t};\n\n\t\tconst onThumbnailError = () => {\n\t\t\t// If thumbnail fails to load, hide it and show the preview without it\n\t\t\tprops.link.thumb = \"\";\n\t\t\tonPreviewReady();\n\t\t};\n\n\t\tconst onThumbnailClick = (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\n\t\t\tif (!imageViewer?.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\timageViewer.value.channel = props.channel;\n\t\t\timageViewer.value.link = props.link;\n\t\t};\n\n\t\tconst onMoreClick = () => {\n\t\t\tisContentShown.value = !isContentShown.value;\n\t\t\tprops.keepScrollPosition();\n\t\t};\n\n\t\tconst updateShownState = () => {\n\t\t\t// User has manually toggled the preview, do not apply default\n\t\t\tif (props.link.shown !== null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet defaultState = false;\n\n\t\t\tswitch (props.link.type) {\n\t\t\t\tcase \"error\":\n\t\t\t\t\t// Collapse all errors by default unless its a message about image being too big\n\t\t\t\t\tif (props.link.error === \"image-too-big\") {\n\t\t\t\t\t\tdefaultState = store.state.settings.media;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"link\":\n\t\t\t\t\tdefaultState = store.state.settings.links;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdefaultState = store.state.settings.media;\n\t\t\t}\n\n\t\t\tprops.link.shown = defaultState;\n\t\t};\n\n\t\tupdateShownState();\n\n\t\twatch(\n\t\t\t() => props.link.type,\n\t\t\t() => {\n\t\t\t\tupdateShownState();\n\t\t\t\tonPreviewUpdate();\n\t\t\t}\n\t\t);\n\n\t\tonMounted(() => {\n\t\t\teventbus.on(\"resize\", handleResize);\n\n\t\t\tonPreviewUpdate();\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\teventbus.off(\"resize\", handleResize);\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\t// Let this preview go through load/canplay events again,\n\t\t\t// Otherwise the browser can cause a resize on video elements\n\t\t\tprops.link.sourceLoaded = false;\n\t\t});\n\n\t\treturn {\n\t\t\tmoreButtonLabel,\n\t\t\timageMaxSize,\n\t\t\tonThumbnailClick,\n\t\t\tonThumbnailError,\n\t\t\tonMoreClick,\n\t\t\tonPreviewReady,\n\t\t\tonPreviewUpdate,\n\t\t\tshowMoreButton,\n\t\t\tisContentShown,\n\t\t\tcontent,\n\t\t\tcontainer,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./LinkPreview.vue?vue&type=template&id=5e54cfd6&ts=true\"\nimport script from \"./LinkPreview.vue?vue&type=script&lang=ts\"\nexport * from \"./LinkPreview.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import type {Component} from \"vue\";\n\n// This creates a version of `require()` in the context of the current\n// directory, so we iterate over its content, which is a map statically built by\n// Webpack.\n// Second argument says it's recursive, third makes sure we only load templates.\nconst requireViews = require.context(\".\", false, /\\.vue$/);\n\nexport default requireViews.keys().reduce((acc: Record<string, Component>, path) => {\n\tacc[\"message-\" + path.substring(2, path.length - 4)] = requireViews(path).default;\n\n\treturn acc;\n}, {});\n","export enum MessageType {\n\tUNHANDLED = \"unhandled\",\n\tACTION = \"action\",\n\tAWAY = \"away\",\n\tBACK = \"back\",\n\tERROR = \"error\",\n\tINVITE = \"invite\",\n\tJOIN = \"join\",\n\tKICK = \"kick\",\n\tLOGIN = \"login\",\n\tLOGOUT = \"logout\",\n\tMESSAGE = \"message\",\n\tMODE = \"mode\",\n\tMODE_CHANNEL = \"mode_channel\",\n\tMODE_USER = \"mode_user\", // RPL_UMODEIS\n\tMONOSPACE_BLOCK = \"monospace_block\",\n\tNICK = \"nick\",\n\tNOTICE = \"notice\",\n\tPART = \"part\",\n\tQUIT = \"quit\",\n\tCTCP = \"ctcp\",\n\tCTCP_REQUEST = \"ctcp_request\",\n\tCHGHOST = \"chghost\",\n\tTOPIC = \"topic\",\n\tTOPIC_SET_BY = \"topic_set_by\",\n\tWHOIS = \"whois\",\n\tRAW = \"raw\",\n\tPLUGIN = \"plugin\",\n\tWALLOPS = \"wallops\",\n\tMASS_EVENT = \"mass_event\",\n}\n\nexport type SharedUser = {\n\tmodes: string[];\n\t// Users in the channel have only one mode assigned\n\tmode: string;\n\taway: string;\n\tnick: string;\n\tlastMessage: number;\n};\n\nexport type UserInMessage = Partial<SharedUser> & {\n\tmode: string;\n\tshoutbox?: boolean;\n\toriginal_nick?: string;\n};\n\nexport type LinkPreview = {\n\ttype: string;\n\thead: string;\n\tbody: string;\n\tthumb: string;\n\tsize: number;\n\tlink: string; // Send original matched link to the client\n\tshown?: boolean | null;\n\terror?: string;\n\tmessage?: string;\n\n\tmedia?: string;\n\tmediaType?: string;\n\tmaxSize?: number;\n\tthumbActualUrl?: string;\n};\n\nexport interface WhoisData {\n\tnick: string;\n\terror?: boolean;\n\tidle?: number;\n\tlogon?: number;\n\twhowas?: boolean;\n\t[key: string]: unknown;\n}\n\nexport interface MassEventSummary {\n\tjoins: number;\n\tparts: number;\n\tquits: number;\n\tmodes: number;\n\tnicks: number;\n\tkicks: number;\n\tchghosts: number;\n\taway: number;\n\tback: number;\n\tduration: number;\n\tstartTime: Date;\n\tendTime: Date;\n}\n\nexport type SharedMsg = {\n\tfrom?: UserInMessage;\n\tid: number;\n\tpreviews?: LinkPreview[];\n\ttext?: string;\n\ttype?: MessageType;\n\tself?: boolean;\n\ttime: Date;\n\thostmask?: string;\n\ttarget?: UserInMessage;\n\t// TODO: new_nick is only on MessageType.NICK,\n\t// we should probably make Msgs that extend this class and use those\n\t// throughout. I'll leave any similar fields below.\n\tnew_nick?: string;\n\thighlight?: boolean;\n\tshowInActive?: boolean;\n\tnew_ident?: string;\n\tnew_host?: string;\n\tctcpMessage?: string;\n\tcommand?: string;\n\tinvitedYou?: boolean;\n\tgecos?: string;\n\taccount?: boolean;\n\n\t// these are all just for error:\n\terror?: string;\n\tnick?: string;\n\tchannel?: string;\n\treason?: string;\n\n\traw_modes?: string;\n\twhen?: Date;\n\twhois?: WhoisData;\n\n\tusers: string[];\n\n\tstatusmsgGroup?: string;\n\tparams?: string[];\n\tmassEventSummary?: MassEventSummary;\n};\n","import {type Matcher} from \"./types/matcher\";\n\n/**\n * Matchers for shoutbox messages\n */\nexport const matchers: Matcher[] = [\n\t{\n\t\ttype: \"basic\",\n\t\tname: \"Anthelion\",\n\t\tdescription: \"[ SB ] (<nick>): <message>\",\n\t\tmatches: [\"sauron\"],\n\t\tregex: /^.*?\\[.*?SB.*?\\][^(]+\\((?<nick>[^):]+)\\):.+?(?<content>.*)/,\n\t\ttransform(message) {\n\t\t\treturn typedGroups(message.text!.match(this.regex));\n\t\t},\n\t},\n\t{\n\t\ttype: \"basic\",\n\t\tname: \"BeyondHD + ReelFliX\",\n\t\tdescription: \"[SB] <nick>: <message> | [Chatbox] <nick>: <message>\",\n\t\tmatches: [\"willie\", \"wall-e\"],\n\t\tregex: /^.*?\\[(?:SB|Chatbox)\\][^\\w]+(?<nick>[^:]+): (?<content>.*)/,\n\t\ttransform(message) {\n\t\t\treturn typedGroups(message.text!.match(this.regex));\n\t\t},\n\t},\n\t{\n\t\ttype: \"basic\",\n\t\tname: \"UploadCX + LST + OnlyEncodes+ + HomiesHelpDesk + Aither + DarkPeers + Luminarr\",\n\t\tdescription: \"[nick] message | [nick]: message | nick: message | nick message\",\n\t\tmatches: [\"ulcx\", \"bot\", \"bridgebot\", \"bbot\", \"chatbot\", \"darkpeers\", \"luminarr\"],\n\t\tregex: /^\\[?(?<nick>[^:\\]]+)\\]?:? (?<content>.*)/,\n\t\ttransform(message) {\n\t\t\treturn typedGroups(message.text!.match(this.regex));\n\t\t},\n\t},\n\t{\n\t\ttype: \"basic\",\n\t\tname: \"RocketHD\",\n\t\tdescription: \"🛰️<nick>: <message>\",\n\t\tmatches: [\"rocketnouncer\"],\n\t\tregex: /^🛰️(?<nick>[^:]+?): (?<content>.*)/v,\n\t\ttransform(message) {\n\t\t\treturn typedGroups(message.text!.match(this.regex));\n\t\t},\n\t},\n\t{\n\t\ttype: \"basic\",\n\t\tname: \"DigitalCore\",\n\t\tdescription: \"<<nick>> <message>\",\n\t\tmatches: [\"endor\"],\n\t\tregex: /^<(?<nick>[^>]+?)> (?<content>.*)/,\n\t\ttransform(message) {\n\t\t\treturn typedGroups(message.text!.match(this.regex));\n\t\t},\n\t},\n\t{\n\t\ttype: \"basic\",\n\t\tname: \"HUNO (Discord)\",\n\t\tdescription: \"»<nick> (<rank>)« <message> | »<nick>« <message>\",\n\t\tmatches: [\"mellos\"],\n\t\tregex: /^»(?<nick>[^«]+?)(?: (?:\\p{RGI_Emoji}+|\\(.+?\\)))?« (?<content>.*)/v,\n\t\ttransform(message) {\n\t\t\treturn typedGroups(message.text!.match(this.regex));\n\t\t},\n\t},\n\t{\n\t\ttype: \"advanced\",\n\t\tname: \"HUNO (Web)\",\n\t\tdescription: \"Nicks in the format '<nick>-web'\",\n\t\tmatches(nick) {\n\t\t\treturn nick.endsWith(\"-web\") || nick.endsWith(\"-web\", nick.length - 2);\n\t\t},\n\t\ttransform(message) {\n\t\t\treturn {\n\t\t\t\tnick: message.from!.nick!.slice(0, -4),\n\t\t\t};\n\t\t},\n\t},\n];\n\n/**\n * Helper to get regex match groups with inferd types from return of parent\n */\nfunction typedGroups<T = RegExpMatchArray[\"groups\"]>(regexMatch: RegExpMatchArray | null) {\n\treturn regexMatch?.groups as T;\n}\n","import type {SharedMsg} from \"../../../../shared/types/msg\";\nimport {toRaw} from \"vue\";\nimport {matchers} from \"./matchers\";\n\n/**\n * Parse message aganst `Matchers` and edit the Nick and Content based on `transform` results\n */\nexport function parser(originalMessage: SharedMsg) {\n\tconst originalSender = originalMessage.from?.nick?.toLowerCase();\n\n\tif (!originalMessage.text || !originalSender) return originalMessage;\n\n\tconst matcher = matchers.find((m) => {\n\t\tif (m.type === \"basic\") return m.matches.includes(originalSender);\n\t\tif (m.type === \"advanced\") return m.matches(originalSender);\n\t});\n\tif (!matcher) return originalMessage;\n\n\tconst edit = matcher.transform(originalMessage);\n\tif (!edit || !edit.nick) return originalMessage;\n\n\tconst message = structuredClone(toRaw(originalMessage));\n\tmessage.text = edit.content ?? message.text;\n\tmessage.from = {\n\t\t...message.from!,\n\t\tnick: sanitizeNick(edit.nick),\n\t\tmode: \"\",\n\t\tshoutbox: true,\n\t\toriginal_nick: originalSender,\n\t};\n\n\treturn message;\n}\n\n/**\n * Helper to remove invalid chars from nick string\n */\nfunction sanitizeNick(nick: string) {\n\treturn nick.replaceAll(/[^0-9a-z_-|]/gi, \"\");\n}\n","import { render } from \"./Message.vue?vue&type=template&id=1b66bbdb&ts=true\"\nimport script from \"./Message.vue?vue&type=script&lang=ts\"\nexport * from \"./Message.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<form :class=\"['message-search', {opened: searchOpened}]\" @submit.prevent=\"searchMessages\">\n\t\t<div class=\"input-wrapper\">\n\t\t\t<input\n\t\t\t\tref=\"searchInputField\"\n\t\t\t\tv-model=\"searchInput\"\n\t\t\t\ttype=\"search\"\n\t\t\t\tname=\"search\"\n\t\t\t\tclass=\"input\"\n\t\t\t\tplaceholder=\"Search messages…\"\n\t\t\t\t@blur=\"closeSearch\"\n\t\t\t\t@keyup.esc=\"closeSearch\"\n\t\t\t/>\n\t\t</div>\n\t\t<button\n\t\t\tv-if=\"!onSearchPage\"\n\t\t\tclass=\"search\"\n\t\t\ttype=\"button\"\n\t\t\taria-label=\"Search messages in this channel\"\n\t\t\t@mousedown.prevent=\"toggleSearch\"\n\t\t/>\n\t</form>\n</template>\n\n<style>\nform.message-search {\n\tdisplay: flex;\n}\n\nform.message-search .input-wrapper {\n\tdisplay: flex;\n}\n\nform.message-search input {\n\twidth: 100%;\n\theight: auto !important;\n\tmargin: 7px 0;\n\tborder: 0;\n\tcolor: inherit;\n\tbackground-color: #fafafa;\n\tappearance: none;\n}\n\nform.message-search input::placeholder {\n\tcolor: rgb(0 0 0 / 35%);\n}\n\n@media (width >= 480px) {\n\tform.message-search input {\n\t\tmin-width: 140px;\n\t}\n\n\tform.message-search input:focus {\n\t\tmin-width: 220px;\n\t}\n}\n\nform.message-search .input-wrapper {\n\tposition: absolute;\n\ttop: 45px;\n\tleft: 0;\n\tright: 0;\n\tz-index: 1;\n\theight: 0;\n\toverflow: hidden;\n\tbackground: var(--window-bg-color);\n}\n\nform.message-search .input-wrapper input {\n\tmargin: 7px;\n}\n\nform.message-search.opened .input-wrapper {\n\theight: 50px;\n}\n\n#chat form.message-search button {\n\tdisplay: flex;\n\tcolor: #607992;\n}\n</style>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, onMounted, PropType, ref, watch} from \"vue\";\nimport {useRoute, useRouter} from \"vue-router\";\nimport eventbus from \"../js/eventbus\";\nimport {ClientNetwork, ClientChan} from \"../js/types\";\n\nexport default defineComponent({\n\tname: \"MessageSearchForm\",\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\tsetup(props) {\n\t\tconst searchOpened = ref(false);\n\t\tconst searchInput = ref(\"\");\n\t\tconst router = useRouter();\n\t\tconst route = useRoute();\n\n\t\tconst searchInputField = ref<HTMLInputElement | null>(null);\n\n\t\tconst onSearchPage = computed(() => {\n\t\t\treturn route.name === \"SearchResults\";\n\t\t});\n\n\t\twatch(route, (newValue) => {\n\t\t\tif (newValue.query.q) {\n\t\t\t\tsearchInput.value = String(newValue.query.q);\n\t\t\t}\n\t\t});\n\n\t\tonMounted(() => {\n\t\t\tsearchInput.value = String(route.query.q || \"\");\n\t\t\tsearchOpened.value = onSearchPage.value;\n\n\t\t\tif (searchInputField.value && !searchInput.value && searchOpened.value) {\n\t\t\t\tsearchInputField.value.focus();\n\t\t\t}\n\t\t});\n\n\t\tconst closeSearch = () => {\n\t\t\tif (!onSearchPage.value) {\n\t\t\t\tsearchInput.value = \"\";\n\t\t\t\tsearchOpened.value = false;\n\t\t\t}\n\t\t};\n\n\t\tconst toggleSearch = () => {\n\t\t\tif (searchOpened.value) {\n\t\t\t\tsearchInputField.value?.blur();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsearchOpened.value = true;\n\t\t\tsearchInputField.value?.focus();\n\t\t};\n\n\t\tconst searchMessages = (event: Event) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tif (!searchInput.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trouter\n\t\t\t\t.push({\n\t\t\t\t\tname: \"SearchResults\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tid: props.channel.id,\n\t\t\t\t\t},\n\t\t\t\t\tquery: {\n\t\t\t\t\t\tq: searchInput.value,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tif (err.name === \"NavigationDuplicated\") {\n\t\t\t\t\t\t// Search for the same query again\n\t\t\t\t\t\teventbus.emit(\"re-search\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t};\n\n\t\treturn {\n\t\t\tsearchOpened,\n\t\t\tsearchInput,\n\t\t\tsearchInputField,\n\t\t\tcloseSearch,\n\t\t\ttoggleSearch,\n\t\t\tsearchMessages,\n\t\t\tonSearchPage,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./MessageSearchForm.vue?vue&type=template&id=7ff02a4a&ts=true\"\nimport script from \"./MessageSearchForm.vue?vue&type=script&lang=ts\"\nexport * from \"./MessageSearchForm.vue?vue&type=script&lang=ts\"\n\nimport \"./MessageSearchForm.vue?vue&type=style&index=0&id=7ff02a4a&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div :aria-label=\"localeDate\" class=\"date-marker-container tooltipped tooltipped-s\">\n\t\t<div class=\"date-marker\">\n\t\t\t;\n\t\t\t<span :aria-label=\"friendlyDate()\" class=\"date-marker-text\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport dayjs from \"dayjs\";\nimport calendar from \"dayjs/plugin/calendar\";\nimport {computed, defineComponent, onBeforeUnmount, onMounted, PropType} from \"vue\";\nimport eventbus from \"../js/eventbus\";\nimport type {ClientMessage} from \"../js/types\";\n\ndayjs.extend(calendar);\n\nexport default defineComponent({\n\tname: \"DateMarker\",\n\tprops: {\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t\tisFocused: Boolean,\n\t},\n\tsetup(props) {\n\t\tconst localeDate = computed(() => dayjs(props.message.time).format(\"D MMMM YYYY\"));\n\n\t\tconst hoursPassed = () => {\n\t\t\treturn (Date.now() - Date.parse(props.message.time.toString())) / 3600000;\n\t\t};\n\n\t\tconst dayChange = () => {\n\t\t\tif (hoursPassed() >= 48) {\n\t\t\t\teventbus.off(\"daychange\", dayChange);\n\t\t\t}\n\t\t};\n\n\t\tconst friendlyDate = () => {\n\t\t\t// See http://momentjs.com/docs/#/displaying/calendar-time/\n\t\t\treturn dayjs(props.message.time).calendar(null, {\n\t\t\t\tsameDay: \"[Today]\",\n\t\t\t\tlastDay: \"[Yesterday]\",\n\t\t\t\tlastWeek: \"D MMMM YYYY\",\n\t\t\t\tsameElse: \"D MMMM YYYY\",\n\t\t\t});\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\tif (hoursPassed() < 48) {\n\t\t\t\teventbus.on(\"daychange\", dayChange);\n\t\t\t}\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\teventbus.off(\"daychange\", dayChange);\n\t\t});\n\n\t\treturn {\n\t\t\tlocaleDate,\n\t\t\tfriendlyDate,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./DateMarker.vue?vue&type=template&id=7c73401a&ts=true\"\nimport script from \"./DateMarker.vue?vue&type=script&lang=ts\"\nexport * from \"./DateMarker.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./SearchResults.vue?vue&type=template&id=1274a5a1&ts=true\"\nimport script from \"./SearchResults.vue?vue&type=script&lang=ts\"\nexport * from \"./SearchResults.vue?vue&type=script&lang=ts\"\n\nimport \"./SearchResults.vue?vue&type=style&index=0&id=1274a5a1&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div id=\"chat-container\" class=\"window\" :data-current-channel=\"channel.name\" lang=\"\">\n\t\t<div\n\t\t\tid=\"chat\"\n\t\t\t:class=\"{\n\t\t\t\t'hide-motd': !store.state.settings.motd,\n\t\t\t\t'time-seconds': store.state.settings.showSeconds,\n\t\t\t\t'time-12h': store.state.settings.use12hClock,\n\t\t\t\t'colored-nicks': true, // TODO temporarily fixes themes, to be removed in next major version\n\t\t\t}\"\n\t\t>\n\t\t\t<div\n\t\t\t\t:id=\"'chan-' + channel.id\"\n\t\t\t\tclass=\"chat-view\"\n\t\t\t\t:data-type=\"channel.type\"\n\t\t\t\t:aria-label=\"channel.name\"\n\t\t\t\trole=\"tabpanel\"\n\t\t\t>\n\t\t\t\t<div class=\"header\">\n\t\t\t\t\t<SidebarToggle />\n\t\t\t\t\t<span class=\"title\" :aria-label=\"'Currently open ' + channel.type\">{{\n\t\t\t\t\t\tchannel.name\n\t\t\t\t\t}}</span>\n\t\t\t\t\t<div v-if=\"channel.editTopic === true\" class=\"topic-container\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tref=\"topicInput\"\n\t\t\t\t\t\t\t:value=\"channel.topic\"\n\t\t\t\t\t\t\tclass=\"topic-input\"\n\t\t\t\t\t\t\tplaceholder=\"Set channel topic\"\n\t\t\t\t\t\t\tenterkeyhint=\"done\"\n\t\t\t\t\t\t\t@keyup.enter=\"saveTopic\"\n\t\t\t\t\t\t\t@keyup.esc=\"channel.editTopic = false\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span aria-label=\"Save topic\" class=\"save-topic\" @click=\"saveTopic\">\n\t\t\t\t\t\t\t<span type=\"button\" aria-label=\"Save topic\"></span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:title=\"channel.topic\"\n\t\t\t\t\t\t:class=\"{topic: true, empty: !channel.topic}\"\n\t\t\t\t\t\t@dblclick=\"editTopic\"\n\t\t\t\t\t\t><ParsedMessage\n\t\t\t\t\t\t\tv-if=\"channel.topic\"\n\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t:text=\"channel.topic\"\n\t\t\t\t\t/></span>\n\t\t\t\t\t<MessageSearchForm\n\t\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t\tstore.state.settings.searchEnabled &&\n\t\t\t\t\t\t\t['channel', 'query'].includes(channel.type)\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"mentions\"\n\t\t\t\t\t\taria-label=\"Open your mentions\"\n\t\t\t\t\t\t@click=\"openMentions\"\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"menu\"\n\t\t\t\t\t\taria-label=\"Open the context menu\"\n\t\t\t\t\t\t@click=\"openContextMenu\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-if=\"channel.type === 'channel'\"\n\t\t\t\t\t\tclass=\"rt-tooltip tooltipped tooltipped-w\"\n\t\t\t\t\t\taria-label=\"Toggle user list\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"rt\"\n\t\t\t\t\t\t\taria-label=\"Toggle user list\"\n\t\t\t\t\t\t\t@click=\"store.commit('toggleUserlist')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"channel.type === 'special'\" class=\"chat-content\">\n\t\t\t\t\t<div class=\"chat\">\n\t\t\t\t\t\t<div class=\"messages\">\n\t\t\t\t\t\t\t<div class=\"msg\">\n\t\t\t\t\t\t\t\t<component\n\t\t\t\t\t\t\t\t\t:is=\"specialComponent\"\n\t\t\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div v-else class=\"chat-content\">\n\t\t\t\t\t<div\n\t\t\t\t\t\t:class=\"[\n\t\t\t\t\t\t\t'scroll-down tooltipped tooltipped-w tooltipped-no-touch',\n\t\t\t\t\t\t\t{'scroll-down-shown': !channel.scrolledToBottom},\n\t\t\t\t\t\t]\"\n\t\t\t\t\t\taria-label=\"Jump to recent messages\"\n\t\t\t\t\t\t@click=\"messageList.jumpToBottom\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"scroll-down-arrow\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<ChatUserList v-if=\"channel.type === 'channel'\" :channel=\"channel\" />\n\t\t\t\t\t<template\n\t\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t\tstore.state.settings.searchEnabled &&\n\t\t\t\t\t\t\tstore.state.settings.enableEnhancedSearch\n\t\t\t\t\t\t\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<MessageList\n\t\t\t\t\t\t\tref=\"messageList\"\n\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t\t\t:is-focused=\"isFocused\"\n\t\t\t\t\t\t\t:focused-time=\"focusedTime\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t<MessageListBasic\n\t\t\t\t\t\t\tref=\"messageList\"\n\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t\t\t:is-focused=\"isFocused\"\n\t\t\t\t\t\t\t:focused-time=\"focusedTime\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"store.state.currentUserVisibleError\"\n\t\t\tid=\"user-visible-error\"\n\t\t\t@click=\"hideUserVisibleError\"\n\t\t>\n\t\t\t{{ store.state.currentUserVisibleError }}\n\t\t</div>\n\t\t<ChatInput :network=\"network\" :channel=\"channel\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport socket from \"../js/socket\";\nimport eventbus from \"../js/eventbus\";\nimport ParsedMessage from \"./ParsedMessage.vue\";\nimport MessageList from \"./MessageList.vue\";\nimport MessageListBasic from \"./MessageList_Basic.vue\";\nimport ChatInput from \"./ChatInput.vue\";\nimport ChatUserList from \"./ChatUserList.vue\";\nimport SidebarToggle from \"./SidebarToggle.vue\";\nimport MessageSearchForm from \"./MessageSearchForm.vue\";\nimport ListBans from \"./Special/ListBans.vue\";\nimport ListInvites from \"./Special/ListInvites.vue\";\nimport ListChannels from \"./Special/ListChannels.vue\";\nimport ListIgnored from \"./Special/ListIgnored.vue\";\nimport {defineComponent, PropType, ref, computed, watch, nextTick, onMounted, Component} from \"vue\";\nimport type {ClientNetwork, ClientChan} from \"../js/types\";\nimport {useStore} from \"../js/store\";\nimport {SpecialChanType, ChanType} from \"../../shared/types/chan\";\n\nexport default defineComponent({\n\tname: \"Chat\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tMessageList,\n\t\tMessageListBasic,\n\t\tChatInput,\n\t\tChatUserList,\n\t\tSidebarToggle,\n\t\tMessageSearchForm,\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t\tisFocused: Number,\n\t\tfocusedTime: Number,\n\t},\n\temits: [\"channel-changed\"],\n\tsetup(props, {emit}) {\n\t\tconst store = useStore();\n\n\t\tconst MessageListType = computed(() => {\n\t\t\tif (store.state.settings.searchEnabled && store.state.settings.enableEnhancedSearch)\n\t\t\t\treturn MessageList;\n\t\t\treturn MessageListBasic;\n\t\t});\n\n\t\tconst messageList = ref<typeof MessageListType.value>(MessageListType.value);\n\t\tconst topicInput = ref<HTMLInputElement | null>(null);\n\n\t\tconst specialComponent = computed(() => {\n\t\t\tswitch (props.channel.special) {\n\t\t\t\tcase SpecialChanType.BANLIST:\n\t\t\t\t\treturn ListBans as Component;\n\t\t\t\tcase SpecialChanType.INVITELIST:\n\t\t\t\t\treturn ListInvites as Component;\n\t\t\t\tcase SpecialChanType.CHANNELLIST:\n\t\t\t\t\treturn ListChannels as Component;\n\t\t\t\tcase SpecialChanType.IGNORELIST:\n\t\t\t\t\treturn ListIgnored as Component;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t});\n\n\t\tconst channelChanged = () => {\n\t\t\t// Triggered when active channel is set or changed\n\t\t\temit(\"channel-changed\", props.channel);\n\n\t\t\tsocket.emit(\"open\", props.channel.id);\n\n\t\t\tif (props.channel.usersOutdated) {\n\t\t\t\tprops.channel.usersOutdated = false;\n\n\t\t\t\tsocket.emit(\"names\", {\n\t\t\t\t\ttarget: props.channel.id,\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tconst hideUserVisibleError = () => {\n\t\t\tstore.commit(\"currentUserVisibleError\", null);\n\t\t};\n\n\t\tconst editTopic = () => {\n\t\t\tif (props.channel.type === ChanType.CHANNEL) {\n\t\t\t\tprops.channel.editTopic = true;\n\t\t\t}\n\t\t};\n\n\t\tconst saveTopic = () => {\n\t\t\tprops.channel.editTopic = false;\n\n\t\t\tif (!topicInput.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst newTopic = topicInput.value.value;\n\n\t\t\tif (props.channel.topic !== newTopic) {\n\t\t\t\tconst target = props.channel.id;\n\t\t\t\tconst text = `/topic ${newTopic}`;\n\t\t\t\tsocket.emit(\"input\", {target, text});\n\t\t\t}\n\t\t};\n\n\t\tconst openContextMenu = (event: MouseEvent) => {\n\t\t\teventbus.emit(\"contextmenu:channel\", {\n\t\t\t\tevent: event,\n\t\t\t\tchannel: props.channel,\n\t\t\t\tnetwork: props.network,\n\t\t\t});\n\t\t};\n\n\t\tconst openMentions = (event: MouseEvent) => {\n\t\t\teventbus.emit(\"mentions:toggle\", {\n\t\t\t\tevent: event,\n\t\t\t});\n\t\t};\n\n\t\twatch(\n\t\t\t() => props.channel,\n\t\t\t() => {\n\t\t\t\tchannelChanged();\n\t\t\t}\n\t\t);\n\n\t\twatch(\n\t\t\t() => props.channel.editTopic,\n\t\t\t(newTopic) => {\n\t\t\t\tif (newTopic) {\n\t\t\t\t\tvoid nextTick(() => {\n\t\t\t\t\t\ttopicInput.value?.focus();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\tonMounted(() => {\n\t\t\tchannelChanged();\n\n\t\t\tif (props.channel.editTopic) {\n\t\t\t\tvoid nextTick(() => {\n\t\t\t\t\ttopicInput.value?.focus();\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tmessageList,\n\t\t\tMessageListType,\n\t\t\ttopicInput,\n\t\t\tspecialComponent,\n\t\t\thideUserVisibleError,\n\t\t\teditTopic,\n\t\t\tsaveTopic,\n\t\t\topenContextMenu,\n\t\t\topenMentions,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<div ref=\"chat\" class=\"chat\" tabindex=\"-1\">\n\t\t<div v-show=\"showLoadMoreButton\" class=\"show-more\">\n\t\t\t<button\n\t\t\t\tref=\"loadMoreButton\"\n\t\t\t\t:disabled=\"channel.historyLoading || !store.state.isConnected\"\n\t\t\t\tclass=\"btn\"\n\t\t\t\t@click=\"onShowMoreClick\"\n\t\t\t>\n\t\t\t\t<span v-if=\"channel.historyLoading\">Loading…</span>\n\t\t\t\t<span v-else>Show older messages</span>\n\t\t\t</button>\n\t\t</div>\n\t\t<div\n\t\t\tclass=\"messages\"\n\t\t\trole=\"log\"\n\t\t\taria-live=\"polite\"\n\t\t\taria-relevant=\"additions\"\n\t\t\t@copy=\"onCopy\"\n\t\t>\n\t\t\t<template v-for=\"(message, idx) in displayedMessages\" :key=\"getMessageKey(message)\">\n\t\t\t\t<DateMarker\n\t\t\t\t\tv-if=\"shouldDisplayDateMarker(message, idx)\"\n\t\t\t\t\t:message=\"message as any\"\n\t\t\t\t\t:is-focused=\"isMessageFocused(message)\"\n\t\t\t\t/>\n\t\t\t\t<div v-if=\"shouldDisplayUnreadMarker(Number(message.id))\" class=\"unread-marker\">\n\t\t\t\t\t<span class=\"unread-marker-text\" />\n\t\t\t\t</div>\n\n\t\t\t\t<MessageCondensed\n\t\t\t\t\tv-if=\"message.type === 'condensed'\"\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:keep-scroll-position=\"keepScrollPosition\"\n\t\t\t\t\t:messages=\"message.messages\"\n\t\t\t\t\t:is-focused=\"isMessageFocused(message)\"\n\t\t\t\t/>\n\t\t\t\t<Message\n\t\t\t\t\tv-else\n\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:message=\"message\"\n\t\t\t\t\t:keep-scroll-position=\"keepScrollPosition\"\n\t\t\t\t\t:is-previous-source=\"isPreviousSource(message, idx)\"\n\t\t\t\t\t:is-focused=\"isMessageFocused(message)\"\n\t\t\t\t\t@toggle-link-preview=\"onLinkPreviewToggle\"\n\t\t\t\t/>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {condensedTypes} from \"../../shared/irc\";\nimport {ChanType} from \"../../shared/types/chan\";\nimport {MessageType, SharedMsg} from \"../../shared/types/msg\";\n\nimport eventbus from \"../js/eventbus\";\nimport clipboard from \"../js/clipboard\";\nimport socket from \"../js/socket\";\nimport Message from \"./Message.vue\";\nimport MessageCondensed from \"./MessageCondensed.vue\";\nimport DateMarker from \"./DateMarker.vue\";\nimport {\n\tcomputed,\n\tdefineComponent,\n\tnextTick,\n\tonBeforeUnmount,\n\tonBeforeUpdate,\n\tonMounted,\n\tonUnmounted,\n\tPropType,\n\tref,\n\twatch,\n} from \"vue\";\nimport {useStore} from \"../js/store\";\nimport {ClientChan, ClientMessage, ClientNetwork, ClientLinkPreview} from \"../js/types\";\n\ntype CondensedMessageContainer = {\n\ttype: \"condensed\";\n\ttime: Date;\n\tmessages: ClientMessage[];\n\tid?: number;\n};\n\n// Render at most this many messages - keeps DOM manageable\nconst MAX_RENDERED_MESSAGES = 500;\n\nexport default defineComponent({\n\tname: \"MessageList\",\n\tcomponents: {\n\t\tMessage,\n\t\tMessageCondensed,\n\t\tDateMarker,\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t\tisFocused: Number,\n\t\tfocusedTime: Number,\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\n\t\tconst chat = ref<HTMLDivElement | null>(null);\n\t\tconst loadMoreButton = ref<HTMLButtonElement | null>(null);\n\t\tconst historyObserver = ref<IntersectionObserver | null>(null);\n\n\t\t// The currently focused/highlighted message ID (primary) or time (fallback)\n\t\tconst focusedMsgId = ref<number | null>(null);\n\t\tconst focusedMsgTime = ref<number | null>(null);\n\n\t\t// Flag to prevent scroll handler during programmatic scrolls\n\t\tconst isScrolling = ref(false);\n\n\t\t// Window start index for virtual scrolling - tracks which message index to start from\n\t\tconst windowStartIndex = ref(0);\n\n\t\t// Track if we're currently adjusting the window (to prevent scroll handler interference)\n\t\tconst isAdjustingWindow = ref(false);\n\n\t\t// Threshold for triggering window shifts (in pixels from edge)\n\t\tconst SCROLL_THRESHOLD = 200;\n\n\t\tlet unreadMarkerShown = false;\n\n\t\t// Build condensed message list (all messages, before windowing)\n\t\tconst allCondensedMessages = computed(() => {\n\t\t\tif (props.channel.type !== ChanType.CHANNEL && props.channel.type !== ChanType.QUERY) {\n\t\t\t\treturn props.channel.messages;\n\t\t\t}\n\n\t\t\tif (store.state.settings.statusMessages === \"hidden\") {\n\t\t\t\treturn props.channel.messages.filter(\n\t\t\t\t\t(message) => !condensedTypes.has(message.type || \"\")\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (store.state.settings.statusMessages !== \"condensed\") {\n\t\t\t\treturn props.channel.messages;\n\t\t\t}\n\n\t\t\tlet lastCondensedContainer: CondensedMessageContainer | null = null;\n\t\t\tconst condensed: (ClientMessage | CondensedMessageContainer)[] = [];\n\n\t\t\tfor (const message of props.channel.messages) {\n\t\t\t\tif (message.self || message.highlight || !condensedTypes.has(message.type || \"\")) {\n\t\t\t\t\tlastCondensedContainer = null;\n\t\t\t\t\tcondensed.push(message);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!lastCondensedContainer) {\n\t\t\t\t\tlastCondensedContainer = {\n\t\t\t\t\t\ttime: message.time,\n\t\t\t\t\t\ttype: \"condensed\",\n\t\t\t\t\t\tmessages: [],\n\t\t\t\t\t};\n\t\t\t\t\tcondensed.push(lastCondensedContainer);\n\t\t\t\t}\n\n\t\t\t\tlastCondensedContainer.messages.push(message);\n\t\t\t\tlastCondensedContainer.id = message.id;\n\n\t\t\t\tif (message.id === props.channel.firstUnread) {\n\t\t\t\t\tlastCondensedContainer = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn condensed.map((message) => {\n\t\t\t\tif (message.type === \"condensed\" && message.messages.length === 1) {\n\t\t\t\t\treturn message.messages[0];\n\t\t\t\t}\n\n\t\t\t\treturn message;\n\t\t\t});\n\t\t});\n\n\t\t// Windowed messages for rendering - show MAX_RENDERED_MESSAGES from windowStartIndex\n\t\t// This does NOT depend on scrolledToBottom to avoid reactivity issues\n\t\tconst displayedMessages = computed(() => {\n\t\t\tconst all = allCondensedMessages.value;\n\t\t\tconst total = all.length;\n\n\t\t\tif (total <= MAX_RENDERED_MESSAGES) {\n\t\t\t\treturn all;\n\t\t\t}\n\n\t\t\t// Use the window start index, clamped to valid range\n\t\t\tconst start = Math.max(\n\t\t\t\t0,\n\t\t\t\tMath.min(windowStartIndex.value, total - MAX_RENDERED_MESSAGES)\n\t\t\t);\n\t\t\treturn all.slice(start, start + MAX_RENDERED_MESSAGES);\n\t\t});\n\n\t\t// Check if we can scroll further back in the window (not at start of all messages)\n\t\tconst canScrollBack = computed(() => {\n\t\t\treturn windowStartIndex.value > 0;\n\t\t});\n\n\t\t// Check if we're showing the latest messages\n\t\tconst isAtEnd = computed(() => {\n\t\t\tconst total = allCondensedMessages.value.length;\n\t\t\treturn (\n\t\t\t\ttotal <= MAX_RENDERED_MESSAGES ||\n\t\t\t\twindowStartIndex.value >= total - MAX_RENDERED_MESSAGES\n\t\t\t);\n\t\t});\n\n\t\t// Should we show the \"load more\" button?\n\t\t// Only show when at the start of all loaded messages AND server has more\n\t\tconst showLoadMoreButton = computed(() => {\n\t\t\treturn props.channel.moreHistoryAvailable && windowStartIndex.value === 0;\n\t\t});\n\n\t\t// Helper to get a unique key for each message\n\t\tconst getMessageKey = (message: ClientMessage | CondensedMessageContainer) => {\n\t\t\tif (message.type === \"condensed\") {\n\t\t\t\treturn `condensed-${message.messages[0]?.id}-${new Date(message.time).getTime()}`;\n\t\t\t}\n\n\t\t\t// Use time as part of key since IDs can be inconsistent\n\t\t\treturn `${message.id}-${new Date(message.time).getTime()}`;\n\t\t};\n\n\t\t// Check if a message is focused (by ID first, then timestamp fallback)\n\t\tconst isMessageFocused = (message: ClientMessage | CondensedMessageContainer): boolean => {\n\t\t\t// Check by ID first (preferred)\n\t\t\tif (focusedMsgId.value !== null) {\n\t\t\t\tif (message.type === \"condensed\") {\n\t\t\t\t\treturn message.messages.some((inner) => inner.id === focusedMsgId.value);\n\t\t\t\t}\n\n\t\t\t\treturn message.id === focusedMsgId.value;\n\t\t\t}\n\n\t\t\t// Fallback to time-based matching\n\t\t\tif (!focusedMsgTime.value) return false;\n\n\t\t\tconst msgTime = new Date(message.time).getTime();\n\n\t\t\t// Allow 1 second tolerance\n\t\t\tif (Math.abs(msgTime - focusedMsgTime.value) < 1000) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Check inside condensed messages\n\t\t\tif (message.type === \"condensed\") {\n\t\t\t\tfor (const inner of message.messages) {\n\t\t\t\t\tconst innerTime = new Date(inner.time).getTime();\n\n\t\t\t\t\tif (Math.abs(innerTime - focusedMsgTime.value) < 1000) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\t// Scroll to bottom of the current DOM\n\t\tconst scrollToBottom = () => {\n\t\t\tif (chat.value) {\n\t\t\t\tisScrolling.value = true;\n\t\t\t\tchat.value.scrollTop = chat.value.scrollHeight;\n\n\t\t\t\t// Reset after a short delay to allow the scroll event to fire\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tisScrolling.value = false;\n\t\t\t\t}, 50);\n\t\t\t}\n\t\t};\n\n\t\t// Jump to the absolute bottom (latest messages) and mark as at bottom\n\t\tconst jumpToBottom = async () => {\n\t\t\tconst total = allCondensedMessages.value.length;\n\t\t\twindowStartIndex.value = Math.max(0, total - MAX_RENDERED_MESSAGES);\n\t\t\tprops.channel.scrolledToBottom = true;\n\t\t\tisAdjustingWindow.value = true;\n\t\t\tawait nextTick();\n\t\t\tscrollToBottom();\n\t\t\tisAdjustingWindow.value = false;\n\t\t};\n\n\t\t// Shift window up (show older messages) while preserving scroll position\n\t\tconst shiftWindowUp = async (amount: number = 100) => {\n\t\t\tif (isAdjustingWindow.value || windowStartIndex.value <= 0) return;\n\n\t\t\tconst el = chat.value;\n\t\t\tif (!el) return;\n\n\t\t\tisAdjustingWindow.value = true;\n\t\t\tconst oldScrollHeight = el.scrollHeight;\n\t\t\tconst oldScrollTop = el.scrollTop;\n\n\t\t\t// Shift window up\n\t\t\tconst newStart = Math.max(0, windowStartIndex.value - amount);\n\t\t\tconst actualShift = windowStartIndex.value - newStart;\n\n\t\t\tif (actualShift === 0) {\n\t\t\t\tisAdjustingWindow.value = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twindowStartIndex.value = newStart;\n\t\t\tprops.channel.scrolledToBottom = false;\n\n\t\t\tawait nextTick();\n\n\t\t\t// Restore scroll position relative to the content that was visible\n\t\t\tconst newScrollHeight = el.scrollHeight;\n\t\t\tconst heightDiff = newScrollHeight - oldScrollHeight;\n\t\t\tel.scrollTop = oldScrollTop + heightDiff;\n\n\t\t\tisAdjustingWindow.value = false;\n\t\t};\n\n\t\t// Shift window down (show newer messages) while preserving scroll position\n\t\tconst shiftWindowDown = async (amount: number = 100) => {\n\t\t\tif (isAdjustingWindow.value) return;\n\n\t\t\tconst total = allCondensedMessages.value.length;\n\t\t\tconst maxStart = Math.max(0, total - MAX_RENDERED_MESSAGES);\n\t\t\tif (windowStartIndex.value >= maxStart) return;\n\n\t\t\tconst el = chat.value;\n\t\t\tif (!el) return;\n\n\t\t\tisAdjustingWindow.value = true;\n\t\t\tconst oldScrollHeight = el.scrollHeight;\n\t\t\tconst oldScrollTop = el.scrollTop;\n\n\t\t\t// Shift window down\n\t\t\tconst newStart = Math.min(maxStart, windowStartIndex.value + amount);\n\t\t\twindowStartIndex.value = newStart;\n\n\t\t\t// Check if we're now at the end\n\t\t\tif (newStart >= maxStart) {\n\t\t\t\tprops.channel.scrolledToBottom = true;\n\t\t\t}\n\n\t\t\tawait nextTick();\n\n\t\t\t// Restore scroll position relative to the content that was visible\n\t\t\tconst newScrollHeight = el.scrollHeight;\n\t\t\tconst heightDiff = oldScrollHeight - newScrollHeight;\n\t\t\tel.scrollTop = oldScrollTop - heightDiff;\n\n\t\t\tisAdjustingWindow.value = false;\n\t\t};\n\n\t\t// Find and scroll to a message by ID\n\t\tconst jumpToMessage = async (msgId: number, fallbackTime?: number): Promise<boolean> => {\n\t\t\tfocusedMsgId.value = msgId;\n\t\t\tfocusedMsgTime.value = fallbackTime || null;\n\t\t\tprops.channel.scrolledToBottom = false;\n\t\t\tisAdjustingWindow.value = true;\n\n\t\t\t// Find the message index in all messages\n\t\t\tconst all = allCondensedMessages.value;\n\t\t\tlet targetIndex = -1;\n\n\t\t\tfor (let i = 0; i < all.length; i++) {\n\t\t\t\tconst msg = all[i];\n\n\t\t\t\tif (msg.type === \"condensed\") {\n\t\t\t\t\tif (msg.messages.some((inner) => inner.id === msgId)) {\n\t\t\t\t\t\ttargetIndex = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else if (msg.id === msgId) {\n\t\t\t\t\ttargetIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If not found by ID and we have a fallback time, try time-based search\n\t\t\tif (targetIndex === -1 && fallbackTime) {\n\t\t\t\tfor (let i = 0; i < all.length; i++) {\n\t\t\t\t\tconst msg = all[i];\n\t\t\t\t\tconst msgTime = new Date(msg.time).getTime();\n\n\t\t\t\t\tif (Math.abs(msgTime - fallbackTime) < 1000) {\n\t\t\t\t\t\ttargetIndex = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (msg.type === \"condensed\") {\n\t\t\t\t\t\tfor (const inner of msg.messages) {\n\t\t\t\t\t\t\tconst innerTime = new Date(inner.time).getTime();\n\n\t\t\t\t\t\t\tif (Math.abs(innerTime - fallbackTime) < 1000) {\n\t\t\t\t\t\t\t\ttargetIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (targetIndex !== -1) break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (targetIndex === -1) {\n\t\t\t\t// Message not found in current messages\n\t\t\t\tisAdjustingWindow.value = false;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Adjust window to include the target message (center it if possible)\n\t\t\tif (all.length > MAX_RENDERED_MESSAGES) {\n\t\t\t\tconst halfWindow = Math.floor(MAX_RENDERED_MESSAGES / 2);\n\t\t\t\twindowStartIndex.value = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.min(targetIndex - halfWindow, all.length - MAX_RENDERED_MESSAGES)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait nextTick();\n\n\t\t\t// Find and scroll to the element\n\t\t\tif (chat.value) {\n\t\t\t\tconst el = chat.value.querySelector(`#msg-${msgId}`) as HTMLElement;\n\n\t\t\t\tif (el) {\n\t\t\t\t\tisScrolling.value = true;\n\t\t\t\t\tel.scrollIntoView({behavior: \"instant\", block: \"center\"});\n\n\t\t\t\t\t// BUGBUG: prevent the chat window offset bugging when scrolling to items near the bottom of the chat\n\t\t\t\t\tconst container = chat.value.closest(\"#chat-container\");\n\t\t\t\t\tif (container) container.scrollTop = 0;\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tisScrolling.value = false;\n\t\t\t\t\t\tisAdjustingWindow.value = false;\n\t\t\t\t\t}, 50);\n\n\t\t\t\t\t// Clear highlight after a few seconds\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tfocusedMsgId.value = null;\n\t\t\t\t\t\tfocusedMsgTime.value = null;\n\t\t\t\t\t}, 3000);\n\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tisAdjustingWindow.value = false;\n\t\t\treturn false;\n\t\t};\n\n\t\t// Find and scroll to a message by timestamp (legacy fallback)\n\t\tconst jumpToMessageByTime = async (timestamp: number): Promise<boolean> => {\n\t\t\tfocusedMsgTime.value = timestamp;\n\t\t\tprops.channel.scrolledToBottom = false;\n\t\t\tisAdjustingWindow.value = true;\n\n\t\t\t// Find the message index in all messages by time\n\t\t\tconst all = allCondensedMessages.value;\n\t\t\tlet targetIndex = -1;\n\n\t\t\tfor (let i = 0; i < all.length; i++) {\n\t\t\t\tconst msg = all[i];\n\t\t\t\tconst msgTime = new Date(msg.time).getTime();\n\n\t\t\t\tif (Math.abs(msgTime - timestamp) < 1000) {\n\t\t\t\t\ttargetIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (msg.type === \"condensed\") {\n\t\t\t\t\tfor (const inner of msg.messages) {\n\t\t\t\t\t\tconst innerTime = new Date(inner.time).getTime();\n\n\t\t\t\t\t\tif (Math.abs(innerTime - timestamp) < 1000) {\n\t\t\t\t\t\t\ttargetIndex = i;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (targetIndex !== -1) break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (targetIndex === -1) {\n\t\t\t\tisAdjustingWindow.value = false;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Adjust window to include the target message\n\t\t\tif (all.length > MAX_RENDERED_MESSAGES) {\n\t\t\t\tconst halfWindow = Math.floor(MAX_RENDERED_MESSAGES / 2);\n\t\t\t\twindowStartIndex.value = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.min(targetIndex - halfWindow, all.length - MAX_RENDERED_MESSAGES)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait nextTick();\n\n\t\t\t// Find and scroll to the element\n\t\t\tif (chat.value) {\n\t\t\t\tconst messages = chat.value.querySelectorAll(\".msg[id^='msg-']\");\n\n\t\t\t\tfor (const el of messages) {\n\t\t\t\t\tconst msgId = el.id.replace(\"msg-\", \"\");\n\t\t\t\t\tconst msg = displayedMessages.value.find((m) => {\n\t\t\t\t\t\tif (m.type === \"condensed\") {\n\t\t\t\t\t\t\treturn m.messages.some((inner) => String(inner.id) === msgId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn String(m.id) === msgId;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (msg) {\n\t\t\t\t\t\tconst msgTime = new Date(msg.time).getTime();\n\n\t\t\t\t\t\tif (Math.abs(msgTime - timestamp) < 1000) {\n\t\t\t\t\t\t\tisScrolling.value = true;\n\t\t\t\t\t\t\tel.scrollIntoView({behavior: \"instant\", block: \"center\"});\n\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\tisScrolling.value = false;\n\t\t\t\t\t\t\t\tisAdjustingWindow.value = false;\n\t\t\t\t\t\t\t}, 50);\n\n\t\t\t\t\t\t\t// Clear highlight after a few seconds\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\tfocusedMsgTime.value = null;\n\t\t\t\t\t\t\t}, 3000);\n\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tisAdjustingWindow.value = false;\n\t\t\treturn false;\n\t\t};\n\n\t\t// Handle scroll events - triggers window shifting when near edges\n\t\tconst handleScroll = () => {\n\t\t\t// Skip if we're doing a programmatic scroll or adjusting the window\n\t\t\tif (isScrolling.value || isAdjustingWindow.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst el = chat.value;\n\t\t\tif (!el) return;\n\n\t\t\tconst scrollTop = el.scrollTop;\n\t\t\tconst scrollHeight = el.scrollHeight;\n\t\t\tconst clientHeight = el.clientHeight;\n\t\t\tconst distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n\t\t\tconst distanceFromTop = scrollTop;\n\n\t\t\t// Update scrolledToBottom state - only when actually at the DOM bottom AND at end of messages\n\t\t\tconst atDOMBottom = distanceFromBottom <= 30;\n\n\t\t\tif (atDOMBottom && isAtEnd.value) {\n\t\t\t\tif (!props.channel.scrolledToBottom) {\n\t\t\t\t\tprops.channel.scrolledToBottom = true;\n\t\t\t\t}\n\t\t\t} else if (props.channel.scrolledToBottom && distanceFromBottom > 100) {\n\t\t\t\t// Only unset if user scrolled significantly away from bottom\n\t\t\t\tprops.channel.scrolledToBottom = false;\n\t\t\t}\n\n\t\t\t// Dynamic window shifting - shift when user scrolls near edges\n\t\t\t// Shift up (load older) when near top and there are more messages above\n\t\t\tif (distanceFromTop < SCROLL_THRESHOLD && canScrollBack.value) {\n\t\t\t\tvoid shiftWindowUp(50);\n\t\t\t}\n\t\t\t// Shift down (load newer) when near bottom but not at end\n\t\t\telse if (distanceFromBottom < SCROLL_THRESHOLD && !isAtEnd.value) {\n\t\t\t\tvoid shiftWindowDown(50);\n\t\t\t}\n\t\t};\n\n\t\t// Load more from server\n\t\tconst onShowMoreClick = () => {\n\t\t\tif (!store.state.isConnected) return;\n\n\t\t\tlet lastMessage = -1;\n\n\t\t\tfor (const message of props.channel.messages) {\n\t\t\t\tif (!message.showInActive) {\n\t\t\t\t\tlastMessage = message.id;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprops.channel.historyLoading = true;\n\t\t\tsocket.emit(\"more\", {\n\t\t\t\ttarget: props.channel.id,\n\t\t\t\tlastId: lastMessage,\n\t\t\t\tcondensed: store.state.settings.statusMessages !== \"shown\",\n\t\t\t});\n\t\t};\n\n\t\tconst shouldDisplayDateMarker = (\n\t\t\tmessage: SharedMsg | CondensedMessageContainer,\n\t\t\tidx: number\n\t\t) => {\n\t\t\tconst previousMessage = displayedMessages.value[idx - 1];\n\n\t\t\tif (!previousMessage) return true;\n\n\t\t\tconst oldDate = new Date(previousMessage.time);\n\t\t\tconst newDate = new Date(message.time);\n\n\t\t\treturn (\n\t\t\t\toldDate.getDate() !== newDate.getDate() ||\n\t\t\t\toldDate.getMonth() !== newDate.getMonth() ||\n\t\t\t\toldDate.getFullYear() !== newDate.getFullYear()\n\t\t\t);\n\t\t};\n\n\t\tconst shouldDisplayUnreadMarker = (id: number) => {\n\t\t\tif (!unreadMarkerShown && id > props.channel.firstUnread) {\n\t\t\t\tunreadMarkerShown = true;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\tconst isPreviousSource = (currentMessage: ClientMessage, idx: number) => {\n\t\t\tconst previousMessage = displayedMessages.value[idx - 1];\n\t\t\treturn (\n\t\t\t\tpreviousMessage &&\n\t\t\t\tcurrentMessage.type === MessageType.MESSAGE &&\n\t\t\t\tpreviousMessage.type === MessageType.MESSAGE &&\n\t\t\t\tcurrentMessage.from &&\n\t\t\t\tpreviousMessage.from &&\n\t\t\t\tcurrentMessage.from.nick === previousMessage.from.nick\n\t\t\t);\n\t\t};\n\n\t\tconst onCopy = () => {\n\t\t\tif (chat.value) {\n\t\t\t\tclipboard(chat.value);\n\t\t\t}\n\t\t};\n\n\t\tconst keepScrollPosition = async () => {\n\t\t\tif (props.channel.scrolledToBottom) {\n\t\t\t\tawait jumpToBottom();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst el = chat.value;\n\t\t\tif (!el) return;\n\n\t\t\t// Maintain relative scroll position\n\t\t\tisAdjustingWindow.value = true;\n\t\t\tconst scrollBottom = el.scrollHeight - el.scrollTop;\n\t\t\tawait nextTick();\n\t\t\tisScrolling.value = true;\n\t\t\tel.scrollTop = el.scrollHeight - scrollBottom;\n\t\t\tsetTimeout(() => {\n\t\t\t\tisScrolling.value = false;\n\t\t\t\tisAdjustingWindow.value = false;\n\t\t\t}, 50);\n\t\t};\n\n\t\tconst onLinkPreviewToggle = async (preview: ClientLinkPreview, message: ClientMessage) => {\n\t\t\tawait keepScrollPosition();\n\t\t\tsocket.emit(\"msg:preview:toggle\", {\n\t\t\t\ttarget: props.channel.id,\n\t\t\t\tmsgId: message.id,\n\t\t\t\tlink: preview.link,\n\t\t\t\tshown: preview.shown,\n\t\t\t});\n\t\t};\n\n\t\tconst handleResize = () => {\n\t\t\tif (props.channel.scrolledToBottom) {\n\t\t\t\tvoid jumpToBottom();\n\t\t\t}\n\t\t};\n\n\t\t// Initialize\n\t\tonMounted(async () => {\n\t\t\tchat.value?.addEventListener(\"scroll\", handleScroll, {passive: true});\n\t\t\teventbus.on(\"resize\", handleResize);\n\n\t\t\t// Handle initial focus from search - try ID first, then time fallback\n\t\t\tif (props.isFocused && !isNaN(props.isFocused)) {\n\t\t\t\tawait nextTick();\n\t\t\t\tawait jumpToMessage(props.isFocused, props.focusedTime);\n\t\t\t} else if (props.focusedTime && !isNaN(props.focusedTime)) {\n\t\t\t\tawait nextTick();\n\t\t\t\tawait jumpToMessageByTime(props.focusedTime);\n\t\t\t} else {\n\t\t\t\t// Default: scroll to bottom\n\t\t\t\tprops.channel.scrolledToBottom = true;\n\t\t\t\twindowStartIndex.value = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tallCondensedMessages.value.length - MAX_RENDERED_MESSAGES\n\t\t\t\t);\n\t\t\t\tawait nextTick();\n\t\t\t\tscrollToBottom();\n\t\t\t}\n\n\t\t\t// Set up intersection observer for auto-loading history\n\t\t\tawait nextTick();\n\n\t\t\tif (window.IntersectionObserver && loadMoreButton.value) {\n\t\t\t\thistoryObserver.value = new IntersectionObserver(\n\t\t\t\t\t(entries) => {\n\t\t\t\t\t\tentries.forEach((entry) => {\n\t\t\t\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\t\t\t\tonShowMoreClick();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\t{root: chat.value}\n\t\t\t\t);\n\t\t\t\thistoryObserver.value.observe(loadMoreButton.value);\n\t\t\t}\n\t\t});\n\n\t\t// Channel switch - scroll to bottom and reset window\n\t\twatch(\n\t\t\t() => props.channel.id,\n\t\t\tasync () => {\n\t\t\t\tprops.channel.scrolledToBottom = true;\n\t\t\t\tfocusedMsgId.value = null;\n\t\t\t\tfocusedMsgTime.value = null;\n\t\t\t\twindowStartIndex.value = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tallCondensedMessages.value.length - MAX_RENDERED_MESSAGES\n\t\t\t\t);\n\t\t\t\tawait nextTick();\n\t\t\t\tscrollToBottom();\n\n\t\t\t\tif (historyObserver.value && loadMoreButton.value) {\n\t\t\t\t\thistoryObserver.value.unobserve(loadMoreButton.value);\n\t\t\t\t\thistoryObserver.value.observe(loadMoreButton.value);\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\t// Track the first message ID to detect when history is loaded\n\t\tconst firstMessageId = computed(() => {\n\t\t\tconst msgs = props.channel.messages;\n\t\t\treturn msgs.length > 0 ? msgs[0].id : null;\n\t\t});\n\n\t\t// When history is loaded (messages prepended), adjust window to maintain position\n\t\twatch(firstMessageId, async (newFirstId, oldFirstId) => {\n\t\t\tif (oldFirstId === null || newFirstId === null) return;\n\t\t\tif (newFirstId === oldFirstId) return;\n\n\t\t\t// History was loaded - messages were prepended\n\t\t\t// Adjust windowStartIndex to keep the same messages visible\n\t\t\tconst el = chat.value;\n\t\t\tif (!el) return;\n\n\t\t\tisAdjustingWindow.value = true;\n\t\t\tconst oldScrollTop = el.scrollTop;\n\t\t\tconst oldScrollHeight = el.scrollHeight;\n\n\t\t\t// The window start needs to shift by the number of new messages\n\t\t\t// to keep viewing the same content\n\t\t\tconst total = allCondensedMessages.value.length;\n\t\t\tconst maxStart = Math.max(0, total - MAX_RENDERED_MESSAGES);\n\n\t\t\t// If we were viewing the oldest loaded messages, keep the window at 0\n\t\t\t// so the user can see the newly loaded history\n\t\t\tif (windowStartIndex.value === 0) {\n\t\t\t\t// Don't shift - let user see new history\n\t\t\t} else {\n\t\t\t\t// Shift the window to compensate for new messages\n\t\t\t\twindowStartIndex.value = Math.min(maxStart, windowStartIndex.value);\n\t\t\t}\n\n\t\t\tawait nextTick();\n\n\t\t\t// Restore scroll position\n\t\t\tconst newScrollHeight = el.scrollHeight;\n\t\t\tconst heightDiff = newScrollHeight - oldScrollHeight;\n\t\t\tisScrolling.value = true;\n\t\t\tel.scrollTop = oldScrollTop + heightDiff;\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tisScrolling.value = false;\n\t\t\t\tisAdjustingWindow.value = false;\n\t\t\t}, 50);\n\t\t});\n\n\t\t// New messages at the end - stay at bottom if we were at bottom\n\t\twatch(\n\t\t\t() => props.channel.messages.length,\n\t\t\tasync (newLen, oldLen) => {\n\t\t\t\tif (props.channel.scrolledToBottom) {\n\t\t\t\t\t// Keep window at the end when new messages come in\n\t\t\t\t\tconst total = allCondensedMessages.value.length;\n\t\t\t\t\twindowStartIndex.value = Math.max(0, total - MAX_RENDERED_MESSAGES);\n\t\t\t\t\tawait nextTick();\n\t\t\t\t\tscrollToBottom();\n\t\t\t\t} else if (oldLen !== undefined && newLen > oldLen) {\n\t\t\t\t\t// Messages were added (likely at the end) but we're not at bottom\n\t\t\t\t\t// Don't change window or scroll - user is reading history\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\t// Handle focused message ID (from search results - primary)\n\t\twatch(\n\t\t\t() => props.isFocused,\n\t\t\tasync (focused) => {\n\t\t\t\tif (!focused || isNaN(focused)) return;\n\t\t\t\tawait nextTick();\n\t\t\t\tawait jumpToMessage(focused, props.focusedTime);\n\t\t\t}\n\t\t);\n\n\t\t// Handle focused time (from search results - fallback for old messages)\n\t\twatch(\n\t\t\t() => props.focusedTime,\n\t\t\tasync (focusedTime) => {\n\t\t\t\t// Only use time if no ID was provided\n\t\t\t\tif (props.isFocused && !isNaN(props.isFocused)) return;\n\t\t\t\tif (!focusedTime || isNaN(focusedTime)) return;\n\t\t\t\tawait nextTick();\n\t\t\t\tawait jumpToMessageByTime(focusedTime);\n\t\t\t}\n\t\t);\n\n\t\tonBeforeUpdate(() => {\n\t\t\tunreadMarkerShown = false;\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\teventbus.off(\"resize\", handleResize);\n\t\t\tchat.value?.removeEventListener(\"scroll\", handleScroll);\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\thistoryObserver.value?.disconnect();\n\t\t});\n\n\t\treturn {\n\t\t\tchat,\n\t\t\tstore,\n\t\t\tloadMoreButton,\n\t\t\tdisplayedMessages,\n\t\t\tshowLoadMoreButton,\n\t\t\tgetMessageKey,\n\t\t\tisMessageFocused,\n\t\t\tonShowMoreClick,\n\t\t\tonCopy,\n\t\t\tshouldDisplayDateMarker,\n\t\t\tshouldDisplayUnreadMarker,\n\t\t\tkeepScrollPosition,\n\t\t\tisPreviousSource,\n\t\t\tjumpToBottom,\n\t\t\tonLinkPreviewToggle,\n\t\t};\n\t},\n});\n</script>\n","const matchFormatting =\n\t/\\x02|\\x1D|\\x1F|\\x16|\\x0F|\\x11|\\x1E|\\x03(?:[0-9]{1,2}(?:,[0-9]{1,2})?)?|\\x04(?:[0-9a-f]{6}(?:,[0-9a-f]{6})?)?/gi;\n\nexport function cleanIrcMessage(message: string) {\n\treturn message.replace(matchFormatting, \"\").trim();\n}\n\nexport const condensedTypes = new Set([\n\t\"away\",\n\t\"back\",\n\t\"chghost\",\n\t\"join\",\n\t\"kick\",\n\t\"mass_event\",\n\t\"mode\",\n\t\"nick\",\n\t\"part\",\n\t\"quit\",\n]);\n","export default function (chat: HTMLDivElement) {\n\t// Disable in Firefox as it already copies flex text correctly\n\t// Check if InstallTrigger exists as a property on window (Firefox-specific)\n\tif (\"InstallTrigger\" in window) {\n\t\treturn;\n\t}\n\n\tconst selection = window.getSelection();\n\n\tif (!selection) {\n\t\treturn;\n\t}\n\n\t// If selection does not span multiple elements, do nothing\n\tif (selection.anchorNode === selection.focusNode) {\n\t\treturn;\n\t}\n\n\tconst range = selection.getRangeAt(0);\n\tconst documentFragment = range.cloneContents();\n\tconst div = document.createElement(\"div\");\n\n\tdiv.id = \"js-copy-hack\";\n\tdiv.appendChild(documentFragment);\n\tchat.appendChild(div);\n\n\tselection.selectAllChildren(div);\n\n\twindow.setTimeout(() => {\n\t\tchat.removeChild(div);\n\t\tselection.removeAllRanges();\n\t\tselection.addRange(range);\n\t}, 0);\n}\n","<template>\n\t<div :class=\"['msg', {closed: isCollapsed, 'is-focused': isFocused}]\" data-type=\"condensed\">\n\t\t<div class=\"condensed-summary\">\n\t\t\t<span class=\"time\" />\n\t\t\t<span class=\"from\" />\n\t\t\t<span class=\"content\" @click=\"onCollapseClick\"\n\t\t\t\t>{{ condensedText }}\n\n\t\t\t\t<button class=\"toggle-button\" aria-label=\"Toggle status messages\"\n\t\t\t/></span>\n\t\t</div>\n\t\t<Message\n\t\t\tv-for=\"message in messages\"\n\t\t\t:key=\"message.id\"\n\t\t\t:network=\"network\"\n\t\t\t:message=\"message\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, PropType, ref} from \"vue\";\nimport {condensedTypes} from \"../../shared/irc\";\nimport {MessageType} from \"../../shared/types/msg\";\nimport {ClientMessage, ClientNetwork} from \"../js/types\";\nimport Message from \"./Message.vue\";\n\nexport default defineComponent({\n\tname: \"MessageCondensed\",\n\tcomponents: {\n\t\tMessage,\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tmessages: {\n\t\t\ttype: Array as PropType<ClientMessage[]>,\n\t\t\trequired: true,\n\t\t},\n\t\tkeepScrollPosition: {\n\t\t\ttype: Function as PropType<() => void>,\n\t\t\trequired: true,\n\t\t},\n\t\tisFocused: Boolean,\n\t},\n\tsetup(props) {\n\t\tconst isCollapsed = ref(true);\n\n\t\tconst onCollapseClick = () => {\n\t\t\tisCollapsed.value = !isCollapsed.value;\n\t\t\tprops.keepScrollPosition();\n\t\t};\n\n\t\tconst condensedText = computed(() => {\n\t\t\tconst obj: Record<string, number> = {};\n\n\t\t\tcondensedTypes.forEach((type) => {\n\t\t\t\tobj[type] = 0;\n\t\t\t});\n\n\t\t\tfor (const message of props.messages) {\n\t\t\t\t// special case since one MODE message can change multiple modes\n\t\t\t\tif (message.type === MessageType.MODE) {\n\t\t\t\t\t// syntax: +vv-t maybe-some targets\n\t\t\t\t\t// we want the number of mode changes in the message, so count the\n\t\t\t\t\t// number of chars other than + and - before the first space\n\t\t\t\t\tconst text = message.text ? message.text : \"\";\n\t\t\t\t\tconst modeChangesCount = text\n\t\t\t\t\t\t.split(\" \")[0]\n\t\t\t\t\t\t.split(\"\")\n\t\t\t\t\t\t.filter((char) => char !== \"+\" && char !== \"-\").length;\n\t\t\t\t\tobj[message.type] += modeChangesCount;\n\t\t\t\t}\n\n\t\t\t\t// special case since one MASS_EVENT message can have multiple effects\n\t\t\t\telse if (message.type === MessageType.MASS_EVENT) {\n\t\t\t\t\t// Add mass joins/parts/modes/etc to counts\n\t\t\t\t\tconst summary = message.massEventSummary!;\n\t\t\t\t\tObject.keys(summary).forEach((group) => {\n\t\t\t\t\t\tif (group === \"startTime\" || group === \"endTime\" || group === \"duration\")\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\tif (group === \"away\" || group === \"back\") {\n\t\t\t\t\t\t\treturn (obj[group] += summary[group]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tobj[group.slice(0, -1)] += summary[group];\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tif (!message.type) {\n\t\t\t\t\t\t/* eslint-disable no-console */\n\t\t\t\t\t\tconsole.log(`empty message type, this should not happen: ${message.id}`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tobj[message.type]++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Count quits as parts in condensed messages to reduce information density\n\t\t\tobj.part += obj.quit;\n\n\t\t\tconst strings: string[] = [];\n\t\t\tcondensedTypes.forEach((type) => {\n\t\t\t\tif (obj[type]) {\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\tcase \"chghost\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tString(obj[type]) +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1\n\t\t\t\t\t\t\t\t\t\t? \" users have changed hostname\"\n\t\t\t\t\t\t\t\t\t\t: \" user has changed hostname\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"join\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tString(obj[type]) +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1 ? \" users have joined\" : \" user has joined\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"part\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tString(obj[type]) +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1 ? \" users have left\" : \" user has left\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"nick\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tString(obj[type]) +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1\n\t\t\t\t\t\t\t\t\t\t? \" users have changed nick\"\n\t\t\t\t\t\t\t\t\t\t: \" user has changed nick\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"kick\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tString(obj[type]) +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1 ? \" users were kicked\" : \" user was kicked\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"mode\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tString(obj[type]) +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1 ? \" modes were set\" : \" mode was set\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"away\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\t\"marked away \" +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1 ? String(obj[type]) + \" times\" : \"once\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"back\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\t\"marked back \" +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1 ? String(obj[type]) + \" times\" : \"once\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (strings.length) {\n\t\t\t\tlet text = strings.pop();\n\n\t\t\t\tif (strings.length) {\n\t\t\t\t\ttext = strings.join(\", \") + \", and \" + text!;\n\t\t\t\t}\n\n\t\t\t\treturn text;\n\t\t\t}\n\n\t\t\treturn \"\";\n\t\t});\n\n\t\treturn {\n\t\t\tisCollapsed,\n\t\t\tcondensedText,\n\t\t\tonCollapseClick,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./MessageCondensed.vue?vue&type=template&id=13928d8e&ts=true\"\nimport script from \"./MessageCondensed.vue?vue&type=script&lang=ts\"\nexport * from \"./MessageCondensed.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./MessageList.vue?vue&type=template&id=597e43ca&ts=true\"\nimport script from \"./MessageList.vue?vue&type=script&lang=ts\"\nexport * from \"./MessageList.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div ref=\"chat\" class=\"chat\" tabindex=\"-1\">\n\t\t<div v-show=\"channel.moreHistoryAvailable\" class=\"show-more\">\n\t\t\t<button\n\t\t\t\tref=\"loadMoreButton\"\n\t\t\t\t:disabled=\"channel.historyLoading || !store.state.isConnected\"\n\t\t\t\tclass=\"btn\"\n\t\t\t\t@click=\"onShowMoreClick\"\n\t\t\t>\n\t\t\t\t<span v-if=\"channel.historyLoading\">Loading…</span>\n\t\t\t\t<span v-else>Show older messages</span>\n\t\t\t</button>\n\t\t</div>\n\t\t<div\n\t\t\tclass=\"messages\"\n\t\t\trole=\"log\"\n\t\t\taria-live=\"polite\"\n\t\t\taria-relevant=\"additions\"\n\t\t\t@copy=\"onCopy\"\n\t\t>\n\t\t\t<template v-for=\"(message, id) in condensedMessages\">\n\t\t\t\t<DateMarker\n\t\t\t\t\tv-if=\"shouldDisplayDateMarker(message, id)\"\n\t\t\t\t\t:key=\"message.id + '-date'\"\n\t\t\t\t\t:message=\"message as any\"\n\t\t\t\t\t:focused=\"message.id === focused\"\n\t\t\t\t/>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"shouldDisplayUnreadMarker(Number(message.id))\"\n\t\t\t\t\t:key=\"message.id + '-unread'\"\n\t\t\t\t\tclass=\"unread-marker\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"unread-marker-text\" />\n\t\t\t\t</div>\n\n\t\t\t\t<MessageCondensed\n\t\t\t\t\tv-if=\"message.type === 'condensed'\"\n\t\t\t\t\t:key=\"message.messages[0].id\"\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:keep-scroll-position=\"keepScrollPosition\"\n\t\t\t\t\t:messages=\"message.messages\"\n\t\t\t\t\t:focused=\"message.id === focused\"\n\t\t\t\t/>\n\t\t\t\t<Message\n\t\t\t\t\tv-else\n\t\t\t\t\t:key=\"message.id\"\n\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:message=\"message\"\n\t\t\t\t\t:keep-scroll-position=\"keepScrollPosition\"\n\t\t\t\t\t:is-previous-source=\"isPreviousSource(message, id)\"\n\t\t\t\t\t:focused=\"message.id === focused\"\n\t\t\t\t\t@toggle-link-preview=\"onLinkPreviewToggle\"\n\t\t\t\t/>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {condensedTypes} from \"../../shared/irc\";\nimport {ChanType} from \"../../shared/types/chan\";\nimport {MessageType, SharedMsg} from \"../../shared/types/msg\";\n\nimport eventbus from \"../js/eventbus\";\nimport clipboard from \"../js/clipboard\";\nimport socket from \"../js/socket\";\nimport Message from \"./Message.vue\";\nimport MessageCondensed from \"./MessageCondensed.vue\";\nimport DateMarker from \"./DateMarker.vue\";\nimport {\n\tcomputed,\n\tdefineComponent,\n\tnextTick,\n\tonBeforeUnmount,\n\tonBeforeUpdate,\n\tonMounted,\n\tonUnmounted,\n\tPropType,\n\tref,\n\twatch,\n} from \"vue\";\nimport {useStore} from \"../js/store\";\nimport {ClientChan, ClientMessage, ClientNetwork, ClientLinkPreview} from \"../js/types\";\n\ntype CondensedMessageContainer = {\n\ttype: \"condensed\";\n\ttime: Date;\n\tmessages: ClientMessage[];\n\tid?: number;\n};\n\nexport default defineComponent({\n\tname: \"MessageListBasic\",\n\tcomponents: {\n\t\tMessage,\n\t\tMessageCondensed,\n\t\tDateMarker,\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t\tfocused: Number,\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\n\t\tconst chat = ref<HTMLDivElement | null>(null);\n\t\tconst loadMoreButton = ref<HTMLButtonElement | null>(null);\n\t\tconst historyObserver = ref<IntersectionObserver | null>(null);\n\t\tconst skipNextScrollEvent = ref(false);\n\t\tconst isWaitingForNextTick = ref(false);\n\n\t\tlet unreadMarkerShown = false;\n\n\t\tconst jumpToBottom = () => {\n\t\t\tskipNextScrollEvent.value = true;\n\t\t\tprops.channel.scrolledToBottom = true;\n\n\t\t\tconst el = chat.value;\n\n\t\t\tif (el) {\n\t\t\t\tel.scrollTop = el.scrollHeight;\n\t\t\t}\n\t\t};\n\n\t\tconst onShowMoreClick = () => {\n\t\t\tif (!store.state.isConnected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet lastMessage = -1;\n\n\t\t\t// Find the id of first message that isn't showInActive\n\t\t\t// If showInActive is set, this message is actually in another channel\n\t\t\tfor (const message of props.channel.messages) {\n\t\t\t\tif (!message.showInActive) {\n\t\t\t\t\tlastMessage = message.id;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprops.channel.historyLoading = true;\n\n\t\t\tsocket.emit(\"more\", {\n\t\t\t\ttarget: props.channel.id,\n\t\t\t\tlastId: lastMessage,\n\t\t\t\tcondensed: store.state.settings.statusMessages !== \"shown\",\n\t\t\t});\n\t\t};\n\n\t\tconst onLoadButtonObserved = (entries: IntersectionObserverEntry[]) => {\n\t\t\tentries.forEach((entry) => {\n\t\t\t\tif (!entry.isIntersecting) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tonShowMoreClick();\n\t\t\t});\n\t\t};\n\n\t\tnextTick(() => {\n\t\t\tif (!chat.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (window.IntersectionObserver) {\n\t\t\t\thistoryObserver.value = new window.IntersectionObserver(onLoadButtonObserved, {\n\t\t\t\t\troot: chat.value,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tjumpToBottom();\n\t\t}).catch((e) => {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(\"Error in new IntersectionObserver\", e);\n\t\t});\n\n\t\tconst condensedMessages = computed(() => {\n\t\t\tif (props.channel.type !== ChanType.CHANNEL && props.channel.type !== ChanType.QUERY) {\n\t\t\t\treturn props.channel.messages;\n\t\t\t}\n\n\t\t\t// If actions are hidden, just return a message list with them excluded\n\t\t\tif (store.state.settings.statusMessages === \"hidden\") {\n\t\t\t\treturn props.channel.messages.filter(\n\t\t\t\t\t(message) => !condensedTypes.has(message.type || \"\")\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// If actions are not condensed, just return raw message list\n\t\t\tif (store.state.settings.statusMessages !== \"condensed\") {\n\t\t\t\treturn props.channel.messages;\n\t\t\t}\n\n\t\t\tlet lastCondensedContainer: CondensedMessageContainer | null = null;\n\n\t\t\tconst condensed: (ClientMessage | CondensedMessageContainer)[] = [];\n\n\t\t\tfor (const message of props.channel.messages) {\n\t\t\t\t// If this message is not condensable, or its an action affecting our user,\n\t\t\t\t// then just append the message to container and be done with it\n\t\t\t\tif (message.self || message.highlight || !condensedTypes.has(message.type || \"\")) {\n\t\t\t\t\tlastCondensedContainer = null;\n\n\t\t\t\t\tcondensed.push(message);\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!lastCondensedContainer) {\n\t\t\t\t\tlastCondensedContainer = {\n\t\t\t\t\t\ttime: message.time,\n\t\t\t\t\t\ttype: \"condensed\",\n\t\t\t\t\t\tmessages: [],\n\t\t\t\t\t};\n\n\t\t\t\t\tcondensed.push(lastCondensedContainer);\n\t\t\t\t}\n\n\t\t\t\tlastCondensedContainer.messages.push(message);\n\n\t\t\t\t// Set id of the condensed container to last message id,\n\t\t\t\t// which is required for the unread marker to work correctly\n\t\t\t\tlastCondensedContainer.id = message.id;\n\n\t\t\t\t// If this message is the unread boundary, create a split condensed container\n\t\t\t\tif (message.id === props.channel.firstUnread) {\n\t\t\t\t\tlastCondensedContainer = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn condensed.map((message) => {\n\t\t\t\t// Skip condensing single messages, it doesn't save any\n\t\t\t\t// space but makes useful information harder to see\n\t\t\t\tif (message.type === \"condensed\" && message.messages.length === 1) {\n\t\t\t\t\treturn message.messages[0];\n\t\t\t\t}\n\n\t\t\t\treturn message;\n\t\t\t});\n\t\t});\n\n\t\tconst shouldDisplayDateMarker = (\n\t\t\tmessage: SharedMsg | CondensedMessageContainer,\n\t\t\tid: number\n\t\t) => {\n\t\t\tconst previousMessage = condensedMessages.value[id - 1];\n\n\t\t\tif (!previousMessage) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst oldDate = new Date(previousMessage.time);\n\t\t\tconst newDate = new Date(message.time);\n\n\t\t\treturn (\n\t\t\t\toldDate.getDate() !== newDate.getDate() ||\n\t\t\t\toldDate.getMonth() !== newDate.getMonth() ||\n\t\t\t\toldDate.getFullYear() !== newDate.getFullYear()\n\t\t\t);\n\t\t};\n\n\t\tconst shouldDisplayUnreadMarker = (id: number) => {\n\t\t\tif (!unreadMarkerShown && id > props.channel.firstUnread) {\n\t\t\t\tunreadMarkerShown = true;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\tconst isPreviousSource = (currentMessage: ClientMessage, id: number) => {\n\t\t\tconst previousMessage = condensedMessages.value[id - 1];\n\n\t\t\treturn (\n\t\t\t\tpreviousMessage &&\n\t\t\t\tcurrentMessage.type === MessageType.MESSAGE &&\n\t\t\t\tpreviousMessage.type === MessageType.MESSAGE &&\n\t\t\t\tcurrentMessage.from &&\n\t\t\t\tpreviousMessage.from &&\n\t\t\t\tcurrentMessage.from.nick === previousMessage.from.nick\n\t\t\t);\n\t\t};\n\n\t\tconst onCopy = () => {\n\t\t\tif (chat.value) {\n\t\t\t\tclipboard(chat.value);\n\t\t\t}\n\t\t};\n\n\t\tconst keepScrollPosition = async () => {\n\t\t\tif (isWaitingForNextTick.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst el = chat.value;\n\n\t\t\tif (!el) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!props.channel.scrolledToBottom) {\n\t\t\t\tif (props.channel.historyLoading) {\n\t\t\t\t\tconst heightOld = el.scrollHeight - el.scrollTop;\n\n\t\t\t\t\tisWaitingForNextTick.value = true;\n\n\t\t\t\t\tawait nextTick();\n\n\t\t\t\t\tisWaitingForNextTick.value = false;\n\t\t\t\t\tskipNextScrollEvent.value = true;\n\n\t\t\t\t\tel.scrollTop = el.scrollHeight - heightOld;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tisWaitingForNextTick.value = true;\n\t\t\tawait nextTick();\n\t\t\tisWaitingForNextTick.value = false;\n\n\t\t\tjumpToBottom();\n\t\t};\n\n\t\tconst onLinkPreviewToggle = async (preview: ClientLinkPreview, message: ClientMessage) => {\n\t\t\tawait keepScrollPosition();\n\n\t\t\t// Tell the server we're toggling so it remembers at page reload\n\t\t\tsocket.emit(\"msg:preview:toggle\", {\n\t\t\t\ttarget: props.channel.id,\n\t\t\t\tmsgId: message.id,\n\t\t\t\tlink: preview.link,\n\t\t\t\tshown: preview.shown,\n\t\t\t});\n\t\t};\n\n\t\tconst handleScroll = () => {\n\t\t\t// Setting scrollTop also triggers scroll event\n\t\t\t// We don't want to perform calculations for that\n\t\t\tif (skipNextScrollEvent.value) {\n\t\t\t\tskipNextScrollEvent.value = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst el = chat.value;\n\n\t\t\tif (!el) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tprops.channel.scrolledToBottom = el.scrollHeight - el.scrollTop - el.offsetHeight <= 30;\n\t\t};\n\n\t\tconst handleResize = () => {\n\t\t\t// Keep message list scrolled to bottom on resize\n\t\t\tif (props.channel.scrolledToBottom) {\n\t\t\t\tjumpToBottom();\n\t\t\t}\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\tchat.value?.addEventListener(\"scroll\", handleScroll, {passive: true});\n\n\t\t\teventbus.on(\"resize\", handleResize);\n\n\t\t\tvoid nextTick(() => {\n\t\t\t\tif (historyObserver.value && loadMoreButton.value) {\n\t\t\t\t\thistoryObserver.value.observe(loadMoreButton.value);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\twatch(\n\t\t\t() => props.channel.id,\n\t\t\t() => {\n\t\t\t\tprops.channel.scrolledToBottom = true;\n\n\t\t\t\t// Re-add the intersection observer to trigger the check again on channel switch\n\t\t\t\tif (historyObserver.value && loadMoreButton.value) {\n\t\t\t\t\thistoryObserver.value.unobserve(loadMoreButton.value);\n\t\t\t\t\thistoryObserver.value.observe(loadMoreButton.value);\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\twatch(\n\t\t\t() => props.channel.messages,\n\t\t\tasync () => {\n\t\t\t\tawait keepScrollPosition();\n\t\t\t},\n\t\t\t{\n\t\t\t\tdeep: true,\n\t\t\t}\n\t\t);\n\n\t\twatch(\n\t\t\t() => props.channel.pendingMessage,\n\t\t\tasync () => {\n\t\t\t\tawait keepScrollPosition();\n\t\t\t}\n\t\t);\n\n\t\tonBeforeUpdate(() => {\n\t\t\tunreadMarkerShown = false;\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\teventbus.off(\"resize\", handleResize);\n\t\t\tchat.value?.removeEventListener(\"scroll\", handleScroll);\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\tif (historyObserver.value) {\n\t\t\t\thistoryObserver.value.disconnect();\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tchat,\n\t\t\tstore,\n\t\t\tonShowMoreClick,\n\t\t\tloadMoreButton,\n\t\t\tonCopy,\n\t\t\tcondensedMessages,\n\t\t\tshouldDisplayDateMarker,\n\t\t\tshouldDisplayUnreadMarker,\n\t\t\tkeepScrollPosition,\n\t\t\tisPreviousSource,\n\t\t\tjumpToBottom,\n\t\t\tonLinkPreviewToggle,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./MessageList_Basic.vue?vue&type=template&id=da9200d4&ts=true\"\nimport script from \"./MessageList_Basic.vue?vue&type=script&lang=ts\"\nexport * from \"./MessageList_Basic.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<form id=\"form\" method=\"post\" action=\"\" @submit.prevent=\"onSubmit\">\n\t\t<span id=\"upload-progressbar\" />\n\t\t<span v-if=\"store.state.settings.showInputNick\" id=\"nick\">{{ network.nick }}</span>\n\t\t<textarea\n\t\t\tid=\"input\"\n\t\t\tref=\"input\"\n\t\t\tdir=\"auto\"\n\t\t\tclass=\"mousetrap\"\n\t\t\tenterkeyhint=\"send\"\n\t\t\t:value=\"channel.pendingMessage\"\n\t\t\t:placeholder=\"getInputPlaceholder(channel)\"\n\t\t\t:aria-label=\"getInputPlaceholder(channel)\"\n\t\t\t@input=\"setPendingMessage\"\n\t\t\t@keypress.enter.exact.prevent=\"onSubmit\"\n\t\t\t@blur=\"onBlur\"\n\t\t/>\n\t\t<span\n\t\t\tv-if=\"store.state.serverConfiguration?.fileUpload\"\n\t\t\tid=\"upload-tooltip\"\n\t\t\tclass=\"tooltipped tooltipped-w tooltipped-no-touch\"\n\t\t\taria-label=\"Upload file\"\n\t\t\t@click=\"openFileUpload\"\n\t\t>\n\t\t\t<input\n\t\t\t\tid=\"upload-input\"\n\t\t\t\tref=\"uploadInput\"\n\t\t\t\ttype=\"file\"\n\t\t\t\taria-labelledby=\"upload\"\n\t\t\t\tmultiple\n\t\t\t\t@change=\"onUploadInputChange\"\n\t\t\t/>\n\t\t\t<button\n\t\t\t\tid=\"upload\"\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-label=\"Upload file\"\n\t\t\t\t:disabled=\"!store.state.isConnected\"\n\t\t\t/>\n\t\t</span>\n\t\t<span\n\t\t\tid=\"submit-tooltip\"\n\t\t\tclass=\"tooltipped tooltipped-w tooltipped-no-touch\"\n\t\t\taria-label=\"Send message\"\n\t\t>\n\t\t\t<button\n\t\t\t\tid=\"submit\"\n\t\t\t\ttype=\"submit\"\n\t\t\t\taria-label=\"Send message\"\n\t\t\t\t:disabled=\"!store.state.isConnected\"\n\t\t\t/>\n\t\t</span>\n\t</form>\n</template>\n\n<script lang=\"ts\">\nimport Mousetrap from \"mousetrap\";\nimport {wrapCursor} from \"undate\";\nimport autocompletion from \"../js/autocompletion\";\nimport {commands} from \"../js/commands/index\";\nimport socket from \"../js/socket\";\nimport upload from \"../js/upload\";\nimport eventbus from \"../js/eventbus\";\nimport {watch, defineComponent, nextTick, onMounted, PropType, ref, onUnmounted} from \"vue\";\nimport type {ClientNetwork, ClientChan} from \"../js/types\";\nimport {useStore} from \"../js/store\";\nimport {ChanType} from \"../../shared/types/chan\";\n\nconst formattingHotkeys = {\n\t\"mod+k\": \"\\x03\",\n\t\"mod+b\": \"\\x02\",\n\t\"mod+u\": \"\\x1F\",\n\t\"mod+i\": \"\\x1D\",\n\t\"mod+o\": \"\\x0F\",\n\t\"mod+s\": \"\\x1e\",\n\t\"mod+m\": \"\\x11\",\n\t\"mod+r\": \"/rainbow\",\n};\n\n// Autocomplete bracket and quote characters like in a modern IDE\n// For example, select `text`, press `[` key, and it becomes `[text]`\nconst bracketWraps = {\n\t'\"': '\"',\n\t\"'\": \"'\",\n\t\"(\": \")\",\n\t\"<\": \">\",\n\t\"[\": \"]\",\n\t\"{\": \"}\",\n\t\"*\": \"*\",\n\t\"`\": \"`\",\n\t\"~\": \"~\",\n\t_: \"_\",\n};\n\nexport default defineComponent({\n\tname: \"ChatInput\",\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\t\tconst input = ref<HTMLTextAreaElement>();\n\t\tconst uploadInput = ref<HTMLInputElement>();\n\t\tconst autocompletionRef = ref<ReturnType<typeof autocompletion>>();\n\n\t\tconst setInputSize = () => {\n\t\t\tvoid nextTick(() => {\n\t\t\t\tif (!input.value) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst style = window.getComputedStyle(input.value);\n\t\t\t\tconst lineHeight = parseFloat(style.lineHeight) || 1;\n\n\t\t\t\t// Start by resetting height before computing as scrollHeight does not\n\t\t\t\t// decrease when deleting characters\n\t\t\t\tinput.value.style.height = \"\";\n\n\t\t\t\t// Use scrollHeight to calculate how many lines there are in input, and ceil the value\n\t\t\t\t// because some browsers tend to incorrently round the values when using high density\n\t\t\t\t// displays or using page zoom feature\n\t\t\t\tinput.value.style.height = `${\n\t\t\t\t\tMath.ceil(input.value.scrollHeight / lineHeight) * lineHeight\n\t\t\t\t}px`;\n\t\t\t});\n\t\t};\n\n\t\tconst setPendingMessage = (e: Event) => {\n\t\t\tprops.channel.pendingMessage = (e.target as HTMLInputElement).value;\n\t\t\tprops.channel.inputHistoryPosition = 0;\n\t\t\tsetInputSize();\n\t\t};\n\n\t\tconst getInputPlaceholder = (channel: ClientChan) => {\n\t\t\tif (channel.type === ChanType.CHANNEL || channel.type === ChanType.QUERY) {\n\t\t\t\treturn `Write to ${channel.name}`;\n\t\t\t}\n\n\t\t\treturn \"\";\n\t\t};\n\n\t\tconst onSubmit = () => {\n\t\t\tif (!input.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Triggering click event opens the virtual keyboard on mobile\n\t\t\t// This can only be called from another interactive event (e.g. button click)\n\t\t\tinput.value.click();\n\t\t\tinput.value.focus();\n\n\t\t\tif (!store.state.isConnected) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst target = props.channel.id;\n\t\t\tconst text = props.channel.pendingMessage;\n\n\t\t\tif (text.length === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (autocompletionRef.value) {\n\t\t\t\tautocompletionRef.value.hide();\n\t\t\t}\n\n\t\t\tprops.channel.inputHistoryPosition = 0;\n\t\t\tprops.channel.pendingMessage = \"\";\n\t\t\tinput.value.value = \"\";\n\t\t\tsetInputSize();\n\n\t\t\t// Store new message in history if last message isn't already equal\n\t\t\tif (props.channel.inputHistory[1] !== text) {\n\t\t\t\tprops.channel.inputHistory.splice(1, 0, text);\n\t\t\t}\n\n\t\t\t// Limit input history to a 100 entries\n\t\t\tif (props.channel.inputHistory.length > 100) {\n\t\t\t\tprops.channel.inputHistory.pop();\n\t\t\t}\n\n\t\t\tif (text[0] === \"/\") {\n\t\t\t\tconst args = text.substring(1).split(\" \");\n\t\t\t\tconst cmd = args.shift()?.toLowerCase();\n\n\t\t\t\tif (!cmd) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(commands, cmd) && commands[cmd](args)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsocket.emit(\"input\", {target, text});\n\t\t};\n\n\t\tconst onUploadInputChange = () => {\n\t\t\tif (!uploadInput.value || !uploadInput.value.files) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst files = Array.from(uploadInput.value.files);\n\t\t\tupload.triggerUpload(files);\n\t\t\tuploadInput.value.value = \"\"; // Reset <input> element so you can upload the same file\n\t\t};\n\n\t\tconst openFileUpload = () => {\n\t\t\tuploadInput.value?.click();\n\t\t};\n\n\t\tconst blurInput = () => {\n\t\t\tinput.value?.blur();\n\t\t};\n\n\t\tconst onBlur = (e: FocusEvent) => {\n\t\t\t// Don't hide autocomplete if clicking on the autocomplete menu itself\n\t\t\t// The click event needs to complete before we hide the menu\n\t\t\tconst eventTarget = e.target as HTMLElement;\n\n\t\t\tif (eventTarget.id === \"input\" && eventTarget.classList.contains(\"mousetrap\")) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (autocompletionRef.value) {\n\t\t\t\tautocompletionRef.value.hide();\n\t\t\t}\n\t\t};\n\n\t\twatch(\n\t\t\t() => props.channel.id,\n\t\t\t() => {\n\t\t\t\tif (autocompletionRef.value) {\n\t\t\t\t\tautocompletionRef.value.hide();\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\twatch(\n\t\t\t() => props.channel.pendingMessage,\n\t\t\t() => {\n\t\t\t\tsetInputSize();\n\t\t\t}\n\t\t);\n\n\t\tonMounted(() => {\n\t\t\teventbus.on(\"escapekey\", blurInput);\n\n\t\t\tif (store.state.settings.autocomplete) {\n\t\t\t\tif (!input.value) {\n\t\t\t\t\tthrow new Error(\"ChatInput autocomplete: input element is not available\");\n\t\t\t\t}\n\n\t\t\t\tautocompletionRef.value = autocompletion(input.value);\n\t\t\t}\n\n\t\t\tconst inputTrap = Mousetrap(input.value);\n\n\t\t\tlet enabledHotkeys = Object.keys(formattingHotkeys);\n\n\t\t\t// Allow disable /rainbow hotkey\n\t\t\tif (store.state.settings.enableRainbowHotkey === false) {\n\t\t\t\tenabledHotkeys = enabledHotkeys.filter((k) => k !== \"mod+r\");\n\t\t\t}\n\n\t\t\tinputTrap.bind(enabledHotkeys, function (e, key) {\n\t\t\t\tconst modifier = formattingHotkeys[key];\n\n\t\t\t\tif (!e.target) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\tif (modifier === \"/rainbow\" && input.value != null) {\n\t\t\t\t\tif (input.value.value.startsWith(modifier)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tinput.value.value = `${modifier} ${input.value.value}`;\n\t\t\t\t\tsetPendingMessage(e);\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\twrapCursor(\n\t\t\t\t\te.target as HTMLTextAreaElement,\n\t\t\t\t\tmodifier,\n\t\t\t\t\t(e.target as HTMLTextAreaElement).selectionStart ===\n\t\t\t\t\t\t(e.target as HTMLTextAreaElement).selectionEnd\n\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t: modifier\n\t\t\t\t);\n\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\tinputTrap.bind(Object.keys(bracketWraps), function (e, key) {\n\t\t\t\tif (\n\t\t\t\t\t(e.target as HTMLTextAreaElement)?.selectionStart !==\n\t\t\t\t\t(e.target as HTMLTextAreaElement).selectionEnd\n\t\t\t\t) {\n\t\t\t\t\twrapCursor(e.target as HTMLTextAreaElement, key, bracketWraps[key]);\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tinputTrap.bind([\"up\", \"down\"], (e, key) => {\n\t\t\t\tif (\n\t\t\t\t\tstore.state.isAutoCompleting ||\n\t\t\t\t\t(e.target as HTMLTextAreaElement).selectionStart !==\n\t\t\t\t\t\t(e.target as HTMLTextAreaElement).selectionEnd ||\n\t\t\t\t\t!input.value\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst onRow = (\n\t\t\t\t\tinput.value.value.slice(undefined, input.value.selectionStart).match(/\\n/g) ||\n\t\t\t\t\t[]\n\t\t\t\t).length;\n\t\t\t\tconst totalRows = (input.value.value.match(/\\n/g) || []).length;\n\n\t\t\t\tconst {channel} = props;\n\n\t\t\t\tif (channel.inputHistoryPosition === 0) {\n\t\t\t\t\tchannel.inputHistory[channel.inputHistoryPosition] = channel.pendingMessage;\n\t\t\t\t}\n\n\t\t\t\tif (key === \"up\" && onRow === 0) {\n\t\t\t\t\tif (channel.inputHistoryPosition < channel.inputHistory.length - 1) {\n\t\t\t\t\t\tchannel.inputHistoryPosition++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else if (\n\t\t\t\t\tkey === \"down\" &&\n\t\t\t\t\tchannel.inputHistoryPosition > 0 &&\n\t\t\t\t\tonRow === totalRows\n\t\t\t\t) {\n\t\t\t\t\tchannel.inputHistoryPosition--;\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tchannel.pendingMessage = channel.inputHistory[channel.inputHistoryPosition];\n\t\t\t\tinput.value.value = channel.pendingMessage;\n\t\t\t\tsetInputSize();\n\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\tif (store.state.serverConfiguration?.fileUpload) {\n\t\t\t\tupload.mounted();\n\t\t\t}\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\teventbus.off(\"escapekey\", blurInput);\n\n\t\t\tif (autocompletionRef.value) {\n\t\t\t\tautocompletionRef.value.destroy();\n\t\t\t\tautocompletionRef.value = undefined;\n\t\t\t}\n\n\t\t\tupload.unmounted();\n\t\t\tupload.abort();\n\t\t});\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tinput,\n\t\t\tuploadInput,\n\t\t\tonUploadInputChange,\n\t\t\topenFileUpload,\n\t\t\tblurInput,\n\t\t\tonBlur,\n\t\t\tsetInputSize,\n\t\t\tupload,\n\t\t\tgetInputPlaceholder,\n\t\t\tonSubmit,\n\t\t\tsetPendingMessage,\n\t\t};\n\t},\n});\n</script>\n","import constants from \"./constants\";\n\nimport Mousetrap from \"mousetrap\";\nimport {Textcomplete, StrategyProps} from \"@textcomplete/core\";\nimport {TextareaEditor} from \"@textcomplete/textarea\";\n\nimport fuzzy from \"fuzzy\";\n\nimport emojiMap from \"./helpers/simplemap.json\" with {type: \"json\"};\nimport {store} from \"./store\";\nimport {ChanType} from \"../../shared/types/chan\";\n\nexport default enableAutocomplete;\n\nconst emojiSearchTerms = Object.keys(emojiMap);\nconst emojiStrategy: StrategyProps = {\n\tid: \"emoji\",\n\tmatch: /(^|\\s):([-+\\w:?]{2,}):?$/,\n\tsearch(term: string, callback: (matches) => void) {\n\t\t// Trim colon from the matched term,\n\t\t// as we are unable to get a clean string from match regex\n\t\tterm = term.replace(/:$/, \"\");\n\t\tcallback(fuzzyGrep(term, emojiSearchTerms));\n\t},\n\ttemplate([string, original]: [string, string]) {\n\t\treturn `<span class=\"emoji\">${String(emojiMap[original])}</span> ${string}`;\n\t},\n\treplace([, original]: [string, string]) {\n\t\treturn \"$1\" + String(emojiMap[original]);\n\t},\n\tindex: 2,\n};\n\nconst nicksStrategy: StrategyProps = {\n\tid: \"nicks\",\n\tmatch: /(^|\\s)(@([a-zA-Z_[\\]\\\\^{}|`@][a-zA-Z0-9_[\\]\\\\^{}|`-]*)?)$/,\n\tsearch(term: string, callback: (matches: string[] | string[][]) => void) {\n\t\tterm = term.slice(1);\n\n\t\tif (term[0] === \"@\") {\n\t\t\t// TODO: type\n\t\t\tcallback(completeNicks(term.slice(1), true).map((val) => [\"@\" + val[0], \"@\" + val[1]]));\n\t\t} else {\n\t\t\tcallback(completeNicks(term, true));\n\t\t}\n\t},\n\ttemplate([string]: [string, string]) {\n\t\treturn string;\n\t},\n\treplace([, original]: [string, string]) {\n\t\treturn \"$1\" + replaceNick(original);\n\t},\n\tindex: 2,\n};\n\nconst chanStrategy: StrategyProps = {\n\tid: \"chans\",\n\tmatch: /(^|\\s)((?:#|\\+|&|![A-Z0-9]{5})(?:[^\\s]+)?)$/,\n\tsearch(term: string, callback: (matches: string[][]) => void) {\n\t\tcallback(completeChans(term));\n\t},\n\ttemplate([string]: [string, string]) {\n\t\treturn string;\n\t},\n\treplace([, original]: [string, string]) {\n\t\treturn \"$1\" + original;\n\t},\n\tindex: 2,\n};\n\nconst commandStrategy: StrategyProps = {\n\tid: \"commands\",\n\tmatch: /^\\/(\\w*)$/,\n\tsearch(term: string, callback: (matches: string[][]) => void) {\n\t\tcallback(completeCommands(\"/\" + term));\n\t},\n\ttemplate([string]: [string, string]) {\n\t\treturn string;\n\t},\n\treplace([, original]: [string, string]) {\n\t\treturn original;\n\t},\n\tindex: 1,\n};\n\nconst foregroundColorStrategy: StrategyProps = {\n\tid: \"foreground-colors\",\n\tmatch: /\\x03(\\d{0,2}|[A-Za-z ]{0,10})$/,\n\tsearch(term: string, callback: (matches: string[][]) => void) {\n\t\tterm = term.toLowerCase();\n\n\t\tconst matchingColorCodes = constants.colorCodeMap\n\t\t\t.filter((i) => fuzzy.test(term, i[0]) || fuzzy.test(term, i[1]))\n\t\t\t.map((i) => {\n\t\t\t\tif (fuzzy.test(term, i[1])) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\ti[0],\n\t\t\t\t\t\tfuzzy.match(term, i[1], {\n\t\t\t\t\t\t\tpre: \"<b>\",\n\t\t\t\t\t\t\tpost: \"</b>\",\n\t\t\t\t\t\t}).rendered,\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\treturn i;\n\t\t\t});\n\n\t\tcallback(matchingColorCodes);\n\t},\n\ttemplate(value: string[]) {\n\t\treturn `<span class=\"irc-fg${parseInt(value[0], 10)}\">${value[1]}</span>`;\n\t},\n\treplace(value: string) {\n\t\treturn \"\\x03\" + value[0];\n\t},\n\tindex: 1,\n};\n\nconst backgroundColorStrategy: StrategyProps = {\n\tid: \"background-colors\",\n\tmatch: /\\x03(\\d{2}),(\\d{0,2}|[A-Za-z ]{0,10})$/,\n\tsearch(term: string, callback: (matchingColorCodes: string[][]) => void, match: string[]) {\n\t\tterm = term.toLowerCase();\n\t\tconst matchingColorCodes = constants.colorCodeMap\n\t\t\t.filter((i) => fuzzy.test(term, i[0]) || fuzzy.test(term, i[1]))\n\t\t\t.map((pair) => {\n\t\t\t\tif (fuzzy.test(term, pair[1])) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tpair[0],\n\t\t\t\t\t\tfuzzy.match(term, pair[1], {\n\t\t\t\t\t\t\tpre: \"<b>\",\n\t\t\t\t\t\t\tpost: \"</b>\",\n\t\t\t\t\t\t}).rendered,\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\treturn pair;\n\t\t\t})\n\t\t\t.map((pair) => pair.concat(match[1])); // Needed to pass fg color to `template`...\n\n\t\tcallback(matchingColorCodes);\n\t},\n\ttemplate(value: string[]) {\n\t\treturn `<span class=\"irc-fg${parseInt(value[2], 10)} irc-bg irc-bg${parseInt(\n\t\t\tvalue[0],\n\t\t\t10\n\t\t)}\">${value[1]}</span>`;\n\t},\n\treplace(value: string[]) {\n\t\treturn \"\\x03$1,\" + value[0];\n\t},\n\tindex: 2,\n};\n\nfunction enableAutocomplete(input: HTMLTextAreaElement) {\n\tlet tabCount = 0;\n\tlet lastMatch = \"\";\n\tlet currentMatches: string[] | string[][] = [];\n\n\tinput.addEventListener(\"input\", (e) => {\n\t\tif ((e as CustomEvent).detail === \"autocomplete\") {\n\t\t\treturn;\n\t\t}\n\n\t\ttabCount = 0;\n\t\tcurrentMatches = [];\n\t\tlastMatch = \"\";\n\t});\n\n\tMousetrap(input).bind(\n\t\t\"tab\",\n\t\t(e) => {\n\t\t\tif (store.state.isAutoCompleting) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.preventDefault();\n\n\t\t\tconst text = input.value;\n\n\t\t\tif (tabCount === 0) {\n\t\t\t\tlastMatch = text.substring(0, input.selectionStart).split(/\\s/).pop() || \"\";\n\n\t\t\t\tif (lastMatch.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcurrentMatches = completeNicks(lastMatch, false);\n\n\t\t\t\tif (currentMatches.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst position = input.selectionStart - lastMatch.length;\n\t\t\tconst newMatch = replaceNick(\n\t\t\t\t// TODO: type this properly\n\t\t\t\tString(currentMatches[tabCount % currentMatches.length]),\n\t\t\t\tposition\n\t\t\t);\n\t\t\tconst remainder = text.substring(input.selectionStart);\n\n\t\t\tinput.value = text.substr(0, position) + newMatch + remainder;\n\n\t\t\tinput.selectionStart -= remainder.length;\n\t\t\tinput.selectionEnd = input.selectionStart;\n\n\t\t\t// Propagate change to Vue model\n\t\t\tinput.dispatchEvent(\n\t\t\t\tnew CustomEvent(\"input\", {\n\t\t\t\t\tdetail: \"autocomplete\",\n\t\t\t\t})\n\t\t\t);\n\n\t\t\tlastMatch = newMatch;\n\t\t\ttabCount++;\n\t\t},\n\t\t\"keydown\"\n\t);\n\n\tconst strategies = [\n\t\temojiStrategy,\n\t\tnicksStrategy,\n\t\tchanStrategy,\n\t\tcommandStrategy,\n\t\tforegroundColorStrategy,\n\t\tbackgroundColorStrategy,\n\t];\n\n\tconst editor = new TextareaEditor(input);\n\tconst textcomplete = new Textcomplete(editor, strategies, {\n\t\tdropdown: {\n\t\t\tclassName: \"textcomplete-menu\",\n\t\t\tplacement: \"top\",\n\t\t},\n\t});\n\n\ttextcomplete.on(\"show\", () => {\n\t\tstore.commit(\"isAutoCompleting\", true);\n\t});\n\n\ttextcomplete.on(\"hidden\", () => {\n\t\tstore.commit(\"isAutoCompleting\", false);\n\t});\n\n\treturn {\n\t\thide() {\n\t\t\ttextcomplete.hide();\n\t\t},\n\t\tdestroy() {\n\t\t\ttextcomplete.destroy();\n\t\t\tstore.commit(\"isAutoCompleting\", false);\n\t\t},\n\t};\n}\n\nfunction replaceNick(original: string, position = 1) {\n\t// If no postfix specified, return autocompleted nick as-is\n\tif (!store.state.settings.nickPostfix) {\n\t\treturn original;\n\t}\n\n\t// If there is whitespace in the input already, append space to nick\n\tif (position > 0 && /\\s/.test(store.state.activeChannel?.channel.pendingMessage || \"\")) {\n\t\treturn original + \" \";\n\t}\n\n\t// If nick is first in the input, append specified postfix\n\treturn original + store.state.settings.nickPostfix;\n}\n\nfunction fuzzyGrep<T>(term: string, array: Array<T>) {\n\tconst results = fuzzy.filter(term, array, {\n\t\tpre: \"<b>\",\n\t\tpost: \"</b>\",\n\t});\n\treturn results.map((el) => [el.string, el.original]);\n}\n\nfunction rawNicks() {\n\tif (!store.state.activeChannel) {\n\t\treturn [];\n\t}\n\n\tconst channel = store.state.activeChannel.channel;\n\n\tif (channel.users && channel.users.length > 0) {\n\t\tconst users = channel.users.slice();\n\n\t\treturn users.sort((a, b) => b.lastMessage - a.lastMessage).map((u) => u.nick);\n\t}\n\n\tconst me = store.state.activeChannel.network.nick;\n\tconst otherUser = channel.name;\n\n\t// If this is a query, add their name to autocomplete\n\tif (me !== otherUser && channel.type === ChanType.QUERY) {\n\t\treturn [otherUser, me];\n\t}\n\n\t// Return our own name by default for anything that isn't a channel or query\n\treturn [me];\n}\n\nfunction completeNicks(word: string, isFuzzy: boolean) {\n\tconst users = rawNicks();\n\tword = word.toLowerCase();\n\n\tif (isFuzzy) {\n\t\treturn fuzzyGrep(word, users);\n\t}\n\n\treturn users.filter((w) => !w.toLowerCase().indexOf(word));\n}\n\nfunction getCommands() {\n\tlet cmds = constants.commands.slice();\n\n\tif (!store.state.settings.searchEnabled) {\n\t\tcmds = cmds.filter((c) => c !== \"/search\");\n\t}\n\n\treturn cmds;\n}\n\nfunction completeCommands(word: string) {\n\tconst commands = getCommands();\n\treturn fuzzyGrep(word, commands);\n}\n\nfunction completeChans(word: string) {\n\tconst words: string[] = [];\n\n\tif (store.state.activeChannel) {\n\t\tfor (const channel of store.state.activeChannel.network.channels) {\n\t\t\t// Push all channels that start with the same CHANTYPE\n\t\t\tif (channel.type === ChanType.CHANNEL && channel.name[0] === word[0]) {\n\t\t\t\twords.push(channel.name);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fuzzyGrep(word, words);\n}\n","import {input as collapse} from \"./collapse\";\nimport {input as expand} from \"./expand\";\nimport {input as join} from \"./join\";\nimport {input as search} from \"./search\";\n\nexport const commands = {\n\tcollapse: collapse,\n\texpand: expand,\n\tjoin: join,\n\tsearch: search,\n};\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nexport function input(): boolean {\n\tif (!store.state.activeChannel) {\n\t\treturn false;\n\t}\n\n\tconst messageIds: number[] = [];\n\n\tfor (const message of store.state.activeChannel.channel.messages) {\n\t\tlet toggled = false;\n\n\t\tfor (const preview of message.previews || []) {\n\t\t\tif (preview.shown) {\n\t\t\t\tpreview.shown = false;\n\t\t\t\ttoggled = true;\n\t\t\t}\n\t\t}\n\n\t\tif (toggled) {\n\t\t\tmessageIds.push(message.id);\n\t\t}\n\t}\n\n\t// Tell the server we're toggling so it remembers at page reload\n\tif (!document.body.classList.contains(\"public\") && messageIds.length > 0) {\n\t\tsocket.emit(\"msg:preview:toggle\", {\n\t\t\ttarget: store.state.activeChannel?.channel.id,\n\t\t\tmessageIds: messageIds,\n\t\t\tshown: false,\n\t\t});\n\t}\n\n\treturn true;\n}\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nexport function input(): boolean {\n\tif (!store.state.activeChannel) {\n\t\treturn false;\n\t}\n\n\tconst messageIds: number[] = [];\n\n\tfor (const message of store.state.activeChannel.channel.messages) {\n\t\tlet toggled = false;\n\n\t\tfor (const preview of message.previews || []) {\n\t\t\tif (!preview.shown) {\n\t\t\t\tpreview.shown = true;\n\t\t\t\ttoggled = true;\n\t\t\t}\n\t\t}\n\n\t\tif (toggled) {\n\t\t\tmessageIds.push(message.id);\n\t\t}\n\t}\n\n\t// Tell the server we're toggling so it remembers at page reload\n\tif (!document.body.classList.contains(\"public\") && messageIds.length > 0) {\n\t\tsocket.emit(\"msg:preview:toggle\", {\n\t\t\ttarget: store.state.activeChannel?.channel.id,\n\t\t\tmessageIds: messageIds,\n\t\t\tshown: true,\n\t\t});\n\t}\n\n\treturn true;\n}\n","import socket from \"../socket\";\nimport {store} from \"../store\";\nimport {switchToChannel} from \"../router\";\nimport {ChanType} from \"../../../shared/types/chan\";\n\nexport function input(args: string[]): boolean {\n\tif (args.length > 0) {\n\t\tlet channels = args[0];\n\n\t\tif (channels.length > 0) {\n\t\t\tconst chanTypes = store.state.activeChannel?.network.serverOptions.CHANTYPES;\n\t\t\tconst channelList = args[0].split(\",\");\n\n\t\t\tif (chanTypes && chanTypes.length > 0) {\n\t\t\t\tfor (let c = 0; c < channelList.length; c++) {\n\t\t\t\t\tif (!chanTypes.includes(channelList[c][0])) {\n\t\t\t\t\t\tchannelList[c] = chanTypes[0] + channelList[c];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchannels = channelList.join(\",\");\n\n\t\t\tconst chan = store.getters.findChannelOnCurrentNetwork(channels);\n\n\t\t\tif (chan) {\n\t\t\t\tswitchToChannel(chan);\n\t\t\t} else {\n\t\t\t\tif (store.state.activeChannel) {\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttext: `/join ${channels} ${args.length > 1 ? args[1] : \"\"}`,\n\t\t\t\t\t\ttarget: store.state.activeChannel.channel.id,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t} else if (store.state.activeChannel?.channel.type === ChanType.CHANNEL) {\n\t\t// If `/join` command is used without any arguments, re-join current channel\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: store.state.activeChannel.channel.id,\n\t\t\ttext: `/join ${store.state.activeChannel.channel.name}`,\n\t\t});\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n","import {store} from \"../store\";\nimport {router} from \"../router\";\n\nexport function input(args: string[]): boolean {\n\tif (!store.state.settings.searchEnabled) {\n\t\treturn false;\n\t}\n\n\trouter\n\t\t.push({\n\t\t\tname: \"SearchResults\",\n\t\t\tparams: {\n\t\t\t\tid: store.state.activeChannel?.channel.id,\n\t\t\t},\n\t\t\tquery: {\n\t\t\t\tq: args.join(\" \"),\n\t\t\t},\n\t\t})\n\t\t.catch((e: Error) => {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(`Failed to push SearchResults route: ${e.message}`);\n\t\t});\n\n\treturn true;\n}\n","import {update as updateCursor} from \"undate\";\n\nimport socket from \"./socket\";\nimport {store} from \"./store\";\n\nclass Uploader {\n\txhr: XMLHttpRequest | null = null;\n\tfileQueue: File[] = [];\n\ttokenKeepAlive: NodeJS.Timeout | null = null;\n\n\toverlay: HTMLDivElement | null = null;\n\tuploadProgressbar: HTMLSpanElement | null = null;\n\n\tonDragEnter = (e: DragEvent) => this.dragEnter(e);\n\tonDragOver = (e: DragEvent) => this.dragOver(e);\n\tonDragLeave = (e: DragEvent) => this.dragLeave(e);\n\tonDrop = (e: DragEvent) => this.drop(e);\n\tonPaste = (e: ClipboardEvent) => this.paste(e);\n\n\tinit() {\n\t\tsocket.on(\"upload:auth\", (token) => this.uploadNextFileInQueue(token));\n\t}\n\n\tmounted() {\n\t\tthis.overlay = document.getElementById(\"upload-overlay\") as HTMLDivElement;\n\t\tthis.uploadProgressbar = document.getElementById(\"upload-progressbar\") as HTMLSpanElement;\n\n\t\tdocument.addEventListener(\"dragenter\", this.onDragEnter);\n\t\tdocument.addEventListener(\"dragover\", this.onDragOver);\n\t\tdocument.addEventListener(\"dragleave\", this.onDragLeave);\n\t\tdocument.addEventListener(\"drop\", this.onDrop);\n\t\tdocument.addEventListener(\"paste\", this.onPaste);\n\t}\n\n\tunmounted() {\n\t\tdocument.removeEventListener(\"dragenter\", this.onDragEnter);\n\t\tdocument.removeEventListener(\"dragover\", this.onDragOver);\n\t\tdocument.removeEventListener(\"dragleave\", this.onDragLeave);\n\t\tdocument.removeEventListener(\"drop\", this.onDrop);\n\t\tdocument.removeEventListener(\"paste\", this.onPaste);\n\t}\n\n\tdragOver(event: DragEvent) {\n\t\tif (event.dataTransfer?.types.includes(\"Files\")) {\n\t\t\t// Prevent dragover event completely and do nothing with it\n\t\t\t// This stops the browser from trying to guess which cursor to show\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n\n\tdragEnter(event: DragEvent) {\n\t\t// relatedTarget is the target where we entered the drag from\n\t\t// when dragging from another window, the target is null, otherwise its a DOM element\n\t\tif (!event.relatedTarget && event.dataTransfer?.types.includes(\"Files\")) {\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.overlay?.classList.add(\"is-dragover\");\n\t\t}\n\t}\n\n\tdragLeave(event: DragEvent) {\n\t\t// If relatedTarget is null, that means we are no longer dragging over the page\n\t\tif (!event.relatedTarget) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.overlay?.classList.remove(\"is-dragover\");\n\t\t}\n\t}\n\n\tdrop(event: DragEvent) {\n\t\tif (!event.dataTransfer?.types.includes(\"Files\")) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tthis.overlay?.classList.remove(\"is-dragover\");\n\n\t\tlet files: (File | null)[];\n\n\t\tif (event.dataTransfer.items) {\n\t\t\tfiles = Array.from(event.dataTransfer.items)\n\t\t\t\t.filter((item) => item.kind === \"file\")\n\t\t\t\t.map((item) => item.getAsFile());\n\t\t} else {\n\t\t\tfiles = Array.from(event.dataTransfer.files);\n\t\t}\n\n\t\tthis.triggerUpload(files);\n\t}\n\n\tpaste(event: ClipboardEvent) {\n\t\tconst items = event.clipboardData?.items;\n\t\tconst files: (File | null)[] = [];\n\n\t\tif (!items) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tif (items[i].kind === \"file\") {\n\t\t\t\tfiles.push(items[i].getAsFile());\n\t\t\t}\n\t\t}\n\n\t\tif (files.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tthis.triggerUpload(files);\n\t}\n\n\ttriggerUpload(files: (File | null)[]) {\n\t\tif (!files.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!store.state.isConnected) {\n\t\t\tthis.handleResponse({\n\t\t\t\terror: `You are currently disconnected, unable to initiate upload process.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst wasQueueEmpty = this.fileQueue.length === 0;\n\t\tconst maxFileSize = store.state.serverConfiguration?.fileUploadMaxFileSize || 0;\n\n\t\tfor (const file of files) {\n\t\t\tif (!file) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (maxFileSize > 0 && file.size > maxFileSize) {\n\t\t\t\tthis.handleResponse({\n\t\t\t\t\terror: `File ${file.name} is over the maximum allowed size`,\n\t\t\t\t});\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.fileQueue.push(file);\n\t\t}\n\n\t\t// if the queue was empty and we added some files to it, and there currently\n\t\t// is no upload in process, request a token to start the upload process\n\t\tif (wasQueueEmpty && this.xhr === null && this.fileQueue.length > 0) {\n\t\t\tthis.requestToken();\n\t\t}\n\t}\n\n\trequestToken() {\n\t\tsocket.emit(\"upload:auth\");\n\t}\n\n\tsetProgress(value: number) {\n\t\tif (!this.uploadProgressbar) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.uploadProgressbar.classList.toggle(\"upload-progressbar-visible\", value > 0);\n\t\tthis.uploadProgressbar.style.width = `${value}%`;\n\t}\n\n\tuploadNextFileInQueue(token: string) {\n\t\tconst file = this.fileQueue.shift();\n\n\t\tif (!file) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Tell the server that we are still upload to this token\n\t\t// so it does not become invalidated and fail the upload.\n\t\t// This issue only happens if The Lounge is proxied through other software\n\t\t// as it may buffer the upload before the upload request will be processed by The Lounge.\n\t\tthis.tokenKeepAlive = setInterval(() => socket.emit(\"upload:ping\", token), 40 * 1000);\n\n\t\tif (\n\t\t\tstore.state.settings.uploadCanvas &&\n\t\t\tfile.type.startsWith(\"image/\") &&\n\t\t\t!file.type.includes(\"svg\") &&\n\t\t\tfile.type !== \"image/gif\"\n\t\t) {\n\t\t\tthis.renderImage(file, (newFile) => this.performUpload(token, newFile));\n\t\t} else {\n\t\t\tthis.performUpload(token, file);\n\t\t}\n\t}\n\n\trenderImage(file: File, callback: (file: File) => void) {\n\t\tconst fileReader = new FileReader();\n\n\t\tfileReader.onabort = () => callback(file);\n\t\tfileReader.onerror = () => fileReader.abort();\n\n\t\tfileReader.onload = () => {\n\t\t\tconst img = new Image();\n\n\t\t\timg.onerror = () => callback(file);\n\n\t\t\timg.onload = () => {\n\t\t\t\tconst canvas = document.createElement(\"canvas\");\n\t\t\t\tcanvas.width = img.width;\n\t\t\t\tcanvas.height = img.height;\n\t\t\t\tconst ctx = canvas.getContext(\"2d\");\n\n\t\t\t\tif (!ctx) {\n\t\t\t\t\tthrow new Error(\"Could not get canvas context in upload\");\n\t\t\t\t}\n\n\t\t\t\tctx.drawImage(img, 0, 0);\n\n\t\t\t\tcanvas.toBlob((blob) => {\n\t\t\t\t\tcallback(new File([blob!], file.name));\n\t\t\t\t}, file.type);\n\t\t\t};\n\n\t\t\t// readAsDataURL always returns a string (data: URL)\n\t\t\tif (typeof fileReader.result === \"string\") {\n\t\t\t\timg.src = fileReader.result;\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Expected string result from readAsDataURL\");\n\t\t\t}\n\t\t};\n\n\t\tfileReader.readAsDataURL(file);\n\t}\n\n\tperformUpload(token: string, file: File) {\n\t\tthis.xhr = new XMLHttpRequest();\n\n\t\tthis.xhr.upload.addEventListener(\n\t\t\t\"progress\",\n\t\t\t(e) => {\n\t\t\t\tconst percent = Math.floor((e.loaded / e.total) * 1000) / 10;\n\t\t\t\tthis.setProgress(percent);\n\t\t\t},\n\t\t\tfalse\n\t\t);\n\n\t\tthis.xhr.onreadystatechange = () => {\n\t\t\tif (this.xhr?.readyState === XMLHttpRequest.DONE) {\n\t\t\t\tlet response;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponse = JSON.parse(this.xhr.responseText);\n\t\t\t\t} catch {\n\t\t\t\t\t// This is just a safe guard and should not happen if server doesn't throw any errors.\n\t\t\t\t\t// Browsers break the HTTP spec by aborting the request without reading any response data,\n\t\t\t\t\t// if there is still data to be uploaded. Servers will only error in extreme cases like bad\n\t\t\t\t\t// authentication or server-side errors.\n\t\t\t\t\tresponse = {\n\t\t\t\t\t\terror: `Upload aborted: ${this.xhr.statusText} (HTTP ${this.xhr.status})`,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tthis.handleResponse(response);\n\n\t\t\t\tthis.xhr = null;\n\n\t\t\t\t// this file was processed, if we still have files in the queue, upload the next one\n\t\t\t\tif (this.fileQueue.length > 0) {\n\t\t\t\t\tthis.requestToken();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst formData = new FormData();\n\t\tformData.append(\"file\", file);\n\t\tthis.xhr.open(\"POST\", `uploads/new/${token}`);\n\t\tthis.xhr.send(formData);\n\t}\n\n\thandleResponse(response: {error?: string; url?: string}) {\n\t\tthis.setProgress(0);\n\n\t\tif (this.tokenKeepAlive) {\n\t\t\tclearInterval(this.tokenKeepAlive);\n\t\t\tthis.tokenKeepAlive = null;\n\t\t}\n\n\t\tif (response.error) {\n\t\t\tstore.commit(\"currentUserVisibleError\", response.error);\n\t\t\treturn;\n\t\t}\n\n\t\tif (response.url) {\n\t\t\tthis.insertUploadUrl(response.url);\n\t\t}\n\t}\n\n\tinsertUploadUrl(url: string) {\n\t\tconst fullURL = new URL(url, location.toString()).toString();\n\t\tconst textbox = document.getElementById(\"input\");\n\n\t\tif (!(textbox instanceof HTMLTextAreaElement)) {\n\t\t\tthrow new Error(\"Could not find textbox in upload\");\n\t\t}\n\n\t\tconst initStart = textbox.selectionStart;\n\n\t\t// Get the text before the cursor, and add a space if it's not in the beginning\n\t\tconst headToCursor = initStart > 0 ? textbox.value.substring(0, initStart) + \" \" : \"\";\n\n\t\t// Get the remaining text after the cursor\n\t\tconst cursorToTail = textbox.value.substring(initStart);\n\n\t\t// Construct the value until the point where we want the cursor to be\n\t\tconst textBeforeTail = headToCursor + fullURL + \" \";\n\n\t\tupdateCursor(textbox, textBeforeTail + cursorToTail);\n\n\t\t// Set the cursor after the link and a space\n\t\ttextbox.selectionStart = textbox.selectionEnd = textBeforeTail.length;\n\t}\n\n\t// TODO: This is a temporary hack while Vue porting is finalized\n\tabort() {\n\t\tthis.fileQueue = [];\n\n\t\tif (this.xhr) {\n\t\t\tthis.xhr.abort();\n\t\t\tthis.xhr = null;\n\t\t}\n\t}\n}\n\nconst instance = new Uploader();\n\nexport default {\n\tabort: () => instance.abort(),\n\tinitialize: () => instance.init(),\n\tmounted: () => instance.mounted(),\n\tunmounted: () => instance.unmounted(),\n\ttriggerUpload: (files) => instance.triggerUpload(files),\n};\n","import { render } from \"./ChatInput.vue?vue&type=template&id=758f40fe&ts=true\"\nimport script from \"./ChatInput.vue?vue&type=script&lang=ts\"\nexport * from \"./ChatInput.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<aside\n\t\tref=\"userlist\"\n\t\tclass=\"userlist\"\n\t\t:aria-label=\"'User list for ' + channel.name\"\n\t\t@mouseleave=\"removeHoverUser\"\n\t>\n\t\t<div class=\"count\">\n\t\t\t<input\n\t\t\t\tref=\"input\"\n\t\t\t\t:value=\"userSearchInput\"\n\t\t\t\t:placeholder=\"\n\t\t\t\t\tchannel.users.length + ' user' + (channel.users.length === 1 ? '' : 's')\n\t\t\t\t\"\n\t\t\t\ttype=\"search\"\n\t\t\t\tclass=\"search\"\n\t\t\t\taria-label=\"Search among the user list\"\n\t\t\t\ttabindex=\"-1\"\n\t\t\t\t@input=\"setUserSearchInput\"\n\t\t\t\t@keydown.up=\"navigateUserList($event, -1)\"\n\t\t\t\t@keydown.down=\"navigateUserList($event, 1)\"\n\t\t\t\t@keydown.page-up=\"navigateUserList($event, -10)\"\n\t\t\t\t@keydown.page-down=\"navigateUserList($event, 10)\"\n\t\t\t\t@keydown.enter=\"selectUser\"\n\t\t\t/>\n\t\t</div>\n\t\t<div class=\"names\">\n\t\t\t<!-- Custom groups from SPGROUPS -->\n\t\t\t<template v-if=\"hasCustomGroups\">\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"(users, group) in groupedUsers\"\n\t\t\t\t\t:key=\"'group-' + group\"\n\t\t\t\t\t:class=\"['user-mode', 'custom-group', 'group-' + getGroupSlug(group)]\"\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"users.length > 0\"\n\t\t\t\t\t\t:class=\"['custom-group-header', 'group-header-' + getGroupSlug(group)]\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ group }}\n\t\t\t\t\t</div>\n\t\t\t\t\t<template v-if=\"userSearchInput.length > 0\">\n\t\t\t\t\t\t<!-- eslint-disable vue/no-v-text-v-html-on-component -->\n\t\t\t\t\t\t<Username\n\t\t\t\t\t\t\tv-for=\"user in users\"\n\t\t\t\t\t\t\t:key=\"user.original!.nick + '-search'\"\n\t\t\t\t\t\t\t:on-hover=\"hoverUser\"\n\t\t\t\t\t\t\t:active=\"user.original === activeUser\"\n\t\t\t\t\t\t\t:user=\"user.original!\"\n\t\t\t\t\t\t\tv-html=\"user.string\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<!-- eslint-enable -->\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t<Username\n\t\t\t\t\t\t\tv-for=\"user in users\"\n\t\t\t\t\t\t\t:key=\"user.nick\"\n\t\t\t\t\t\t\t:on-hover=\"hoverUser\"\n\t\t\t\t\t\t\t:active=\"user === activeUser\"\n\t\t\t\t\t\t\t:user=\"user\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<!-- Default IRC modes fallback -->\n\t\t\t<template v-else>\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"(users, mode) in groupedUsers\"\n\t\t\t\t\t:key=\"mode\"\n\t\t\t\t\t:class=\"['user-mode', getModeClass(String(mode))]\"\n\t\t\t\t>\n\t\t\t\t\t<template v-if=\"userSearchInput.length > 0\">\n\t\t\t\t\t\t<!-- eslint-disable vue/no-v-text-v-html-on-component -->\n\t\t\t\t\t\t<Username\n\t\t\t\t\t\t\tv-for=\"user in users\"\n\t\t\t\t\t\t\t:key=\"user.original.nick + '-search'\"\n\t\t\t\t\t\t\t:on-hover=\"hoverUser\"\n\t\t\t\t\t\t\t:active=\"user.original === activeUser\"\n\t\t\t\t\t\t\t:user=\"user.original\"\n\t\t\t\t\t\t\tv-html=\"user.string\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<!-- eslint-enable -->\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t<Username\n\t\t\t\t\t\t\tv-for=\"user in users\"\n\t\t\t\t\t\t\t:key=\"user.nick\"\n\t\t\t\t\t\t\t:on-hover=\"hoverUser\"\n\t\t\t\t\t\t\t:active=\"user === activeUser\"\n\t\t\t\t\t\t\t:user=\"user\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</div>\n\t</aside>\n</template>\n\n<style lang=\"css\">\n.custom-group-header {\n\tbackground: var(--window-bg-color);\n\tcolor: var(--body-color-muted);\n\tdisplay: flex;\n\tfont-weight: 700;\n\tpadding: 8px 14px 8px 10px;\n\tposition: sticky;\n\ttop: 0;\n\n\t&::before {\n\t\tfont-weight: 900;\n\t\tfont-family: \"Font Awesome 6 Pro\";\n\t\tdisplay: var(--fa-display, inline-block);\n\t\tfont-style: normal;\n\t\tfont-variant: normal;\n\t\ttext-rendering: auto;\n\t\tmargin-right: 6px;\n\t\talign-self: center;\n\t}\n\n\t&::after {\n\t\tcontent: \"\";\n\t\theight: 1px;\n\t\tbackground: currentColor;\n\t\tmargin: 0 0 0 10px;\n\t\topacity: 0.5;\n\t\tflex-grow: 1;\n\t\talign-self: center;\n\t}\n}\n</style>\n\n<script lang=\"ts\">\nimport {filter as fuzzyFilter} from \"fuzzy\";\nimport {computed, defineComponent, nextTick, PropType, ref} from \"vue\";\nimport type {UserInMessage} from \"../../shared/types/msg\";\nimport type {ClientChan, ClientUser} from \"../js/types\";\nimport Username from \"./Username.vue\";\nimport {useStore} from \"../js/store\";\n\nconst modes = {\n\t\"~\": \"owner\",\n\t\"&\": \"admin\",\n\t\"!\": \"admin\",\n\t\"@\": \"op\",\n\t\"%\": \"half-op\",\n\t\"+\": \"voice\",\n\t\"\": \"normal\",\n};\n\nexport default defineComponent({\n\tname: \"ChatUserList\",\n\tcomponents: {\n\t\tUsername,\n\t},\n\tprops: {\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\t\tconst userSearchInput = ref(\"\");\n\t\tconst activeUser = ref<UserInMessage | null>();\n\t\tconst userlist = ref<HTMLDivElement>();\n\n\t\t// Check if we have custom groups from SPGROUPS\n\t\tconst hasCustomGroups = computed(() => {\n\t\t\treturn (\n\t\t\t\tstore.state.settings.enhancedUserListEnabled &&\n\t\t\t\tprops.channel.groups &&\n\t\t\t\tprops.channel.groups.length > 0\n\t\t\t);\n\t\t});\n\n\t\tconst filteredUsers = computed(() => {\n\t\t\tif (!userSearchInput.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn fuzzyFilter(userSearchInput.value, props.channel.users, {\n\t\t\t\tpre: \"<b>\",\n\t\t\t\tpost: \"</b>\",\n\t\t\t\textract: (u) => u.nick,\n\t\t\t});\n\t\t});\n\n\t\t// CSS safe group name cache\n\t\tconst groupNameSlugs = new Map<string, string>();\n\n\t\t// Convert group to CSS-safe name\n\t\tconst slugify = (group: string) => {\n\t\t\tif (groupNameSlugs.has(group)) return;\n\n\t\t\tconst groupNormalized = group.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n\t\t\tconst groupCSSSafe = groupNormalized.replace(/^-|-$/g, \"\");\n\n\t\t\treturn groupNameSlugs.set(group, groupCSSSafe);\n\t\t};\n\n\t\t// Get CSS-safe group name\n\t\tconst getGroupSlug = (group: string) => {\n\t\t\treturn groupNameSlugs.get(group) ?? slugify(group);\n\t\t};\n\n\t\tconst customGroupedUsers = computed(() => {\n\t\t\tconst groups = {};\n\n\t\t\tif (hasCustomGroups.value) {\n\t\t\t\tif (userSearchInput.value && filteredUsers.value) {\n\t\t\t\t\tconst filtered = filteredUsers.value.filter((user) => user.original.nick);\n\n\t\t\t\t\tfor (const {name, users} of props.channel.groups ?? []) {\n\t\t\t\t\t\tgroups[name] ??= [];\n\t\t\t\t\t\tslugify(name);\n\n\t\t\t\t\t\tfor (const user of filtered) {\n\t\t\t\t\t\t\tif (!users.includes(user.original.nick)) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tgroups[name].push(user);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (const {name, users} of props.channel.groups ?? []) {\n\t\t\t\t\t\tgroups[name] ??= [];\n\t\t\t\t\t\tslugify(name);\n\n\t\t\t\t\t\tfor (const user of props.channel.users) {\n\t\t\t\t\t\t\tif (!users.includes(user.nick)) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tgroups[name].push(user);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn groups as {\n\t\t\t\t[group: string]: (ClientUser & {\n\t\t\t\t\toriginal: UserInMessage;\n\t\t\t\t\tstring: string;\n\t\t\t\t})[];\n\t\t\t};\n\t\t});\n\n\t\tconst standardGroupedUsers = computed(() => {\n\t\t\tconst groups = {};\n\n\t\t\tif (!hasCustomGroups.value) {\n\t\t\t\tif (userSearchInput.value && filteredUsers.value) {\n\t\t\t\t\tconst result = filteredUsers.value;\n\n\t\t\t\t\tfor (const user of result) {\n\t\t\t\t\t\tconst mode: string = user.original.modes[0] || \"\";\n\t\t\t\t\t\tgroups[mode] ??= [];\n\n\t\t\t\t\t\t// Prepend user mode to search result\n\t\t\t\t\t\tuser.string = mode + user.string;\n\t\t\t\t\t\tgroups[mode].push(user);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (const user of props.channel.users) {\n\t\t\t\t\t\tconst mode = user.modes[0] || \"\";\n\n\t\t\t\t\t\tgroups[mode] ??= [];\n\t\t\t\t\t\tgroups[mode].push(user);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn groups as {\n\t\t\t\t[mode: string]: (ClientUser & {\n\t\t\t\t\toriginal: UserInMessage;\n\t\t\t\t\tstring: string;\n\t\t\t\t})[];\n\t\t\t};\n\t\t});\n\n\t\tconst groupedUsers = computed(() => {\n\t\t\treturn hasCustomGroups.value ? customGroupedUsers.value : standardGroupedUsers.value;\n\t\t});\n\n\t\tconst setUserSearchInput = (e: Event) => {\n\t\t\tuserSearchInput.value = (e.target as HTMLInputElement).value;\n\t\t};\n\n\t\tconst getModeClass = (mode: string) => {\n\t\t\treturn modes[mode] as typeof modes;\n\t\t};\n\n\t\tconst selectUser = () => {\n\t\t\t// Simulate a click on the active user to open the context menu.\n\t\t\t// Coordinates are provided to position the menu correctly.\n\t\t\tif (!activeUser.value || !userlist.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst el = userlist.value.querySelector(\".active\");\n\n\t\t\tif (!el) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\tconst ev = new MouseEvent(\"click\", {\n\t\t\t\tview: window,\n\t\t\t\tbubbles: true,\n\t\t\t\tcancelable: true,\n\t\t\t\tclientX: rect.left,\n\t\t\t\tclientY: rect.top + rect.height,\n\t\t\t});\n\t\t\tel.dispatchEvent(ev);\n\t\t};\n\n\t\tconst hoverUser = (user: UserInMessage) => {\n\t\t\tactiveUser.value = user;\n\t\t};\n\n\t\tconst removeHoverUser = () => {\n\t\t\tactiveUser.value = null;\n\t\t};\n\n\t\tconst scrollToActiveUser = () => {\n\t\t\t// Scroll the list if needed after the active class is applied\n\t\t\tvoid nextTick(() => {\n\t\t\t\tconst el = userlist.value?.querySelector(\".active\");\n\t\t\t\tel?.scrollIntoView({block: \"nearest\", inline: \"nearest\"});\n\t\t\t});\n\t\t};\n\n\t\tconst navigateUserList = (event: Event, direction: number) => {\n\t\t\t// Prevent propagation to stop global keybind handler from capturing pagedown/pageup\n\t\t\t// and redirecting it to the message list container for scrolling\n\t\t\tevent.stopImmediatePropagation();\n\t\t\tevent.preventDefault();\n\n\t\t\tlet users = props.channel.users;\n\n\t\t\t// Only using filteredUsers when we have to avoids filtering when it's not needed\n\t\t\tif (userSearchInput.value && filteredUsers.value) {\n\t\t\t\tusers = filteredUsers.value.map((result) => result.original);\n\t\t\t}\n\n\t\t\t// Bail out if there's no users to select\n\t\t\tif (!users.length) {\n\t\t\t\tactiveUser.value = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst abort = () => {\n\t\t\t\tactiveUser.value = direction ? users[0] : users[users.length - 1];\n\t\t\t\tscrollToActiveUser();\n\t\t\t};\n\n\t\t\t// If there's no active user select the first or last one depending on direction\n\t\t\tif (!activeUser.value) {\n\t\t\t\tabort();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet currentIndex = users.indexOf(activeUser.value as ClientUser);\n\n\t\t\tif (currentIndex === -1) {\n\t\t\t\tabort();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcurrentIndex += direction;\n\n\t\t\t// Wrap around the list if necessary. Normaly each loop iterates once at most,\n\t\t\t// but might iterate more often if pgup or pgdown are used in a very short user list\n\t\t\twhile (currentIndex < 0) {\n\t\t\t\tcurrentIndex += users.length;\n\t\t\t}\n\n\t\t\twhile (currentIndex > users.length - 1) {\n\t\t\t\tcurrentIndex -= users.length;\n\t\t\t}\n\n\t\t\tactiveUser.value = users[currentIndex];\n\t\t\tscrollToActiveUser();\n\t\t};\n\n\t\treturn {\n\t\t\tfilteredUsers,\n\t\t\tgroupedUsers,\n\t\t\thasCustomGroups,\n\t\t\tuserSearchInput,\n\t\t\tactiveUser,\n\t\t\tuserlist,\n\t\t\tgetGroupSlug,\n\t\t\tsetUserSearchInput,\n\t\t\tgetModeClass,\n\t\t\tselectUser,\n\t\t\thoverUser,\n\t\t\tremoveHoverUser,\n\t\t\tnavigateUserList,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./ChatUserList.vue?vue&type=template&id=09f4e1e4&ts=true\"\nimport script from \"./ChatUserList.vue?vue&type=script&lang=ts\"\nexport * from \"./ChatUserList.vue?vue&type=script&lang=ts\"\n\nimport \"./ChatUserList.vue?vue&type=style&index=0&id=09f4e1e4&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<table class=\"ban-list\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th class=\"hostmask\">Banned</th>\n\t\t\t\t<th class=\"banned_by\">Banned By</th>\n\t\t\t\t<th class=\"banned_at\">Banned At</th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr v-for=\"ban in channel.data as any\" :key=\"ban.hostmask\">\n\t\t\t\t<td class=\"hostmask\"><ParsedMessage :network=\"network\" :text=\"ban.hostmask\" /></td>\n\t\t\t\t<td class=\"banned_by\">{{ ban.banned_by }}</td>\n\t\t\t\t<td class=\"banned_at\">{{ localetime(ban.banned_at) }}</td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</template>\n\n<script lang=\"ts\">\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport localeTime from \"../../js/helpers/localetime\";\nimport {defineComponent, PropType} from \"vue\";\nimport type {ClientNetwork, ClientChan} from \"../../js/types\";\n\nexport default defineComponent({\n\tname: \"ListBans\",\n\tcomponents: {\n\t\tParsedMessage,\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\tsetup() {\n\t\tconst localetime = (date: number | Date) => {\n\t\t\treturn localeTime(date);\n\t\t};\n\n\t\treturn {\n\t\t\tlocaletime,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./ListBans.vue?vue&type=template&id=36cb587c&ts=true\"\nimport script from \"./ListBans.vue?vue&type=script&lang=ts\"\nexport * from \"./ListBans.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<table class=\"invite-list\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th class=\"hostmask\">Invited</th>\n\t\t\t\t<th class=\"invitened_by\">Invited By</th>\n\t\t\t\t<th class=\"invitened_at\">Invited At</th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr v-for=\"invite in channel.data as any\" :key=\"invite.hostmask\">\n\t\t\t\t<td class=\"hostmask\">\n\t\t\t\t\t<ParsedMessage :network=\"network\" :text=\"invite.hostmask\" />\n\t\t\t\t</td>\n\t\t\t\t<td class=\"invitened_by\">{{ invite.invited_by }}</td>\n\t\t\t\t<td class=\"invitened_at\">{{ localetime(invite.invited_at) }}</td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</template>\n\n<script lang=\"ts\">\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport localetime from \"../../js/helpers/localetime\";\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientChan} from \"../../js/types\";\n\nexport default defineComponent({\n\tname: \"ListInvites\",\n\tcomponents: {\n\t\tParsedMessage,\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\tsetup() {\n\t\treturn {\n\t\t\tlocaletime: (date: Date) => localetime(date),\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./ListInvites.vue?vue&type=template&id=082bb5a3&ts=true\"\nimport script from \"./ListInvites.vue?vue&type=script&lang=ts\"\nexport * from \"./ListInvites.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span v-if=\"channelData.text\">{{ channelData.text }} </span>\n\t<table v-else class=\"channel-list\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th class=\"channel\">Channel</th>\n\t\t\t\t<th class=\"users\">Users</th>\n\t\t\t\t<th class=\"topic\">Topic</th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr v-for=\"chan in channelData\" :key=\"chan.channel\">\n\t\t\t\t<td class=\"channel\"><ParsedMessage :network=\"network\" :text=\"chan.channel\" /></td>\n\t\t\t\t<td class=\"users\">{{ chan.num_users }}</td>\n\t\t\t\t<td class=\"topic\"><ParsedMessage :network=\"network\" :text=\"chan.topic\" /></td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientChan, ClientNetwork} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\n\nexport default defineComponent({\n\tname: \"ListChannels\",\n\tcomponents: {\n\t\tParsedMessage,\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\tsetup(props) {\n\t\treturn {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\tchannelData: props.channel.data as any,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./ListChannels.vue?vue&type=template&id=0b45f7bb&ts=true\"\nimport script from \"./ListChannels.vue?vue&type=script&lang=ts\"\nexport * from \"./ListChannels.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<table class=\"ignore-list\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th class=\"hostmask\">Hostmask</th>\n\t\t\t\t<th class=\"when\">Ignored At</th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr v-for=\"user in channel.data as any\" :key=\"user.hostmask\">\n\t\t\t\t<td class=\"hostmask\"><ParsedMessage :network=\"network\" :text=\"user.hostmask\" /></td>\n\t\t\t\t<td class=\"when\">{{ localetime(user.when) }}</td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</template>\n\n<script lang=\"ts\">\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport localetime from \"../../js/helpers/localetime\";\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientChan} from \"../../js/types\";\n\nexport default defineComponent({\n\tname: \"ListIgnored\",\n\tcomponents: {\n\t\tParsedMessage,\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\tsetup() {\n\t\treturn {\n\t\t\tlocaletime,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./ListIgnored.vue?vue&type=template&id=560fe250&ts=true\"\nimport script from \"./ListIgnored.vue?vue&type=script&lang=ts\"\nexport * from \"./ListIgnored.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Chat.vue?vue&type=template&id=03bfba32&ts=true\"\nimport script from \"./Chat.vue?vue&type=script&lang=ts\"\nexport * from \"./Chat.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<Chat\n\t\tv-if=\"activeChannel\"\n\t\t:network=\"activeChannel.network\"\n\t\t:channel=\"activeChannel.channel\"\n\t\t:is-focused=\"parseInt(String(route.query.focused), 10)\"\n\t\t:focused-time=\"parseInt(String(route.query.focusedTime), 10)\"\n\t\t@channel-changed=\"channelChanged\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport {watch, computed, defineComponent, onMounted} from \"vue\";\nimport {useRoute} from \"vue-router\";\nimport {useStore} from \"../js/store\";\nimport {ClientChan} from \"../js/types\";\n\n// Temporary component for routing channels and lobbies\nimport Chat from \"./Chat.vue\";\n\nexport default defineComponent({\n\tname: \"RoutedChat\",\n\tcomponents: {\n\t\tChat,\n\t},\n\tsetup() {\n\t\tconst route = useRoute();\n\t\tconst store = useStore();\n\n\t\tconst activeChannel = computed(() => {\n\t\t\tconst chanId = parseInt(String(route.params.id || \"\"), 10);\n\t\t\tconst channel = store.getters.findChannel(chanId);\n\t\t\treturn channel;\n\t\t});\n\n\t\tconst setActiveChannel = () => {\n\t\t\tif (activeChannel.value) {\n\t\t\t\tstore.commit(\"activeChannel\", activeChannel.value);\n\t\t\t}\n\t\t};\n\n\t\twatch(activeChannel, () => {\n\t\t\tsetActiveChannel();\n\t\t});\n\n\t\tonMounted(() => {\n\t\t\tsetActiveChannel();\n\t\t});\n\n\t\tconst channelChanged = (channel: ClientChan) => {\n\t\t\tconst chanId = channel.id;\n\t\t\tconst chanInStore = store.getters.findChannel(chanId);\n\n\t\t\tif (chanInStore?.channel) {\n\t\t\t\tchanInStore.channel.unread = 0;\n\t\t\t\tchanInStore.channel.highlight = 0;\n\t\t\t}\n\t\t};\n\n\t\treturn {\n\t\t\troute,\n\t\t\tactiveChannel,\n\t\t\tchannelChanged,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./RoutedChat.vue?vue&type=template&id=09d59c3e&ts=true\"\nimport script from \"./RoutedChat.vue?vue&type=script&lang=ts\"\nexport * from \"./RoutedChat.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div>\n\t\t<h2>Messages</h2>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input :checked=\"store.state.settings.motd\" type=\"checkbox\" name=\"motd\" />\n\t\t\t\tShow <abbr title=\"Message Of The Day\">MOTD</abbr>\n\t\t\t</label>\n\t\t</div>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.showSeconds\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"showSeconds\"\n\t\t\t\t/>\n\t\t\t\tInclude seconds in timestamp\n\t\t\t</label>\n\t\t</div>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.use12hClock\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"use12hClock\"\n\t\t\t\t/>\n\t\t\t\tUse 12-hour timestamps\n\t\t\t</label>\n\t\t</div>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.beautifyBridgedMessages\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"beautifyBridgedMessages\"\n\t\t\t\t/>\n\t\t\t\tBeautify supported bridged shoutbox messages\n\t\t\t</label>\n\t\t\t<div role=\"group\" style=\"padding-left: 1.5rem\">\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:disabled=\"!store.state.settings.beautifyBridgedMessages || undefined\"\n\t\t\t\t\t\t:checked=\"store.state.settings.bridgedMessageNicksStyle === 'parentheses'\"\n\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\tname=\"bridgedMessageNicksStyle\"\n\t\t\t\t\t\tvalue=\"parentheses\"\n\t\t\t\t\t/>\n\t\t\t\t\tShow bridged nicknames in parentheses\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\taria-label=\"example: (nick)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:disabled=\"!store.state.settings.beautifyBridgedMessages || undefined\"\n\t\t\t\t\t\t:checked=\"store.state.settings.bridgedMessageNicksStyle === 'normal'\"\n\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\tname=\"bridgedMessageNicksStyle\"\n\t\t\t\t\t\tvalue=\"normal\"\n\t\t\t\t\t/>\n\t\t\t\t\tShow bridged nicknames like a normal user\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\taria-label=\"example: nick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t</div>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.disableMutedUnread\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"disableMutedUnread\"\n\t\t\t\t/>\n\t\t\t\tDon't show unread badges on muted channels\n\t\t\t</label>\n\t\t</div>\n\t\t<template v-if=\"store.state.serverConfiguration?.prefetch\">\n\t\t\t<h2>Link previews</h2>\n\t\t\t<div>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input :checked=\"store.state.settings.media\" type=\"checkbox\" name=\"media\" />\n\t\t\t\t\tAuto-expand media\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input :checked=\"store.state.settings.links\" type=\"checkbox\" name=\"links\" />\n\t\t\t\t\tAuto-expand websites\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t</template>\n\t\t<h2 id=\"label-status-messages\">\n\t\t\tStatus messages\n\t\t\t<span\n\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\taria-label=\"Joins, parts, quits, kicks, nick changes, and mode changes\"\n\t\t\t>\n\t\t\t\t<button class=\"extra-help\" />\n\t\t\t</span>\n\t\t</h2>\n\t\t<div role=\"group\" aria-labelledby=\"label-status-messages\">\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.statusMessages === 'shown'\"\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\tname=\"statusMessages\"\n\t\t\t\t\tvalue=\"shown\"\n\t\t\t\t/>\n\t\t\t\tShow all status messages individually\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.statusMessages === 'condensed'\"\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\tname=\"statusMessages\"\n\t\t\t\t\tvalue=\"condensed\"\n\t\t\t\t/>\n\t\t\t\tCondense status messages together\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.statusMessages === 'hidden'\"\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\tname=\"statusMessages\"\n\t\t\t\t\tvalue=\"hidden\"\n\t\t\t\t/>\n\t\t\t\tHide all status messages\n\t\t\t</label>\n\t\t</div>\n\t\t<h2>Layout</h2>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.enhancedUserListEnabled\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"enhancedUserListEnabled\"\n\t\t\t\t/>\n\t\t\t\tUse enhanced user list when available\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.enhancedContextMenuEnabled\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"enhancedContextMenuEnabled\"\n\t\t\t\t/>\n\t\t\t\tUse enhanced context menu\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.showInputNick\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"showInputNick\"\n\t\t\t\t/>\n\t\t\t\tShow current nick in the input box\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.jumptoEabled\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"jumptoEabled\"\n\t\t\t\t/>\n\t\t\t\tEnable \"Jump to\" in sidebar\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.filterdmsEnabled\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"filterdmsEnabled\"\n\t\t\t\t/>\n\t\t\t\tEnable \"Filter DMs\" in DM section\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.showAllDMs\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"showAllDMs\"\n\t\t\t\t/>\n\t\t\t\tAlways show all DM channels in sidebar\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.compactSidebar\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"compactSidebar\"\n\t\t\t\t/>\n\t\t\t\tUse compact sidebar on Desktop\n\t\t\t</label>\n\t\t</div>\n\t\t<h2>Visual Aids</h2>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.coloredNicks\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"coloredNicks\"\n\t\t\t\t/>\n\t\t\t\tEnable colored nicknames\n\t\t\t</label>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.autocomplete\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"autocomplete\"\n\t\t\t\t/>\n\t\t\t\tEnable autocomplete\n\t\t\t</label>\n\t\t</div>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<label for=\"nickPostfix\" class=\"opt\">\n\t\t\t\t\tNick autocomplete postfix\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\taria-label=\"Nick autocomplete postfix (for example a comma)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"nickPostfix\"\n\t\t\t\t\t:value=\"store.state.settings.nickPostfix\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tname=\"nickPostfix\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tplaceholder=\"Nick autocomplete postfix (e.g. ', ')\"\n\t\t\t\t/>\n\t\t\t</label>\n\t\t</div>\n\n\t\t<h2>Theme</h2>\n\t\t<div>\n\t\t\t<label for=\"theme-select\" class=\"sr-only\">Theme</label>\n\t\t\t<select\n\t\t\t\tid=\"theme-select\"\n\t\t\t\t:value=\"store.state.settings.theme\"\n\t\t\t\tname=\"theme\"\n\t\t\t\tclass=\"input\"\n\t\t\t>\n\t\t\t\t<option\n\t\t\t\t\tv-for=\"theme in store.state.serverConfiguration?.themes\"\n\t\t\t\t\t:key=\"theme.name\"\n\t\t\t\t\t:value=\"theme.name\"\n\t\t\t\t>\n\t\t\t\t\t{{ theme.displayName }}\n\t\t\t\t</option>\n\t\t\t</select>\n\t\t</div>\n\n\t\t<div>\n\t\t\t<h2>Custom Stylesheet</h2>\n\t\t\t<label for=\"user-specified-css-input\" class=\"sr-only\">\n\t\t\t\tCustom stylesheet. You can override any style with CSS here.\n\t\t\t</label>\n\t\t\t<textarea\n\t\t\t\tid=\"user-specified-css-input\"\n\t\t\t\t:value=\"store.state.settings.userStyles\"\n\t\t\t\tclass=\"input\"\n\t\t\t\tname=\"userStyles\"\n\t\t\t\tplaceholder=\"/* You can override any style with CSS here */\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\ntextarea#user-specified-css-input {\n\theight: 100px;\n}\n</style>\n\n<script lang=\"ts\">\nimport {defineComponent} from \"vue\";\nimport {useStore} from \"../../js/store\";\n\nexport default defineComponent({\n\tname: \"AppearanceSettings\",\n\tsetup() {\n\t\tconst store = useStore();\n\t\treturn {\n\t\t\tstore,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./Appearance.vue?vue&type=template&id=828a95a0&ts=true\"\nimport script from \"./Appearance.vue?vue&type=script&lang=ts\"\nexport * from \"./Appearance.vue?vue&type=script&lang=ts\"\n\nimport \"./Appearance.vue?vue&type=style&index=0&id=828a95a0&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div>\n\t\t<div v-if=\"canRegisterProtocol || hasInstallPromptEvent\">\n\t\t\t<h2>Native app</h2>\n\t\t\t<button\n\t\t\t\tv-if=\"hasInstallPromptEvent\"\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"btn\"\n\t\t\t\t@click.prevent=\"nativeInstallPrompt\"\n\t\t\t>\n\t\t\t\tAdd The Lounge to Home screen\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\tv-if=\"canRegisterProtocol\"\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"btn\"\n\t\t\t\t@click.prevent=\"registerProtocol\"\n\t\t\t>\n\t\t\t\tOpen irc:// URLs with The Lounge\n\t\t\t</button>\n\t\t</div>\n\t\t<div v-if=\"store.state.serverConfiguration?.fileUpload\">\n\t\t\t<h2>File uploads</h2>\n\t\t\t<div>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"store.state.settings.uploadCanvas\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"uploadCanvas\"\n\t\t\t\t\t/>\n\t\t\t\t\tAttempt to remove metadata from images before uploading\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\taria-label=\"This option renders the image into a canvas element to remove metadata from the image.\n\tThis may break orientation if your browser does not support that.\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-if=\"store.state.settings.searchEnabled\">\n\t\t\t<h2>Enhanced search</h2>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.enableEnhancedSearch\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"enableEnhancedSearch\"\n\t\t\t\t/>\n\t\t\t\tEnable enhanced search with 'Jump to message'\n\t\t\t</label>\n\t\t</div>\n\t\t<div v-if=\"store.state.settings.searchEnabled\">\n\t\t\t<h2>Input</h2>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.enableRainbowHotkey\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"enableRainbowHotkey\"\n\t\t\t\t/>\n\t\t\t\tEnable rainbow messages with 'Ctrl+R' hotkey\n\t\t\t\t<span\n\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\taria-label=\"You can still use rainbow text with '/rainbow' or '/rgb'\"\n\t\t\t\t>\n\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t</div>\n\t\t<div v-if=\"!store.state.serverConfiguration?.public\">\n\t\t\t<h2>Settings synchronisation</h2>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.syncSettings\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"syncSettings\"\n\t\t\t\t/>\n\t\t\t\tSynchronize settings with other clients\n\t\t\t</label>\n\t\t\t<template v-if=\"!store.state.settings.syncSettings\">\n\t\t\t\t<div v-if=\"store.state.serverHasSettings\" class=\"settings-sync-panel\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\t<strong>Warning:</strong> Checking this box will override the settings of\n\t\t\t\t\t\tthis client with those stored on the server.\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tUse the button below to enable synchronization, and override any settings\n\t\t\t\t\t\talready synced to the server.\n\t\t\t\t\t</p>\n\t\t\t\t\t<button type=\"button\" class=\"btn btn-small\" @click=\"onForceSyncClick\">\n\t\t\t\t\t\tSync settings and enable\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div v-else class=\"settings-sync-panel\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\t<strong>Warning:</strong> No settings have been synced before. Enabling this\n\t\t\t\t\t\twill sync all settings of this client as the base for other clients.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</div>\n\t\t<div v-if=\"!store.state.serverConfiguration?.public\">\n\t\t\t<h2>Automatic away message</h2>\n\n\t\t\t<label class=\"opt\">\n\t\t\t\t<label for=\"awayMessage\" class=\"sr-only\">Automatic away message</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"awayMessage\"\n\t\t\t\t\t:value=\"store.state.settings.awayMessage\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tname=\"awayMessage\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tplaceholder=\"Away message if The Lounge is not open\"\n\t\t\t\t/>\n\t\t\t</label>\n\t\t</div>\n\t</div>\n</template>\n\n<style></style>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, onMounted, ref} from \"vue\";\nimport {useStore} from \"../../js/store\";\nimport {BeforeInstallPromptEvent} from \"../../js/types\";\n\nlet installPromptEvent: BeforeInstallPromptEvent | null = null;\n\nwindow.addEventListener(\"beforeinstallprompt\", (e) => {\n\te.preventDefault();\n\tinstallPromptEvent = e as BeforeInstallPromptEvent;\n});\n\nexport default defineComponent({\n\tname: \"GeneralSettings\",\n\tsetup() {\n\t\tconst store = useStore();\n\t\tconst canRegisterProtocol = ref(false);\n\n\t\tconst hasInstallPromptEvent = computed(() => {\n\t\t\t// TODO: This doesn't hide the button after clicking\n\t\t\treturn installPromptEvent !== null;\n\t\t});\n\n\t\tonMounted(() => {\n\t\t\t// Enable protocol handler registration if supported,\n\t\t\t// and the network configuration is not locked\n\t\t\tcanRegisterProtocol.value =\n\t\t\t\t!!window.navigator.registerProtocolHandler &&\n\t\t\t\t!store.state.serverConfiguration?.lockNetwork;\n\t\t});\n\n\t\tconst nativeInstallPrompt = () => {\n\t\t\tif (!installPromptEvent) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tinstallPromptEvent.prompt().catch((e) => {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(e);\n\t\t\t});\n\n\t\t\tinstallPromptEvent = null;\n\t\t};\n\n\t\tconst onForceSyncClick = () => {\n\t\t\tstore.dispatch(\"settings/syncAll\", true).catch((e) => {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(e);\n\t\t\t});\n\n\t\t\tstore\n\t\t\t\t.dispatch(\"settings/update\", {\n\t\t\t\t\tname: \"syncSettings\",\n\t\t\t\t\tvalue: true,\n\t\t\t\t\tsync: true,\n\t\t\t\t})\n\t\t\t\t.catch((e) => {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t});\n\t\t};\n\n\t\tconst registerProtocol = () => {\n\t\t\tconst uri = document.location.origin + document.location.pathname + \"?uri=%s\";\n\t\t\t// The third argument was deprecated and has been removed from the spec\n\t\t\twindow.navigator.registerProtocolHandler(\"irc\", uri);\n\t\t\twindow.navigator.registerProtocolHandler(\"ircs\", uri);\n\t\t};\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tcanRegisterProtocol,\n\t\t\thasInstallPromptEvent,\n\t\t\tnativeInstallPrompt,\n\t\t\tonForceSyncClick,\n\t\t\tregisterProtocol,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./General.vue?vue&type=template&id=7e6cb977&ts=true\"\nimport script from \"./General.vue?vue&type=script&lang=ts\"\nexport * from \"./General.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div>\n\t\t<div\n\t\t\tv-if=\"\n\t\t\t\t!store.state.serverConfiguration?.public &&\n\t\t\t\t!store.state.serverConfiguration?.ldapEnabled\n\t\t\t\"\n\t\t\tid=\"change-password\"\n\t\t\trole=\"group\"\n\t\t\taria-labelledby=\"label-change-password\"\n\t\t>\n\t\t\t<h2 id=\"label-change-password\">Change password</h2>\n\t\t\t<div class=\"password-container\">\n\t\t\t\t<label for=\"current-password\" class=\"sr-only\"> Enter current password </label>\n\t\t\t\t<RevealPassword v-slot:default=\"slotProps\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"current-password\"\n\t\t\t\t\t\tv-model=\"old_password\"\n\t\t\t\t\t\tautocomplete=\"current-password\"\n\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\tname=\"old_password\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tplaceholder=\"Enter current password\"\n\t\t\t\t\t/>\n\t\t\t\t</RevealPassword>\n\t\t\t</div>\n\t\t\t<div class=\"password-container\">\n\t\t\t\t<label for=\"new-password\" class=\"sr-only\"> Enter desired new password </label>\n\t\t\t\t<RevealPassword v-slot:default=\"slotProps\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"new-password\"\n\t\t\t\t\t\tv-model=\"new_password\"\n\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\tname=\"new_password\"\n\t\t\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tplaceholder=\"Enter desired new password\"\n\t\t\t\t\t/>\n\t\t\t\t</RevealPassword>\n\t\t\t</div>\n\t\t\t<div class=\"password-container\">\n\t\t\t\t<label for=\"new-password-verify\" class=\"sr-only\"> Repeat new password </label>\n\t\t\t\t<RevealPassword v-slot:default=\"slotProps\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"new-password-verify\"\n\t\t\t\t\t\tv-model=\"verify_password\"\n\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\tname=\"verify_password\"\n\t\t\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tplaceholder=\"Repeat new password\"\n\t\t\t\t\t/>\n\t\t\t\t</RevealPassword>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-if=\"passwordChangeStatus && passwordChangeStatus.success\"\n\t\t\t\tclass=\"feedback success\"\n\t\t\t>\n\t\t\t\tSuccessfully updated your password\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-else-if=\"passwordChangeStatus && passwordChangeStatus.error\"\n\t\t\t\tclass=\"feedback error\"\n\t\t\t>\n\t\t\t\t{{ passwordErrors[passwordChangeStatus.error] }}\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<button type=\"submit\" class=\"btn\" @click.prevent=\"changePassword\">\n\t\t\t\t\tChange password\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div v-if=\"!store.state.serverConfiguration?.public\" class=\"session-list\" role=\"group\">\n\t\t\t<h2>Sessions</h2>\n\n\t\t\t<h3>Current session</h3>\n\t\t\t<Session v-if=\"currentSession\" :session=\"currentSession\" />\n\n\t\t\t<template v-if=\"activeSessions.length > 0\">\n\t\t\t\t<h3>active sessions</h3>\n\t\t\t\t<session;\n\t\t\t\t\tv-for=\"session in activeSessions\"\n\t\t\t\t\t:key=\"session.token\"\n\t\t\t\t\t:session=\"session\"\n\t\t\t\t/>\n\t\t\t</template>\n\n\t\t\t<h3>other sessions</h3>\n\t\t\t<p v-if=\"store.state.sessions.length === 0\">loading…</p>\n\t\t\t<p v-else-if=\"otherSessions.length === 0\">\n\t\t\t\t<em>you are not currently logged in to any other device.</em>\n\t\t\t</p>\n\t\t\t<session\n\t\t\t\tv-for=\"session in otherSessions\"\n\t\t\t\tv-else\n\t\t\t\t:key=\"session.token\"\n\t\t\t\t:session=\"session\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport socket from \"../../js/socket\";\nimport RevealPassword from \"../RevealPassword.vue\";\nimport Session from \"../Session.vue\";\nimport {computed, defineComponent, onMounted, ref} from \"vue\";\nimport {useStore} from \"../../js/store\";\n\nexport default defineComponent({\n\tname: \"UserSettings\",\n\tcomponents: {\n\t\tRevealPassword,\n\t\tSession,\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\n\t\tconst passwordErrors = {\n\t\t\tmissing_fields: \"Please fill in all fields\",\n\t\t\tpassword_mismatch: \"Both new password fields must match\",\n\t\t\tpassword_incorrect: \"The current password field does not match your account password\",\n\t\t\tupdate_failed: \"Failed to update your password\",\n\t\t};\n\n\t\ttype PasswordChangeResponse = {\n\t\t\tsuccess: boolean;\n\t\t\terror: keyof typeof passwordErrors;\n\t\t};\n\n\t\tconst passwordChangeStatus = ref<PasswordChangeResponse>();\n\n\t\tconst old_password = ref(\"\");\n\t\tconst new_password = ref(\"\");\n\t\tconst verify_password = ref(\"\");\n\n\t\tconst currentSession = computed(() => {\n\t\t\treturn store.state.sessions.find((item) => item.current);\n\t\t});\n\n\t\tconst activeSessions = computed(() => {\n\t\t\treturn store.state.sessions.filter((item) => !item.current && item.active > 0);\n\t\t});\n\n\t\tconst otherSessions = computed(() => {\n\t\t\treturn store.state.sessions.filter((item) => !item.current && !item.active);\n\t\t});\n\n\t\tonMounted(() => {\n\t\t\tsocket.emit(\"sessions:get\");\n\t\t});\n\n\t\tconst changePassword = () => {\n\t\t\tconst data = {\n\t\t\t\told_password: old_password.value,\n\t\t\t\tnew_password: new_password.value,\n\t\t\t\tverify_password: verify_password.value,\n\t\t\t};\n\n\t\t\tif (!data.old_password || !data.new_password || !data.verify_password) {\n\t\t\t\tpasswordChangeStatus.value = {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: \"missing_fields\",\n\t\t\t\t};\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (data.new_password !== data.verify_password) {\n\t\t\t\tpasswordChangeStatus.value = {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: \"password_mismatch\",\n\t\t\t\t};\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsocket.once(\"change-password\", (response) => {\n\t\t\t\t// TODO type\n\t\t\t\tpasswordChangeStatus.value = response as PasswordChangeResponse;\n\t\t\t});\n\n\t\t\tsocket.emit(\"change-password\", data);\n\t\t};\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tpasswordChangeStatus,\n\t\t\tpasswordErrors,\n\t\t\tcurrentSession,\n\t\t\tactiveSessions,\n\t\t\totherSessions,\n\t\t\tchangePassword,\n\t\t\told_password,\n\t\t\tnew_password,\n\t\t\tverify_password,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<div class=\"session-item\">\n\t\t<div class=\"session-item-info\">\n\t\t\t<strong>{{ session.agent }}</strong>\n\n\t\t\t<a :href=\"'https://ipinfo.io/' + session.ip\" target=\"_blank\" rel=\"noopener\">\n\t\t\t\t{{ session.ip }}\n\t\t\t</a>\n\n\t\t\t<p v-if=\"session.active > 1\" class=\"session-usage\">\n\t\t\t\tActive in {{ session.active }} browsers\n\t\t\t</p>\n\t\t\t<p v-else-if=\"!session.current && !session.active\" class=\"session-usage\">\n\t\t\t\tLast used on <time>{{ lastUse }} </time>\n\t\t\t</p>\n\t\t</div>\n\t\t<div class=\"session-item-btn\">\n\t\t\t<button class=\"btn\" @click.prevent=\"signOut\">\n\t\t\t\t<template v-if=\"session.current\">Sign out</template>\n\t\t\t\t<template v-else>Revoke</template>\n\t\t\t</button>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.session-list .session-item {\n\tdisplay: flex;\n\tfont-size: 14px;\n}\n\n.session-list .session-item-info {\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex-grow: 1;\n}\n\n.session-list .session-item-btn {\n\tflex-shrink: 0;\n}\n\n.session-list .session-usage {\n\tfont-style: italic;\n\tcolor: var(--body-color-muted);\n}\n</style>\n\n<script lang=\"ts\">\nimport {computed, defineComponent, PropType} from \"vue\";\nimport localetime from \"../js/helpers/localetime\";\nimport Auth from \"../js/auth\";\nimport socket from \"../js/socket\";\nimport {ClientSession} from \"../js/store\";\n\nexport default defineComponent({\n\tname: \"Session\",\n\tprops: {\n\t\tsession: {\n\t\t\ttype: Object as PropType<ClientSession>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst lastUse = computed(() => {\n\t\t\treturn localetime(props.session.lastUse);\n\t\t});\n\n\t\tconst signOut = () => {\n\t\t\tif (!props.session.current) {\n\t\t\t\tsocket.emit(\"sign-out\", props.session.token);\n\t\t\t} else {\n\t\t\t\tsocket.emit(\"sign-out\");\n\t\t\t\tAuth.signout();\n\t\t\t}\n\t\t};\n\n\t\treturn {\n\t\t\tlastUse,\n\t\t\tsignOut,\n\t\t};\n\t},\n});\n</script>\n","// This is a thin wrapper around `window.location`, in order to contain the\n// side-effects. Do not add logic to it as it cannot be tested, only mocked.\nexport default {\n\treload() {\n\t\twindow.location.reload();\n\t},\n};\n","import storage from \"./localStorage\";\nimport location from \"./location\";\n\nexport default class Auth {\n\tstatic signout() {\n\t\tstorage.clear();\n\t\tlocation.reload();\n\t}\n}\n","import { render } from \"./Session.vue?vue&type=template&id=079a21f1&ts=true\"\nimport script from \"./Session.vue?vue&type=script&lang=ts\"\nexport * from \"./Session.vue?vue&type=script&lang=ts\"\n\nimport \"./Session.vue?vue&type=style&index=0&id=079a21f1&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Account.vue?vue&type=template&id=f0edddd0&ts=true\"\nimport script from \"./Account.vue?vue&type=script&lang=ts\"\nexport * from \"./Account.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div>\n\t\t<template v-if=\"!store.state.serverConfiguration?.public\">\n\t\t\t<h2>Push Notifications</h2>\n\t\t\t<div>\n\t\t\t\t<button\n\t\t\t\t\tid=\"pushNotifications\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"btn\"\n\t\t\t\t\t:disabled=\"\n\t\t\t\t\t\tstore.state.pushNotificationState !== 'supported' &&\n\t\t\t\t\t\tstore.state.pushNotificationState !== 'subscribed'\n\t\t\t\t\t\"\n\t\t\t\t\t@click=\"onPushButtonClick\"\n\t\t\t\t>\n\t\t\t\t\t<template v-if=\"store.state.pushNotificationState === 'subscribed'\">\n\t\t\t\t\t\tUnsubscribe from push notifications\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-else-if=\"store.state.pushNotificationState === 'loading'\">\n\t\t\t\t\t\tLoading…\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-else> Subscribe to push notifications </template>\n\t\t\t\t</button>\n\t\t\t\t<div v-if=\"store.state.pushNotificationState === 'nohttps'\" class=\"error\">\n\t\t\t\t\t<strong>Warning</strong>: Push notifications are only supported over HTTPS\n\t\t\t\t\tconnections.\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"store.state.pushNotificationState === 'unsupported'\" class=\"error\">\n\t\t\t\t\t<strong>Warning</strong>:\n\t\t\t\t\t<span>Push notifications are not supported by your browser.</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<h2>Browser Notifications</h2>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\tid=\"desktopNotifications\"\n\t\t\t\t\t:checked=\"store.state.settings.desktopNotifications\"\n\t\t\t\t\t:disabled=\"store.state.desktopNotificationState === 'nohttps'\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"desktopNotifications\"\n\t\t\t\t/>\n\t\t\t\tEnable browser notifications<br />\n\t\t\t\t<div v-if=\"store.state.desktopNotificationState === 'unsupported'\" class=\"error\">\n\t\t\t\t\t<strong>Warning</strong>: Notifications are not supported by your browser.\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"store.state.desktopNotificationState === 'nohttps'\"\n\t\t\t\t\tid=\"warnBlockedDesktopNotifications\"\n\t\t\t\t\tclass=\"error\"\n\t\t\t\t>\n\t\t\t\t\t<strong>Warning</strong>: Notifications are only supported over HTTPS\n\t\t\t\t\tconnections.\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"store.state.desktopNotificationState === 'blocked'\"\n\t\t\t\t\tid=\"warnBlockedDesktopNotifications\"\n\t\t\t\t\tclass=\"error\"\n\t\t\t\t>\n\t\t\t\t\t<strong>Warning</strong>: Notifications are blocked by your browser.\n\t\t\t\t</div>\n\t\t\t</label>\n\t\t</div>\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.notification\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"notification\"\n\t\t\t\t/>\n\t\t\t\tEnable notification sound\n\t\t\t</label>\n\t\t</div>\n\t\t<div>\n\t\t\t<div class=\"opt\">\n\t\t\t\t<button id=\"play\" @click.prevent=\"playNotification\">Play sound</button>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div>\n\t\t\t<label class=\"opt\">\n\t\t\t\t<input\n\t\t\t\t\t:checked=\"store.state.settings.notifyAllMessages\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tname=\"notifyAllMessages\"\n\t\t\t\t/>\n\t\t\t\tEnable notification for all messages\n\t\t\t</label>\n\t\t</div>\n\n\t\t<div v-if=\"!store.state.serverConfiguration?.public\">\n\t\t\t<label class=\"opt\">\n\t\t\t\t<label for=\"highlights\" class=\"opt\">\n\t\t\t\t\tCustom highlights\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\taria-label=\"If a message contains any of these comma-separated\nexpressions, it will trigger a highlight.\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"highlights\"\n\t\t\t\t\t:value=\"store.state.settings.highlights\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tname=\"highlights\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\tplaceholder=\"Comma-separated, e.g.: word, some more words, anotherword\"\n\t\t\t\t/>\n\t\t\t</label>\n\t\t</div>\n\n\t\t<div v-if=\"!store.state.serverConfiguration?.public\">\n\t\t\t<label class=\"opt\">\n\t\t\t\t<label for=\"highlightExceptions\" class=\"opt\">\n\t\t\t\t\tHighlight exceptions\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\taria-label=\"If a message contains any of these comma-separated\nexpressions, it will not trigger a highlight even if it contains\nyour nickname or expressions defined in custom highlights.\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"highlightExceptions\"\n\t\t\t\t\t:value=\"store.state.settings.highlightExceptions\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tname=\"highlightExceptions\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\tplaceholder=\"Comma-separated, e.g.: word, some more words, anotherword\"\n\t\t\t\t/>\n\t\t\t</label>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport {computed, defineComponent} from \"vue\";\nimport {useStore} from \"../../js/store\";\nimport webpush from \"../../js/webpush\";\n\nexport default defineComponent({\n\tname: \"NotificationSettings\",\n\tsetup() {\n\t\tconst store = useStore();\n\n\t\tconst isIOS = computed(\n\t\t\t() =>\n\t\t\t\t[\n\t\t\t\t\t\"iPad Simulator\",\n\t\t\t\t\t\"iPhone Simulator\",\n\t\t\t\t\t\"iPod Simulator\",\n\t\t\t\t\t\"iPad\",\n\t\t\t\t\t\"iPhone\",\n\t\t\t\t\t\"iPod\",\n\t\t\t\t].includes(navigator.platform) ||\n\t\t\t\t// iPad on iOS 13 detection\n\t\t\t\t(navigator.userAgent.includes(\"Mac\") && \"ontouchend\" in document)\n\t\t);\n\n\t\tconst playNotification = () => {\n\t\t\tconst pop = new Audio();\n\t\t\tpop.src = \"audio/pop.wav\";\n\n\t\t\t// eslint-disable-next-line\n\t\t\tpop.play();\n\t\t};\n\n\t\tconst onPushButtonClick = () => {\n\t\t\twebpush.togglePushSubscription();\n\t\t};\n\n\t\treturn {\n\t\t\tisIOS,\n\t\t\tstore,\n\t\t\tplayNotification,\n\t\t\tonPushButtonClick,\n\t\t};\n\t},\n});\n</script>\n","import socket from \"./socket\";\nimport {store} from \"./store\";\n\nexport default {togglePushSubscription};\n\nsocket.once(\"push:issubscribed\", function (hasSubscriptionOnServer) {\n\tif (!isAllowedServiceWorkersHost()) {\n\t\tstore.commit(\"pushNotificationState\", \"nohttps\");\n\t\treturn;\n\t}\n\n\tif (!(\"serviceWorker\" in navigator)) {\n\t\treturn;\n\t}\n\n\tnavigator.serviceWorker\n\t\t.register(\"service-worker.js\")\n\t\t.then((registration) => {\n\t\t\tstore.commit(\"hasServiceWorker\");\n\n\t\t\tif (!registration.pushManager) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn registration.pushManager.getSubscription().then((subscription) => {\n\t\t\t\t// If client has push registration but the server knows nothing about it,\n\t\t\t\t// this subscription is broken and client has to register again\n\t\t\t\tif (subscription && hasSubscriptionOnServer === false) {\n\t\t\t\t\tvoid subscription.unsubscribe().then((successful) => {\n\t\t\t\t\t\tstore.commit(\n\t\t\t\t\t\t\t\"pushNotificationState\",\n\t\t\t\t\t\t\tsuccessful ? \"supported\" : \"unsupported\"\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tstore.commit(\n\t\t\t\t\t\t\"pushNotificationState\",\n\t\t\t\t\t\tsubscription ? \"subscribed\" : \"supported\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t})\n\t\t.catch((err) => {\n\t\t\tstore.commit(\"pushNotificationState\", \"unsupported\");\n\t\t\tconsole.error(err); // eslint-disable-line no-console\n\t\t});\n});\n\nfunction togglePushSubscription() {\n\tstore.commit(\"pushNotificationState\", \"loading\");\n\n\tnavigator.serviceWorker.ready\n\t\t.then((registration) =>\n\t\t\tregistration.pushManager.getSubscription().then((existingSubscription) => {\n\t\t\t\tif (existingSubscription) {\n\t\t\t\t\tsocket.emit(\"push:unregister\");\n\n\t\t\t\t\treturn existingSubscription.unsubscribe().then((successful) => {\n\t\t\t\t\t\tstore.commit(\n\t\t\t\t\t\t\t\"pushNotificationState\",\n\t\t\t\t\t\t\tsuccessful ? \"supported\" : \"unsupported\"\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn registration.pushManager\n\t\t\t\t\t.subscribe({\n\t\t\t\t\t\tapplicationServerKey: store.state.serverConfiguration?.applicationServerKey,\n\t\t\t\t\t\tuserVisibleOnly: true,\n\t\t\t\t\t})\n\t\t\t\t\t.then((subscription) => {\n\t\t\t\t\t\tsocket.emit(\"push:register\", subscription.toJSON());\n\t\t\t\t\t\tstore.commit(\"pushNotificationState\", \"subscribed\");\n\t\t\t\t\t\tstore.commit(\"refreshDesktopNotificationState\");\n\t\t\t\t\t});\n\t\t\t})\n\t\t)\n\t\t.catch((err) => {\n\t\t\tstore.commit(\"pushNotificationState\", \"unsupported\");\n\t\t\tstore.commit(\"refreshDesktopNotificationState\");\n\t\t\tconsole.error(err); // eslint-disable-line no-console\n\t\t});\n}\n\nfunction isAllowedServiceWorkersHost() {\n\treturn (\n\t\tlocation.protocol === \"https:\" ||\n\t\tlocation.hostname === \"localhost\" ||\n\t\tlocation.hostname === \"127.0.0.1\"\n\t);\n}\n","import { render } from \"./Notifications.vue?vue&type=template&id=1d0bfea8&ts=true\"\nimport script from \"./Notifications.vue?vue&type=script&lang=ts\"\nexport * from \"./Notifications.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import constants from \"./constants\";\n\nimport {createRouter, createWebHashHistory, type RouteParamsRawGeneric} from \"vue-router\";\nimport SignIn from \"../components/Windows/SignIn.vue\";\nimport Connect from \"../components/Windows/Connect.vue\";\nimport Settings from \"../components/Windows/Settings.vue\";\nimport Help from \"../components/Windows/Help.vue\";\nimport Changelog from \"../components/Windows/Changelog.vue\";\nimport NetworkEdit from \"../components/Windows/NetworkEdit.vue\";\nimport SearchResults from \"../components/Windows/SearchResults.vue\";\nimport RoutedChat from \"../components/RoutedChat.vue\";\nimport {store} from \"./store\";\n\nimport AppearanceSettings from \"../components/Settings/Appearance.vue\";\nimport GeneralSettings from \"../components/Settings/General.vue\";\nimport AccountSettings from \"../components/Settings/Account.vue\";\nimport NotificationSettings from \"../components/Settings/Notifications.vue\";\nimport {ClientChan} from \"./types\";\n\nconst router = createRouter({\n\thistory: createWebHashHistory(),\n\troutes: [\n\t\t{\n\t\t\tname: \"SignIn\",\n\t\t\tpath: \"/sign-in\",\n\t\t\tcomponent: SignIn,\n\t\t\tbeforeEnter(to, from, next) {\n\t\t\t\t// Prevent navigating to sign-in when already signed in\n\t\t\t\tif (store.state.appLoaded) {\n\t\t\t\t\tnext(false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tnext();\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Connect\",\n\t\t\tpath: \"/connect\",\n\t\t\tcomponent: Connect,\n\t\t\tprops: (route) => ({queryParams: route.query}),\n\t\t},\n\t\t{\n\t\t\tpath: \"/settings\",\n\t\t\tcomponent: Settings,\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tname: \"General\",\n\t\t\t\t\tpath: \"\",\n\t\t\t\t\tcomponent: GeneralSettings,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"Appearance\",\n\t\t\t\t\tpath: \"appearance\",\n\t\t\t\t\tcomponent: AppearanceSettings,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"Account\",\n\t\t\t\t\tpath: \"account\",\n\t\t\t\t\tcomponent: AccountSettings,\n\t\t\t\t\tprops: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"Notifications\",\n\t\t\t\t\tpath: \"notifications\",\n\t\t\t\t\tcomponent: NotificationSettings,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tname: \"Help\",\n\t\t\tpath: \"/help\",\n\t\t\tcomponent: Help,\n\t\t},\n\t\t{\n\t\t\tname: \"Changelog\",\n\t\t\tpath: \"/changelog\",\n\t\t\tcomponent: Changelog,\n\t\t},\n\t\t{\n\t\t\tname: \"NetworkEdit\",\n\t\t\tpath: \"/edit-network/:uuid\",\n\t\t\tcomponent: NetworkEdit,\n\t\t},\n\t\t{\n\t\t\tname: \"RoutedChat\",\n\t\t\tpath: \"/chan-:id\",\n\t\t\tcomponent: RoutedChat,\n\t\t},\n\t\t{\n\t\t\tname: \"SearchResults\",\n\t\t\tpath: \"/chan-:id/search\",\n\t\t\tcomponent: SearchResults,\n\t\t},\n\t],\n});\n\nrouter.beforeEach((to, from, next) => {\n\t// If user is not yet signed in, wait for appLoaded state to change\n\t// unless they are trying to open SignIn (which can be triggered in auth.js)\n\tif (!store.state.appLoaded && to.name !== \"SignIn\") {\n\t\tstore.watch(\n\t\t\t(state) => state.appLoaded,\n\t\t\t() => next()\n\t\t);\n\n\t\treturn;\n\t}\n\n\tnext();\n});\n\nrouter.beforeEach((to) => {\n\t// Disallow navigating to non-existing routes\n\tif (!to.matched.length) {\n\t\treturn false;\n\t}\n\n\t// Disallow navigating to invalid channels\n\tif (to.name === \"RoutedChat\" && !store.getters.findChannel(Number(to.params.id))) {\n\t\treturn false;\n\t}\n\n\t// Disallow navigating to invalid networks\n\tif (to.name === \"NetworkEdit\" && !store.getters.findNetwork(String(to.params.uuid))) {\n\t\treturn false;\n\t}\n\n\treturn true;\n});\n\nrouter.afterEach((to) => {\n\tif (store.state.appLoaded) {\n\t\tif (window.innerWidth <= constants.mobileViewportPixels) {\n\t\t\tstore.commit(\"sidebarOpen\", false);\n\t\t}\n\t}\n\n\tif (store.state.activeChannel) {\n\t\tconst channel = store.state.activeChannel.channel;\n\n\t\tif (to.name !== \"RoutedChat\") {\n\t\t\tstore.commit(\"activeChannel\", undefined);\n\t\t}\n\n\t\t// When switching out of a channel, mark everything as read\n\t\tif (channel.messages?.length > 0) {\n\t\t\tchannel.firstUnread = channel.messages[channel.messages.length - 1].id;\n\t\t}\n\n\t\tif (store.state.settings.searchEnabled && store.state.settings.enableEnhancedSearch) {\n\t\t\t// If Enhanced Search is enabled dont truncate messages\n\t\t\t// keep messages in memory for search/navigation purposes\n\t\t} else {\n\t\t\tif (channel.messages?.length > 100) {\n\t\t\t\tchannel.messages.splice(0, channel.messages.length - 100);\n\t\t\t\tchannel.moreHistoryAvailable = true;\n\t\t\t}\n\t\t}\n\t}\n});\n\nasync function navigate(\n\trouteName: string,\n\tparams: RouteParamsRawGeneric = {},\n\tquery: Record<string, string | number> = {}\n) {\n\tif (router.currentRoute.value.name) {\n\t\tawait router.push({name: routeName, params, query});\n\t} else {\n\t\t// If current route is null, replace the history entry\n\t\t// This prevents invalid entries from lingering in history,\n\t\t// and then the route guard preventing proper navigation\n\t\tawait router.replace({name: routeName, params, query}).catch(() => {});\n\t}\n}\n\nfunction switchToChannel(\n\tchannel: ClientChan,\n\tfocusedMessageId?: number,\n\tfocusedMessageTime?: number\n) {\n\tconst query: Record<string, number> = {};\n\n\tif (focusedMessageId) {\n\t\tquery.focused = focusedMessageId;\n\t}\n\n\tif (focusedMessageTime) {\n\t\tquery.focusedTime = focusedMessageTime;\n\t}\n\n\tvoid navigate(\"RoutedChat\", {id: channel.id}, query);\n}\n\nif (\"serviceWorker\" in navigator) {\n\tnavigator.serviceWorker.addEventListener(\"message\", (event) => {\n\t\tif (event.data && event.data.type === \"open\") {\n\t\t\tconst id = parseInt(event.data.channel.substring(5), 10); // remove \"chan-\" prefix\n\n\t\t\tconst channelTarget = store.getters.findChannel(id);\n\n\t\t\tif (channelTarget) {\n\t\t\t\tswitchToChannel(channelTarget.channel);\n\t\t\t}\n\t\t}\n\t});\n}\n\nexport {router, navigate, switchToChannel};\n","<template>\n\t<!-- TODO: move closed style to it's own class -->\n\t<div\n\t\tv-if=\"isChannelVisible\"\n\t\tref=\"element\"\n\t\t:class=\"[\n\t\t\t'channel-list-item',\n\t\t\t{active: active},\n\t\t\t{'parted-channel': channel.type === 'channel' && channel.state === 0},\n\t\t\t{'has-draft': channel.pendingMessage},\n\t\t\t{'has-unread': channel.unread},\n\t\t\t{'has-highlight': channel.highlight},\n\t\t\t{\n\t\t\t\t'not-secure':\n\t\t\t\t\tchannel.type === 'lobby' && network.status.connected && !network.status.secure,\n\t\t\t},\n\t\t\t{'not-connected': channel.type === 'lobby' && !network.status.connected},\n\t\t\t{'is-muted': channel.muted},\n\t\t]\"\n\t\t:aria-label=\"getAriaLabel()\"\n\t\t:title=\"getAriaLabel()\"\n\t\t:data-name=\"channel.name\"\n\t\t:data-type=\"channel.type\"\n\t\t:aria-controls=\"'#chan-' + channel.id\"\n\t\t:aria-selected=\"active\"\n\t\t:style=\"channel.closed ? {transition: 'none', opacity: 0.4} : undefined\"\n\t\trole=\"tab\"\n\t\t@click=\"click\"\n\t\t@contextmenu.prevent=\"openContextMenu\"\n\t>\n\t\t<slot :network=\"network\" :channel=\"channel\" :active-channel=\"activeChannel\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport eventbus from \"../js/eventbus\";\nimport isChannelCollapsed from \"../js/helpers/isChannelCollapsed\";\nimport {ClientNetwork, ClientChan} from \"../js/types\";\nimport {computed, defineComponent, PropType} from \"vue\";\nimport {useStore} from \"../js/store\";\nimport {switchToChannel} from \"../js/router\";\n\nexport default defineComponent({\n\tname: \"ChannelWrapper\",\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tchannel: {\n\t\t\ttype: Object as PropType<ClientChan>,\n\t\t\trequired: true,\n\t\t},\n\t\tactive: Boolean,\n\t\tisFiltering: Boolean,\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\t\tconst activeChannel = computed(() => store.state.activeChannel);\n\t\tconst isChannelVisible = computed(\n\t\t\t() => props.isFiltering || !isChannelCollapsed(props.network, props.channel)\n\t\t);\n\n\t\tconst getAriaLabel = () => {\n\t\t\tconst extra: string[] = [];\n\t\t\tconst type = props.channel.type;\n\n\t\t\tif (props.channel.unread > 0) {\n\t\t\t\tif (props.channel.unread > 1) {\n\t\t\t\t\textra.push(`${props.channel.unread} unread messages`);\n\t\t\t\t} else {\n\t\t\t\t\textra.push(`${props.channel.unread} unread message`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (props.channel.highlight > 0) {\n\t\t\t\tif (props.channel.highlight > 1) {\n\t\t\t\t\textra.push(`${props.channel.highlight} mentions`);\n\t\t\t\t} else {\n\t\t\t\t\textra.push(`${props.channel.highlight} mention`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn `${type}: ${props.channel.name} ${extra.length ? `(${extra.join(\", \")})` : \"\"}`;\n\t\t};\n\n\t\tconst click = () => {\n\t\t\tif (props.isFiltering) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tswitchToChannel(props.channel);\n\t\t};\n\n\t\tconst openContextMenu = (event: MouseEvent) => {\n\t\t\teventbus.emit(\"contextmenu:channel\", {\n\t\t\t\tevent: event,\n\t\t\t\tchannel: props.channel,\n\t\t\t\tnetwork: props.network,\n\t\t\t});\n\t\t};\n\n\t\treturn {\n\t\t\tactiveChannel,\n\t\t\tisChannelVisible,\n\t\t\tgetAriaLabel,\n\t\t\tclick,\n\t\t\topenContextMenu,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./ChannelWrapper.vue?vue&type=template&id=27b55c3c&ts=true\"\nimport script from \"./ChannelWrapper.vue?vue&type=script&lang=ts\"\nexport * from \"./ChannelWrapper.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./NetworkLobby.vue?vue&type=template&id=2fe27d7a&ts=true\"\nimport script from \"./NetworkLobby.vue?vue&type=script&lang=ts\"\nexport * from \"./NetworkLobby.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<!-- TODO: investigate -->\n\t<ChannelWrapper ref=\"wrapper\" v-bind=\"$props\">\n\t\t<span class=\"name\">{{ channel.name }}</span>\n\t\t<span\n\t\t\tv-if=\"\n\t\t\t\tchannel.unread &&\n\t\t\t\t(store.state.settings.disableMutedUnread !== true || !channel.muted)\n\t\t\t\"\n\t\t\t:class=\"{highlight: channel.highlight && !channel.muted}\"\n\t\t\tclass=\"badge\"\n\t\t\t>{{ unreadCount }}\n\t\t</span>\n\t\t<template v-if=\"channel.type === 'channel'\">\n\t\t\t<span\n\t\t\t\tv-if=\"channel.state === 0\"\n\t\t\t\tclass=\"parted-channel-tooltip tooltipped tooltipped-w\"\n\t\t\t\taria-label=\"Not currently joined\"\n\t\t\t>\n\t\t\t\t<span class=\"parted-channel-icon\" />\n\t\t\t</span>\n\t\t\t<span class=\"close-tooltip tooltipped tooltipped-w\" aria-label=\"Leave\">\n\t\t\t\t<button class=\"close\" aria-label=\"Leave\" @click.stop=\"close\" />\n\t\t\t</span>\n\t\t</template>\n\t\t<template v-else>\n\t\t\t<span class=\"close-tooltip tooltipped tooltipped-w\" aria-label=\"Close\">\n\t\t\t\t<button class=\"close\" aria-label=\"Close\" @click.stop=\"close\" />\n\t\t\t</span>\n\t\t</template>\n\t</ChannelWrapper>\n</template>\n\n<script lang=\"ts\">\nimport {PropType, defineComponent, computed} from \"vue\";\nimport roundBadgeNumber from \"../js/helpers/roundBadgeNumber\";\nimport useCloseChannel from \"../js/hooks/use-close-channel\";\nimport {ClientChan, ClientNetwork} from \"../js/types\";\nimport ChannelWrapper from \"./ChannelWrapper.vue\";\nimport {useStore} from \"../js/store\";\n\nexport default defineComponent({\n\tname: \"Channel\",\n\tcomponents: {\n\t\tChannelWrapper,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tchannel: {\n\t\t\ttype: Object as PropType<ClientChan>,\n\t\t\trequired: true,\n\t\t},\n\t\tactive: Boolean,\n\t\tisFiltering: Boolean,\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\t\tconst unreadCount = computed(() => roundBadgeNumber(props.channel.unread));\n\t\tconst close = useCloseChannel(props.channel);\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tunreadCount,\n\t\t\tclose,\n\t\t};\n\t},\n});\n</script>\n","import eventbus from \"../eventbus\";\nimport socket from \"../socket\";\nimport {ClientChan} from \"../types\";\nimport {ChanType} from \"../../../shared/types/chan\";\n\nexport default function useCloseChannel(channel: ClientChan) {\n\treturn () => {\n\t\tif (channel.type === ChanType.LOBBY) {\n\t\t\teventbus.emit(\n\t\t\t\t\"confirm-dialog\",\n\t\t\t\t{\n\t\t\t\t\ttitle: \"Remove network\",\n\t\t\t\t\ttext: `Are you sure you want to quit and remove ${channel.name}? This cannot be undone.`,\n\t\t\t\t\tbutton: \"Remove network\",\n\t\t\t\t},\n\t\t\t\t(result: boolean) => {\n\t\t\t\t\tif (!result) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tchannel.closed = true;\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: Number(channel.id),\n\t\t\t\t\t\ttext: \"/quit\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t);\n\n\t\t\treturn;\n\t\t}\n\n\t\tchannel.closed = true;\n\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: Number(channel.id),\n\t\t\ttext: \"/close\",\n\t\t});\n\t};\n}\n","import { render } from \"./Channel.vue?vue&type=template&id=b4fac96a&ts=true\"\nimport script from \"./Channel.vue?vue&type=script&lang=ts\"\nexport * from \"./Channel.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<form\n\t\t:id=\"'join-channel-' + channel.id\"\n\t\tclass=\"join-form\"\n\t\tmethod=\"post\"\n\t\taction=\"\"\n\t\tautocomplete=\"off\"\n\t\t@keydown.esc.prevent=\"$emit('toggle-join-channel')\"\n\t\t@submit.prevent=\"onSubmit\"\n\t>\n\t\t<input\n\t\t\tv-model=\"inputChannel\"\n\t\t\tv-focus\n\t\t\ttype=\"text\"\n\t\t\tclass=\"input\"\n\t\t\tname=\"channel\"\n\t\t\tplaceholder=\"Channel\"\n\t\t\tpattern=\"[^\\s]+\"\n\t\t\tmaxlength=\"200\"\n\t\t\ttitle=\"The channel name may not contain spaces\"\n\t\t\trequired\n\t\t/>\n\t\t<input\n\t\t\tv-model=\"inputPassword\"\n\t\t\ttype=\"password\"\n\t\t\tclass=\"input\"\n\t\t\tname=\"key\"\n\t\t\tplaceholder=\"Password (optional)\"\n\t\t\tpattern=\"[^\\s]+\"\n\t\t\tmaxlength=\"200\"\n\t\t\ttitle=\"The channel password may not contain spaces\"\n\t\t\tautocomplete=\"new-password\"\n\t\t/>\n\t\t<button type=\"submit\" class=\"btn btn-small\">Join</button>\n\t</form>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType, ref} from \"vue\";\nimport {switchToChannel} from \"../js/router\";\nimport socket from \"../js/socket\";\nimport {useStore} from \"../js/store\";\nimport {ClientNetwork, ClientChan} from \"../js/types\";\n\nexport default defineComponent({\n\tname: \"JoinChannel\",\n\tdirectives: {\n\t\tfocus: {\n\t\t\tmounted: (el: HTMLFormElement) => el.focus(),\n\t\t},\n\t},\n\tprops: {\n\t\tnetwork: {type: Object as PropType<ClientNetwork>, required: true},\n\t\tchannel: {type: Object as PropType<ClientChan>, required: true},\n\t},\n\temits: [\"toggle-join-channel\"],\n\tsetup(props, {emit}) {\n\t\tconst store = useStore();\n\t\tconst inputChannel = ref(\"\");\n\t\tconst inputPassword = ref(\"\");\n\n\t\tconst onSubmit = () => {\n\t\t\tconst existingChannel = store.getters.findChannelOnCurrentNetwork(inputChannel.value);\n\n\t\t\tif (existingChannel) {\n\t\t\t\tswitchToChannel(existingChannel);\n\t\t\t} else {\n\t\t\t\tconst chanTypes = props.network.serverOptions.CHANTYPES;\n\t\t\t\tlet channel = inputChannel.value;\n\n\t\t\t\tif (chanTypes && chanTypes.length > 0 && !chanTypes.includes(channel[0])) {\n\t\t\t\t\tchannel = chanTypes[0] + channel;\n\t\t\t\t}\n\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttext: `/join ${channel} ${inputPassword.value}`,\n\t\t\t\t\ttarget: props.channel.id,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tinputChannel.value = \"\";\n\t\t\tinputPassword.value = \"\";\n\t\t\temit(\"toggle-join-channel\");\n\t\t};\n\n\t\treturn {\n\t\t\tinputChannel,\n\t\t\tinputPassword,\n\t\t\tonSubmit,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./JoinChannel.vue?vue&type=template&id=310e4234&ts=true\"\nimport script from \"./JoinChannel.vue?vue&type=script&lang=ts\"\nexport * from \"./JoinChannel.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div\n\t\tv-if=\"\n\t\t\t(queries.length > 0 && !network.isCollapsed) ||\n\t\t\t(network.isCollapsed && (hasUnread || hasActiveQuery))\n\t\t\"\n\t\tclass=\"dm-section\"\n\t\t:class=\"{collapsed: isCollapsed}\"\n\t>\n\t\t<div\n\t\t\tclass=\"channel-list-item dm-section-header\"\n\t\t\t:class=\"hasUnread ? 'has-unread has-highlight' : ''\"\n\t\t\t:title=\"'Total Queries: ' + queries.length + ' - Total Unread: ' + totalUnreadCount\"\n\t\t\t@click.stop=\"toggleCollapsed\"\n\t\t>\n\t\t\t<span class=\"dm-collapse-icon\" :class=\"{'is-collapsed': isCollapsed}\"></span>\n\t\t\t<span class=\"dm-section-title\">Direct Messages</span>\n\t\t\t<span v-if=\"hasUnread\" class=\"dm-unread-badge highlight badge\">{{\n\t\t\t\ttotalUnreadCount\n\t\t\t}}</span>\n\t\t</div>\n\n\t\t<template v-if=\"!isCollapsed || hasActiveQuery || hasUnread\">\n\t\t\t<div\n\t\t\t\tv-if=\"queries.length > 2 && store.state.settings.filterdmsEnabled && !isCollapsed\"\n\t\t\t\tclass=\"dm-filter\"\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\tref=\"filterInput\"\n\t\t\t\t\tv-model=\"filterText\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tplaceholder=\"Filter DMs...\"\n\t\t\t\t\tclass=\"dm-filter-input input\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<Draggable\n\t\t\t\t:list=\"sortedQueries\"\n\t\t\t\t:delay=\"500\"\n\t\t\t\t:delay-on-touch-only=\"true\"\n\t\t\t\t:touch-start-threshold=\"10\"\n\t\t\t\tdraggable=\".dm-channel-wrapper\"\n\t\t\t\tghost-class=\"ui-sortable-ghost\"\n\t\t\t\tdrag-class=\"ui-sortable-dragging\"\n\t\t\t\t:group=\"uuid\"\n\t\t\t\tclass=\"dm-list\"\n\t\t\t\titem-key=\"id\"\n\t\t\t\t@change=\"onDMSort\"\n\t\t\t>\n\t\t\t\t<template v-slot:item=\"{element: channel}\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"shouldShowChannel(channel)\"\n\t\t\t\t\t\tclass=\"dm-channel-wrapper\"\n\t\t\t\t\t\t:class=\"{'is-pinned': channel.pinned}\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Channel\n\t\t\t\t\t\t\t:key=\"channel.id\"\n\t\t\t\t\t\t\t:data-item=\"channel.id\"\n\t\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t:active=\"\n\t\t\t\t\t\t\t\tstore.state.activeChannel &&\n\t\t\t\t\t\t\t\tchannel === store.state.activeChannel.channel\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t</Draggable>\n\n\t\t\t<div\n\t\t\t\tv-if=\"hasHiddenChannels\"\n\t\t\t\tclass=\"channel-list-item dm-show-more\"\n\t\t\t\t@click=\"showAll = !showAll\"\n\t\t\t>\n\t\t\t\t{{ showAll ? \"Show less\" : `Show ${hiddenCount} more...` }}\n\t\t\t</div>\n\t\t</template>\n\t</div>\n</template>\n\n<style scoped>\n.dm-section {\n\tmargin-top: 4px;\n}\n\n.dm-section-header {\n\tcolor: rgb(255 255 255 / 70%);\n\tuser-select: none;\n}\n\n.dm-collapse-icon {\n\tfont-family: FontAwesome;\n\tmargin: 0 11px 0 2px;\n\tfont-size: initial;\n\twidth: 12px;\n\topacity: 0.8;\n\ttransition: transform 0.2s ease;\n}\n\n.dm-collapse-icon::before {\n\tcontent: \"\\f0d7\"; /* caret-down */\n}\n\n.dm-collapse-icon.is-collapsed::before {\n\tcontent: \"\\f0da\"; /* caret-right */\n}\n\n.dm-section-header:hover .dm-collapse-icon {\n\topacity: 1;\n}\n\n.dm-section-title {\n\tflex-grow: 1;\n\tmargin-right: 5px;\n\toverflow: hidden;\n\tposition: relative;\n\twhite-space: nowrap;\n\tfont-size: 14px;\n\tfont-weight: 700;\n\ttext-transform: capitalize;\n\tmask-image: linear-gradient(270deg, #0000, #000 20px);\n}\n\n.dm-filter {\n\tmargin: 8px;\n\tposition: relative;\n\n\t&::before {\n\t\tbottom: 0;\n\t\tcolor: rgb(255 255 255 / 34.9%);\n\t\tcontent: \"\\f0b0\";\n\t\tfont-family: FontAwesome;\n\t\tline-height: 35px !important;\n\t\tpointer-events: none;\n\t\tposition: absolute;\n\t\tright: 8px;\n\t\ttop: 0;\n\t}\n}\n\n.dm-filter-input {\n\tappearance: none;\n\tbackground-color: rgb(255 255 255 / 10.2%);\n\tborder: 0;\n\tcolor: rgb(255 255 255);\n\tmargin: 0;\n\tpadding-right: 35px;\n\twidth: 100%;\n}\n\n.dm-filter-input::placeholder {\n\tcolor: rgb(255 255 255 / 35%);\n}\n\n.dm-filter-input:focus {\n\toutline: none;\n\tbackground-color: rgb(255 255 255 / 15%);\n}\n\n.dm-list {\n\t/* Inherit channel list styling */\n}\n\n.dm-show-more {\n\tcolor: rgb(255 255 255 / 50%);\n\tfont-size: 0.85em;\n\tjustify-content: center;\n}\n\n/* DM channel wrapper for pinned indicator */\n.dm-channel-wrapper {\n\tposition: relative;\n}\n\n.dm-channel-wrapper.is-pinned :deep(.channel-list-item:not(.has-draft:not(.active))) {\n\tpadding: 8px 14px;\n\n\t/* Pinned indicator, replace message icon */\n\t&::before {\n\t\tcontent: \"\\f08d\";\n\t\trotate: 45deg;\n\t\ttransform: translate(2px, 2px);\n\t}\n}\n</style>\n\n<script lang=\"ts\">\nimport storage from \"../js/localStorage\";\nimport {computed, defineComponent, PropType, ref} from \"vue\";\nimport {filter as fuzzyFilter} from \"fuzzy\";\nimport Draggable from \"./Draggable.vue\";\nimport Channel from \"./Channel.vue\";\nimport socket from \"../js/socket\";\nimport {ClientChan, ClientNetwork} from \"../js/types\";\nimport {useStore} from \"../js/store\";\nimport roundBadgeNumber from \"../js/helpers/roundBadgeNumber\";\n\nexport default defineComponent({\n\tname: \"DirectMessageSection\",\n\tcomponents: {\n\t\tDraggable,\n\t\tChannel,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tqueries: {\n\t\t\ttype: Array as PropType<ClientChan[]>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst uuid = props.network.uuid + \"-dms\";\n\t\tconst PERSISTENT_STORAGE = \"thelounge.directMessages.collapsed\";\n\n\t\tconst getIsCollapsed = () => {\n\t\t\tconst stored = storage.get(PERSISTENT_STORAGE);\n\t\t\tconst directMessages = stored ? new Set(JSON.parse(stored)) : new Set();\n\n\t\t\treturn directMessages.has(uuid);\n\t\t};\n\n\t\tconst store = useStore();\n\t\tconst isCollapsed = ref(getIsCollapsed());\n\t\tconst filterText = ref(\"\");\n\t\tconst showAll = ref(false);\n\t\tconst maxVisible = computed(() =>\n\t\t\tstore.state.settings.showAllDMs ? Number.MAX_SAFE_INTEGER : 5\n\t\t);\n\n\t\tconst hasActiveQuery = computed(() => {\n\t\t\treturn (\n\t\t\t\tprops.queries.find((q) => q.id === store.state.activeChannel?.channel.id) !==\n\t\t\t\tundefined\n\t\t\t);\n\t\t});\n\n\t\t// Count of unique conversations with unread messages (not total lines)\n\t\t// Skip muted channels - they shouldn't contribute to the unread badge\n\t\tconst hasUnread = computed(() => {\n\t\t\treturn props.queries.filter((q) => q.unread > 0 && !q.muted).length > 0;\n\t\t});\n\t\tconst totalUnreadCount = computed(() => {\n\t\t\treturn roundBadgeNumber(props.queries.filter((q) => q.unread > 0 && !q.muted).length);\n\t\t});\n\n\t\tconst filteredQueries = computed(() => {\n\t\t\tif (!filterText.value) {\n\t\t\t\treturn props.queries;\n\t\t\t}\n\n\t\t\tconst results = fuzzyFilter(filterText.value, props.queries, {\n\t\t\t\textract: (q) => q.name,\n\t\t\t});\n\n\t\t\treturn results.map((r) => r.original);\n\t\t});\n\n\t\tconst sortedQueries = computed(() => {\n\t\t\tconst queries = [...filteredQueries.value];\n\n\t\t\t// Sort: pinned first, then by unread, then by name\n\t\t\treturn queries.sort((a, b) => {\n\t\t\t\t// Pinned always first\n\t\t\t\tif (a.pinned && !b.pinned) return -1;\n\t\t\t\tif (!a.pinned && b.pinned) return 1;\n\n\t\t\t\t// Then by unread status\n\t\t\t\tif (a.unread > 0 && b.unread === 0) return -1;\n\t\t\t\tif (a.unread === 0 && b.unread > 0) return 1;\n\n\t\t\t\t// Then alphabetically\n\t\t\t\treturn a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n\t\t\t});\n\t\t});\n\n\t\tconst visibleQueries = computed(() => {\n\t\t\tif (showAll.value || filterText.value) {\n\t\t\t\treturn sortedQueries.value;\n\t\t\t}\n\n\t\t\t// Always show pinned + unread + up to maxVisible\n\t\t\tconst pinned = sortedQueries.value.filter((q) => q.pinned);\n\t\t\tconst unread = sortedQueries.value.filter((q) => !q.pinned && q.unread > 0);\n\t\t\tconst rest = sortedQueries.value.filter((q) => !q.pinned && q.unread === 0);\n\n\t\t\tconst remaining = maxVisible.value - pinned.length - unread.length;\n\n\t\t\tif (remaining <= 0) {\n\t\t\t\treturn [...pinned, ...unread];\n\t\t\t}\n\n\t\t\treturn [...pinned, ...unread, ...rest.slice(0, remaining)];\n\t\t});\n\n\t\tconst hiddenCount = computed(() => {\n\t\t\treturn sortedQueries.value.length - visibleQueries.value.length;\n\t\t});\n\n\t\tconst hasHiddenChannels = computed(() => {\n\t\t\treturn hiddenCount.value > 0 && !filterText.value;\n\t\t});\n\n\t\tconst shouldShowChannel = (channel: ClientChan) => {\n\t\t\tif (isCollapsed.value && channel.highlight) return true;\n\t\t\tif (isCollapsed.value && !channel.highlight) return false;\n\n\t\t\treturn visibleQueries.value.includes(channel);\n\t\t};\n\n\t\tconst toggleCollapsed = () => {\n\t\t\tisCollapsed.value = !isCollapsed.value;\n\n\t\t\tconst stored = storage.get(PERSISTENT_STORAGE);\n\t\t\tconst directMessages = stored ? new Set(JSON.parse(stored)) : new Set();\n\n\t\t\tif (isCollapsed.value) {\n\t\t\t\tdirectMessages.add(uuid);\n\t\t\t} else {\n\t\t\t\tdirectMessages.delete(uuid);\n\t\t\t}\n\n\t\t\tstorage.set(PERSISTENT_STORAGE, JSON.stringify([...directMessages]));\n\t\t};\n\n\t\tconst onDMSort = (e: {oldIndex?: number; newIndex?: number}) => {\n\t\t\tconst {oldIndex, newIndex} = e;\n\n\t\t\tif (oldIndex === undefined || newIndex === undefined || oldIndex === newIndex) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Emit sort event to server\n\t\t\tsocket.emit(\"sort:channels\", {\n\t\t\t\tnetwork: props.network.uuid,\n\t\t\t\torder: props.network.channels.map((c) => c.id),\n\t\t\t});\n\t\t};\n\n\t\treturn {\n\t\t\tuuid,\n\t\t\tstore,\n\t\t\tisCollapsed,\n\t\t\tfilterText,\n\t\t\tshowAll,\n\t\t\thasUnread,\n\t\t\ttotalUnreadCount,\n\t\t\tsortedQueries,\n\t\t\thiddenCount,\n\t\t\thasActiveQuery,\n\t\t\thasHiddenChannels,\n\t\t\tshouldShowChannel,\n\t\t\ttoggleCollapsed,\n\t\t\tonDMSort,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./DirectMessageSection.vue?vue&type=template&id=e4cbcea8&scoped=true&ts=true\"\nimport script from \"./DirectMessageSection.vue?vue&type=script&lang=ts\"\nexport * from \"./DirectMessageSection.vue?vue&type=script&lang=ts\"\n\nimport \"./DirectMessageSection.vue?vue&type=style&index=0&id=e4cbcea8&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-e4cbcea8\"]])\n\nexport default __exports__","function distance([x1, y1]: [number, number], [x2, y2]: [number, number]) {\n\treturn Math.hypot(x1 - x2, y1 - y2);\n}\n\nexport default distance;\n","import { render } from \"./NetworkList.vue?vue&type=template&id=4376ebeb&ts=true\"\nimport script from \"./NetworkList.vue?vue&type=script&lang=ts\"\nexport * from \"./NetworkList.vue?vue&type=script&lang=ts\"\n\nimport \"./NetworkList.vue?vue&type=style&index=0&id=4376ebeb&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Sidebar.vue?vue&type=template&id=c75840d6&ts=true\"\nimport script from \"./Sidebar.vue?vue&type=script&lang=ts\"\nexport * from \"./Sidebar.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div\n\t\tid=\"image-viewer\"\n\t\tref=\"viewer\"\n\t\t:class=\"{opened: link !== null}\"\n\t\t@wheel=\"onMouseWheel\"\n\t\t@touchstart.passive=\"onTouchStart\"\n\t\t@click=\"onClick\"\n\t>\n\t\t<template v-if=\"link !== null\">\n\t\t\t<button class=\"close-btn\" aria-label=\"Close\"></button>\n\n\t\t\t<button\n\t\t\t\tv-if=\"previousImage\"\n\t\t\t\tclass=\"previous-image-btn\"\n\t\t\t\taria-label=\"Previous image\"\n\t\t\t\t@click.stop=\"previous\"\n\t\t\t></button>\n\t\t\t<button\n\t\t\t\tv-if=\"nextImage\"\n\t\t\t\tclass=\"next-image-btn\"\n\t\t\t\taria-label=\"Next image\"\n\t\t\t\t@click.stop=\"next\"\n\t\t\t></button>\n\n\t\t\t<a class=\"open-btn\" :href=\"link.link\" target=\"_blank\" rel=\"noopener\"></a>\n\n\t\t\t<img\n\t\t\t\tref=\"image\"\n\t\t\t\t:src=\"link.thumb\"\n\t\t\t\talt=\"\"\n\t\t\t\t:style=\"computeImageStyles\"\n\t\t\t\t@load=\"onImageLoad\"\n\t\t\t\t@mousedown=\"onImageMouseDown\"\n\t\t\t\t@touchstart.passive=\"onImageTouchStart\"\n\t\t\t/>\n\t\t</template>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport Mousetrap from \"mousetrap\";\nimport {computed, defineComponent, ref, watch} from \"vue\";\nimport eventbus from \"../js/eventbus\";\nimport {ClientChan, ClientLinkPreview} from \"../js/types\";\nimport {SharedMsg} from \"../../shared/types/msg\";\n\nexport default defineComponent({\n\tname: \"ImageViewer\",\n\tsetup() {\n\t\tconst viewer = ref<HTMLDivElement>();\n\t\tconst image = ref<HTMLImageElement>();\n\n\t\tconst link = ref<ClientLinkPreview | null>(null);\n\t\tconst previousImage = ref<ClientLinkPreview | null>();\n\t\tconst nextImage = ref<ClientLinkPreview | null>();\n\t\tconst channel = ref<ClientChan | null>();\n\n\t\tconst position = ref<{\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t}>({\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t});\n\n\t\tconst transform = ref<{\n\t\t\tscale: number;\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t}>({\n\t\t\tscale: 1,\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t});\n\n\t\tconst computeImageStyles = computed(() => {\n\t\t\t// Sub pixels may cause the image to blur in certain browsers\n\t\t\t// round it down to prevent that\n\t\t\tconst transformX = Math.floor(transform.value.x);\n\t\t\tconst transformY = Math.floor(transform.value.y);\n\n\t\t\treturn {\n\t\t\t\tleft: `${position.value.x}px`,\n\t\t\t\ttop: `${position.value.y}px`,\n\t\t\t\ttransform: `translate3d(${transformX}px, ${transformY}px, 0) scale3d(${transform.value.scale}, ${transform.value.scale}, 1)`,\n\t\t\t};\n\t\t});\n\n\t\tconst closeViewer = () => {\n\t\t\tif (link.value === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tchannel.value = null;\n\t\t\tpreviousImage.value = null;\n\t\t\tnextImage.value = null;\n\t\t\tlink.value = null;\n\t\t};\n\n\t\tconst setPrevNextImages = () => {\n\t\t\tif (!channel.value || !link.value) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst links = channel.value.messages\n\t\t\t\t.map((msg: SharedMsg) => msg.previews)\n\t\t\t\t.flat()\n\t\t\t\t.filter((preview) => preview && preview.thumb);\n\n\t\t\tconst currentIndex = links.indexOf(link.value);\n\n\t\t\tpreviousImage.value = links[currentIndex - 1] || null;\n\t\t\tnextImage.value = links[currentIndex + 1] || null;\n\t\t};\n\n\t\tconst previous = () => {\n\t\t\tif (previousImage.value) {\n\t\t\t\tlink.value = previousImage.value;\n\t\t\t}\n\t\t};\n\n\t\tconst next = () => {\n\t\t\tif (nextImage.value) {\n\t\t\t\tlink.value = nextImage.value;\n\t\t\t}\n\t\t};\n\n\t\tconst prepareImage = () => {\n\t\t\tconst viewerEl = viewer.value;\n\t\t\tconst imageEl = image.value;\n\n\t\t\tif (!viewerEl || !imageEl) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst width = viewerEl.offsetWidth;\n\t\t\tconst height = viewerEl.offsetHeight;\n\t\t\tconst scale = Math.min(1, width / imageEl.width, height / imageEl.height);\n\n\t\t\tposition.value.x = Math.floor(-image.value!.naturalWidth / 2);\n\t\t\tposition.value.y = Math.floor(-image.value!.naturalHeight / 2);\n\t\t\ttransform.value.scale = Math.max(scale, 0.1);\n\t\t\ttransform.value.x = width / 2;\n\t\t\ttransform.value.y = height / 2;\n\t\t};\n\n\t\tconst onImageLoad = () => {\n\t\t\tprepareImage();\n\t\t};\n\n\t\tconst calculateZoomShift = (newScale: number, x: number, y: number, oldScale: number) => {\n\t\t\tif (!image.value || !viewer.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst imageWidth = image.value.width;\n\t\t\tconst centerX = viewer.value.offsetWidth / 2;\n\t\t\tconst centerY = viewer.value.offsetHeight / 2;\n\n\t\t\treturn {\n\t\t\t\tx:\n\t\t\t\t\tcenterX -\n\t\t\t\t\t((centerX - (y - (imageWidth * x) / 2)) / x) * newScale +\n\t\t\t\t\t(imageWidth * newScale) / 2,\n\t\t\t\ty:\n\t\t\t\t\tcenterY -\n\t\t\t\t\t((centerY - (oldScale - (imageWidth * x) / 2)) / x) * newScale +\n\t\t\t\t\t(imageWidth * newScale) / 2,\n\t\t\t};\n\t\t};\n\n\t\tconst correctPosition = () => {\n\t\t\tconst imageEl = image.value;\n\t\t\tconst viewerEl = viewer.value;\n\n\t\t\tif (!imageEl || !viewerEl) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst widthScaled = imageEl.width * transform.value.scale;\n\t\t\tconst heightScaled = imageEl.height * transform.value.scale;\n\t\t\tconst containerWidth = viewerEl.offsetWidth;\n\t\t\tconst containerHeight = viewerEl.offsetHeight;\n\n\t\t\tif (widthScaled < containerWidth) {\n\t\t\t\ttransform.value.x = containerWidth / 2;\n\t\t\t} else if (transform.value.x - widthScaled / 2 > 0) {\n\t\t\t\ttransform.value.x = widthScaled / 2;\n\t\t\t} else if (transform.value.x + widthScaled / 2 < containerWidth) {\n\t\t\t\ttransform.value.x = containerWidth - widthScaled / 2;\n\t\t\t}\n\n\t\t\tif (heightScaled < containerHeight) {\n\t\t\t\ttransform.value.y = containerHeight / 2;\n\t\t\t} else if (transform.value.y - heightScaled / 2 > 0) {\n\t\t\t\ttransform.value.y = heightScaled / 2;\n\t\t\t} else if (transform.value.y + heightScaled / 2 < containerHeight) {\n\t\t\t\ttransform.value.y = containerHeight - heightScaled / 2;\n\t\t\t}\n\t\t};\n\n\t\t// Reduce multiple touch points into a single x/y/scale\n\t\tconst reduceTouches = (touches: TouchList) => {\n\t\t\tlet totalX = 0;\n\t\t\tlet totalY = 0;\n\t\t\tlet totalScale = 0;\n\n\t\t\tfor (let i = 0; i < touches.length; i++) {\n\t\t\t\tconst x = touches[i].clientX;\n\t\t\t\tconst y = touches[i].clientY;\n\n\t\t\t\ttotalX += x;\n\t\t\t\ttotalY += y;\n\n\t\t\t\tfor (let i2 = 0; i2 < touches.length; i2++) {\n\t\t\t\t\tif (i !== i2) {\n\t\t\t\t\t\tconst x2 = touches[i2].clientX;\n\t\t\t\t\t\tconst y2 = touches[i2].clientY;\n\t\t\t\t\t\ttotalScale += Math.sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (totalScale === 0) {\n\t\t\t\ttotalScale = 1;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tx: totalX / touches.length,\n\t\t\t\ty: totalY / touches.length,\n\t\t\t\tscale: totalScale / touches.length,\n\t\t\t};\n\t\t};\n\n\t\tconst onTouchStart = (e: TouchEvent) => {\n\t\t\t// prevent sidebar touchstart event, we don't want to interact with sidebar while in image viewer\n\t\t\te.stopImmediatePropagation();\n\t\t};\n\n\t\t// Touch image manipulation:\n\t\t// 1. Move around by dragging it with one finger\n\t\t// 2. Change image scale by using two fingers\n\t\tconst onImageTouchStart = (e: TouchEvent) => {\n\t\t\tconst img = image.value;\n\t\t\tlet touch = reduceTouches(e.touches);\n\t\t\tlet currentTouches = e.touches;\n\t\t\tlet touchEndFingers = 0;\n\n\t\t\tconst currentTransform = {\n\t\t\t\tx: touch.x,\n\t\t\t\ty: touch.y,\n\t\t\t\tscale: touch.scale,\n\t\t\t};\n\n\t\t\tconst startTransform = {\n\t\t\t\tx: transform.value.x,\n\t\t\t\ty: transform.value.y,\n\t\t\t\tscale: transform.value.scale,\n\t\t\t};\n\n\t\t\tconst touchMove = (moveEvent) => {\n\t\t\t\ttouch = reduceTouches(moveEvent.touches);\n\n\t\t\t\tif (currentTouches.length !== moveEvent.touches.length) {\n\t\t\t\t\tcurrentTransform.x = touch.x;\n\t\t\t\t\tcurrentTransform.y = touch.y;\n\t\t\t\t\tcurrentTransform.scale = touch.scale;\n\t\t\t\t\tstartTransform.x = transform.value.x;\n\t\t\t\t\tstartTransform.y = transform.value.y;\n\t\t\t\t\tstartTransform.scale = transform.value.scale;\n\t\t\t\t}\n\n\t\t\t\tconst deltaX = touch.x - currentTransform.x;\n\t\t\t\tconst deltaY = touch.y - currentTransform.y;\n\t\t\t\tconst deltaScale = touch.scale / currentTransform.scale;\n\t\t\t\tcurrentTouches = moveEvent.touches;\n\t\t\t\ttouchEndFingers = 0;\n\n\t\t\t\tconst newScale = Math.min(3, Math.max(0.1, startTransform.scale * deltaScale));\n\n\t\t\t\tconst fixedPosition = calculateZoomShift(\n\t\t\t\t\tnewScale,\n\t\t\t\t\tstartTransform.scale,\n\t\t\t\t\tstartTransform.x,\n\t\t\t\t\tstartTransform.y\n\t\t\t\t);\n\n\t\t\t\tif (!fixedPosition) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttransform.value.x = fixedPosition.x + deltaX;\n\t\t\t\ttransform.value.y = fixedPosition.y + deltaY;\n\t\t\t\ttransform.value.scale = newScale;\n\t\t\t\tcorrectPosition();\n\t\t\t};\n\n\t\t\tconst touchEnd = (endEvent: TouchEvent) => {\n\t\t\t\tconst changedTouches = endEvent.changedTouches.length;\n\n\t\t\t\tif (currentTouches.length > changedTouches + touchEndFingers) {\n\t\t\t\t\ttouchEndFingers += changedTouches;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// todo: this is swipe to close, but it's not working very well due to unfinished delta calculation\n\t\t\t\t/* if (\n\t\t\t\t\ttransform.value.scale <= 1 &&\n\t\t\t\t\tendEvent.changedTouches[0].clientY - startTransform.y <= -70\n\t\t\t\t) {\n\t\t\t\t\treturn this.closeViewer();\n\t\t\t\t}*/\n\n\t\t\t\tcorrectPosition();\n\n\t\t\t\timg?.removeEventListener(\"touchmove\", touchMove);\n\t\t\t\timg?.removeEventListener(\"touchend\", touchEnd);\n\t\t\t};\n\n\t\t\timg?.addEventListener(\"touchmove\", touchMove, {passive: true});\n\t\t\timg?.addEventListener(\"touchend\", touchEnd, {passive: true});\n\t\t};\n\n\t\t// Image mouse manipulation:\n\t\t// 1. Mouse wheel scrolling will zoom in and out\n\t\t// 2. If image is zoomed in, simply dragging it will move it around\n\t\tconst onImageMouseDown = (e: MouseEvent) => {\n\t\t\t// todo: ignore if in touch event currently?\n\n\t\t\t// only left mouse\n\t\t\t// TODO: e.buttons?\n\t\t\tif (e.which !== 1) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\n\t\t\tconst viewerEl = viewer.value;\n\t\t\tconst imageEl = image.value;\n\n\t\t\tif (!viewerEl || !imageEl) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst startX = e.clientX;\n\t\t\tconst startY = e.clientY;\n\t\t\tconst startTransformX = transform.value.x;\n\t\t\tconst startTransformY = transform.value.y;\n\t\t\tconst widthScaled = imageEl.width * transform.value.scale;\n\t\t\tconst heightScaled = imageEl.height * transform.value.scale;\n\t\t\tconst containerWidth = viewerEl.offsetWidth;\n\t\t\tconst containerHeight = viewerEl.offsetHeight;\n\t\t\tconst centerX = transform.value.x - widthScaled / 2;\n\t\t\tconst centerY = transform.value.y - heightScaled / 2;\n\t\t\tlet movedDistance = 0;\n\n\t\t\tconst mouseMove = (moveEvent: MouseEvent) => {\n\t\t\t\tmoveEvent.stopPropagation();\n\t\t\t\tmoveEvent.preventDefault();\n\n\t\t\t\tconst newX = moveEvent.clientX - startX;\n\t\t\t\tconst newY = moveEvent.clientY - startY;\n\n\t\t\t\tmovedDistance = Math.max(movedDistance, Math.abs(newX), Math.abs(newY));\n\n\t\t\t\tif (centerX < 0 || widthScaled + centerX > containerWidth) {\n\t\t\t\t\ttransform.value.x = startTransformX + newX;\n\t\t\t\t}\n\n\t\t\t\tif (centerY < 0 || heightScaled + centerY > containerHeight) {\n\t\t\t\t\ttransform.value.y = startTransformY + newY;\n\t\t\t\t}\n\n\t\t\t\tcorrectPosition();\n\t\t\t};\n\n\t\t\tconst mouseUp = (upEvent: MouseEvent) => {\n\t\t\t\tcorrectPosition();\n\n\t\t\t\tif (movedDistance < 2 && upEvent.button === 0) {\n\t\t\t\t\tcloseViewer();\n\t\t\t\t}\n\n\t\t\t\timage.value?.removeEventListener(\"mousemove\", mouseMove);\n\t\t\t\timage.value?.removeEventListener(\"mouseup\", mouseUp);\n\t\t\t};\n\n\t\t\timage.value?.addEventListener(\"mousemove\", mouseMove);\n\t\t\timage.value?.addEventListener(\"mouseup\", mouseUp);\n\t\t};\n\n\t\t// If image is zoomed in, holding ctrl while scrolling will move the image up and down\n\t\tconst onMouseWheel = (e: WheelEvent) => {\n\t\t\t// if image viewer is closing (css animation), you can still trigger mousewheel\n\t\t\t// TODO: Figure out a better fix for this\n\t\t\tif (link.value === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.preventDefault(); // TODO: Can this be passive?\n\n\t\t\tif (e.ctrlKey) {\n\t\t\t\ttransform.value.y += e.deltaY;\n\t\t\t} else {\n\t\t\t\tconst delta = e.deltaY > 0 ? 0.1 : -0.1;\n\t\t\t\tconst newScale = Math.min(3, Math.max(0.1, transform.value.scale + delta));\n\t\t\t\tconst fixedPosition = calculateZoomShift(\n\t\t\t\t\tnewScale,\n\t\t\t\t\ttransform.value.scale,\n\t\t\t\t\ttransform.value.x,\n\t\t\t\t\ttransform.value.y\n\t\t\t\t);\n\n\t\t\t\tif (!fixedPosition) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttransform.value.scale = newScale;\n\t\t\t\ttransform.value.x = fixedPosition.x;\n\t\t\t\ttransform.value.y = fixedPosition.y;\n\t\t\t}\n\n\t\t\tcorrectPosition();\n\t\t};\n\n\t\tconst onClick = (e: Event) => {\n\t\t\t// If click triggers on the image, ignore it\n\t\t\tif (e.target === image.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcloseViewer();\n\t\t};\n\n\t\twatch(link, (newLink, oldLink) => {\n\t\t\t// TODO: history.pushState\n\t\t\tif (newLink === null) {\n\t\t\t\teventbus.off(\"escapekey\", closeViewer);\n\t\t\t\teventbus.off(\"resize\", correctPosition);\n\t\t\t\tMousetrap.unbind(\"left\");\n\t\t\t\tMousetrap.unbind(\"right\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetPrevNextImages();\n\n\t\t\tif (!oldLink) {\n\t\t\t\teventbus.on(\"escapekey\", closeViewer);\n\t\t\t\teventbus.on(\"resize\", correctPosition);\n\t\t\t\tMousetrap.bind(\"left\", previous);\n\t\t\t\tMousetrap.bind(\"right\", next);\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tlink,\n\t\t\tchannel,\n\t\t\timage,\n\t\t\ttransform,\n\t\t\tcloseViewer,\n\t\t\tnext,\n\t\t\tprevious,\n\t\t\tonImageLoad,\n\t\t\tonImageMouseDown,\n\t\t\tonMouseWheel,\n\t\t\tonClick,\n\t\t\tonTouchStart,\n\t\t\tpreviousImage,\n\t\t\tnextImage,\n\t\t\tonImageTouchStart,\n\t\t\tcomputeImageStyles,\n\t\t\tviewer,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./ImageViewer.vue?vue&type=template&id=99d1f304&ts=true\"\nimport script from \"./ImageViewer.vue?vue&type=script&lang=ts\"\nexport * from \"./ImageViewer.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div\n\t\tv-if=\"isOpen\"\n\t\tid=\"context-menu-container\"\n\t\t:class=\"{passthrough}\"\n\t\t@click=\"containerClick\"\n\t\t@contextmenu.prevent=\"containerClick\"\n\t\t@keydown.exact.up.prevent=\"navigateMenu(-1)\"\n\t\t@keydown.exact.down.prevent=\"navigateMenu(1)\"\n\t\t@keydown.exact.tab.prevent=\"navigateMenu(1)\"\n\t\t@keydown.shift.tab.prevent=\"navigateMenu(-1)\"\n\t>\n\t\t<ul\n\t\t\tid=\"context-menu\"\n\t\t\tref=\"contextMenu\"\n\t\t\trole=\"menu\"\n\t\t\t:style=\"{\n\t\t\t\ttop: style.top + 'px',\n\t\t\t\tleft: style.left + 'px',\n\t\t\t}\"\n\t\t\ttabindex=\"-1\"\n\t\t\t:aria-activedescendant=\"activeItem > -1 ? `context-menu-item-${activeItem}` : undefined\"\n\t\t\t@mouseleave=\"activeItem = -1\"\n\t\t\t@keydown.enter.prevent=\"clickActiveItem\"\n\t\t>\n\t\t\t<!-- TODO: type -->\n\t\t\t<template v-for=\"(item, id) of items as any\" :key=\"item.name\">\n\t\t\t\t<li\n\t\t\t\t\t:id=\"`context-menu-item-${id}`\"\n\t\t\t\t\t:class=\"[\n\t\t\t\t\t\t'context-menu-' + item.type,\n\t\t\t\t\t\titem.class ? 'context-menu-' + item.class : null,\n\t\t\t\t\t\t{active: id === activeItem},\n\t\t\t\t\t]\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t@mouseenter=\"hoverItem(id as number)\"\n\t\t\t\t\t@click=\"clickItem(item)\"\n\t\t\t\t>\n\t\t\t\t\t{{ item.label }}\n\t\t\t\t</li>\n\t\t\t</template>\n\t\t</ul>\n\t</div>\n</template>\n\n<style lang=\"css\">\n.context-menu-item[class*=\"context-menu-group-\"] {\n\t&,\n\t&:hover {\n\t\ttext-align: center;\n\t\tbackground-color: initial;\n\t\tcursor: default;\n\t}\n}\n</style>\n\n<script lang=\"ts\">\nimport {\n\tgenerateUserContextMenu,\n\tgenerateChannelContextMenu,\n\tgenerateInlineChannelContextMenu,\n\tContextMenuItem,\n} from \"../js/helpers/contextMenu\";\nimport eventbus from \"../js/eventbus\";\nimport {defineComponent, nextTick, onMounted, onUnmounted, PropType, ref} from \"vue\";\nimport {ClientChan, ClientMessage, ClientNetwork, ClientUser} from \"../js/types\";\nimport {useStore} from \"../js/store\";\nimport {useRouter} from \"vue-router\";\n\nexport default defineComponent({\n\tname: \"ContextMenu\",\n\tprops: {\n\t\tmessage: {\n\t\t\trequired: false,\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\t\tconst router = useRouter();\n\n\t\tconst isOpen = ref(false);\n\t\tconst passthrough = ref(false);\n\n\t\tconst contextMenu = ref<HTMLUListElement | null>();\n\t\tconst previousActiveElement = ref<HTMLElement | null>();\n\t\tconst items = ref<ContextMenuItem[]>([]);\n\t\tconst activeItem = ref(-1);\n\t\tconst style = ref({\n\t\t\ttop: 0,\n\t\t\tleft: 0,\n\t\t});\n\n\t\tconst close = () => {\n\t\t\tif (!isOpen.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tisOpen.value = false;\n\t\t\titems.value = [];\n\n\t\t\tif (previousActiveElement.value) {\n\t\t\t\tpreviousActiveElement.value.focus();\n\t\t\t\tpreviousActiveElement.value = null;\n\t\t\t}\n\t\t};\n\n\t\tconst enablePointerEvents = () => {\n\t\t\tpassthrough.value = false;\n\t\t\tdocument.body.removeEventListener(\"pointerup\", enablePointerEvents);\n\t\t};\n\n\t\tconst containerClick = (event: MouseEvent) => {\n\t\t\tif (event.currentTarget === event.target) {\n\t\t\t\tclose();\n\t\t\t}\n\t\t};\n\n\t\tconst positionContextMenu = (event: MouseEvent) => {\n\t\t\tconst element = event.target as HTMLElement;\n\n\t\t\tif (!contextMenu.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst menuWidth = contextMenu.value?.offsetWidth;\n\t\t\tconst menuHeight = contextMenu.value?.offsetHeight;\n\n\t\t\tif (element && element.classList.contains(\"menu\")) {\n\t\t\t\treturn {\n\t\t\t\t\tleft: element.getBoundingClientRect().left - (menuWidth - element.offsetWidth),\n\t\t\t\t\ttop: element.getBoundingClientRect().top + element.offsetHeight,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst offset = {left: event.pageX, top: event.pageY};\n\n\t\t\tif (\n\t\t\t\tstore.state.settings.enhancedContextMenuEnabled &&\n\t\t\t\tcontextMenu.value.querySelector('[class*=\"context-menu-group-\"]')\n\t\t\t) {\n\t\t\t\toffset.top -= 45;\n\t\t\t}\n\n\t\t\tif (window.innerWidth - offset.left < menuWidth) {\n\t\t\t\toffset.left = window.innerWidth - menuWidth;\n\t\t\t}\n\n\t\t\tif (window.innerHeight - offset.top < menuHeight) {\n\t\t\t\toffset.top = window.innerHeight - menuHeight;\n\t\t\t}\n\n\t\t\treturn offset;\n\t\t};\n\n\t\tconst hoverItem = (id: number) => {\n\t\t\tactiveItem.value = id;\n\t\t};\n\n\t\tconst clickItem = (item: ContextMenuItem) => {\n\t\t\tclose();\n\n\t\t\tif (\"action\" in item && item.action) {\n\t\t\t\titem.action();\n\t\t\t} else if (\"link\" in item && item.link) {\n\t\t\t\trouter.push(item.link).catch(() => {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error(\"Failed to navigate to\", item.link);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tconst clickActiveItem = () => {\n\t\t\tif (items.value[activeItem.value]) {\n\t\t\t\tclickItem(items.value[activeItem.value]);\n\t\t\t}\n\t\t};\n\n\t\tconst open = (event: MouseEvent, newItems: ContextMenuItem[]) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tpreviousActiveElement.value = document.activeElement as HTMLElement;\n\t\t\titems.value = newItems;\n\t\t\tactiveItem.value = 0;\n\t\t\tisOpen.value = true;\n\n\t\t\t// Position the menu and set the focus on the first item after it's size has updated\n\t\t\tnextTick(() => {\n\t\t\t\tconst pos = positionContextMenu(event);\n\n\t\t\t\tif (!pos) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tstyle.value.left = pos.left;\n\t\t\t\tstyle.value.top = pos.top;\n\t\t\t\tcontextMenu.value?.focus();\n\t\t\t}).catch((e) => {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(e);\n\t\t\t});\n\t\t};\n\n\t\tconst openChannelContextMenu = (data: {\n\t\t\tevent: MouseEvent;\n\t\t\tchannel: ClientChan;\n\t\t\tnetwork: ClientNetwork;\n\t\t}) => {\n\t\t\tif (data.event.type === \"contextmenu\") {\n\t\t\t\t// Pass through all pointer events to allow the network list's\n\t\t\t\t// dragging events to continue triggering.\n\t\t\t\tpassthrough.value = true;\n\t\t\t\tdocument.body.addEventListener(\"pointerup\", enablePointerEvents, {\n\t\t\t\t\tpassive: true,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst newItems = generateChannelContextMenu(data.channel, data.network);\n\t\t\topen(data.event, newItems);\n\t\t};\n\n\t\tconst openInlineChannelContextMenu = (data: {channel: string; event: MouseEvent}) => {\n\t\t\tconst {network} = store.state.activeChannel!;\n\t\t\tconst newItems = generateInlineChannelContextMenu(store, data.channel, network);\n\n\t\t\topen(data.event, newItems);\n\t\t};\n\n\t\tconst openUserContextMenu = (data: {\n\t\t\tuser: Pick<ClientUser, \"nick\" | \"modes\">;\n\t\t\tevent: MouseEvent;\n\t\t}) => {\n\t\t\tconst {network, channel} = store.state.activeChannel!;\n\n\t\t\tconst newItems = generateUserContextMenu(\n\t\t\t\tstore,\n\t\t\t\tchannel,\n\t\t\t\tnetwork,\n\t\t\t\tchannel.users.find((u) => u.nick === data.user.nick) || {\n\t\t\t\t\tnick: data.user.nick,\n\t\t\t\t\tmodes: [],\n\t\t\t\t}\n\t\t\t);\n\t\t\topen(data.event, newItems);\n\t\t};\n\n\t\tconst navigateMenu = (direction: number) => {\n\t\t\tlet currentIndex = activeItem.value;\n\n\t\t\tcurrentIndex += direction;\n\n\t\t\tconst nextItem = items.value[currentIndex];\n\n\t\t\t// If the next item we would select is a divider, skip over it\n\t\t\tif (nextItem && \"type\" in nextItem && nextItem.type === \"divider\") {\n\t\t\t\tcurrentIndex += direction;\n\t\t\t}\n\n\t\t\tif (currentIndex < 0) {\n\t\t\t\tcurrentIndex += items.value.length;\n\t\t\t}\n\n\t\t\tif (currentIndex > items.value.length - 1) {\n\t\t\t\tcurrentIndex -= items.value.length;\n\t\t\t}\n\n\t\t\tactiveItem.value = currentIndex;\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\teventbus.on(\"escapekey\", close);\n\t\t\teventbus.on(\"contextmenu:cancel\", close);\n\t\t\teventbus.on(\"contextmenu:user\", <(...evt: unknown[]) => void>openUserContextMenu);\n\t\t\teventbus.on(\"contextmenu:channel\", <(...evt: unknown[]) => void>openChannelContextMenu);\n\t\t\teventbus.on(\n\t\t\t\t\"contextmenu:inline-channel\",\n\t\t\t\t<(...evt: unknown[]) => void>openInlineChannelContextMenu\n\t\t\t);\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\teventbus.off(\"escapekey\", close);\n\t\t\teventbus.off(\"contextmenu:cancel\", close);\n\t\t\teventbus.off(\"contextmenu:user\", <(...evt: unknown[]) => void>openUserContextMenu);\n\t\t\teventbus.off(\n\t\t\t\t\"contextmenu:channel\",\n\t\t\t\t<(...evt: unknown[]) => void>openChannelContextMenu\n\t\t\t);\n\t\t\teventbus.off(\n\t\t\t\t\"contextmenu:inline-channel\",\n\t\t\t\t<(...evt: unknown[]) => void>openInlineChannelContextMenu\n\t\t\t);\n\n\t\t\tclose();\n\t\t});\n\n\t\treturn {\n\t\t\tisOpen,\n\t\t\titems,\n\t\t\tactiveItem,\n\t\t\tstyle,\n\t\t\tcontextMenu,\n\t\t\tpassthrough,\n\t\t\tclose,\n\t\t\tcontainerClick,\n\t\t\tnavigateMenu,\n\t\t\thoverItem,\n\t\t\tclickItem,\n\t\t\tclickActiveItem,\n\t\t};\n\t},\n});\n</script>\n","import socket from \"../socket\";\nimport eventbus from \"../eventbus\";\nimport type {ClientChan, ClientNetwork, ClientUser} from \"../types\";\nimport {switchToChannel} from \"../router\";\nimport {TypedStore} from \"../store\";\nimport useCloseChannel from \"../hooks/use-close-channel\";\nimport {ChanType} from \"../../../shared/types/chan\";\nimport {openInNewTab} from \"./openInNewTab\";\n\ntype BaseContextMenuItem = {\n\tlabel: string;\n\ttype: string;\n\tclass: string;\n};\n\ntype ContextMenuItemWithAction = BaseContextMenuItem & {\n\taction: () => void;\n};\n\ntype ContextMenuItemWithLink = BaseContextMenuItem & {\n\tlink?: string;\n};\n\ntype ContextMenuDividerItem = {\n\ttype: \"divider\";\n};\n\nexport type ContextMenuItem =\n\t| ContextMenuItemWithAction\n\t| ContextMenuItemWithLink\n\t| ContextMenuDividerItem;\n\nexport function generateChannelContextMenu(\n\tchannel: ClientChan,\n\tnetwork: ClientNetwork\n): ContextMenuItem[] {\n\tconst closeChannel = useCloseChannel(channel);\n\n\tconst typeMap = {\n\t\tlobby: \"network\",\n\t\tchannel: \"chan\",\n\t\tquery: \"query\",\n\t\tspecial: \"chan\",\n\t};\n\n\tconst closeMap = {\n\t\tlobby: \"Remove\",\n\t\tchannel: \"Leave\",\n\t\tquery: \"Close\",\n\t\tspecial: \"Close\",\n\t};\n\n\tlet items: ContextMenuItem[] = [\n\t\t{\n\t\t\tlabel: channel.name,\n\t\t\ttype: \"item\",\n\t\t\tclass: typeMap[channel.type],\n\t\t\tlink: `/chan-${channel.id}`,\n\t\t},\n\t\t{\n\t\t\ttype: \"divider\",\n\t\t},\n\t];\n\n\t// Add menu items for lobbies\n\tif (channel.type === ChanType.LOBBY) {\n\t\titems = [\n\t\t\t...items,\n\t\t\t{\n\t\t\t\tlabel: \"Edit this network…\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"edit\",\n\t\t\t\tlink: `/edit-network/${network.uuid}`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"Join a channel…\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"join\",\n\t\t\t\taction: () => (network.isJoinChannelShown = true),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"List all channels\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"list\",\n\t\t\t\taction: () =>\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/list\",\n\t\t\t\t\t}),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"List ignored users\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"list\",\n\t\t\t\taction: () =>\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/ignorelist\",\n\t\t\t\t\t}),\n\t\t\t},\n\t\t\tnetwork.status.connected\n\t\t\t\t? {\n\t\t\t\t\t\tlabel: \"Disconnect\",\n\t\t\t\t\t\ttype: \"item\",\n\t\t\t\t\t\tclass: \"disconnect\",\n\t\t\t\t\t\taction: () =>\n\t\t\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\t\t\ttext: \"/disconnect\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tlabel: \"Connect\",\n\t\t\t\t\t\ttype: \"item\",\n\t\t\t\t\t\tclass: \"connect\",\n\t\t\t\t\t\taction: () =>\n\t\t\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\t\t\ttext: \"/connect\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t];\n\t}\n\n\t// Add menu items for channels\n\tif (channel.type === ChanType.CHANNEL) {\n\t\titems.push({\n\t\t\tlabel: \"Edit topic\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"edit\",\n\t\t\taction() {\n\t\t\t\tchannel.editTopic = true;\n\t\t\t\tswitchToChannel(channel);\n\t\t\t},\n\t\t});\n\t\titems.push({\n\t\t\tlabel: \"List banned users\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"list\",\n\t\t\taction() {\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\ttext: \"/banlist\",\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\n\t// Add menu items for queries\n\tif (channel.type === ChanType.QUERY) {\n\t\titems.push(\n\t\t\t{\n\t\t\t\tlabel: \"User information\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-whois\",\n\t\t\t\taction() {\n\t\t\t\t\tswitchToChannel(channel);\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/whois \" + channel.name,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"Ignore user\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-ignore\",\n\t\t\t\taction() {\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/ignore \" + channel.name,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: channel.pinned ? \"Unpin conversation\" : \"Pin conversation\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"pin\",\n\t\t\t\taction() {\n\t\t\t\t\tsocket.emit(\"pin:change\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\tsetPinnedTo: !channel.pinned,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t}\n\t\t);\n\t}\n\n\tif (channel.type === ChanType.CHANNEL || channel.type === ChanType.QUERY) {\n\t\titems.push({\n\t\t\tlabel: \"Clear history\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"clear-history\",\n\t\t\taction() {\n\t\t\t\teventbus.emit(\n\t\t\t\t\t\"confirm-dialog\",\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: \"Clear history\",\n\t\t\t\t\t\ttext: `Are you sure you want to clear history for ${channel.name}? This cannot be undone.`,\n\t\t\t\t\t\tbutton: \"Clear history\",\n\t\t\t\t\t},\n\t\t\t\t\t(result) => {\n\t\t\t\t\t\tif (!result) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsocket.emit(\"history:clear\", {\n\t\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t}\n\n\tconst humanFriendlyChanTypeMap: Record<string, string> = {\n\t\tlobby: \"network\",\n\t\tchannel: \"channel\",\n\t\tquery: \"conversation\",\n\t};\n\n\t// We don't allow the muting of ChanType.SPECIAL channels\n\tconst mutableChanTypes = Object.keys(humanFriendlyChanTypeMap);\n\n\tif (mutableChanTypes.includes(channel.type)) {\n\t\tconst chanType = humanFriendlyChanTypeMap[channel.type];\n\n\t\titems.push({\n\t\t\tlabel: channel.muted ? `Unmute ${chanType}` : `Mute ${chanType}`,\n\t\t\ttype: \"item\",\n\t\t\tclass: \"mute\",\n\t\t\taction() {\n\t\t\t\tsocket.emit(\"mute:change\", {\n\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\tsetMutedTo: !channel.muted,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\n\t// Add close menu item\n\titems.push({\n\t\tlabel: closeMap[channel.type],\n\t\ttype: \"item\",\n\t\tclass: \"close\",\n\t\taction() {\n\t\t\tcloseChannel();\n\t\t},\n\t});\n\n\treturn items;\n}\n\nexport function generateInlineChannelContextMenu(\n\tstore: TypedStore,\n\tchan: string,\n\tnetwork: ClientNetwork\n): ContextMenuItem[] {\n\tconst join = () => {\n\t\tconst channel = network.channels.find((c) => c.name === chan);\n\n\t\tif (channel) {\n\t\t\tswitchToChannel(channel);\n\t\t}\n\n\t\tif (store.state.activeChannel) {\n\t\t\tsocket.emit(\"input\", {\n\t\t\t\ttarget: store.state.activeChannel.channel.id,\n\t\t\t\ttext: \"/join \" + chan,\n\t\t\t});\n\t\t} else {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(\"Unable to join channel: activeChannel is undefined\");\n\t\t}\n\t};\n\n\tconst channel = network.channels.find((c) => c.name === chan);\n\n\tif (channel) {\n\t\treturn [\n\t\t\t{\n\t\t\t\tlabel: \"Go to channel\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"chan\",\n\t\t\t\tlink: `/chan-${channel.id}`,\n\t\t\t},\n\t\t];\n\t}\n\n\treturn [\n\t\t{\n\t\t\tlabel: \"Join channel\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"join\",\n\t\t\taction: join,\n\t\t},\n\t];\n}\n\nexport function generateUserContextMenu(\n\tstore: TypedStore,\n\tchannel: ClientChan,\n\tnetwork: ClientNetwork,\n\tuser: Pick<ClientUser, \"nick\" | \"modes\">\n): ContextMenuItem[] {\n\tconst currentChannelUser: ClientUser | Record<string, never> = channel\n\t\t? channel.users.find((u) => u.nick === network.nick) || {}\n\t\t: {};\n\n\tconst userContextMenuEntrys = () => {\n\t\tconst defualt = {\n\t\t\tlabel: user.nick,\n\t\t\ttype: \"item\",\n\t\t\tclass: \"user\",\n\t\t\taction() {},\n\t\t};\n\n\t\tif (\n\t\t\tstore.state.settings.enhancedContextMenuEnabled &&\n\t\t\tBoolean(network.channels.find((c) => (c.groups?.length ?? 0) > 0))\n\t\t) {\n\t\t\tconst customInspect = {\n\t\t\t\tlabel: user.nick,\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"user\",\n\t\t\t\taction() {\n\t\t\t\t\tif (channel.type !== ChanType.CHANNEL) return;\n\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: `!user ${user.nick}`,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst customTrackerProfile = {\n\t\t\t\tlabel: `Tracker Profile`,\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-open\",\n\t\t\t\taction() {\n\t\t\t\t\topenInNewTab(`https://brr.red/${user.nick}`);\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst userGroup =\n\t\t\t\tnetwork.channels\n\t\t\t\t\t.find((c) => c.users.find((u) => u.nick === user.nick))\n\t\t\t\t\t?.groups?.find((g) => g.users.includes(user.nick))?.name ?? \"Offline\";\n\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: userGroup,\n\t\t\t\t\ttype: \"item\",\n\t\t\t\t\tclass: `group-${userGroup.toLowerCase()}`,\n\t\t\t\t\taction() {},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: \"divider\",\n\t\t\t\t},\n\t\t\t\tcustomInspect,\n\t\t\t\tcustomTrackerProfile,\n\t\t\t] as ContextMenuItem[];\n\t\t}\n\n\t\treturn [defualt];\n\t};\n\n\t// Extra entries for enhanced context menu\n\tconst additionalContextMenuEntrys = () => {\n\t\tif (!store.state.settings.enhancedContextMenuEnabled) return [];\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tlabel: `Slap ${user.nick}`,\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-slap\",\n\t\t\t\taction() {\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/slap \" + user.nick,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t};\n\n\tconst items: ContextMenuItem[] = [\n\t\t...userContextMenuEntrys(),\n\t\t{\n\t\t\ttype: \"divider\",\n\t\t},\n\t\t{\n\t\t\tlabel: \"Direct messages\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"action-query\",\n\t\t\taction() {\n\t\t\t\tconst chan = store.getters.findChannelOnCurrentNetwork(user.nick);\n\n\t\t\t\tif (chan) {\n\t\t\t\t\tswitchToChannel(chan);\n\t\t\t\t}\n\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\ttext: \"/query \" + user.nick,\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t\t...additionalContextMenuEntrys(),\n\t\t{\n\t\t\ttype: \"divider\",\n\t\t},\n\t\t{\n\t\t\tlabel: \"User information\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"action-whois\",\n\t\t\taction() {\n\t\t\t\tconst chan = network.channels.find((c) => c.name === user.nick);\n\n\t\t\t\tif (chan) {\n\t\t\t\t\tswitchToChannel(chan);\n\t\t\t\t}\n\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\ttext: \"/whois \" + user.nick,\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tlabel: \"Ignore user\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"action-ignore\",\n\t\t\taction() {\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\ttext: \"/ignore \" + user.nick,\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t];\n\n\t// Bail because we're in a query or we don't have a special mode.\n\tif (!currentChannelUser.modes || currentChannelUser.modes.length < 1) {\n\t\treturn items;\n\t}\n\n\t// Names of the standard modes we are able to change\n\tconst modeCharToName = {\n\t\t\"~\": \"owner\",\n\t\t\"&\": \"admin\",\n\t\t\"@\": \"operator\",\n\t\t\"%\": \"half-op\",\n\t\t\"+\": \"voice\",\n\t};\n\n\t// Labels for the mode changes. For example .rev({mode: \"a\", symbol: \"&\"}) => 'Revoke admin (-a)'\n\tconst modeTextTemplate = {\n\t\trevoke(m: {symbol: string; mode: string}) {\n\t\t\tconst name = modeCharToName[m.symbol];\n\n\t\t\tif (typeof name !== \"string\") {\n\t\t\t\treturn \"\";\n\t\t\t}\n\n\t\t\tconst res = name ? `Revoke ${name} (-${m.mode})` : `Mode -${m.mode}`;\n\t\t\treturn res;\n\t\t},\n\t\tgive(m: {symbol: string; mode: string}) {\n\t\t\tconst name = modeCharToName[m.symbol];\n\n\t\t\tif (typeof name !== \"string\") {\n\t\t\t\treturn \"\";\n\t\t\t}\n\n\t\t\tconst res = name ? `Give ${name} (+${m.mode})` : `Mode +${m.mode}`;\n\t\t\treturn res;\n\t\t},\n\t};\n\n\tconst networkModeSymbols = network.serverOptions.PREFIX.symbols;\n\n\t/**\n\t * Determine whether the prefix of mode p1 has access to perform actions on p2.\n\t *\n\t * EXAMPLE:\n\t * compare('@', '@') => true\n\t * compare('&', '@') => true\n\t * compare('+', '~') => false\n\t * @param {string} p1 The mode performing an action\n\t * @param {string} p2 The target mode\n\t *\n\t * @return {boolean} whether p1 can perform an action on p2\n\t */\n\tfunction compare(p1: string, p2: string): boolean {\n\t\t// The modes ~ and @ can perform actions on their own mode. The others on modes below.\n\t\treturn \"~@\".indexOf(p1) > -1\n\t\t\t? networkModeSymbols.indexOf(p1) <= networkModeSymbols.indexOf(p2)\n\t\t\t: networkModeSymbols.indexOf(p1) < networkModeSymbols.indexOf(p2);\n\t}\n\n\tnetwork.serverOptions.PREFIX.prefix.forEach((mode) => {\n\t\tif (!compare(currentChannelUser.modes[0], mode.symbol)) {\n\t\t\t// Our highest mode is below the current mode. Bail.\n\t\t\treturn;\n\t\t}\n\n\t\tif (!user.modes.includes(mode.symbol)) {\n\t\t\t// The target doesn't already have this mode, therefore we can set it.\n\t\t\titems.push({\n\t\t\t\tlabel: modeTextTemplate.give(mode),\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-set-mode\",\n\t\t\t\taction() {\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/mode +\" + mode.mode + \" \" + user.nick,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\titems.push({\n\t\t\t\tlabel: modeTextTemplate.revoke(mode),\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-revoke-mode\",\n\t\t\t\taction() {\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/mode -\" + mode.mode + \" \" + user.nick,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t});\n\n\t// Determine if we are half-op or op depending on the network modes so we can kick.\n\tif (!compare(networkModeSymbols.indexOf(\"%\") > -1 ? \"%\" : \"@\", currentChannelUser.modes[0])) {\n\t\t// Check if the target user has no mode or a mode lower than ours.\n\t\tif (user.modes.length === 0 || compare(currentChannelUser.modes[0], user.modes[0])) {\n\t\t\titems.push({\n\t\t\t\tlabel: \"Kick\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-kick\",\n\t\t\t\taction() {\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/kick \" + user.nick,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\treturn items;\n}\n","export function openInNewTab(href: string) {\n\tObject.assign(document.createElement(\"a\"), {\n\t\ttarget: \"_blank\",\n\t\trel: \"noopener noreferrer\",\n\t\thref: href,\n\t}).click();\n}\n","import { render } from \"./ContextMenu.vue?vue&type=template&id=ddf3aad2&ts=true\"\nimport script from \"./ContextMenu.vue?vue&type=script&lang=ts\"\nexport * from \"./ContextMenu.vue?vue&type=script&lang=ts\"\n\nimport \"./ContextMenu.vue?vue&type=style&index=0&id=ddf3aad2&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div id=\"confirm-dialog-overlay\" :class=\"{opened: !!data}\">\n\t\t<div v-if=\"data !== null\" id=\"confirm-dialog\">\n\t\t\t<div class=\"confirm-text\">\n\t\t\t\t<div class=\"confirm-text-title\">{{ data?.title }}</div>\n\t\t\t\t<p>{{ data?.text }}</p>\n\t\t\t</div>\n\t\t\t<div class=\"confirm-buttons\">\n\t\t\t\t<button class=\"btn btn-cancel\" @click=\"close(false)\">Cancel</button>\n\t\t\t\t<button class=\"btn btn-danger\" @click=\"close(true)\">{{ data?.button }}</button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n#confirm-dialog {\n\tbackground: var(--body-bg-color);\n\tcolor: #fff;\n\tmargin: 10px;\n\tborder-radius: 5px;\n\tmax-width: 500px;\n}\n\n#confirm-dialog .confirm-text {\n\tpadding: 15px;\n\tuser-select: text;\n}\n\n#confirm-dialog .confirm-text-title {\n\tfont-size: 20px;\n\tfont-weight: 700;\n\tmargin-bottom: 10px;\n}\n\n#confirm-dialog .confirm-buttons {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\tpadding: 15px;\n\tbackground: rgb(0 0 0 / 30%);\n}\n\n#confirm-dialog .confirm-buttons .btn {\n\tmargin-bottom: 0;\n\tmargin-left: 10px;\n}\n\n#confirm-dialog .confirm-buttons .btn-cancel {\n\tborder-color: transparent;\n}\n</style>\n\n<script lang=\"ts\">\nimport eventbus from \"../js/eventbus\";\nimport {defineComponent, onMounted, onUnmounted, ref} from \"vue\";\n\ntype ConfirmDialogData = {\n\ttitle: string;\n\ttext: string;\n\tbutton: string;\n};\n\ntype ConfirmDialogCallback = {\n\t(confirmed: boolean): void;\n};\n\nexport default defineComponent({\n\tname: \"ConfirmDialog\",\n\tsetup() {\n\t\tconst data = ref<ConfirmDialogData>();\n\t\tconst callback = ref<ConfirmDialogCallback>();\n\n\t\tconst open = (incoming: ConfirmDialogData, cb: ConfirmDialogCallback) => {\n\t\t\tdata.value = incoming;\n\t\t\tcallback.value = cb;\n\t\t};\n\n\t\tconst close = (result: boolean) => {\n\t\t\tdata.value = undefined;\n\n\t\t\tif (callback.value) {\n\t\t\t\tcallback.value(!!result);\n\t\t\t}\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\teventbus.on(\"escapekey\", <(...evt: unknown[]) => void>close);\n\t\t\teventbus.on(\"confirm-dialog\", <(...evt: unknown[]) => void>open);\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\teventbus.off(\"escapekey\", <(...evt: unknown[]) => void>close);\n\t\t\teventbus.off(\"confirm-dialog\", <(...evt: unknown[]) => void>open);\n\t\t});\n\n\t\treturn {\n\t\t\tdata,\n\t\t\tclose,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./ConfirmDialog.vue?vue&type=template&id=36ab3920&ts=true\"\nimport script from \"./ConfirmDialog.vue?vue&type=script&lang=ts\"\nexport * from \"./ConfirmDialog.vue?vue&type=script&lang=ts\"\n\nimport \"./ConfirmDialog.vue?vue&type=style&index=0&id=36ab3920&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div\n\t\tv-if=\"isOpen\"\n\t\tid=\"mentions-popup-container\"\n\t\t@click=\"containerClick\"\n\t\t@contextmenu=\"containerClick\"\n\t>\n\t\t<div class=\"mentions-popup\">\n\t\t\t<div class=\"mentions-popup-title\">\n\t\t\t\tRecent mentions\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"resolvedMessages.length\"\n\t\t\t\t\tclass=\"btn dismiss-all-mentions\"\n\t\t\t\t\t@click=\"dismissAllMentions()\"\n\t\t\t\t>\n\t\t\t\t\tDismiss all\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<template v-if=\"resolvedMessages.length === 0\">\n\t\t\t\t<p v-if=\"isLoading\">Loading…</p>\n\t\t\t\t<p v-else>You have no recent mentions.</p>\n\t\t\t</template>\n\t\t\t<template v-for=\"message in resolvedMessages\" v-else :key=\"message.msgId\">\n\t\t\t\t<div :class=\"['msg', message.type]\">\n\t\t\t\t\t<div class=\"mentions-info\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<span class=\"from\">\n\t\t\t\t\t\t\t\t<Username :user=\"message.from\" />\n\t\t\t\t\t\t\t\t<template v-if=\"message.channel\">\n\t\t\t\t\t\t\t\t\tin {{ message.channel.channel.name }}\n\n\t\t\t\t\t\t\t\t\ton\n\t\t\t\t\t\t\t\t\t{{ message.channel.network.name }}\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t<template v-else> in unknown channel </template> </span\n\t\t\t\t\t\t\t>{{ ` ` }}\n\n\t\t\t\t\t\t\t<span :title=\"message.localetime\" class=\"time\">\n\t\t\t\t\t\t\t\t{{ messageTime(message.time.toString()) }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclass=\"close-tooltip tooltipped tooltipped-w\"\n\t\t\t\t\t\t\t\taria-label=\"Dismiss this mention\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"msg-dismiss\"\n\t\t\t\t\t\t\t\t\taria-label=\"Dismiss this mention\"\n\t\t\t\t\t\t\t\t\t@click=\"dismissMention(message)\"\n\t\t\t\t\t\t\t\t></button>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"content\"\n\t\t\t\t\t\tdir=\"auto\"\n\t\t\t\t\t\t:data-jump-to=\"\n\t\t\t\t\t\t\t(store.state.settings.searchEnabled &&\n\t\t\t\t\t\t\t\tstore.state.settings.enableEnhancedSearch) ||\n\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t@click=\"jumpToMention(message)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ParsedMessage :message=\"message as any\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n#mentions-popup-container {\n\tz-index: 8;\n}\n\n.mentions-popup {\n\tbackground-color: var(--window-bg-color);\n\tposition: absolute;\n\twidth: 400px;\n\tright: 80px;\n\ttop: 55px;\n\tmax-height: 400px;\n\toverflow-y: auto;\n\tz-index: 2;\n\tpadding: 10px;\n}\n\n.mentions-popup > .mentions-popup-title {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\tmargin-bottom: 10px;\n\tfont-size: 20px;\n}\n\n.mentions-popup .mentions-info {\n\tdisplay: flex;\n\tjustify-content: space-between;\n}\n\n.mentions-popup .msg {\n\tmargin-bottom: 15px;\n\tuser-select: text;\n}\n\n.mentions-popup .msg:last-child {\n\tmargin-bottom: 0;\n}\n\n.mentions-popup .msg .content {\n\tbackground-color: var(--highlight-bg-color);\n\tborder-radius: 5px;\n\tpadding: 6px;\n\tmargin-top: 2px;\n\tword-wrap: break-word;\n\tword-break: break-word; /* Webkit-specific */\n\tcursor: pointer;\n\n\t&[data-jump-to]:hover {\n\t\t/** WIP */\n\t\tcolor: var(--highlight-bg-color);\n\t\tbackground-color: var(--highlight-border-color);\n\t}\n}\n\n.mentions-popup .msg-dismiss::before {\n\tfont-size: 20px;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tline-height: 16px;\n\ttext-align: center;\n\tcontent: \"×\";\n}\n\n.mentions-popup .msg-dismiss:hover {\n\tcolor: var(--link-color);\n}\n\n.mentions-popup .dismiss-all-mentions {\n\tmargin: 0;\n\tpadding: 4px 6px;\n}\n\n@media (height >= 500px) {\n\t.mentions-popup {\n\t\tmax-height: 60vh;\n\t}\n}\n\n@media (width <= 768px) {\n\t.mentions-popup {\n\t\tborder-radius: 0;\n\t\tborder: 0;\n\t\tbox-shadow: none;\n\t\twidth: 100%;\n\t\tmax-height: none;\n\t\tinset: 45px 0 0; /* header height */\n\t}\n}\n</style>\n\n<script lang=\"ts\">\nimport Username from \"./Username.vue\";\nimport ParsedMessage from \"./ParsedMessage.vue\";\nimport socket from \"../js/socket\";\nimport eventbus from \"../js/eventbus\";\nimport localetime from \"../js/helpers/localetime\";\nimport dayjs from \"dayjs\";\nimport relativeTime from \"dayjs/plugin/relativeTime\";\nimport {computed, watch, defineComponent, ref, onMounted, onUnmounted} from \"vue\";\nimport {useStore} from \"../js/store\";\nimport {ClientMention} from \"../js/types\";\nimport {switchToChannel} from \"../js/router\";\n\ndayjs.extend(relativeTime);\n\nexport default defineComponent({\n\tname: \"Mentions\",\n\tcomponents: {\n\t\tUsername,\n\t\tParsedMessage,\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\t\tconst isOpen = ref(false);\n\t\tconst isLoading = ref(false);\n\t\tconst resolvedMessages = computed(() => {\n\t\t\tconst messages = store.state.mentions.slice().reverse();\n\n\t\t\tfor (const message of messages) {\n\t\t\t\tmessage.localetime = localetime(message.time);\n\t\t\t\tmessage.channel = store.getters.findChannel(message.chanId);\n\t\t\t}\n\n\t\t\treturn messages.filter((message) => !message.channel?.channel.muted);\n\t\t});\n\n\t\twatch(\n\t\t\t() => store.state.mentions,\n\t\t\t() => {\n\t\t\t\tisLoading.value = false;\n\t\t\t}\n\t\t);\n\n\t\tconst messageTime = (time: string) => {\n\t\t\treturn dayjs(time).fromNow();\n\t\t};\n\n\t\tconst dismissMention = (message: ClientMention) => {\n\t\t\tstore.state.mentions.splice(\n\t\t\t\tstore.state.mentions.findIndex((m) => m.msgId === message.msgId),\n\t\t\t\t1\n\t\t\t);\n\n\t\t\tsocket.emit(\"mentions:dismiss\", message.msgId);\n\t\t};\n\n\t\tconst dismissAllMentions = () => {\n\t\t\tstore.state.mentions = [];\n\t\t\tsocket.emit(\"mentions:dismiss_all\");\n\t\t};\n\n\t\tconst jumpToMention = (message: ClientMention) => {\n\t\t\tif (!store.state.settings.enableEnhancedSearch || !message.channel) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Navigate to the channel with the focused message\n\t\t\tswitchToChannel(message.channel.channel, message.msgId);\n\n\t\t\t// Close the popup\n\t\t\tisOpen.value = false;\n\t\t};\n\n\t\tconst containerClick = (event: Event) => {\n\t\t\tif (event.currentTarget === event.target) {\n\t\t\t\tisOpen.value = false;\n\t\t\t}\n\t\t};\n\n\t\tconst togglePopup = () => {\n\t\t\tisOpen.value = !isOpen.value;\n\n\t\t\tif (isOpen.value) {\n\t\t\t\tisLoading.value = true;\n\t\t\t\tsocket.emit(\"mentions:get\");\n\t\t\t}\n\t\t};\n\n\t\tconst closePopup = () => {\n\t\t\tisOpen.value = false;\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\teventbus.on(\"mentions:toggle\", togglePopup);\n\t\t\teventbus.on(\"escapekey\", closePopup);\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\teventbus.off(\"mentions:toggle\", togglePopup);\n\t\t\teventbus.off(\"escapekey\", closePopup);\n\t\t});\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tisOpen,\n\t\t\tisLoading,\n\t\t\tresolvedMessages,\n\t\t\tmessageTime,\n\t\t\tdismissMention,\n\t\t\tdismissAllMentions,\n\t\t\tjumpToMention,\n\t\t\tcontainerClick,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./Mentions.vue?vue&type=template&id=531ebca8&ts=true\"\nimport script from \"./Mentions.vue?vue&type=script&lang=ts\"\nexport * from \"./Mentions.vue?vue&type=script&lang=ts\"\n\nimport \"./Mentions.vue?vue&type=style&index=0&id=531ebca8&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div id=\"viewport\" :class=\"viewportClasses\" role=\"tablist\">\n\t\t<Sidebar v-if=\"store.state.appLoaded\" :overlay=\"overlay\" />\n\t\t<div\n\t\t\tid=\"sidebar-overlay\"\n\t\t\tref=\"overlay\"\n\t\t\taria-hidden=\"true\"\n\t\t\t@click=\"store.commit('sidebarOpen', false)\"\n\t\t/>\n\t\t<router-view ref=\"loungeWindow\"></router-view>\n\t\t<Mentions />\n\t\t<ImageViewer ref=\"imageViewer\" />\n\t\t<ContextMenu ref=\"contextMenu\" />\n\t\t<ConfirmDialog ref=\"confirmDialog\" />\n\t\t<div id=\"upload-overlay\"></div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport constants from \"../js/constants\";\nimport eventbus from \"../js/eventbus\";\nimport Mousetrap, {ExtendedKeyboardEvent} from \"mousetrap\";\nimport throttle from \"lodash/throttle\";\nimport storage from \"../js/localStorage\";\nimport isIgnoredKeybind from \"../js/helpers/isIgnoredKeybind\";\n\nimport Sidebar from \"./Sidebar.vue\";\nimport ImageViewer from \"./ImageViewer.vue\";\nimport ContextMenu from \"./ContextMenu.vue\";\nimport ConfirmDialog from \"./ConfirmDialog.vue\";\nimport Mentions from \"./Mentions.vue\";\nimport {\n\tcomputed,\n\tprovide,\n\tdefineComponent,\n\tonBeforeUnmount,\n\tonMounted,\n\tref,\n\tRef,\n\tInjectionKey,\n} from \"vue\";\nimport {useStore} from \"../js/store\";\nimport type {DebouncedFunc} from \"lodash\";\n\nexport const imageViewerKey = Symbol() as InjectionKey<Ref<typeof ImageViewer | null>>;\nconst contextMenuKey = Symbol() as InjectionKey<Ref<typeof ContextMenu | null>>;\nconst confirmDialogKey = Symbol() as InjectionKey<Ref<typeof ConfirmDialog | null>>;\n\nexport default defineComponent({\n\tname: \"App\",\n\tcomponents: {\n\t\tSidebar,\n\t\tImageViewer,\n\t\tContextMenu,\n\t\tConfirmDialog,\n\t\tMentions,\n\t},\n\tsetup() {\n\t\tconst store = useStore();\n\t\tconst overlay = ref(null);\n\t\tconst loungeWindow = ref(null);\n\t\tconst imageViewer = ref(null);\n\t\tconst contextMenu = ref(null);\n\t\tconst confirmDialog = ref(null);\n\n\t\tprovide(imageViewerKey, imageViewer);\n\t\tprovide(contextMenuKey, contextMenu);\n\t\tprovide(confirmDialogKey, confirmDialog);\n\n\t\tconst viewportClasses = computed(() => {\n\t\t\treturn {\n\t\t\t\tnotified: store.getters.highlightCount > 0,\n\t\t\t\t\"menu-open\": store.state.appLoaded && store.state.sidebarOpen,\n\t\t\t\t\"menu-dragging\": store.state.sidebarDragging,\n\t\t\t\t\"userlist-open\": store.state.userlistOpen,\n\t\t\t};\n\t\t});\n\n\t\tconst debouncedResize = ref<DebouncedFunc<() => void>>();\n\t\tconst dayChangeTimeout = ref<ReturnType<typeof setTimeout>>();\n\n\t\tconst escapeKey = () => {\n\t\t\teventbus.emit(\"escapekey\");\n\t\t};\n\n\t\tconst toggleSidebar = (e: ExtendedKeyboardEvent) => {\n\t\t\tif (isIgnoredKeybind(e)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tstore.commit(\"toggleSidebar\");\n\n\t\t\treturn false;\n\t\t};\n\n\t\tconst toggleUserList = (e: ExtendedKeyboardEvent) => {\n\t\t\tif (isIgnoredKeybind(e)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tstore.commit(\"toggleUserlist\");\n\n\t\t\treturn false;\n\t\t};\n\n\t\tconst toggleMentions = () => {\n\t\t\tif (store.state.networks.length !== 0) {\n\t\t\t\teventbus.emit(\"mentions:toggle\");\n\t\t\t}\n\t\t};\n\n\t\tconst msUntilNextDay = () => {\n\t\t\t// Compute how many milliseconds are remaining until the next day starts\n\t\t\tconst today = new Date();\n\t\t\tconst tommorow = new Date(\n\t\t\t\ttoday.getFullYear(),\n\t\t\t\ttoday.getMonth(),\n\t\t\t\ttoday.getDate() + 1\n\t\t\t).getTime();\n\n\t\t\treturn tommorow - today.getTime();\n\t\t};\n\n\t\tconst prepareOpenStates = () => {\n\t\t\tconst viewportWidth = window.innerWidth;\n\t\t\tlet isUserlistOpen = storage.get(\"thelounge.state.userlist\");\n\n\t\t\tif (viewportWidth > constants.mobileViewportPixels) {\n\t\t\t\tstore.commit(\"sidebarOpen\", storage.get(\"thelounge.state.sidebar\") !== \"false\");\n\t\t\t}\n\n\t\t\t// If The Lounge is opened on a small screen (less than 1024px), and we don't have stored\n\t\t\t// user list state, close it by default\n\t\t\tif (viewportWidth >= 1024 && isUserlistOpen !== \"true\" && isUserlistOpen !== \"false\") {\n\t\t\t\tisUserlistOpen = \"true\";\n\t\t\t}\n\n\t\t\tstore.commit(\"userlistOpen\", isUserlistOpen === \"true\");\n\t\t};\n\n\t\tprepareOpenStates();\n\n\t\tonMounted(() => {\n\t\t\tMousetrap.bind(\"esc\", escapeKey);\n\t\t\tMousetrap.bind(\"alt+u\", toggleUserList);\n\t\t\tMousetrap.bind(\"alt+s\", toggleSidebar);\n\t\t\tMousetrap.bind(\"alt+m\", toggleMentions);\n\n\t\t\tdebouncedResize.value = throttle(() => {\n\t\t\t\teventbus.emit(\"resize\");\n\t\t\t}, 100);\n\n\t\t\twindow.addEventListener(\"resize\", debouncedResize.value, {passive: true});\n\n\t\t\t// Emit a daychange event every time the day changes so date markers know when to update themselves\n\t\t\tconst emitDayChange = () => {\n\t\t\t\teventbus.emit(\"daychange\");\n\t\t\t\t// This should always be 24h later but re-computing exact value just in case\n\t\t\t\tdayChangeTimeout.value = setTimeout(emitDayChange, msUntilNextDay());\n\t\t\t};\n\n\t\t\tdayChangeTimeout.value = setTimeout(emitDayChange, msUntilNextDay());\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\tMousetrap.unbind(\"esc\");\n\t\t\tMousetrap.unbind(\"alt+u\");\n\t\t\tMousetrap.unbind(\"alt+s\");\n\t\t\tMousetrap.unbind(\"alt+m\");\n\n\t\t\tif (debouncedResize.value) {\n\t\t\t\twindow.removeEventListener(\"resize\", debouncedResize.value);\n\t\t\t}\n\n\t\t\tif (dayChangeTimeout.value) {\n\t\t\t\tclearTimeout(dayChangeTimeout.value);\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tviewportClasses,\n\t\t\tescapeKey,\n\t\t\ttoggleSidebar,\n\t\t\ttoggleUserList,\n\t\t\ttoggleMentions,\n\t\t\tstore,\n\t\t\toverlay,\n\t\t\tloungeWindow,\n\t\t\timageViewer,\n\t\t\tcontextMenu,\n\t\t\tconfirmDialog,\n\t\t};\n\t},\n});\n</script>\n","import { render } from \"./App.vue?vue&type=template&id=9dbf2ed8&ts=true\"\nimport script from \"./App.vue?vue&type=script&lang=ts\"\nexport * from \"./App.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import {store} from \"../store\";\nimport socket from \"../socket\";\n\nsocket.on(\"disconnect\", handleDisconnect);\nsocket.on(\"connect_error\", handleDisconnect);\nsocket.on(\"error\", handleDisconnect);\n\nsocket.io.on(\"reconnect_attempt\", function (attempt) {\n\tstore.commit(\"currentUserVisibleError\", `Reconnecting… (attempt ${attempt})`);\n\tupdateLoadingMessage();\n});\n\nsocket.on(\"connecting\", function () {\n\tstore.commit(\"currentUserVisibleError\", \"Connecting…\");\n\tupdateLoadingMessage();\n});\n\nsocket.on(\"connect\", function () {\n\t// Clear send buffer when reconnecting, socket.io would emit these\n\t// immediately upon connection and it will have no effect, so we ensure\n\t// nothing is sent to the server that might have happened.\n\tsocket.sendBuffer = [];\n\n\tstore.commit(\"currentUserVisibleError\", \"Finalizing connection…\");\n\tupdateLoadingMessage();\n});\n\nfunction handleDisconnect(data) {\n\tconst message = String(data.message || data);\n\n\tstore.commit(\"isConnected\", false);\n\n\tif (!socket.io.reconnection()) {\n\t\tstore.commit(\n\t\t\t\"currentUserVisibleError\",\n\t\t\t`Disconnected from the server (${message}), The Lounge does not reconnect in public mode.`\n\t\t);\n\t\tupdateLoadingMessage();\n\t\treturn;\n\t}\n\n\tstore.commit(\"currentUserVisibleError\", `Waiting to reconnect… (${message})`);\n\tupdateLoadingMessage();\n\n\t// If the server shuts down, socket.io skips reconnection\n\t// and we have to manually call connect to start the process\n\t// However, do not reconnect if TL client manually closed the connection\n\t// Access private skipReconnect property through double type assertion\n\tif (\n\t\t(socket.io as unknown as {skipReconnect?: boolean}).skipReconnect &&\n\t\tmessage !== \"io client disconnect\"\n\t) {\n\t\trequestIdleCallback(() => socket.connect(), 2000);\n\t}\n}\n\nfunction requestIdleCallback(callback, timeout) {\n\tif (window.requestIdleCallback) {\n\t\t// During an idle period the user agent will run idle callbacks in FIFO order\n\t\t// until either the idle period ends or there are no more idle callbacks eligible to be run.\n\t\twindow.requestIdleCallback(callback, {timeout});\n\t} else {\n\t\tcallback();\n\t}\n}\n\nfunction updateLoadingMessage() {\n\tconst loading = document.getElementById(\"loading-page-message\");\n\n\tif (loading) {\n\t\tloading.textContent = store.state.currentUserVisibleError;\n\t}\n}\n","import socket from \"../socket\";\nimport storage from \"../localStorage\";\nimport {router, navigate} from \"../router\";\nimport {store} from \"../store\";\nimport location from \"../location\";\nlet lastServerHash: number | null = null;\n\ndeclare global {\n\tinterface Window {\n\t\tg_TheLoungeRemoveLoading?: () => void;\n\t}\n}\n\nsocket.on(\"auth:success\", function () {\n\tstore.commit(\"currentUserVisibleError\", \"Loading messages…\");\n\tupdateLoadingMessage();\n});\n\nsocket.on(\"auth:failed\", async function () {\n\tstorage.remove(\"token\");\n\n\tif (store.state.appLoaded) {\n\t\treturn reloadPage(\"Authentication failed, reloading…\");\n\t}\n\n\tawait showSignIn();\n});\n\nsocket.on(\"auth:start\", async function (serverHash) {\n\t// If we reconnected and serverHash differs, that means the server restarted\n\t// And we will reload the page to grab the latest version\n\tif (lastServerHash && serverHash !== lastServerHash) {\n\t\treturn reloadPage(\"Server restarted, reloading…\");\n\t}\n\n\tlastServerHash = serverHash;\n\n\tconst user = storage.get(\"user\");\n\tconst token = storage.get(\"token\");\n\tconst doFastAuth = user && token;\n\n\t// If we reconnect and no longer have a stored token, reload the page\n\tif (store.state.appLoaded && !doFastAuth) {\n\t\treturn reloadPage(\"Authentication failed, reloading…\");\n\t}\n\n\t// If we have user and token stored, perform auth without showing sign-in first\n\tif (doFastAuth) {\n\t\tstore.commit(\"currentUserVisibleError\", \"Authorizing…\");\n\t\tupdateLoadingMessage();\n\n\t\tlet lastMessage = -1;\n\n\t\tfor (const network of store.state.networks) {\n\t\t\tfor (const chan of network.channels) {\n\t\t\t\tif (chan.messages.length > 0) {\n\t\t\t\t\tconst id = chan.messages[chan.messages.length - 1].id;\n\n\t\t\t\t\tif (lastMessage < id) {\n\t\t\t\t\t\tlastMessage = id;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst openChannel =\n\t\t\t(store.state.activeChannel && store.state.activeChannel.channel.id) || null;\n\n\t\tsocket.emit(\"auth:perform\", {\n\t\t\tuser,\n\t\t\ttoken,\n\t\t\tlastMessage,\n\t\t\topenChannel,\n\t\t\thasConfig: store.state.serverConfiguration !== null,\n\t\t});\n\t} else {\n\t\tawait showSignIn();\n\t}\n});\n\nasync function showSignIn() {\n\t// TODO: this flashes grey background because it takes a little time for vue to mount signin\n\tif (window.g_TheLoungeRemoveLoading) {\n\t\twindow.g_TheLoungeRemoveLoading();\n\t}\n\n\tif (router.currentRoute.value.name !== \"SignIn\") {\n\t\tawait navigate(\"SignIn\");\n\t}\n}\n\nfunction reloadPage(message: string) {\n\tsocket.disconnect();\n\tstore.commit(\"currentUserVisibleError\", message);\n\tlocation.reload();\n}\n\nfunction updateLoadingMessage() {\n\tconst loading = document.getElementById(\"loading-page-message\");\n\n\tif (loading) {\n\t\tloading.textContent = store.state.currentUserVisibleError;\n\t}\n}\n","import socket from \"../socket\";\nimport {cleanIrcMessage} from \"../../../shared/irc\";\nimport {store} from \"../store\";\nimport {switchToChannel} from \"../router\";\nimport {ClientChan, NetChan, ClientMessage} from \"../types\";\nimport {SharedMsg, MessageType} from \"../../../shared/types/msg\";\nimport {ChanType} from \"../../../shared/types/chan\";\n\nlet pop;\n\ntry {\n\tpop = new Audio();\n\tpop.src = \"audio/pop.wav\";\n} catch {\n\tpop = {\n\t\tplay() {},\n\t};\n}\n\nsocket.on(\"msg\", function (data) {\n\tconst receivingChannel = store.getters.findChannel(data.chan);\n\n\tif (!receivingChannel) {\n\t\treturn;\n\t}\n\n\tlet channel = receivingChannel.channel;\n\tlet isActiveChannel =\n\t\tstore.state.activeChannel && store.state.activeChannel.channel === channel;\n\n\t// Display received notices and errors in currently active channel.\n\t// Reloading the page will put them back into the lobby window.\n\tif (data.msg.showInActive) {\n\t\t// We only want to put errors/notices in active channel if they arrive on the same network\n\t\tif (\n\t\t\tstore.state.activeChannel &&\n\t\t\tstore.state.activeChannel.network === receivingChannel.network\n\t\t) {\n\t\t\tchannel = store.state.activeChannel.channel;\n\n\t\t\t// Do not update unread/highlight counters for this channel\n\t\t\t// as we are putting this message in the active channel\n\t\t\tisActiveChannel = true;\n\n\t\t\tif (data.chan === channel.id) {\n\t\t\t\t// If active channel is the intended channel for this message,\n\t\t\t\t// remove the showInActive flag\n\t\t\t\tdelete data.msg.showInActive;\n\t\t\t} else {\n\t\t\t\tdata.chan = channel.id;\n\t\t\t}\n\t\t} else {\n\t\t\tdelete data.msg.showInActive;\n\t\t}\n\t}\n\n\t// Do not set unread counter for channel if it is currently active on this client\n\t// It may increase on the server before it processes channel open event from this client\n\tif (!isActiveChannel) {\n\t\tif (typeof data.highlight !== \"undefined\") {\n\t\t\tchannel.highlight = data.highlight;\n\t\t}\n\n\t\tif (typeof data.unread !== \"undefined\") {\n\t\t\tchannel.unread = data.unread;\n\t\t}\n\t}\n\n\tchannel.messages.push(data.msg);\n\n\tif (data.msg.self) {\n\t\tchannel.firstUnread = data.msg.id;\n\t} else {\n\t\tnotifyMessage(data.chan, channel, store.state.activeChannel, data.msg);\n\t}\n\n\tlet messageLimit = 0;\n\n\tif (store.state.settings.searchEnabled && store.state.settings.enableEnhancedSearch) {\n\t\t// Keep messages in memory for search/navigation - windowing (kind of) handles render performance\n\t\t// Only trim if we have an excessive amount (>10000) to prevent memory issues\n\t\tmessageLimit = 10000;\n\t} else {\n\t\t// if enhanced search is disabled we can be more conservitive\n\t\t// with the amount of messages kept in memory\n\t\tif (!isActiveChannel) {\n\t\t\t// If message arrives in non active channel, keep only 100 messages\n\t\t\tmessageLimit = 100;\n\t\t} else if (channel.scrolledToBottom) {\n\t\t\t// If message arrives in active channel, keep 1500 messages if scroll is currently at the bottom\n\t\t\t// One history load may load up to 1000 messages at once if condendesed or hidden events are enabled\n\t\t\tmessageLimit = 1500;\n\t\t}\n\t}\n\n\tif (messageLimit > 0 && channel.messages.length > messageLimit) {\n\t\tchannel.messages.splice(0, channel.messages.length - messageLimit);\n\t\tchannel.moreHistoryAvailable = true;\n\t}\n\n\tif (channel.type === ChanType.CHANNEL) {\n\t\tupdateUserList(channel, data.msg);\n\t}\n});\n\ndeclare global {\n\t// this extends the interface from lib.dom with additional stuff which is not\n\t// exactly standard but implemented in some browsers\n\tinterface NotificationOptions {\n\t\ttimestamp?: number; // chrome has it, other browsers ignore it\n\t}\n}\n\nfunction notifyMessage(\n\ttargetId: number,\n\tchannel: ClientChan,\n\tactiveChannel: NetChan | undefined,\n\tmsg: ClientMessage\n) {\n\tif (channel.muted) {\n\t\treturn;\n\t}\n\n\tif (\n\t\tmsg.highlight ||\n\t\t(store.state.settings.notifyAllMessages && msg.type === MessageType.MESSAGE)\n\t) {\n\t\tif (!document.hasFocus() || !activeChannel || activeChannel.channel !== channel) {\n\t\t\tif (store.state.settings.notification) {\n\t\t\t\ttry {\n\t\t\t\t\tpop.play();\n\t\t\t\t} catch {\n\t\t\t\t\t// On mobile, sounds can not be played without user interaction.\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tstore.state.settings.desktopNotifications &&\n\t\t\t\t\"Notification\" in window &&\n\t\t\t\tNotification.permission === \"granted\"\n\t\t\t) {\n\t\t\t\tlet title: string;\n\t\t\t\tlet body: string;\n\t\t\t\t// TODO: fix msg type and get rid of that conditional\n\t\t\t\tconst nick = msg.from && msg.from.nick ? msg.from.nick : \"unkonown\";\n\n\t\t\t\tif (msg.type === MessageType.INVITE) {\n\t\t\t\t\ttitle = \"New channel invite:\";\n\t\t\t\t\tbody = nick + \" invited you to \" + msg.channel;\n\t\t\t\t} else {\n\t\t\t\t\ttitle = nick;\n\n\t\t\t\t\tif (channel.type !== ChanType.QUERY) {\n\t\t\t\t\t\ttitle += ` (${channel.name})`;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (msg.type === MessageType.MESSAGE) {\n\t\t\t\t\t\ttitle += \" says:\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// TODO: fix msg type and get rid of that conditional\n\t\t\t\t\tbody = cleanIrcMessage(msg.text ? msg.text : \"\");\n\t\t\t\t}\n\n\t\t\t\tconst timestamp = Date.parse(String(msg.time));\n\n\t\t\t\ttry {\n\t\t\t\t\tif (store.state.hasServiceWorker) {\n\t\t\t\t\t\tnavigator.serviceWorker.ready\n\t\t\t\t\t\t\t.then((registration) => {\n\t\t\t\t\t\t\t\tregistration.active?.postMessage({\n\t\t\t\t\t\t\t\t\ttype: \"notification\",\n\t\t\t\t\t\t\t\t\tchanId: targetId,\n\t\t\t\t\t\t\t\t\ttimestamp: timestamp,\n\t\t\t\t\t\t\t\t\ttitle: title,\n\t\t\t\t\t\t\t\t\tbody: body,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\t\t// no-op\n\t\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst notify = new Notification(title, {\n\t\t\t\t\t\t\ttag: `chan-${targetId}`,\n\t\t\t\t\t\t\tbadge: \"img/icon-alerted-black-transparent-bg-72x72px.png\",\n\t\t\t\t\t\t\ticon: \"img/icon-alerted-grey-bg-192x192px.png\",\n\t\t\t\t\t\t\tbody: body,\n\t\t\t\t\t\t\ttimestamp: timestamp,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tnotify.addEventListener(\"click\", function () {\n\t\t\t\t\t\t\tthis.close();\n\t\t\t\t\t\t\twindow.focus();\n\n\t\t\t\t\t\t\tconst channelTarget = store.getters.findChannel(targetId);\n\n\t\t\t\t\t\t\tif (channelTarget) {\n\t\t\t\t\t\t\t\tswitchToChannel(channelTarget.channel);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// `new Notification(...)` is not supported and should be silenced.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction updateUserList(channel: ClientChan, msg: SharedMsg) {\n\tswitch (msg.type) {\n\t\tcase MessageType.MESSAGE: // fallthrough\n\n\t\tcase MessageType.ACTION: {\n\t\t\tconst user = channel.users.find((u) => u.nick === msg.from?.nick);\n\n\t\t\tif (user) {\n\t\t\t\tuser.lastMessage = new Date(msg.time).getTime() || Date.now();\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase MessageType.QUIT: // fallthrough\n\n\t\tcase MessageType.PART: {\n\t\t\tconst idx = channel.users.findIndex((u) => u.nick === msg.from?.nick);\n\n\t\t\tif (idx > -1) {\n\t\t\t\tchannel.users.splice(idx, 1);\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase MessageType.KICK: {\n\t\t\tconst idx = channel.users.findIndex((u) => u.nick === msg.target?.nick);\n\n\t\t\tif (idx > -1) {\n\t\t\t\tchannel.users.splice(idx, 1);\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t}\n}\n","import {ClientChan, ClientMessage} from \"./types\";\nimport {SharedNetworkChan} from \"../../shared/types/network\";\nimport {SharedMsg, MessageType} from \"../../shared/types/msg\";\nimport {ChanType} from \"../../shared/types/chan\";\n\nexport function toClientChan(shared: SharedNetworkChan): ClientChan {\n\tconst history: string[] = [\"\"].concat(\n\t\tshared.messages\n\t\t\t.filter((m) => m.self && m.text && m.type === MessageType.MESSAGE)\n\t\t\t// TS is too stupid to see the nil guard on filter... so we monkey patch it\n\t\t\t.map((m): string => (m.text ? m.text : \"\"))\n\t\t\t.reverse()\n\t\t\t.slice(0, 99)\n\t);\n\t// filter the unused vars\n\tconst {messages, ...props} = shared;\n\tconst channel: ClientChan = {\n\t\t...props,\n\t\teditTopic: false,\n\t\tpendingMessage: \"\",\n\t\tinputHistoryPosition: 0,\n\t\thistoryLoading: false,\n\t\tscrolledToBottom: true,\n\t\tusers: [],\n\t\tusersOutdated: shared.type === ChanType.CHANNEL ? true : false,\n\t\tmoreHistoryAvailable: shared.totalMessages > shared.messages.length,\n\t\tinputHistory: history,\n\t\tmessages: sharedMsgToClientMsg(messages),\n\t\t// Initialize groups for reactivity (will be populated by SPGROUPS)\n\t\tgroups: shared.groups || undefined,\n\t};\n\treturn channel;\n}\n\nfunction sharedMsgToClientMsg(shared: SharedMsg[]): ClientMessage[] {\n\t// TODO: this is a stub for now, we will want to populate client specific stuff here\n\treturn shared;\n}\n","import socket from \"../socket\";\nimport storage from \"../localStorage\";\nimport {toClientChan} from \"../chan\";\nimport {router, switchToChannel, navigate} from \"../router\";\nimport {store} from \"../store\";\nimport parseIrcUri from \"../helpers/parseIrcUri\";\nimport {ClientNetwork, ClientChan} from \"../types\";\nimport {SharedNetwork, SharedNetworkChan} from \"../../../shared/types/network\";\n\nsocket.on(\"init\", async function (data) {\n\tstore.commit(\"networks\", mergeNetworkData(data.networks));\n\tstore.commit(\"isConnected\", true);\n\tstore.commit(\"currentUserVisibleError\", null);\n\n\tif (data.token) {\n\t\tstorage.set(\"token\", data.token);\n\t}\n\n\tif (!store.state.appLoaded) {\n\t\tstore.commit(\"appLoaded\");\n\n\t\tsocket.emit(\"setting:get\");\n\n\t\ttry {\n\t\t\tawait router.isReady();\n\t\t} catch {\n\t\t\t// if the router throws an error, it means the route isn't matched,\n\t\t\t// so we can continue on.\n\t\t}\n\n\t\tif (window.g_TheLoungeRemoveLoading) {\n\t\t\twindow.g_TheLoungeRemoveLoading();\n\t\t}\n\n\t\tif (await handleQueryParams()) {\n\t\t\t// If we handled query parameters like irc:// links or just general\n\t\t\t// connect parameters in public mode, then nothing to do here\n\t\t\treturn;\n\t\t}\n\n\t\t// If we are on an unknown route or still on SignIn component\n\t\t// then we can open last known channel on server, or Connect window if none\n\t\tif (!router.currentRoute?.value?.name || router.currentRoute?.value?.name === \"SignIn\") {\n\t\t\tconst channel = store.getters.findChannel(data.active);\n\n\t\t\tif (channel) {\n\t\t\t\tswitchToChannel(channel.channel);\n\t\t\t} else if (store.state.networks.length > 0) {\n\t\t\t\t// Server is telling us to open a channel that does not exist\n\t\t\t\t// For example, it can be unset if you first open the page after server start\n\t\t\t\tswitchToChannel(store.state.networks[0].channels[0]);\n\t\t\t} else {\n\t\t\t\tawait navigate(\"Connect\");\n\t\t\t}\n\t\t}\n\t}\n});\n\nfunction mergeNetworkData(newNetworks: SharedNetwork[]): ClientNetwork[] {\n\tconst stored = storage.get(\"thelounge.networks.collapsed\");\n\tconst collapsedNetworks = stored ? new Set(JSON.parse(stored)) : new Set();\n\tconst result: ReturnType<typeof mergeNetworkData> = [];\n\n\tfor (const sharedNet of newNetworks) {\n\t\tconst currentNetwork = store.getters.findNetwork(sharedNet.uuid);\n\n\t\t// If this network is new, set some default variables and initalize channel variables\n\t\tif (!currentNetwork) {\n\t\t\tconst newNet: ClientNetwork = {\n\t\t\t\t...sharedNet,\n\t\t\t\tchannels: sharedNet.channels.map(toClientChan),\n\t\t\t\tisJoinChannelShown: false,\n\t\t\t\tisCollapsed: collapsedNetworks.has(sharedNet.uuid),\n\t\t\t};\n\t\t\tresult.push(newNet);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Merge received network object into existing network object on the client\n\t\t// so the object reference stays the same (e.g. for currentChannel state)\n\t\tfor (const key in sharedNet) {\n\t\t\tif (!Object.prototype.hasOwnProperty.call(sharedNet, key)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Channels require extra care to be merged correctly\n\t\t\tif (key === \"channels\") {\n\t\t\t\tcurrentNetwork.channels = mergeChannelData(\n\t\t\t\t\tcurrentNetwork.channels,\n\t\t\t\t\tsharedNet.channels\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcurrentNetwork[key] = sharedNet[key];\n\t\t\t}\n\t\t}\n\n\t\tresult.push(currentNetwork);\n\t}\n\n\treturn result;\n}\n\nfunction mergeChannelData(\n\toldChannels: ClientChan[],\n\tnewChannels: SharedNetworkChan[]\n): ClientChan[] {\n\tconst result: ReturnType<typeof mergeChannelData> = [];\n\n\tfor (const newChannel of newChannels) {\n\t\tconst currentChannel = oldChannels.find((chan) => chan.id === newChannel.id);\n\n\t\tif (!currentChannel) {\n\t\t\t// This is a new channel that was joined while client was disconnected, initialize it\n\t\t\tconst current = toClientChan(newChannel);\n\t\t\tresult.push(current);\n\t\t\temitNamesOrMarkUsersOudated(current); // TODO: this should not carry logic like that\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Merge received channel object into existing currentChannel\n\t\t// so the object references are exactly the same (e.g. in store.state.activeChannel)\n\n\t\temitNamesOrMarkUsersOudated(currentChannel); // TODO: this should not carry logic like that\n\n\t\t// Reconnection only sends new messages, so merge it on the client\n\t\t// Only concat if server sent us less than 100 messages so we don't introduce gaps\n\t\tif (currentChannel.messages && newChannel.messages.length < 100) {\n\t\t\tcurrentChannel.messages = currentChannel.messages.concat(newChannel.messages);\n\t\t} else {\n\t\t\tcurrentChannel.messages = newChannel.messages;\n\t\t}\n\n\t\t// TODO: this is copies more than what the compiler knows about\n\t\tfor (const key in newChannel) {\n\t\t\tif (!Object.hasOwn(currentChannel, key)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (key === \"messages\") {\n\t\t\t\t// already handled\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcurrentChannel[key] = newChannel[key];\n\t\t}\n\n\t\tresult.push(currentChannel);\n\t}\n\n\treturn result;\n}\n\nfunction emitNamesOrMarkUsersOudated(chan: ClientChan) {\n\tif (store.state.activeChannel && store.state.activeChannel.channel === chan) {\n\t\t// For currently open channel, request the user list straight away\n\t\tsocket.emit(\"names\", {\n\t\t\ttarget: chan.id,\n\t\t});\n\t\tchan.usersOutdated = false;\n\t\treturn;\n\t}\n\n\t// For all other channels, mark the user list as outdated\n\t// so an update will be requested whenever user switches to these channels\n\tchan.usersOutdated = true;\n}\n\nasync function handleQueryParams() {\n\tif (!(\"URLSearchParams\" in window)) {\n\t\treturn false;\n\t}\n\n\tconst params = new URLSearchParams(document.location.search);\n\n\tif (params.has(\"uri\")) {\n\t\t// Set default connection settings from IRC protocol links\n\t\tconst uri = params.get(\"uri\");\n\t\tconst queryParams = parseIrcUri(String(uri));\n\t\tremoveQueryParams();\n\t\tawait router.push({name: \"Connect\", query: queryParams});\n\t\treturn true;\n\t}\n\n\tif (document.body.classList.contains(\"public\") && document.location.search) {\n\t\t// Set default connection settings from url params\n\t\tconst queryParams = Object.fromEntries(params.entries());\n\t\tremoveQueryParams();\n\t\tawait router.push({name: \"Connect\", query: queryParams});\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n// Remove query parameters from url without reloading the page\nfunction removeQueryParams() {\n\tconst cleanUri = window.location.origin + window.location.pathname + window.location.hash;\n\twindow.history.replaceState(null, \"\", cleanUri);\n}\n","import constants from \"../constants\";\nimport socket from \"../socket\";\n\nsocket.on(\"commands\", function (commands) {\n\tif (commands) {\n\t\tconstants.commands = commands;\n\t}\n});\n","export default (stringUri: string) => {\n\tconst data = {\n\t\tname: \"\",\n\t\thost: \"\",\n\t\tport: \"\",\n\t\tjoin: \"\",\n\t\ttls: false,\n\t};\n\n\ttry {\n\t\t// https://tools.ietf.org/html/draft-butcher-irc-url-04\n\t\tconst uri = new URL(stringUri);\n\n\t\t// Replace protocol with a \"special protocol\" (that's what it's called in WHATWG spec)\n\t\t// So that the uri can be properly parsed\n\t\tif (uri.protocol === \"irc:\") {\n\t\t\turi.protocol = \"http:\";\n\n\t\t\tif (!uri.port) {\n\t\t\t\turi.port = \"6667\";\n\t\t\t}\n\t\t} else if (uri.protocol === \"ircs:\") {\n\t\t\turi.protocol = \"https:\";\n\n\t\t\tif (!uri.port) {\n\t\t\t\turi.port = \"6697\";\n\t\t\t}\n\n\t\t\tdata.tls = true;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!uri.hostname) {\n\t\t\treturn {};\n\t\t}\n\n\t\tdata.host = data.name = uri.hostname;\n\t\tdata.port = uri.port;\n\n\t\tlet channel = \"\";\n\n\t\tif (uri.pathname.length > 1) {\n\t\t\tchannel = uri.pathname.substr(1); // Remove slash\n\t\t}\n\n\t\tif (uri.hash.length > 1) {\n\t\t\tchannel += uri.hash;\n\t\t}\n\n\t\t// We don't split channels or append # here because the connect window takes care of that\n\t\tdata.join = channel;\n\t} catch {\n\t\t// do nothing on invalid uri\n\t}\n\n\treturn data;\n};\n","import socket from \"../socket\";\nimport {store} from \"../store\";\nimport {switchToChannel} from \"../router\";\nimport {ClientChan} from \"../types\";\nimport {toClientChan} from \"../chan\";\n\nsocket.on(\"join\", function (data) {\n\tconst network = store.getters.findNetwork(data.network);\n\n\tif (!network) {\n\t\treturn;\n\t}\n\n\tconst clientChan: ClientChan = toClientChan(data.chan);\n\tnetwork.channels.splice(data.index || -1, 0, clientChan);\n\n\t// Queries do not automatically focus, unless the user did a whois\n\tif (data.chan.type === \"query\" && !data.shouldOpen) {\n\t\treturn;\n\t}\n\n\tconst chan = store.getters.findChannel(data.chan.id);\n\n\tif (chan) {\n\t\tswitchToChannel(chan.channel);\n\t} else {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(\"Could not find channel\", data.chan.id);\n\t}\n});\n","import {nextTick} from \"vue\";\n\nimport socket from \"../socket\";\nimport {store} from \"../store\";\nimport {MessageType} from \"../../../shared/types/msg\";\n\nsocket.on(\"more\", async (data) => {\n\tconst channel = store.getters.findChannel(data.chan)?.channel;\n\n\tif (!channel) {\n\t\treturn;\n\t}\n\n\tchannel.inputHistory = channel.inputHistory.concat(\n\t\tdata.messages\n\t\t\t.filter((m) => m.self && m.text && m.type === MessageType.MESSAGE)\n\t\t\t// TS is too stupid to see the guard in .filter(), so we monkey patch it\n\t\t\t// to please the compiler\n\t\t\t.map((m) => (m.text ? m.text : \"\"))\n\t\t\t.reverse()\n\t\t\t.slice(0, 100 - channel.inputHistory.length)\n\t);\n\tchannel.moreHistoryAvailable =\n\t\tdata.totalMessages > channel.messages.length + data.messages.length;\n\tchannel.messages.unshift(...data.messages);\n\n\tawait nextTick();\n\tchannel.historyLoading = false;\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\nimport {ClientMention} from \"../types\";\nimport {SharedMention} from \"../../../shared/types/mention\";\n\nsocket.on(\"mentions:list\", function (data) {\n\tstore.commit(\"mentions\", data.map(sharedToClientMention));\n});\n\nfunction sharedToClientMention(shared: SharedMention): ClientMention {\n\tconst mention: ClientMention = {\n\t\t...shared,\n\t\tlocaletime: \"\", // TODO: can't be right\n\t\tchannel: null,\n\t};\n\treturn mention;\n}\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"msg:preview\", function (data) {\n\tconst netChan = store.getters.findChannel(data.chan);\n\tconst message = netChan?.channel.messages.find((m) => m.id === data.id);\n\n\tif (!message || !message.previews) {\n\t\treturn;\n\t}\n\n\tconst previewIndex = message.previews.findIndex((m) => m.link === data.preview.link);\n\n\tif (previewIndex > -1) {\n\t\tmessage.previews[previewIndex] = data.preview;\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\nimport {switchToChannel} from \"../router\";\n\nsocket.on(\"msg:special\", function (data) {\n\tconst netChan = store.getters.findChannel(data.chan);\n\n\tif (!netChan) {\n\t\treturn;\n\t}\n\n\tnetChan.channel.data = data.data;\n\tswitchToChannel(netChan.channel);\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"names\", function (data) {\n\tconst netChan = store.getters.findChannel(data.id);\n\n\tif (netChan) {\n\t\tnetChan.channel.users = data.users;\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\nimport {switchToChannel} from \"../router\";\nimport {toClientChan} from \"../chan\";\nimport {ClientNetwork} from \"../types\";\nimport {ChanState} from \"../../../shared/types/chan\";\n\nsocket.on(\"network\", function (data) {\n\tconst network: ClientNetwork = {\n\t\t...data.network,\n\t\tchannels: data.network.channels.map(toClientChan),\n\t\tisJoinChannelShown: false,\n\t\tisCollapsed: false,\n\t};\n\n\tstore.commit(\"networks\", [...store.state.networks, network]);\n\n\t// Open last channel specified in `join`\n\tswitchToChannel(network.channels[network.channels.length - 1]);\n});\n\nsocket.on(\"network:options\", function (data) {\n\tconst network = store.getters.findNetwork(data.network);\n\n\tif (network) {\n\t\tnetwork.serverOptions = data.serverOptions;\n\t}\n});\n\nsocket.on(\"network:status\", function (data) {\n\tconst network = store.getters.findNetwork(data.network);\n\n\tif (!network) {\n\t\treturn;\n\t}\n\n\tnetwork.status.connected = data.connected;\n\tnetwork.status.secure = data.secure;\n\n\tif (!data.connected) {\n\t\tnetwork.channels.forEach((channel) => {\n\t\t\tchannel.users = []; // TODO: untangle this\n\t\t\tchannel.state = ChanState.PARTED;\n\t\t});\n\t}\n});\n\nsocket.on(\"channel:state\", function (data) {\n\tconst channel = store.getters.findChannel(data.chan);\n\n\tif (channel) {\n\t\tchannel.channel.state = data.state;\n\t}\n});\n\nsocket.on(\"network:info\", function (data) {\n\tconst network = store.getters.findNetwork(data.uuid);\n\n\tif (!network) {\n\t\treturn;\n\t}\n\n\tfor (const key in data) {\n\t\t(network as Record<string, unknown>)[key] = data[key];\n\t}\n});\n\nsocket.on(\"network:name\", function (data) {\n\tconst network = store.getters.findNetwork(data.uuid);\n\n\tif (network) {\n\t\tnetwork.name = network.channels[0].name = data.name;\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"nick\", function (data) {\n\tconst network = store.getters.findNetwork(data.network);\n\n\tif (network) {\n\t\tnetwork.nick = data.nick;\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\n// Sync unread badge and marker when other clients open a channel\nsocket.on(\"open\", function (id) {\n\tif (id < 1) {\n\t\treturn;\n\t}\n\n\t// Don't do anything if the channel is active on this client\n\tif (store.state.activeChannel && store.state.activeChannel.channel.id === id) {\n\t\treturn;\n\t}\n\n\t// Clear the unread badge\n\tconst channel = store.getters.findChannel(id);\n\n\tif (channel) {\n\t\tchannel.channel.highlight = 0;\n\t\tchannel.channel.unread = 0;\n\n\t\tif (channel.channel.messages.length > 0) {\n\t\t\tchannel.channel.firstUnread =\n\t\t\t\tchannel.channel.messages[channel.channel.messages.length - 1].id;\n\t\t}\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\nimport {switchToChannel} from \"../router\";\n\nsocket.on(\"part\", async function (data) {\n\t// When parting from the active channel/query, jump to the network's lobby\n\tif (store.state.activeChannel && store.state.activeChannel.channel.id === data.chan) {\n\t\tswitchToChannel(store.state.activeChannel.network.channels[0]);\n\t}\n\n\tconst channel = store.getters.findChannel(data.chan);\n\n\tif (!channel) {\n\t\treturn;\n\t}\n\n\tconst index = channel.network.channels.findIndex((c) => c.id === data.chan);\n\tchannel.network.channels.splice(index, 1);\n\n\tawait store.dispatch(\"partChannel\", channel);\n});\n","import socket from \"../socket\";\nimport {switchToChannel, navigate} from \"../router\";\nimport {store} from \"../store\";\n\nsocket.on(\"quit\", async function (data) {\n\t// If we're in a channel, and it's on the network that is being removed,\n\t// then open another channel window\n\tconst isCurrentNetworkBeingRemoved =\n\t\tstore.state.activeChannel && store.state.activeChannel.network.uuid === data.network;\n\n\tstore.commit(\"removeNetwork\", data.network);\n\n\tif (!isCurrentNetworkBeingRemoved) {\n\t\treturn;\n\t}\n\n\tif (store.state.networks.length > 0) {\n\t\tswitchToChannel(store.state.networks[0].channels[0]);\n\t} else {\n\t\tawait navigate(\"Connect\");\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"sync_sort:networks\", function (data) {\n\tstore.commit(\"sortNetworks\", (a, b) => data.order.indexOf(a.uuid) - data.order.indexOf(b.uuid));\n});\n\nsocket.on(\"sync_sort:channels\", function (data) {\n\tconst network = store.getters.findNetwork(data.network);\n\n\tif (!network) {\n\t\treturn;\n\t}\n\n\tnetwork.channels.sort((a, b) => data.order.indexOf(a.id) - data.order.indexOf(b.id));\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"topic\", function (data) {\n\tconst channel = store.getters.findChannel(data.chan);\n\n\tif (channel) {\n\t\tchannel.channel.topic = data.topic;\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"users\", function (data) {\n\tif (store.state.activeChannel && store.state.activeChannel.channel.id === data.chan) {\n\t\treturn socket.emit(\"names\", {\n\t\t\ttarget: data.chan,\n\t\t});\n\t}\n\n\tconst channel = store.getters.findChannel(data.chan);\n\n\tif (channel) {\n\t\tchannel.channel.usersOutdated = true;\n\t}\n});\n","import socket from \"../socket\";\nimport Auth from \"../auth\";\n\nsocket.on(\"sign-out\", function () {\n\tAuth.signout();\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"sessions:list\", function (data) {\n\tdata.sort((a, b) => b.lastUse - a.lastUse);\n\tstore.commit(\"sessions\", data);\n});\n","import socket from \"../socket\";\nimport upload from \"../upload\";\nimport {store} from \"../store\";\n\nsocket.once(\"configuration\", function (data) {\n\tstore.commit(\"serverConfiguration\", data);\n\n\t// 'theme' setting depends on serverConfiguration.themes so\n\t// settings cannot be applied before this point\n\tvoid store.dispatch(\"settings/applyAll\");\n\n\tif (data.fileUpload) {\n\t\tupload.initialize();\n\t}\n\n\t// If localStorage contains a theme that does not exist on this server, switch\n\t// back to its default theme.\n\tconst currentTheme = data.themes.find((t) => t.name === store.state.settings.theme);\n\n\tif (currentTheme === undefined) {\n\t\tvoid store.dispatch(\"settings/update\", {\n\t\t\tname: \"theme\",\n\t\t\tvalue: data.defaultTheme,\n\t\t\tsync: true,\n\t\t});\n\t} else if (currentTheme.themeColor) {\n\t\t(document.querySelector('meta[name=\"theme-color\"]') as HTMLMetaElement).content =\n\t\t\tcurrentTheme.themeColor;\n\t}\n\n\tif (document.body.classList.contains(\"public\")) {\n\t\twindow.addEventListener(\"beforeunload\", (e) => {\n\t\t\te.preventDefault();\n\t\t\te.returnValue = \"Are you sure you want to navigate away from this page?\";\n\t\t});\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"changelog\", function (data) {\n\tstore.commit(\"versionData\", data);\n\tstore.commit(\"versionDataExpired\", false);\n\n\tlet status;\n\n\tif (data.latest) {\n\t\tstatus = \"new-version\";\n\t} else if (data.packages) {\n\t\tstatus = \"new-packages\";\n\t} else if (data.current.changelog) {\n\t\tstatus = \"up-to-date\";\n\t} else {\n\t\tstatus = \"error\";\n\t}\n\n\tstore.commit(\"versionStatus\", status);\n\n\t// When there is a button to refresh the checker available, display it when\n\t// data is expired. Before that, server would return same information anyway.\n\tif (data.expiresAt) {\n\t\tconst expires = data.expiresAt - Date.now();\n\n\t\tif (expires > 0) {\n\t\t\tsetTimeout(() => store.commit(\"versionDataExpired\", true), expires);\n\t\t} else {\n\t\t\tstore.commit(\"versionDataExpired\", true);\n\t\t}\n\t}\n});\n\nsocket.on(\"changelog:newversion\", () => {\n\tif (!store.state.serverConfiguration) {\n\t\treturn;\n\t}\n\n\tstore.state.serverConfiguration.isUpdateAvailable = true;\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"setting:new\", async function (data) {\n\tconst name = data.name;\n\tconst value = data.value;\n\tawait store.dispatch(\"settings/update\", {name, value, sync: false});\n});\n\nsocket.on(\"setting:all\", async function (settings) {\n\tconst serverHasSettings = Object.keys(settings).length > 0;\n\n\tstore.commit(\"serverHasSettings\", serverHasSettings);\n\n\tif (serverHasSettings) {\n\t\tfor (const name in settings) {\n\t\t\tawait store.dispatch(\"settings/update\", {name, value: settings[name], sync: false});\n\t\t}\n\t} else {\n\t\tawait store.dispatch(\"settings/syncAll\");\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"history:clear\", function (data) {\n\tconst netChan = store.getters.findChannel(data.target);\n\n\tif (netChan?.channel) {\n\t\tnetChan.channel.messages = [];\n\t\tnetChan.channel.unread = 0;\n\t\tnetChan.channel.highlight = 0;\n\t\tnetChan.channel.firstUnread = 0;\n\t\tnetChan.channel.moreHistoryAvailable = false;\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"search:results\", (response) => {\n\tconst pendingQuery = store.state.messageSearchPendingQuery;\n\n\tif (\n\t\t!pendingQuery ||\n\t\tpendingQuery.channelName !== response.channelName ||\n\t\tpendingQuery.networkUuid !== response.networkUuid ||\n\t\tpendingQuery.offset !== response.offset ||\n\t\tpendingQuery.searchTerm !== response.searchTerm\n\t) {\n\t\t// This is a response from a search that we are not interested in.\n\t\t// The user may have entered a different search while one was still in flight.\n\t\t// We can simply drop it on the floor.\n\t\treturn;\n\t}\n\n\tstore.commit(\"messageSearchPendingQuery\", null);\n\n\tif (store.state.messageSearchResults) {\n\t\tstore.commit(\"addMessageSearchResults\", response);\n\t\treturn;\n\t}\n\n\tstore.commit(\"messageSearchResults\", {results: response.results});\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\nimport {ChanType} from \"../../../shared/types/chan\";\n\nsocket.on(\"mute:changed\", (response) => {\n\tconst {target, status} = response;\n\n\tconst netChan = store.getters.findChannel(target);\n\n\tif (netChan?.channel.type === ChanType.LOBBY) {\n\t\tfor (const chan of netChan.network.channels) {\n\t\t\tif (chan.type !== ChanType.SPECIAL) {\n\t\t\t\tchan.muted = status;\n\t\t\t}\n\t\t}\n\t} else if (netChan) {\n\t\tnetChan.channel.muted = status;\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\nsocket.on(\"pin:changed\", (response) => {\n\tconst {target, status} = response;\n\n\tconst netChan = store.getters.findChannel(target);\n\n\tif (netChan) {\n\t\tnetChan.channel.pinned = status;\n\t}\n});\n","import socket from \"../socket\";\nimport {store} from \"../store\";\n\n// Handle channel groups from seedpool/enhanced capable servers\nsocket.on(\"channel:groups\", (data) => {\n\tconst channel = store.getters.findChannel(data.chan)?.channel;\n\n\tif (!channel) {\n\t\treturn;\n\t}\n\n\t// Create a new array to ensure Vue reactivity detects the change\n\tchannel.groups = [...data.groups];\n});\n","import Mousetrap from \"mousetrap\";\n\nimport {store} from \"./store\";\nimport {switchToChannel, router, navigate} from \"./router\";\nimport isChannelCollapsed from \"./helpers/isChannelCollapsed\";\nimport isIgnoredKeybind from \"./helpers/isIgnoredKeybind\";\nimport listenForTwoFingerSwipes from \"./helpers/listenForTwoFingerSwipes\";\nimport {ClientChan} from \"./types\";\nimport {ChanType} from \"../../shared/types/chan\";\n\n// Switch to the next/previous window in the channel list.\nMousetrap.bind([\"alt+up\", \"alt+down\"], function (e, keys) {\n\tif (isIgnoredKeybind(e)) {\n\t\treturn true;\n\t}\n\n\tnavigateWindow(keys.split(\"+\").pop() === \"up\" ? -1 : 1);\n\n\treturn false;\n});\n\nlistenForTwoFingerSwipes(function (cardinalDirection: string) {\n\tif (cardinalDirection === \"e\" || cardinalDirection === \"w\") {\n\t\tnavigateWindow(cardinalDirection === \"e\" ? -1 : 1);\n\t}\n});\n\nfunction navigateWindow(direction: number) {\n\tif (store.state.networks.length === 0) {\n\t\treturn;\n\t}\n\n\tconst flatChannels: ClientChan[] = [];\n\tlet index = -1;\n\n\tfor (const network of store.state.networks) {\n\t\tfor (const channel of network.channels) {\n\t\t\tif (isChannelCollapsed(network, channel)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (index === -1 && store.state.activeChannel?.channel === channel) {\n\t\t\t\tindex = flatChannels.length;\n\t\t\t}\n\n\t\t\tflatChannels.push(channel);\n\t\t}\n\t}\n\n\t// Circular array, and a modulo bug workaround because in JS it stays negative\n\tconst length = flatChannels.length;\n\tindex = (((index + direction) % length) + length) % length;\n\n\tjumpToChannel(flatChannels[index]);\n}\n\n// Switch to the next/previous lobby in the channel list\nMousetrap.bind([\"alt+shift+up\", \"alt+shift+down\"], function (e, keys) {\n\tif (isIgnoredKeybind(e)) {\n\t\treturn true;\n\t}\n\n\tconst length = store.state.networks.length;\n\n\tif (length === 0) {\n\t\treturn false;\n\t}\n\n\tconst direction = keys.split(\"+\").pop() === \"up\" ? -1 : 1;\n\tlet index = 0;\n\n\t// If we're in another window, jump to first lobby\n\tif (store.state.activeChannel) {\n\t\tindex = store.state.networks.findIndex((n) => n === store.state.activeChannel?.network);\n\n\t\t// If we're in a channel, and it's not the lobby, jump to lobby of this network when going up\n\t\tif (direction !== -1 || store.state.activeChannel?.channel.type === ChanType.LOBBY) {\n\t\t\tindex = (((index + direction) % length) + length) % length;\n\t\t}\n\t}\n\n\tjumpToChannel(store.state.networks[index].channels[0]);\n\n\treturn false;\n});\n\n// Switch to the next/previous unread chat\nMousetrap.bind([\"alt+mod+up\", \"alt+mod+down\"], function (e, keys) {\n\tif (isIgnoredKeybind(e)) {\n\t\treturn true;\n\t}\n\n\tconst channels = store.state.networks\n\t\t.map((net) =>\n\t\t\tnet.channels.filter(\n\t\t\t\t(chan) => chan.unread || chan === store.state.activeChannel?.channel\n\t\t\t)\n\t\t)\n\t\t.flat();\n\n\tif (channels.length === 0) {\n\t\treturn;\n\t}\n\n\tlet index = channels.findIndex((chan) => chan === store.state.activeChannel?.channel);\n\n\tconst length = channels.length;\n\tconst direction = keys.split(\"+\").pop() === \"up\" ? -1 : 1;\n\tindex = (((index + direction) % length) + length) % length;\n\n\tjumpToChannel(channels[index]);\n\n\treturn false;\n});\n\n// Jump to the first window with a highlight in it, or the first with unread\n// activity if there are none with highlights.\nMousetrap.bind([\"alt+a\"], function (e) {\n\tif (isIgnoredKeybind(e)) {\n\t\treturn true;\n\t}\n\n\tlet targetChannel;\n\n\touter_loop: for (const network of store.state.networks) {\n\t\tfor (const chan of network.channels) {\n\t\t\tif (chan.highlight) {\n\t\t\t\ttargetChannel = chan;\n\t\t\t\tbreak outer_loop;\n\t\t\t}\n\n\t\t\tif (chan.unread && !targetChannel) {\n\t\t\t\ttargetChannel = chan;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (targetChannel) {\n\t\tjumpToChannel(targetChannel);\n\t}\n\n\treturn false;\n});\n\n// Show the help menu.\nMousetrap.bind([\"alt+/\"], function (e) {\n\tif (isIgnoredKeybind(e)) {\n\t\treturn true;\n\t}\n\n\t/* eslint-disable no-console */\n\tnavigate(\"Help\").catch((err) => console.log(err));\n\treturn false;\n});\n\nfunction jumpToChannel(targetChannel: ClientChan) {\n\tswitchToChannel(targetChannel);\n\n\tconst element = document.querySelector(\n\t\t`#sidebar .channel-list-item[aria-controls=\"#chan-${targetChannel.id}\"]`\n\t);\n\n\tif (element) {\n\t\tscrollIntoViewNicely(element);\n\t}\n}\n\n// Ignored keys which should not automatically focus the input bar\nconst ignoredKeys = {\n\t8: true, // Backspace\n\t9: true, // Tab\n\t12: true, // Clear\n\t16: true, // Shift\n\t17: true, // Control\n\t18: true, // Alt\n\t19: true, // Pause\n\t20: true, // CapsLock\n\t27: true, // Escape\n\t35: true, // End\n\t36: true, // Home\n\t37: true, // ArrowLeft\n\t38: true, // ArrowUp\n\t39: true, // ArrowRight\n\t40: true, // ArrowDown\n\t45: true, // Insert\n\t46: true, // Delete\n\t112: true, // F1\n\t113: true, // F2\n\t114: true, // F3\n\t115: true, // F4\n\t116: true, // F5\n\t117: true, // F6\n\t118: true, // F7\n\t119: true, // F8\n\t120: true, // F9\n\t121: true, // F10\n\t122: true, // F11\n\t123: true, // F12\n\t144: true, // NumLock\n\t145: true, // ScrollLock\n\t224: true, // Meta\n};\n\ndocument.addEventListener(\"keydown\", (e) => {\n\t// Allow navigating back to the previous page when on the help screen.\n\tif (e.key === \"Escape\" && router.currentRoute.value.name === \"Help\") {\n\t\trouter.go(-1);\n\t\treturn;\n\t}\n\n\t// Ignore any key that uses alt modifier\n\t// Ignore keys defined above\n\tif (e.altKey || ignoredKeys[e.which]) {\n\t\treturn;\n\t}\n\n\t// Ignore all ctrl keys except for ctrl+v to allow pasting\n\tif ((e.ctrlKey || e.metaKey) && e.which !== 86) {\n\t\treturn;\n\t}\n\n\t// Redirect pagedown/pageup keys to messages container so it scrolls\n\tif (e.which === 33 || e.which === 34) {\n\t\tconst chat = document.querySelector(\".window .chat-content .chat\");\n\n\t\tif (chat) {\n\t\t\t(chat as HTMLDivElement).focus();\n\t\t}\n\n\t\treturn;\n\t}\n\n\tconst tagName = (e.target as HTMLElement).tagName;\n\n\t// Ignore if we're already typing into <input> or <textarea>\n\tif (tagName === \"INPUT\" || tagName === \"TEXTAREA\") {\n\t\treturn;\n\t}\n\n\tconst input = document.getElementById(\"input\");\n\n\tif (!input) {\n\t\treturn;\n\t}\n\n\tinput.focus();\n\n\t// On enter, focus the input but do not propagate the event\n\t// This way, a new line is not inserted\n\tif (e.which === 13) {\n\t\te.preventDefault();\n\t}\n});\n\nfunction scrollIntoViewNicely(el) {\n\t// Ideally this would use behavior: \"smooth\", but that does not consistently work in e.g. Chrome\n\t// https://github.com/iamdustan/smoothscroll/issues/28#issuecomment-364061459\n\tel.scrollIntoView({block: \"center\", inline: \"nearest\"});\n}\n","import distance from \"./distance\";\n\n// onTwoFingerSwipe will be called with a cardinal direction (\"n\", \"e\", \"s\" or\n// \"w\") as its only argument.\nfunction listenForTwoFingerSwipes(onTwoFingerSwipe) {\n\tlet history: {\n\t\tcenter: number[];\n\t\ttimestamp: number;\n\t}[] = [];\n\n\tdocument.body.addEventListener(\n\t\t\"touchmove\",\n\t\tfunction (event) {\n\t\t\tif (event.touches.length !== 2) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst a = event.touches.item(0);\n\t\t\tconst b = event.touches.item(1);\n\n\t\t\tif (!a || !b) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst timestamp = window.performance.now();\n\t\t\tconst center = [(a.screenX + b.screenX) / 2, (a.screenY + b.screenY) / 2];\n\n\t\t\tif (history.length > 0) {\n\t\t\t\tconst last = history[history.length - 1];\n\t\t\t\tconst centersAreEqual =\n\t\t\t\t\tlast.center[0] === center[0] && last.center[1] === center[1];\n\n\t\t\t\tif (last.timestamp === timestamp || centersAreEqual) {\n\t\t\t\t\t// Touches with the same timestamps or center don't help us\n\t\t\t\t\t// see the speed of movement. Ignore them.\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thistory.push({timestamp, center});\n\t\t},\n\t\t{passive: true}\n\t);\n\n\tdocument.body.addEventListener(\n\t\t\"touchend\",\n\t\tfunction (event) {\n\t\t\tif (event.touches.length >= 2) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst direction = getSwipe(history);\n\n\t\t\t\tif (direction) {\n\t\t\t\t\tonTwoFingerSwipe(direction);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\thistory = [];\n\t\t\t}\n\t\t},\n\t\t{passive: true}\n\t);\n\n\tdocument.body.addEventListener(\n\t\t\"touchcancel\",\n\t\tfunction () {\n\t\t\thistory = [];\n\t\t},\n\t\t{passive: true}\n\t);\n}\n\n// Returns the cardinal direction of the swipe or null if there is no swipe.\nfunction getSwipe(hist) {\n\t// Speed is in pixels/millisecond. Must be maintained throughout swipe.\n\tconst MIN_SWIPE_SPEED = 0.2;\n\n\tif (hist.length < 2) {\n\t\treturn null;\n\t}\n\n\tfor (let i = 1; i < hist.length; ++i) {\n\t\tconst previous = hist[i - 1];\n\t\tconst current = hist[i];\n\n\t\tconst speed =\n\t\t\tdistance(previous.center, current.center) /\n\t\t\tMath.abs(previous.timestamp - current.timestamp);\n\n\t\tif (speed < MIN_SWIPE_SPEED) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn getCardinalDirection(hist[0].center, hist[hist.length - 1].center);\n}\n\nfunction getCardinalDirection([x1, y1], [x2, y2]) {\n\t// If θ is the angle of the vector then this is tan(θ)\n\tconst tangent = (y2 - y1) / (x2 - x1);\n\n\t// All values of |tan(-45° to 45°)| are less than 1, same for 145° to 225°\n\tif (Math.abs(tangent) < 1) {\n\t\treturn x1 < x2 ? \"e\" : \"w\";\n\t}\n\n\treturn y1 < y2 ? \"s\" : \"n\";\n}\n\nexport default listenForTwoFingerSwipes;\n","import constants from \"./constants\";\n\nimport \"../css/style.css\";\nimport {createApp} from \"vue\";\nimport {store, CallableGetters, key} from \"./store\";\nimport App from \"../components/App.vue\";\nimport storage from \"./localStorage\";\nimport {router} from \"./router\";\nimport socket from \"./socket\";\nimport \"./socket-events\"; // this sets up all socket event listeners, do not remove\nimport eventbus from \"./eventbus\";\n\nimport \"./webpush\";\nimport \"./keybinds\";\nimport {LoungeWindow} from \"./types\";\n\nconst favicon = document.getElementById(\"favicon\");\nconst faviconNormal = favicon?.getAttribute(\"href\") || \"\";\nconst faviconAlerted = favicon?.dataset.other || \"\";\n\nexport const VueApp = createApp(App);\n\nVueApp.use(router);\nVueApp.use(store, key);\n\nVueApp.mount(\"#app\");\nsocket.open();\n\nstore.watch(\n\t(state) => state.sidebarOpen,\n\t(sidebarOpen) => {\n\t\tif (window.innerWidth > constants.mobileViewportPixels) {\n\t\t\tstorage.set(\"thelounge.state.sidebar\", sidebarOpen.toString());\n\t\t\teventbus.emit(\"resize\");\n\t\t}\n\t}\n);\n\nstore.watch(\n\t(state) => state.userlistOpen,\n\t(userlistOpen) => {\n\t\tstorage.set(\"thelounge.state.userlist\", userlistOpen.toString());\n\t\teventbus.emit(\"resize\");\n\t}\n);\n\nstore.watch(\n\t(_, getters: CallableGetters) => getters.title,\n\t(title) => {\n\t\tdocument.title = title;\n\t}\n);\n\n// Toggles the favicon to red when there are unread notifications\nstore.watch(\n\t(_, getters: CallableGetters) => getters.highlightCount,\n\t(highlightCount) => {\n\t\tfavicon?.setAttribute(\"href\", highlightCount > 0 ? faviconAlerted : faviconNormal);\n\n\t\tconst nav: LoungeWindow[\"navigator\"] = window.navigator;\n\n\t\tif (nav.setAppBadge) {\n\t\t\tif (highlightCount > 0) {\n\t\t\t\tnav.setAppBadge(highlightCount).catch(() => {});\n\t\t\t} else {\n\t\t\t\tif (nav.clearAppBadge) {\n\t\t\t\t\tnav.clearAppBadge().catch(() => {});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n);\n\nVueApp.config.errorHandler = function (e) {\n\tif (e instanceof Error) {\n\t\tstore.commit(\"currentUserVisibleError\", `Vue error: ${e.message}`);\n\t} else {\n\t\tstore.commit(\"currentUserVisibleError\", `Vue error: ${String(e)}`);\n\t}\n\n\t// eslint-disable-next-line no-console\n\tconsole.error(e);\n};\n","<template>\n\t<span class=\"content\">{{ message.text }} </span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\n\nexport default defineComponent({\n\tname: \"MessageTypeRaw\",\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./raw.vue?vue&type=template&id=5aa1fa37&ts=true\"\nimport script from \"./raw.vue?vue&type=script&lang=ts\"\nexport * from \"./raw.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","// This is a simple localStorage wrapper because browser can throw errors\n// in different situations, including:\n// - Unable to store data if storage is full\n// - Local storage is blocked if \"third-party cookies and site data\" is disabled\n//\n// For more details, see:\n// https://stackoverflow.com/q/14555347/1935861\n// https://github.com/thelounge/thelounge/issues/2699\n// https://www.chromium.org/for-testers/bug-reporting-guidelines/uncaught-securityerror-failed-to-read-the-localstorage-property-from-window-access-is-denied-for-this-document\n\nexport default {\n\tset(key: string, value: string) {\n\t\ttry {\n\t\t\twindow.localStorage.setItem(key, value);\n\t\t} catch {\n\t\t\t//\n\t\t}\n\t},\n\tget(key: string) {\n\t\ttry {\n\t\t\treturn window.localStorage.getItem(key);\n\t\t} catch {\n\t\t\t// Return null as if data is not set\n\t\t\treturn null;\n\t\t}\n\t},\n\tremove(key: string) {\n\t\ttry {\n\t\t\twindow.localStorage.removeItem(key);\n\t\t} catch {\n\t\t\t//\n\t\t}\n\t},\n\tclear() {\n\t\ttry {\n\t\t\twindow.localStorage.clear();\n\t\t} catch {\n\t\t\t//\n\t\t}\n\t},\n};\n","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\tis now known as\n\t\t<Username :user=\"{nick: message.new_nick, mode: message.from!.mode}\" />\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeNick\",\n\tcomponents: {\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./nick.vue?vue&type=template&id=7be86b22&ts=true\"\nimport script from \"./nick.vue?vue&type=script&lang=ts\"\nexport * from \"./nick.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from!\" />\n\t\thas kicked;\n\t\t<Username :user=\"message.target!\" />\n\t\t<i v-if=\"message.text\" class=\"part-reason\"\n\t\t\t>  (<ParsedMessage :network=\"network\" :message=\"message\" />)</i\n\t\t>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent, PropType} from \"vue\";\nimport {ClientNetwork, ClientMessage} from \"../../js/types\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default defineComponent({\n\tname: \"MessageTypeKick\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: {\n\t\t\ttype: Object as PropType<ClientNetwork>,\n\t\t\trequired: true,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: Object as PropType<ClientMessage>,\n\t\t\trequired: true,\n\t\t},\n\t},\n});\n</script>\n","import { render } from \"./kick.vue?vue&type=template&id=1a7740c4&ts=true\"\nimport script from \"./kick.vue?vue&type=script&lang=ts\"\nexport * from \"./kick.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t936: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunk_lordbex_thelounge\"] = self[\"webpackChunk_lordbex_thelounge\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [110], () => (__webpack_require__(9056)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","defaultSettingConfig","apply","default","sync","defaultConfig","syncSettings","store","value","auto","socket","emit","advanced","autocomplete","nickPostfix","coloredNicks","desktopNotifications","commit","root","window","Notification","permission","requestPermission","catch","e","console","error","highlights","highlightExceptions","awayMessage","links","motd","notification","notifyAllMessages","showSeconds","use12hClock","statusMessages","theme","document","getElementById","dataset","serverTheme","themeEl","themeUrl","HTMLLinkElement","Error","hrefAttr","attributes","getNamedItem","state","serverConfiguration","newTheme","themes","filter","name","metaSelector","querySelector","HTMLMetaElement","themeColor","content","media","uploadCanvas","userStyles","test","location","search","element","innerHTML","searchEnabled","jumptoEabled","filterdmsEnabled","showAllDMs","showInputNick","disableMutedUnread","compactSidebar","beautifyBridgedMessages","bridgedMessageNicksStyle","enhancedUserListEnabled","enhancedContextMenuEnabled","enableEnhancedSearch","enableRainbowHotkey","config","obj","newConfig","settingName","normalizeConfig","createState","loadFromLocalStorage","storedSettings","JSON","parse","storage","get","remove","join","assignStoredSettings","defaultSettings","newSettings","key","appName","title","DesktopNotificationState","detectDesktopNotificationState","Granted","isSecureContext","Blocked","NoHttps","Unsupported","getters","findChannelOnCurrentNetwork","toLowerCase","activeChannel","network","channels","find","c","findChannelOnNetwork","networkUuid","channelName","networks","uuid","channel","findChannel","id","findNetwork","highlightCount","muted","highlight","toString","storePattern","appLoaded","undefined","currentUserVisibleError","desktopNotificationState","isAutoCompleting","isConnected","mentions","hasServiceWorker","pushNotificationState","sessions","sidebarOpen","sidebarDragging","userlistOpen","versionData","versionStatus","versionDataExpired","serverHasSettings","messageSearchResults","messageSearchPendingQuery","mutations","netChan","refreshDesktopNotificationState","payload","removeNetwork","networkId","splice","findIndex","n","sortNetworks","sortFn","sort","toggleSidebar","toggleUserlist","addMessageSearchResults","results","actions","partChannel","msg","chanId","Symbol","createStore","settingsStore","namespaced","set","syncAll","force","applyAll","update","settingConfig","stringify","createSettingsStore","useStore","baseUseStore","registerModule","io","transports","body","path","pathname","autoConnect","reconnection","classList","contains","class","defineComponent","components","ParsedMessage","Username","props","type","Object","required","message","_createElementBlock","_hoisted_1","_createVNode","_component_Username","user","_ctx","from","_component_ParsedMessage","_createElementVNode","_hoisted_2","text","hostmask","_hoisted_3","self","_createBlock","_Fragment","map","webpackContext","req","webpackContextResolve","__webpack_require__","o","code","keys","resolve","module","exports","ChanType","SpecialChanType","ChanState","setup","summaryParts","computed","parts","summary","massEventSummary","joins","push","quits","kicks","nicks","modes","chghosts","away","back","length","formattedDuration","duration","seconds","Math","round","minutes","floor","remainingSeconds","_renderList","item","index","_toDisplayString","errorMessage","chan","nick","command","reason","new_ident","new_host","_hoisted_4","events","Map","on","handler","has","off","evt","slice","localetime","date","whois","whowas","account","ident","hostname","actual_hostname","_hoisted_5","href","actual_ip","target","rel","_hoisted_6","_hoisted_7","actual_username","real_name","registered_nick","special","operator","helpop","bot","secure","certfps","certfp","server","server_info","logonTime","idle","idleTime","cleanText","lines","split","every","line","substring","replace","sizes","size","i","log","parseFloat","pow","toFixed","invitedYou","colorRx","hexColorRx","controlCodesRx","properties","escapeRegExpCharSet","raw","escapeRegExp","linkify","LinkifyIt","tlds","commonSchemes","schema","add","makeLinkPart","url","start","end","lastIndex","link","validate","pos","webSchemaRe","linkEnd","testSchemaAt","normalize","match","indexOf","__schemas__","regExp","emojiRegExp","nickRegExp","a","b","sortParts","emits","ariaLabel","shown","onClick","_normalizeClass","opened","_cache","args","Number","previewSize","friendlysize","String","openContextMenu","event","eventbus","dir","role","tabindex","_withModifiers","onContextmenu","_renderSlot","$slots","emojiModifiersRegex","styleFragments","result","colorCodes","bold","textColor","bgColor","hexColor","hexBgColor","italic","underline","strikethrough","monospace","position","resetStyle","emitFragment","processedText","fragmentStart","toUpperCase","tmp","parseStyle","reduce","prev","curr","lastEntry","concat","fragment","channelParts","channelPrefixes","userModes","userModePattern","channelPrefixPattern","channelRegExp","RegExp","exec","findChannels","serverOptions","CHANTYPES","PREFIX","prefix","pref","symbol","linkParts","matches","findLinks","emojiParts","emoji","findEmoji","nameParts","findNames","users","filled","existingEntries","acc","textSegment","fill","some","p","anyIntersection","part","fragments","textPart","fragStart","max","min","assign","merge","classes","data","style","hasData","color","createElement","createFragment","preview","previews","linkEls","LinkPreviewFileSize","LinkPreviewToggle","InlineChannel","isEmojiPart","emojiWithoutModifiers","emojiMap","isNamePart","functional","render","context","raw_modes","ctcpMessage","active","Boolean","onHover","Function","mode","nickColor","str","hash","charCodeAt","colorClass","settings","shoutbox","JOINED","u","lastMessage","Date","now","displayNick","umode","hover","_mergeProps","_toHandlers","mouseenter","messageTimeLocale","when","time","dayjs","format","gecos","colorCodeMap","commands","timeFormats","msgDefault","msgWithSeconds","msg12h","msg12hWithSeconds","mobileViewportPixels","tagName","ref","Props","delay","delayOnTouchOnly","touchStartThreshold","handle","draggable","ghostClass","dragClass","group","itemKey","list","Array","containerRef","sortable","watch","newDraggable","Sortable","onChoose","onUnchoose","onEnd","onBeforeUnmount","destroy","$props","isCollapsed","stored","Set","delete","count","isVisible","RevealPassword","inFlight","errorShown","username","password","onAuthFailed","onMounted","onSubmit","preventDefault","values","method","action","src","alt","width","height","for","$event","autocapitalize","autocorrect","autofocus","trim","_component_RevealPassword","_withCtx","slotProps","disabled","SidebarToggle","handleSubmit","defaults","previousUsername","displayPasswordField","publicPassword","newValue","nextTick","focus","commandsInput","resizeCommandsInput","ceil","scrollHeight","tls","isSecureChecked","ports","newPort","port","usernameInput","fishKeysEntries","fishKeysValue","entry","fishKeys","input","entries","parseFishKeys","immediate","setSaslAuth","sasl","onNickChanged","usernameRef","formData","FormData","forEach","addFishKeyEntry","removeFishKeyEntry","_component_SidebarToggle","lockNetwork","public","_hoisted_23","maxlength","_hoisted_24","placeholder","host","_hoisted_9","_hoisted_10","_hoisted_11","hasSTSPolicy","_hoisted_13","_hoisted_14","rejectUnauthorized","_hoisted_15","_hoisted_16","_hoisted_17","proxyEnabled","_hoisted_18","_hoisted_19","proxyHost","proxyPort","_hoisted_20","proxyUsername","_hoisted_21","proxyPassword","_hoisted_26","pattern","onInput","useHexIp","_hoisted_27","_hoisted_28","realname","_hoisted_29","leaveMessage","_hoisted_30","_hoisted_32","_hoisted_33","fishGlobalKey","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_46","_hoisted_47","checked","onChange","_hoisted_49","_hoisted_51","_hoisted_53","saslAccount","_hoisted_54","saslPassword","_hoisted_56","NetworkForm","queryParams","params","parsedParams","isArray","prototype","hasOwnProperty","call","includes","parseOverrideParams","_component_NetworkForm","className","to","route","useRoute","_component_router_link","custom","navigate","isExactActive","onKeypress","_withKeys","SettingTabItem","_component_SettingTabItem","Navigation","dispatch","_component_Navigation","_component_router_view","checkNow","latest","version","prerelease","VersionChecker","isApple","navigator","platform","isTouch","maxTouchPoints","_component_VersionChecker","gitCommit","_hoisted_12","_hoisted_22","_hoisted_25","_hoisted_31","_hoisted_37","_hoisted_38","_hoisted_45","_hoisted_48","_hoisted_50","_hoisted_52","_hoisted_55","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_61","_hoisted_60","_hoisted_62","_hoisted_63","_hoisted_65","_hoisted_64","_hoisted_66","_hoisted_67","_hoisted_69","_hoisted_68","_hoisted_70","_hoisted_71","_hoisted_73","_hoisted_72","_hoisted_74","_hoisted_75","_hoisted_77","_hoisted_76","_hoisted_78","_hoisted_79","_hoisted_81","_hoisted_80","_hoisted_82","_hoisted_83","_hoisted_85","_hoisted_84","_hoisted_86","_hoisted_87","_hoisted_89","_hoisted_88","_hoisted_90","_hoisted_91","_hoisted_93","_hoisted_92","_hoisted_94","_hoisted_95","_hoisted_97","_hoisted_96","_hoisted_98","changelog","patchChangelog","querySelectorAll","setAttribute","onUpdated","current","networkData","setNetworkData","switchToChannel","keepScrollPosition","showMoreButton","isContentShown","imageViewer","inject","imageViewerKey","onBeforeRouteUpdate","next","closeViewer","container","moreButtonLabel","imageMaxSize","maxSize","handleResize","offsetWidth","onPreviewReady","sourceLoaded","onPreviewUpdate","updateShownState","defaultState","onUnmounted","onThumbnailClick","onThumbnailError","thumb","onMoreClick","decoding","onError","onAbort","onLoad","head","preload","controls","onCanplay","mediaType","requireViews","require","MessageType","matchers","description","regex","transform","typedGroups","this","endsWith","regexMatch","groups","MessageTypes","LinkPreview","isPreviousSource","isFocused","timeFormat","constants","messageTime","messageComponent","prettyMessage","CHANNEL","MESSAGE","originalMessage","originalSender","matcher","m","edit","structuredClone","toRaw","replaceAll","original_nick","shoutboxParser","isAction","param","_resolveDynamicComponent","_component_LinkPreview","_hoisted_8","showInActive","statusmsgGroup","searchOpened","searchInput","router","useRouter","searchInputField","onSearchPage","query","q","closeSearch","toggleSearch","blur","searchMessages","err","onBlur","onKeyup","onMousedown","calendar","localeDate","hoursPassed","dayChange","friendlyDate","sameDay","lastDay","lastWeek","sameElse","Message","DateMarker","MessageSearchForm","chat","loadMoreButton","offset","moreResultsAvailable","oldScrollTop","oldChatHeight","messages","parseInt","setActiveChannel","clearSearchState","doSearch","searchTerm","jumpToBottom","async","el","scrollTop","currentChatHeight","shouldDisplayDateMarker","previousMessage","getDay","onShowMoreClick","jump","getTime","_component_MessageSearchForm","_component_DateMarker","_component_Message","matchFormatting","condensedTypes","selection","getSelection","anchorNode","focusNode","range","getRangeAt","documentFragment","cloneContents","div","appendChild","selectAllChildren","setTimeout","removeChild","removeAllRanges","addRange","condensedText","MODE","modeChangesCount","char","MASS_EVENT","quit","strings","pop","onCollapseClick","closed","MAX_RENDERED_MESSAGES","MessageCondensed","focusedTime","historyObserver","focusedMsgId","focusedMsgTime","isScrolling","windowStartIndex","isAdjustingWindow","unreadMarkerShown","allCondensedMessages","QUERY","lastCondensedContainer","condensed","firstUnread","displayedMessages","all","total","canScrollBack","isAtEnd","showLoadMoreButton","moreHistoryAvailable","scrollToBottom","scrolledToBottom","jumpToMessage","msgId","fallbackTime","targetIndex","inner","msgTime","abs","innerTime","halfWindow","scrollIntoView","behavior","block","closest","jumpToMessageByTime","timestamp","handleScroll","distanceFromBottom","clientHeight","distanceFromTop","amount","oldScrollHeight","newStart","heightDiff","shiftWindowUp","maxStart","shiftWindowDown","historyLoading","lastId","scrollBottom","addEventListener","passive","isNaN","IntersectionObserver","isIntersecting","observe","unobserve","firstMessageId","msgs","newFirstId","oldFirstId","newLen","oldLen","focused","onBeforeUpdate","removeEventListener","disconnect","getMessageKey","isMessageFocused","onCopy","clipboard","idx","oldDate","newDate","getDate","getMonth","getFullYear","shouldDisplayUnreadMarker","currentMessage","onLinkPreviewToggle","_component_MessageCondensed","onToggleLinkPreview","skipNextScrollEvent","isWaitingForNextTick","onLoadButtonObserved","condensedMessages","heightOld","offsetHeight","deep","pendingMessage","emojiSearchTerms","emojiStrategy","term","callback","fuzzyGrep","template","string","original","nicksStrategy","completeNicks","val","replaceNick","chanStrategy","word","words","completeChans","commandStrategy","cmds","getCommands","foregroundColorStrategy","fuzzy","pre","post","rendered","backgroundColorStrategy","pair","array","isFuzzy","me","otherUser","rawNicks","w","collapse","messageIds","toggled","expand","chanTypes","channelList","instance","xhr","fileQueue","tokenKeepAlive","overlay","uploadProgressbar","onDragEnter","dragEnter","onDragOver","dragOver","onDragLeave","dragLeave","onDrop","drop","onPaste","paste","init","token","uploadNextFileInQueue","mounted","unmounted","dataTransfer","types","relatedTarget","files","items","kind","getAsFile","triggerUpload","clipboardData","handleResponse","wasQueueEmpty","maxFileSize","fileUploadMaxFileSize","file","requestToken","setProgress","toggle","shift","setInterval","startsWith","renderImage","newFile","performUpload","fileReader","FileReader","onabort","onerror","abort","onload","img","Image","canvas","ctx","getContext","drawImage","toBlob","blob","File","readAsDataURL","XMLHttpRequest","upload","percent","loaded","onreadystatechange","readyState","DONE","response","responseText","statusText","status","append","open","send","clearInterval","insertUploadUrl","fullURL","URL","textbox","HTMLTextAreaElement","initStart","selectionStart","headToCursor","cursorToTail","textBeforeTail","updateCursor","selectionEnd","initialize","formattingHotkeys","bracketWraps","_","uploadInput","autocompletionRef","setInputSize","getComputedStyle","lineHeight","setPendingMessage","inputHistoryPosition","blurInput","hide","tabCount","lastMatch","currentMatches","detail","Mousetrap","bind","newMatch","remainder","substr","dispatchEvent","CustomEvent","strategies","editor","TextareaEditor","textcomplete","Textcomplete","dropdown","placement","autocompletion","inputTrap","enabledHotkeys","k","modifier","wrapCursor","onRow","totalRows","inputHistory","fileUpload","onUploadInputChange","openFileUpload","click","eventTarget","getInputPlaceholder","cmd","enterkeyhint","multiple","userSearchInput","activeUser","userlist","hasCustomGroups","filteredUsers","fuzzyFilter","extract","groupNameSlugs","slugify","groupCSSSafe","customGroupedUsers","filtered","standardGroupedUsers","groupedUsers","scrollToActiveUser","inline","getGroupSlug","setUserSearchInput","getModeClass","selectUser","rect","getBoundingClientRect","ev","MouseEvent","view","bubbles","cancelable","clientX","left","clientY","top","hoverUser","removeHoverUser","navigateUserList","direction","stopImmediatePropagation","currentIndex","onMouseleave","onKeydown","localeTime","ban","banned_by","banned_at","invite","invited_by","invited_at","channelData","num_users","topic","MessageList","MessageListBasic","ChatInput","ChatUserList","MessageListType","messageList","topicInput","specialComponent","BANLIST","ListBans","INVITELIST","ListInvites","CHANNELLIST","ListChannels","IGNORELIST","ListIgnored","channelChanged","usersOutdated","editTopic","newTopic","hideUserVisibleError","saveTopic","openMentions","lang","empty","onDblclick","_component_ChatUserList","_component_MessageList","_component_MessageListBasic","_component_ChatInput","Chat","chanInStore","unread","_component_Chat","onChannelChanged","prefetch","displayName","installPromptEvent","canRegisterProtocol","hasInstallPromptEvent","registerProtocolHandler","nativeInstallPrompt","prompt","onForceSyncClick","registerProtocol","uri","origin","reload","Auth","signout","clear","session","lastUse","signOut","agent","ip","Session","passwordChangeStatus","old_password","new_password","verify_password","currentSession","activeSessions","otherSessions","passwordErrors","missing_fields","password_mismatch","password_incorrect","update_failed","changePassword","once","success","ldapEnabled","_component_Session","_component_session59","_component_session","serviceWorker","ready","then","registration","pushManager","getSubscription","existingSubscription","unsubscribe","successful","subscribe","applicationServerKey","userVisibleOnly","subscription","toJSON","hasSubscriptionOnServer","protocol","register","isIOS","userAgent","playNotification","Audio","play","onPushButtonClick","webpush","createRouter","history","createWebHashHistory","routes","component","SignIn","beforeEnter","Connect","Settings","children","GeneralSettings","AppearanceSettings","AccountSettings","NotificationSettings","Help","Changelog","NetworkEdit","RoutedChat","SearchResults","routeName","currentRoute","focusedMessageId","focusedMessageTime","beforeEach","matched","afterEach","innerWidth","channelTarget","isFiltering","isChannelVisible","isChannelCollapsed","getAriaLabel","extra","connected","_normalizeStyle","transition","opacity","ChannelWrapper","isJoinChannelShown","joinChannelLabel","unreadCount","roundBadgeNumber","collapseNetwork","getExpandLabel","_component_ChannelWrapper","$emit","useCloseChannel","LOBBY","button","close","directives","inputChannel","inputPassword","existingChannel","Draggable","Channel","queries","PERSISTENT_STORAGE","getIsCollapsed","filterText","showAll","maxVisible","MAX_SAFE_INTEGER","hasActiveQuery","hasUnread","totalUnreadCount","filteredQueries","r","sortedQueries","pinned","localeCompare","visibleQueries","rest","remaining","hiddenCount","hasHiddenChannels","shouldShowChannel","toggleCollapsed","directMessages","onDMSort","oldIndex","newIndex","order","collapsed","_component_Draggable","_component_Channel","x1","y1","x2","y2","hypot","JoinChannel","NetworkLobby","DirectMessageSection","searchText","activeSearchItem","startDrag","networklist","sidebarWasClosed","moveItemInArray","newItems","isIgnoredKeybind","collapseNetworkHelper","expandNetwork","activateSearch","activeElement","deactivateSearch","setActiveSearchItem","scrollToActive","LONG_TOUCH_DURATION","setSearchText","selectResult","navigateResults","onChannelSort","unparsedId","getAttribute","onNetworkSort","onDraggableTouchStart","touches","onDraggableTouchMove","touch","currentPosition","distance","onDraggableTouchEnd","onDraggableChoose","originalEvent","pointerType","isTouchEvent","TouchEvent","PointerEvent","onDraggableUnchoose","onFocus","onMouseenter","_component_NetworkLobby","onTouchstart","onTouchmove","onTouchend","onTouchcancel","onToggleJoinChannel","_component_JoinChannel","_component_DirectMessageSection","NetworkList","touchStartPos","touchCurPos","touchStartTime","menuWidth","menuIsMoving","menuIsAbsolute","sidebar","onTouchMove","screenX","screenY","distX","distY","onTouchEnd","devicePixelRatio","diff","absDiff","onTouchStart","styles","isDevelopment","process","isPublic","_component_NetworkList","isActive","isUpdateAvailable","viewer","image","previousImage","nextImage","x","y","scale","computeImageStyles","transformX","transformY","previous","calculateZoomShift","newScale","oldScale","imageWidth","centerX","centerY","correctPosition","imageEl","viewerEl","widthScaled","heightScaled","containerWidth","containerHeight","reduceTouches","totalX","totalY","totalScale","i2","sqrt","newLink","oldLink","setPrevNextImages","flat","onImageLoad","prepareImage","naturalWidth","naturalHeight","onImageMouseDown","which","stopPropagation","startX","startY","startTransformX","startTransformY","movedDistance","mouseMove","moveEvent","newX","newY","mouseUp","upEvent","onMouseWheel","ctrlKey","deltaY","delta","fixedPosition","onImageTouchStart","currentTouches","touchEndFingers","currentTransform","startTransform","touchMove","deltaX","deltaScale","touchEnd","endEvent","changedTouches","onWheel","isOpen","passthrough","contextMenu","previousActiveElement","activeItem","enablePointerEvents","clickItem","menuHeight","pageX","pageY","innerHeight","positionContextMenu","openChannelContextMenu","closeChannel","label","lobby","setPinnedTo","humanFriendlyChanTypeMap","chanType","setMutedTo","generateChannelContextMenu","openInlineChannelContextMenu","generateInlineChannelContextMenu","openUserContextMenu","currentChannelUser","userContextMenuEntrys","defualt","customInspect","customTrackerProfile","userGroup","g","modeCharToName","modeTextTemplate","revoke","give","networkModeSymbols","symbols","compare","p1","p2","generateUserContextMenu","containerClick","currentTarget","navigateMenu","nextItem","hoverItem","clickActiveItem","incoming","cb","relativeTime","isLoading","resolvedMessages","reverse","togglePopup","closePopup","fromNow","dismissMention","dismissAllMentions","jumpToMention","contextMenuKey","confirmDialogKey","Sidebar","ImageViewer","ContextMenu","ConfirmDialog","Mentions","loungeWindow","confirmDialog","provide","viewportClasses","notified","debouncedResize","dayChangeTimeout","escapeKey","toggleUserList","toggleMentions","msUntilNextDay","today","prepareOpenStates","viewportWidth","isUserlistOpen","throttle","emitDayChange","clearTimeout","_component_Sidebar","_component_Mentions","_component_ImageViewer","_component_ContextMenu","_component_ConfirmDialog","handleDisconnect","updateLoadingMessage","skipReconnect","connect","requestIdleCallback","timeout","loading","textContent","attempt","sendBuffer","lastServerHash","showSignIn","g_TheLoungeRemoveLoading","reloadPage","toClientChan","shared","totalMessages","mergeChannelData","oldChannels","newChannels","newChannel","currentChannel","emitNamesOrMarkUsersOudated","hasOwn","removeQueryParams","cleanUri","replaceState","serverHash","doFastAuth","openChannel","hasConfig","newNetworks","collapsedNetworks","sharedNet","currentNetwork","newNet","mergeNetworkData","isReady","URLSearchParams","stringUri","parseIrcUri","fromEntries","handleQueryParams","clientChan","shouldOpen","unshift","sharedToClientMention","receivingChannel","isActiveChannel","targetId","hasFocus","INVITE","postMessage","tag","badge","icon","notifyMessage","messageLimit","ACTION","QUIT","PART","KICK","updateUserList","previewIndex","PARTED","isCurrentNetworkBeingRemoved","currentTheme","t","defaultTheme","returnValue","packages","expiresAt","expires","pendingQuery","SPECIAL","navigateWindow","flatChannels","jumpToChannel","targetChannel","onTwoFingerSwipe","performance","center","last","centersAreEqual","hist","tangent","getCardinalDirection","getSwipe","listenForTwoFingerSwipes","cardinalDirection","net","outer_loop","ignoredKeys","go","altKey","metaKey","favicon","faviconNormal","faviconAlerted","other","VueApp","createApp","App","use","mount","nav","setAppBadge","clearAppBadge","errorHandler","localStorage","setItem","getItem","removeItem","new_nick","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","getter","__esModule","d","definition","defineProperty","enumerable","globalThis","prop","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}
|