aprsd 3.4.4__py3-none-any.whl → 4.0.0__py3-none-any.whl

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.
Files changed (115) hide show
  1. aprsd/cli_helper.py +12 -5
  2. aprsd/client/aprsis.py +31 -9
  3. aprsd/client/base.py +13 -2
  4. aprsd/client/drivers/aprsis.py +6 -3
  5. aprsd/client/drivers/fake.py +15 -20
  6. aprsd/client/factory.py +0 -2
  7. aprsd/client/fake.py +0 -2
  8. aprsd/client/kiss.py +17 -2
  9. aprsd/client/stats.py +1 -3
  10. aprsd/cmds/completion.py +7 -4
  11. aprsd/cmds/dev.py +38 -42
  12. aprsd/cmds/fetch_stats.py +140 -143
  13. aprsd/cmds/healthcheck.py +5 -3
  14. aprsd/cmds/list_plugins.py +140 -134
  15. aprsd/cmds/listen.py +13 -9
  16. aprsd/cmds/server.py +53 -27
  17. aprsd/conf/__init__.py +1 -2
  18. aprsd/conf/client.py +3 -4
  19. aprsd/conf/common.py +19 -93
  20. aprsd/conf/log.py +2 -4
  21. aprsd/conf/opts.py +5 -4
  22. aprsd/conf/plugin_common.py +11 -121
  23. aprsd/exception.py +2 -0
  24. aprsd/log/log.py +7 -46
  25. aprsd/main.py +10 -4
  26. aprsd/packets/__init__.py +14 -4
  27. aprsd/packets/core.py +57 -67
  28. aprsd/packets/log.py +8 -8
  29. aprsd/packets/packet_list.py +9 -6
  30. aprsd/plugin.py +22 -11
  31. aprsd/plugins/notify.py +1 -4
  32. aprsd/plugins/weather.py +10 -8
  33. aprsd/stats/collector.py +5 -2
  34. aprsd/threads/__init__.py +3 -2
  35. aprsd/threads/aprsd.py +12 -7
  36. aprsd/threads/{keep_alive.py → keepalive.py} +14 -45
  37. aprsd/threads/registry.py +3 -3
  38. aprsd/threads/rx.py +9 -6
  39. aprsd/threads/stats.py +2 -2
  40. aprsd/threads/tx.py +3 -4
  41. aprsd/utils/__init__.py +42 -10
  42. aprsd/utils/json.py +9 -4
  43. aprsd/utils/keepalive_collector.py +55 -0
  44. aprsd/utils/trace.py +0 -2
  45. aprsd-4.0.0.dist-info/AUTHORS +1 -0
  46. aprsd-4.0.0.dist-info/METADATA +293 -0
  47. aprsd-4.0.0.dist-info/RECORD +74 -0
  48. {aprsd-3.4.4.dist-info → aprsd-4.0.0.dist-info}/WHEEL +1 -1
  49. aprsd/cmds/admin.py +0 -57
  50. aprsd/cmds/webchat.py +0 -662
  51. aprsd/conf/plugin_email.py +0 -105
  52. aprsd/plugins/email.py +0 -715
  53. aprsd/plugins/location.py +0 -181
  54. aprsd/threads/log_monitor.py +0 -121
  55. aprsd/web/__init__.py +0 -0
  56. aprsd/web/admin/__init__.py +0 -0
  57. aprsd/web/admin/static/css/index.css +0 -84
  58. aprsd/web/admin/static/css/prism.css +0 -4
  59. aprsd/web/admin/static/css/tabs.css +0 -35
  60. aprsd/web/admin/static/images/Untitled.png +0 -0
  61. aprsd/web/admin/static/images/aprs-symbols-16-0.png +0 -0
  62. aprsd/web/admin/static/images/aprs-symbols-16-1.png +0 -0
  63. aprsd/web/admin/static/images/aprs-symbols-64-0.png +0 -0
  64. aprsd/web/admin/static/images/aprs-symbols-64-1.png +0 -0
  65. aprsd/web/admin/static/images/aprs-symbols-64-2.png +0 -0
  66. aprsd/web/admin/static/js/charts.js +0 -235
  67. aprsd/web/admin/static/js/echarts.js +0 -465
  68. aprsd/web/admin/static/js/logs.js +0 -26
  69. aprsd/web/admin/static/js/main.js +0 -231
  70. aprsd/web/admin/static/js/prism.js +0 -12
  71. aprsd/web/admin/static/js/send-message.js +0 -114
  72. aprsd/web/admin/static/js/tabs.js +0 -28
  73. aprsd/web/admin/templates/index.html +0 -196
  74. aprsd/web/chat/static/css/chat.css +0 -115
  75. aprsd/web/chat/static/css/index.css +0 -66
  76. aprsd/web/chat/static/css/style.css.map +0 -1
  77. aprsd/web/chat/static/css/tabs.css +0 -41
  78. aprsd/web/chat/static/css/upstream/bootstrap.min.css +0 -6
  79. aprsd/web/chat/static/css/upstream/font.woff2 +0 -0
  80. aprsd/web/chat/static/css/upstream/google-fonts.css +0 -23
  81. aprsd/web/chat/static/css/upstream/jquery-ui.css +0 -1311
  82. aprsd/web/chat/static/css/upstream/jquery.toast.css +0 -28
  83. aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  84. aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  85. aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  86. aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  87. aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/icons.woff +0 -0
  88. aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/icons.woff2 +0 -0
  89. aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/outline-icons.woff +0 -0
  90. aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  91. aprsd/web/chat/static/images/Untitled.png +0 -0
  92. aprsd/web/chat/static/images/aprs-symbols-16-0.png +0 -0
  93. aprsd/web/chat/static/images/aprs-symbols-16-1.png +0 -0
  94. aprsd/web/chat/static/images/aprs-symbols-64-0.png +0 -0
  95. aprsd/web/chat/static/images/aprs-symbols-64-1.png +0 -0
  96. aprsd/web/chat/static/images/aprs-symbols-64-2.png +0 -0
  97. aprsd/web/chat/static/images/globe.svg +0 -3
  98. aprsd/web/chat/static/js/gps.js +0 -84
  99. aprsd/web/chat/static/js/main.js +0 -45
  100. aprsd/web/chat/static/js/send-message.js +0 -612
  101. aprsd/web/chat/static/js/tabs.js +0 -28
  102. aprsd/web/chat/static/js/upstream/bootstrap.bundle.min.js +0 -7
  103. aprsd/web/chat/static/js/upstream/jquery-3.7.1.min.js +0 -2
  104. aprsd/web/chat/static/js/upstream/jquery-ui.min.js +0 -13
  105. aprsd/web/chat/static/js/upstream/jquery.toast.js +0 -374
  106. aprsd/web/chat/static/js/upstream/semantic.min.js +0 -11
  107. aprsd/web/chat/static/js/upstream/socket.io.min.js +0 -7
  108. aprsd/web/chat/templates/index.html +0 -139
  109. aprsd/wsgi.py +0 -322
  110. aprsd-3.4.4.dist-info/AUTHORS +0 -13
  111. aprsd-3.4.4.dist-info/METADATA +0 -849
  112. aprsd-3.4.4.dist-info/RECORD +0 -134
  113. {aprsd-3.4.4.dist-info → aprsd-4.0.0.dist-info}/LICENSE +0 -0
  114. {aprsd-3.4.4.dist-info → aprsd-4.0.0.dist-info}/entry_points.txt +0 -0
  115. {aprsd-3.4.4.dist-info → aprsd-4.0.0.dist-info}/top_level.txt +0 -0
