@lordbex/thelounge 4.4.3-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/.thelounge_home +1 -0
- package/LICENSE +22 -0
- package/README.md +95 -0
- package/client/index.html.tpl +69 -0
- package/dist/defaults/config.js +465 -0
- package/dist/package.json +174 -0
- package/dist/server/client.js +678 -0
- package/dist/server/clientManager.js +220 -0
- package/dist/server/command-line/index.js +85 -0
- package/dist/server/command-line/install.js +123 -0
- package/dist/server/command-line/outdated.js +30 -0
- package/dist/server/command-line/start.js +34 -0
- package/dist/server/command-line/storage.js +103 -0
- package/dist/server/command-line/uninstall.js +40 -0
- package/dist/server/command-line/upgrade.js +64 -0
- package/dist/server/command-line/users/add.js +67 -0
- package/dist/server/command-line/users/edit.js +39 -0
- package/dist/server/command-line/users/index.js +17 -0
- package/dist/server/command-line/users/list.js +53 -0
- package/dist/server/command-line/users/remove.js +37 -0
- package/dist/server/command-line/users/reset.js +64 -0
- package/dist/server/command-line/utils.js +177 -0
- package/dist/server/config.js +138 -0
- package/dist/server/helper.js +161 -0
- package/dist/server/identification.js +139 -0
- package/dist/server/index.js +3 -0
- package/dist/server/log.js +35 -0
- package/dist/server/models/chan.js +275 -0
- package/dist/server/models/msg.js +92 -0
- package/dist/server/models/network.js +546 -0
- package/dist/server/models/prefix.js +31 -0
- package/dist/server/models/user.js +42 -0
- package/dist/server/plugins/auth/ldap.js +188 -0
- package/dist/server/plugins/auth/local.js +41 -0
- package/dist/server/plugins/auth.js +70 -0
- package/dist/server/plugins/changelog.js +103 -0
- package/dist/server/plugins/clientCertificate.js +115 -0
- package/dist/server/plugins/dev-server.js +33 -0
- package/dist/server/plugins/inputs/action.js +54 -0
- package/dist/server/plugins/inputs/away.js +20 -0
- package/dist/server/plugins/inputs/ban.js +45 -0
- package/dist/server/plugins/inputs/blow.js +44 -0
- package/dist/server/plugins/inputs/connect.js +41 -0
- package/dist/server/plugins/inputs/ctcp.js +29 -0
- package/dist/server/plugins/inputs/disconnect.js +15 -0
- package/dist/server/plugins/inputs/ignore.js +74 -0
- package/dist/server/plugins/inputs/ignorelist.js +50 -0
- package/dist/server/plugins/inputs/index.js +105 -0
- package/dist/server/plugins/inputs/invite.js +31 -0
- package/dist/server/plugins/inputs/kick.js +26 -0
- package/dist/server/plugins/inputs/kill.js +13 -0
- package/dist/server/plugins/inputs/list.js +12 -0
- package/dist/server/plugins/inputs/mode.js +55 -0
- package/dist/server/plugins/inputs/msg.js +106 -0
- package/dist/server/plugins/inputs/mute.js +56 -0
- package/dist/server/plugins/inputs/nick.js +55 -0
- package/dist/server/plugins/inputs/notice.js +42 -0
- package/dist/server/plugins/inputs/part.js +46 -0
- package/dist/server/plugins/inputs/quit.js +27 -0
- package/dist/server/plugins/inputs/raw.js +13 -0
- package/dist/server/plugins/inputs/rejoin.js +25 -0
- package/dist/server/plugins/inputs/topic.js +24 -0
- package/dist/server/plugins/inputs/whois.js +19 -0
- package/dist/server/plugins/irc-events/away.js +59 -0
- package/dist/server/plugins/irc-events/cap.js +62 -0
- package/dist/server/plugins/irc-events/chghost.js +29 -0
- package/dist/server/plugins/irc-events/connection.js +152 -0
- package/dist/server/plugins/irc-events/ctcp.js +72 -0
- package/dist/server/plugins/irc-events/error.js +80 -0
- package/dist/server/plugins/irc-events/help.js +21 -0
- package/dist/server/plugins/irc-events/info.js +21 -0
- package/dist/server/plugins/irc-events/invite.js +27 -0
- package/dist/server/plugins/irc-events/join.js +53 -0
- package/dist/server/plugins/irc-events/kick.js +39 -0
- package/dist/server/plugins/irc-events/link.js +442 -0
- package/dist/server/plugins/irc-events/list.js +47 -0
- package/dist/server/plugins/irc-events/message.js +187 -0
- package/dist/server/plugins/irc-events/mode.js +124 -0
- package/dist/server/plugins/irc-events/modelist.js +67 -0
- package/dist/server/plugins/irc-events/motd.js +29 -0
- package/dist/server/plugins/irc-events/names.js +21 -0
- package/dist/server/plugins/irc-events/nick.js +45 -0
- package/dist/server/plugins/irc-events/part.js +35 -0
- package/dist/server/plugins/irc-events/quit.js +32 -0
- package/dist/server/plugins/irc-events/sasl.js +26 -0
- package/dist/server/plugins/irc-events/topic.js +42 -0
- package/dist/server/plugins/irc-events/unhandled.js +31 -0
- package/dist/server/plugins/irc-events/welcome.js +22 -0
- package/dist/server/plugins/irc-events/whois.js +57 -0
- package/dist/server/plugins/messageStorage/sqlite.js +454 -0
- package/dist/server/plugins/messageStorage/text.js +124 -0
- package/dist/server/plugins/packages/index.js +200 -0
- package/dist/server/plugins/packages/publicClient.js +66 -0
- package/dist/server/plugins/packages/themes.js +61 -0
- package/dist/server/plugins/storage.js +88 -0
- package/dist/server/plugins/sts.js +85 -0
- package/dist/server/plugins/uploader.js +267 -0
- package/dist/server/plugins/webpush.js +99 -0
- package/dist/server/server.js +857 -0
- package/dist/server/storageCleaner.js +131 -0
- package/dist/server/utils/fish.js +432 -0
- package/dist/shared/irc.js +19 -0
- package/dist/shared/linkify.js +81 -0
- package/dist/shared/types/chan.js +22 -0
- package/dist/shared/types/changelog.js +2 -0
- package/dist/shared/types/config.js +2 -0
- package/dist/shared/types/mention.js +2 -0
- package/dist/shared/types/msg.js +34 -0
- package/dist/shared/types/network.js +2 -0
- package/dist/shared/types/storage.js +2 -0
- package/dist/shared/types/user.js +2 -0
- package/dist/webpack.config.js +224 -0
- package/index.js +38 -0
- package/package.json +174 -0
- package/public/audio/pop.wav +0 -0
- package/public/css/style.css +12 -0
- package/public/css/style.css.map +1 -0
- package/public/favicon.ico +0 -0
- package/public/fonts/fa-solid-900.woff +0 -0
- package/public/fonts/fa-solid-900.woff2 +0 -0
- package/public/img/favicon-alerted.ico +0 -0
- package/public/img/icon-alerted-black-transparent-bg-72x72px.png +0 -0
- package/public/img/icon-alerted-grey-bg-192x192px.png +0 -0
- package/public/img/icon-black-transparent-bg.svg +1 -0
- package/public/img/logo-grey-bg-120x120px.png +0 -0
- package/public/img/logo-grey-bg-152x152px.png +0 -0
- package/public/img/logo-grey-bg-167x167px.png +0 -0
- package/public/img/logo-grey-bg-180x180px.png +0 -0
- package/public/img/logo-grey-bg-192x192px.png +0 -0
- package/public/img/logo-grey-bg-512x512px.png +0 -0
- package/public/img/logo-grey-bg.svg +1 -0
- package/public/img/logo-horizontal-transparent-bg-inverted.svg +1 -0
- package/public/img/logo-horizontal-transparent-bg.svg +1 -0
- package/public/img/logo-transparent-bg-inverted.svg +1 -0
- package/public/img/logo-transparent-bg.svg +1 -0
- package/public/img/logo-vertical-transparent-bg-inverted.svg +1 -0
- package/public/img/logo-vertical-transparent-bg.svg +1 -0
- package/public/js/bundle.js +2 -0
- package/public/js/bundle.js.map +1 -0
- package/public/js/bundle.vendor.js +3 -0
- package/public/js/bundle.vendor.js.LICENSE.txt +18 -0
- package/public/js/bundle.vendor.js.map +1 -0
- package/public/js/loading-error-handlers.js +1 -0
- package/public/robots.txt +2 -0
- package/public/service-worker.js +1 -0
- package/public/thelounge.webmanifest +53 -0
- package/public/themes/default.css +35 -0
- package/public/themes/morning.css +183 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
html{-webkit-text-size-adjust:100%;line-height:1.15}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:initial;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:initial}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:initial}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(../fonts/fa-solid-900.woff2) format("woff2"),url(../fonts/fa-solid-900.woff) format("woff")}.tooltipped{position:relative}.tooltipped:after{-webkit-font-smoothing:subpixel-antialiased;word-wrap:break-word;background:#1b1f23;border-radius:3px;color:#fff;content:attr(aria-label);display:none;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;letter-spacing:normal;opacity:0;padding:.5em .75em;pointer-events:none;position:absolute;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;white-space:pre;z-index:1000000}.tooltipped:before{border:6px solid #0000;color:#1b1f23;content:"";display:none;height:0;opacity:0;pointer-events:none;position:absolute;width:0;z-index:1000001}@keyframes tooltip-appear{0%{opacity:0}to{opacity:1}}.tooltipped:active:after,.tooltipped:active:before,.tooltipped:focus:after,.tooltipped:focus:before,.tooltipped:hover:after,.tooltipped:hover:before{animation-delay:.4s;animation-duration:.1s;animation-fill-mode:forwards;animation-name:tooltip-appear;animation-timing-function:ease-in;display:inline-block;text-decoration:none}.tooltipped-no-delay:active:after,.tooltipped-no-delay:active:before,.tooltipped-no-delay:focus:after,.tooltipped-no-delay:focus:before,.tooltipped-no-delay:hover:after,.tooltipped-no-delay:hover:before{animation-delay:0s}.tooltipped-multiline:active:after,.tooltipped-multiline:focus:after,.tooltipped-multiline:hover:after{display:table-cell}.tooltipped-s:after,.tooltipped-se:after,.tooltipped-sw:after{margin-top:6px;right:50%;top:100%}.tooltipped-s:before,.tooltipped-se:before,.tooltipped-sw:before{border-bottom-color:#1b1f23;bottom:-7px;margin-right:-6px;right:50%;top:auto}.tooltipped-se:after{left:50%;margin-left:-16px;right:auto}.tooltipped-sw:after{margin-right:-16px}.tooltipped-n:after,.tooltipped-ne:after,.tooltipped-nw:after{bottom:100%;margin-bottom:6px;right:50%}.tooltipped-n:before,.tooltipped-ne:before,.tooltipped-nw:before{border-top-color:#1b1f23;bottom:auto;margin-right:-6px;right:50%;top:-7px}.tooltipped-ne:after{left:50%;margin-left:-16px;right:auto}.tooltipped-nw:after{margin-right:-16px}.tooltipped-n:after,.tooltipped-s:after{transform:translateX(50%)}.tooltipped-w:after{bottom:50%;margin-right:6px;right:100%;transform:translateY(50%)}.tooltipped-w:before{border-left-color:#1b1f23;bottom:50%;left:-7px;margin-top:-6px;top:50%}.tooltipped-e:after{bottom:50%;left:100%;margin-left:6px;transform:translateY(50%)}.tooltipped-e:before{border-right-color:#1b1f23;bottom:50%;margin-top:-6px;right:-7px;top:50%}.tooltipped-align-right-1:after,.tooltipped-align-right-2:after{margin-right:0;right:0}.tooltipped-align-right-1:before{right:10px}.tooltipped-align-right-2:before{right:15px}.tooltipped-align-left-1:after,.tooltipped-align-left-2:after{left:0;margin-left:0}.tooltipped-align-left-1:before{left:5px}.tooltipped-align-left-2:before{left:10px}.tooltipped-multiline:after{word-wrap:break-word;border-collapse:initial;max-width:250px;white-space:pre-line;width:max-content}.tooltipped-multiline.tooltipped-n:after,.tooltipped-multiline.tooltipped-s:after{left:50%;right:auto;transform:translateX(-50%)}.tooltipped-multiline.tooltipped-e:after,.tooltipped-multiline.tooltipped-w:after{right:100%}@media screen and (min-width:0\0){.tooltipped-multiline:after{width:250px}}.tooltipped-sticky:after,.tooltipped-sticky:before{display:inline-block}.tooltipped-sticky.tooltipped-multiline:after{display:table-cell}:root{--body-color:#222;--body-color-muted:#767676;--body-bg-color:#415364;--button-color:#84ce88;--button-text-color-hover:#fff;--overlay-bg-color:#00000080;--link-color:#50a656;--window-bg-color:#fff;--window-heading-color:#6c797a;--date-marker-color:#006b3b80;--unread-marker-color:#e74c3c80;--highlight-bg-color:#efe8dc;--highlight-border-color:#b08c4f;--upload-progressbar-color:var(--button-color)}::placeholder{color:#00000059;opacity:1}html{-webkit-tap-highlight-color:transparent;box-sizing:border-box}*,:after,:before{box-sizing:inherit}button,input,select,textarea{color:inherit;font:inherit}img{vertical-align:middle}.sr-only{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}abbr[title]{cursor:help}body,html{height:100%;overscroll-behavior:none}body{background:#415364;background:var(--body-bg-color);color:#222;color:var(--body-color);cursor:default;font:16px -apple-system,system-ui,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;margin:0;overflow:hidden;touch-action:none;-webkit-user-select:none;user-select:none}body.force-no-select *{-webkit-user-select:none!important;user-select:none!important}a,a:focus,a:hover{color:#50a656;color:var(--link-color);text-decoration:none}a:hover{text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}h1,h2,h3{font:inherit;line-height:inherit;margin:0}button{background:none;border:none;cursor:pointer;margin:0;outline:none;padding:0;-webkit-user-select:inherit;user-select:inherit}#chat .msg[data-type=monospace_block] .text,.irc-monospace,code,pre,textarea#user-specified-css-input{font-family:Consolas,Menlo,Monaco,Lucida Console,DejaVu Sans Mono,Courier New,monospace}.irc-monospace,code{background-color:#f9f2f4;border-radius:2px;color:#e74c3c;font-size:13px;padding:2px 4px}pre{word-wrap:break-word;background-color:#f5f5f5;border-radius:4px;color:#333;display:block;font-size:13px;line-height:1.4286;margin:0 0 10px;padding:9.5px;word-break:break-all}kbd{background-color:#fff;background-image:linear-gradient(180deg,#0000000d,#0000);border:1px solid #bbb;border-radius:4px;box-shadow:0 2px 0 #bbb,inset 0 1px 1px #fff,inset 0 -1px 3px #ccc;color:#444;display:inline-block;font-family:inherit;line-height:1em;margin:0 1px;min-width:28px;padding:4px 6px;text-align:center;text-shadow:0 1px 0 #fff}p{margin:0 0 10px}.btn{border:2px solid #84ce88;border:2px solid var(--button-color);border-radius:3px;color:#84ce88;color:var(--button-color);cursor:pointer;display:inline-block;font-size:12px;font-weight:700;letter-spacing:1px;margin-bottom:10px;padding:9px 17px;text-transform:uppercase;transition:background .2s,border-color .2s,color .2s,box-shadow .2s;word-spacing:3px}.btn-small{padding:5px 13px}.btn:disabled,.btn:focus,.btn:hover{background:#84ce88;background:var(--button-color);color:#fff;color:var(--button-text-color-hover);opacity:1}.btn:active,.btn:focus,.input:focus{box-shadow:0 0 0 3px #84ce8880;outline:0}.btn:active{opacity:.8}.btn:disabled{opacity:.6}.btn-sm{border-width:1px;letter-spacing:0;padding:4px 8px;text-transform:none;word-spacing:0}.container{align-self:center;margin-bottom:20px;padding:0 15px;touch-action:pan-y;width:480px}#changelog .container,#chat .messages,#help .container,#js-copy-hack,#loading pre,.header .title,.header .topic{cursor:text;-webkit-user-select:text;user-select:text}#js-copy-hack{left:-999999px;position:absolute}#chat #js-copy-hack .msg[data-type=condensed]:not(.closed) .msg,#chat #js-copy-hack>.msg{display:block}.only-copy{display:inline-block;font-size:0;opacity:0;width:.01px}#chat .count:before,#chat .msg-shown-in-active span:before,#chat .msg-statusmsg span:before,#chat .msg[data-command=help] .from:before,#chat .msg[data-command=info] .from:before,#chat .msg[data-command=motd] .from:before,#chat .msg[data-type=action] .from:before,#chat .msg[data-type=away] .from:before,#chat .msg[data-type=back] .from:before,#chat .msg[data-type=ctcp] .from:before,#chat .msg[data-type=ctcp_request] .from:before,#chat .msg[data-type=invite] .from:before,#chat .msg[data-type=join] .from:before,#chat .msg[data-type=kick] .from:before,#chat .msg[data-type=login] .from:before,#chat .msg[data-type=logout] .from:before,#chat .msg[data-type=mode] .from:before,#chat .msg[data-type=mode_channel] .from:before,#chat .msg[data-type=mode_user] .from:before,#chat .msg[data-type=nick] .from:before,#chat .msg[data-type=part] .from:before,#chat .msg[data-type=plugin] .from:before,#chat .msg[data-type=quit] .from:before,#chat .msg[data-type=raw] .from:before,#chat .msg[data-type=topic] .from:before,#chat .msg[data-type=whois] .from:before,#chat .scroll-down-arrow:after,#chat .toggle-button:after,#chat .toggle-content .more-caret:before,#chat .topic-container .save-topic span:before,#chat button.close:before,#chat button.mentions:before,#chat button.menu:before,#chat button.search:before,#connect .extra-help,#footer .icon,#form #submit:before,#form #upload:before,#help .documentation-link:before,#help .report-issue-link:before,#help .website-link:before,#image-viewer .next-image-btn:before,#image-viewer .open-btn:before,#image-viewer .previous-image-btn:before,#settings #play:before,#settings .extra-help,#settings .settings-menu .icon:before,#sidebar .collapse-network-icon:before,#version-checker:before,#viewport .lt:before,#viewport .rt:before,.channel-list-item .not-connected-icon:before,.channel-list-item .not-secure-icon:before,.channel-list-item .parted-channel-icon:before,.channel-list-item:before,.context-menu-item:before,.jump-to-input:before,.password-container .reveal-password span{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font:normal normal normal 14px/1 FontAwesome;font-size:inherit}#viewport .lt:before{content:"\f0c9"}#viewport .rt:before{content:"\f0c0"}#chat button.menu:before{content:"\f142"}#chat button.mentions:before{content:"\f1fa"}#chat button.search:before{content:"\f002"}#chat button.close:before{content:"\f00d"}.context-menu-join:before{content:"\f067"}.context-menu-user:before{content:"\f007"}.context-menu-close:before{content:"\f00d"}.context-menu-list:before{content:"\f03a"}.context-menu-disconnect:before{content:"\f127"}.context-menu-connect:before{content:"\f0c1"}.context-menu-action-whois:before{content:"\f05a"}.context-menu-action-ignore:before{content:"\f506"}.context-menu-action-kick:before{content:"\f05e"}.context-menu-action-set-mode:before{content:"\f067"}.context-menu-action-revoke-mode:before{content:"\f068"}.context-menu-network:before{content:"\f233"}.context-menu-edit:before{content:"\f303"}.context-menu-clear-history:before{content:"\f1f8"}.context-menu-mute:before{content:"\f6a9"}.channel-list-item .not-secure-icon:before{content:"\f071"}.channel-list-item .not-connected-icon:before,.channel-list-item .parted-channel-icon:before{content:"\f127"}.channel-list-item[data-type=query]:before,.context-menu-action-query:before,.context-menu-query:before{content:"\f075"}.channel-list-item[data-type=channel]:before,.context-menu-chan:before{content:"\f086"}.channel-list-item[data-type=special]:before{content:"\f03a"}.channel-list-item.has-draft:not(.active):not([data-type=lobby]):before{content:"\f304"}#footer .connect:before{content:"\f067"}#footer .settings:before{content:"\f013"}#footer .help:before{content:"\f059"}#form #upload:before{content:"\f0c6"}#form #submit:before{content:"\f1d8"}#chat .msg[data-type=away] .from:before,#chat .msg[data-type=back] .from:before{color:#7f8c8d;content:"\f017"}#help .documentation-link:before,#help .report-issue-link:before,#help .website-link:before{display:inline-block;margin-right:5px;text-align:center;width:1.35em}#help .website-link:before{content:"\f0ac"}#help .documentation-link:before{content:"\f19d"}#help .report-issue-link:before{content:"\f188"}#chat .msg[data-type=invite] .from:before{color:#2ecc40;content:"\f0e0"}#chat .msg[data-type=login] .from:before{color:#2ecc40;content:"\f007"}#chat .msg[data-type=logout] .from:before{color:#ff4136;content:"\f007"}#chat .msg[data-type=part] .from:before,#chat .msg[data-type=quit] .from:before{color:#ff4136;content:"\f2f5";display:inline-block;transform:rotate(180deg)}#chat .msg[data-type=topic] .from:before{color:#2ecc40;content:"\f0a1"}#chat .msg[data-type=mode] .from:before,#chat .msg[data-type=mode_channel] .from:before,#chat .msg[data-type=mode_user] .from:before{color:#2ecc40;content:"\f05a"}#chat .msg[data-command=motd] .from:before{color:#767676;color:var(--body-color-muted);content:"\f02e"}#chat .msg[data-command=help] .from:before{color:#767676;color:var(--body-color-muted);content:"\f059"}#chat .msg[data-command=info] .from:before{color:#767676;color:var(--body-color-muted);content:"\f05a"}#chat .msg[data-type=ctcp] .from:before,#chat .msg[data-type=ctcp_request] .from:before{color:#767676;color:var(--body-color-muted);content:"\f15c"}#chat .msg[data-type=whois] .from:before{color:#2ecc40;content:"\f007"}#chat .msg[data-type=nick] .from:before{color:#2ecc40;content:"\f007"}#chat .msg[data-type=join] .from:before{color:#2ecc40;content:"\f2f6"}#chat .msg[data-type=kick] .from:before{color:#ff4136;content:"\f05e"}#chat .msg[data-type=raw] .from:before{content:"\f101"}#chat .msg.self[data-type=raw] .from:before{color:#2ecc40;content:"\f359"}#chat .msg[data-type=action] .from:before{content:"\f005"}#chat .msg[data-type=plugin] .from:before{content:"\f1e6";display:inline-block;padding:1px;transform:rotate(45deg)}#chat .msg-shown-in-active,#chat .msg-statusmsg{cursor:help;margin-right:5px}#chat .msg-shown-in-active span:before,#chat .msg-statusmsg span:before{content:"\f06e";font-size:10px}#chat .msg-statusmsg{background-color:#ff9e18;border-radius:2px;color:#222;padding:2px 4px}#chat .toggle-button{display:inline-block;text-align:center;transition:opacity .2s,transform .2s;width:1.35em}#chat .toggle-button:after{content:"\f0da"}#chat .count:before{color:#cfcfcf;content:"\f002";line-height:45px;position:absolute;right:13px}#connect .extra-help:before,#settings .extra-help:before{content:"\f059"}#settings #play:before{content:"\f028";margin-right:9px}#image-viewer .previous-image-btn:before{content:"\f104"}#image-viewer .next-image-btn:before{content:"\f105"}#image-viewer .open-btn:before{content:"\f35d"}#app{height:100%;width:100%}#viewport{display:flex;height:100%}#form button,.header button,.reveal-password span{transition:opacity .2s}#form button:hover,.header button:hover,.reveal-password span:hover{opacity:.6}#chat button.close,#chat button.mentions,#chat button.menu,#chat button.search,#viewport .lt,#viewport .rt{color:#607992;display:flex;flex-shrink:0;font-size:14px;height:36px;line-height:1;width:36px}#chat button.close:before,#chat button.mentions:before,#chat button.menu:before,#chat button.search:before,#viewport .lt:before,#viewport .rt:before{line-height:36px;width:36px}#viewport .lt{position:fixed}#viewport #chat .lt{position:relative}#viewport .lt:after{background-clip:padding-box;background-color:#e74c3c;border:2px solid #fff;border:2px solid var(--window-bg-color);border-radius:50%;content:"";height:10px;opacity:0;position:absolute;right:7px;top:9px;transition:opacity .2s;width:10px}#viewport.notified .lt:after{opacity:1}#viewport.userlist-open #chat .userlist{display:flex}#sidebar{color:#b7c5d1;display:none;flex-direction:column;max-height:100%;width:220px;will-change:transform}#viewport.menu-open #sidebar{display:flex}#sidebar .scrollable-area{-webkit-overflow-scrolling:touch;flex-grow:1;overflow-x:auto;overscroll-behavior:contain;scrollbar-width:thin;touch-action:pan-y}#sidebar .logo-container{text-align:center}#sidebar .logo,#sidebar .logo-inverted{height:45px}#sidebar .logo{display:none}#sidebar .empty,.channel-list-item{font-size:14px}.channel-list-item{cursor:pointer;display:flex;padding:8px 14px;position:relative}#footer button.active,#footer button:hover,.channel-list-item.active,.channel-list-item:hover{color:#fff}#footer button:hover,.channel-list-item:hover{background-color:#303e4a80}#footer button.active,.channel-list-item.active{background-color:#303e4a;cursor:default}.ui-sortable-dragging,.ui-sortable-dragging .channel-list-item,.ui-sortable-dragging-touch-cue,.ui-sortable-dragging-touch-cue .channel-list-item,.ui-sortable-dragging-touch-cue.active,.ui-sortable-dragging-touch-cue:hover,.ui-sortable-dragging.active,.ui-sortable-dragging:hover,.ui-sortable-ghost{background:#0000}.ui-sortable-dragging-touch-cue:not(.ui-sortable-dragging):after,.ui-sortable-ghost:after{background:#415364;background:var(--body-bg-color);border:1px dashed #99a2b4;border-radius:6px;bottom:0;content:" ";display:block;left:10px;position:absolute;right:10px;top:0}.ui-sortable-dragging-touch-cue:not(.ui-sortable-ghost):after{background:#0000}#sidebar .network{margin-bottom:20px;position:relative;touch-action:pan-y}#sidebar .empty{flex-grow:1;line-height:1.6;padding:40px 20px;text-align:center}.channel-list-item[data-type=lobby]{color:#84ce88;font-size:15px;font-weight:700;padding-left:0}.channel-list-item .lobby-wrap{display:flex;flex-grow:1;overflow:hidden}.channel-list-item[data-type=lobby].active,.channel-list-item[data-type=lobby]:hover{color:#c0f8c3}.channel-list-item .not-connected-tooltip,.channel-list-item .not-secure-tooltip,.channel-list-item .parted-channel-tooltip{margin:0 8px}.channel-list-item.not-secure{color:#f39c12}.channel-list-item.not-secure.active,.channel-list-item.not-secure:hover{color:#f8c572}.channel-list-item.not-connected,.channel-list-item.parted-channel{color:#e74c3c}.channel-list-item.not-connected.active,.channel-list-item.not-connected:hover,.channel-list-item.parted-channel.active,.channel-list-item.parted-channel:hover{color:#f1978e}.channel-list-item.is-muted{opacity:.5}.channel-list-item:before{line-height:18px;margin-right:12px;width:14px}.channel-list-item .name{flex-grow:1;margin-right:5px;overflow:hidden;position:relative;white-space:nowrap}.channel-list-item .name,.header .topic{-webkit-mask-image:linear-gradient(270deg,#0000,#000 20px);mask-image:linear-gradient(270deg,#0000,#000 20px)}#sidebar .add-channel-tooltip,.channel-list-item .badge,.channel-list-item .close-tooltip{flex-shrink:0;line-height:1}.channel-list-item .badge{background:#ffffff0f;border-radius:3px;color:#afb6c0;font-size:10px;padding:4px 6px;transition:background-color .2s,color .2s}.channel-list-item .badge:empty{display:none}.channel-list-item .badge.highlight{background:#fff;color:#49505a}.channel-list-item .close{display:none;height:18px;transition:opacity .2s,background-color .2s;width:18px}.channel-list-item .close:before{color:#fff;content:"×";display:inline-block;font-size:20px;font-weight:400;line-height:16px;text-align:center}.channel-list-item.active .close{display:unset;opacity:.4}.channel-list-item.active .close:hover{opacity:1}.channel-list-item[data-type=lobby] .add-channel{border-radius:3px;height:18px;opacity:.4;transition:opacity .2s,background-color .2s,transform .2s;width:18px}.channel-list-item[data-type=lobby] .add-channel:before{color:#fff;content:"+";display:inline-block;font-size:20px;font-weight:400;line-height:16px;text-align:center}.channel-list-item[data-type=lobby] .add-channel:hover{opacity:1}.channel-list-item[data-type=lobby] .add-channel.opened{transform:rotate(45deg) translateZ(0)}#sidebar .network .collapse-network{flex-shrink:0;opacity:.4;padding-left:11px;transition:opacity .2s;width:40px}#sidebar .network .collapse-network-icon{display:block;height:20px;transition:transform .2s;width:20px}#sidebar .network.collapsed .collapse-network-icon{transform:rotate(-90deg)}#sidebar .network .collapse-network-icon:before{color:#fff;content:"\f0d7"}#sidebar .collapse-network:hover{opacity:1}#footer{display:flex;flex-shrink:0;font-size:14px;height:45px;justify-content:center}#footer button{border-radius:5px;color:#b7c5d1;display:inline-block;height:100%;width:45px}#footer .help.notified:after{background:#415364;background:var(--body-bg-color);border-radius:50%;bottom:10px;color:#50a656;color:var(--link-color);content:"\f021";font-size:10px;padding:2px;position:absolute;right:7px}#settings .error,.window label,.window li,.window p{font-size:14px}.input{background-color:#fff;border:1px solid #cdd3da;border-radius:2px;color:#222;font-size:14px;height:35px;line-height:35px;margin:2px 0 10px;padding:0 10px;transition:border-color .2s,box-shadow .2s;width:100%}.input:disabled{background-color:#ddd}.input:not(:disabled):focus,.input:not(:disabled):hover{border-color:#84ce88}textarea.input{line-height:1.5;min-height:35px;padding:6px 10px;resize:vertical}.window{-webkit-overflow-scrolling:touch;background:#fff;background:var(--window-bg-color);display:flex;flex:1 1 auto;flex-direction:column;height:100%;overflow-y:auto;overscroll-behavior:contain;position:relative;scrollbar-width:thin}#chat .chat-view,#loading{bottom:0;left:0;position:absolute;right:0;top:0}.window h1{font-size:36px}.window h2{border-bottom:1px solid;color:#6c797a;color:var(--window-heading-color);font-size:22px;margin:30px 0 10px;padding-bottom:7px}.window h2 small{font-size:16px;line-height:30px}.window h3{color:#6c797a;color:var(--window-heading-color);font-size:18px;margin:20px 0 10px}.header{align-items:center;display:flex;flex-shrink:0;height:45px;line-height:45px;overflow:hidden;padding:0 6px}#chat .header{border-bottom:1px solid #e7e7e7}.header .title{flex-shrink:1;font-size:15px;overflow:hidden;padding-left:6px;text-overflow:ellipsis;white-space:nowrap}.topic-container{flex-grow:1;padding-left:10px;position:relative}.header .topic{color:#767676;color:var(--body-color-muted);flex-grow:1;flex-shrink:99999999;font-size:14px;margin-left:8px;min-width:25px;overflow:hidden;word-break:break-all}.header .topic.empty{min-width:0}.header .topic-input{background:#0000;border:1px solid #cdd3da;border-radius:2px;color:inherit;font-size:14px;height:35px;line-height:normal;outline:none;overflow:hidden;padding-left:10px;padding-right:37px;width:100%}.topic-container .save-topic{position:absolute;right:0;top:6px}.topic-container .save-topic span{align-items:center;-webkit-appearance:none;appearance:none;color:#607992;cursor:pointer;display:flex;font-size:16px;height:35px;justify-content:center;width:35px}.topic-container .save-topic span:hover{opacity:.6}#chat{flex:1 0 auto;overflow:hidden;position:relative}#chat .chat-view{display:flex;flex-direction:column}#chat .msg[data-type=condensed]{flex-wrap:wrap}#chat .msg[data-type=condensed] .content{flex:1}#chat .msg[data-type=condensed] .msg{flex-basis:100%}#chat .condensed-summary .content{cursor:pointer;display:block;-webkit-user-select:none;user-select:none}#chat .condensed-summary{display:flex}#chat .condensed-summary .content:hover{text-decoration:underline}#chat .msg.closed[data-type=condensed] .msg{display:none}#chat .condensed-summary .time{visibility:hidden}#form,.messages .msg,.userlist{font-size:14px;line-height:1.4}#chat .chat-content{display:flex;flex-direction:row-reverse;flex-grow:1;overflow:hidden;position:relative}#chat .chat{-webkit-overflow-scrolling:touch;display:flex;flex-direction:column;flex-grow:1;outline:none;overflow:auto;overflow-x:hidden;overscroll-behavior:contain;scrollbar-width:thin}#chat .userlist{border-left:1px solid #e7e7e7;display:none;flex-direction:column;flex-shrink:0;touch-action:pan-y;width:180px}#sidebar .join-form{padding:0 18px 8px}#sidebar .join-form .input{display:block;margin:5px auto}#sidebar .join-form .btn{display:block;margin:auto;width:100%}#chat .show-more{padding:15px 10px 0;width:100%}#chat .show-more .btn{margin:0;width:100%}.scroll-down{bottom:16px;cursor:pointer;opacity:0;pointer-events:none;position:absolute;right:16px;transform:translateY(16px);transition:transform .2s,opacity .2s;z-index:2}.scroll-down-shown{opacity:1;pointer-events:auto;transform:none}.scroll-down-arrow{background:#fff;background:var(--window-bg-color);border:2px solid #84ce88;border:2px solid var(--button-color);border-radius:50%;box-shadow:0 6px 10px 0 #00000026;color:#84ce88;color:var(--button-color);height:36px;line-height:34px;text-align:center;transition:background .2s,color .2s;width:36px}.scroll-down:hover .scroll-down-arrow{background:#84ce88;background:var(--button-color);color:#fff;color:var(--button-text-color-hover)}.scroll-down-arrow:after{content:"\f107"}.userlist-open .chat-view[data-type=channel] .scroll-down{right:196px}#chat .messages{padding:10px 0;touch-action:pan-y}#chat .chat-view:not([data-type=special]) .messages{margin-top:auto}#chat .msg{word-wrap:break-word;align-items:flex-start;display:flex;position:relative;word-break:break-word}#chat .unread-marker{font-size:12px;font-weight:700;margin:0 10px;position:relative;text-align:center;z-index:0}#chat .unread-marker:before{border-top:1px solid #e74c3c80;border-top:1px solid var(--unread-marker-color);content:"";left:0;position:absolute;right:0;top:50%;z-index:-1}#chat .unread-marker-text:before{background-color:#fff;background-color:var(--window-bg-color);color:#e74c3c80;color:var(--unread-marker-color);content:"New messages";padding:0 10px}#chat .date-marker{font-size:12px;font-weight:700;margin:0 10px;position:relative;text-align:center;z-index:0}#chat .date-marker:before{border-top:1px solid #006b3b80;border-top:1px solid var(--date-marker-color);content:"";left:0;position:absolute;right:0;top:50%;z-index:-1}#chat .date-marker-text:before{background-color:#fff;background-color:var(--window-bg-color);color:#006b3b80;color:var(--date-marker-color);content:attr(aria-label);padding:0 10px}#chat .content,#chat .from,#chat .time{flex:0 0 auto;padding:3px 0}#chat .time{font-feature-settings:"tnum";box-sizing:initial;color:#767676;color:var(--body-color-muted);font-variant-numeric:tabular-nums;padding-left:10px;width:55px}#chat.time-12h .time,#chat.time-seconds .time{width:75px}#chat.time-seconds.time-12h .time{width:90px}#chat .from{overflow:hidden;padding-right:10px;position:relative;text-align:right;white-space:nowrap;width:134px}#chat .content{border-left:1px solid #f6f6f6;flex:1 1 auto;min-width:0;overflow:hidden;padding-left:10px;padding-right:6px;text-align:left}#chat .msg[data-type=unhandled] .from{color:#767676;color:var(--body-color-muted)}#chat .chat-view[data-type=special] table th{word-break:normal}#chat .user,.inline-channel{cursor:pointer}.chat .user:hover,.inline-channel:hover{text-decoration:underline}.user{color:#50a656}.user.color-1{color:#107ead}.user.color-2{color:#a86500}.user.color-3{color:#008a3c}.user.color-4{color:#e00096}.user.color-5{color:#f0000c}.user.color-6{color:#000094}.user.color-7{color:#006441}.user.color-8{color:#00566e}.user.color-9{color:#e6006b}.user.color-10{color:#0d8766}.user.color-11{color:#006b3b}.user.color-12{color:#00857e}.user.color-13{color:#00465b}.user.color-14{color:#eb005a}.user.color-15{color:#e62600}.user.color-16{color:#0f8546}.user.color-17{color:#e60067}.user.color-18{color:#eb002b}.user.color-19{color:#eb003f}.user.color-20{color:#007a56}.user.color-21{color:#095092}.user.color-22{color:#000bde}.user.color-23{color:#008577}.user.color-24{color:#00367d}.user.color-25{color:#007e9e}.user.color-26{color:#006119}.user.color-27{color:#007ea8}.user.color-28{color:#3c8500}.user.color-29{color:#e6007e}.user.color-30{color:#c75300}.user.color-31{color:#eb0400}.user.color-32{color:#e60082}#chat .self .content{color:#767676;color:var(--body-color-muted)}#chat .msg.channel_list_loading .text{color:#999;font-style:italic;padding-left:20px}#chat .msg.channel_list_truncated .text{color:red;padding-left:20px}#chat table.ban-list,#chat table.channel-list,#chat table.ignore-list,#chat table.invite-list{margin:5px 10px;width:calc(100% - 30px)}#chat table.ban-list td,#chat table.ban-list th,#chat table.channel-list td,#chat table.channel-list th,#chat table.ignore-list th,#chat table.invite-list td,#chat table.invite-list th{border-bottom:1px solid #eee;padding:5px;vertical-align:top}#chat table.channel-list .channel{width:80px}#chat table.ban-list .banned_at,#chat table.ban-list .banned_by,#chat table.ban-list .hostmask,#chat table.channel-list .channel,#chat table.channel-list .topic,#chat table.ignore-list .hostmask,#chat table.ignore-list .when{text-align:left}#chat table.channel-list .users{text-align:center;width:50px}#chat.hide-motd .msg[data-command=motd]{display:none!important}#chat .msg[data-type=monospace_block] .text{background:#f6f6f6;border-radius:4px;display:inline-block;padding:6px}#chat .msg[data-type=away] .content,#chat .msg[data-type=back] .content,#chat .msg[data-type=condensed] .content,#chat .msg[data-type=join] .content,#chat .msg[data-type=kick] .content,#chat .msg[data-type=mode] .content,#chat .msg[data-type=nick] .content,#chat .msg[data-type=part] .content,#chat .msg[data-type=quit] .content,#chat .msg[data-type=topic] .content,#chat .msg[data-type=topic_set_by] .content{color:#767676;color:var(--body-color-muted)}#chat .msg[data-type=action] .content,#chat .msg[data-type=action] .from,#chat .msg[data-type=action] .user{color:#f39c12}#chat .msg[data-type=notice] .content,#chat .msg[data-type=notice] .time,#chat .msg[data-type=notice] .user,#chat .msg[data-type=wallops] .content,#chat .msg[data-type=wallops] .time,#chat .msg[data-type=wallops] .user{color:#0074d9}#chat .msg[data-type=notice] .from .user:before{content:"Notice: "}#chat .msg[data-type=wallops] .from .user:before{content:"Wallops: "}#chat .msg[data-type=error],#chat .msg[data-type=error] .from{color:#e74c3c}#chat .chat-view[data-type=channel] .msg.highlight{background-color:#efe8dc;background-color:var(--highlight-bg-color);border-left:5px solid #b08c4f;border-left:5px solid var(--highlight-border-color)}#chat .chat-view[data-type=channel] .msg.highlight .time{color:#696969;padding-left:5px}#chat .chat-view[data-type=channel] .msg.highlight .content{border-left:1px solid #efe8dc;border-left:1px solid var(--highlight-bg-color)}#chat .preview-size{margin-left:5px;-webkit-user-select:none;user-select:none}#chat .msg:not(.closed)[data-type=condensed] .toggle-button,#chat .toggle-button.opened,#chat .toggle-content.opened .more-caret{transform:rotate(90deg)}#chat .preview{display:flex}#chat .toggle-content{align-items:flex-start;background:#f6f6f6;border-radius:5px;box-shadow:0 1px 3px #0003;display:inline-flex!important;margin:6px 0 0;max-width:100%;overflow:hidden;white-space:normal}#chat .toggle-content img{cursor:zoom-in;display:block;max-height:128px;max-width:100%}#chat .toggle-content pre.prefetch-error{background-color:initial;color:inherit;margin:0;padding:0}#chat .toggle-content .prefetch-error{display:none}#chat .toggle-content.opened .prefetch-error{display:inline}#chat .toggle-content .thumb{max-height:54px;max-width:96px}#chat .toggle-content .toggle-text,#chat .toggle-type-error{padding:8px 10px}#chat .toggle-content .toggle-text{overflow:hidden;text-align:initial;white-space:nowrap}#chat .toggle-content.opened .toggle-text{white-space:normal}#chat .toggle-content .head{align-items:flex-start;display:flex;font-weight:700}#chat .toggle-text .body,#chat .toggle-type-error{color:#717171}#chat .toggle-text a{color:inherit}#chat .toggle-text .overflowable{flex-grow:1;overflow:hidden;text-overflow:ellipsis}#chat .toggle-content .more{color:#50a656;color:var(--link-color);flex-shrink:0;font-weight:400;margin-left:10px}#chat .toggle-content .more:hover{text-decoration:underline}#chat .toggle-content .more:after{content:" " attr(aria-label)}#chat .toggle-content .more-caret{display:inline-block;transition:transform .2s}#chat .toggle-content .more-caret:before{content:"\f0da"}#chat audio{max-width:100%;width:600px}#chat .toggle-type-video{max-width:640px}#chat video{max-height:240px;max-width:100%}#chat .preview:empty{display:none}#chat .userlist .count{background:#fafafa;flex-shrink:0;height:45px;position:relative}#chat .userlist .search{-webkit-appearance:none;appearance:none;background:none;border:0;color:#222;color:var(--body-color);font:inherit;outline:0;padding:13px 30px 13px 13px;width:100%}#chat .userlist .names{-webkit-overflow-scrolling:touch;flex-grow:1;overflow:auto;overflow-x:hidden;overscroll-behavior:contain;padding-bottom:10px;scrollbar-width:thin;touch-action:pan-y;width:100%}#chat .names .user{display:block;line-height:1.6;padding:0 16px;white-space:nowrap}#chat .user-mode{margin-bottom:15px}#chat .user-mode:before{background:#fff;background:var(--window-bg-color);color:#767676;color:var(--body-color-muted);display:block;font-size:.85em;line-height:1.6;padding:5px 16px;position:sticky;top:0}#chat .user-mode.owner:before{content:"Owners"}#chat .user-mode.admin:before{content:"Administrators"}#chat .user-mode.op:before{content:"Operators"}#chat .user-mode.half-op:before{content:"Half-Operators"}#chat .user-mode.voice:before{content:"Voiced"}#chat .user-mode.normal:before{content:"Users"}#chat .user-mode-search:before{content:"Search Results"}#loading{display:flex;font-size:14px;height:100%}#loading .window{display:flex;flex-direction:column;height:auto}#loading p{margin-top:10px}#loading-reload,#loading-slow{visibility:hidden}#loading summary{cursor:pointer;outline:none}#loading pre{text-align:left;white-space:normal}#loading-reload-container,#loading-status-container,#sign-in .container{align-items:center;display:flex;flex:1 0 auto;flex-direction:column;justify-content:center}#loading-reload-container{flex-grow:0}#loading .logo-inverted,.window .logo-inverted{display:none}#sign-in label{display:block;margin-top:10px;width:100%}#sign-in .btn{margin-top:25px}#sign-in .error{color:#e74c3c;margin-top:1em;width:100%}#connect .connect-row{display:flex}#connect .connect-row>.input,#connect .connect-row>.input-wrap{flex-grow:1}#connect label{flex-shrink:0;margin-top:11px;width:25%}#connect .tls{display:block;margin-top:6px;width:100%}#connect .tls input,#connect input[name=proxyEnabled]{margin:3px 10px 0 0}#connect\:host,#connect\:proxyHost{width:70%}#connect\:port,#connect\:proxyPort{width:25%}#connect\:portseparator,#connect\:proxyPortSeparator{display:inline-block;text-align:center;width:5%}#connect .btn{margin-top:15px;width:100%}#settings .settings-sync-panel{background-color:#d9edf7;border-radius:2px;color:#31708f;margin-bottom:16px;padding:10px}#settings .settings-sync-panel p:last-child{margin-bottom:0}#settings .settings-sync-panel .btn{border-color:#007bff;color:#007bff;margin-bottom:0}#settings .settings-sync-panel .btn:focus,#settings .settings-sync-panel .btn:hover{background-color:#007bff;color:#fff}#settings .settings-sync-panel .btn:active,#settings .settings-sync-panel .btn:focus{box-shadow:0 0 0 3px #007bff80}#settings .opt{display:block;padding:5px 0 5px 1px}#settings .opt input{margin-right:6px}#connect .extra-help,#settings .extra-help{cursor:help}#settings h2 .extra-help{font-size:.8em}#settings #play{color:#6c797a;color:var(--window-heading-color);font-size:14px;transition:opacity .2s}#settings #play:hover{opacity:.8}#settings #change-password .error,#settings #change-password .success{margin-bottom:1em}#settings #change-password .error{color:#e74c3c}#settings #change-password .success{color:#2ecc40}#settings .error{color:#e74c3c;margin-top:.2em}.password-container{position:relative}.password-container input{padding-right:37px}#sign-in .password-container{width:100%}#sign-in .password-container .reveal-password{top:31px}.password-container .reveal-password{-webkit-appearance:none;appearance:none;position:absolute;right:0;top:2px}.password-container .reveal-password span{align-items:center;color:#607992;cursor:pointer;display:flex;font-size:16px;height:35px;justify-content:center;width:35px}.password-container .reveal-password span:before{content:"\f06e"}.topic-container .save-topic span:before{content:"\f00c"}.password-container .reveal-password-visible span:before{color:#ff4136;content:"\f070"}#help .help-version-title{display:flex;justify-content:space-between}#help .help-item{display:table-row;font-size:14px}#help .help-item .description,#help .help-item .subject{display:table-cell;padding-bottom:15px}#help .help-item .subject{padding-right:15px;white-space:nowrap}#help .help-item .subject.gesture{font-weight:700}#help .help-item .description p{margin-bottom:0}.whois{display:grid;grid-template-columns:max-content auto;margin:0}.whois dt{grid-column-start:1;margin-right:20px}.whois dd{grid-column-start:2}.changelog-text{line-height:1.5}.changelog-text p{margin-bottom:16px}.window#changelog h3{border-bottom:1px solid;color:#6c797a;color:var(--window-heading-color);font-size:20px;margin:30px 0 10px;padding-bottom:7px}.window#chat-container{overflow:hidden}#version-checker{align-items:center;border-radius:2px;display:flex;margin-bottom:16px;padding:10px;transition:color .2s,background-color .2s}#version-checker button,#version-checker p{margin-bottom:0}#version-checker p{flex:1;padding-bottom:6px;padding-top:6px}#version-checker:before{font-size:1.2em;margin-left:6px;margin-right:12px}#version-checker.loading{background-color:#d9edf7;color:#31708f}#version-checker.loading:before{content:"\f253"}#version-checker.new-packages,#version-checker.new-version{background-color:#fcf8e3;color:#8a6d3b}#version-checker.new-packages:before,#version-checker.new-version:before{content:"\f164"}#version-checker.error{background-color:#f2dede;color:#a94442}#version-checker.error:before{content:"\f06a"}#version-checker.up-to-date{background-color:#dff0d8;color:#3c763d}#version-checker.up-to-date:before{content:"\f00c"}#upload-progressbar{background:#84ce88;background:var(--upload-progressbar-color);box-shadow:0 0 10px #84ce88;box-shadow:0 0 10px var(--upload-progressbar-color);height:2px;left:0;position:absolute;top:-1px;visibility:hidden;width:0}#upload-progressbar.upload-progressbar-visible{transition:width .3s ease-in-out;visibility:visible}#form{align-items:flex-end;background:#fff;border:0;border-radius:0;border-top:1px solid #e7e7e7;display:flex;flex:0 0 auto;margin:0;padding:6px;position:relative}#user-visible-error{background:#e74c3c;color:#fff;cursor:pointer;font-size:14px;font-weight:600;line-height:1.5;padding:10px;text-align:center;text-transform:uppercase;word-spacing:3px}#form #nick{background:#f6f6f6;border-radius:2px;color:#666;display:none;font-size:13px;line-height:24px;margin:4px;padding:0 8px}.public #form #nick{display:block}#form #input{align-self:center;background:#0000;border:none;flex:1 0 auto;font:inherit;height:19px;line-height:19px;margin:5px;max-height:95px;min-height:19px;outline:none;padding:0;resize:none;touch-action:pan-y}#form #upload-input{display:none}#form #submit,#form #upload{color:#607992;flex:0 0 auto;font-size:14px;height:32px;width:32px}#form #submit[disabled],#form #upload[disabled]{opacity:.5}#context-menu-container,#mentions-popup-container{background:#0000;height:100%;left:0;position:absolute;top:0;width:100%;z-index:1000}#context-menu-container.passthrough{pointer-events:none}#context-menu-container.passthrough>*{pointer-events:auto}#context-menu,.mentions-popup,.textcomplete-menu{background-color:#fff;border:1px solid #00000026;border-radius:5px;box-shadow:0 3px 12px #00000026;font-size:14px;list-style:none;margin:0;min-width:180px;outline:0;padding:0 6px;position:absolute}.context-menu-divider{background-color:#0000001a;height:1px;margin:6px 0}.context-menu-item,.textcomplete-item{border-radius:3px;color:#333;cursor:pointer;display:block;line-height:1.4;margin-bottom:6px;margin-top:6px;padding:4px 8px;white-space:nowrap}#chat .userlist .user.active,.context-menu-item.active,.textcomplete-item:focus,.textcomplete-item:hover,.textcomplete-menu .active{background-color:#0000001a}.context-menu-item:before,.textcomplete-item:before{display:inline-block;width:20px}.textcomplete-item a{color:#333}.textcomplete-item a:hover{text-decoration:none}.emoji{font-size:1.4em;line-height:1;vertical-align:text-top}.textcomplete-item .emoji{text-align:center;width:32px}.textcomplete-item .irc-bg{display:block}.irc-fg0{color:#fff}.irc-fg1{color:#000}.irc-fg2{color:#001f3f}.irc-fg3{color:#2ecc40}.irc-fg4{color:#ff4136}.irc-fg5{color:#85144b}.irc-fg6{color:#b10dc9}.irc-fg7{color:#ff851b}.irc-fg8{color:#ffdc00}.irc-fg9{color:#01ff70}.irc-fg10{color:#39cccc}.irc-fg11{color:#7fdbff}.irc-fg12{color:#0074d9}.irc-fg13{color:#f012be}.irc-fg14{color:#aaa}.irc-fg15{color:#ddd}.irc-bg0{background:#fff}.irc-bg1{background:#000}.irc-bg2{background:#001f3f}.irc-bg3{background:#2ecc40}.irc-bg4{background:#ff4136}.irc-bg5{background:#85144b}.irc-bg6{background:#b10dc9}.irc-bg7{background:#ff851b}.irc-bg8{background:#ffdc00}.irc-bg9{background:#01ff70}.irc-bg10{background:#39cccc}.irc-bg11{background:#7fdbff}.irc-bg12{background:#0074d9}.irc-bg13{background:#f012be}.irc-bg14{background:#aaa}.irc-bg15{background:#ddd}.irc-fg16{color:#470000}.irc-fg17{color:#472100}.irc-fg18{color:#474700}.irc-fg19{color:#324700}.irc-fg20{color:#004700}.irc-fg21{color:#00472c}.irc-fg22{color:#004747}.irc-fg23{color:#002747}.irc-fg24{color:#000047}.irc-fg25{color:#2e0047}.irc-fg26{color:#470047}.irc-fg27{color:#47002a}.irc-fg28{color:#740000}.irc-fg29{color:#743a00}.irc-fg30{color:#747400}.irc-fg31{color:#517400}.irc-fg32{color:#007400}.irc-fg33{color:#007449}.irc-fg34{color:#007474}.irc-fg35{color:#004074}.irc-fg36{color:#000074}.irc-fg37{color:#4b0074}.irc-fg38{color:#740074}.irc-fg39{color:#740045}.irc-fg40{color:#b50000}.irc-fg41{color:#b56300}.irc-fg42{color:#b5b500}.irc-fg43{color:#7db500}.irc-fg44{color:#00b500}.irc-fg45{color:#00b571}.irc-fg46{color:#00b5b5}.irc-fg47{color:#0063b5}.irc-fg48{color:#0000b5}.irc-fg49{color:#7500b5}.irc-fg50{color:#b500b5}.irc-fg51{color:#b5006b}.irc-fg52{color:red}.irc-fg53{color:#ff8c00}.irc-fg54{color:#ff0}.irc-fg55{color:#b2ff00}.irc-fg56{color:#0f0}.irc-fg57{color:#00ffa0}.irc-fg58{color:#0ff}.irc-fg59{color:#008cff}.irc-fg60{color:#00f}.irc-fg61{color:#a500ff}.irc-fg62{color:#f0f}.irc-fg63{color:#ff0098}.irc-fg64{color:#ff5959}.irc-fg65{color:#ffb459}.irc-fg66{color:#ffff71}.irc-fg67{color:#cfff60}.irc-fg68{color:#6fff6f}.irc-fg69{color:#65ffc9}.irc-fg70{color:#6dffff}.irc-fg71{color:#59b4ff}.irc-fg72{color:#5959ff}.irc-fg73{color:#c459ff}.irc-fg74{color:#f6f}.irc-fg75{color:#ff59bc}.irc-fg76{color:#ff9c9c}.irc-fg77{color:#ffd39c}.irc-fg78{color:#ffff9c}.irc-fg79{color:#e2ff9c}.irc-fg80{color:#9cff9c}.irc-fg81{color:#9cffdb}.irc-fg82{color:#9cffff}.irc-fg83{color:#9cd3ff}.irc-fg84{color:#9c9cff}.irc-fg85{color:#dc9cff}.irc-fg86{color:#ff9cff}.irc-fg87{color:#ff94d3}.irc-fg88{color:#000}.irc-fg89{color:#131313}.irc-fg90{color:#282828}.irc-fg91{color:#363636}.irc-fg92{color:#4d4d4d}.irc-fg93{color:#656565}.irc-fg94{color:#818181}.irc-fg95{color:#9f9f9f}.irc-fg96{color:#bcbcbc}.irc-fg97{color:#e2e2e2}.irc-fg98{color:#fff}.irc-bg16{background-color:#470000}.irc-bg17{background-color:#472100}.irc-bg18{background-color:#474700}.irc-bg19{background-color:#324700}.irc-bg20{background-color:#004700}.irc-bg21{background-color:#00472c}.irc-bg22{background-color:#004747}.irc-bg23{background-color:#002747}.irc-bg24{background-color:#000047}.irc-bg25{background-color:#2e0047}.irc-bg26{background-color:#470047}.irc-bg27{background-color:#47002a}.irc-bg28{background-color:#740000}.irc-bg29{background-color:#743a00}.irc-bg30{background-color:#747400}.irc-bg31{background-color:#517400}.irc-bg32{background-color:#007400}.irc-bg33{background-color:#007449}.irc-bg34{background-color:#007474}.irc-bg35{background-color:#004074}.irc-bg36{background-color:#000074}.irc-bg37{background-color:#4b0074}.irc-bg38{background-color:#740074}.irc-bg39{background-color:#740045}.irc-bg40{background-color:#b50000}.irc-bg41{background-color:#b56300}.irc-bg42{background-color:#b5b500}.irc-bg43{background-color:#7db500}.irc-bg44{background-color:#00b500}.irc-bg45{background-color:#00b571}.irc-bg46{background-color:#00b5b5}.irc-bg47{background-color:#0063b5}.irc-bg48{background-color:#0000b5}.irc-bg49{background-color:#7500b5}.irc-bg50{background-color:#b500b5}.irc-bg51{background-color:#b5006b}.irc-bg52{background-color:red}.irc-bg53{background-color:#ff8c00}.irc-bg54{background-color:#ff0}.irc-bg55{background-color:#b2ff00}.irc-bg56{background-color:#0f0}.irc-bg57{background-color:#00ffa0}.irc-bg58{background-color:#0ff}.irc-bg59{background-color:#008cff}.irc-bg60{background-color:#00f}.irc-bg61{background-color:#a500ff}.irc-bg62{background-color:#f0f}.irc-bg63{background-color:#ff0098}.irc-bg64{background-color:#ff5959}.irc-bg65{background-color:#ffb459}.irc-bg66{background-color:#ffff71}.irc-bg67{background-color:#cfff60}.irc-bg68{background-color:#6fff6f}.irc-bg69{background-color:#65ffc9}.irc-bg70{background-color:#6dffff}.irc-bg71{background-color:#59b4ff}.irc-bg72{background-color:#5959ff}.irc-bg73{background-color:#c459ff}.irc-bg74{background-color:#f6f}.irc-bg75{background-color:#ff59bc}.irc-bg76{background-color:#ff9c9c}.irc-bg77{background-color:#ffd39c}.irc-bg78{background-color:#ffff9c}.irc-bg79{background-color:#e2ff9c}.irc-bg80{background-color:#9cff9c}.irc-bg81{background-color:#9cffdb}.irc-bg82{background-color:#9cffff}.irc-bg83{background-color:#9cd3ff}.irc-bg84{background-color:#9c9cff}.irc-bg85{background-color:#dc9cff}.irc-bg86{background-color:#ff9cff}.irc-bg87{background-color:#ff94d3}.irc-bg88{background-color:#000}.irc-bg89{background-color:#131313}.irc-bg90{background-color:#282828}.irc-bg91{background-color:#363636}.irc-bg92{background-color:#4d4d4d}.irc-bg93{background-color:#656565}.irc-bg94{background-color:#818181}.irc-bg95{background-color:#9f9f9f}.irc-bg96{background-color:#bcbcbc}.irc-bg97{background-color:#e2e2e2}.irc-bg98{background-color:#fff}.irc-bold{font-weight:700}.irc-underline{text-decoration:underline}.irc-strikethrough{text-decoration:line-through}.irc-underline.irc-strikethrough{text-decoration:underline line-through}.irc-italic{font-style:italic}.tooltipped:after{font-size:12px}@media (min-width:480px){#chat .from{-webkit-mask-image:linear-gradient(270deg,#0000,#000 10px);mask-image:linear-gradient(270deg,#0000,#000 10px);padding-left:10px}}@media (max-width:768px){.tooltipped-no-touch:hover:after,.tooltipped-no-touch:hover:before{opacity:0;visibility:hidden}#sidebar .logo-container{margin-top:5px}#context-menu,#form #input,#help .help-item,#loading,#settings .error,#sidebar .empty,.channel-list-item,.header .topic,.messages .msg,.textcomplete-menu,.window label{font-size:15px}#sidebar{background:#415364;background:var(--body-bg-color);display:flex;height:100%;left:-220px;position:absolute;transform:translateZ(0);transition:transform .16s;z-index:10}#sidebar-overlay{background:#00000080;background:var(--overlay-bg-color);bottom:0;left:0;opacity:0;position:fixed;right:0;top:0;transition:opacity .16s,visibility .16s;visibility:hidden;z-index:9}#viewport.menu-open #sidebar-overlay{opacity:1}#viewport.menu-open #sidebar{transform:translate3d(220px,0,0)}#viewport.menu-dragging #sidebar,#viewport.menu-dragging #sidebar-overlay{transition:none}#viewport.menu-dragging #sidebar,#viewport.menu-open #sidebar{box-shadow:0 0 25px 0 #00000080}#viewport.menu-dragging #sidebar-overlay,#viewport.menu-open #sidebar-overlay{visibility:visible}#viewport .lt{position:relative}#chat .userlist{background-color:#fff;background-color:var(--window-bg-color);height:100%;position:absolute;right:0;transform:translateX(180px);transition:transform .2s;z-index:1}#viewport.userlist-open #chat .userlist{transform:translateX(0)}#chat .header .title{padding-left:6px}#chat .toggle-content .thumb{max-height:58px;max-width:104px}}@media (max-width:479px){.container{margin:0;max-width:100%}#sign-in .btn{width:100%}.input{margin-bottom:2px}#connect .connect-row{flex-direction:column}#connect .connect-row>.input,#connect .connect-row>.input-wrap{flex-grow:1}#help .help-version-title{flex-direction:column}#chat .messages{display:block;padding:5px 0}#chat .msg{display:block;padding:2px 10px}#chat .msg[data-type=condensed] .msg{padding:2px 0}#chat .content,#chat .from,#chat .time{border:0;display:inline;padding:0}#chat .from:after{content:" ";white-space:pre}#chat .chat-view[data-type=channel] .msg.highlight{padding-left:5px}#chat .chat-view[data-type=channel] .msg.highlight .time{padding-left:0}#chat .condensed-summary .from,#chat .condensed-summary .time{display:none}#help .help-item .subject{display:inline-block;padding-bottom:4px}#help .help-item .description{display:block}}::-webkit-scrollbar{background-color:#0000;width:8px}::-webkit-scrollbar:hover{background-color:#00000017}::-webkit-scrollbar-thumb:vertical{background:#00000080;border-radius:100px}::-webkit-scrollbar-thumb:vertical:active{background:#0009}#confirm-dialog-overlay,#image-viewer,#image-viewer .close-btn,#image-viewer .open-btn,#upload-overlay{align-items:center;display:flex;flex-direction:column;justify-content:center}#confirm-dialog-overlay,#image-viewer,#upload-overlay{background:#00000080;background:var(--overlay-bg-color);bottom:0;left:0;opacity:0;position:fixed;right:0;top:0;transition:opacity .2s,visibility .2s;-webkit-user-select:none;user-select:none;visibility:hidden;z-index:999}#confirm-dialog-overlay.opened,#image-viewer.opened,#upload-overlay.is-dragover{opacity:1;visibility:visible}#confirm-dialog-overlay,#image-viewer{background:#000000e6}#image-viewer .close-btn,#image-viewer .next-image-btn,#image-viewer .open-btn,#image-viewer .previous-image-btn{color:#fff;font-size:36px;opacity:.6;position:fixed;top:0;transition:opacity .2s;width:2em}#image-viewer .close-btn{height:2em;right:0;z-index:1002}#image-viewer .close-btn:before{content:"×"}#image-viewer .open-btn{bottom:0;height:2em;right:0;top:auto;z-index:1002}#image-viewer .next-image-btn,#image-viewer .previous-image-btn{bottom:0;z-index:1001}#image-viewer .previous-image-btn{left:0}#image-viewer .next-image-btn{right:0}#image-viewer .close-btn:hover,#image-viewer .next-image-btn:hover,#image-viewer .previous-image-btn:hover{opacity:1}#image-viewer>img{background-image:linear-gradient(45deg,#eee 25%,#0000 0,#0000 75%,#eee 0,#eee),linear-gradient(45deg,#eee 25%,#fff 0,#fff 75%,#eee 0,#eee);background-position:0 0,10px 10px;background-size:20px 20px;cursor:grab;position:absolute;transform-origin:50% 50%}#chat .ctcp-message,#chat .msg[data-type=action] .content,#chat .msg[data-type=message] .content,#chat .msg[data-type=monospace_block] .content,#chat .msg[data-type=notice] .content,#chat .new-topic,#chat .part-reason,#chat .quit-reason{white-space:pre-wrap}#chat table.channel-list .topic,.header .topic{white-space:nowrap}.chat-view[data-type=search-results] .search-status{align-items:center;display:flex;height:100%;justify-content:center}
|
|
2
|
+
#connect .connect-auth{display:block;margin-bottom:10px}#connect .connect-auth .opt{display:block;width:100%}#connect .connect-auth input{margin:3px 10px 0 0}#connect .connect-sasl-external{background-color:#d9edf7;border-radius:2px;color:#31708f;padding:10px}#connect .connect-sasl-external pre{margin:0;-webkit-user-select:text;user-select:text}
|
|
3
|
+
.settings-menu{margin-left:calc(50% - 510px);position:fixed;top:50px}@media screen and (max-width:calc(768px + 320px)){.settings-menu{align-self:center;margin:0 auto;padding:0 15px;position:static;width:min(480px,100%)}}.settings-menu ul{padding:0}.settings-menu li{font-size:18px;list-style:none}.settings-menu button{color:var(--body-color-muted);display:inline-block;height:100%;text-align:left;width:100%}.settings-menu li:not(:last-of-type) button{margin-bottom:8px}.settings-menu button:before{content:"";display:inline-block;height:18px;margin-right:8px;width:18px}.settings-menu .appearance:before{content:"\f108"}.settings-menu .account:before{content:"\f007"}.settings-menu .messages:before{content:"\f0e0"}.settings-menu .notifications:before{content:"\f0f3"}.settings-menu .general:before{content:"\f013"}.settings-menu button.active,.settings-menu button:hover{color:var(--body-color)}.settings-menu button.active{cursor:default}
|
|
4
|
+
form.message-search{display:flex}form.message-search .input-wrapper{display:flex}form.message-search input{-webkit-appearance:none;appearance:none;background-color:#fafafa;border:0;color:inherit;height:auto!important;margin:7px 0;width:100%}form.message-search input::placeholder{color:#00000059}@media (min-width:480px){form.message-search input{min-width:140px}form.message-search input:focus{min-width:220px}}form.message-search .input-wrapper{background:var(--window-bg-color);height:0;left:0;overflow:hidden;position:absolute;right:0;top:45px;z-index:1}form.message-search .input-wrapper input{margin:7px}form.message-search.opened .input-wrapper{height:50px}#chat form.message-search button{color:#607992;display:flex}
|
|
5
|
+
.channel-name{font-weight:700}
|
|
6
|
+
textarea#user-specified-css-input{height:100px}
|
|
7
|
+
.session-list .session-item{display:flex;font-size:14px}.session-list .session-item-info{display:flex;flex-direction:column;flex-grow:1}.session-list .session-item-btn{flex-shrink:0}.session-list .session-usage{color:var(--body-color-muted);font-style:italic}
|
|
8
|
+
.jump-to-input{margin:8px;position:relative}.jump-to-input .input{-webkit-appearance:none;appearance:none;background-color:#ffffff1a;border:0;color:#fff;margin:0;padding-right:35px;width:100%}.jump-to-input .input::placeholder{color:#ffffff59}.jump-to-input:before{bottom:0;color:#ffffff59;content:"\f002";line-height:35px!important;pointer-events:none;position:absolute;right:8px;top:0}.jump-to-results{list-style:none;margin:0;overflow:auto;padding:0}.jump-to-results .no-results{margin:14px 8px;text-align:center}.jump-to-results .channel-list-item.active{cursor:pointer}.jump-to-results .channel-list-item .add-channel,.jump-to-results .channel-list-item .close-tooltip{display:none}.jump-to-results .channel-list-item[data-type=lobby]{padding:8px 14px}.jump-to-results .channel-list-item[data-type=lobby]:before{content:"\f233"}
|
|
9
|
+
#confirm-dialog{background:var(--body-bg-color);border-radius:5px;color:#fff;margin:10px;max-width:500px}#confirm-dialog .confirm-text{padding:15px;-webkit-user-select:text;user-select:text}#confirm-dialog .confirm-text-title{font-size:20px;font-weight:700;margin-bottom:10px}#confirm-dialog .confirm-buttons{background:#0000004d;display:flex;justify-content:flex-end;padding:15px}#confirm-dialog .confirm-buttons .btn{margin-bottom:0;margin-left:10px}#confirm-dialog .confirm-buttons .btn-cancel{border-color:#0000}
|
|
10
|
+
#mentions-popup-container{z-index:8}.mentions-popup{background-color:var(--window-bg-color);max-height:400px;overflow-y:auto;padding:10px;position:absolute;right:80px;top:55px;width:400px;z-index:2}.mentions-popup>.mentions-popup-title{display:flex;font-size:20px;justify-content:space-between;margin-bottom:10px}.mentions-popup .mentions-info{display:flex;justify-content:space-between}.mentions-popup .msg{margin-bottom:15px;-webkit-user-select:text;user-select:text}.mentions-popup .msg:last-child{margin-bottom:0}.mentions-popup .msg .content{word-wrap:break-word;background-color:var(--highlight-bg-color);border-radius:5px;margin-top:2px;padding:6px;word-break:break-word}.mentions-popup .msg-dismiss:before{content:"×";display:inline-block;font-size:20px;font-weight:400;line-height:16px;text-align:center}.mentions-popup .msg-dismiss:hover{color:var(--link-color)}.mentions-popup .dismiss-all-mentions{margin:0;padding:4px 6px}@media (min-height:500px){.mentions-popup{max-height:60vh}}@media (max-width:768px){.mentions-popup{border:0;border-radius:0;bottom:0;box-shadow:none;left:0;max-height:none;right:0;top:45px;width:100%}}
|
|
11
|
+
|
|
12
|
+
/*# sourceMappingURL=style.css.map*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css/style.css","mappings":"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AC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,SAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,oBAAwB,CACpC,UAAY,wBAA2B,CACvC,UAAY,qBAAwB,CACpC,UAAY,wBAA2B,CACvC,UAAY,qBAAwB,CACpC,UAAY,wBAA2B,CACvC,UAAY,qBAAwB,CACpC,UAAY,wBAA2B,CACvC,UAAY,qBAAwB,CACpC,UAAY,wBAA2B,CACvC,UAAY,qBAAwB,CACpC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,qBAAwB,CACpC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,qBAAwB,CACpC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC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","sources":["webpack://@lordbex/thelounge/./node_modules/normalize.css/normalize.css","webpack://@lordbex/thelounge/./client/css/fontawesome.css","webpack://@lordbex/thelounge/./node_modules/primer-tooltips/build/build.css","webpack://@lordbex/thelounge/./client/css/style.css","webpack://@lordbex/thelounge/./client/components/NetworkForm.vue","webpack://@lordbex/thelounge/./client/components/Settings/Navigation.vue","webpack://@lordbex/thelounge/./client/components/MessageSearchForm.vue","webpack://@lordbex/thelounge/./client/components/Windows/SearchResults.vue","webpack://@lordbex/thelounge/./client/components/Settings/Appearance.vue","webpack://@lordbex/thelounge/./client/components/Session.vue","webpack://@lordbex/thelounge/./client/components/NetworkList.vue","webpack://@lordbex/thelounge/./client/components/ConfirmDialog.vue","webpack://@lordbex/thelounge/./client/components/Mentions.vue"],"sourcesContent":["/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","@font-face {\n\t/* We use free solid icons - https://fontawesome.com/icons?s=solid&m=free */\n\tfont-family: FontAwesome;\n\tfont-weight: normal;\n\tfont-style: normal;\n\tsrc:\n\t\turl(\"../fonts/fa-solid-900.woff2\") format(\"woff2\"),\n\t\turl(\"../fonts/fa-solid-900.woff\") format(\"woff\");\n}\n",".tooltipped{position:relative}.tooltipped::after{position:absolute;z-index:1000000;display:none;padding:.5em .75em;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,\"Segoe UI\",Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\";-webkit-font-smoothing:subpixel-antialiased;color:#fff;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-wrap:break-word;white-space:pre;pointer-events:none;content:attr(aria-label);background:#1b1f23;border-radius:3px;opacity:0}.tooltipped::before{position:absolute;z-index:1000001;display:none;width:0;height:0;color:#1b1f23;pointer-events:none;content:\"\";border:6px solid transparent;opacity:0}@keyframes tooltip-appear{from{opacity:0}to{opacity:1}}.tooltipped:hover::before,.tooltipped:hover::after,.tooltipped:active::before,.tooltipped:active::after,.tooltipped:focus::before,.tooltipped:focus::after{display:inline-block;text-decoration:none;animation-name:tooltip-appear;animation-duration:.1s;animation-fill-mode:forwards;animation-timing-function:ease-in;animation-delay:.4s}.tooltipped-no-delay:hover::before,.tooltipped-no-delay:hover::after,.tooltipped-no-delay:active::before,.tooltipped-no-delay:active::after,.tooltipped-no-delay:focus::before,.tooltipped-no-delay:focus::after{animation-delay:0s}.tooltipped-multiline:hover::after,.tooltipped-multiline:active::after,.tooltipped-multiline:focus::after{display:table-cell}.tooltipped-s::after,.tooltipped-se::after,.tooltipped-sw::after{top:100%;right:50%;margin-top:6px}.tooltipped-s::before,.tooltipped-se::before,.tooltipped-sw::before{top:auto;right:50%;bottom:-7px;margin-right:-6px;border-bottom-color:#1b1f23}.tooltipped-se::after{right:auto;left:50%;margin-left:-16px}.tooltipped-sw::after{margin-right:-16px}.tooltipped-n::after,.tooltipped-ne::after,.tooltipped-nw::after{right:50%;bottom:100%;margin-bottom:6px}.tooltipped-n::before,.tooltipped-ne::before,.tooltipped-nw::before{top:-7px;right:50%;bottom:auto;margin-right:-6px;border-top-color:#1b1f23}.tooltipped-ne::after{right:auto;left:50%;margin-left:-16px}.tooltipped-nw::after{margin-right:-16px}.tooltipped-s::after,.tooltipped-n::after{transform:translateX(50%)}.tooltipped-w::after{right:100%;bottom:50%;margin-right:6px;transform:translateY(50%)}.tooltipped-w::before{top:50%;bottom:50%;left:-7px;margin-top:-6px;border-left-color:#1b1f23}.tooltipped-e::after{bottom:50%;left:100%;margin-left:6px;transform:translateY(50%)}.tooltipped-e::before{top:50%;right:-7px;bottom:50%;margin-top:-6px;border-right-color:#1b1f23}.tooltipped-align-right-1::after,.tooltipped-align-right-2::after{right:0;margin-right:0}.tooltipped-align-right-1::before{right:10px}.tooltipped-align-right-2::before{right:15px}.tooltipped-align-left-1::after,.tooltipped-align-left-2::after{left:0;margin-left:0}.tooltipped-align-left-1::before{left:5px}.tooltipped-align-left-2::before{left:10px}.tooltipped-multiline::after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;word-wrap:break-word;white-space:pre-line;border-collapse:separate}.tooltipped-multiline.tooltipped-s::after,.tooltipped-multiline.tooltipped-n::after{right:auto;left:50%;transform:translateX(-50%)}.tooltipped-multiline.tooltipped-w::after,.tooltipped-multiline.tooltipped-e::after{right:100%}@media screen and (min-width: 0\\0){.tooltipped-multiline::after{width:250px}}.tooltipped-sticky::before,.tooltipped-sticky::after{display:inline-block}.tooltipped-sticky.tooltipped-multiline::after{display:table-cell}\n","@import \"../../node_modules/normalize.css/normalize.css\";\n@import \"fontawesome.css\";\n@import \"../../node_modules/primer-tooltips/build/build.css\";\n\n:root {\n\t/* Main text color */\n\t--body-color: #222;\n\n\t/* Secondary text color, dimmed. Make sure to keep contrast WCAG 2.0 AA compliant on var(--window-bg-color) */\n\t--body-color-muted: #767676;\n\n\t/* Background color of the whole page */\n\t--body-bg-color: #415364;\n\n\t/* Main button color. Applies to border, text, and background on hover */\n\t--button-color: #84ce88;\n\t--button-text-color-hover: #fff;\n\n\t/* Color for sidebar overlay and other things that dim the viewport when something else is on top */\n\t--overlay-bg-color: rgb(0 0 0 / 50%);\n\n\t/* Links and link-looking buttons */\n\t--link-color: #50a656;\n\n\t/* Background color of the main window */\n\t--window-bg-color: #fff;\n\n\t/* Text color for <h2> and <h3> headings in windows */\n\t--window-heading-color: #6c797a;\n\n\t/* Color of the date marker, text and separator */\n\t--date-marker-color: rgb(0 107 59 / 50%);\n\n\t/* Color of the unread message marker, text and separator */\n\t--unread-marker-color: rgb(231 76 60 / 50%);\n\n\t/* Background and left-border color of highlight messages */\n\t--highlight-bg-color: #efe8dc;\n\t--highlight-border-color: #b08c4f;\n\n\t/* Color of the progress bar that appears as a file is being uploaded to the server. Defaults to button color */\n\t--upload-progressbar-color: var(--button-color);\n}\n\n::placeholder {\n\tcolor: rgb(0 0 0 / 35%);\n\topacity: 1; /* fix opacity in Firefox */\n}\n\nhtml {\n\tbox-sizing: border-box;\n\t-webkit-tap-highlight-color: transparent; /* remove tap highlight on touch devices */\n}\n\n*,\n*::before,\n*::after {\n\tbox-sizing: inherit;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n\tfont: inherit;\n\tcolor: inherit;\n}\n\nimg {\n\tvertical-align: middle;\n}\n\n.sr-only {\n\tposition: absolute;\n\twidth: 1px;\n\theight: 1px;\n\tmargin: -1px;\n\tpadding: 0;\n\toverflow: hidden;\n\tclip: rect(0, 0, 0, 0);\n\tborder: 0;\n}\n\nabbr[title] {\n\tcursor: help;\n}\n\nhtml,\nbody {\n\theight: 100%;\n\toverscroll-behavior: none; /* prevent overscroll navigation actions */\n}\n\nbody {\n\tbackground: var(--body-bg-color);\n\tcolor: var(--body-color);\n\tfont: 16px -apple-system, system-ui, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n\tmargin: 0;\n\tuser-select: none;\n\tcursor: default;\n\ttouch-action: none;\n\n\t/**\n\t * Disable pull-to-refresh on mobile that conflicts with scrolling the message list.\n\t * See http://stackoverflow.com/a/29313685/1935861\n\t */\n\toverflow: hidden; /* iOS Safari requires overflow rather than overflow-y */\n}\n\nbody.force-no-select * {\n\tuser-select: none !important;\n}\n\na,\na:hover,\na:focus {\n\tcolor: var(--link-color);\n\ttext-decoration: none;\n}\n\na:hover {\n\ttext-decoration: underline;\n}\n\na:focus {\n\toutline: thin dotted;\n\toutline: 5px auto -webkit-focus-ring-color;\n\toutline-offset: -2px;\n}\n\nh1,\nh2,\nh3 {\n\tfont: inherit;\n\tline-height: inherit;\n\tmargin: 0;\n}\n\nbutton {\n\tborder: none;\n\tbackground: none;\n\tmargin: 0;\n\toutline: none;\n\tpadding: 0;\n\tuser-select: inherit;\n\tcursor: pointer;\n}\n\ncode,\npre,\n#chat .msg[data-type=\"monospace_block\"] .text,\n.irc-monospace,\ntextarea#user-specified-css-input {\n\tfont-family: Consolas, Menlo, Monaco, \"Lucida Console\", \"DejaVu Sans Mono\", \"Courier New\", monospace;\n}\n\ncode,\n.irc-monospace {\n\tfont-size: 13px;\n\tpadding: 2px 4px;\n\tcolor: #e74c3c;\n\tbackground-color: #f9f2f4;\n\tborder-radius: 2px;\n}\n\npre {\n\tdisplay: block;\n\tpadding: 9.5px;\n\tmargin: 0 0 10px;\n\tfont-size: 13px;\n\tline-height: 1.4286;\n\tcolor: #333;\n\tword-break: break-all;\n\tword-wrap: break-word;\n\tbackground-color: #f5f5f5;\n\tborder-radius: 4px;\n}\n\nkbd {\n\tdisplay: inline-block;\n\tfont-family: inherit;\n\tline-height: 1em;\n\tmin-width: 28px; /* Ensure 1-char keys have the same width */\n\tmargin: 0 1px;\n\tpadding: 4px 6px;\n\tcolor: #444;\n\ttext-align: center;\n\ttext-shadow: 0 1px 0 #fff;\n\tbackground-color: white;\n\tbackground-image: linear-gradient(180deg, rgb(0 0 0 / 5%), transparent);\n\tborder: 1px solid #bbb;\n\tborder-radius: 4px;\n\tbox-shadow: 0 2px 0 #bbb, inset 0 1px 1px #fff, inset 0 -1px 3px #ccc;\n}\n\np {\n\tmargin: 0 0 10px;\n}\n\n.btn {\n\tborder: 2px solid var(--button-color);\n\tborder-radius: 3px;\n\tcolor: var(--button-color);\n\tdisplay: inline-block;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tletter-spacing: 1px;\n\tmargin-bottom: 10px;\n\tpadding: 9px 17px;\n\ttext-transform: uppercase;\n\ttransition: background 0.2s, border-color 0.2s, color 0.2s, box-shadow 0.2s;\n\tword-spacing: 3px;\n\tcursor: pointer; /* This is useful for `<button>` elements */\n}\n\n.btn-small {\n\tpadding: 5px 13px;\n}\n\n.btn:disabled,\n.btn:hover,\n.btn:focus {\n\tbackground: var(--button-color);\n\tcolor: var(--button-text-color-hover);\n\topacity: 1;\n}\n\n.input:focus,\n.btn:active,\n.btn:focus {\n\toutline: 0;\n\tbox-shadow: 0 0 0 3px rgb(132 206 136 / 50%);\n}\n\n.btn:active {\n\topacity: 0.8;\n}\n\n.btn:disabled {\n\topacity: 0.6;\n}\n\n.btn-sm {\n\tpadding: 4px 8px;\n\tborder-width: 1px;\n\tletter-spacing: 0;\n\tword-spacing: 0;\n\ttext-transform: none;\n}\n\n.container {\n\tpadding: 0 15px;\n\tmargin-bottom: 20px;\n\twidth: 480px;\n\talign-self: center;\n\ttouch-action: pan-y;\n}\n\n#js-copy-hack,\n#loading pre,\n#help .container,\n#changelog .container,\n.header .title,\n.header .topic,\n#chat .messages {\n\tuser-select: text;\n\tcursor: text;\n}\n\n#js-copy-hack {\n\tposition: absolute;\n\tleft: -999999px;\n}\n\n#chat #js-copy-hack .msg[data-type=\"condensed\"]:not(.closed) .msg,\n#chat #js-copy-hack > .msg {\n\tdisplay: block;\n}\n\n.only-copy {\n\tfont-size: 0;\n\topacity: 0;\n\twidth: 0.01px; /* Must be non-zero to be the first selected character on Firefox */\n\tdisplay: inline-block;\n}\n\n/* Icons */\n\n#viewport .lt::before,\n#viewport .rt::before,\n#chat button.mentions::before,\n#chat button.close::before,\n#chat button.menu::before,\n#chat button.search::before,\n.channel-list-item::before,\n#footer .icon,\n#chat .count::before,\n#connect .extra-help,\n#settings .extra-help,\n#settings #play::before,\n#settings .settings-menu .icon::before,\n#form #upload::before,\n#form #submit::before,\n#chat .msg[data-type=\"away\"] .from::before,\n#chat .msg[data-type=\"back\"] .from::before,\n#chat .msg[data-type=\"invite\"] .from::before,\n#chat .msg[data-type=\"join\"] .from::before,\n#chat .msg[data-type=\"kick\"] .from::before,\n#chat .msg[data-type=\"login\"] .from::before,\n#chat .msg[data-type=\"logout\"] .from::before,\n#chat .msg[data-type=\"part\"] .from::before,\n#chat .msg[data-type=\"quit\"] .from::before,\n#chat .msg[data-type=\"topic\"] .from::before,\n#chat .msg[data-type=\"mode_channel\"] .from::before,\n#chat .msg[data-type=\"mode_user\"] .from::before,\n#chat .msg[data-type=\"mode\"] .from::before,\n#chat .msg[data-command=\"motd\"] .from::before,\n#chat .msg[data-command=\"help\"] .from::before,\n#chat .msg[data-command=\"info\"] .from::before,\n#chat .msg[data-type=\"ctcp\"] .from::before,\n#chat .msg[data-type=\"ctcp_request\"] .from::before,\n#chat .msg[data-type=\"whois\"] .from::before,\n#chat .msg[data-type=\"nick\"] .from::before,\n#chat .msg[data-type=\"action\"] .from::before,\n#chat .msg[data-type=\"plugin\"] .from::before,\n#chat .msg[data-type=\"raw\"] .from::before,\n#chat .msg-statusmsg span::before,\n#chat .msg-shown-in-active span::before,\n#chat .toggle-button::after,\n#chat .toggle-content .more-caret::before,\n#chat .scroll-down-arrow::after,\n#chat .topic-container .save-topic span::before,\n#version-checker::before,\n.context-menu-item::before,\n#help .website-link::before,\n#help .documentation-link::before,\n#help .report-issue-link::before,\n#image-viewer .previous-image-btn::before,\n#image-viewer .next-image-btn::before,\n#image-viewer .open-btn::before,\n.channel-list-item .not-secure-icon::before,\n.channel-list-item .not-connected-icon::before,\n.channel-list-item .parted-channel-icon::before,\n.jump-to-input::before,\n.password-container .reveal-password span,\n#sidebar .collapse-network-icon::before {\n\tfont: normal normal normal 14px/1 FontAwesome;\n\tfont-size: inherit; /* Can't have font-size inherit on line above, so need to override */\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n#viewport .lt::before { content: \"\\f0c9\"; /* http://fontawesome.io/icon/bars/ */ }\n#viewport .rt::before { content: \"\\f0c0\"; /* https://fontawesome.com/icons/users?style=solid */ }\n#chat button.menu::before { content: \"\\f142\"; /* http://fontawesome.io/icon/ellipsis-v/ */ }\n#chat button.mentions::before { content: \"\\f1fa\"; /* https://fontawesome.com/icons/at?style=solid */ }\n#chat button.search::before { content: \"\\f002\"; /* https://fontawesome.com/icons/search?style=solid */ }\n#chat button.close::before { content: \"\\f00d\"; /* https://fontawesome.com/icons/times?style=solid */ }\n\n.context-menu-join::before { content: \"\\f067\"; /* http://fontawesome.io/icon/plus/ */ }\n.context-menu-user::before { content: \"\\f007\"; /* http://fontawesome.io/icon/user/ */ }\n.context-menu-close::before { content: \"\\f00d\"; /* http://fontawesome.io/icon/times/ */ }\n.context-menu-list::before { content: \"\\f03a\"; /* http://fontawesome.io/icon/list/ */ }\n.context-menu-disconnect::before { content: \"\\f127\"; /* https://fontawesome.com/icons/unlink?style=solid */ }\n.context-menu-connect::before { content: \"\\f0c1\"; /* https://fontawesome.com/icons/link?style=solid */ }\n.context-menu-action-whois::before { content: \"\\f05a\"; /* http://fontawesome.io/icon/info-circle/ */ }\n.context-menu-action-ignore::before { content: \"\\f506\"; /* https://fontawesome.com/icons/user-slash?style=solid */ }\n.context-menu-action-kick::before { content: \"\\f05e\"; /* http://fontawesome.io/icon/ban/ */ }\n.context-menu-action-set-mode::before { content: \"\\f067\"; /* http://fontawesome.io/icon/plus/ */ }\n.context-menu-action-revoke-mode::before { content: \"\\f068\"; /* http://fontawesome.io/icon/minus/ */ }\n.context-menu-network::before { content: \"\\f233\"; /* https://fontawesome.com/icons/server?style=solid */ }\n.context-menu-edit::before { content: \"\\f303\"; /* https://fontawesome.com/icons/pencil-alt?style=solid */ }\n.context-menu-clear-history::before { content: \"\\f1f8\"; /* https://fontawesome.com/icons/trash?style=solid */ }\n.context-menu-mute::before { content: \"\\f6a9\"; /* https://fontawesome.com/v5.15/icons/volume-mute?style=solid */ }\n\n.channel-list-item .not-secure-icon::before {\n\tcontent: \"\\f071\"; /* https://fontawesome.com/icons/exclamation-triangle?style=solid */\n}\n\n.channel-list-item .not-connected-icon::before,\n.channel-list-item .parted-channel-icon::before {\n\tcontent: \"\\f127\"; /* https://fontawesome.com/icons/unlink?style=solid */\n}\n\n.context-menu-query::before,\n.context-menu-action-query::before,\n.channel-list-item[data-type=\"query\"]::before {\n\tcontent: \"\\f075\"; /* https://fontawesome.com/icons/comment?style=solid */\n}\n\n.context-menu-chan::before,\n.channel-list-item[data-type=\"channel\"]::before { content: \"\\f086\"; /* http://fontawesome.io/icon/comments/ */ }\n\n.channel-list-item[data-type=\"special\"]::before { content: \"\\f03a\"; /* http://fontawesome.io/icon/list/ */ }\n\n.channel-list-item.has-draft:not(.active):not([data-type=\"lobby\"])::before {\n\tcontent: \"\\f304\"; /* https://fontawesome.com/icons/pen?style=solid */\n}\n\n#footer .connect::before { content: \"\\f067\"; /* http://fontawesome.io/icon/plus/ */ }\n\n#footer .settings::before { content: \"\\f013\"; /* http://fontawesome.io/icon/cog/ */ }\n\n#footer .help::before { content: \"\\f059\"; /* http://fontawesome.io/icon/question/ */ }\n\n#form #upload::before { content: \"\\f0c6\"; /* https://fontawesome.com/icons/paperclip?style=solid */ }\n#form #submit::before { content: \"\\f1d8\"; /* http://fontawesome.io/icon/paper-plane/ */ }\n\n#chat .msg[data-type=\"away\"] .from::before,\n#chat .msg[data-type=\"back\"] .from::before {\n\tcontent: \"\\f017\"; /* https://fontawesome.com/icons/clock?style=solid */\n\tcolor: #7f8c8d;\n}\n\n#help .website-link::before,\n#help .documentation-link::before,\n#help .report-issue-link::before {\n\tdisplay: inline-block;\n\tmargin-right: 5px;\n\n\t/* These 2 directives are loosely taken from .fa-fw */\n\twidth: 1.35em;\n\ttext-align: center;\n}\n\n#help .website-link::before { content: \"\\f0ac\"; /* http://fontawesome.io/icon/globe/ */ }\n#help .documentation-link::before { content: \"\\f19d\"; /* http://fontawesome.io/icon/graduation-cap/ */ }\n#help .report-issue-link::before { content: \"\\f188\"; /* http://fontawesome.io/icon/bug/ */ }\n\n#chat .msg[data-type=\"invite\"] .from::before {\n\tcontent: \"\\f0e0\"; /* https://fontawesome.com/icons/envelope?style=solid */\n\tcolor: #2ecc40;\n}\n\n#chat .msg[data-type=\"login\"] .from::before {\n\tcontent: \"\\f007\"; /* https://fontawesome.com/icons/user?style=solid */\n\tcolor: #2ecc40;\n}\n\n#chat .msg[data-type=\"logout\"] .from::before {\n\tcontent: \"\\f007\"; /* https://fontawesome.com/icons/user?style=solid */\n\tcolor: #ff4136;\n}\n\n#chat .msg[data-type=\"part\"] .from::before,\n#chat .msg[data-type=\"quit\"] .from::before {\n\tcontent: \"\\f2f5\"; /* https://fontawesome.com/icons/sign-out-alt?style=solid */\n\tcolor: #ff4136;\n\tdisplay: inline-block;\n\ttransform: rotate(180deg);\n}\n\n#chat .msg[data-type=\"topic\"] .from::before {\n\tcontent: \"\\f0a1\"; /* http://fontawesome.io/icon/bullhorn/ */\n\tcolor: #2ecc40;\n}\n\n#chat .msg[data-type=\"mode_channel\"] .from::before,\n#chat .msg[data-type=\"mode_user\"] .from::before,\n#chat .msg[data-type=\"mode\"] .from::before {\n\tcontent: \"\\f05a\"; /* http://fontawesome.io/icon/info-circle/ */\n\tcolor: #2ecc40;\n}\n\n#chat .msg[data-command=\"motd\"] .from::before {\n\tcontent: \"\\f02e\"; /* https://fontawesome.com/icons/bookmark?style=solid */\n\tcolor: var(--body-color-muted);\n}\n\n#chat .msg[data-command=\"help\"] .from::before {\n\tcontent: \"\\f059\"; /* https://fontawesome.com/icons/question-circle?style=solid */\n\tcolor: var(--body-color-muted);\n}\n\n#chat .msg[data-command=\"info\"] .from::before {\n\tcontent: \"\\f05a\"; /* https://fontawesome.com/icons/info-circle?style=solid */\n\tcolor: var(--body-color-muted);\n}\n\n#chat .msg[data-type=\"ctcp\"] .from::before,\n#chat .msg[data-type=\"ctcp_request\"] .from::before {\n\tcontent: \"\\f15c\"; /* https://fontawesome.com/icons/file-alt?style=solid */\n\tcolor: var(--body-color-muted);\n}\n\n#chat .msg[data-type=\"whois\"] .from::before {\n\tcontent: \"\\f007\"; /* http://fontawesome.io/icon/user/ */\n\tcolor: #2ecc40;\n}\n\n#chat .msg[data-type=\"nick\"] .from::before {\n\tcontent: \"\\f007\"; /* http://fontawesome.io/icon/user/ */\n\tcolor: #2ecc40;\n}\n\n#chat .msg[data-type=\"join\"] .from::before {\n\tcontent: \"\\f2f6\"; /* https://fontawesome.com/icons/sign-in-alt?style=solid */\n\tcolor: #2ecc40;\n}\n\n#chat .msg[data-type=\"kick\"] .from::before {\n\tcontent: \"\\f05e\"; /* http://fontawesome.io/icon/ban/ */\n\tcolor: #ff4136;\n}\n\n#chat .msg[data-type=\"raw\"] .from::before {\n\tcontent: \"\\f101\"; /* https://fontawesome.com/icons/angle-double-right?style=solid */\n}\n\n#chat .msg.self[data-type=\"raw\"] .from::before {\n\tcontent: \"\\f359\"; /* https://fontawesome.com/icons/arrow-alt-circle-left?style=solid */\n\tcolor: #2ecc40;\n}\n\n#chat .msg[data-type=\"action\"] .from::before {\n\tcontent: \"\\f005\"; /* http://fontawesome.io/icon/star/ */\n}\n\n#chat .msg[data-type=\"plugin\"] .from::before {\n\tcontent: \"\\f1e6\"; /* http://fontawesome.io/icon/plug/ */\n\ttransform: rotate(45deg);\n\tdisplay: inline-block;\n\tpadding: 1px;\n}\n\n#chat .msg-statusmsg,\n#chat .msg-shown-in-active {\n\tcursor: help;\n\tmargin-right: 5px;\n}\n\n#chat .msg-statusmsg span::before,\n#chat .msg-shown-in-active span::before {\n\tfont-size: 10px;\n\tcontent: \"\\f06e\"; /* https://fontawesome.com/icons/eye?style=solid */\n}\n\n#chat .msg-statusmsg {\n\tborder-radius: 2px;\n\tpadding: 2px 4px;\n\tbackground-color: #ff9e18;\n\tcolor: #222;\n}\n\n#chat .toggle-button {\n\tdisplay: inline-block;\n\ttransition: opacity 0.2s, transform 0.2s;\n\n\t/* These 2 directives are loosely taken from .fa-fw */\n\twidth: 1.35em;\n\ttext-align: center;\n}\n\n#chat .toggle-button::after {\n\tcontent: \"\\f0da\"; /* http://fontawesome.io/icon/caret-right/ */\n}\n\n#chat .count::before {\n\tcolor: #cfcfcf;\n\tcontent: \"\\f002\"; /* http://fontawesome.io/icon/search/ */\n\tposition: absolute;\n\tright: 13px;\n\tline-height: 45px;\n}\n\n#connect .extra-help::before,\n#settings .extra-help::before {\n\tcontent: \"\\f059\"; /* http://fontawesome.io/icon/question-circle/ */\n}\n\n#settings #play::before {\n\tcontent: \"\\f028\"; /* http://fontawesome.io/icon/volume-up/ */\n\tmargin-right: 9px;\n}\n\n#image-viewer .previous-image-btn::before {\n\tcontent: \"\\f104\"; /* http://fontawesome.io/icon/angle-left/ */\n}\n\n#image-viewer .next-image-btn::before {\n\tcontent: \"\\f105\"; /* http://fontawesome.io/icon/angle-right/ */\n}\n\n#image-viewer .open-btn::before {\n\tcontent: \"\\f35d\"; /* https://fontawesome.com/icons/external-link-alt?style=solid */\n}\n\n/* End icons */\n\n#app {\n\theight: 100%;\n\twidth: 100%;\n}\n\n#viewport {\n\tdisplay: flex;\n\theight: 100%;\n}\n\n#form button,\n.header button,\n.reveal-password span {\n\ttransition: opacity 0.2s;\n}\n\n#form button:hover,\n.header button:hover,\n.reveal-password span:hover {\n\topacity: 0.6;\n}\n\n#viewport .lt,\n#viewport .rt,\n#chat button.mentions,\n#chat button.search,\n#chat button.menu,\n#chat button.close {\n\tcolor: #607992;\n\tdisplay: flex;\n\tfont-size: 14px;\n\tline-height: 1;\n\theight: 36px;\n\twidth: 36px;\n\tflex-shrink: 0;\n}\n\n#viewport .lt::before,\n#viewport .rt::before,\n#chat button.mentions::before,\n#chat button.search::before,\n#chat button.menu::before,\n#chat button.close::before {\n\twidth: 36px;\n\tline-height: 36px; /* Fix alignment in Microsoft Edge */\n}\n\n/* Channel list button stays fixed when scrolling... */\n#viewport .lt {\n\tposition: fixed;\n}\n\n/* ... Except on chat windows, relative to include the notification dot */\n#viewport #chat .lt {\n\tposition: relative;\n}\n\n/* Notification dot on the top right corner of the menu icon */\n#viewport .lt::after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 9px;\n\tright: 7px;\n\tbackground-color: #e74c3c;\n\twidth: 10px;\n\theight: 10px;\n\tborder-radius: 50%;\n\tborder: 2px solid var(--window-bg-color);\n\topacity: 0;\n\ttransition: opacity 0.2s;\n\tbackground-clip: padding-box; /* Fix border-radius bleeding color */\n}\n\n#viewport.notified .lt::after {\n\topacity: 1;\n}\n\n#viewport.userlist-open #chat .userlist {\n\tdisplay: flex;\n}\n\n#sidebar {\n\tdisplay: none;\n\tflex-direction: column;\n\twidth: 220px;\n\tmax-height: 100%;\n\twill-change: transform;\n\tcolor: #b7c5d1; /* same as .channel-list-item color */\n}\n\n#viewport.menu-open #sidebar {\n\tdisplay: flex;\n}\n\n#sidebar .scrollable-area {\n\toverflow-x: auto;\n\tflex-grow: 1;\n\ttouch-action: pan-y;\n\tscrollbar-width: thin;\n\toverscroll-behavior: contain;\n\t-webkit-overflow-scrolling: touch;\n}\n\n#sidebar .logo-container {\n\ttext-align: center;\n}\n\n#sidebar .logo,\n#sidebar .logo-inverted {\n\theight: 45px;\n}\n\n#sidebar .logo {\n\tdisplay: none;\n}\n\n.channel-list-item,\n#sidebar .empty {\n\tfont-size: 14px;\n}\n\n.channel-list-item {\n\tdisplay: flex;\n\tpadding: 8px 14px;\n\tposition: relative;\n\tcursor: pointer;\n}\n\n/* Channels/queries must be white on hover and active */\n#footer button:hover,\n#footer button.active,\n.channel-list-item:hover,\n.channel-list-item.active {\n\tcolor: #fff;\n}\n\n/* All lobbies/channels/queries and footer buttons must have a half-transparent\nbackground on hover (unless active) */\n.channel-list-item:hover,\n#footer button:hover {\n\tbackground-color: rgb(48 62 74 / 50%); /* #303e4a x 50% alpha */\n}\n\n/* Darker background and default cursor for active channels */\n#footer button.active,\n.channel-list-item.active {\n\tbackground-color: #303e4a;\n\tcursor: default;\n}\n\n/* Remove background on hovered/active channel when sorting/drag-and-dropping */\n.ui-sortable-ghost,\n.ui-sortable-dragging .channel-list-item,\n.ui-sortable-dragging,\n.ui-sortable-dragging:hover,\n.ui-sortable-dragging.active,\n.ui-sortable-dragging-touch-cue .channel-list-item,\n.ui-sortable-dragging-touch-cue,\n.ui-sortable-dragging-touch-cue:hover,\n.ui-sortable-dragging-touch-cue.active {\n\tbackground: transparent;\n}\n\n.ui-sortable-ghost::after,\n.ui-sortable-dragging-touch-cue:not(.ui-sortable-dragging)::after {\n\tbackground: var(--body-bg-color);\n\tborder: 1px dashed #99a2b4;\n\tborder-radius: 6px;\n\tcontent: \" \";\n\tdisplay: block;\n\tposition: absolute;\n\tleft: 10px;\n\ttop: 0;\n\tbottom: 0;\n\tright: 10px;\n}\n\n.ui-sortable-dragging-touch-cue:not(.ui-sortable-ghost)::after {\n\tbackground: transparent;\n}\n\n#sidebar .network {\n\tposition: relative;\n\tmargin-bottom: 20px;\n\ttouch-action: pan-y;\n}\n\n#sidebar .empty {\n\tflex-grow: 1;\n\tline-height: 1.6;\n\tpadding: 40px 20px;\n\ttext-align: center;\n}\n\n.channel-list-item[data-type=\"lobby\"] {\n\tcolor: #84ce88;\n\tfont-size: 15px;\n\tfont-weight: bold;\n\tpadding-left: 0;\n}\n\n.channel-list-item .lobby-wrap {\n\tdisplay: flex;\n\tflex-grow: 1;\n\toverflow: hidden;\n}\n\n.channel-list-item[data-type=\"lobby\"]:hover,\n.channel-list-item[data-type=\"lobby\"].active {\n\tcolor: #c0f8c3;\n}\n\n.channel-list-item .not-connected-tooltip,\n.channel-list-item .not-secure-tooltip,\n.channel-list-item .parted-channel-tooltip {\n\tmargin: 0 8px;\n}\n\n.channel-list-item.not-secure {\n\tcolor: #f39c12;\n}\n\n.channel-list-item.not-secure:hover,\n.channel-list-item.not-secure.active {\n\tcolor: #f8c572;\n}\n\n.channel-list-item.not-connected,\n.channel-list-item.parted-channel {\n\tcolor: #e74c3c;\n}\n\n.channel-list-item.not-connected:hover,\n.channel-list-item.not-connected.active,\n.channel-list-item.parted-channel:hover,\n.channel-list-item.parted-channel.active {\n\tcolor: #f1978e;\n}\n\n.channel-list-item.is-muted {\n\topacity: 0.5;\n}\n\n.channel-list-item::before {\n\twidth: 14px;\n\tmargin-right: 12px;\n\tline-height: 18px;\n}\n\n.channel-list-item .name {\n\tposition: relative;\n\tflex-grow: 1;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tmargin-right: 5px;\n}\n\n.header .topic,\n.channel-list-item .name {\n\tmask-image: linear-gradient(to left, transparent, black 20px);\n}\n\n.channel-list-item .badge,\n#sidebar .add-channel-tooltip,\n.channel-list-item .close-tooltip {\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.channel-list-item .badge {\n\tbackground: rgb(255 255 255 / 6%);\n\tborder-radius: 3px;\n\tcolor: #afb6c0;\n\tfont-size: 10px;\n\tpadding: 4px 6px;\n\ttransition: background-color 0.2s, color 0.2s;\n}\n\n.channel-list-item .badge:empty {\n\tdisplay: none;\n}\n\n.channel-list-item .badge.highlight {\n\tbackground: #fff;\n\tcolor: #49505a;\n}\n\n.channel-list-item .close {\n\twidth: 18px;\n\theight: 18px;\n\tdisplay: none;\n\ttransition: opacity 0.2s, background-color 0.2s;\n}\n\n.channel-list-item .close::before {\n\tfont-size: 20px;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tline-height: 16px;\n\ttext-align: center;\n\tcontent: \"×\";\n\tcolor: #fff;\n}\n\n.channel-list-item.active .close {\n\topacity: 0.4;\n\tdisplay: unset;\n}\n\n.channel-list-item.active .close:hover {\n\topacity: 1;\n}\n\n.channel-list-item[data-type=\"lobby\"] .add-channel {\n\tborder-radius: 3px;\n\twidth: 18px;\n\theight: 18px;\n\topacity: 0.4;\n\ttransition: opacity 0.2s, background-color 0.2s, transform 0.2s;\n}\n\n.channel-list-item[data-type=\"lobby\"] .add-channel::before {\n\tfont-size: 20px;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tline-height: 16px;\n\ttext-align: center;\n\tcontent: \"+\";\n\tcolor: #fff;\n}\n\n.channel-list-item[data-type=\"lobby\"] .add-channel:hover {\n\topacity: 1;\n}\n\n.channel-list-item[data-type=\"lobby\"] .add-channel.opened {\n\t/* translateZ(0) enables hardware acceleration, this is to avoid jittering when animating */\n\ttransform: rotate(45deg) translateZ(0);\n}\n\n#sidebar .network .collapse-network {\n\twidth: 40px;\n\topacity: 0.4;\n\tpadding-left: 11px;\n\ttransition: opacity 0.2s;\n\tflex-shrink: 0;\n}\n\n#sidebar .network .collapse-network-icon {\n\tdisplay: block;\n\twidth: 20px;\n\theight: 20px;\n\ttransition: transform 0.2s;\n}\n\n#sidebar .network.collapsed .collapse-network-icon {\n\ttransform: rotate(-90deg);\n}\n\n#sidebar .network .collapse-network-icon::before {\n\tcontent: \"\\f0d7\"; /* http://fontawesome.io/icon/caret-down/ */\n\tcolor: #fff;\n}\n\n#sidebar .collapse-network:hover {\n\topacity: 1;\n}\n\n#footer {\n\theight: 45px;\n\tfont-size: 14px;\n\tflex-shrink: 0;\n\tdisplay: flex;\n\tjustify-content: center;\n}\n\n#footer button {\n\tcolor: #b7c5d1;\n\tdisplay: inline-block;\n\twidth: 45px;\n\theight: 100%;\n\tborder-radius: 5px;\n}\n\n#footer .help.notified::after {\n\tcontent: \"\\f021\";\n\tposition: absolute;\n\tbottom: 10px;\n\tright: 7px;\n\tpadding: 2px;\n\tfont-size: 10px;\n\tborder-radius: 50%;\n\tcolor: var(--link-color);\n\tbackground: var(--body-bg-color);\n}\n\n.window li,\n.window p,\n.window label,\n#settings .error {\n\tfont-size: 14px;\n}\n\n.input {\n\tbackground-color: white;\n\tborder: 1px solid #cdd3da;\n\tborder-radius: 2px;\n\tcolor: #222;\n\tfont-size: 14px;\n\tmargin: 2px 0;\n\tmargin-bottom: 10px;\n\tpadding: 0 10px;\n\ttransition: border-color 0.2s, box-shadow 0.2s;\n\twidth: 100%;\n\theight: 35px;\n\tline-height: 35px;\n}\n\n.input:disabled {\n\tbackground-color: #ddd;\n}\n\n.input:not(:disabled):hover,\n.input:not(:disabled):focus {\n\tborder-color: #84ce88;\n}\n\ntextarea.input {\n\tresize: vertical;\n\tmin-height: 35px;\n\tpadding: 6px 10px;\n\tline-height: 1.5;\n}\n\n.window {\n\tbackground: var(--window-bg-color);\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex: 1 1 auto;\n\tposition: relative;\n\toverflow-y: auto;\n\theight: 100%;\n\tscrollbar-width: thin;\n\toverscroll-behavior: contain;\n\t-webkit-overflow-scrolling: touch;\n}\n\n#loading,\n#chat .chat-view {\n\t/* flexbox does not seem to scroll without doing this */\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\ttop: 0;\n}\n\n.window h1 {\n\tfont-size: 36px;\n}\n\n.window h2 {\n\tborder-bottom: 1px solid currentcolor;\n\tcolor: var(--window-heading-color);\n\tfont-size: 22px;\n\tmargin: 30px 0 10px;\n\tpadding-bottom: 7px;\n}\n\n.window h2 small {\n\tfont-size: 16px;\n\tline-height: 30px;\n}\n\n.window h3 {\n\tcolor: var(--window-heading-color);\n\tfont-size: 18px;\n\tmargin: 20px 0 10px;\n}\n\n.header {\n\talign-items: center;\n\tline-height: 45px;\n\theight: 45px;\n\tpadding: 0 6px;\n\tdisplay: flex;\n\tflex-shrink: 0;\n\toverflow: hidden;\n}\n\n#chat .header {\n\tborder-bottom: 1px solid #e7e7e7;\n}\n\n.header .title {\n\tfont-size: 15px;\n\tpadding-left: 6px;\n\tflex-shrink: 1;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.topic-container {\n\tposition: relative;\n\tflex-grow: 1;\n\tpadding-left: 10px;\n}\n\n.header .topic {\n\tcolor: var(--body-color-muted);\n\tmargin-left: 8px;\n\tword-break: break-all;\n\tflex-grow: 1;\n\toverflow: hidden;\n\tfont-size: 14px;\n\tflex-shrink: 99999999;\n\tmin-width: 25px;\n}\n\n.header .topic.empty {\n\tmin-width: 0;\n}\n\n.header .topic-input {\n\tcolor: inherit;\n\tbackground: transparent;\n\tborder: 1px solid #cdd3da;\n\tborder-radius: 2px;\n\tpadding-right: 37px;\n\tpadding-left: 10px;\n\twidth: 100%;\n\theight: 35px;\n\toverflow: hidden;\n\tfont-size: 14px;\n\tline-height: normal;\n\toutline: none;\n}\n\n.topic-container .save-topic {\n\tposition: absolute;\n\ttop: 6px;\n\tright: 0;\n}\n\n.topic-container .save-topic span {\n\tfont-size: 16px;\n\tcolor: #607992;\n\twidth: 35px;\n\theight: 35px;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tcursor: pointer;\n\tappearance: none;\n}\n\n.topic-container .save-topic span:hover {\n\topacity: 0.6;\n}\n\n#chat {\n\toverflow: hidden;\n\tflex: 1 0 auto;\n\tposition: relative;\n}\n\n#chat .chat-view {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n#chat .msg[data-type=\"condensed\"] {\n\tflex-wrap: wrap;\n}\n\n#chat .msg[data-type=\"condensed\"] .content {\n\tflex: 1;\n}\n\n/* Ensures expanded status messages always take up the full width */\n#chat .msg[data-type=\"condensed\"] .msg {\n\tflex-basis: 100%;\n}\n\n#chat .condensed-summary .content {\n\tdisplay: block;\n\tcursor: pointer;\n\tuser-select: none;\n}\n\n#chat .condensed-summary {\n\tdisplay: flex;\n}\n\n#chat .condensed-summary .content:hover {\n\ttext-decoration: underline;\n}\n\n#chat .msg.closed[data-type=\"condensed\"] .msg {\n\tdisplay: none;\n}\n\n#chat .condensed-summary .time {\n\tvisibility: hidden;\n}\n\n#form,\n.messages .msg,\n.userlist {\n\tfont-size: 14px;\n\tline-height: 1.4;\n}\n\n#chat .chat-content {\n\tdisplay: flex;\n\tflex-direction: row-reverse;\n\tflex-grow: 1;\n\toverflow: hidden;\n\tposition: relative;\n}\n\n#chat .chat {\n\toverflow: auto;\n\toverflow-x: hidden;\n\tdisplay: flex;\n\tflex-grow: 1;\n\tflex-direction: column;\n\tscrollbar-width: thin;\n\toverscroll-behavior: contain;\n\t-webkit-overflow-scrolling: touch;\n\toutline: none;\n}\n\n#chat .userlist {\n\tborder-left: 1px solid #e7e7e7;\n\twidth: 180px;\n\tdisplay: none;\n\tflex-direction: column;\n\tflex-shrink: 0;\n\ttouch-action: pan-y;\n}\n\n/**\n * Toggled via JavaScript\n */\n#sidebar .join-form {\n\tpadding: 0 18px 8px;\n}\n\n#sidebar .join-form .input {\n\tdisplay: block;\n\tmargin: 5px auto;\n}\n\n#sidebar .join-form .btn {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin: auto;\n}\n\n#chat .show-more {\n\tpadding: 10px;\n\tpadding-top: 15px;\n\tpadding-bottom: 0;\n\twidth: 100%;\n}\n\n#chat .show-more .btn {\n\twidth: 100%;\n\tmargin: 0;\n}\n\n.scroll-down {\n\tposition: absolute;\n\tbottom: 16px;\n\tright: 16px;\n\tz-index: 2;\n\tpointer-events: none;\n\topacity: 0;\n\ttransform: translateY(16px);\n\ttransition: transform 0.2s, opacity 0.2s;\n\tcursor: pointer;\n}\n\n.scroll-down-shown {\n\topacity: 1;\n\ttransform: none;\n\tpointer-events: auto;\n}\n\n.scroll-down-arrow {\n\twidth: 36px;\n\theight: 36px;\n\tline-height: 34px;\n\tborder-radius: 50%;\n\tbackground: var(--window-bg-color);\n\tcolor: var(--button-color);\n\tborder: 2px solid var(--button-color);\n\ttext-align: center;\n\ttransition: background 0.2s, color 0.2s;\n\tbox-shadow: 0 6px 10px 0 rgb(0 0 0 / 15%);\n}\n\n.scroll-down:hover .scroll-down-arrow {\n\tbackground: var(--button-color);\n\tcolor: var(--button-text-color-hover);\n}\n\n.scroll-down-arrow::after {\n\tcontent: \"\\f107\"; /* https://fontawesome.com/icons/angle-down?style=solid */\n}\n\n.userlist-open .chat-view[data-type=\"channel\"] .scroll-down {\n\tright: 196px;\n}\n\n#chat .messages {\n\tpadding: 10px 0;\n\ttouch-action: pan-y;\n}\n\n#chat .chat-view:not([data-type=\"special\"]) .messages {\n\tmargin-top: auto;\n}\n\n#chat .msg {\n\tword-wrap: break-word;\n\tword-break: break-word; /* Webkit-specific */\n\tdisplay: flex;\n\talign-items: flex-start;\n\tposition: relative;\n}\n\n#chat .unread-marker {\n\tposition: relative;\n\ttext-align: center;\n\tmargin: 0 10px;\n\tz-index: 0;\n\tfont-weight: bold;\n\tfont-size: 12px;\n}\n\n#chat .unread-marker::before {\n\tposition: absolute;\n\tz-index: -1;\n\tcontent: \"\";\n\tleft: 0;\n\tright: 0;\n\ttop: 50%;\n\tborder-top: 1px solid var(--unread-marker-color);\n}\n\n#chat .unread-marker-text::before {\n\tcontent: \"New messages\";\n\tbackground-color: var(--window-bg-color);\n\tcolor: var(--unread-marker-color);\n\tpadding: 0 10px;\n}\n\n#chat .date-marker {\n\tposition: relative;\n\ttext-align: center;\n\tmargin: 0 10px;\n\tz-index: 0;\n\tfont-weight: bold;\n\tfont-size: 12px;\n}\n\n#chat .date-marker::before {\n\tposition: absolute;\n\tz-index: -1;\n\tcontent: \"\";\n\tleft: 0;\n\tright: 0;\n\ttop: 50%;\n\tborder-top: 1px solid var(--date-marker-color);\n}\n\n#chat .date-marker-text::before {\n\tcontent: attr(aria-label);\n\tbackground-color: var(--window-bg-color);\n\tcolor: var(--date-marker-color);\n\tpadding: 0 10px;\n}\n\n#chat .time,\n#chat .from,\n#chat .content {\n\tpadding: 3px 0;\n\tflex: 0 0 auto;\n}\n\n#chat .time {\n\tcolor: var(--body-color-muted);\n\tpadding-left: 10px;\n\twidth: 55px;\n\tfont-variant-numeric: tabular-nums;\n\tbox-sizing: content-box; /* highlights have a border-left */\n}\n\n#chat.time-12h .time,\n#chat.time-seconds .time {\n\twidth: 75px;\n}\n\n#chat.time-seconds.time-12h .time {\n\twidth: 90px;\n}\n\n#chat .from {\n\tpadding-right: 10px;\n\ttext-align: right;\n\twidth: 134px;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tposition: relative;\n}\n\n#chat .content {\n\tflex: 1 1 auto;\n\tmin-width: 0;\n\tpadding-left: 10px;\n\tpadding-right: 6px;\n\tborder-left: 1px solid #f6f6f6;\n\toverflow: hidden; /* Prevents Zalgo text to expand beyond messages */\n\ttext-align: left; /* so RTL text will still be aligned left, not right */\n}\n\n#chat .msg[data-type=\"unhandled\"] .from {\n\tcolor: var(--body-color-muted);\n}\n\n#chat .chat-view[data-type=\"special\"] table th {\n\tword-break: normal;\n}\n\n/* Parsed nicks and channels */\n\n#chat .user,\n.inline-channel {\n\tcursor: pointer;\n}\n\n.chat .user:hover,\n.inline-channel:hover {\n\ttext-decoration: underline;\n}\n\n/* Nicknames */\n\n.user {\n\tcolor: #50a656;\n}\n\n.user.color-1 { color: #107ead; }\n.user.color-2 { color: #a86500; }\n.user.color-3 { color: #008a3c; }\n.user.color-4 { color: #e00096; }\n.user.color-5 { color: #f0000c; }\n.user.color-6 { color: #000094; }\n.user.color-7 { color: #006441; }\n.user.color-8 { color: #00566e; }\n.user.color-9 { color: #e6006b; }\n.user.color-10 { color: #0d8766; }\n.user.color-11 { color: #006b3b; }\n.user.color-12 { color: #00857e; }\n.user.color-13 { color: #00465b; }\n.user.color-14 { color: #eb005a; }\n.user.color-15 { color: #e62600; }\n.user.color-16 { color: #0f8546; }\n.user.color-17 { color: #e60067; }\n.user.color-18 { color: #eb002b; }\n.user.color-19 { color: #eb003f; }\n.user.color-20 { color: #007a56; }\n.user.color-21 { color: #095092; }\n.user.color-22 { color: #000bde; }\n.user.color-23 { color: #008577; }\n.user.color-24 { color: #00367d; }\n.user.color-25 { color: #007e9e; }\n.user.color-26 { color: #006119; }\n.user.color-27 { color: #007ea8; }\n.user.color-28 { color: #3c8500; }\n.user.color-29 { color: #e6007e; }\n.user.color-30 { color: #c75300; }\n.user.color-31 { color: #eb0400; }\n.user.color-32 { color: #e60082; }\n\n#chat .self .content {\n\tcolor: var(--body-color-muted);\n}\n\n#chat .msg.channel_list_loading .text {\n\tcolor: #999;\n\tfont-style: italic;\n\tpadding-left: 20px;\n}\n\n#chat .msg.channel_list_truncated .text {\n\tcolor: #f00;\n\tpadding-left: 20px;\n}\n\n#chat table.channel-list,\n#chat table.ban-list,\n#chat table.invite-list,\n#chat table.ignore-list {\n\tmargin: 5px 10px;\n\twidth: calc(100% - 30px);\n}\n\n#chat table.channel-list th,\n#chat table.ban-list th,\n#chat table.invite-list th,\n#chat table.ignore-list th,\n#chat table.channel-list td,\n#chat table.ban-list td,\n#chat table.invite-list td {\n\tpadding: 5px;\n\tvertical-align: top;\n\tborder-bottom: #eee 1px solid;\n}\n\n#chat table.channel-list .channel {\n\twidth: 80px;\n}\n\n#chat table.channel-list .channel,\n#chat table.channel-list .topic,\n#chat table.ban-list .hostmask,\n#chat table.ban-list .banned_by,\n#chat table.ban-list .banned_at,\n#chat table.ignore-list .hostmask,\n#chat table.ignore-list .when {\n\ttext-align: left;\n}\n\n#chat table.channel-list .users {\n\ttext-align: center;\n\twidth: 50px;\n}\n\n#chat.hide-motd .msg[data-command=\"motd\"] {\n\tdisplay: none !important;\n}\n\n#chat .msg[data-type=\"monospace_block\"] .text {\n\tbackground: #f6f6f6;\n\tdisplay: inline-block;\n\tborder-radius: 4px;\n\tpadding: 6px;\n}\n\n#chat .msg[data-type=\"condensed\"] .content,\n#chat .msg[data-type=\"away\"] .content,\n#chat .msg[data-type=\"back\"] .content,\n#chat .msg[data-type=\"join\"] .content,\n#chat .msg[data-type=\"kick\"] .content,\n#chat .msg[data-type=\"mode\"] .content,\n#chat .msg[data-type=\"nick\"] .content,\n#chat .msg[data-type=\"part\"] .content,\n#chat .msg[data-type=\"quit\"] .content,\n#chat .msg[data-type=\"topic\"] .content,\n#chat .msg[data-type=\"topic_set_by\"] .content {\n\tcolor: var(--body-color-muted);\n}\n\n#chat .msg[data-type=\"action\"] .from,\n#chat .msg[data-type=\"action\"] .content,\n#chat .msg[data-type=\"action\"] .user {\n\tcolor: #f39c12;\n}\n\n#chat .msg[data-type=\"notice\"] .time,\n#chat .msg[data-type=\"wallops\"] .time,\n#chat .msg[data-type=\"notice\"] .content,\n#chat .msg[data-type=\"wallops\"] .content,\n#chat .msg[data-type=\"notice\"] .user,\n#chat .msg[data-type=\"wallops\"] .user {\n\tcolor: #0074d9;\n}\n\n#chat .msg[data-type=\"notice\"] .from .user::before {\n\tcontent: \"Notice: \";\n}\n\n#chat .msg[data-type=\"wallops\"] .from .user::before {\n\tcontent: \"Wallops: \";\n}\n\n#chat .msg[data-type=\"error\"],\n#chat .msg[data-type=\"error\"] .from {\n\tcolor: #e74c3c;\n}\n\n#chat .chat-view[data-type=\"channel\"] .msg.highlight {\n\tbackground-color: var(--highlight-bg-color);\n\tborder-left: 5px solid var(--highlight-border-color);\n}\n\n#chat .chat-view[data-type=\"channel\"] .msg.highlight .time {\n\tpadding-left: 5px;\n\tcolor: #696969;\n}\n\n#chat .chat-view[data-type=\"channel\"] .msg.highlight .content {\n\tborder-left: 1px solid var(--highlight-bg-color);\n}\n\n#chat .preview-size {\n\tmargin-left: 5px;\n\tuser-select: none;\n}\n\n#chat .toggle-content.opened .more-caret, /* Expand/Collapse link previews */\n#chat .toggle-button.opened, /* Thumbnail toggle */\n#chat .msg:not(.closed)[data-type=\"condensed\"] .toggle-button { /* Expanded status message toggle */\n\ttransform: rotate(90deg);\n}\n\n#chat .preview {\n\tdisplay: flex; /* Fix odd margin added by inline-flex in .toggle-content */\n}\n\n#chat .toggle-content {\n\tbackground: #f6f6f6;\n\tborder-radius: 5px;\n\tmax-width: 100%;\n\tmargin: 0;\n\tmargin-top: 6px;\n\toverflow: hidden;\n\tbox-shadow: 0 1px 3px rgb(0 0 0 / 20%);\n\tdisplay: inline-flex !important;\n\talign-items: flex-start;\n\twhite-space: normal;\n}\n\n/* This applies to images of preview-type-image and thumbnails of preview-type-link */\n#chat .toggle-content img {\n\tmax-width: 100%;\n\tmax-height: 128px;\n\tdisplay: block;\n\tcursor: zoom-in;\n}\n\n#chat .toggle-content pre.prefetch-error {\n\tpadding: 0;\n\tmargin: 0;\n\tcolor: inherit;\n\tbackground-color: transparent;\n}\n\n#chat .toggle-content .prefetch-error {\n\tdisplay: none;\n}\n\n#chat .toggle-content.opened .prefetch-error {\n\tdisplay: inline;\n}\n\n/* This applies to thumbnails of preview-type-link only */\n#chat .toggle-content .thumb {\n\tmax-height: 54px;\n\tmax-width: 96px;\n}\n\n#chat .toggle-type-error,\n#chat .toggle-content .toggle-text {\n\tpadding: 8px 10px;\n}\n\n#chat .toggle-content .toggle-text {\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-align: initial;\n}\n\n#chat .toggle-content.opened .toggle-text {\n\twhite-space: normal;\n}\n\n#chat .toggle-content .head {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tfont-weight: bold;\n}\n\n#chat .toggle-type-error,\n#chat .toggle-text .body {\n\tcolor: #717171;\n}\n\n#chat .toggle-text a {\n\tcolor: inherit;\n}\n\n#chat .toggle-text .overflowable {\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\tflex-grow: 1;\n}\n\n#chat .toggle-content .more {\n\tcolor: var(--link-color);\n\tfont-weight: normal;\n\tmargin-left: 10px;\n\tflex-shrink: 0;\n}\n\n#chat .toggle-content .more:hover {\n\ttext-decoration: underline;\n}\n\n#chat .toggle-content .more::after {\n\tcontent: \" \" attr(aria-label);\n}\n\n#chat .toggle-content .more-caret {\n\tdisplay: inline-block;\n\ttransition: transform 0.2s;\n}\n\n#chat .toggle-content .more-caret::before {\n\tcontent: \"\\f0da\"; /* https://fontawesome.com/icons/caret-right?style=solid */\n}\n\n#chat audio {\n\twidth: 600px;\n\tmax-width: 100%;\n}\n\n#chat .toggle-type-video {\n\tmax-width: 640px;\n}\n\n#chat video {\n\tmax-width: 100%;\n\tmax-height: 240px;\n}\n\n/* Do not display an empty div when there are no previews. Useful for example in\npart/quit messages where we don't load previews (adds a blank line otherwise) */\n#chat .preview:empty {\n\tdisplay: none;\n}\n\n#chat .userlist .count {\n\tbackground: #fafafa;\n\theight: 45px;\n\tflex-shrink: 0;\n\tposition: relative;\n}\n\n#chat .userlist .search {\n\tcolor: var(--body-color);\n\tappearance: none;\n\tborder: 0;\n\tbackground: none;\n\tfont: inherit;\n\toutline: 0;\n\tpadding: 13px;\n\tpadding-right: 30px;\n\twidth: 100%;\n}\n\n#chat .userlist .names {\n\tflex-grow: 1;\n\toverflow: auto;\n\toverflow-x: hidden;\n\tpadding-bottom: 10px;\n\twidth: 100%;\n\ttouch-action: pan-y;\n\tscrollbar-width: thin;\n\toverscroll-behavior: contain;\n\t-webkit-overflow-scrolling: touch;\n}\n\n#chat .names .user {\n\tdisplay: block;\n\tline-height: 1.6;\n\tpadding: 0 16px;\n\twhite-space: nowrap;\n}\n\n#chat .user-mode {\n\tmargin-bottom: 15px;\n}\n\n#chat .user-mode::before {\n\tbackground: var(--window-bg-color);\n\tcolor: var(--body-color-muted);\n\tdisplay: block;\n\tfont-size: 0.85em;\n\tline-height: 1.6;\n\tpadding: 5px 16px;\n\tposition: sticky;\n\ttop: 0;\n}\n\n#chat .user-mode.owner::before {\n\tcontent: \"Owners\";\n}\n\n#chat .user-mode.admin::before {\n\tcontent: \"Administrators\";\n}\n\n#chat .user-mode.op::before {\n\tcontent: \"Operators\";\n}\n\n#chat .user-mode.half-op::before {\n\tcontent: \"Half-Operators\";\n}\n\n#chat .user-mode.voice::before {\n\tcontent: \"Voiced\";\n}\n\n#chat .user-mode.normal::before {\n\tcontent: \"Users\";\n}\n\n#chat .user-mode-search::before {\n\tcontent: \"Search Results\";\n}\n\n#loading {\n\tdisplay: flex;\n\tfont-size: 14px;\n\theight: 100%;\n}\n\n#loading .window {\n\theight: initial;\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n#loading p {\n\tmargin-top: 10px;\n}\n\n#loading-slow,\n#loading-reload {\n\tvisibility: hidden;\n}\n\n#loading summary {\n\toutline: none;\n\tcursor: pointer;\n}\n\n#loading pre {\n\ttext-align: left;\n\twhite-space: normal;\n}\n\n#sign-in .container,\n#loading-reload-container,\n#loading-status-container {\n\tflex: 1 0 auto;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-direction: column;\n}\n\n#loading-reload-container {\n\tflex-grow: 0;\n}\n\n#loading .logo-inverted,\n.window .logo-inverted {\n\tdisplay: none; /* In dark themes, inverted logo must be used instead */\n}\n\n#sign-in label {\n\tdisplay: block;\n\tmargin-top: 10px;\n\twidth: 100%;\n}\n\n#sign-in .btn {\n\tmargin-top: 25px;\n}\n\n#sign-in .error {\n\tcolor: #e74c3c;\n\tmargin-top: 1em;\n\twidth: 100%;\n}\n\n#connect .connect-row {\n\tdisplay: flex;\n}\n\n#connect .connect-row > .input,\n#connect .connect-row > .input-wrap {\n\tflex-grow: 1;\n}\n\n#connect label {\n\twidth: 25%;\n\tflex-shrink: 0;\n\tmargin-top: 11px;\n}\n\n#connect .tls {\n\twidth: 100%;\n\tdisplay: block;\n\tmargin-top: 6px;\n}\n\n#connect .tls input,\n#connect input[name=\"proxyEnabled\"] {\n\tmargin: 3px 10px 0 0;\n}\n\n#connect\\:host,\n#connect\\:proxyHost {\n\twidth: 70%;\n}\n\n#connect\\:port,\n#connect\\:proxyPort {\n\twidth: 25%;\n}\n\n#connect\\:portseparator,\n#connect\\:proxyPortSeparator {\n\twidth: 5%;\n\ttext-align: center;\n\tdisplay: inline-block;\n}\n\n#connect .btn {\n\tmargin-top: 15px;\n\twidth: 100%;\n}\n\n#settings .settings-sync-panel {\n\tpadding: 10px;\n\tmargin-bottom: 16px;\n\tborder-radius: 2px;\n\tbackground-color: #d9edf7;\n\tcolor: #31708f;\n}\n\n#settings .settings-sync-panel p:last-child {\n\tmargin-bottom: 0;\n}\n\n#settings .settings-sync-panel .btn {\n\tcolor: #007bff;\n\tborder-color: #007bff;\n\tmargin-bottom: 0;\n}\n\n#settings .settings-sync-panel .btn:hover,\n#settings .settings-sync-panel .btn:focus {\n\tbackground-color: #007bff;\n\tcolor: #fff;\n}\n\n#settings .settings-sync-panel .btn:active,\n#settings .settings-sync-panel .btn:focus {\n\tbox-shadow: 0 0 0 3px rgb(0 123 255 / 50%);\n}\n\n#settings .opt {\n\tdisplay: block;\n\tpadding: 5px 0 5px 1px;\n}\n\n#settings .opt input {\n\tmargin-right: 6px;\n}\n\n#connect .extra-help,\n#settings .extra-help {\n\tcursor: help;\n}\n\n#settings h2 .extra-help {\n\tfont-size: 0.8em;\n}\n\n#settings #play {\n\tfont-size: 14px;\n\ttransition: opacity 0.2s;\n\tcolor: var(--window-heading-color);\n}\n\n#settings #play:hover {\n\topacity: 0.8;\n}\n\n#settings #change-password .error,\n#settings #change-password .success {\n\tmargin-bottom: 1em;\n}\n\n#settings #change-password .error {\n\tcolor: #e74c3c;\n}\n\n#settings #change-password .success {\n\tcolor: #2ecc40;\n}\n\n#settings .error {\n\tcolor: #e74c3c;\n\tmargin-top: 0.2em;\n}\n\n.password-container {\n\tposition: relative;\n}\n\n.password-container input {\n\tpadding-right: 37px;\n}\n\n#sign-in .password-container {\n\twidth: 100%;\n}\n\n#sign-in .password-container .reveal-password {\n\ttop: 31px;\n}\n\n.password-container .reveal-password {\n\tposition: absolute;\n\ttop: 2px;\n\tright: 0;\n\tappearance: none;\n}\n\n.password-container .reveal-password span {\n\tfont-size: 16px;\n\tcolor: #607992;\n\twidth: 35px;\n\theight: 35px;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tcursor: pointer;\n}\n\n.password-container .reveal-password span::before {\n\tcontent: \"\\f06e\"; /* https://fontawesome.com/icons/eye?style=solid */\n}\n\n.topic-container .save-topic span::before {\n\tcontent: \"\\f00c\"; /* https://fontawesome.com/icons/check?style=solid */\n}\n\n.password-container .reveal-password-visible span::before {\n\tcontent: \"\\f070\"; /* https://fontawesome.com/icons/eye-slash?style=solid */\n\tcolor: #ff4136;\n}\n\n#help .help-version-title {\n\tdisplay: flex;\n\tjustify-content: space-between;\n}\n\n#help .help-item {\n\tdisplay: table-row;\n\tfont-size: 14px;\n}\n\n#help .help-item .subject,\n#help .help-item .description {\n\tdisplay: table-cell;\n\tpadding-bottom: 15px;\n}\n\n#help .help-item .subject {\n\twhite-space: nowrap;\n\tpadding-right: 15px;\n}\n\n#help .help-item .subject.gesture {\n\tfont-weight: bold;\n}\n\n#help .help-item .description p {\n\tmargin-bottom: 0;\n}\n\n.whois {\n\tdisplay: grid;\n\tgrid-template-columns: max-content auto;\n\tmargin: 0;\n}\n\n.whois dt {\n\tgrid-column-start: 1;\n\tmargin-right: 20px;\n}\n\n.whois dd {\n\tgrid-column-start: 2;\n}\n\n.changelog-text {\n\tline-height: 1.5;\n}\n\n.changelog-text p {\n\tmargin-bottom: 16px;\n}\n\n.window#changelog h3 {\n\tfont-size: 20px;\n\tborder-bottom: 1px solid currentcolor;\n\tcolor: var(--window-heading-color);\n\tmargin: 30px 0 10px;\n\tpadding-bottom: 7px;\n}\n\n.window#chat-container {\n\t/*\n\t\tChat has its own scrollbar, so remove the one on parent\n\t\tThis caused a performance issue in Chrome\n\t*/\n\toverflow: hidden;\n}\n\n#version-checker {\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 10px;\n\tmargin-bottom: 16px;\n\tborder-radius: 2px;\n\ttransition: color 0.2s, background-color 0.2s;\n}\n\n#version-checker p,\n#version-checker button {\n\tmargin-bottom: 0;\n}\n\n#version-checker p {\n\tflex: 1;\n\tpadding-top: 6px;\n\tpadding-bottom: 6px;\n}\n\n#version-checker::before {\n\tmargin-left: 6px;\n\tmargin-right: 12px;\n\tfont-size: 1.2em;\n}\n\n#version-checker.loading {\n\tbackground-color: #d9edf7;\n\tcolor: #31708f;\n}\n\n#version-checker.loading::before {\n\tcontent: \"\\f253\"; /* https://fontawesome.com/icons/hourglass-end?style=solid */\n}\n\n#version-checker.new-version,\n#version-checker.new-packages {\n\tcolor: #8a6d3b;\n\tbackground-color: #fcf8e3;\n}\n\n#version-checker.new-version::before,\n#version-checker.new-packages::before {\n\tcontent: \"\\f164\"; /* https://fontawesome.com/icons/thumbs-up?style=solid */\n}\n\n#version-checker.error {\n\tcolor: #a94442;\n\tbackground-color: #f2dede;\n}\n\n#version-checker.error::before {\n\tcontent: \"\\f06a\"; /* http://fontawesome.io/icon/exclamation-circle/ */\n}\n\n#version-checker.up-to-date {\n\tbackground-color: #dff0d8;\n\tcolor: #3c763d;\n}\n\n#version-checker.up-to-date::before {\n\tcontent: \"\\f00c\"; /* http://fontawesome.io/icon/check/ */\n}\n\n#upload-progressbar {\n\tbackground: var(--upload-progressbar-color);\n\tbox-shadow: 0 0 10px var(--upload-progressbar-color);\n\twidth: 0%;\n\theight: 2px;\n\tvisibility: hidden;\n\tposition: absolute;\n\ttop: -1px; /* put it on top of #form's border */\n\tleft: 0;\n}\n\n#upload-progressbar.upload-progressbar-visible {\n\tvisibility: visible;\n\ttransition: 0.3s width ease-in-out;\n}\n\n#form {\n\tflex: 0 0 auto;\n\tborder: 0;\n\tborder-top: 1px solid #e7e7e7;\n\tborder-radius: 0;\n\tmargin: 0;\n\tpadding: 6px;\n\tbackground: white;\n\tdisplay: flex;\n\talign-items: flex-end;\n\tposition: relative;\n}\n\n#user-visible-error {\n\tfont-size: 14px;\n\tline-height: 1.5;\n\tfont-weight: 600;\n\tpadding: 10px;\n\tword-spacing: 3px;\n\ttext-transform: uppercase;\n\tbackground: #e74c3c;\n\tcolor: #fff;\n\ttext-align: center;\n\tcursor: pointer;\n}\n\n#form #nick {\n\tbackground: #f6f6f6;\n\tcolor: #666;\n\tfont-size: 13px;\n\tmargin: 4px;\n\tline-height: 24px;\n\tpadding: 0 8px;\n\tborder-radius: 2px;\n\tdisplay: none;\n}\n\n.public #form #nick {\n\tdisplay: block;\n}\n\n#form #input {\n\tbackground: transparent;\n\tborder: none;\n\tfont: inherit;\n\tmin-height: 19px; /* Required when computing input height at char deletion */\n\theight: 19px;\n\tmax-height: 95px; /* min-height/height x number of lines maximum */\n\tline-height: 19px; /* should match height */\n\toutline: none;\n\tmargin: 5px;\n\tpadding: 0;\n\tresize: none;\n\tflex: 1 0 auto;\n\talign-self: center;\n\ttouch-action: pan-y;\n}\n\n#form #upload-input {\n\tdisplay: none;\n}\n\n#form #upload,\n#form #submit {\n\tcolor: #607992;\n\tfont-size: 14px;\n\theight: 32px;\n\twidth: 32px;\n\tflex: 0 0 auto;\n}\n\n#form #upload[disabled],\n#form #submit[disabled] {\n\topacity: 0.5;\n}\n\n#mentions-popup-container,\n#context-menu-container {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tz-index: 1000;\n\tbackground: transparent;\n}\n\n#context-menu-container.passthrough {\n\tpointer-events: none;\n}\n\n#context-menu-container.passthrough > * {\n\tpointer-events: auto;\n}\n\n.mentions-popup,\n#context-menu,\n.textcomplete-menu {\n\tposition: absolute;\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0 6px;\n\tmin-width: 180px;\n\tfont-size: 14px;\n\tbackground-color: #fff;\n\tbox-shadow: 0 3px 12px rgb(0 0 0 / 15%);\n\tborder: 1px solid rgb(0 0 0 / 15%);\n\tborder-radius: 5px;\n\toutline: 0;\n}\n\n.context-menu-divider {\n\theight: 1px;\n\tmargin: 6px 0;\n\tbackground-color: rgb(0 0 0 / 10%);\n}\n\n.context-menu-item,\n.textcomplete-item {\n\tcursor: pointer;\n\tdisplay: block;\n\tpadding: 4px 8px;\n\tcolor: #333;\n\tmargin-top: 6px;\n\tmargin-bottom: 6px;\n\tline-height: 1.4;\n\tborder-radius: 3px;\n\twhite-space: nowrap;\n}\n\n.context-menu-item.active,\n.textcomplete-item:focus,\n.textcomplete-item:hover,\n.textcomplete-menu .active,\n#chat .userlist .user.active {\n\tbackground-color: rgb(0 0 0 / 10%);\n}\n\n.context-menu-item::before,\n.textcomplete-item::before {\n\twidth: 20px;\n\tdisplay: inline-block;\n}\n\n.textcomplete-item a {\n\tcolor: #333;\n}\n\n.textcomplete-item a:hover {\n\ttext-decoration: none;\n}\n\n.emoji {\n\tfont-size: 1.4em;\n\tvertical-align: text-top;\n\tline-height: 1;\n}\n\n.textcomplete-item .emoji {\n\twidth: 32px;\n\ttext-align: center;\n}\n\n.textcomplete-item .irc-bg {\n\tdisplay: block;\n}\n\n/**\n * IRC Message Styling\n * Colours are credit to http://clrs.cc/\n */\n.irc-fg0 { color: #fff; }\n.irc-fg1 { color: #000; }\n.irc-fg2 { color: #001f3f; }\n.irc-fg3 { color: #2ecc40; }\n.irc-fg4 { color: #ff4136; }\n.irc-fg5 { color: #85144b; }\n.irc-fg6 { color: #b10dc9; }\n.irc-fg7 { color: #ff851b; }\n.irc-fg8 { color: #ffdc00; }\n.irc-fg9 { color: #01ff70; }\n.irc-fg10 { color: #39cccc; }\n.irc-fg11 { color: #7fdbff; }\n.irc-fg12 { color: #0074d9; }\n.irc-fg13 { color: #f012be; }\n.irc-fg14 { color: #aaa; }\n.irc-fg15 { color: #ddd; }\n.irc-bg0 { background: #fff; }\n.irc-bg1 { background: #000; }\n.irc-bg2 { background: #001f3f; }\n.irc-bg3 { background: #2ecc40; }\n.irc-bg4 { background: #ff4136; }\n.irc-bg5 { background: #85144b; }\n.irc-bg6 { background: #b10dc9; }\n.irc-bg7 { background: #ff851b; }\n.irc-bg8 { background: #ffdc00; }\n.irc-bg9 { background: #01ff70; }\n.irc-bg10 { background: #39cccc; }\n.irc-bg11 { background: #7fdbff; }\n.irc-bg12 { background: #0074d9; }\n.irc-bg13 { background: #f012be; }\n.irc-bg14 { background: #aaa; }\n.irc-bg15 { background: #ddd; }\n\n/* https://modern.ircdocs.horse/formatting.html#colors-16-98 */\n.irc-fg16 { color: #470000; }\n.irc-fg17 { color: #472100; }\n.irc-fg18 { color: #474700; }\n.irc-fg19 { color: #324700; }\n.irc-fg20 { color: #004700; }\n.irc-fg21 { color: #00472c; }\n.irc-fg22 { color: #004747; }\n.irc-fg23 { color: #002747; }\n.irc-fg24 { color: #000047; }\n.irc-fg25 { color: #2e0047; }\n.irc-fg26 { color: #470047; }\n.irc-fg27 { color: #47002a; }\n.irc-fg28 { color: #740000; }\n.irc-fg29 { color: #743a00; }\n.irc-fg30 { color: #747400; }\n.irc-fg31 { color: #517400; }\n.irc-fg32 { color: #007400; }\n.irc-fg33 { color: #007449; }\n.irc-fg34 { color: #007474; }\n.irc-fg35 { color: #004074; }\n.irc-fg36 { color: #000074; }\n.irc-fg37 { color: #4b0074; }\n.irc-fg38 { color: #740074; }\n.irc-fg39 { color: #740045; }\n.irc-fg40 { color: #b50000; }\n.irc-fg41 { color: #b56300; }\n.irc-fg42 { color: #b5b500; }\n.irc-fg43 { color: #7db500; }\n.irc-fg44 { color: #00b500; }\n.irc-fg45 { color: #00b571; }\n.irc-fg46 { color: #00b5b5; }\n.irc-fg47 { color: #0063b5; }\n.irc-fg48 { color: #0000b5; }\n.irc-fg49 { color: #7500b5; }\n.irc-fg50 { color: #b500b5; }\n.irc-fg51 { color: #b5006b; }\n.irc-fg52 { color: #f00; }\n.irc-fg53 { color: #ff8c00; }\n.irc-fg54 { color: #ff0; }\n.irc-fg55 { color: #b2ff00; }\n.irc-fg56 { color: #0f0; }\n.irc-fg57 { color: #00ffa0; }\n.irc-fg58 { color: #0ff; }\n.irc-fg59 { color: #008cff; }\n.irc-fg60 { color: #00f; }\n.irc-fg61 { color: #a500ff; }\n.irc-fg62 { color: #f0f; }\n.irc-fg63 { color: #ff0098; }\n.irc-fg64 { color: #ff5959; }\n.irc-fg65 { color: #ffb459; }\n.irc-fg66 { color: #ffff71; }\n.irc-fg67 { color: #cfff60; }\n.irc-fg68 { color: #6fff6f; }\n.irc-fg69 { color: #65ffc9; }\n.irc-fg70 { color: #6dffff; }\n.irc-fg71 { color: #59b4ff; }\n.irc-fg72 { color: #5959ff; }\n.irc-fg73 { color: #c459ff; }\n.irc-fg74 { color: #f6f; }\n.irc-fg75 { color: #ff59bc; }\n.irc-fg76 { color: #ff9c9c; }\n.irc-fg77 { color: #ffd39c; }\n.irc-fg78 { color: #ffff9c; }\n.irc-fg79 { color: #e2ff9c; }\n.irc-fg80 { color: #9cff9c; }\n.irc-fg81 { color: #9cffdb; }\n.irc-fg82 { color: #9cffff; }\n.irc-fg83 { color: #9cd3ff; }\n.irc-fg84 { color: #9c9cff; }\n.irc-fg85 { color: #dc9cff; }\n.irc-fg86 { color: #ff9cff; }\n.irc-fg87 { color: #ff94d3; }\n.irc-fg88 { color: #000; }\n.irc-fg89 { color: #131313; }\n.irc-fg90 { color: #282828; }\n.irc-fg91 { color: #363636; }\n.irc-fg92 { color: #4d4d4d; }\n.irc-fg93 { color: #656565; }\n.irc-fg94 { color: #818181; }\n.irc-fg95 { color: #9f9f9f; }\n.irc-fg96 { color: #bcbcbc; }\n.irc-fg97 { color: #e2e2e2; }\n.irc-fg98 { color: #fff; }\n.irc-bg16 { background-color: #470000; }\n.irc-bg17 { background-color: #472100; }\n.irc-bg18 { background-color: #474700; }\n.irc-bg19 { background-color: #324700; }\n.irc-bg20 { background-color: #004700; }\n.irc-bg21 { background-color: #00472c; }\n.irc-bg22 { background-color: #004747; }\n.irc-bg23 { background-color: #002747; }\n.irc-bg24 { background-color: #000047; }\n.irc-bg25 { background-color: #2e0047; }\n.irc-bg26 { background-color: #470047; }\n.irc-bg27 { background-color: #47002a; }\n.irc-bg28 { background-color: #740000; }\n.irc-bg29 { background-color: #743a00; }\n.irc-bg30 { background-color: #747400; }\n.irc-bg31 { background-color: #517400; }\n.irc-bg32 { background-color: #007400; }\n.irc-bg33 { background-color: #007449; }\n.irc-bg34 { background-color: #007474; }\n.irc-bg35 { background-color: #004074; }\n.irc-bg36 { background-color: #000074; }\n.irc-bg37 { background-color: #4b0074; }\n.irc-bg38 { background-color: #740074; }\n.irc-bg39 { background-color: #740045; }\n.irc-bg40 { background-color: #b50000; }\n.irc-bg41 { background-color: #b56300; }\n.irc-bg42 { background-color: #b5b500; }\n.irc-bg43 { background-color: #7db500; }\n.irc-bg44 { background-color: #00b500; }\n.irc-bg45 { background-color: #00b571; }\n.irc-bg46 { background-color: #00b5b5; }\n.irc-bg47 { background-color: #0063b5; }\n.irc-bg48 { background-color: #0000b5; }\n.irc-bg49 { background-color: #7500b5; }\n.irc-bg50 { background-color: #b500b5; }\n.irc-bg51 { background-color: #b5006b; }\n.irc-bg52 { background-color: #f00; }\n.irc-bg53 { background-color: #ff8c00; }\n.irc-bg54 { background-color: #ff0; }\n.irc-bg55 { background-color: #b2ff00; }\n.irc-bg56 { background-color: #0f0; }\n.irc-bg57 { background-color: #00ffa0; }\n.irc-bg58 { background-color: #0ff; }\n.irc-bg59 { background-color: #008cff; }\n.irc-bg60 { background-color: #00f; }\n.irc-bg61 { background-color: #a500ff; }\n.irc-bg62 { background-color: #f0f; }\n.irc-bg63 { background-color: #ff0098; }\n.irc-bg64 { background-color: #ff5959; }\n.irc-bg65 { background-color: #ffb459; }\n.irc-bg66 { background-color: #ffff71; }\n.irc-bg67 { background-color: #cfff60; }\n.irc-bg68 { background-color: #6fff6f; }\n.irc-bg69 { background-color: #65ffc9; }\n.irc-bg70 { background-color: #6dffff; }\n.irc-bg71 { background-color: #59b4ff; }\n.irc-bg72 { background-color: #5959ff; }\n.irc-bg73 { background-color: #c459ff; }\n.irc-bg74 { background-color: #f6f; }\n.irc-bg75 { background-color: #ff59bc; }\n.irc-bg76 { background-color: #ff9c9c; }\n.irc-bg77 { background-color: #ffd39c; }\n.irc-bg78 { background-color: #ffff9c; }\n.irc-bg79 { background-color: #e2ff9c; }\n.irc-bg80 { background-color: #9cff9c; }\n.irc-bg81 { background-color: #9cffdb; }\n.irc-bg82 { background-color: #9cffff; }\n.irc-bg83 { background-color: #9cd3ff; }\n.irc-bg84 { background-color: #9c9cff; }\n.irc-bg85 { background-color: #dc9cff; }\n.irc-bg86 { background-color: #ff9cff; }\n.irc-bg87 { background-color: #ff94d3; }\n.irc-bg88 { background-color: #000; }\n.irc-bg89 { background-color: #131313; }\n.irc-bg90 { background-color: #282828; }\n.irc-bg91 { background-color: #363636; }\n.irc-bg92 { background-color: #4d4d4d; }\n.irc-bg93 { background-color: #656565; }\n.irc-bg94 { background-color: #818181; }\n.irc-bg95 { background-color: #9f9f9f; }\n.irc-bg96 { background-color: #bcbcbc; }\n.irc-bg97 { background-color: #e2e2e2; }\n.irc-bg98 { background-color: #fff; }\n\n.irc-bold {\n\tfont-weight: bold;\n}\n\n.irc-underline {\n\ttext-decoration: underline;\n}\n\n.irc-strikethrough {\n\ttext-decoration: line-through;\n}\n\n.irc-underline.irc-strikethrough {\n\ttext-decoration: underline line-through;\n}\n\n.irc-italic {\n\tfont-style: italic;\n}\n\n.tooltipped::after {\n\tfont-size: 12px;\n}\n\n@media (min-width: 480px) {\n\t/* Fade out for long usernames */\n\t#chat .from {\n\t\tpadding-left: 10px;\n\t\tmask-image: linear-gradient(to left, transparent, black 10px);\n\t}\n}\n\n@media (max-width: 768px) {\n\t/**\n\t * TODO Replace this with `@media (hover: hover)` when Firefox supports it\n\t * See:\n\t * - http://stackoverflow.com/a/28058919/1935861\n\t * - http://caniuse.com/#feat=css-media-interaction\n\t * - https://www.w3.org/TR/mediaqueries-4/\n\t * - https://developer.mozilla.org/en-US/docs/Web/CSS/@media/hover\n\t */\n\t.tooltipped-no-touch:hover::before,\n\t.tooltipped-no-touch:hover::after {\n\t\tvisibility: hidden;\n\t\topacity: 0;\n\t}\n\n\t#sidebar .logo-container {\n\t\tmargin-top: 5px;\n\t}\n\n\t.channel-list-item,\n\t#sidebar .empty,\n\t.window label,\n\t.header .topic,\n\t#settings .error,\n\t#help .help-item,\n\t#loading,\n\t#context-menu,\n\t#form #input,\n\t.textcomplete-menu,\n\t.messages .msg {\n\t\tfont-size: 15px;\n\t}\n\n\t#sidebar {\n\t\tdisplay: flex;\n\t\tbackground: var(--body-bg-color);\n\t\theight: 100%;\n\t\tposition: absolute;\n\t\tleft: -220px;\n\t\tz-index: 10;\n\t\ttransition: transform 160ms;\n\t\ttransform: translateZ(0);\n\t}\n\n\t#sidebar-overlay {\n\t\tposition: fixed;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\tright: 0;\n\t\tbackground: var(--overlay-bg-color);\n\t\topacity: 0;\n\t\tvisibility: hidden;\n\t\ttransition: opacity 160ms, visibility 160ms;\n\t\tz-index: 9;\n\t}\n\n\t#viewport.menu-open #sidebar-overlay {\n\t\topacity: 1;\n\t}\n\n\t#viewport.menu-open #sidebar {\n\t\ttransform: translate3d(220px, 0, 0);\n\t}\n\n\t#viewport.menu-dragging #sidebar-overlay,\n\t#viewport.menu-dragging #sidebar {\n\t\ttransition: none;\n\t}\n\n\t#viewport.menu-open #sidebar,\n\t#viewport.menu-dragging #sidebar {\n\t\tbox-shadow: 0 0 25px 0 rgb(0 0 0 / 50%);\n\t}\n\n\t#viewport.menu-open #sidebar-overlay,\n\t#viewport.menu-dragging #sidebar-overlay {\n\t\tvisibility: visible;\n\t}\n\n\t/* On mobile display, channel list button stays at the top */\n\t#viewport .lt {\n\t\tposition: relative;\n\t}\n\n\t#chat .userlist {\n\t\tbackground-color: var(--window-bg-color);\n\t\theight: 100%;\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttransform: translateX(180px);\n\t\ttransition: transform 0.2s;\n\t\tz-index: 1;\n\t}\n\n\t#viewport.userlist-open #chat .userlist {\n\t\ttransform: translateX(0);\n\t}\n\n\t#chat .header .title {\n\t\tpadding-left: 6px;\n\t}\n\n\t#chat .toggle-content .thumb {\n\t\tmax-height: 58px;\n\t\tmax-width: 104px;\n\t}\n}\n\n@media (max-width: 479px) {\n\t.container {\n\t\tmax-width: 100%;\n\t\tmargin: 0;\n\t}\n\n\t#sign-in .btn {\n\t\twidth: 100%;\n\t}\n\n\t.input {\n\t\tmargin-bottom: 2px;\n\t}\n\n\t#connect .connect-row {\n\t\tflex-direction: column;\n\t}\n\n\t#connect .connect-row > .input,\n\t#connect .connect-row > .input-wrap {\n\t\tflex-grow: 1;\n\t}\n\n\t#help .help-version-title {\n\t\tflex-direction: column;\n\t}\n\n\t#chat .messages {\n\t\tdisplay: block;\n\t\tpadding: 5px 0;\n\t}\n\n\t#chat .msg {\n\t\tdisplay: block;\n\t\tpadding: 2px 10px;\n\t}\n\n\t#chat .msg[data-type=\"condensed\"] .msg {\n\t\tpadding: 2px 0;\n\t}\n\n\t#chat .time,\n\t#chat .from,\n\t#chat .content {\n\t\tborder: 0;\n\t\tdisplay: inline;\n\t\tpadding: 0;\n\t}\n\n\t#chat .from::after {\n\t\t/* Add a space because mobile view changes to block display without paddings */\n\t\tcontent: \" \";\n\t\twhite-space: pre;\n\t}\n\n\t#chat .chat-view[data-type=\"channel\"] .msg.highlight {\n\t\tpadding-left: 5px;\n\t}\n\n\t#chat .chat-view[data-type=\"channel\"] .msg.highlight .time {\n\t\tpadding-left: 0;\n\t}\n\n\t#chat .condensed-summary .time,\n\t#chat .condensed-summary .from {\n\t\tdisplay: none;\n\t}\n\n\t#help .help-item .subject {\n\t\tdisplay: inline-block;\n\t\tpadding-bottom: 4px;\n\t}\n\n\t#help .help-item .description {\n\t\tdisplay: block;\n\t}\n}\n\n::-webkit-scrollbar {\n\twidth: 8px;\n\tbackground-color: rgb(0 0 0 / 0%);\n}\n\n::-webkit-scrollbar:hover {\n\tbackground-color: rgb(0 0 0 / 9%);\n}\n\n::-webkit-scrollbar-thumb:vertical {\n\tbackground: rgb(0 0 0 / 50%);\n\tborder-radius: 100px;\n}\n\n::-webkit-scrollbar-thumb:vertical:active {\n\tbackground: rgb(0 0 0 / 60%);\n}\n\n/* Image viewer and drag-and-drop overlay */\n\n#confirm-dialog-overlay,\n#upload-overlay,\n#image-viewer,\n#image-viewer .open-btn,\n#image-viewer .close-btn {\n\t/* Vertically and horizontally center stuff */\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n#confirm-dialog-overlay,\n#upload-overlay,\n#image-viewer {\n\tposition: fixed;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: var(--overlay-bg-color);\n\tvisibility: hidden;\n\topacity: 0;\n\ttransition: opacity 0.2s, visibility 0.2s;\n\tz-index: 999;\n\tuser-select: none;\n}\n\n#confirm-dialog-overlay.opened,\n#upload-overlay.is-dragover,\n#image-viewer.opened {\n\tvisibility: visible;\n\topacity: 1;\n}\n\n#confirm-dialog-overlay,\n#image-viewer {\n\tbackground: rgb(0 0 0 / 90%);\n}\n\n#image-viewer .close-btn,\n#image-viewer .open-btn,\n#image-viewer .previous-image-btn,\n#image-viewer .next-image-btn {\n\tposition: fixed;\n\ttop: 0;\n\twidth: 2em;\n\tfont-size: 36px;\n\tcolor: white;\n\topacity: 0.6;\n\ttransition: 0.2s opacity;\n}\n\n#image-viewer .close-btn {\n\tright: 0;\n\theight: 2em;\n\tz-index: 1002;\n}\n\n#image-viewer .close-btn::before {\n\tcontent: \"×\";\n}\n\n#image-viewer .open-btn {\n\tright: 0;\n\tbottom: 0;\n\ttop: auto;\n\theight: 2em;\n\tz-index: 1002;\n}\n\n#image-viewer .previous-image-btn,\n#image-viewer .next-image-btn {\n\tbottom: 0;\n\tz-index: 1001;\n}\n\n#image-viewer .previous-image-btn {\n\tleft: 0;\n}\n\n#image-viewer .next-image-btn {\n\tright: 0;\n}\n\n#image-viewer .close-btn:hover,\n#image-viewer .previous-image-btn:hover,\n#image-viewer .next-image-btn:hover {\n\topacity: 1;\n}\n\n#image-viewer > img {\n\tcursor: grab;\n\tposition: absolute;\n\ttransform-origin: 50% 50%;\n\n\t/* Checkered background for transparent images */\n\tbackground-position: 0 0, 10px 10px;\n\tbackground-size: 20px 20px;\n\tbackground-image:\n\t\tlinear-gradient(45deg, #eee 25%, rgb(0 0 0 / 0%) 25%, rgb(0 0 0 / 0%) 75%, #eee 75%, #eee 100%),\n\t\tlinear-gradient(45deg, #eee 25%, #fff 25%, #fff 75%, #eee 75%, #eee 100%);\n}\n\n/* Correctly handle multiple successive whitespace characters.\n For example: user has quit ( ===> L O L <=== ) */\n#chat .msg[data-type=\"action\"] .content,\n#chat .msg[data-type=\"message\"] .content,\n#chat .msg[data-type=\"monospace_block\"] .content,\n#chat .msg[data-type=\"notice\"] .content,\n#chat .ctcp-message,\n#chat .part-reason,\n#chat .quit-reason,\n#chat .new-topic {\n\twhite-space: pre-wrap;\n}\n\n#chat table.channel-list .topic,\n.header .topic {\n\twhite-space: nowrap;\n}\n\n.chat-view[data-type=\"search-results\"] .search-status {\n\tdisplay: flex;\n\theight: 100%;\n\tjustify-content: center;\n\talign-items: center;\n}\n","<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\">\n\t\t\t\t<label for=\"connect:fishKeysText\">\n\t\t\t\t\tPer-channel/user keys\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, one per line\"\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<textarea\n\t\t\t\t\tid=\"connect:fishKeysText\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\t:value=\"defaults.fishKeysText || ''\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tname=\"fishKeysText\"\n\t\t\t\t\tplaceholder=\"#chat secret123\\nuser otherkey\"\n\t\t\t\t/>\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</style>\n\n<script lang=\"ts\">\nimport RevealPassword from \"./RevealPassword.vue\";\nimport SidebarToggle from \"./SidebarToggle.vue\";\nimport {defineComponent, nextTick, PropType, ref, watch} from \"vue\";\nimport {useStore} from \"../js/store\";\nimport {ClientNetwork} from \"../js/types\";\n\nexport type NetworkFormDefaults = Partial<ClientNetwork> & {\n\tjoin?: string;\n\tfishGlobalKey?: string;\n\tfishKeysText?: 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// eslint-disable-next-line\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// eslint-disable-next-line\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\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 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};\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\t/* top: Header + (padding bottom of h2 - border) */\n\ttop: calc(45px + 5px);\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 (max-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<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: rgba(0, 0, 0, 0.35);\n}\n\n@media (min-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","<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 <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@click=\"jump(message, id)\"\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/>\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</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, useRouter} 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\t\tconst router = useRouter();\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\tconst jump = (message: ClientMessage, id: number) => {\n\t\t\t// TODO: Implement jumping to messages!\n\t\t\t// This is difficult because it means client will need to handle a potentially nonlinear message set\n\t\t\t// (loading IntersectionObserver both before AND after the messages)\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<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<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>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\n\t\treturn {\n\t\t\tstore,\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\tsession.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","<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 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\"\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\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: rgba(255, 255, 255, 0.1);\n\tpadding-right: 35px;\n\tappearance: none;\n}\n\n.jump-to-input .input::placeholder {\n\tcolor: rgba(255, 255, 255, 0.35);\n}\n\n.jump-to-input::before {\n\tcontent: \"\\f002\"; /* http://fontawesome.io/icon/search/ */\n\tcolor: rgba(255, 255, 255, 0.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\";\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} 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},\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:channel\", {\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: any): 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.touches && event.touches[0]) ||\n\t\t\t\t(event.pointerType && event.pointerType === \"touch\")\n\t\t\t);\n\t\t};\n\n\t\tconst onDraggableChoose = (event: any) => {\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: any) => {\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\tconst networkContainerRef = ref<HTMLDivElement>();\n\t\tconst channelRefs = ref<{[key: string]: HTMLDivElement}>({});\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 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: rgba(0, 0, 0, 0.3);\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\", close);\n\t\t\teventbus.on(\"confirm-dialog\", open);\n\t\t});\n\n\t\tonUnmounted(() => {\n\t\t\teventbus.off(\"escapekey\", close);\n\t\t\teventbus.off(\"confirm-dialog\", 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","<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 as any)\" />\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 }} on\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\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 class=\"content\" dir=\"auto\">\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}\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 (min-height: 500px) {\n\t.mentions-popup {\n\t\tmax-height: 60vh;\n\t}\n}\n\n@media (max-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\tright: 0;\n\t\tleft: 0;\n\t\tbottom: 0;\n\t\ttop: 45px; /* 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\";\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 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\tisOpen,\n\t\t\tisLoading,\n\t\t\tresolvedMessages,\n\t\t\tmessageTime,\n\t\t\tdismissMention,\n\t\t\tdismissAllMentions,\n\t\t\tcontainerClick,\n\t\t};\n\t},\n});\n</script>\n"],"names":[],"sourceRoot":""}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|