1 line
152 KiB
Plaintext
1 line
152 KiB
Plaintext
{"version":3,"sources":["webpack:///node_modules/normalize.css/normalize.css","webpack:///client/css/fontawesome.css","webpack:///node_modules/primer-tooltips/build/build.css","webpack:///client/css/style.css","webpack:///client/components/NetworkList.vue","webpack:///client/components/ConfirmDialog.vue","webpack:///client/components/Mentions.vue","webpack:///client/components/NetworkForm.vue","webpack:///client/components/Session.vue","webpack:///client/components/Windows/Settings.vue"],"names":[],"mappings":"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CC,kBAAmB,CACnB,WAAY,CACZ,aAAc,CACd,iBACD,CAEA,wBACC,UAAwB,CAAxB,uBAAwB,CACxB,QAAS,CACT,eAAgB,CAChB,YAAa,CACb,SAAU,CAEV,2BAAmB,CACnB,UACD,CAEA,uBACC,WAAY,CACZ,aAAc,CACd,iBAAkB,CAClB,mBAAoB,CACpB,UAAW,CACX,kBAAmB,CACnB,oBAAqB,CACrB,2BAA4B,CAC5B,gCACD,CAEA,mBACC,aAAc,CACd,eAAgB,CAChB,cAAe,CACf,kBACD,CAEA,iBACC,kBACD,CAEA,wBACC,eAAkC,CAAlC,iCAAkC,CAClC,aAA8B,CAA9B,6BAA8B,CAC9B,aAAc,CACd,eAAiB,CACjB,eAAgB,CAChB,gBAAiB,CACjB,uBAAgB,CAAhB,eAAgB,CAChB,KACD,CAEA,8BACC,gBACD,CAEA,8BACC,wBACD,CAEA,2BACC,mBACD,CAEA,gCACC,wBACD,CAEA,8BACC,gBACD,CAEA,+BACC,eACD,CAEA,+BACC,wBACD,CAEA,SACC,YAAa,CACb,cAAe,CACf,WACD,CAEA,iBACC,WAAe,CACf,YAAa,CACb,qBACD,CAEA,WACC,eACD,CAEA,8BAEC,iBACD,CAEA,iBACC,YAAa,CACb,cACD,CAEA,aACC,eAAgB,CAChB,kBACD,CAEA,wEAGC,aAAc,CACd,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,qBACD,CAEA,0BACC,WACD,CAEA,+CAEC,YACD,CAEA,eACC,aAAc,CACd,eAAgB,CAChB,UACD,CAEA,cACC,eACD,CAEA,gBACC,aAAc,CACd,cAAe,CACf,UACD,CAEA,sBACC,YACD,CAEA,+DAEC,WACD,CAEA,eACC,SAAU,CACV,aAAc,CACd,eACD,CAEA,cACC,UAAW,CACX,aAAc,CACd,cACD,CAEA,oBACC,mBACD,CAEA,eACC,SACD,CAEA,eACC,SACD,CAEA,wBACC,QAAS,CACT,iBAAkB,CAClB,oBACD,CAEA,cACC,eAAgB,CAChB,UACD,CAEA,iEAEC,YAAa,CACb,kBAAmB,CACnB,iBAAkB,CAClB,wBAAyB,CACzB,aACD,CAEA,4CACC,eACD,CAEA,oCACC,aAAc,CACd,oBAAqB,CACrB,eACD,CAEA,oFAEC,wBAAyB,CACzB,UACD,CAEA,qFAEC,uCACD,CAEA,oCACC,aAAc,CACd,yBACD,CAEA,eACC,aAAc,CACd,qBACD,CAEA,qBACC,gBACD,CAEA,2CAEC,WACD,CAEA,yBACC,cACD,CAEA,gBACC,cAAe,CACf,sBAAwB,CACxB,aAAkC,CAAlC,iCACD,CAEA,sBACC,UACD,CAEA,sEAEC,iBACD,CAEA,kCACC,aACD,CAEA,oCACC,aACD,CAEA,iBACC,aAAc,CACd,eACD,CAEA,oBACC,iBACD,CAEA,0BACC,kBACD,CAEA,6BACC,UACD,CAEA,8CACC,QACD,CAEA,qCACC,iBAAkB,CAClB,OAAQ,CACR,OAAQ,CACR,uBAAgB,CAAhB,oBAAgB,CAAhB,eACD,CAEA,0CACC,4CAA6C,CAC7C,cAAe,CACf,aAAc,CACd,UAAW,CACX,WAAY,CACZ,YAAa,CACb,sBAAuB,CACvB,kBAAmB,CACnB,cACD,CAEA,iDACC,eACD,CAEA,yCACC,eACD,CAEA,yDACC,eAAgB,CAChB,aACD,CAEA,0BACC,YAAa,CACb,6BACD,CAEA,iBACC,iBAAkB,CAClB,cACD,CAEA,wDAEC,kBAAmB,CACnB,mBACD,CAEA,0BACC,kBAAmB,CACnB,kBACD,CAEA,gCACC,eACD,CAEA,OACC,YAAa,CACb,8CAAuC,CAAvC,sCAAuC,CACvC,QACD,CAEA,UACC,mBAAoB,CACpB,iBACD,CAEA,UACC,mBACD,CAEA,gBACC,eACD,CAEA,kBACC,kBACD,CAEA,qBACC,cAAe,CACf,uBAAqC,CACrC,aAAkC,CAAlC,iCAAkC,CAClC,kBAAmB,CACnB,kBACD,CAEA,uBAKC,eACD,CAEA,iBACC,YAAa,CACb,kBAAmB,CACnB,YAAa,CACb,kBAAmB,CACnB,iBAAkB,CAClB,yCACD,CAEA,2CAEC,eACD,CAEA,mBACC,MAAO,CACP,eAAgB,CAChB,kBACD,CAEA,wBACC,eAAgB,CAChB,iBAAkB,CAClB,eACD,CAEA,yBACC,wBAAyB,CACzB,aACD,CAEA,gCACC,eACD,CAEA,2DAEC,aAAc,CACd,wBACD,CAEA,yEAEC,eACD,CAEA,uBACC,aAAc,CACd,wBACD,CAEA,8BACC,eACD,CAEA,4BACC,wBAAyB,CACzB,aACD,CAEA,mCACC,eACD,CAEA,oBACC,kBAA2C,CAA3C,0CAA2C,CAC3C,2BAAoD,CAApD,mDAAoD,CACpD,OAAS,CACT,UAAW,CACX,iBAAkB,CAClB,iBAAkB,CAClB,QAAS,CACT,MACD,CAEA,+CACC,kBAAmB,CACnB,gCACD,CAEA,MACC,aAAc,CACd,QAAS,CACT,4BAA6B,CAC7B,eAAgB,CAChB,QAAS,CACT,WAAY,CACZ,eAAiB,CACjB,YAAa,CACb,oBAAqB,CACrB,iBACD,CAEA,oBACC,cAAe,CACf,eAAgB,CAChB,eAAgB,CAChB,YAAa,CACb,gBAAiB,CACjB,wBAAyB,CACzB,kBAAmB,CACnB,UAAW,CACX,iBAAkB,CAClB,cACD,CAEA,YACC,kBAAmB,CACnB,UAAW,CACX,cAAe,CACf,UAAW,CACX,gBAAiB,CACjB,aAAc,CACd,iBAAkB,CAClB,YACD,CAEA,oBACC,aACD,CAEA,aACC,sBAAuB,CACvB,WAAY,CACZ,YAAa,CACb,eAAgB,CAChB,WAAY,CACZ,eAAgB,CAChB,gBAAiB,CACjB,YAAa,CACb,UAAW,CACX,SAAU,CACV,WAAY,CACZ,aAAc,CACd,iBAAkB,CAClB,kBACD,CAEA,oBACC,YACD,CAEA,4BAEC,aAAc,CACd,cAAe,CACf,WAAY,CACZ,UAAW,CACX,aACD,CAEA,gDAEC,UACD,CAEA,kDAEC,iBAAkB,CAClB,KAAM,CACN,MAAO,CACP,UAAW,CACX,WAAY,CACZ,YAAa,CACb,sBACD,CAEA,iDAGC,iBAAkB,CAClB,eAAgB,CAChB,QAAS,CACT,aAAc,CACd,eAAgB,CAChB,cAAe,CACf,qBAAsB,CACtB,qCAA0C,CAC1C,gCAAqC,CACrC,iBAAkB,CAClB,SACD,CAEA,sBACC,UAAW,CACX,YAAa,CACb,+BACD,CAEA,sCAEC,cAAe,CACf,aAAc,CACd,eAAgB,CAChB,UAAW,CACX,cAAe,CACf,iBAAkB,CAClB,eAAgB,CAChB,iBAAkB,CAClB,kBACD,CAEA,oIAKC,+BACD,CAEA,oDAEC,UAAW,CACX,oBACD,CAEA,qBACC,UACD,CAEA,2BACC,oBACD,CAEA,OACC,eAAgB,CAChB,uBAAwB,CACxB,aACD,CAEA,0BACC,UAAW,CACX,iBACD,CAEA,2BACC,aACD,CAMA,SAAW,UAAa,CACxB,SAAW,UAAa,CACxB,SAAW,aAAgB,CAC3B,SAAW,aAAgB,CAC3B,SAAW,aAAgB,CAC3B,SAAW,aAAgB,CAC3B,SAAW,aAAgB,CAC3B,SAAW,aAAgB,CAC3B,SAAW,aAAgB,CAC3B,SAAW,aAAgB,CAC3B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,UAAa,CACzB,SAAW,eAAkB,CAC7B,SAAW,eAAkB,CAC7B,SAAW,kBAAqB,CAChC,SAAW,kBAAqB,CAChC,SAAW,kBAAqB,CAChC,SAAW,kBAAqB,CAChC,SAAW,kBAAqB,CAChC,SAAW,kBAAqB,CAChC,SAAW,kBAAqB,CAChC,SAAW,kBAAqB,CAChC,UAAY,kBAAqB,CACjC,UAAY,kBAAqB,CACjC,UAAY,kBAAqB,CACjC,UAAY,kBAAqB,CACjC,UAAY,eAAkB,CAC9B,UAAY,eAAkB,CAG9B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,SAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,oBAAwB,CACpC,UAAY,wBAA2B,CACvC,UAAY,qBAAwB,CACpC,UAAY,wBAA2B,CACvC,UAAY,qBAAwB,CACpC,UAAY,wBAA2B,CACvC,UAAY,qBAAwB,CACpC,UAAY,wBAA2B,CACvC,UAAY,qBAAwB,CACpC,UAAY,wBAA2B,CACvC,UAAY,qBAAwB,CACpC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,qBAAwB,CACpC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,qBAAwB,CACpC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,qBAAwB,CAEpC,UACC,eACD,CAEA,eACC,yBACD,CAEA,mBACC,4BACD,CAEA,iCACC,sCACD,CAEA,YACC,iBACD,CAEA,kBACC,cACD,CAEA,yBAEC,YACC,iBAAkB,CAClB,gEAA6D,CAA7D,wDACD,CACD,CAEA,yBASC,mEAEC,iBAAkB,CAClB,SACD,CAEA,yBACC,cACD,CAEA,wKAWC,cACD,CAEA,SACC,YAAa,CACb,kBAAgC,CAAhC,+BAAgC,CAChC,WAAY,CACZ,iBAAkB,CAClB,WAAY,CACZ,UAAW,CACX,yBAA2B,CAC3B,uBACD,CAEA,iBACC,cAAe,CACf,KAAM,CACN,QAAS,CACT,MAAO,CACP,OAAQ,CACR,yBAAmC,CAAnC,kCAAmC,CACnC,SAAU,CACV,iBAAkB,CAClB,uCAA2C,CAC3C,SACD,CAEA,qCACC,SACD,CAEA,6BACC,gCACD,CAEA,0EAEC,eACD,CAEA,8DAEC,oCACD,CAEA,8EAEC,kBACD,CAGA,cACC,iBACD,CAEA,gBACC,qBAAwC,CAAxC,uCAAwC,CACxC,WAAY,CACZ,iBAAkB,CAClB,OAAQ,CACR,2BAA4B,CAC5B,wBACD,CAEA,wCACC,uBACD,CAEA,qBACC,gBACD,CAEA,6BACC,eAAgB,CAChB,eACD,CACD,CAEA,yBACC,WACC,cAAe,CACf,QACD,CAEA,cACC,UACD,CAEA,OACC,iBACD,CAEA,sBACC,qBACD,CAEA,+DAEC,WACD,CAEA,0BACC,qBACD,CAEA,gBACC,aAAc,CACd,aACD,CAEA,WACC,aAAc,CACd,gBACD,CAEA,qCACC,aACD,CAEA,uCAGC,QAAS,CACT,cAAe,CACf,SACD,CAEA,kBAEC,WAAY,CACZ,eACD,CAEA,mDACC,gBACD,CAEA,yDACC,cACD,CAEA,8DAEC,YACD,CAEA,0BACC,oBAAqB,CACrB,kBACD,CAEA,8BACC,aACD,CACD,CAEA,oBACC,SAAU,CACV,4BACD,CAEA,0BACC,gCACD,CAEA,mCACC,yBAA8B,CAC9B,mBACD,CAEA,0CACC,yBACD,CAIA,uGAMC,YAAa,CACb,qBAAsB,CACtB,kBAAmB,CACnB,sBACD,CAEA,sDAGC,cAAe,CACf,KAAM,CACN,QAAS,CACT,MAAO,CACP,OAAQ,CACR,yBAAmC,CAAnC,kCAAmC,CACnC,iBAAkB,CAClB,SAAU,CACV,qCAAyC,CACzC,WAAY,CACZ,wBAAiB,CAAjB,qBAAiB,CAAjB,oBAAiB,CAAjB,gBACD,CAEA,gFAGC,kBAAmB,CACnB,SACD,CAEA,sCAEC,yBACD,CAEA,iHAIC,cAAe,CACf,KAAM,CACN,SAAU,CACV,cAAe,CACf,UAAY,CACZ,UAAY,CACZ,sBACD,CAEA,yBACC,OAAQ,CACR,UAAW,CACX,YACD,CAEA,gCACC,WACD,CAEA,wBACC,OAAQ,CACR,QAAS,CACT,QAAS,CACT,UAAW,CACX,YACD,CAEA,gEAEC,QAAS,CACT,YACD,CAEA,kCACC,MACD,CAEA,8BACC,OACD,CAEA,2GAGC,SACD,CAEA,kBACC,mBAAY,CAAZ,WAAY,CACZ,iBAAkB,CAClB,wBAAyB,CAGzB,iCAAmC,CACnC,yBAA0B,CAC1B,sJAGD,CAKA,4RAUC,oBACD,C;ACnqFA,eACA,WACA,iBACA,CAEA,sBACA,SACA,WACA,SACA,WACA,oCACA,kBACA,CAEA,6CACA,yBACA,CAFA,mCACA,yBACA,CAEA,sBACA,gBACA,0BACA,kBACA,UACA,MACA,SACA,oBACA,0BACA,CAEA,iBACA,SACA,UACA,gBACA,aACA,CAEA,6BACA,gBACA,iBACA,CAEA,2CACA,cACA,CAEA,oGAEA,YACA,CAEA,qDACA,gBACA,CAEA,4DACA,eACA,C;ACrKA,gBACA,gCACA,WACA,YACA,kBACA,eACA,CAEA,8BACA,aACA,oFACA,CAEA,oCACA,eACA,gBACA,kBACA,CAEA,iCACA,aACA,yBACA,aACA,yBACA,CAEA,sCACA,gBACA,gBACA,CAEA,6CACA,wBACA,C;ACSA,0BACA,SACA,CAEA,gBACA,wCACA,kBACA,YACA,WACA,SACA,iBACA,gBACA,UACA,YACA,CAEA,sCACA,aACA,8BACA,mBACA,cACA,CAEA,+BACA,aACA,6BACA,CAEA,qBACA,mBACA,oFACA,CAEA,gCACA,eACA,CAEA,8BACA,2CACA,kBACA,YACA,eACA,qBACA,qBACA,CAEA,iCACA,eACA,gBACA,qBACA,iBACA,kBACA,WACA,CAEA,gCACA,uBACA,CAEA,mCACA,SACA,eACA,CAEA,0BACA,gBACA,eACA,CACA,CAEA,yBACA,gBACA,gBACA,SACA,gBACA,WACA,gBACA,QACA,OACA,SACA,QACA,CACA,C;ACwLA,uBACA,cACA,kBACA,CAEA,4BACA,cACA,UACA,CAEA,6BACA,mBACA,CAEA,gCACA,aACA,kBACA,yBACA,aACA,CAEA,oCACA,SACA,oFACA,C;AClUA,4BACA,aACA,cACA,CAEA,iCACA,aACA,sBACA,WACA,CAEA,gCACA,aACA,CAEA,6BACA,kBACA,6BACA,C;ACidA,kCACA,YACA,C","file":"css/style.css","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: rgba(0, 0, 0, 0.5);\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: rgba(0, 107, 59, 0.5);\n\n\t/* Color of the unread message marker, text and separator */\n\t--unread-marker-color: rgba(231, 76, 60, 0.5);\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: rgba(0, 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\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.42857143;\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, rgba(0, 0, 0, 0.05), 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 rgba(132, 206, 136, 0.5);\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;\n}\n\n/* Icons */\n\n#viewport .lt::before,\n#viewport .rt::before,\n#chat button.mentions::before,\n#chat button.menu::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=\"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\"] .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#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\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-kick::before { content: \"\\f05e\"; /* http://fontawesome.io/icon/ban/ */ }\n.context-menu-action-op::before { content: \"\\f1fa\"; /* http://fontawesome.io/icon/at/ */ }\n.context-menu-action-voice::before { content: \"\\f067\"; /* http://fontawesome.io/icon/plus/ */ }\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\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 { content: \"\\f075\"; /* https://fontawesome.com/icons/comment?style=solid */ }\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 { content: \"\\f304\"; /* https://fontawesome.com/icons/pen?style=solid */ }\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=\"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\"] .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.menu {\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.menu::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: rgba(48, 62, 74, 0.5); /* #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.channel-list-item.ui-sortable-dragged,\n.ui-sortable-dragged .channel-list-item,\n.ui-sortable-active .channel-list-item:hover,\n.ui-sortable-active .channel-list-item.active {\n\tbackground: transparent;\n}\n\n.ui-sortable-ghost::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#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::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: rgba(255, 255, 255, 0.06);\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: 0;\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}\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\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-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-left: auto;\n\tmargin-right: auto;\n\tmargin-top: 5px;\n\tmargin-bottom: 5px;\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 rgba(0, 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=\"notice\"] .content,\n#chat .msg[data-type=\"notice\"] .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=\"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 rgba(0, 0, 0, 0.2);\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\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\tmargin: 3px 10px 0 0;\n}\n\n#connect\\:host {\n\twidth: 70%;\n}\n\n#connect\\:port {\n\twidth: 25%;\n}\n\n#connect\\:portseparator {\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 rgba(0, 123, 255, 0.5);\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: normal normal normal 14px/1 FontAwesome;\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 .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.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 rgba(0, 0, 0, 0.15);\n\tborder: 1px solid rgba(0, 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: rgba(0, 0, 0, 0.1);\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: rgba(0, 0, 0, 0.1);\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 rgba(0, 0, 0, 0.5);\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}\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: rgba(0, 0, 0, 0);\n}\n\n::-webkit-scrollbar:hover {\n\tbackground-color: rgba(0, 0, 0, 0.09);\n}\n\n::-webkit-scrollbar-thumb:vertical {\n\tbackground: rgba(0, 0, 0, 0.5);\n\tborder-radius: 100px;\n}\n\n::-webkit-scrollbar-thumb:vertical:active {\n\tbackground: rgba(0, 0, 0, 0.6);\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: rgba(0, 0, 0, 0.9);\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%, rgba(0, 0, 0, 0) 25%, rgba(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","<template>\n\t<div v-if=\"$store.state.networks.length === 0\" class=\"empty\">\n\t\tYou are not connected to any networks yet.\n\t</div>\n\t<div v-else ref=\"networklist\">\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:filter=\"isCurrentlyInTouch\"\n\t\t\t:prevent-on-filter=\"false\"\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-dragged\"\n\t\t\tgroup=\"networks\"\n\t\t\tclass=\"networks\"\n\t\t\t@change=\"onNetworkSort\"\n\t\t\t@start=\"onDragStart\"\n\t\t\t@end=\"onDragEnd\"\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>\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-dragged\"\n\t\t\t\t\t:group=\"network.uuid\"\n\t\t\t\t\t:filter=\"isCurrentlyInTouch\"\n\t\t\t\t\t:prevent-on-filter=\"false\"\n\t\t\t\t\t:list=\"network.channels\"\n\t\t\t\t\tclass=\"channels\"\n\t\t\t\t\t@change=\"onChannelSort\"\n\t\t\t\t\t@start=\"onDragStart\"\n\t\t\t\t\t@end=\"onDragEnd\"\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}\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\";\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\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\tisCurrentlyInTouch(e) {\n\t\t\t// TODO: Implement a way to sort on touch devices\n\t\t\treturn e.pointerType !== \"mouse\";\n\t\t},\n\t\tonDragStart(e) {\n\t\t\te.target.classList.add(\"ui-sortable-active\");\n\t\t},\n\t\tonDragEnd(e) {\n\t\t\te.target.classList.remove(\"ui-sortable-active\");\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\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 hide-all-mentions\"\n\t\t\t\t\t@click=\"hideAllMentions()\"\n\t\t\t\t>\n\t\t\t\t\tHide 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 class=\"close-tooltip tooltipped tooltipped-w\" aria-label=\"Close\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"msg-hide\"\n\t\t\t\t\t\t\t\t\taria-label=\"Hide this mention\"\n\t\t\t\t\t\t\t\t\t@click=\"hideMention(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-hide::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-hide:hover {\n\tcolor: var(--link-color);\n}\n\n.mentions-popup .hide-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;\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.openPopup);\n\t},\n\tdestroyed() {\n\t\teventbus.off(\"mentions:toggle\", this.openPopup);\n\t},\n\tmethods: {\n\t\tmessageTime(time) {\n\t\t\treturn dayjs(time).fromNow();\n\t\t},\n\t\thideMention(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:hide\", message.msgId);\n\t\t},\n\t\thideAllMentions() {\n\t\t\tthis.$store.state.mentions = [];\n\t\t\tsocket.emit(\"mentions:hide_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\topenPopup() {\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},\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\tWelcome\n\t\t\t\t\t<template v-if=\"config.lockNetwork && $store.state.serverConfiguration.public\">\n\t\t\t\t\t\tto the {{ defaults.name }} Web Chat\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\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></h2>\n\t\t\t<div class=\"connect-row\">\n\t\t\t\t<label for=\"connect:nick\">Nickname</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<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\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\">Rooms</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 am already registered\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=\"Your Passwort Goes here\"\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 ref=\"settingsForm\" class=\"container\" @change=\"onChange\" @submit.prevent>\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\tShow 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\tShow 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=\"sr-only\">\n\t\t\t\t\t\tNick autocomplete postfix (for example a comma)\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\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 === '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\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\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=\"old_password_input\" 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=\"old_password_input\"\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_input\" class=\"sr-only\">\n\t\t\t\t\t\tEnter desired new password\n\t\t\t\t\t</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_input\"\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\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=\"verify_password_input\" 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=\"verify_password_input\"\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\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"],"sourceRoot":""} |