@@ -1 +0,0 @@
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,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,o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","sources":["webpack://thelounge/./node_modules/normalize.css/normalize.css","webpack://thelounge/./client/css/fontawesome.css","webpack://thelounge/./node_modules/primer-tooltips/build/build.css","webpack://thelounge/./client/css/style.css","webpack://thelounge/./client/components/NetworkList.vue","webpack://thelounge/./client/components/ConfirmDialog.vue","webpack://thelounge/./client/components/Mentions.vue","webpack://thelounge/./client/components/NetworkForm.vue","webpack://thelounge/./client/components/Session.vue","webpack://thelounge/./client/components/Windows/Settings.vue","webpack://thelounge/./client/components/MessageSearchForm.vue","webpack://thelounge/./client/components/Windows/SearchResults.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#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#footer .settings::before { content: \"\\f013\"; /* http://fontawesome.io/icon/cog/ */ }\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#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\tmargin-top: 6px;\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 defualt 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\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#chat .user {\n\tcolor: #50a656;\n}\n\n#chat.colored-nicks .user.color-1 { color: #107ead; }\n#chat.colored-nicks .user.color-2 { color: #a86500; }\n#chat.colored-nicks .user.color-3 { color: #008a3c; }\n#chat.colored-nicks .user.color-4 { color: #e00096; }\n#chat.colored-nicks .user.color-5 { color: #f0000c; }\n#chat.colored-nicks .user.color-6 { color: #000094; }\n#chat.colored-nicks .user.color-7 { color: #006441; }\n#chat.colored-nicks .user.color-8 { color: #00566e; }\n#chat.colored-nicks .user.color-9 { color: #e6006b; }\n#chat.colored-nicks .user.color-10 { color: #0d8766; }\n#chat.colored-nicks .user.color-11 { color: #006b3b; }\n#chat.colored-nicks .user.color-12 { color: #00857e; }\n#chat.colored-nicks .user.color-13 { color: #00465b; }\n#chat.colored-nicks .user.color-14 { color: #eb005a; }\n#chat.colored-nicks .user.color-15 { color: #e62600; }\n#chat.colored-nicks .user.color-16 { color: #0f8546; }\n#chat.colored-nicks .user.color-17 { color: #e60067; }\n#chat.colored-nicks .user.color-18 { color: #eb002b; }\n#chat.colored-nicks .user.color-19 { color: #eb003f; }\n#chat.colored-nicks .user.color-20 { color: #007a56; }\n#chat.colored-nicks .user.color-21 { color: #095092; }\n#chat.colored-nicks .user.color-22 { color: #000bde; }\n#chat.colored-nicks .user.color-23 { color: #008577; }\n#chat.colored-nicks .user.color-24 { color: #00367d; }\n#chat.colored-nicks .user.color-25 { color: #007e9e; }\n#chat.colored-nicks .user.color-26 { color: #006119; }\n#chat.colored-nicks .user.color-27 { color: #007ea8; }\n#chat.colored-nicks .user.color-28 { color: #3c8500; }\n#chat.colored-nicks .user.color-29 { color: #e6007e; }\n#chat.colored-nicks .user.color-30 { color: #c75300; }\n#chat.colored-nicks .user.color-31 { color: #eb0400; }\n#chat.colored-nicks .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 .apple-push-unsupported,\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 .apple-push-unsupported a {\n\tcolor: inherit;\n\ttext-decoration: underline;\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\n.header .topic,\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#chat table.channel-list .topic {\n\twhite-space: pre-wrap;\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\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\t@change=\"onNetworkSort\"\n\t\t\t@choose=\"onDraggableChoose\"\n\t\t\t@unchoose=\"onDraggableUnchoose\"\n\t\t>\n\t\t\t<div\n\t\t\t\tv-for=\"network in $store.state.networks\"\n\t\t\t\t:id=\"'network-' + network.uuid\"\n\t\t\t\t:key=\"network.uuid\"\n\t\t\t\t:class=\"{\n\t\t\t\t\tcollapsed: network.isCollapsed,\n\t\t\t\t\t'not-connected': !network.status.connected,\n\t\t\t\t\t'not-secure': !network.status.secure,\n\t\t\t\t}\"\n\t\t\t\tclass=\"network\"\n\t\t\t\trole=\"region\"\n\t\t\t\taria-live=\"polite\"\n\t\t\t\t@touchstart=\"onDraggableTouchStart\"\n\t\t\t\t@touchmove=\"onDraggableTouchMove\"\n\t\t\t\t@touchend=\"onDraggableTouchEnd\"\n\t\t\t\t@touchcancel=\"onDraggableTouchEnd\"\n\t\t\t>\n\t\t\t\t<NetworkLobby\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:is-join-channel-shown=\"network.isJoinChannelShown\"\n\t\t\t\t\t:active=\"\n\t\t\t\t\t\t$store.state.activeChannel &&\n\t\t\t\t\t\tnetwork.channels[0] === $store.state.activeChannel.channel\n\t\t\t\t\t\"\n\t\t\t\t\t@toggle-join-channel=\"network.isJoinChannelShown = !network.isJoinChannelShown\"\n\t\t\t\t/>\n\t\t\t\t<JoinChannel\n\t\t\t\t\tv-if=\"network.isJoinChannelShown\"\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:channel=\"network.channels[0]\"\n\t\t\t\t\t@toggle-join-channel=\"network.isJoinChannelShown = !network.isJoinChannelShown\"\n\t\t\t\t/>\n\n\t\t\t\t<Draggable\n\t\t\t\t\tdraggable=\".channel-list-item\"\n\t\t\t\t\tghost-class=\"ui-sortable-ghost\"\n\t\t\t\t\tdrag-class=\"ui-sortable-dragging\"\n\t\t\t\t\t:group=\"network.uuid\"\n\t\t\t\t\t:list=\"network.channels\"\n\t\t\t\t\t:delay=\"LONG_TOUCH_DURATION\"\n\t\t\t\t\t:delay-on-touch-only=\"true\"\n\t\t\t\t\t:touch-start-threshold=\"10\"\n\t\t\t\t\tclass=\"channels\"\n\t\t\t\t\t@change=\"onChannelSort\"\n\t\t\t\t\t@choose=\"onDraggableChoose\"\n\t\t\t\t\t@unchoose=\"onDraggableUnchoose\"\n\t\t\t\t>\n\t\t\t\t\t<template v-for=\"(channel, index) in network.channels\">\n\t\t\t\t\t\t<Channel\n\t\t\t\t\t\t\tv-if=\"index > 0\"\n\t\t\t\t\t\t\t:key=\"channel.id\"\n\t\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t:active=\"\n\t\t\t\t\t\t\t\t$store.state.activeChannel &&\n\t\t\t\t\t\t\t\tchannel === $store.state.activeChannel.channel\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t</Draggable>\n\t\t\t</div>\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>\nimport Mousetrap from \"mousetrap\";\nimport Draggable from \"vuedraggable\";\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 collapseNetwork from \"../js/helpers/collapseNetwork\";\nimport isIgnoredKeybind from \"../js/helpers/isIgnoredKeybind\";\nimport distance from \"../js/helpers/distance\";\nimport eventbus from \"../js/eventbus\";\n\nexport default {\n\tname: \"NetworkList\",\n\tcomponents: {\n\t\tJoinChannel,\n\t\tNetworkLobby,\n\t\tChannel,\n\t\tDraggable,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tsearchText: \"\",\n\t\t\tactiveSearchItem: null,\n\t\t};\n\t},\n\tcomputed: {\n\t\titems() {\n\t\t\tconst items = [];\n\n\t\t\tfor (const network of this.$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\tthis.$store.state.activeChannel &&\n\t\t\t\t\t\tchannel === this.$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\titems.push({network, channel});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn items;\n\t\t},\n\t\tresults() {\n\t\t\tconst results = fuzzyFilter(this.searchText, this.items, {\n\t\t\t\textract: (item) => item.channel.name,\n\t\t\t}).map((item) => item.original);\n\n\t\t\treturn results;\n\t\t},\n\t},\n\twatch: {\n\t\tsearchText() {\n\t\t\tthis.setActiveSearchItem();\n\t\t},\n\t},\n\tcreated() {\n\t\t// Number of milliseconds a touch has to last to be considered long\n\t\tthis.LONG_TOUCH_DURATION = 500;\n\t},\n\tmounted() {\n\t\tMousetrap.bind(\"alt+shift+right\", this.expandNetwork);\n\t\tMousetrap.bind(\"alt+shift+left\", this.collapseNetwork);\n\t\tMousetrap.bind(\"alt+j\", this.toggleSearch);\n\t},\n\tbeforeDestroy() {\n\t\tMousetrap.unbind(\"alt+shift+right\", this.expandNetwork);\n\t\tMousetrap.unbind(\"alt+shift+left\", this.collapseNetwork);\n\t\tMousetrap.unbind(\"alt+j\", this.toggleSearch);\n\t},\n\tmethods: {\n\t\texpandNetwork(event) {\n\t\t\tif (isIgnoredKeybind(event)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (this.$store.state.activeChannel) {\n\t\t\t\tcollapseNetwork(this.$store.state.activeChannel.network, false);\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\tcollapseNetwork(event) {\n\t\t\tif (isIgnoredKeybind(event)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (this.$store.state.activeChannel) {\n\t\t\t\tcollapseNetwork(this.$store.state.activeChannel.network, true);\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\tonNetworkSort(e) {\n\t\t\tif (!e.moved) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsocket.emit(\"sort\", {\n\t\t\t\ttype: \"networks\",\n\t\t\t\torder: this.$store.state.networks.map((n) => n.uuid),\n\t\t\t});\n\t\t},\n\t\tonChannelSort(e) {\n\t\t\tif (!e.moved) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst channel = this.$store.getters.findChannel(e.moved.element.id);\n\n\t\t\tif (!channel) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsocket.emit(\"sort\", {\n\t\t\t\ttype: \"channels\",\n\t\t\t\ttarget: channel.network.uuid,\n\t\t\t\torder: channel.network.channels.map((c) => c.id),\n\t\t\t});\n\t\t},\n\t\tisTouchEvent(event) {\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\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\t\tonDraggableChoose(event) {\n\t\t\tconst original = event.originalEvent;\n\n\t\t\tif (this.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\tthis.startDrag = [original.touches[0].clientX, original.touches[0].clientY];\n\t\t\t\t} else if (original instanceof PointerEvent) {\n\t\t\t\t\tthis.startDrag = [original.clientX, original.clientY];\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonDraggableUnchoose(event) {\n\t\t\tevent.item.classList.remove(\"ui-sortable-dragging-touch-cue\");\n\t\t\tthis.startDrag = null;\n\t\t},\n\t\tonDraggableTouchStart(event) {\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\t\tonDraggableTouchMove(event) {\n\t\t\tif (this.startDrag && 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(this.startDrag, currentPosition) > 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\t\tonDraggableTouchEnd(event) {\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\t\ttoggleSearch(event) {\n\t\t\tif (isIgnoredKeybind(event)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (this.$refs.searchInput === document.activeElement) {\n\t\t\t\tthis.deactivateSearch();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.activateSearch();\n\t\t\treturn false;\n\t\t},\n\t\tactivateSearch() {\n\t\t\tif (this.$refs.searchInput === document.activeElement) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.sidebarWasClosed = this.$store.state.sidebarOpen ? false : true;\n\t\t\tthis.$store.commit(\"sidebarOpen\", true);\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.$refs.searchInput.focus();\n\t\t\t});\n\t\t},\n\t\tdeactivateSearch() {\n\t\t\tthis.activeSearchItem = null;\n\t\t\tthis.searchText = \"\";\n\t\t\tthis.$refs.searchInput.blur();\n\n\t\t\tif (this.sidebarWasClosed) {\n\t\t\t\tthis.$store.commit(\"sidebarOpen\", false);\n\t\t\t}\n\t\t},\n\t\tsetSearchText(e) {\n\t\t\tthis.searchText = e.target.value;\n\t\t},\n\t\tsetActiveSearchItem(channel) {\n\t\t\tif (!this.results.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!channel) {\n\t\t\t\tchannel = this.results[0].channel;\n\t\t\t}\n\n\t\t\tthis.activeSearchItem = channel;\n\t\t},\n\t\tselectResult() {\n\t\t\tif (!this.searchText || !this.results.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.$root.switchToChannel(this.activeSearchItem);\n\t\t\tthis.deactivateSearch();\n\t\t\tthis.scrollToActive();\n\t\t},\n\t\tnavigateResults(event, direction) {\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 (!this.searchText) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst channels = this.results.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\tthis.activeSearchItem = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet currentIndex = channels.indexOf(this.activeSearchItem);\n\n\t\t\t// If there's no active channel select the first or last one depending on direction\n\t\t\tif (!this.activeSearchItem || currentIndex === -1) {\n\t\t\t\tthis.activeSearchItem = direction ? channels[0] : channels[channels.length - 1];\n\t\t\t\tthis.scrollToActive();\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\tthis.activeSearchItem = channels[currentIndex];\n\t\t\tthis.scrollToActive();\n\t\t},\n\t\tscrollToActive() {\n\t\t\t// Scroll the list if needed after the active class is applied\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tconst el = this.$refs.networklist.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\t},\n};\n</script>\n","<template>\n\t<div id=\"confirm-dialog-overlay\" :class=\"{opened: data !== null}\">\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>\nimport eventbus from \"../js/eventbus\";\n\nexport default {\n\tname: \"ConfirmDialog\",\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\tcallback: null,\n\t\t};\n\t},\n\tmounted() {\n\t\teventbus.on(\"escapekey\", this.close);\n\t\teventbus.on(\"confirm-dialog\", this.open);\n\t},\n\tdestroyed() {\n\t\teventbus.off(\"escapekey\", this.close);\n\t\teventbus.off(\"confirm-dialog\", this.open);\n\t},\n\tmethods: {\n\t\topen(data, callback) {\n\t\t\tthis.data = data;\n\t\t\tthis.callback = callback;\n\t\t},\n\t\tclose(result) {\n\t\t\tthis.data = null;\n\n\t\t\tif (this.callback) {\n\t\t\t\tthis.callback(!!result);\n\t\t\t}\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>\n\t\t\t\t<div :key=\"message.msgId\" :class=\"['msg', message.type]\">\n\t\t\t\t\t<div class=\"mentions-info\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<span class=\"from\">\n\t\t\t\t\t\t\t\t<Username :user=\"message.from\" />\n\t\t\t\t\t\t\t\t<template v-if=\"message.channel\">\n\t\t\t\t\t\t\t\t\tin {{ message.channel.channel.name }} 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>\n\t\t\t\t\t\t\t</span>\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) }}\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 :network=\"null\" :message=\"message\" />\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>\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\";\n\ndayjs.extend(relativeTime);\n\nexport default {\n\tname: \"Mentions\",\n\tcomponents: {\n\t\tUsername,\n\t\tParsedMessage,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisOpen: false,\n\t\t\tisLoading: false,\n\t\t};\n\t},\n\tcomputed: {\n\t\tresolvedMessages() {\n\t\t\tconst messages = this.$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 = this.$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\t},\n\twatch: {\n\t\t\"$store.state.mentions\"() {\n\t\t\tthis.isLoading = false;\n\t\t},\n\t},\n\tmounted() {\n\t\teventbus.on(\"mentions:toggle\", this.togglePopup);\n\t\teventbus.on(\"escapekey\", this.closePopup);\n\t},\n\tdestroyed() {\n\t\teventbus.off(\"mentions:toggle\", this.togglePopup);\n\t\teventbus.off(\"escapekey\", this.closePopup);\n\t},\n\tmethods: {\n\t\tmessageTime(time) {\n\t\t\treturn dayjs(time).fromNow();\n\t\t},\n\t\tdismissMention(message) {\n\t\t\tthis.$store.state.mentions.splice(\n\t\t\t\tthis.$store.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\t\tdismissAllMentions() {\n\t\t\tthis.$store.state.mentions = [];\n\t\t\tsocket.emit(\"mentions:dismiss_all\");\n\t\t},\n\t\tcontainerClick(event) {\n\t\t\tif (event.currentTarget === event.target) {\n\t\t\t\tthis.isOpen = false;\n\t\t\t}\n\t\t},\n\t\ttogglePopup() {\n\t\t\tthis.isOpen = !this.isOpen;\n\n\t\t\tif (this.isOpen) {\n\t\t\t\tthis.isLoading = true;\n\t\t\t\tsocket.emit(\"mentions:get\");\n\t\t\t}\n\t\t},\n\t\tclosePopup() {\n\t\t\tthis.isOpen = false;\n\t\t},\n\t},\n};\n</script>\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 v-if=\"config.lockNetwork && $store.state.serverConfiguration.public\">\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=\"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=\"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=\"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=\"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=\"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=\"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=\"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=\"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=\"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<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=\"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>\nimport RevealPassword from \"./RevealPassword.vue\";\nimport SidebarToggle from \"./SidebarToggle.vue\";\n\nexport default {\n\tname: \"NetworkForm\",\n\tcomponents: {\n\t\tRevealPassword,\n\t\tSidebarToggle,\n\t},\n\tprops: {\n\t\thandleSubmit: Function,\n\t\tdefaults: Object,\n\t\tdisabled: Boolean,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tconfig: this.$store.state.serverConfiguration,\n\t\t\tpreviousUsername: this.defaults.username,\n\t\t\tdisplayPasswordField: false,\n\t\t};\n\t},\n\twatch: {\n\t\tdisplayPasswordField(value) {\n\t\t\tif (value) {\n\t\t\t\tthis.$nextTick(() => this.$refs.publicPassword.focus());\n\t\t\t}\n\t\t},\n\t\t\"defaults.commands\"() {\n\t\t\tthis.$nextTick(this.resizeCommandsInput);\n\t\t},\n\t\t\"defaults.tls\"(isSecureChecked) {\n\t\t\tconst ports = [6667, 6697];\n\t\t\tconst newPort = isSecureChecked ? 0 : 1;\n\n\t\t\t// If you disable TLS and current port is 6697,\n\t\t\t// set it to 6667, and vice versa\n\t\t\tif (this.defaults.port === ports[newPort]) {\n\t\t\t\tthis.defaults.port = ports[1 - newPort];\n\t\t\t}\n\t\t},\n\t},\n\tmethods: {\n\t\tsetSaslAuth(type) {\n\t\t\tthis.defaults.sasl = type;\n\t\t},\n\t\tonNickChanged(event) {\n\t\t\t// Username input is not available when useHexIp is set\n\t\t\tif (!this.$refs.usernameInput) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!this.$refs.usernameInput.value ||\n\t\t\t\tthis.$refs.usernameInput.value === this.previousUsername\n\t\t\t) {\n\t\t\t\tthis.$refs.usernameInput.value = event.target.value;\n\t\t\t}\n\n\t\t\tthis.previousUsername = event.target.value;\n\t\t},\n\t\tonSubmit(event) {\n\t\t\tconst formData = new FormData(event.target);\n\t\t\tconst data = {};\n\n\t\t\tfor (const item of formData.entries()) {\n\t\t\t\tdata[item[0]] = item[1];\n\t\t\t}\n\n\t\t\tthis.handleSubmit(data);\n\t\t},\n\t\tresizeCommandsInput() {\n\t\t\tif (!this.$refs.commandsInput) {\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\tthis.$refs.commandsInput.style.height = \"\";\n\n\t\t\t// 2 pixels to account for the border\n\t\t\tthis.$refs.commandsInput.style.height =\n\t\t\t\tMath.ceil(this.$refs.commandsInput.scrollHeight + 2) + \"px\";\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>\nimport localetime from \"../js/helpers/localetime\";\nimport Auth from \"../js/auth\";\nimport socket from \"../js/socket\";\n\nexport default {\n\tname: \"Session\",\n\tprops: {\n\t\tsession: Object,\n\t},\n\tcomputed: {\n\t\tlastUse() {\n\t\t\treturn localetime(this.session.lastUse);\n\t\t},\n\t},\n\tmethods: {\n\t\tsignOut() {\n\t\t\tif (!this.session.current) {\n\t\t\t\tsocket.emit(\"sign-out\", this.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\t},\n};\n</script>\n","<template>\n\t<div id=\"settings\" class=\"window\" role=\"tabpanel\" aria-label=\"Settings\">\n\t\t<div class=\"header\">\n\t\t\t<SidebarToggle />\n\t\t</div>\n\t\t<form\n\t\t\tref=\"settingsForm\"\n\t\t\tclass=\"container\"\n\t\t\tautocomplete=\"off\"\n\t\t\t@change=\"onChange\"\n\t\t\t@submit.prevent\n\t\t>\n\t\t\t<h1 class=\"title\">Settings</h1>\n\n\t\t\t<div>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.advanced\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"advanced\"\n\t\t\t\t\t/>\n\t\t\t\t\tAdvanced settings\n\t\t\t\t</label>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"canRegisterProtocol || hasInstallPromptEvent\">\n\t\t\t\t<h2>Native app</h2>\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"hasInstallPromptEvent\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"btn\"\n\t\t\t\t\t@click.prevent=\"nativeInstallPrompt\"\n\t\t\t\t>\n\t\t\t\t\tAdd The Lounge to Home screen\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"canRegisterProtocol\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"btn\"\n\t\t\t\t\t@click.prevent=\"registerProtocol\"\n\t\t\t\t>\n\t\t\t\t\tOpen irc:// URLs with The Lounge\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"!$store.state.serverConfiguration.public && $store.state.settings.advanced\">\n\t\t\t\t<h2>Settings synchronisation</h2>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.syncSettings\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"syncSettings\"\n\t\t\t\t\t/>\n\t\t\t\t\tSynchronize settings with other clients\n\t\t\t\t</label>\n\t\t\t\t<template v-if=\"!$store.state.settings.syncSettings\">\n\t\t\t\t\t<div v-if=\"$store.state.serverHasSettings\" class=\"settings-sync-panel\">\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<strong>Warning:</strong> Checking this box will override the settings\n\t\t\t\t\t\t\tof this client with those stored on the server.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\tUse the button below to enable synchronization, and override any\n\t\t\t\t\t\t\tsettings already synced to the server.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<button type=\"button\" class=\"btn btn-small\" @click=\"onForceSyncClick\">\n\t\t\t\t\t\t\tSync settings and enable\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-else class=\"settings-sync-panel\">\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<strong>Warning:</strong> No settings have been synced before. Enabling\n\t\t\t\t\t\t\tthis will sync all settings of this client as the base for other\n\t\t\t\t\t\t\tclients.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t</div>\n\n\t\t\t<h2>Messages</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.motd\" type=\"checkbox\" name=\"motd\" />\n\t\t\t\t\tShow <abbr title=\"Message Of The Day\">MOTD</abbr>\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\n\t\t\t\t\t\t:checked=\"$store.state.settings.showSeconds\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"showSeconds\"\n\t\t\t\t\t/>\n\t\t\t\t\tInclude seconds in timestamp\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\n\t\t\t\t\t\t:checked=\"$store.state.settings.use12hClock\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"use12hClock\"\n\t\t\t\t\t/>\n\t\t\t\t\tUse 12-hour timestamps\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t\t<div v-if=\"!$store.state.serverConfiguration.public && $store.state.settings.advanced\">\n\t\t\t\t<h2>Automatic away message</h2>\n\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<label for=\"awayMessage\" class=\"sr-only\">Automatic away message</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"awayMessage\"\n\t\t\t\t\t\t:value=\"$store.state.settings.awayMessage\"\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tname=\"awayMessage\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tplaceholder=\"Away message if The Lounge is not open\"\n\t\t\t\t\t/>\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t\t<h2 id=\"label-status-messages\">\n\t\t\t\tStatus messages\n\t\t\t\t<span\n\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\taria-label=\"Joins, parts, quits, kicks, nick changes, and mode changes\"\n\t\t\t\t>\n\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t</span>\n\t\t\t</h2>\n\t\t\t<div role=\"group\" aria-labelledby=\"label-status-messages\">\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.statusMessages === 'shown'\"\n\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\tname=\"statusMessages\"\n\t\t\t\t\t\tvalue=\"shown\"\n\t\t\t\t\t/>\n\t\t\t\t\tShow all status messages individually\n\t\t\t\t</label>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.statusMessages === 'condensed'\"\n\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\tname=\"statusMessages\"\n\t\t\t\t\t\tvalue=\"condensed\"\n\t\t\t\t\t/>\n\t\t\t\t\tCondense status messages together\n\t\t\t\t</label>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.statusMessages === 'hidden'\"\n\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\tname=\"statusMessages\"\n\t\t\t\t\t\tvalue=\"hidden\"\n\t\t\t\t\t/>\n\t\t\t\t\tHide all status messages\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t\t<h2>Visual Aids</h2>\n\t\t\t<div>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.coloredNicks\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"coloredNicks\"\n\t\t\t\t\t/>\n\t\t\t\t\tEnable colored nicknames\n\t\t\t\t</label>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.autocomplete\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"autocomplete\"\n\t\t\t\t\t/>\n\t\t\t\t\tEnable autocomplete\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t\t<div v-if=\"$store.state.settings.advanced\">\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<label for=\"nickPostfix\" class=\"opt\">\n\t\t\t\t\t\tNick autocomplete postfix\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\t\taria-label=\"Nick autocomplete postfix (for example a comma)\"\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<input\n\t\t\t\t\t\tid=\"nickPostfix\"\n\t\t\t\t\t\t:value=\"$store.state.settings.nickPostfix\"\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tname=\"nickPostfix\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tplaceholder=\"Nick autocomplete postfix (e.g. ', ')\"\n\t\t\t\t\t/>\n\t\t\t\t</label>\n\t\t\t</div>\n\n\t\t\t<h2>Theme</h2>\n\t\t\t<div>\n\t\t\t\t<label for=\"theme-select\" class=\"sr-only\">Theme</label>\n\t\t\t\t<select\n\t\t\t\t\tid=\"theme-select\"\n\t\t\t\t\t:value=\"$store.state.settings.theme\"\n\t\t\t\t\tname=\"theme\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t>\n\t\t\t\t\t<option\n\t\t\t\t\t\tv-for=\"theme in $store.state.serverConfiguration.themes\"\n\t\t\t\t\t\t:key=\"theme.name\"\n\t\t\t\t\t\t:value=\"theme.name\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ theme.displayName }}\n\t\t\t\t\t</option>\n\t\t\t\t</select>\n\t\t\t</div>\n\n\t\t\t<template v-if=\"$store.state.serverConfiguration.prefetch\">\n\t\t\t\t<h2>Link previews</h2>\n\t\t\t\t<div>\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=\"$store.state.settings.media\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tname=\"media\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tAuto-expand media\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t\t<div>\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=\"$store.state.settings.links\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tname=\"links\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tAuto-expand websites\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<div\n\t\t\t\tv-if=\"$store.state.settings.advanced && $store.state.serverConfiguration.fileUpload\"\n\t\t\t>\n\t\t\t\t<h2>File uploads</h2>\n\t\t\t\t<div>\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=\"$store.state.settings.uploadCanvas\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tname=\"uploadCanvas\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tAttempt to remove metadata from images before uploading\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\t\taria-label=\"This option renders the image into a canvas element to remove metadata from the image.\nThis may break orientation if your browser does not support that.\"\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</div>\n\t\t\t</div>\n\n\t\t\t<template v-if=\"!$store.state.serverConfiguration.public\">\n\t\t\t\t<h2>Push Notifications</h2>\n\t\t\t\t<div>\n\t\t\t\t\t<button\n\t\t\t\t\t\tid=\"pushNotifications\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"btn\"\n\t\t\t\t\t\t:disabled=\"\n\t\t\t\t\t\t\t$store.state.pushNotificationState !== 'supported' &&\n\t\t\t\t\t\t\t$store.state.pushNotificationState !== 'subscribed'\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t@click=\"onPushButtonClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template v-if=\"$store.state.pushNotificationState === 'subscribed'\">\n\t\t\t\t\t\t\tUnsubscribe from push notifications\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-else-if=\"$store.state.pushNotificationState === 'loading'\">\n\t\t\t\t\t\t\tLoading…\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-else> Subscribe to push notifications </template>\n\t\t\t\t\t</button>\n\t\t\t\t\t<div v-if=\"$store.state.pushNotificationState === 'nohttps'\" class=\"error\">\n\t\t\t\t\t\t<strong>Warning</strong>: Push notifications are only supported over HTTPS\n\t\t\t\t\t\tconnections.\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-if=\"$store.state.pushNotificationState === 'unsupported'\" class=\"error\">\n\t\t\t\t\t\t<strong>Warning</strong>:\n\t\t\t\t\t\t<span>Push notifications are not supported by your browser.</span>\n\n\t\t\t\t\t\t<div v-if=\"isIOS\" class=\"apple-push-unsupported\">\n\t\t\t\t\t\t\tSafari does\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref=\"https://bugs.webkit.org/show_bug.cgi?id=182566\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t\t>not support the web push notification specification</a\n\t\t\t\t\t\t\t>, and because all browsers on iOS use Safari under the hood, The Lounge\n\t\t\t\t\t\t\tis unable to provide push notifications on iOS devices.\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</template>\n\n\t\t\t<h2>Browser Notifications</h2>\n\t\t\t<div>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"desktopNotifications\"\n\t\t\t\t\t\t:checked=\"$store.state.settings.desktopNotifications\"\n\t\t\t\t\t\t:disabled=\"$store.state.desktopNotificationState === 'nohttps'\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"desktopNotifications\"\n\t\t\t\t\t/>\n\t\t\t\t\tEnable browser notifications<br />\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"$store.state.desktopNotificationState === 'unsupported'\"\n\t\t\t\t\t\tclass=\"error\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<strong>Warning</strong>: Notifications are not supported by your browser.\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"$store.state.desktopNotificationState === 'nohttps'\"\n\t\t\t\t\t\tid=\"warnBlockedDesktopNotifications\"\n\t\t\t\t\t\tclass=\"error\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<strong>Warning</strong>: Notifications are only supported over HTTPS\n\t\t\t\t\t\tconnections.\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"$store.state.desktopNotificationState === 'blocked'\"\n\t\t\t\t\t\tid=\"warnBlockedDesktopNotifications\"\n\t\t\t\t\t\tclass=\"error\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<strong>Warning</strong>: Notifications are blocked by your browser.\n\t\t\t\t\t</div>\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\n\t\t\t\t\t\t:checked=\"$store.state.settings.notification\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"notification\"\n\t\t\t\t\t/>\n\t\t\t\t\tEnable notification sound\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<div class=\"opt\">\n\t\t\t\t\t<button id=\"play\" @click.prevent=\"playNotification\">Play sound</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"$store.state.settings.advanced\">\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.notifyAllMessages\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"notifyAllMessages\"\n\t\t\t\t\t/>\n\t\t\t\t\tEnable notification for all messages\n\t\t\t\t</label>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"!$store.state.serverConfiguration.public && $store.state.settings.advanced\">\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<label for=\"highlights\" class=\"opt\">\n\t\t\t\t\t\tCustom highlights\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\t\taria-label=\"If a message contains any of these comma-separated \nexpressions, it will trigger a highlight.\"\n\t\t\t\t\t\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<input\n\t\t\t\t\t\tid=\"highlights\"\n\t\t\t\t\t\t:value=\"$store.state.settings.highlights\"\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tname=\"highlights\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\t\tplaceholder=\"Comma-separated, e.g.: word, some more words, anotherword\"\n\t\t\t\t\t/>\n\t\t\t\t</label>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"!$store.state.serverConfiguration.public && $store.state.settings.advanced\">\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<label for=\"highlightExceptions\" class=\"opt\">\n\t\t\t\t\t\tHighlight exceptions\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\t\taria-label=\"If a message contains any of these comma-separated \nexpressions, it will not trigger a highlight even if it contains \nyour nickname or expressions defined in custom highlights.\"\n\t\t\t\t\t\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<input\n\t\t\t\t\t\tid=\"highlightExceptions\"\n\t\t\t\t\t\t:value=\"$store.state.settings.highlightExceptions\"\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tname=\"highlightExceptions\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\t\tplaceholder=\"Comma-separated, e.g.: word, some more words, anotherword\"\n\t\t\t\t\t/>\n\t\t\t\t</label>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-if=\"\n\t\t\t\t\t!$store.state.serverConfiguration.public &&\n\t\t\t\t\t!$store.state.serverConfiguration.ldapEnabled\n\t\t\t\t\"\n\t\t\t\tid=\"change-password\"\n\t\t\t\trole=\"group\"\n\t\t\t\taria-labelledby=\"label-change-password\"\n\t\t\t>\n\t\t\t\t<h2 id=\"label-change-password\">Change password</h2>\n\t\t\t\t<div class=\"password-container\">\n\t\t\t\t\t<label for=\"current-password\" class=\"sr-only\"> Enter current password </label>\n\t\t\t\t\t<RevealPassword v-slot:default=\"slotProps\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"current-password\"\n\t\t\t\t\t\t\tautocomplete=\"current-password\"\n\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\tname=\"old_password\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\tplaceholder=\"Enter current password\"\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=\"password-container\">\n\t\t\t\t\t<label for=\"new-password\" class=\"sr-only\"> Enter desired new password </label>\n\t\t\t\t\t<RevealPassword v-slot:default=\"slotProps\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"new-password\"\n\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\tname=\"new_password\"\n\t\t\t\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\tplaceholder=\"Enter desired new password\"\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=\"password-container\">\n\t\t\t\t\t<label for=\"new-password-verify\" class=\"sr-only\"> Repeat new password </label>\n\t\t\t\t\t<RevealPassword v-slot:default=\"slotProps\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"new-password-verify\"\n\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\tname=\"verify_password\"\n\t\t\t\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\tplaceholder=\"Repeat new password\"\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\n\t\t\t\t\tv-if=\"passwordChangeStatus && passwordChangeStatus.success\"\n\t\t\t\t\tclass=\"feedback success\"\n\t\t\t\t>\n\t\t\t\t\tSuccessfully updated your password\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tv-else-if=\"passwordChangeStatus && passwordChangeStatus.error\"\n\t\t\t\t\tclass=\"feedback error\"\n\t\t\t\t>\n\t\t\t\t\t{{ passwordErrors[passwordChangeStatus.error] }}\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<button type=\"submit\" class=\"btn\" @click.prevent=\"changePassword\">\n\t\t\t\t\t\tChange password\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"$store.state.settings.advanced\">\n\t\t\t\t<h2>Custom Stylesheet</h2>\n\t\t\t\t<label for=\"user-specified-css-input\" class=\"sr-only\">\n\t\t\t\t\tCustom stylesheet. You can override any style with CSS here.\n\t\t\t\t</label>\n\t\t\t\t<textarea\n\t\t\t\t\tid=\"user-specified-css-input\"\n\t\t\t\t\t:value=\"$store.state.settings.userStyles\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tname=\"userStyles\"\n\t\t\t\t\tplaceholder=\"/* You can override any style with CSS here */\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"!$store.state.serverConfiguration.public\" class=\"session-list\" role=\"group\">\n\t\t\t\t<h2>Sessions</h2>\n\n\t\t\t\t<h3>Current session</h3>\n\t\t\t\t<Session v-if=\"currentSession\" :session=\"currentSession\" />\n\n\t\t\t\t<template v-if=\"activeSessions.length > 0\">\n\t\t\t\t\t<h3>Active sessions</h3>\n\t\t\t\t\t<Session\n\t\t\t\t\t\tv-for=\"session in activeSessions\"\n\t\t\t\t\t\t:key=\"session.token\"\n\t\t\t\t\t\t:session=\"session\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\n\t\t\t\t<h3>Other sessions</h3>\n\t\t\t\t<p v-if=\"$store.state.sessions.length === 0\">Loading…</p>\n\t\t\t\t<p v-else-if=\"otherSessions.length === 0\">\n\t\t\t\t\t<em>You are not currently logged in to any other device.</em>\n\t\t\t\t</p>\n\t\t\t\t<Session\n\t\t\t\t\tv-for=\"session in otherSessions\"\n\t\t\t\t\tv-else\n\t\t\t\t\t:key=\"session.token\"\n\t\t\t\t\t:session=\"session\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</form>\n\t</div>\n</template>\n\n<style>\ntextarea#user-specified-css-input {\n\theight: 100px;\n}\n</style>\n\n<script>\nimport socket from \"../../js/socket\";\nimport webpush from \"../../js/webpush\";\nimport RevealPassword from \"../RevealPassword.vue\";\nimport Session from \"../Session.vue\";\nimport SidebarToggle from \"../SidebarToggle.vue\";\n\nlet installPromptEvent = null;\n\nwindow.addEventListener(\"beforeinstallprompt\", (e) => {\n\te.preventDefault();\n\tinstallPromptEvent = e;\n});\n\nexport default {\n\tname: \"Settings\",\n\tcomponents: {\n\t\tRevealPassword,\n\t\tSession,\n\t\tSidebarToggle,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tcanRegisterProtocol: false,\n\t\t\tpasswordChangeStatus: null,\n\t\t\tpasswordErrors: {\n\t\t\t\tmissing_fields: \"Please enter a new password\",\n\t\t\t\tpassword_mismatch: \"Both new password fields must match\",\n\t\t\t\tpassword_incorrect:\n\t\t\t\t\t\"The current password field does not match your account password\",\n\t\t\t\tupdate_failed: \"Failed to update your password\",\n\t\t\t},\n\t\t\tisIOS: navigator.platform.match(/(iPhone|iPod|iPad)/i) || false,\n\t\t};\n\t},\n\tcomputed: {\n\t\thasInstallPromptEvent() {\n\t\t\t// TODO: This doesn't hide the button after clicking\n\t\t\treturn installPromptEvent !== null;\n\t\t},\n\t\tcurrentSession() {\n\t\t\treturn this.$store.state.sessions.find((item) => item.current);\n\t\t},\n\t\tactiveSessions() {\n\t\t\treturn this.$store.state.sessions.filter((item) => !item.current && item.active > 0);\n\t\t},\n\t\totherSessions() {\n\t\t\treturn this.$store.state.sessions.filter((item) => !item.current && !item.active);\n\t\t},\n\t},\n\tmounted() {\n\t\tsocket.emit(\"sessions:get\");\n\n\t\t// Enable protocol handler registration if supported,\n\t\t// and the network configuration is not locked\n\t\tthis.canRegisterProtocol =\n\t\t\twindow.navigator.registerProtocolHandler &&\n\t\t\t!this.$store.state.serverConfiguration.lockNetwork;\n\t},\n\tmethods: {\n\t\tonChange(event) {\n\t\t\tconst ignore = [\"old_password\", \"new_password\", \"verify_password\"];\n\n\t\t\tconst name = event.target.name;\n\n\t\t\tif (ignore.includes(name)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet value;\n\n\t\t\tif (event.target.type === \"checkbox\") {\n\t\t\t\tvalue = event.target.checked;\n\t\t\t} else {\n\t\t\t\tvalue = event.target.value;\n\t\t\t}\n\n\t\t\tthis.$store.dispatch(\"settings/update\", {name, value, sync: true});\n\t\t},\n\t\tchangePassword() {\n\t\t\tconst allFields = new FormData(this.$refs.settingsForm);\n\t\t\tconst data = {\n\t\t\t\told_password: allFields.get(\"old_password\"),\n\t\t\t\tnew_password: allFields.get(\"new_password\"),\n\t\t\t\tverify_password: allFields.get(\"verify_password\"),\n\t\t\t};\n\n\t\t\tif (!data.old_password || !data.new_password || !data.verify_password) {\n\t\t\t\tthis.passwordChangeStatus = {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: \"missing_fields\",\n\t\t\t\t};\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (data.new_password !== data.verify_password) {\n\t\t\t\tthis.passwordChangeStatus = {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: \"password_mismatch\",\n\t\t\t\t};\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsocket.once(\"change-password\", (response) => {\n\t\t\t\tthis.passwordChangeStatus = response;\n\t\t\t});\n\n\t\t\tsocket.emit(\"change-password\", data);\n\t\t},\n\t\tonForceSyncClick() {\n\t\t\tthis.$store.dispatch(\"settings/syncAll\", true);\n\t\t\tthis.$store.dispatch(\"settings/update\", {\n\t\t\t\tname: \"syncSettings\",\n\t\t\t\tvalue: true,\n\t\t\t\tsync: true,\n\t\t\t});\n\t\t},\n\t\tregisterProtocol() {\n\t\t\tconst uri = document.location.origin + document.location.pathname + \"?uri=%s\";\n\n\t\t\twindow.navigator.registerProtocolHandler(\"irc\", uri, \"The Lounge\");\n\t\t\twindow.navigator.registerProtocolHandler(\"ircs\", uri, \"The Lounge\");\n\t\t},\n\t\tnativeInstallPrompt() {\n\t\t\tinstallPromptEvent.prompt();\n\t\t\tinstallPromptEvent = null;\n\t\t},\n\t\tplayNotification() {\n\t\t\tconst pop = new Audio();\n\t\t\tpop.src = \"audio/pop.wav\";\n\t\t\tpop.play();\n\t\t},\n\t\tonPushButtonClick() {\n\t\t\twebpush.togglePushSubscription();\n\t\t},\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>\nexport default {\n\tname: \"MessageSearchForm\",\n\tprops: {\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tsearchOpened: false,\n\t\t\tsearchInput: \"\",\n\t\t};\n\t},\n\tcomputed: {\n\t\tonSearchPage() {\n\t\t\treturn this.$route.name === \"SearchResults\";\n\t\t},\n\t},\n\twatch: {\n\t\t\"$route.query.q\"() {\n\t\t\tthis.searchInput = this.$route.query.q;\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.searchInput = this.$route.query.q;\n\t\tthis.searchOpened = this.onSearchPage;\n\n\t\tif (!this.searchInput && this.searchOpened) {\n\t\t\tthis.$refs.searchInputField.focus();\n\t\t}\n\t},\n\tmethods: {\n\t\tcloseSearch() {\n\t\t\tif (!this.onSearchPage) {\n\t\t\t\tthis.searchInput = \"\";\n\t\t\t\tthis.searchOpened = false;\n\t\t\t}\n\t\t},\n\t\ttoggleSearch() {\n\t\t\tif (this.searchOpened) {\n\t\t\t\tthis.$refs.searchInputField.blur();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.searchOpened = true;\n\t\t\tthis.$refs.searchInputField.focus();\n\t\t},\n\t\tsearchMessages(event) {\n\t\t\tevent.preventDefault();\n\n\t\t\tif (!this.searchInput) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.$router\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: this.channel.id,\n\t\t\t\t\t},\n\t\t\t\t\tquery: {\n\t\t\t\t\t\tq: this.searchInput,\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\tthis.$root.$emit(\"re-search\");\n\t\t\t\t\t}\n\t\t\t\t});\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'colored-nicks': $store.state.settings.coloredNicks,\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 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 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.messageSearchInProgress ||\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.messageSearchInProgress\">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.messageSearchInProgress && !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\tv-else\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<template v-for=\"(message, id) in messages\">\n\t\t\t\t\t\t\t\t<div :key=\"message.id\" class=\"result\" @:click=\"jump(message, id)\">\n\t\t\t\t\t\t\t\t\t<DateMarker\n\t\t\t\t\t\t\t\t\t\tv-if=\"shouldDisplayDateMarker(message, id)\"\n\t\t\t\t\t\t\t\t\t\t:key=\"message.date\"\n\t\t\t\t\t\t\t\t\t\t:message=\"message\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<Message\n\t\t\t\t\t\t\t\t\t\t:key=\"message.id\"\n\t\t\t\t\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t\t\t\t:message=\"message\"\n\t\t\t\t\t\t\t\t\t\t:data-id=\"message.id\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</template>\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>\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\";\n\nexport default {\n\tname: \"SearchResults\",\n\tcomponents: {\n\t\tSidebarToggle,\n\t\tMessage,\n\t\tDateMarker,\n\t\tMessageSearchForm,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\toffset: 0,\n\t\t\tmoreResultsAvailable: false,\n\t\t\toldScrollTop: 0,\n\t\t\toldChatHeight: 0,\n\t\t};\n\t},\n\tcomputed: {\n\t\tsearch() {\n\t\t\treturn this.$store.state.messageSearchResults;\n\t\t},\n\t\tmessages() {\n\t\t\tif (!this.search) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn this.search.results;\n\t\t},\n\t\tchan() {\n\t\t\tconst chanId = parseInt(this.$route.params.id, 10);\n\t\t\treturn this.$store.getters.findChannel(chanId);\n\t\t},\n\t\tnetwork() {\n\t\t\tif (!this.chan) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn this.chan.network;\n\t\t},\n\t\tchannel() {\n\t\t\tif (!this.chan) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn this.chan.channel;\n\t\t},\n\t},\n\twatch: {\n\t\t\"$route.params.id\"() {\n\t\t\tthis.doSearch();\n\t\t\tthis.setActiveChannel();\n\t\t},\n\t\t\"$route.query.q\"() {\n\t\t\tthis.doSearch();\n\t\t\tthis.setActiveChannel();\n\t\t},\n\t\tmessages() {\n\t\t\tthis.moreResultsAvailable = this.messages.length && !(this.messages.length % 100);\n\n\t\t\tif (!this.offset) {\n\t\t\t\tthis.jumpToBottom();\n\t\t\t} else {\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tconst currentChatHeight = this.$refs.chat.scrollHeight;\n\t\t\t\t\tthis.$refs.chat.scrollTop =\n\t\t\t\t\t\tthis.oldScrollTop + currentChatHeight - this.oldChatHeight;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.setActiveChannel();\n\t\tthis.doSearch();\n\n\t\teventbus.on(\"escapekey\", this.closeSearch);\n\t\tthis.$root.$on(\"re-search\", this.doSearch); // Enable MessageSearchForm to search for the same query again\n\t},\n\tbeforeDestroy() {\n\t\tthis.$root.$off(\"re-search\");\n\t},\n\tdestroyed() {\n\t\teventbus.off(\"escapekey\", this.closeSearch);\n\t},\n\tmethods: {\n\t\tsetActiveChannel() {\n\t\t\tthis.$store.commit(\"activeChannel\", this.chan);\n\t\t},\n\t\tcloseSearch() {\n\t\t\tthis.$root.switchToChannel(this.channel);\n\t\t},\n\t\tshouldDisplayDateMarker(message, id) {\n\t\t\tconst previousMessage = this.messages[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\t\tdoSearch() {\n\t\t\tthis.offset = 0;\n\t\t\tthis.$store.commit(\"messageSearchInProgress\", true);\n\n\t\t\tif (!this.offset) {\n\t\t\t\tthis.$store.commit(\"messageSearchResults\", null); // Only reset if not getting offset\n\t\t\t}\n\n\t\t\tsocket.emit(\"search\", {\n\t\t\t\tnetworkUuid: this.network.uuid,\n\t\t\t\tchannelName: this.channel.name,\n\t\t\t\tsearchTerm: this.$route.query.q,\n\t\t\t\toffset: this.offset,\n\t\t\t});\n\t\t},\n\t\tonShowMoreClick() {\n\t\t\tthis.offset += 100;\n\t\t\tthis.$store.commit(\"messageSearchInProgress\", true);\n\n\t\t\tthis.oldScrollTop = this.$refs.chat.scrollTop;\n\t\t\tthis.oldChatHeight = this.$refs.chat.scrollHeight;\n\n\t\t\tsocket.emit(\"search\", {\n\t\t\t\tnetworkUuid: this.network.uuid,\n\t\t\t\tchannelName: this.channel.name,\n\t\t\t\tsearchTerm: this.$route.query.q,\n\t\t\t\toffset: this.offset + 1,\n\t\t\t});\n\t\t},\n\t\tjumpToBottom() {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tconst el = this.$refs.chat;\n\t\t\t\tel.scrollTop = el.scrollHeight;\n\t\t\t});\n\t\t},\n\t\tjump(message, id) {\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\tthis.$router.push({\n\t\t\t\tname: \"MessageList\",\n\t\t\t\tparams: {\n\t\t\t\t\tid: this.chan.id,\n\t\t\t\t},\n\t\t\t\tquery: {\n\t\t\t\t\tfocused: id,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t},\n};\n</script>\n"],"names":[],"sourceRoot":""}
@@ -1,41 +0,0 @@
1
- * {box-sizing: border-box}
2
-
3
- /* Style the tab */
4
- .tab {
5
- border: 1px solid #ccc;
6
- background-color: #f1f1f1;
7
- height: 450px;
8
- }
9
-
10
- /* Style the buttons inside the tab */
11
- .tab div {
12
- display: block;
13
- background-color: inherit;
14
- color: black;
15
- padding: 10px;
16
- width: 100%;
17
- border: none;
18
- outline: none;
19
- text-align: left;
20
- cursor: pointer;
21
- transition: 0.3s;
22
- font-size: 17px;
23
- }
24
-
25
- /* Change background color of buttons on hover */
26
- .tab div:hover {
27
- background-color: #ddd;
28
- }
29
-
30
- /* Create an active/current "tab button" class */
31
- .tab div.active {
32
- background-color: #ccc;
33
- }
34
-
35
- /* Style the tab content */
36
- .tabcontent {
37
- border: 1px solid #ccc;
38
- height: 450px;
39
- overflow-y: scroll;
40
- background-color: #CCCCCC;
41
- }