@lordbex/thelounge 4.4.3-blowfish → 4.4.4-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/README.md +29 -5
- package/dist/package.json +3 -2
- package/dist/server/clientManager.js +19 -18
- package/dist/server/identification.js +1 -1
- package/dist/server/models/network.js +16 -20
- package/dist/server/plugins/changelog.js +1 -1
- package/dist/server/plugins/inputs/action.js +1 -1
- package/dist/server/plugins/inputs/msg.js +1 -1
- package/dist/server/plugins/inputs/notice.js +1 -1
- package/dist/server/plugins/irc-events/link.js +48 -14
- package/dist/server/plugins/webpush.js +1 -1
- package/dist/server/utils/fish.js +354 -387
- package/package.json +3 -2
- package/public/css/style.css +2 -2
- package/public/css/style.css.map +1 -1
- package/public/js/bundle.js +1 -1
- package/public/js/bundle.js.map +1 -1
- package/public/js/bundle.vendor.js +1 -1
- package/public/js/bundle.vendor.js.map +1 -1
- package/public/js/loading-error-handlers.js +1 -1
- package/public/service-worker.js +1 -1
package/public/css/style.css.map
CHANGED
|
@@ -1 +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":""}
|
|
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=\"chghost\"] .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#chat .msg[data-type=\"chghost\"] .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=\"chghost\"] .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\" style=\"display: block\">\n\t\t\t\t<label for=\"connect:fishKeys\" style=\"margin-bottom: 5px\">\n\t\t\t\t\tPer-channel or User-Channels\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"tooltipped tooltipped-ne tooltipped-no-delay\"\n\t\t\t\t\t\taria-label=\"#channel key or nick key\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t\t<div class=\"fish-keys-section\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-for=\"(entry, index) in fishKeysEntries\"\n\t\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t\tclass=\"connect-row fish-key-row\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"input-wrap fish-key-inputs\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tv-model=\"entry.target\"\n\t\t\t\t\t\t\t\tclass=\"input fish-target-input\"\n\t\t\t\t\t\t\t\tplaceholder=\"#channel or nick\"\n\t\t\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t\t\t\taria-label=\"Channel or user name\"\n\t\t\t\t\t\t\t\tstyle=\"margin: 0\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tv-model=\"entry.key\"\n\t\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\t\tclass=\"input fish-key-input\"\n\t\t\t\t\t\t\t\tplaceholder=\"encryption key\"\n\t\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t\t\taria-label=\"Encryption key\"\n\t\t\t\t\t\t\t\tstyle=\"margin: 0\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"btn fish-remove-btn\"\n\t\t\t\t\t\t\t\t:disabled=\"fishKeysEntries.length <= 1\"\n\t\t\t\t\t\t\t\ttitle=\"Remove entry\"\n\t\t\t\t\t\t\t\tstyle=\"width: auto; margin: 0\"\n\t\t\t\t\t\t\t\t@click=\"removeFishKeyEntry(index)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tRemove\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<button type=\"button\" class=\"btn\" @click=\"addFishKeyEntry\">\n\t\t\t\t\t\t\tAdd Entry\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<template v-if=\"store.state.serverConfiguration?.public\">\n\t\t\t\t<template v-if=\"config?.lockNetwork\">\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label></label>\n\t\t\t\t\t\t<div class=\"input-wrap\">\n\t\t\t\t\t\t\t<label class=\"tls\">\n\t\t\t\t\t\t\t\t<input v-model=\"displayPasswordField\" type=\"checkbox\" />\n\t\t\t\t\t\t\t\tI have a password\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-if=\"displayPasswordField\" class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:password\">Password</label>\n\t\t\t\t\t\t<RevealPassword\n\t\t\t\t\t\t\tv-slot:default=\"slotProps\"\n\t\t\t\t\t\t\tclass=\"input-wrap password-container\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"connect:password\"\n\t\t\t\t\t\t\t\tref=\"publicPassword\"\n\t\t\t\t\t\t\t\tv-model=\"defaults.password\"\n\t\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\t\tplaceholder=\"Server password (optional)\"\n\t\t\t\t\t\t\t\tname=\"password\"\n\t\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</RevealPassword>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t</template>\n\t\t\t<template v-else>\n\t\t\t\t<h2 id=\"label-auth\">Authentication</h2>\n\t\t\t\t<div class=\"connect-row connect-auth\" role=\"group\" aria-labelledby=\"label-auth\">\n\t\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t:checked=\"!defaults.sasl\"\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\tname=\"sasl\"\n\t\t\t\t\t\t\tvalue=\"\"\n\t\t\t\t\t\t\t@change=\"setSaslAuth('')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tNo authentication\n\t\t\t\t\t</label>\n\t\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t:checked=\"defaults.sasl === 'plain'\"\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\tname=\"sasl\"\n\t\t\t\t\t\t\tvalue=\"plain\"\n\t\t\t\t\t\t\t@change=\"setSaslAuth('plain')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tUsername + password (SASL PLAIN)\n\t\t\t\t\t</label>\n\t\t\t\t\t<label\n\t\t\t\t\t\tv-if=\"!store.state.serverConfiguration?.public && defaults.tls\"\n\t\t\t\t\t\tclass=\"opt\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t:checked=\"defaults.sasl === 'external'\"\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\tname=\"sasl\"\n\t\t\t\t\t\t\tvalue=\"external\"\n\t\t\t\t\t\t\t@change=\"setSaslAuth('external')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tClient certificate (SASL EXTERNAL)\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\n\t\t\t\t<template v-if=\"defaults.sasl === 'plain'\">\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:username\">Account</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:saslAccount\"\n\t\t\t\t\t\t\tv-model.trim=\"defaults.saslAccount\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\tname=\"saslAccount\"\n\t\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:password\">Password</label>\n\t\t\t\t\t\t<RevealPassword\n\t\t\t\t\t\t\tv-slot:default=\"slotProps\"\n\t\t\t\t\t\t\tclass=\"input-wrap password-container\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"connect:saslPassword\"\n\t\t\t\t\t\t\t\tv-model=\"defaults.saslPassword\"\n\t\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\t\tname=\"saslPassword\"\n\t\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</RevealPassword>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t\t<div v-else-if=\"defaults.sasl === 'external'\" class=\"connect-sasl-external\">\n\t\t\t\t\t<p>The Lounge automatically generates and manages the client certificate.</p>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tOn the IRC server, you will need to tell the services to attach the\n\t\t\t\t\t\tcertificate fingerprint (certfp) to your account, for example:\n\t\t\t\t\t</p>\n\t\t\t\t\t<pre><code>/msg NickServ CERT ADD</code></pre>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<div>\n\t\t\t\t<button type=\"submit\" class=\"btn\" :disabled=\"disabled ? true : false\">\n\t\t\t\t\t<template v-if=\"defaults.uuid\">Save network</template>\n\t\t\t\t\t<template v-else>Connect</template>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</form>\n\t</div>\n</template>\n\n<style>\n#connect .connect-auth {\n\tdisplay: block;\n\tmargin-bottom: 10px;\n}\n\n#connect .connect-auth .opt {\n\tdisplay: block;\n\twidth: 100%;\n}\n\n#connect .connect-auth input {\n\tmargin: 3px 10px 0 0;\n}\n\n#connect .connect-sasl-external {\n\tpadding: 10px;\n\tborder-radius: 2px;\n\tbackground-color: #d9edf7;\n\tcolor: #31708f;\n}\n\n#connect .connect-sasl-external pre {\n\tmargin: 0;\n\tuser-select: text;\n}\n\n/* FiSH Keys section styles */\n.fish-keys-section {\n\twidth: 100%;\n\tpadding-top: 10px;\n}\n\n.fish-key-row {\n\tmargin-bottom: 5px;\n}\n\n.fish-key-label {\n\twidth: 25%;\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.fish-key-inputs {\n\tdisplay: flex;\n\tgap: 10px;\n\talign-items: center;\n}\n\n.fish-target-input {\n\tflex: 1;\n\tmin-width: 120px;\n}\n\n.fish-key-input {\n\tflex: 2;\n\tmin-width: 150px;\n}\n\n.fish-remove-btn {\n\tflex-shrink: 0;\n\tmin-width: 70px;\n\tmargin-left: 10px;\n}\n\n.fish-remove-btn:disabled {\n\topacity: 0.5;\n}\n\n.fish-remove-btn:disabled {\n\topacity: 0.5;\n}\n\n@media (max-width: 768px) {\n\t.fish-key-inputs {\n\t\tflex-direction: column;\n\t\tgap: 5px;\n\t}\n\n\t.fish-target-input,\n\t.fish-key-input {\n\t\tmin-width: auto;\n\t}\n\n\t.fish-remove-btn {\n\t\tmargin-left: 0;\n\t\talign-self: stretch;\n\t}\n}\n</style>\n\n<script lang=\"ts\">\nimport RevealPassword from \"./RevealPassword.vue\";\nimport SidebarToggle from \"./SidebarToggle.vue\";\nimport {defineComponent, nextTick, PropType, ref, watch, computed, reactive} 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\tfishKeys?: Record<string, string>;\n};\n\nexport default defineComponent({\n\tname: \"NetworkForm\",\n\tcomponents: {\n\t\tRevealPassword,\n\t\tSidebarToggle,\n\t},\n\tprops: {\n\t\thandleSubmit: {\n\t\t\ttype: Function as PropType<(network: ClientNetwork) => void>,\n\t\t\trequired: true,\n\t\t},\n\t\tdefaults: {\n\t\t\ttype: Object as PropType<NetworkFormDefaults>,\n\t\t\trequired: true,\n\t\t},\n\t\tdisabled: Boolean,\n\t},\n\tsetup(props) {\n\t\tconst store = useStore();\n\t\tconst config = ref(store.state.serverConfiguration);\n\t\tconst previousUsername = ref(props.defaults?.username);\n\t\tconst displayPasswordField = ref(false);\n\n\t\tconst publicPassword = ref<HTMLInputElement | null>(null);\n\n\t\twatch(displayPasswordField, (newValue) => {\n\t\t\tif (newValue) {\n\t\t\t\tvoid nextTick(() => {\n\t\t\t\t\tpublicPassword.value?.focus();\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tconst commandsInput = ref<HTMLInputElement | null>(null);\n\n\t\tconst resizeCommandsInput = () => {\n\t\t\tif (!commandsInput.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Reset height first so it can down size\n\t\t\tcommandsInput.value.style.height = \"\";\n\n\t\t\t// 2 pixels to account for the border\n\t\t\tcommandsInput.value.style.height = `${Math.ceil(\n\t\t\t\tcommandsInput.value.scrollHeight + 2\n\t\t\t)}px`;\n\t\t};\n\n\t\twatch(\n\t\t\t// 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\t// FiSH Keys table management\n\t\tinterface FishKeyEntry {\n\t\t\ttarget: string;\n\t\t\tkey: string;\n\t\t}\n\n\t\tconst fishKeysEntries = ref<FishKeyEntry[]>([]);\n\n\t\t// Parse fishKeys object into table entries\n\t\tconst parseFishKeys = (input: Record<string, string> | undefined): FishKeyEntry[] => {\n\t\t\tif (!input || Object.keys(input).length === 0) {\n\t\t\t\treturn [{target: \"\", key: \"\"}];\n\t\t\t}\n\n\t\t\tconst entries: FishKeyEntry[] = [];\n\n\t\t\tfor (const [target, key] of Object.entries(input)) {\n\t\t\t\tentries.push({target, key: String(key ?? \"\")});\n\t\t\t}\n\n\t\t\treturn entries.length > 0 ? entries : [{target: \"\", key: \"\"}];\n\t\t};\n\n\t\t// Convert table entries into mapping object\n\t\tconst fishKeysValue = computed(() => {\n\t\t\tconst map: Record<string, string> = {};\n\n\t\t\tfor (const entry of fishKeysEntries.value) {\n\t\t\t\tconst target = entry.target.trim();\n\t\t\t\tconst key = entry.key.trim();\n\n\t\t\t\tif (target && key) {\n\t\t\t\t\tmap[target] = key;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn map;\n\t\t});\n\n\t\t// Initialize entries from defaults\n\t\twatch(\n\t\t\t() => props.defaults.fishKeys,\n\t\t\t(newValue) => {\n\t\t\t\tfishKeysEntries.value = parseFishKeys(newValue);\n\t\t\t},\n\t\t\t{immediate: true}\n\t\t);\n\n\t\tconst addFishKeyEntry = () => {\n\t\t\tfishKeysEntries.value.push({target: \"\", key: \"\"});\n\t\t};\n\n\t\tconst removeFishKeyEntry = (index: number) => {\n\t\t\tif (fishKeysEntries.value.length > 1) {\n\t\t\t\tfishKeysEntries.value.splice(index, 1);\n\t\t\t}\n\t\t};\n\n\t\tconst onSubmit = (event: Event) => {\n\t\t\tconst formData = new FormData(event.target as HTMLFormElement);\n\t\t\tconst data: Partial<ClientNetwork> = {};\n\n\t\t\tformData.forEach((value, key) => {\n\t\t\t\tdata[key] = value;\n\t\t\t});\n\n\t\t\t// Attach FiSH keys mapping directly as an object\n\t\t\t(data as any).fishKeys = fishKeysValue.value;\n\n\t\t\tprops.handleSubmit(data as ClientNetwork);\n\t\t};\n\n\t\treturn {\n\t\t\tstore,\n\t\t\tconfig,\n\t\t\tdisplayPasswordField,\n\t\t\tpublicPassword,\n\t\t\tcommandsInput,\n\t\t\tresizeCommandsInput,\n\t\t\tsetSaslAuth,\n\t\t\tusernameInput,\n\t\t\tonNickChanged,\n\t\t\tonSubmit,\n\t\t\tfishKeysEntries,\n\t\t\tfishKeysValue,\n\t\t\taddFishKeyEntry,\n\t\t\tremoveFishKeyEntry,\n\t\t};\n\t},\n});\n</script>\n","<template>\n\t<!-- 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:channels\", {\n\t\t\t\tnetwork: netChan.network.uuid,\n\t\t\t\torder: netChan.network.channels.map((c) => c.id),\n\t\t\t});\n\t\t};\n\n\t\tconst isTouchEvent = (event: 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":""}
|