diff --git a/conf/config.js b/conf/config.js index 941b05c..6057240 100644 --- a/conf/config.js +++ b/conf/config.js @@ -1,261 +1,371 @@ +"use strict"; + module.exports = { - // - // Set the server mode. - // Public servers does not require authentication. - // - // Set to 'false' to enable users. - // - // @type boolean - // @default false - // - public: false, + // + // Set the server mode. + // Public servers does not require authentication. + // + // Set to 'false' to enable users. + // + // @type boolean + // @default true + // + public: false, - // - // Allow connections from this host. - // - // @type string - // @default "0.0.0.0" - // - host: "127.0.0.1", + // + // IP address or hostname for the web server to listen on. + // Setting this to undefined will listen on all interfaces. + // + // @type string + // @default undefined + // + host: "127.0.0.1", - // - // Set the port to listen on. - // - // @type int - // @default 9000 - // - port: 9191, + // + // Set the port to listen on. + // + // @type int + // @default 9000 + // + port: 9191, - // - // Set the local IP to bind to. - // - // @type string - // @default "0.0.0.0" - // - bind: undefined, + // + // Set the local IP to bind to for outgoing connections. Leave to undefined + // to let the operating system pick its preferred one. + // + // @type string + // @default undefined + // + bind: undefined, - // - // Set the default theme. - // - // @type string - // @default "themes/example.css" - // - theme: "themes/example.css", + // + // Sets whether the server is behind a reverse proxy and should honor the + // X-Forwarded-For header or not. + // + // @type boolean + // @default false + // + reverseProxy: true, - // - // Autoload users - // - // When this setting is enabled, your 'users/' folder will be monitored. This is useful - // if you want to add/remove users while the server is running. - // - // @type boolean - // @default true - // - autoload: true, + // + // Set the default theme. + // + // @type string + // @default "themes/example.css" + // + theme: "themes/morning.css", - // - // Prefetch URLs - // - // If enabled, Shout will try to load thumbnails and site descriptions from - // URLs posted in channels. - // - // @type boolean - // @default true - // - prefetch: true, + // + // Autoload users + // + // When this setting is enabled, your 'users/' folder will be monitored. This is useful + // if you want to add/remove users while the server is running. + // + // @type boolean + // @default true + // + autoload: true, - // Serving path - // - // The path at which shout is available. - // For example if you set this to /chat, - // shout will be available at http://0.0.0.0:9000/chat - // - // @type string - // @default "/" - // - rootpath: "PATHTOCHANGE", + // + // Prefetch URLs + // + // If enabled, The Lounge will try to load thumbnails and site descriptions from + // URLs posted in channels. + // + // @type boolean + // @default false + // + prefetch: true, - // - // Display network - // - // If set to false Shout will not expose network settings in login - // form, limiting client to connect to the configured network. - // - // @type boolean - // @default true - // - displayNetwork: true, + // + // Prefetch URLs Image Preview size limit + // + // If prefetch is enabled, The Lounge will only display content under the maximum size. + // Default value is 512 (in kB) + // + // @type int + // @default 512 + // + prefetchMaxImageSize: 512, - // - // Log settings - // - // Logging has to be enabled per user. If enabled, logs will be stored in - // the '/users//logs/' folder. - // - // @type object - // @default {} - // - logs: { - // - // Timestamp format - // - // @type string - // @default "YYYY-MM-DD HH:mm:ss" - // - format: "YYYY-MM-DD HH:mm:ss", + // + // Display network + // + // If set to false network settings will not be shown in the login form. + // + // @type boolean + // @default true + // + displayNetwork: true, - // - // Timezone - // - // @type string - // @default "UTC+00:00" - // - timezone: "UTC+00:00" - }, + // + // Lock network + // + // If set to true, users will not be able to modify host, port and tls + // settings and will be limited to the configured network. + // + // @type boolean + // @default false + // + lockNetwork: false, - // - // Default values for the 'Connect' form. - // - // @type object - // @default {} - // - defaults: { - // - // Name - // - // @type string - // @default "Freenode" - // - name: "Freenode", + // + // WEBIRC support + // + // If enabled, The Lounge will pass the connecting user's host and IP to the + // IRC server. Note that this requires to obtain a password from the IRC network + // The Lounge will be connecting to and generally involves a lot of trust from the + // network you are connecting to. + // + // Format (standard): {"irc.example.net": "hunter1", "irc.example.org": "passw0rd"} + // Format (function): + // {"irc.example.net": function(client, args, trusted) { + // // here, we return a webirc object fed directly to `irc-framework` + // return {username: "thelounge", password: "hunter1", address: args.ip, hostname: "webirc/"+args.hostname}; + // }} + // + // @type string | function(client, args):object(webirc) + // @default null + webirc: null, - // - // Host - // - // @type string - // @default "irc.freenode.org" - // - host: "irc.freenode.org", + // + // Log settings + // + // Logging has to be enabled per user. If enabled, logs will be stored in + // the 'logs///' folder. + // + // @type object + // @default {} + // + logs: { + // + // Timestamp format + // + // @type string + // @default "YYYY-MM-DD HH:mm:ss" + // + format: "YYYY-MM-DD HH:mm:ss", - // - // Port - // - // @type int - // @default 6697 - // - port: 6697, + // + // Timezone + // + // @type string + // @default "UTC+00:00" + // + timezone: "UTC+00:00" + }, - // - // Password - // - // @type string - // @default "" - // - password: "", + // + // Maximum number of history lines per channel + // + // Defines the maximum number of history lines that will be kept in + // memory per channel/query, in order to reduce the memory usage of + // the server. Negative means unlimited. + // + // @type integer + // @default -1 + maxHistory: -1, - // - // Enable TLS/SSL - // - // @type boolean - // @default true - // - tls: true, + // + // Default values for the 'Connect' form. + // + // @type object + // @default {} + // + defaults: { + // + // Name + // + // @type string + // @default "Freenode" + // + name: "Freenode", - // - // Nick - // - // @type string - // @default "shout-user" - // - nick: "shout-user", + // + // Host + // + // @type string + // @default "chat.freenode.net" + // + host: "chat.freenode.net", - // - // Username - // - // @type string - // @default "shout-user" - // - username: "shout-user", + // + // Port + // + // @type int + // @default 6697 + // + port: 6697, - // - // Real Name - // - // @type string - // @default "Shout User" - // - realname: "Shout User", + // + // Password + // + // @type string + // @default "" + // + password: "", - // - // Channels - // - // @type string - // @default "#foo, #shout-irc" - // - join: "#foo, #shout-irc" - }, + // + // Enable TLS/SSL + // + // @type boolean + // @default true + // + tls: true, - // - // Set socket.io transports - // - // @type array - // @default ["polling', "websocket"] - // - transports: ["polling", "websocket"], + // + // Nick + // + // @type string + // @default "lounge-user" + // + nick: "lounge-user", - // - // Run Shout with HTTPS support. - // - // @type object - // @default {} - // - https: { - // - // Enable HTTPS support. - // - // @type boolean - // @default false - // - enable: false, + // + // Username + // + // @type string + // @default "lounge-user" + // + username: "lounge-user", - // - // Path to the key. - // - // @type string - // @example "sslcert/key.pem" - // @default "" - // - key: "", + // + // Real Name + // + // @type string + // @default "The Lounge User" + // + realname: "The Lounge User", - // - // Path to the certificate. - // - // @type string - // @example "sslcert/key-cert.pem" - // @default "" - // - certificate: "" - }, + // + // Channels + // This is a comma-separated list. + // + // @type string + // @default "#thelounge" + // + join: "#thelounge" + }, - // - // Run Shout with identd support. - // - // @type object - // @default {} - // - identd: { - // - // Run the identd daemon on server start. - // - // @type boolean - // @default false - // - enable: false, + // + // Set socket.io transports + // + // @type array + // @default ["polling", "websocket"] + // + transports: ["polling", "websocket"], - // - // Port to listen for ident requests. - // - // @type int - // @default 113 - // - port: 113 - } + // + // Run The Lounge using encrypted HTTP/2. + // This will fallback to regular HTTPS if HTTP/2 is not supported. + // + // @type object + // @default {} + // + https: { + // + // Enable HTTP/2 / HTTPS support. + // + // @type boolean + // @default false + // + enable: false, + + // + // Path to the key. + // + // @type string + // @example "sslcert/key.pem" + // @default "" + // + key: "", + + // + // Path to the certificate. + // + // @type string + // @example "sslcert/key-cert.pem" + // @default "" + // + certificate: "" + }, + + // + // Run The Lounge with identd support. + // + // @type object + // @default {} + // + identd: { + // + // Run the identd daemon on server start. + // + // @type boolean + // @default false + // + enable: false, + + // + // Port to listen for ident requests. + // + // @type int + // @default 113 + // + port: 113 + }, + + // + // Enable oidentd support using the specified file + // + // Example: oidentd: "~/.oidentd.conf", + // + // @type string + // @default null + // + oidentd: null, + + // + // LDAP authentication settings (only available if public=false) + // @type object + // @default {} + // + ldap: { + // + // Enable LDAP user authentication + // + // @type boolean + // @default false + // + enable: true, + + // + // LDAP server URL + // + // @type string + // + url: "ldap://127.0.0.1", + + // + // LDAP base dn + // + // @type string + // + baseDN: "ou=users,dc=yunohost,dc=org", + + // + // LDAP primary key + // + // @type string + // @default "uid" + // + primaryKey: "uid" + }, + + // Enables extra debugging output. Turn this on if you experience + // IRC connection issues and want to file a bug report. + // + // @type boolean + // @default false + // + debug: false, }; diff --git a/conf/nginx.conf b/conf/nginx.conf index 294ba0f..9d5cf70 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -2,14 +2,16 @@ location LOCATIONTOCHANGE { if ($scheme = http) { rewrite ^ https://$server_name$request_uri? permanent; } - proxy_pass http://127.0.0.1:9191LOCATIONTOCHANGE; + proxy_pass http://localhost:9191/; proxy_http_version 1.1; + proxy_set_header Connection "upgrade"; proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_cache_bypass $http_upgrade; + proxy_set_header X-Forwarded-For $remote_addr; - # Include SSOWAT user panel. +# by default nginx times out connections in one minute + proxy_read_timeout 1d; + +# Include SSOWAT user panel. include conf.d/yunohost_panel.conf.inc; more_clear_input_headers 'Accept-Encoding'; } diff --git a/conf/systemd.service b/conf/systemd.service index 29cdea0..950669b 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -1,10 +1,10 @@ [Service] -ExecStart=/usr/bin/node /var/www/shout/index.js +ExecStart=/usr/bin/node /var/www/thelounge/index.js Restart=always StandardOutput=syslog StandardError=syslog -SyslogIdentifier=shout -User=shout +SyslogIdentifier=thelounge +User=thelounge Environment=NODE_ENV=production [Install] diff --git a/manifest.json b/manifest.json index dd9ce77..be59dad 100644 --- a/manifest.json +++ b/manifest.json @@ -1,13 +1,13 @@ { - "name": "Shout", - "id": "shout", + "name": "The Lounge", + "id": "thelounge", "description": { "en": "Web IRC client", "fr": "Client Web IRC" }, "maintainer": { - "name": "kload", - "email": "kload@kload.fr" + "name": "beudbeud", + "email": "beudbeud@beudibox.fr" }, "multi_instance": "false", "arguments": { @@ -16,8 +16,8 @@ "name": "domain", "type": "domain", "ask": { - "en": "Choose a domain for Shout", - "fr": "Choisissez un domaine pour Shout" + "en": "Choose a domain for The Lounge", + "fr": "Choisissez un domaine pour The Lounge" }, "example": "domain.org" }, @@ -25,8 +25,8 @@ "name": "path", "type": "path", "ask": { - "en": "Choose a path for Shout", - "fr": "Choisissez un chemin pour Shout" + "en": "Choose a path for The Lounge", + "fr": "Choisissez un chemin pour The Lounge" }, "example": "/irc", "default": "/irc" diff --git a/scripts/install b/scripts/install index 53cbd66..376168c 100644 --- a/scripts/install +++ b/scripts/install @@ -6,24 +6,18 @@ set -e domain=$1 path=$2 is_public=$3 -final_path=/var/www/shout - -# Ensure that it is installed on Debian Jessie -VERSION=$(sed 's/\..*//' /etc/debian_version) -if [[ "$VERSION" == '7' ]]; then - echo "You need at least Debian 8 (Jessie) to run this app" && exit 1 -fi +final_path=/var/www/thelounge # Check domain/path availability -sudo yunohost app checkurl $domain$path -a shout +sudo yunohost app checkurl $domain$path -a thelounge path=${path%/} # Install dependencies sudo apt-get update -sudo apt-get install nodejs-legacy npm -y +sudo apt-get install nodejs -y # Create user -sudo useradd -d $final_path shout \ +sudo useradd -d $final_path thelounge\ || echo "User already created" # Modify the random username @@ -32,19 +26,19 @@ sed -i "s@USERTOCHANGE@$user@g" ../conf/user.json sed -i "s@PATHTOCHANGE@$path/@g" ../conf/config.js # HACK: Change the socket.io path in the sources -sed -i "s@PATHTOCHANGE@$path@g" ../sources/client/js/shout.js +sed -i "s@PATHTOCHANGE@$path@g" ../sources/client/js/lounge.js # Copy files to the right place -sudo mkdir -p $final_path/.shout/users -sudo cp ../conf/config.js $final_path/.shout/ -sudo cp ../conf/user.json $final_path/.shout/users/$user.json +sudo mkdir -p $final_path/.lounge/users +sudo cp ../conf/config.js $final_path/.lounge/ +sudo cp ../conf/user.json $final_path/.lounge/users/$user.json sudo cp -a ../sources/* $final_path/ # Set permissions -sudo chown -hR shout $final_path +sudo chown -hR thelounge $final_path # Install dependencies -sudo su -c "cd $final_path && /usr/bin/npm install --production" shout +sudo su - thelounge -c "cd $final_path && /usr/bin/npm install" # Modify Nginx configuration file and copy it to Nginx conf directory if [[ "$path" == "" ]]; then @@ -52,23 +46,23 @@ if [[ "$path" == "" ]]; then else sed -i "s@LOCATIONTOCHANGE@$path@g" ../conf/nginx.conf fi -sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/shout.conf +sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/thelounge.conf # Copy systemd service -sudo cp ../conf/systemd.service /etc/systemd/system/shout.service +sudo cp ../conf/systemd.service /etc/systemd/system/thelounge.service # Add YunoHost service -sudo yunohost service add shout -l /var/log/syslog +sudo yunohost service add thelounge -l /var/log/syslog # Make app public if necessary -sudo yunohost app setting shout is_public -v "$is_public" +sudo yunohost app setting thelounge is_public -v "$is_public" if [ "$is_public" = "Yes" ]; then - sudo yunohost app setting shout unprotected_uris -v "/" + sudo yunohost app setting thelounge unprotected_uris -v "/" fi -# Reload Nginx, shout and regenerate SSOwat conf +# Reload Nginx, thelounge and regenerate SSOwat conf sudo service nginx reload -sudo systemctl enable shout -sudo systemctl start shout || sudo systemctl restart shout +sudo systemctl enable thelounge +sudo systemctl start thelounge || sudo systemctl restart thelounge sudo yunohost app ssowatconf diff --git a/scripts/remove b/scripts/remove index 642c536..e8c3922 100644 --- a/scripts/remove +++ b/scripts/remove @@ -1,16 +1,16 @@ #!/bin/bash -domain=$(sudo yunohost app setting shout domain) +domain=$(sudo yunohost app setting thelounge domain) -sudo systemctl stop shout -sudo systemctl disable shout -sudo yunohost service remove shout +sudo systemctl stop thelounge +sudo systemctl disable thelounge +sudo yunohost service remove thelounge -sudo rm -rf /var/www/shout -sudo rm -f /etc/nginx/conf.d/$domain.d/shout.conf -sudo rm -f /etc/systemd/system/shout.service +sudo rm -rf /var/www/thelounge +sudo rm -f /etc/nginx/conf.d/$domain.d/thelounge.conf +sudo rm -f /etc/systemd/system/thelounge.service -sudo userdel shout +sudo userdel thelounge sudo service nginx reload sudo yunohost app ssowatconf diff --git a/scripts/upgrade b/scripts/upgrade index 0e4e933..a127a2b 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -3,28 +3,28 @@ set -e # Retrieve arguments -domain=$(sudo yunohost app setting shout domain) -path=$(sudo yunohost app setting shout path) -is_public=$(sudo yunohost app setting shout is_public) -final_path=/var/www/shout +domain=$(sudo yunohost app setting thelounge domain) +path=$(sudo yunohost app setting thelounge path) +is_public=$(sudo yunohost app setting thelounge is_public) +final_path=/var/www/thelounge # Remove trailing "/" from the path path=${path%/} # HACK: Change the socket.io path in the sources -sed -i "s@PATHTOCHANGE@$path@g" ../sources/client/js/shout.js +sed -i "s@PATHTOCHANGE@$path@g" ../sources/client/js/thelounge.js # Copy files to the right place -sudo mkdir -p $final_path/.shout/users +sudo mkdir -p $final_path/.thelounge/users sed -i "s@PATHTOCHANGE@$path/@g" ../conf/config.js -sudo cp ../conf/config.js $final_path/.shout/ +sudo cp ../conf/config.js $final_path/.thelounge/ sudo cp -a ../sources/* $final_path/ # Set permissions -sudo chown -hR shout $final_path +sudo chown -hR thelounge $final_path # Install dependencies -sudo su -c "cd $final_path && /usr/bin/npm install --production" shout +sudo su -c "cd $final_path && /usr/bin/npm install --production" thelounge # Modify Nginx configuration file and copy it to Nginx conf directory if [[ "$path" == "" ]]; then @@ -32,24 +32,24 @@ if [[ "$path" == "" ]]; then else sed -i "s@LOCATIONTOCHANGE@$path@g" ../conf/nginx.conf fi -sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/shout.conf +sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/thelounge.conf # Copy systemd service -sudo cp ../conf/systemd.service /etc/systemd/system/shout.service +sudo cp ../conf/systemd.service /etc/systemd/system/thelounge.service # Add YunoHost service -sudo yunohost service add shout -l /var/log/syslog \ +sudo yunohost service add thelounge -l /var/log/syslog \ || echo "Service already exist" # Make app public if necessary -sudo yunohost app setting shout is_public -v "$is_public" +sudo yunohost app setting thelounge is_public -v "$is_public" if [ "$is_public" = "Yes" ]; then - sudo yunohost app setting shout unprotected_uris -v "/" + sudo yunohost app setting thelounge unprotected_uris -v "/" fi -# Reload Nginx, shout and regenerate SSOwat conf +# Reload Nginx, thelounge and regenerate SSOwat conf sudo service nginx reload -sudo systemctl enable shout -sudo systemctl restart shout || sudo systemctl start shout +sudo systemctl enable thelounge +sudo systemctl restart thelounge || sudo systemctl start thelounge sudo yunohost app ssowatconf diff --git a/sources/CHANGELOG.md b/sources/CHANGELOG.md index 59ca5bd..775cec4 100644 --- a/sources/CHANGELOG.md +++ b/sources/CHANGELOG.md @@ -1,164 +1,808 @@ -0.51.1 / 2015-04-29 -=================== +# Change Log -* Increase process.setMaxListeners to prevent link preview to cause a crash +All notable changes to this project will be documented in this file. +This project adheres to [Semantic Versioning](http://semver.org/). -0.51.0 / 2015-04-16 -================== + -0.49.0 / 2014-12-23 -=================== +## v2.1.0 - 2016-10-17 - * Replaced superagent with request - * Solves a problem where some links would crash the server +[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.1...v2.1.0) -0.48.0 / 2014-12-12 -=================== +Here comes another release with some nice additions! - * Fetch max 1 link per message - * Fix '/me' message color - * Periodically hide older messages for inactive channels - * Only confirm exit in public mode - * Added '/ns' NickServ and '/cs' ChanServ shortcuts +While the administrators will notice some bug fixes, most of the changes are client-side: support for `/list`, a slideout menu on mobile, editing one's nick from the UI, wallops message handling. -0.47.0 / 2014-11-19 -=================== +Enjoy! - * Shout now supports fullscreen on iOS +### Added -0.46.0 / 2014-11-14 -=================== +- Implement `/list` ([#258](https://github.com/thelounge/lounge/pull/258) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Add touch slideout menu for mobile ([#400](https://github.com/thelounge/lounge/pull/400) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Display extra steps when loading the app ([#637](https://github.com/thelounge/lounge/pull/637) by [@xPaw](https://github.com/xPaw)) +- Display localized timestamp in title of message times ([#660](https://github.com/thelounge/lounge/pull/660) by [@astorije](https://github.com/astorije)) +- Changing nick in the UI ([#551](https://github.com/thelounge/lounge/pull/551) by [@astorije](https://github.com/astorije)) +- Add hostmasks in logs when possible ([#670](https://github.com/thelounge/lounge/pull/670) by [@astorije](https://github.com/astorije)) +- Display wallops in server window ([#658](https://github.com/thelounge/lounge/pull/658) by [@xPaw](https://github.com/xPaw)) - * Fix commands being removed from user.json - * Added dynamic title - * Turn off input autocomplete +### Changed -0.45.5 / 2014-11-05 -=================== +- Make use of multi-prefix cap and remove NAMES spam on mode changes ([#632](https://github.com/thelounge/lounge/pull/632) by [@xPaw](https://github.com/xPaw)) +- Strict mode for all JS files ([#684](https://github.com/thelounge/lounge/pull/684) by [@astorije](https://github.com/astorije)) +- Enforce more ESLint rules ([#681](https://github.com/thelounge/lounge/pull/681) by [@xPaw](https://github.com/xPaw)) +- Use CI caches for downloaded files instead of installed ones ([#687](https://github.com/thelounge/lounge/pull/687) by [@astorije](https://github.com/astorije)) +- Consolidate version numbers throughout all interfaces ([#592](https://github.com/thelounge/lounge/pull/592) by [@williamboman](https://github.com/williamboman)) +- Replace lodash's each/map with ES5 native forEach/map ([#689](https://github.com/thelounge/lounge/pull/689) by [@astorije](https://github.com/astorije)) - * Minor bugfixes +### Removed -0.45.4 / 2014-11-05 -=================== +- Remove all font files except WOFF ([#682](https://github.com/thelounge/lounge/pull/682) by [@xPaw](https://github.com/xPaw)) - * Added username input - * Added 'morning' theme by @rikukissa +### Fixed -0.45.3 / 2014-10-27 -=================== +- Themes: Fixed CSS rule selectors for highlight messages ([#652](https://github.com/thelounge/lounge/pull/652) by [@DamonGant](https://github.com/DamonGant)) +- Fix unhandled message color in default and Crypto themes ([#653](https://github.com/thelounge/lounge/pull/653) by [@MaxLeiter](https://github.com/MaxLeiter)) +- Check if SSL key and certificate files exist ([#673](https://github.com/thelounge/lounge/pull/673) by [@toXel](https://github.com/toXel)) +- Fix loading fonts in Microsoft Edge ([#683](https://github.com/thelounge/lounge/pull/683) by [@xPaw](https://github.com/xPaw)) +- Fill in prefixLookup on network initialization ([#647](https://github.com/thelounge/lounge/pull/647) by [@nornagon](https://github.com/nornagon)) +- Fix nick changes not being properly reported in the logs ([#685](https://github.com/thelounge/lounge/pull/685) by [@astorije](https://github.com/astorije)) +- Fix memory and reference shuffling when creating models ([#664](https://github.com/thelounge/lounge/pull/664) by [@xPaw](https://github.com/xPaw)) - * Remove password argument from add command - * Support MIRC style terminators - * Fix edit command - * Fix URLs preventing proper closure of bold and color tags - * Send NOTICE messages to the correct channel +## v2.0.1 - 2016-09-28 -0.45.2 / 2014-10-16 -=================== +[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0...v2.0.1) - * Fix crash on failed TLS connect - * Hide mode from badge count +This is a minor house-keeping release with mostly two sets of changes. -0.45.0 / 2014-10-14 -=================== +First, a few bugs were fixed, including one simply preventing The Lounge to run in Safari's private browsing. - * Added identd daemon - * Remember user networks and channels on restart - * Show link thumbnails - * Pull link description from meta tags - * Allow binding to local IP via `--bind ` - * Change 'users/' folder structure - * Change 'logs/' location +Additionally, the developer experience has been made a tiny bit better, with better documentation, lighter dependencies and simpler theme creation. -0.44.0 / 2014-10-11 -=================== +### Changed - * Added text color - * Added 'prefetch' option - * Added drag-and-drop tolerance - * Always show right toggle +- Add info on README about how to run from source, how to upgrade ([#621](https://github.com/thelounge/lounge/pull/621) by [@astorije](https://github.com/astorije)) +- Move uglify invocation into npm scripts and remove grunt ([#628](https://github.com/thelounge/lounge/pull/628) by [@nornagon](https://github.com/nornagon)) +- Move Shout theme borders to example theme ([#359](https://github.com/thelounge/lounge/pull/359) by [@xPaw](https://github.com/xPaw)) +- Update developer dependencies ([#639](https://github.com/thelounge/lounge/pull/639) by [@xPaw](https://github.com/xPaw)) -0.43.1 / 2014-10-09 -=================== +### Fixed - * Disable login button on authentication - * Fix 'shout edit' command +- Remove -ms-transform and add missed -webkit-transform ([#629](https://github.com/thelounge/lounge/pull/629) by [@xPaw](https://github.com/xPaw)) +- Ensure localStorage cannot fail because of quota or Safari private browsing ([#625](https://github.com/thelounge/lounge/pull/625) by [@astorije](https://github.com/astorije)) +- Disable pull-to-refresh on mobile that conflicts with scrolling the message list ([#618](https://github.com/thelounge/lounge/pull/618) by [@astorije](https://github.com/astorije)) +- Handle stderr when using edit or config command ([#622](https://github.com/thelounge/lounge/pull/622) by [@MaxLeiter](https://github.com/MaxLeiter)) -0.43.0 / 2014-10-08 -=================== +## v2.0.0 - 2016-09-24 - * Smarter nick completion - * Prevent multiple logins - * Fix highlight checking by lower-casing everything - * Allow relative '--home' path +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.5.0...v2.0.0) -0.42.0 / 2014-10-04 -=================== +After more than 5 months in the works, v2.0.0 is finally happening, and it's shipping with lots of new and enhanced features! 🎉 - * Split users by mode in the sidebar - * Show user mode in channel +First of all, the backend IRC library is completely different, which was the first step to deciding on a major release. +This change brings many improvements and fixes, including support for auto-reconnection! This also allows us to easily improve our [IRCv3 compliance](http://ircv3.net/software/clients.html#web-clients). -0.41.1 / 2014-10-03 -=================== +Main changes on the server include support for WEBIRC, oidentd and LDAP. On the client, users will notice a lot of improvements about reporting unseen activity (notifications, markers, etc.), support for custom highlights, a new loading page, an auto-expanding message input, a theme selector, and more. - * Now installs properly on Windows +Administrators should note that the channel list format in user configuration files has changed. The old format is deprecated, but it will be automatically converted when the server starts (support may or may not be removed later). Additionally, The Lounge now only runs on Node v4 and up. -0.41.0 / 2014-10-03 -=================== +The above is only a small subset of changes. A more detailed list can be found below. +The following list features the most noticeable changes only, and more details can be found on all [v2.0.0 pre-releases](https://www.github.com/thelounge/lounge/releases). - * Use 'bcrypt-nodejs' package - * No need to compile with node-gyp during install +### Added -0.40.3 / 2014-10-02 -=================== +- Add tooltips on every clickable icons ([#540](https://github.com/thelounge/lounge/pull/540) by [@astorije](https://github.com/astorije)) +- Add debug config option for `irc-framework` debug log ([#547](https://github.com/thelounge/lounge/pull/547) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Client-side theme selector ([#568](https://github.com/thelounge/lounge/pull/568) by [@astorije](https://github.com/astorije)) +- LDAP support ([#477](https://github.com/thelounge/lounge/pull/477) by [@thisisdarshan](https://github.com/thisisdarshan) and [@lindskogen](https://github.com/lindskogen)) +- Add custom highlights ([#425](https://github.com/thelounge/lounge/pull/425) by [@YaManicKill](https://github.com/YaManicKill)) +- Add auto-grow textarea support ([#379](https://github.com/thelounge/lounge/pull/379) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Display unhandled numerics on the client ([#286](https://github.com/thelounge/lounge/pull/286) by [@xPaw](https://github.com/xPaw)) +- A proper unread marker ([#332](https://github.com/thelounge/lounge/pull/332) by [@xPaw](https://github.com/xPaw)) +- Add information on the About section of the client ([#497](https://github.com/thelounge/lounge/pull/497) by [@astorije](https://github.com/astorije)) +- Add a red dot to the mobile menu icon when being notified ([#486](https://github.com/thelounge/lounge/pull/486) by [@astorije](https://github.com/astorije)) +- Add "The Lounge" label to the landing pages ([#487](https://github.com/thelounge/lounge/pull/487) by [@astorije](https://github.com/astorije)) +- Display network name on Connect page when network is locked and info is hidden ([#488](https://github.com/thelounge/lounge/pull/488) by [@astorije](https://github.com/astorije)) +- Display a loading message instead of blank page ([#386](https://github.com/thelounge/lounge/pull/386) by [@xPaw](https://github.com/xPaw)) +- Fall back to LOUNGE_HOME env variable when using the CLI ([#402](https://github.com/thelounge/lounge/pull/402) by [@williamboman](https://github.com/williamboman)) +- Enable auto reconnection ([#254](https://github.com/thelounge/lounge/pull/254) by [@xPaw](https://github.com/xPaw)) +- Add "!" modechar for admin ([#354](https://github.com/thelounge/lounge/pull/354) by [@omnicons](https://github.com/omnicons)) +- Add support for oidentd spoofing ([#256](https://github.com/thelounge/lounge/pull/256) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Log enabled capabilities ([#272](https://github.com/thelounge/lounge/pull/272) by [@xPaw](https://github.com/xPaw)) +- Add support for `~` home folder expansion ([#284](https://github.com/thelounge/lounge/pull/284) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Document supported node version ([#280](https://github.com/thelounge/lounge/pull/280) by [@xPaw](https://github.com/xPaw)) +- Implement WEBIRC ([#240](https://github.com/thelounge/lounge/pull/240) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Add `manifest.json` for nicer mobile experience ([#310](https://github.com/thelounge/lounge/pull/310) by [@xPaw](https://github.com/xPaw)) - * Fix issue where actions from other users do not display +### Changed -0.40.2 / 2014-10-01 -=================== +- Cache loaded config and merge it with defaults ([#387](https://github.com/thelounge/lounge/pull/387) by [@xPaw](https://github.com/xPaw)) +- Ignore unnecessary files at release time ([#499](https://github.com/thelounge/lounge/pull/499) by [@astorije](https://github.com/astorije)) +- Improve font icon management, sizing and sharpness ([#493](https://github.com/thelounge/lounge/pull/493) by [@astorije](https://github.com/astorije)) +- Maintain scroll position after loading previous messages ([#496](https://github.com/thelounge/lounge/pull/496) by [@davibe](https://github.com/davibe)) +- Perform node version check as soon as possible ([#409](https://github.com/thelounge/lounge/pull/409) by [@xPaw](https://github.com/xPaw)) +- Prepend http protocol to www. links in chat ([#410](https://github.com/thelounge/lounge/pull/410) by [@xPaw](https://github.com/xPaw)) +- Change default configuration for `host` to allow OS to decide and use both IPv4 and IPv6 ([#432](https://github.com/thelounge/lounge/pull/432) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Do not hide timestamps on small viewports ([#376](https://github.com/thelounge/lounge/pull/376) by [@xPaw](https://github.com/xPaw)) +- Drop `slate-irc`, switch to `irc-framework` ([#167](https://github.com/thelounge/lounge/pull/167) by [@xPaw](https://github.com/xPaw)) +- Improve sticky scroll ([#262](https://github.com/thelounge/lounge/pull/262) by [@xPaw](https://github.com/xPaw)) +- Minor wording changes for better clarity ([#305](https://github.com/thelounge/lounge/pull/305) by [@astorije](https://github.com/astorije)) +- Improve nick highlights ([#327](https://github.com/thelounge/lounge/pull/327) by [@xPaw](https://github.com/xPaw)) +- CSS classes in themes for nick colors ([#325](https://github.com/thelounge/lounge/pull/325) by [@astorije](https://github.com/astorije)) +- Replace all concatenated paths with Node's path.join ([#307](https://github.com/thelounge/lounge/pull/307) by [@astorije](https://github.com/astorije)) - * Fix existsSync +### Deprecated -0.40.1 / 2014-10-01 -=================== +- Store channels in array format in user configuration files, deprecating previous format ([#417](https://github.com/thelounge/lounge/pull/417) by [@xPaw](https://github.com/xPaw)) - * Fix config overwrite +### Removed -0.40.0 / 2014-10-01 -=================== +- Disable tooltips on mobile to prevent them to stay after clicking ([#612](https://github.com/thelounge/lounge/pull/612) by [@astorije](https://github.com/astorije)) +- Remove Docker-related files now that we have a dedicated repository ([#288](https://github.com/thelounge/lounge/pull/288) by [@astorije](https://github.com/astorije)) +- Remove JavaScript scrollbar library ([#429](https://github.com/thelounge/lounge/pull/429) by [@xPaw](https://github.com/xPaw)) +- Remove navigator.standalone detection ([#427](https://github.com/thelounge/lounge/pull/427) by [@xPaw](https://github.com/xPaw)) +- Do not increase font size on highlight in morning theme ([#321](https://github.com/thelounge/lounge/pull/321) by [@xPaw](https://github.com/xPaw)) - * Prevent private mode when no user exists - * Move config to ~/.shout/ +### Fixed -0.39.1 / 2014-09-30 -=================== +- Remove font family redundancy, fix missed fonts, remove Open Sans ([#562](https://github.com/thelounge/lounge/pull/562) by [@astorije](https://github.com/astorije)) +- Stop propagation when hiding the chat through click/tapping the chat ([#455](https://github.com/thelounge/lounge/pull/455) by [@williamboman](https://github.com/williamboman)) +- Improve click handling on users and inline channels ([#366](https://github.com/thelounge/lounge/pull/366) by [@xPaw](https://github.com/xPaw)) +- Only load config if it exists ([#461](https://github.com/thelounge/lounge/pull/461) by [@xPaw](https://github.com/xPaw)) +- Send user to lobby of deleted chan when parting from active chan ([#489](https://github.com/thelounge/lounge/pull/489) by [@astorije](https://github.com/astorije)) +- Set title attribute on topic on initial page load ([#515](https://github.com/thelounge/lounge/pull/515) by [@williamboman](https://github.com/williamboman)) +- Save user's channels when they sort the channel list ([#401](https://github.com/thelounge/lounge/pull/401) by [@xPaw](https://github.com/xPaw)) +- Turn favicon red on page load if there are highlights ([#344](https://github.com/thelounge/lounge/pull/344) by [@xPaw](https://github.com/xPaw)) +- Keep chat stickied to the bottom on resize ([#346](https://github.com/thelounge/lounge/pull/346) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Only increase unread counter for whitelisted actions ([#273](https://github.com/thelounge/lounge/pull/273) by [@xPaw](https://github.com/xPaw)) +- Parse CTCP replies ([#278](https://github.com/thelounge/lounge/pull/278) by [@xPaw](https://github.com/xPaw)) +- Do not count your own messages as unread ([#279](https://github.com/thelounge/lounge/pull/279) by [@xPaw](https://github.com/xPaw)) +- Do not display incorrect nick when switching to a non connected network ([#252](https://github.com/thelounge/lounge/pull/252) by [@xPaw](https://github.com/xPaw)) +- Keep autocompletion sort whenever user list updates ([#217](https://github.com/thelounge/lounge/pull/217) by [@xPaw](https://github.com/xPaw)) +- Save user when parting channels ([#297](https://github.com/thelounge/lounge/pull/297) by [@xPaw](https://github.com/xPaw)) +- Add labels in connect window ([#300](https://github.com/thelounge/lounge/pull/300) by [@xPaw](https://github.com/xPaw)) +- Add missing `aria-label` on icon buttons ([#303](https://github.com/thelounge/lounge/pull/303) by [@astorije](https://github.com/astorije)) +- Fix missing colors in action messages ([#317](https://github.com/thelounge/lounge/pull/317) by [@astorije](https://github.com/astorije)) +- Don't falsely report failed write if it didn't fail ([`e6990e0`](https://github.com/thelounge/lounge/commit/e6990e0fc7641d18a5bcbabddca1aacf2254ae52) by [@xPaw](https://github.com/xPaw)) +- Fix sending messages starting with a space ([#320](https://github.com/thelounge/lounge/pull/320) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Fix notifications in query windows ([#334](https://github.com/thelounge/lounge/pull/334) by [@xPaw](https://github.com/xPaw)) - * Scrolling now works correctly when loading thumbnails - * List users on server start +### Security -0.39.0 / 2014-09-30 -=================== +- Implement user token persistency ([#370](https://github.com/thelounge/lounge/pull/370) by [@xPaw](https://github.com/xPaw)) +- Restrict access to the home directory by default ([#205](https://github.com/thelounge/lounge/pull/205) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Add security headers to minimize XSS damage ([#292](https://github.com/thelounge/lounge/pull/292) by [@xPaw](https://github.com/xPaw)) +- Do not write user configs outside of the app's users directory ([#238](https://github.com/thelounge/lounge/pull/238) by [@williamboman](https://github.com/williamboman)) +- Don't check for existing password emptiness ([#315](https://github.com/thelounge/lounge/pull/315) by [@maxpoulin64](https://github.com/maxpoulin64)) - * Added changelog - * Added colored nicknames (optional) +## v2.0.0-rc.2 - 2016-09-21 [Pre-release] + +[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0-rc.1...v2.0.0-rc.2) + +This release candidate only fixes a UI bug affecting iOS 8 users, introduced in v2.0.0-pre.5. + +### Fixed + +- Fix flexboxes to work on iOS 8 ([#626](https://github.com/thelounge/lounge/pull/626) by [@Gilles123](https://github.com/Gilles123)) + +## v2.0.0-rc.1 - 2016-09-17 [Pre-release] + +[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0-pre.7...v2.0.0-rc.1) + +Prior to this release, users of Safari 10 were not able to access The Lounge anymore, because of a conscious change the WebKit made to their support of CSP, as [explained here](https://webkit.org/blog/6830/a-refined-content-security-policy/). This release addresses this issue. + +Another notable change is the removal of tooltips on mobiles, as hovering states on mobile devices breaks in different kind of ways. Hopefully there will be a better solution in the future, or better support across mobiles. + +This is also the first release candidate for v2.0.0. This means only critical bug fixes will be merged before releasing v2.0.0. + +### Changed + +- Explicitly authorize websockets in CSP header ([#597](https://github.com/thelounge/lounge/pull/597) by [@astorije](https://github.com/astorije)) + +### Removed + +- Disable tooltips on mobile to prevent them to stay after clicking ([#612](https://github.com/thelounge/lounge/pull/612) by [@astorije](https://github.com/astorije)) + +### Fixed + +- Fix small input text on Morning and Zenburn ([#601](https://github.com/thelounge/lounge/pull/601) by [@astorije](https://github.com/astorije)) +- Fix a left margin appearing on all non-default themes ([#615](https://github.com/thelounge/lounge/pull/615) by [@astorije](https://github.com/astorije)) + +## v2.0.0-pre.7 - 2016-09-08 [Pre-release] + +[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0-pre.6...v2.0.0-pre.7) + +This prerelease fixes a lot of bugs on both the server and the client. It also adds a theme selector on the client and connection debug log level on the server. Additionally, custom highlights are now case-insensitive. + +### Added + +- Add tooltips on every clickable icons ([#540](https://github.com/thelounge/lounge/pull/540) by [@astorije](https://github.com/astorije)) +- Add debug config option for `irc-framework` debug log ([#547](https://github.com/thelounge/lounge/pull/547) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Client-side theme selector ([#568](https://github.com/thelounge/lounge/pull/568) by [@astorije](https://github.com/astorije)) + +### Changed + +- Use our logger instead of `console.log` and `console.error` for LDAP logs ([#552](https://github.com/thelounge/lounge/pull/552) by [@astorije](https://github.com/astorije)) +- Make custom highlights case-insensitive ([#565](https://github.com/thelounge/lounge/pull/565) by [@astorije](https://github.com/astorije)) +- Bump `request` dependency to 2.74.0 ([#563](https://github.com/thelounge/lounge/pull/563) by [@astorije](https://github.com/astorije)) +- Mention wiki in README ([#548](https://github.com/thelounge/lounge/pull/548) by [@MaxLeiter](https://github.com/MaxLeiter)) +- Support ES6 features in JS linting outside of client code ([#593](https://github.com/thelounge/lounge/pull/593) by [@williamboman](https://github.com/williamboman)) + +### Fixed + +- Fix token persistency across server refreshes ([#553](https://github.com/thelounge/lounge/pull/553) by [@astorije](https://github.com/astorije)) +- Make sure input height is reset when submitting with icon ([#555](https://github.com/thelounge/lounge/pull/555) by [@astorije](https://github.com/astorije)) +- Fix webirc and 4-in-6 addresses ([#535](https://github.com/thelounge/lounge/pull/535) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Allow long URLs to break onto next line on Chrome ([#576](https://github.com/thelounge/lounge/pull/576) by [@astorije](https://github.com/astorije)) +- Make sure users with wrong tokens are locked out instead of crashing the app ([#570](https://github.com/thelounge/lounge/pull/570) by [@astorije](https://github.com/astorije)) +- Remove font family redundancy, fix missed fonts, remove Open Sans ([#562](https://github.com/thelounge/lounge/pull/562) by [@astorije](https://github.com/astorije)) +- Do not set app orientation in manifest to use user setting at OS level ([#587](https://github.com/thelounge/lounge/pull/587) by [@astorije](https://github.com/astorije)) +- Move border-radius from `#main` to `.window elements` to fix radius once and for all ([#572](https://github.com/thelounge/lounge/pull/572) by [@astorije](https://github.com/astorije)) + +## v2.0.0-pre.6 - 2016-08-10 [Pre-release] + +[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0-pre.5...v2.0.0-pre.6) + +LDAP! That's all there is to be found in this pre-release, but it should please some administrators out there. Big thanks to [@thisisdarshan](https://github.com/thisisdarshan) and [@lindskogen](https://github.com/lindskogen) for sticking with us on this one. + +This feature will remain in beta version until the official v2.0.0 release. + +### Added + +- LDAP support ([#477](https://github.com/thelounge/lounge/pull/477) by [@thisisdarshan](https://github.com/thisisdarshan) and [@lindskogen](https://github.com/lindskogen)) + +## v2.0.0-pre.5 - 2016-08-07 [Pre-release] + +[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0-pre.4...v2.0.0-pre.5) + +What an exciting release! It's been in the works for more than a month, but the perks are worth the wait. + +On the user side, some long-awaited new features can now be found: The Lounge can now track custom highlights, it comes with an auto-expanding text field, and an unread message marker helps keeping track of what happened when you were not watching. A lot of improvements and various bug fixes have been made to the UI. +Note that scrollbar look-and-feel is now delegated to the browser and OS. Use the custom CSS editor and your OS settings to customize them. + +Administrators will notice a different format for channels in the user configuration files, and the Docker-related files have been moved to [a dedicated repository](https://github.com/thelounge/docker-lounge). Many bugs have been solved on the server as well. + +### Added + +- Add custom highlights ([#425](https://github.com/thelounge/lounge/pull/425) by [@YaManicKill](https://github.com/YaManicKill)) +- Add auto-grow textarea support ([#379](https://github.com/thelounge/lounge/pull/379) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Display unhandled numerics on the client ([#286](https://github.com/thelounge/lounge/pull/286) by [@xPaw](https://github.com/xPaw)) +- A proper unread marker ([#332](https://github.com/thelounge/lounge/pull/332) by [@xPaw](https://github.com/xPaw)) +- Add information on the About section of the client ([#497](https://github.com/thelounge/lounge/pull/497) by [@astorije](https://github.com/astorije)) +- Add a red dot to the mobile menu icon when being notified ([#486](https://github.com/thelounge/lounge/pull/486) by [@astorije](https://github.com/astorije)) +- Add "The Lounge" label to the landing pages ([#487](https://github.com/thelounge/lounge/pull/487) by [@astorije](https://github.com/astorije)) +- Display network name on Connect page when network is locked and info is hidden ([#488](https://github.com/thelounge/lounge/pull/488) by [@astorije](https://github.com/astorije)) + +### Changed + +- Store channels in array format in user configuration files ([#417](https://github.com/thelounge/lounge/pull/417) by [@xPaw](https://github.com/xPaw)) +- Cache loaded config and merge it with defaults ([#387](https://github.com/thelounge/lounge/pull/387) by [@xPaw](https://github.com/xPaw)) +- Ignore unnecessary files at release time ([#499](https://github.com/thelounge/lounge/pull/499) by [@astorije](https://github.com/astorije)) +- Improve font icon management, sizing and sharpness ([#493](https://github.com/thelounge/lounge/pull/493) by [@astorije](https://github.com/astorije)) +- Maintain scroll position after loading previous messages ([#496](https://github.com/thelounge/lounge/pull/496) by [@davibe](https://github.com/davibe)) + +### Removed + +- Remove Docker-related files ([#288](https://github.com/thelounge/lounge/pull/288) by [@astorije](https://github.com/astorije)) +- Remove JavaScript scrollbar library ([#429](https://github.com/thelounge/lounge/pull/429) by [@xPaw](https://github.com/xPaw)) + +### Fixed + +- Fix storing the updated authentication token ([#437](https://github.com/thelounge/lounge/pull/437) by [@williamboman](https://github.com/williamboman)) +- Update `irc-framework` to 2.3.0 to fix a bug occurring when posting messages starting with a colon ([#449](https://github.com/thelounge/lounge/pull/449) by [@xPaw](https://github.com/xPaw)) +- Update `irc-framework` to 2.4.0 to fix a buffering issue ([#451](https://github.com/thelounge/lounge/pull/451) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Only auto join actual channels ([#453](https://github.com/thelounge/lounge/pull/453) by [@xPaw](https://github.com/xPaw)) +- Only trigger custom highlights for non-self messages and notices ([#454](https://github.com/thelounge/lounge/pull/454) by [@xPaw](https://github.com/xPaw)) +- Stop propagation when hiding the chat through click/tapping the chat ([#455](https://github.com/thelounge/lounge/pull/455) by [@williamboman](https://github.com/williamboman)) +- Improve click handling on users and inline channels ([#366](https://github.com/thelounge/lounge/pull/366) by [@xPaw](https://github.com/xPaw)) +- Update `irc-framework` to 2.5.0 to fix reconnection counter not being reset ([#451](https://github.com/thelounge/lounge/pull/451) by [@xPaw](https://github.com/xPaw)) +- Register irc-framework events before connecting ([#458](https://github.com/thelounge/lounge/pull/458) by [@xPaw](https://github.com/xPaw)) +- Only load config if it exists ([#461](https://github.com/thelounge/lounge/pull/461) by [@xPaw](https://github.com/xPaw)) +- Fix window layout a bit ([#465](https://github.com/thelounge/lounge/pull/465) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Fix slight bugs introduced by #379 and #465 ([#467](https://github.com/thelounge/lounge/pull/467) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Prevent the app from crashing when no theme is specified ([#474](https://github.com/thelounge/lounge/pull/474) by [@astorije](https://github.com/astorije)) +- Fix unread marker disappearing when opacity set to 1 ([#471](https://github.com/thelounge/lounge/pull/471) by [@astorije](https://github.com/astorije)) +- Fix breaking layout when switching portrait/landscape modes ([#478](https://github.com/thelounge/lounge/pull/478) by [@astorije](https://github.com/astorije)) +- Fix chat not being "stickied" to the bottom when joining channel ([#484](https://github.com/thelounge/lounge/pull/484) by [@williamboman](https://github.com/williamboman)) +- Add self info to TOGGLE messages to prevent unread marker to render for oneself ([#473](https://github.com/thelounge/lounge/pull/473) by [@astorije](https://github.com/astorije)) +- Send user to lobby of deleted chan when parting from active chan ([#489](https://github.com/thelounge/lounge/pull/489) by [@astorije](https://github.com/astorije)) +- Use `min-height` of textarea when computing auto-resize after deleting a char ([#504](https://github.com/thelounge/lounge/pull/504) by [@astorije](https://github.com/astorije)) +- Set title attribute on topic on initial page load ([#515](https://github.com/thelounge/lounge/pull/515) by [@williamboman](https://github.com/williamboman)) +- Make sure git commit check for the About section would not send stderr to the console ([#516](https://github.com/thelounge/lounge/pull/516) by [@astorije](https://github.com/astorije)) +- Create a single function to render networks to reduce code duplication ([#445](https://github.com/thelounge/lounge/pull/445) by [@xPaw](https://github.com/xPaw)) +- Reset the unread marker on channel change ([#527](https://github.com/thelounge/lounge/pull/527) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Fix accidentally removed border-radius ([#537](https://github.com/thelounge/lounge/pull/537) by [@astorije](https://github.com/astorije)) +- Fix font size in themes for new textarea ([#536](https://github.com/thelounge/lounge/pull/536) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Restore padding and height of message input pre-textarea era ([#539](https://github.com/thelounge/lounge/pull/539) by [@astorije](https://github.com/astorije)) +- Prevent Ctrl-Tab from triggering tab completion ([#541](https://github.com/thelounge/lounge/pull/541) by [@hho](https://github.com/hho)) + +## v2.0.0-pre.4 - 2016-06-29 [Pre-release] + +[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0-pre.3...v2.0.0-pre.4) + +This pre-release adds a loading window, helpful on slow connections. +It also implements token persistency, ensuring users do not have to authenticate at every server restart. As a side effect, security is improved by forcing logging out users on all devices when changing their password. + +All generated URLs are now HTTP by default, except when explicitly set to HTTPS. For example, `www.example.com` will link to `http://www.example.com`. One needs to share `https://www.example.com` to point others to a HTTPS location. + +As a few users have been having issues when running The Lounge with a non-supported Node.js version, we now detect it early to avoid cryptic errors. + +This pre-release also adds minor UI improvements, and fixes from the previous version. +While The Lounge still needs a lot of efforts to be fully accessible, this version slightly improves accessibility on clickable nickname. + +Internally, we now keep track of our code coverage, which we do not enforce strictly at the moment. + +### Added + +- Add code coverage ([#408](https://github.com/thelounge/lounge/pull/408) by [@astorije](https://github.com/astorije)) +- Display a loading message instead of blank page ([#386](https://github.com/thelounge/lounge/pull/386) by [@xPaw](https://github.com/xPaw)) + +### Changed + +- Perform node version check as soon as possible ([#409](https://github.com/thelounge/lounge/pull/409) by [@xPaw](https://github.com/xPaw)) +- Prepend http protocol to www. links in chat ([#410](https://github.com/thelounge/lounge/pull/410) by [@xPaw](https://github.com/xPaw)) +- Use tabs when saving user configs ([#418](https://github.com/thelounge/lounge/pull/418) by [@xPaw](https://github.com/xPaw)) +- Do not display the sidebar on sign-in page ([#420](https://github.com/thelounge/lounge/pull/420) by [@astorije](https://github.com/astorije)) +- Make style of loading page similar to other pages ([#423](https://github.com/thelounge/lounge/pull/423) by [@astorije](https://github.com/astorije)) +- Change default configuration for `host` to allow OS to decide and use both IPv4 and IPv6 ([#432](https://github.com/thelounge/lounge/pull/432) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Change nicks from links to spans everywhere ([#428](https://github.com/thelounge/lounge/pull/428) by [@xPaw](https://github.com/xPaw)) +- Increase join delay at connection to 1000ms ([#434](https://github.com/thelounge/lounge/pull/434) by [@williamboman](https://github.com/williamboman)) + +### Removed + +- Remove navigator.standalone detection ([#427](https://github.com/thelounge/lounge/pull/427) by [@xPaw](https://github.com/xPaw)) + +### Fixed + +- Do not lose authentication token when the connection gets lost ([#369](https://github.com/thelounge/lounge/pull/369) by [@xPaw](https://github.com/xPaw)) +- Fix crash in public mode ([#413](https://github.com/thelounge/lounge/pull/413) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Do not print user loaded message in public mode ([#415](https://github.com/thelounge/lounge/pull/415) by [@xPaw](https://github.com/xPaw)) +- Fix focusing input when clicking chat container on the client ([#364](https://github.com/thelounge/lounge/pull/364) by [@williamboman](https://github.com/williamboman)) +- Fix channel join regression and fix possibly joining parted channels ([#411](https://github.com/thelounge/lounge/pull/411) by [@xPaw](https://github.com/xPaw)) + +### Security + +- Implement user token persistency ([#370](https://github.com/thelounge/lounge/pull/370) by [@xPaw](https://github.com/xPaw)) + +## v2.0.0-pre.3 - 2016-06-15 [Pre-release] + +[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0-pre.2...v2.0.0-pre.3) + +This release introduces a few internal changes as well as two noticeable ones. When using the CLI, the home path can now be set with the `LOUNGE_HOME` environment variable, to avoid repeating `--home` over and over. On the client, sorting channels will now be saved in the user configuration. + +### Added + +- Fall back to LOUNGE_HOME env variable when using the CLI ([#402](https://github.com/thelounge/lounge/pull/402) by [@williamboman](https://github.com/williamboman)) + +### Changed + +- Rename package variable to pkg, as "package" is reserved. ([#399](https://github.com/thelounge/lounge/pull/399) by [@hogofwar](https://github.com/hogofwar)) +- Capitalise constructor Oidentd ([#396](https://github.com/thelounge/lounge/pull/396) by [@hogofwar](https://github.com/hogofwar)) +- Bump stylelint and update Travis CI configuration to include OSX builds and package caching ([#403](https://github.com/thelounge/lounge/pull/403) by [@xPaw](https://github.com/xPaw)) + +### Removed + +- Supersede `mkdirp` with `fs-extra` ([#390](https://github.com/thelounge/lounge/pull/390) by [@hogofwar](https://github.com/hogofwar)) +- Remove redundant variables ([#397](https://github.com/thelounge/lounge/pull/397) by [@hogofwar](https://github.com/hogofwar)) + +### Fixed + +- Save user's channels when they sort the channel list ([#401](https://github.com/thelounge/lounge/pull/401) by [@xPaw](https://github.com/xPaw)) +- Fix description of `host` and `bind` config options ([#378](https://github.com/thelounge/lounge/pull/378) by [@maxpoulin64](https://github.com/maxpoulin64)) + +## v2.0.0-pre.2 - 2016-06-09 [Pre-release] + +[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0-pre.1...v2.0.0-pre.2) + +This pre-release adds a very, very long-awaited feature: auto-reconnection! It also extends our support of ident with oidentd, shows timestamps on small screens and fix bugs around notifications and sticky scroll. + +### Added + +- Enable auto reconnection ([#254](https://github.com/thelounge/lounge/pull/254) by [@xPaw](https://github.com/xPaw)) +- Add "!" modechar for admin ([#354](https://github.com/thelounge/lounge/pull/354) by [@omnicons](https://github.com/omnicons)) +- Add CI tool for Windows builds ([#367](https://github.com/thelounge/lounge/pull/367) by [@astorije](https://github.com/astorije)) +- Add support for oidentd spoofing ([#256](https://github.com/thelounge/lounge/pull/256) by [@maxpoulin64](https://github.com/maxpoulin64)) + +### Changed + +- Update Font Awesome to v4.6.3 ([#355](https://github.com/thelounge/lounge/pull/355) by [@MaxLeiter](https://github.com/MaxLeiter)) +- Do not hide timestamps on small viewports ([#376](https://github.com/thelounge/lounge/pull/376) by [@xPaw](https://github.com/xPaw)) +- Fetch Font Awesome from npm instead of embedded in repo ([#361](https://github.com/thelounge/lounge/pull/361) by [@astorije](https://github.com/astorije)) +- Cache npm modules on appveyor ([#381](https://github.com/thelounge/lounge/pull/381) by [@xPaw](https://github.com/xPaw)) +- Update eslint and enforce key-spacing ([#384](https://github.com/thelounge/lounge/pull/384) by [@xPaw](https://github.com/xPaw)) +- Use `npm-run-all` in npm scripts for testing and linting ([#375](https://github.com/thelounge/lounge/pull/375) by [@williamboman](https://github.com/williamboman)) +- Upload test results on appveyor builds ([#382](https://github.com/thelounge/lounge/pull/382) by [@xPaw](https://github.com/xPaw)) + +### Fixed + +- Turn favicon red on page load if there are highlights ([#344](https://github.com/thelounge/lounge/pull/344) by [@xPaw](https://github.com/xPaw)) +- Do not send completely empty messages ([#345](https://github.com/thelounge/lounge/pull/345) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Make sure npm test script gets run on AppVeyor ([#372](https://github.com/thelounge/lounge/pull/372) by [@astorije](https://github.com/astorije)) +- Keep chat stickied to the bottom on resize ([#346](https://github.com/thelounge/lounge/pull/346) by [@maxpoulin64](https://github.com/maxpoulin64)) + +## v2.0.0-pre.1 - 2016-05-22 [Pre-release] + +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.5.0...v2.0.0-pre.1) + +This is a pre-release to allow early adopters to use The Lounge with [`irc-framework`](https://github.com/kiwiirc/irc-framework) as our underlying IRC library instead of [`slate`](https://github.com/slate/slate-irc). This change itself solves a lot of issues and adds many features, most of them [listed here](https://github.com/thelounge/lounge/pull/167#issue-139286868): IRCv3 compliance, user feedback improvement, etc. + +It also adds WEBIRC support, a better server logging capability, a web app manifest, improves the sticky scroll, and fixes a ton of bugs. + +### Added + +- Log enabled capabilities ([#272](https://github.com/thelounge/lounge/pull/272) by [@xPaw](https://github.com/xPaw)) +- Add global logging helper ([#257](https://github.com/thelounge/lounge/pull/257) by [@xPaw](https://github.com/xPaw)) +- Add support for `~` home folder expansion ([#284](https://github.com/thelounge/lounge/pull/284) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Document supported node version ([#280](https://github.com/thelounge/lounge/pull/280) by [@xPaw](https://github.com/xPaw)) +- Add support for echo-message and znc.in/self-message caps ([#270](https://github.com/thelounge/lounge/pull/270) by [@xPaw](https://github.com/xPaw)) +- Implement WEBIRC ([#240](https://github.com/thelounge/lounge/pull/240) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Add `manifest.json` for nicer mobile experience ([#310](https://github.com/thelounge/lounge/pull/310) by [@xPaw](https://github.com/xPaw)) + +### Changed + +- Drop `slate-irc`, switch to `irc-framework` ([#167](https://github.com/thelounge/lounge/pull/167) by [@xPaw](https://github.com/xPaw)) +- Create a single helper function to write messages ([#266](https://github.com/thelounge/lounge/pull/266) by [@xPaw](https://github.com/xPaw)) +- Update dependencies ([#281](https://github.com/thelounge/lounge/pull/281) by [@xPaw](https://github.com/xPaw)) +- Improve sticky scroll ([#262](https://github.com/thelounge/lounge/pull/262) by [@xPaw](https://github.com/xPaw)) +- Change license link to point at our license file ([#290](https://github.com/thelounge/lounge/pull/290) by [@xPaw](https://github.com/xPaw)) +- Stricter eslint rule for curly brackets ([#291](https://github.com/thelounge/lounge/pull/291) by [@xPaw](https://github.com/xPaw)) +- Bump patch version of lodash to 4.11.2 ([#306](https://github.com/thelounge/lounge/pull/306) by [@astorije](https://github.com/astorije)) +- Minor wording changes for better clarity ([#305](https://github.com/thelounge/lounge/pull/305) by [@astorije](https://github.com/astorije)) +- Improve tests execution ([#260](https://github.com/thelounge/lounge/pull/260) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Update irc-framework ([#324](https://github.com/thelounge/lounge/pull/324) by [@xPaw](https://github.com/xPaw)) +- Do not ignore our handlebars plugins in ESLint ([#329](https://github.com/thelounge/lounge/pull/329) by [@xPaw](https://github.com/xPaw)) +- Improve nick highlights ([#327](https://github.com/thelounge/lounge/pull/327) by [@xPaw](https://github.com/xPaw)) +- CSS classes in themes for nick colors ([#325](https://github.com/thelounge/lounge/pull/325) by [@astorije](https://github.com/astorije)) +- Replace all concatenated paths with Node's path.join ([#307](https://github.com/thelounge/lounge/pull/307) by [@astorije](https://github.com/astorije)) + +### Removed + +- Do not increase font size on highlight in morning theme ([#321](https://github.com/thelounge/lounge/pull/321) by [@xPaw](https://github.com/xPaw)) + +### Fixed + +- Only increase unread counter for whitelisted actions ([#273](https://github.com/thelounge/lounge/pull/273) by [@xPaw](https://github.com/xPaw)) +- Parse CTCP replies ([#278](https://github.com/thelounge/lounge/pull/278) by [@xPaw](https://github.com/xPaw)) +- Do not count your own messages as unread ([#279](https://github.com/thelounge/lounge/pull/279) by [@xPaw](https://github.com/xPaw)) +- Use lowercase global to avoid a deprecation warning in Node.js 6 ([`d9a0dd9`](https://github.com/thelounge/lounge/commit/d9a0dd9406e8fb22d7a5ee1ed4ed7aa8e5f0fa01) by [@xPaw](https://github.com/xPaw)) +- Do not display incorrect nick when switching to a non connected network ([#252](https://github.com/thelounge/lounge/pull/252) by [@xPaw](https://github.com/xPaw)) +- Keep autocompletion sort whenever user list updates ([#217](https://github.com/thelounge/lounge/pull/217) by [@xPaw](https://github.com/xPaw)) +- Make sure app does not crash when webirc is not defined in the configuration ([#294](https://github.com/thelounge/lounge/pull/294) by [@astorije](https://github.com/astorije)) +- Save user when parting channels ([#297](https://github.com/thelounge/lounge/pull/297) by [@xPaw](https://github.com/xPaw)) +- Add labels in connect window ([#300](https://github.com/thelounge/lounge/pull/300) by [@xPaw](https://github.com/xPaw)) +- Add missing `aria-label` on icon buttons ([#303](https://github.com/thelounge/lounge/pull/303) by [@astorije](https://github.com/astorije)) +- Fix unread counter not being formatted on page load ([#308](https://github.com/thelounge/lounge/pull/308) by [@xPaw](https://github.com/xPaw)) +- Fix wrong CSS for disabled colored nicknames on themes ([#318](https://github.com/thelounge/lounge/pull/318) by [@astorije](https://github.com/astorije)) +- Fix missing colors in action messages ([#317](https://github.com/thelounge/lounge/pull/317) by [@astorije](https://github.com/astorije)) +- Don't falsely report failed write if it didn't fail ([`e6990e0`](https://github.com/thelounge/lounge/commit/e6990e0fc7641d18a5bcbabddca1aacf2254ae52) by [@xPaw](https://github.com/xPaw)) +- Fix sending messages starting with a space ([#320](https://github.com/thelounge/lounge/pull/320) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Fix notifications in query windows ([#334](https://github.com/thelounge/lounge/pull/334) by [@xPaw](https://github.com/xPaw)) + +### Security + +- Restrict access to the home directory by default ([#205](https://github.com/thelounge/lounge/pull/205) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Update demo link to HTTPS ([#302](https://github.com/thelounge/lounge/pull/302) by [@MaxLeiter](https://github.com/MaxLeiter)) +- Add security headers to minimize XSS damage ([#292](https://github.com/thelounge/lounge/pull/292) by [@xPaw](https://github.com/xPaw)) +- Do not write user configs outside of the app's users directory ([#238](https://github.com/thelounge/lounge/pull/238) by [@williamboman](https://github.com/williamboman)) +- Don't check for existing password emptiness ([#315](https://github.com/thelounge/lounge/pull/315) by [@maxpoulin64](https://github.com/maxpoulin64)) + +## v1.5.0 - 2016-04-13 + +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.4.3...v1.5.0) + +With this release, administrators can now define a maximum size for channel history. +While this is not optimal nor the definitive solution, it aims at reducing stability issues where The Lounge would crash after filling up the server's memory. + +Other changes noticeable by users include removing custom print styles and preventing sequences of white spaces to collapse into one. + +### Added + +- Add config option to limit in-memory history size ([#243](https://github.com/thelounge/lounge/pull/243) by [@maxpoulin64](https://github.com/maxpoulin64)) + +### Changed + +- Do not parse link titles for IRC formatting ([#245](https://github.com/thelounge/lounge/pull/245) by [@xPaw](https://github.com/xPaw)) +- Display multiple white spaces properly ([#239](https://github.com/thelounge/lounge/pull/239) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Reword password prompt of `add` and `reset` CLI commands ([#230](https://github.com/thelounge/lounge/pull/230) by [@williamboman](https://github.com/williamboman)) + +### Removed + +- Remove print styles ([#228](https://github.com/thelounge/lounge/pull/228) by [@xPaw](https://github.com/xPaw)) + +## v1.4.3 - 2016-04-02 + +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.4.2...v1.4.3) + +This PR fixes a bug introduced in v1.3.0 which prevents deleting disconnected networks from users' configuration files. + +### Fixed + +- Fix not being able to remove networks from user config ([#233](https://github.com/thelounge/lounge/pull/233) by [@xPaw](https://github.com/xPaw)) + +## v1.4.2 - 2016-03-31 + +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.4.1...v1.4.2) + +This PR fixes a bug introduced in v1.4.1 causing timestamps to use most of the screen. + +### Fixed + +- Hide options will now remove the entire row ([#227](https://github.com/thelounge/lounge/pull/227) by [@xPaw](https://github.com/xPaw)) + +## v1.4.1 - 2016-03-28 + +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.4.0...v1.4.1) + +As of this release, running `/query nick` will simply open a chat window with user `nick`, instead of calling `whois` for this user. + +### Changed + +- Remove `join`, `nick` and `whois` inputs, they are cleanly handled by the server ([#208](https://github.com/thelounge/lounge/pull/208) by [@xPaw](https://github.com/xPaw)) +- Add a `/query` command that simply opens a query window ([#218](https://github.com/thelounge/lounge/pull/218) by [@xPaw](https://github.com/xPaw)) +- Disallow `/query` on non-nicks ([#221](https://github.com/thelounge/lounge/pull/221) by [@astorije](https://github.com/astorije)) + +### Fixed + +- Fix message and topic text wrapping ([#215](https://github.com/thelounge/lounge/pull/215) by [@xPaw](https://github.com/xPaw)) +- Fix `/part` command ([#222](https://github.com/thelounge/lounge/pull/222) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Harden URL fetcher and don't crash on non-ASCII urls ([#219](https://github.com/thelounge/lounge/pull/219) by [@xPaw](https://github.com/xPaw)) + +## v1.4.0 - 2016-03-20 + +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.3.1...v1.4.0) + +Note that this release will reset users' notification settings to their defaults. This unfortunate side effect is the consequence of an improvement of how this setting is handled in the application. + +### Added + +- Add context menu when right-clicking on a sidebar item ([#9](https://github.com/thelounge/lounge/pull/9) by [@xPaw](https://github.com/xPaw)) +- Add tests for the `Chan#sortUsers` method ([#197](https://github.com/thelounge/lounge/pull/197) by [@astorije](https://github.com/astorije)) +- Add a very basic test for `Network#export` ([#198](https://github.com/thelounge/lounge/pull/198) by [@astorije](https://github.com/astorije)) +- Link to the demo from the IRC channel badge on the README ([#203](https://github.com/thelounge/lounge/pull/203) by [@Henni](https://github.com/Henni)) +- Add support for HTTP/2 ([#174](https://github.com/thelounge/lounge/pull/174) by [@xPaw](https://github.com/xPaw)) +- Support port in `/connect` command ([#210](https://github.com/thelounge/lounge/pull/210) by [@xPaw](https://github.com/xPaw)) + +### Changed + +- Update Handlebars to 4.0.5 ([#140](https://github.com/thelounge/lounge/pull/140) by [@xPaw](https://github.com/xPaw)) +- Update Socket.IO to 1.4.5 and use client library provided by the dependency ([#142](https://github.com/thelounge/lounge/pull/142) by [@xPaw](https://github.com/xPaw)) +- Update ESLint to 2.3.0 and add stricter rules ([#171](https://github.com/thelounge/lounge/pull/171) by [@xPaw](https://github.com/xPaw)) +- Mute color of the topic actions ([#151](https://github.com/thelounge/lounge/pull/151) by [@astorije](https://github.com/astorije)) +- Rename "badge" setting and rely on browser choice for desktop notifications ([#28](https://github.com/thelounge/lounge/pull/28) by [@lpoujol](https://github.com/lpoujol)) +- Invoke `handlebars` outside of `grunt` and generate a sourcemap ([#144](https://github.com/thelounge/lounge/pull/144) by [@xPaw](https://github.com/xPaw)) +- Make `whois` a client action template and improve its output ([#161](https://github.com/thelounge/lounge/pull/161) by [@xPaw](https://github.com/xPaw)) +- Handle commands in a better way and send unknown commands to the IRC server ([#154](https://github.com/thelounge/lounge/pull/154) by [@xPaw](https://github.com/xPaw)) +- Switch the Send button to a paper plane icon ([#182](https://github.com/thelounge/lounge/pull/182) by [@astorije](https://github.com/astorije)) +- Keep track of highlights when user is offline ([#190](https://github.com/thelounge/lounge/pull/190) by [@xPaw](https://github.com/xPaw)) +- Load input plugins at startup and call them directly when a command is received ([#191](https://github.com/thelounge/lounge/pull/191) by [@astorije](https://github.com/astorije)) +- Make defaults for socket.io transports consistent to use polling before websocket ([#202](https://github.com/thelounge/lounge/pull/202) by [@xPaw](https://github.com/xPaw)) +- Update all server dependencies to current stable versions ([#200](https://github.com/thelounge/lounge/pull/200) by [@xPaw](https://github.com/xPaw)) +- Update configuration file to reflect HTTP/2 support addition ([#206](https://github.com/thelounge/lounge/pull/206) by [@astorije](https://github.com/astorije)) +- Change close button behavior and add a dropdown context menu ([#184](https://github.com/thelounge/lounge/pull/184) by [@xPaw](https://github.com/xPaw)) +- Minor enhancements of the context menu UI ([#212](https://github.com/thelounge/lounge/pull/212) by [@astorije](https://github.com/astorije)) + +### Removed + +- Remove `string.contains` library ([#163](https://github.com/thelounge/lounge/pull/163) by [@xPaw](https://github.com/xPaw)) +- Remove Moment.js library from the client ([#183](https://github.com/thelounge/lounge/pull/183) by [@xPaw](https://github.com/xPaw)) +- Disabled emails from Travis CI on successful builds ([#172](https://github.com/thelounge/lounge/pull/172) by [@xPaw](https://github.com/xPaw)) +- Remove unnecessary operation when sorting users ([#193](https://github.com/thelounge/lounge/pull/193) by [@astorije](https://github.com/astorije)) + +### Fixed + +- Make sure self messages are never highlighted and improve highlight lookup ([#157](https://github.com/thelounge/lounge/pull/157) by [@astorije](https://github.com/astorije)) +- Fix Send button style on Zenburn and Morning themes, introduced by this release ([#187](https://github.com/thelounge/lounge/pull/187) by [@astorije](https://github.com/astorije)) +- Make sure all close buttons in the sidebar have same weight ([#192](https://github.com/thelounge/lounge/pull/192) by [@astorije](https://github.com/astorije)) +- Disallow parting from lobbies ([#209](https://github.com/thelounge/lounge/pull/209) by [@xPaw](https://github.com/xPaw)) + +## v1.3.1 - 2016-03-05 + +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.3.0...v1.3.1) + +### Removed + +- Remove attempts to set file modes ([#117](https://github.com/thelounge/lounge/pull/117) by [@maxpoulin64](https://github.com/maxpoulin64)) + +### Fixed + +- Correctly handle inline channels in messages ([#128](https://github.com/thelounge/lounge/pull/128) by [@xPaw](https://github.com/xPaw)) +- Fix crash, introduced by this release ([#143](https://github.com/thelounge/lounge/pull/143) by [@xPaw](https://github.com/xPaw)) +- Fix highlighted actions and mute colors of some of the actions ([#47](https://github.com/thelounge/lounge/pull/47) by [@xPaw](https://github.com/xPaw)) +- Fix stripping multiple colors from notifications ([#145](https://github.com/thelounge/lounge/pull/145) by [@xPaw](https://github.com/xPaw)) +- Correctly display channel name in notifications ([#148](https://github.com/thelounge/lounge/pull/148) by [@xPaw](https://github.com/xPaw)) +- Fix hover effect on channels in topics ([#149](https://github.com/thelounge/lounge/pull/149) by [@xPaw](https://github.com/xPaw)) +- Add missing mode action to muted colors ([#150](https://github.com/thelounge/lounge/pull/150) by [@astorije](https://github.com/astorije)) + +## v1.3.0 - 2016-03-03 + +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.2.1...v1.3.0) + +### Added + +- Add hostmask in `join`/`part`/`quit` messages and move actions to templates ([#94](https://github.com/thelounge/lounge/pull/94) by [@xPaw](https://github.com/xPaw)) +- Add a section in the README explaining why a fork was created ([#95](https://github.com/thelounge/lounge/pull/95) by [@almet](https://github.com/almet)) +- Add the ability to let users change their password from the settings page ([#57](https://github.com/thelounge/lounge/pull/57) by [@diddledan](https://github.com/diddledan)) +- Add the ability to let users set custom CSS in their settings ([#83](https://github.com/thelounge/lounge/pull/83) by [@xPaw](https://github.com/xPaw)) +- Add notifications for channel invites ([#127](https://github.com/thelounge/lounge/pull/127) by [@astorije](https://github.com/astorije)) +- Allow locking network configuration ([#82](https://github.com/thelounge/lounge/pull/82) by [@xPaw](https://github.com/xPaw)) + +### Changed + +- Add target channel name in notifications ([#118](https://github.com/thelounge/lounge/pull/118) by [@astorije](https://github.com/astorije)) +- Bump `grunt-contrib-uglify` and pin versions of `grunt`-related dependencies ([#119](https://github.com/thelounge/lounge/pull/119) by [@astorije](https://github.com/astorije)) +- Switch to a power-off icon for logging out ([#131](https://github.com/thelounge/lounge/pull/131) by [@astorije](https://github.com/astorije)) + +### Removed + +- Remove auto-select on input fields ([#120](https://github.com/thelounge/lounge/pull/120) by [@astorije](https://github.com/astorije)) + +### Fixed + +- Fix the "Show more" button being displayed over chat messages and message paddings when `join`/`part`/`quit` messages are hidden ([`b53e5c4`](https://github.com/thelounge/lounge/commit/b53e5c407c7ca90e9741791b4e0d927fb5f54ea1) by [@xPaw](https://github.com/xPaw)) +- Fix how highlights are handled and highlighted ([#91](https://github.com/thelounge/lounge/pull/91) by [@xPaw](https://github.com/xPaw)) +- Fix favicon highlight on Chrome and remove `Favico.js` library ([#100](https://github.com/thelounge/lounge/pull/100) by [@xPaw](https://github.com/xPaw)) +- Fix complete crash when refreshing a public instance, introduced by this release ([#125](https://github.com/thelounge/lounge/pull/125) by [@astorije](https://github.com/astorije)) +- Fix clickable "you" in the text of an `/invite`, introduced by this release ([#122](https://github.com/thelounge/lounge/pull/122) by [@xPaw](https://github.com/xPaw)) +- Fix minor issues with the main HTML file ([#134](https://github.com/thelounge/lounge/pull/134) by [@astorije](https://github.com/astorije)) +- Strip control codes from notifications ([#123](https://github.com/thelounge/lounge/pull/123) by [@xPaw](https://github.com/xPaw)) + +## v1.2.1 - 2016-02-26 + +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.2.0...v1.2.1) + +### Changed + +- Bump and pin mocha version ([#104](https://github.com/thelounge/lounge/pull/104) by [@astorije](https://github.com/astorije)) + +### Fixed + +- Fix CSS selector syntax in channel message handler ([#102](https://github.com/thelounge/lounge/pull/102) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Fix fading channel name in sidebar of Crypto and Zenburn themes ([#105](https://github.com/thelounge/lounge/pull/105) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Fix `/invite` command broken by lodash bump ([#106](https://github.com/thelounge/lounge/pull/106) by [@JocelynDelalande](https://github.com/JocelynDelalande)) + +## v1.2.0 - 2016-02-24 + +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.1.1...v1.2.0) + +Note that this release will reset client-side settings to their defaults. Current users will have to re-set them in the settings page. This is [a conscious trade-off](https://github.com/thelounge/lounge/pull/70#issuecomment-186717859) as the fork is rather new and there are not many settings overall. + +### Added + +- Add support for the `/invite ` command ([#7](https://github.com/thelounge/lounge/pull/7) by [@xPaw](https://github.com/xPaw)) +- Add a command shorthand to invite in the current channel with `/invite ` ([#76](https://github.com/thelounge/lounge/pull/76) by [@astorije](https://github.com/astorije)) +- Add style linting for all CSS files in the repository ([#43](https://github.com/thelounge/lounge/pull/43) by [@xPaw](https://github.com/xPaw)) + +### Changed + +- Improve client performance by updating the users' list only when it's needed ([#58](https://github.com/thelounge/lounge/pull/58) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Let the badge counter hide with a fade-out ([#73](https://github.com/thelounge/lounge/pull/73) by [@xPaw](https://github.com/xPaw)) +- Update `lodash` dependency to the latest major version ([#38](https://github.com/thelounge/lounge/pull/38) by [@xPaw](https://github.com/xPaw)) +- Use `localStorage` instead of cookies for client-side settings storage ([#70](https://github.com/thelounge/lounge/pull/70) by [@xPaw](https://github.com/xPaw)) +- Replace Bootstrap's tooltips with CSS tooltips from GitHub's Primer ([#79](https://github.com/thelounge/lounge/pull/79) by [@xPaw](https://github.com/xPaw)) + +### Fixed + +- Fade long channel names in the sidebar instead of breaking to another line ([#75](https://github.com/thelounge/lounge/pull/75) by [@maxpoulin64](https://github.com/maxpoulin64)) + +## v1.1.1 - 2016-02-19 + +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.1.0...v1.1.1) + +### Changed + +- Remove compiled assets and generate them at prepublish time ([#63](https://github.com/thelounge/lounge/pull/63) by [@astorije](https://github.com/astorije)) + +## v1.1.0 - 2016-02-19 + +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.0.2...v1.1.0) + +### Added + +- Allow The Lounge to be proxied behind a `/path/` URL ([#27](https://github.com/thelounge/lounge/pull/27) by [@gdamjan](https://github.com/gdamjan)) + +### Changed + +- Simplify a great deal the CONTRIBUTING file ([#40](https://github.com/thelounge/lounge/pull/40) by [@astorije](https://github.com/astorije)) +- Use a Font Awesome icon for the channel closing button ([#48](https://github.com/thelounge/lounge/pull/48) by [@xPaw](https://github.com/xPaw)) + +### Removed + +- Remove Node 0.10 from Travis CI ([#60](https://github.com/thelounge/lounge/pull/60) by [@astorije](https://github.com/astorije)) + +### Fixed + +- Suppress deprecation warning for `moment().zone` ([#37](https://github.com/thelounge/lounge/pull/37) by [@deiu](https://github.com/deiu)) +- Fix a bug preventing the closing of a channel when the user was kicked out ([#34](https://github.com/thelounge/lounge/pull/34) by [@xPaw](https://github.com/xPaw)) + +## v1.0.2 - 2016-02-15 + +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.0.1...v1.0.2) + +### Changed + +- Remove `#foo` channel from the default configuration file ([#22](https://github.com/thelounge/lounge/pull/22) by [@astorije](https://github.com/astorije)) +- Change the Freenode URL to `chat.freenode.net` in the default configuration file ([#13](https://github.com/thelounge/lounge/pull/13) by [@dubzi](https://github.com/dubzi)) +- Ensure all `.js` files are linted ([#42](https://github.com/thelounge/lounge/pull/42) by [@williamboman](https://github.com/williamboman)) + +### Fixed + +- Hide the user list button on a server or private message window ([#32](https://github.com/thelounge/lounge/pull/32) by [@MaxLeiter](https://github.com/MaxLeiter)) +- Correctly sort the user list whenever a user joins ([#33](https://github.com/thelounge/lounge/pull/33) by [@xPaw](https://github.com/xPaw)) + +## v1.0.1 - 2016-02-14 + +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.0.0...v1.0.1) + +### Changed + +- In the change log, use a permanent URL to link the previous history of The Lounge to Shout ([#12](https://github.com/thelounge/lounge/pull/12) by [@xPaw](https://github.com/xPaw)) +- Update some dependencies and pin versions ([#8](https://github.com/thelounge/lounge/pull/8) by [@xPaw](https://github.com/xPaw)) + +### Fixed + +- Add missing form methods that were causing LastPass to trigger a warning ([#19](https://github.com/thelounge/lounge/pull/19) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Fix comments in the configuration file ([#1](https://github.com/thelounge/lounge/pull/1) by [@FryDay](https://github.com/FryDay)) + +## v1.0.0 - 2016-02-12 + +[See the full changelog](https://github.com/thelounge/lounge/compare/baadc3df3534fb22515a8c2ea29218fbbc1228b4...v1.0.0) + +This is the first release of **The Lounge**, picking up where Shout `v0.53.0` left off! + +### Added + +- Enable notifications on all messages, which can be controlled in the settings ([#540](https://github.com/erming/shout/pull/540) by [@nickel715](https://github.com/nickel715)) +- Add Travis CI and David DM badges on the README ([#465](https://github.com/erming/shout/pull/465) by [@astorije](https://github.com/astorije)) +- Emit sent notice back to the user ([#590](https://github.com/erming/shout/pull/590) by [@xPaw](https://github.com/xPaw)) +- Send user agent with link expander requests ([#608](https://github.com/erming/shout/pull/608) by [@xPaw](https://github.com/xPaw)) +- Add a `.gitattributes` file to normalize line endings ([#610](https://github.com/erming/shout/pull/610) by [@xPaw](https://github.com/xPaw)) +- Style scrollbars (WebKit only) ([#593](https://github.com/erming/shout/pull/593) by [@xPaw](https://github.com/xPaw)) +- Add a badge to display the IRC channel at the top ([#599](https://github.com/erming/shout/pull/599) by [@astorije](https://github.com/astorije)) +- Rotate `part`/`quit` icon for new action display ([#617](https://github.com/erming/shout/pull/617) by [@MaxLeiter](https://github.com/MaxLeiter)) + +### Changed + +- Update slate-irc to v0.8.1 ([#597](https://github.com/erming/shout/pull/597) by [@xPaw](https://github.com/xPaw)) +- Limit maximum height of inline images ([#598](https://github.com/erming/shout/pull/598) by [@xPaw](https://github.com/xPaw)) +- Use a single function to process and render messages ([#596](https://github.com/erming/shout/pull/596) by [@xPaw](https://github.com/xPaw)) +- Render user actions separately ([#588](https://github.com/erming/shout/pull/588) by [@xPaw](https://github.com/xPaw)) +- Simply parse all 0-99 IRC colors ([#609](https://github.com/erming/shout/pull/609) by [@xPaw](https://github.com/xPaw)) +- Tag notifications to reduce notification spam ([#418](https://github.com/erming/shout/pull/418) by [@williamboman](https://github.com/williamboman)) +- Change all mentions of Shout to the new name: The Lounge ([#2](https://github.com/thelounge/lounge/pull/2) by [@astorije](https://github.com/astorije)) + +### Fixed + +- Fix initial copyright year in the LICENSE notice ([#591](https://github.com/erming/shout/pull/591) by [@pra85](https://github.com/pra85)) +- Fix wrong color class on Zenburn style ([#595](https://github.com/erming/shout/pull/595) by [@astorije](https://github.com/astorije)) +- Run new topic through parser when it is updated ([#587](https://github.com/erming/shout/pull/587) by [@xPaw](https://github.com/xPaw)) +- Fix several things on Morning and Zenburn themes ([#605](https://github.com/erming/shout/pull/605) by [@xPaw](https://github.com/xPaw)) +- Fix word wrap on firefox ([#570](https://github.com/erming/shout/pull/570) by [@YaManicKill](https://github.com/YaManicKill)) +- Change user buttons to `a` links, allowing highlighting on Firefox ([#571](https://github.com/erming/shout/pull/571) and [#574](https://github.com/erming/shout/pull/574) by [@YaManicKill](https://github.com/YaManicKill)) + +--- + +All previous changes can be found on [Shout's CHANGELOG, starting at `v0.53.0`](https://github.com/erming/shout/blob/35587f3c35d0a8ac78a2495934ff9eaa8f1aa71c/CHANGELOG.md#0530--2016-01-07). diff --git a/sources/CONTRIBUTING.md b/sources/CONTRIBUTING.md new file mode 100644 index 0000000..f3da308 --- /dev/null +++ b/sources/CONTRIBUTING.md @@ -0,0 +1,37 @@ +## Contributing + +Welcome to The Lounge, it's great to have you here! We thank you in advance for +your contributions. + +### I have a question + +- Find us on the Freenode channel `#thelounge`. You might not get an answer + right away, but this channel is full of nice people who will be happy to + help you. + +### I want to report a bug + +- Look at the [open and closed + issues](https://github.com/thelounge/lounge/issues?q=is%3Aissue) to see if + this was not already discussed before. If you can't see any, feel free to + [open a new issue](https://github.com/thelounge/lounge/issues/new). + +### I want to contribute to the code + +- Make sure to discuss your ideas with the community in an + [issue](https://github.com/thelounge/lounge/issues) or on the IRC channel. +- Take a look at the open issues labeled as [`help wanted`](https://github.com/thelounge/lounge/issues?q=is%3Aopen+is%3Aissue+label%3Abug+label%3A%22help+wanted%22) + if you want to help without having a specific idea in mind. +- Make sure that your PRs do not contain unnecessary commits or merge commits. + [Squash commits](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History) + whenever possible. +- [Rebase](https://git-scm.com/book/en/v2/Git-Branching-Rebasing) (instead of + merge) outdated PRs on the `master` branch. +- Give extra care to your commit messages. Use the [imperative present + tense](https://git-scm.com/book/ch5-2.html#Commit-Guidelines) and [follow Tim + Pope's guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). +- Each PR will be reviewed by at least two different project maintainers. You + can read more about this in the [maintainers' +corner](https://github.com/thelounge/lounge/wiki/Maintainers'-corner). +- Please document any relevant changes in the documentation that can be found + [in its own repository](https://github.com/thelounge/thelounge.github.io). diff --git a/sources/Gruntfile.js b/sources/Gruntfile.js deleted file mode 100644 index f4c637e..0000000 --- a/sources/Gruntfile.js +++ /dev/null @@ -1,41 +0,0 @@ -module.exports = function(grunt) { - var libs = "client/js/libs/**/*.js"; - grunt.initConfig({ - watch: { - files: libs, - tasks: ["uglify"] - }, - uglify: { - options: { - compress: false - }, - js: { - files: { - "client/js/libs.min.js": libs - } - } - } - }); - grunt.loadNpmTasks("grunt-contrib-uglify"); - grunt.loadNpmTasks("grunt-contrib-watch"); - grunt.registerTask( - "build", - function() { - grunt.util.spawn({ - cmd: "node", - args: [ - "node_modules/handlebars/bin/handlebars", - "client/views/", - "-e", "tpl", - "-f", "client/js/shout.templates.js" - ] - }, function(err) { - if (err) console.log(err); - }); - } - ); - grunt.registerTask( - "default", - ["uglify", "build"] - ); -}; diff --git a/sources/LICENSE b/sources/LICENSE new file mode 100644 index 0000000..6f9d321 --- /dev/null +++ b/sources/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2016 All contributors to The Lounge +Copyright (c) 2014 Mattias Erming and contributors, as part of Shout. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sources/README.md b/sources/README.md index 78e57b9..54ea3c3 100644 --- a/sources/README.md +++ b/sources/README.md @@ -1,45 +1,83 @@ -# Shout [![](https://badge.fury.io/js/shout.png)](https://www.npmjs.org/package/shout) +[![#thelounge IRC channel on freenode](https://img.shields.io/badge/irc%20channel-%23thelounge%20on%20freenode-blue.svg)](https://avatar.playat.ch:1000/) +[![npm version](https://img.shields.io/npm/v/thelounge.svg)](https://www.npmjs.org/package/thelounge) +[![Travis CI Build Status](https://travis-ci.org/thelounge/lounge.svg?branch=master)](https://travis-ci.org/thelounge/lounge) +[![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/deymtp0lldq78s8t/branch/master?svg=true)](https://ci.appveyor.com/project/astorije/lounge/branch/master) +[![Dependency Status](https://david-dm.org/thelounge/lounge.svg)](https://david-dm.org/thelounge/lounge) +[![devDependency Status](https://david-dm.org/thelounge/lounge/dev-status.svg)](https://david-dm.org/thelounge/lounge?type=dev) -### [Try the Demo](http://demo.shout-irc.com/) +# The Lounge -__What is it?__ -Shout is a web IRC client that you host on your own server. +__What is it?__ + +The Lounge is a web IRC client that you host on your own server. + +*This is the official, community-managed fork of @erming's great initiative, the [Shout](https://github.com/erming/shout) project.* + +__What features does it have?__ -__What features does it have?__ - Multiple user support - Stays connected even when you close the browser - Connect from multiple devices at once - Responsive layout — works well on your smartphone - _.. and more!_ -## Install +__Why the fork?__ -``` -sudo npm install -g shout +We felt that the original [Shout](https://github.com/erming/shout) project +"stagnated" a little because its original author wanted it to remain his pet +project (which is a perfectly fine thing!). + +A bunch of people, excited about doing things a bit differently than the upstream +project forked it under a new name: “The Lounge”. + +This fork aims to be community managed, meaning that the decisions are taken +in a collegial fashion, and that a bunch of maintainers should be able to make +the review process quicker and more streamlined. + +## Installation and usage + +The Lounge requires [Node.js](https://nodejs.org/) v4 or more recent. + +### Running stable releases from npm (recommended) + +Run this in a terminal to install (or upgrade) the latest stable release from +[npm](https://www.npmjs.com/): + +```sh +[sudo] npm install -g thelounge ``` -## Usage +When installation is complete, run: -When the install is complete, go ahead and run this in your terminal: - -``` -shout --help +```sh +lounge start ``` -For more information, read the [documentation](http://shout-irc.com/docs/). +For more information, read the [documentation](https://thelounge.github.io/docs/), [wiki](https://github.com/thelounge/lounge/wiki), or run: + +```sh +lounge --help +``` + +### Running from source + +The following commands install the development version of The Lounge. A word of +caution: while it is the most recent codebase, this is not production-ready! + +```sh +git clone https://github.com/thelounge/lounge.git +cd lounge +npm install +npm start +``` ## Development setup -To run the app from source, just clone the code and run this in your terminal: +Simply follow the instructions to run The Lounge from source above, on your own +fork. -``` -npm install -grunt -./index.js --port 8080 -``` +Before submitting any change, make sure to: -And if you don't have [grunt](http://gruntjs.com/getting-started) installed already, just run `npm install -g grunt-cli`. - -## License - -Available under [the MIT license](http://mths.be/mit). +- Read the [Contributing instructions](https://github.com/thelounge/lounge/blob/master/CONTRIBUTING.md#contributing) +- Run `npm test` to execute linters and test suite +- Run `npm run build` if you change or add anything in `client/js/libs` or `client/views` diff --git a/sources/appveyor.yml b/sources/appveyor.yml new file mode 100644 index 0000000..e63ba59 --- /dev/null +++ b/sources/appveyor.yml @@ -0,0 +1,29 @@ +--- +# http://www.appveyor.com/docs/appveyor-yml + +# Build version format +version: "{build}" + +# Do not build on tags (GitHub only) +skip_tags: true + +environment: + nodejs_version: '4' + +install: + - ps: Install-Product node $env:nodejs_version + - npm install + - npm install mocha-appveyor-reporter + - echo --reporter mocha-appveyor-reporter >> test/mocha.opts + +test_script: + - node --version + - npm --version + - npm test + +# cache npm modules +cache: + - '%AppData%/npm-cache' + +# Don't actually build +build: off diff --git a/sources/client/css/bootstrap.css b/sources/client/css/bootstrap.css index e1eda89..e1d5b22 100644 --- a/sources/client/css/bootstrap.css +++ b/sources/client/css/bootstrap.css @@ -1022,104 +1022,6 @@ tbody.collapse.in { -o-transition: height 0.35s ease; transition: height 0.35s ease; } -.tooltip { - position: absolute; - z-index: 1070; - display: block; - visibility: visible; - font-size: 12px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); -} -.tooltip.in { - opacity: 0.9; - filter: alpha(opacity=90); -} -.tooltip.top { - margin-top: -3px; - padding: 5px 0; -} -.tooltip.right { - margin-left: 3px; - padding: 0 5px; -} -.tooltip.bottom { - margin-top: 3px; - padding: 5px 0; -} -.tooltip.left { - margin-left: -3px; - padding: 0 5px; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000000; -} -.tooltip.top-left .tooltip-arrow { - bottom: 0; - left: 5px; - border-width: 5px 5px 0; - border-top-color: #000000; -} -.tooltip.top-right .tooltip-arrow { - bottom: 0; - right: 5px; - border-width: 5px 5px 0; - border-top-color: #000000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000000; -} -.tooltip.bottom-left .tooltip-arrow { - top: 0; - left: 5px; - border-width: 0 5px 5px; - border-bottom-color: #000000; -} -.tooltip.bottom-right .tooltip-arrow { - top: 0; - right: 5px; - border-width: 0 5px 5px; - border-bottom-color: #000000; -} .clearfix:before, .clearfix:after, .dl-horizontal dd:before, diff --git a/sources/client/css/fonts/Lato-700/LICENSE.txt b/sources/client/css/fonts/Lato-700/LICENSE.txt new file mode 100755 index 0000000..98383e3 --- /dev/null +++ b/sources/client/css/fonts/Lato-700/LICENSE.txt @@ -0,0 +1,93 @@ +Copyright (c) 2010-2014 by tyPoland Lukasz Dziedzic (team@latofonts.com) with Reserved Font Name "Lato" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/sources/client/css/fonts/Lato-700/Lato-700.woff b/sources/client/css/fonts/Lato-700/Lato-700.woff new file mode 100755 index 0000000..66c8242 Binary files /dev/null and b/sources/client/css/fonts/Lato-700/Lato-700.woff differ diff --git a/sources/client/css/fonts/Lato-700/Lato-700.woff2 b/sources/client/css/fonts/Lato-700/Lato-700.woff2 new file mode 100755 index 0000000..a9ffeae Binary files /dev/null and b/sources/client/css/fonts/Lato-700/Lato-700.woff2 differ diff --git a/sources/client/css/fonts/Lato-regular/LICENSE.txt b/sources/client/css/fonts/Lato-regular/LICENSE.txt new file mode 100755 index 0000000..98383e3 --- /dev/null +++ b/sources/client/css/fonts/Lato-regular/LICENSE.txt @@ -0,0 +1,93 @@ +Copyright (c) 2010-2014 by tyPoland Lukasz Dziedzic (team@latofonts.com) with Reserved Font Name "Lato" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/sources/client/css/fonts/Lato-regular/Lato-regular.woff b/sources/client/css/fonts/Lato-regular/Lato-regular.woff new file mode 100755 index 0000000..fe27504 Binary files /dev/null and b/sources/client/css/fonts/Lato-regular/Lato-regular.woff differ diff --git a/sources/client/css/fonts/Lato-regular/Lato-regular.woff2 b/sources/client/css/fonts/Lato-regular/Lato-regular.woff2 new file mode 100755 index 0000000..c83fe95 Binary files /dev/null and b/sources/client/css/fonts/Lato-regular/Lato-regular.woff2 differ diff --git a/sources/client/css/fonts/fontawesome.svg b/sources/client/css/fonts/fontawesome.svg deleted file mode 100644 index d907b25..0000000 --- a/sources/client/css/fonts/fontawesome.svg +++ /dev/null @@ -1,520 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/sources/client/css/fonts/fontawesome.woff b/sources/client/css/fonts/fontawesome.woff deleted file mode 100644 index 628b6a5..0000000 Binary files a/sources/client/css/fonts/fontawesome.woff and /dev/null differ diff --git a/sources/client/css/fonts/inconsolatag.ttf b/sources/client/css/fonts/inconsolatag.ttf deleted file mode 100644 index 1a212c6..0000000 Binary files a/sources/client/css/fonts/inconsolatag.ttf and /dev/null differ diff --git a/sources/client/css/style.css b/sources/client/css/style.css index 327dce7..761b6f5 100644 --- a/sources/client/css/style.css +++ b/sources/client/css/style.css @@ -1,36 +1,76 @@ -@import url("https://fonts.googleapis.com/css?family=Lato:400,700"); -@import url("https://fonts.googleapis.com/css?family=Open+Sans:300,400,700"); @font-face { - font-family: FontAwesome; - src: url("fonts/fontawesome.svg") format("svg"), url("fonts/fontawesome.woff") format("woff"); + font-family: "Lato"; + font-weight: 400; + font-style: normal; + src: + local("Lato Regular"), + local("Lato-regular"), + url("fonts/Lato-regular/Lato-regular.woff2") format("woff2"), + url("fonts/Lato-regular/Lato-regular.woff") format("woff"); } + +@font-face { + font-family: "Lato"; + font-weight: 700; + font-style: normal; + src: + local("Lato Bold"), + local("Lato-700"), + url("fonts/Lato-700/Lato-700.woff2") format("woff2"), + url("fonts/Lato-700/Lato-700.woff") format("woff"); +} + +@font-face { + font-family: "FontAwesome"; + font-weight: normal; + font-style: normal; + src: + url("../fonts/fontawesome-webfont.woff2?v=4.6.3") format("woff2"), + url("../fonts/fontawesome-webfont.woff?v=4.6.3") format("woff"); +} + html, body { height: 100%; } + body { - background: #505d70; background: #455164; color: #222; font: 16px Lato, sans-serif; margin: 0; + + /** + * Disable pull-to-refresh on mobile that conflicts with scrolling the message list. + * See http://stackoverflow.com/a/29313685/1935861 + */ + overflow-y: hidden; } + a { transition: opacity .2s; } + a:hover { text-decoration: none; opacity: .8; } + h1, h2 { font: inherit; line-height: inherit; margin: 0; } + +h1.title { + margin-bottom: 10px; +} + input { outline: 0; } + button { border: none; background: none; @@ -38,25 +78,14 @@ button { outline: none; padding: 0; } -.web-app-mode { - padding-top: 20px; -} -.tooltip-inner { - background: #fff; - border-radius: 2px; - color: #262c36; -} -.tooltip.top .tooltip-arrow { - border-top-color: #fff; -} + .btn { - border: 2px solid #84d1ff; border: 2px solid #84ce88; border-radius: 3px; - color: #84d1ff; color: #84ce88; display: inline-block; - font: bold 12px Lato, sans-serif; + font-size: 12px; + font-weight: bold; letter-spacing: 1px; margin-bottom: 10px; padding: 9px 17px; @@ -64,19 +93,22 @@ button { transition: background .2s, border-color .2s, color .2s; word-spacing: 3px; } + .btn:disabled, .btn:hover { - background: #84d1ff; background: #84ce88; color: #fff; } + .btn:active { box-shadow: none; opacity: .8; } + .btn:disabled { opacity: .6; } + .container { margin: 80px auto; max-width: 480px; @@ -85,62 +117,251 @@ button { -webkit-overflow-scrolling: touch; padding: 0 30px; } + ::-moz-placeholder { color: rgba(0, 0, 0, .35); opacity: 1; } + ::-webkit-input-placeholder { color: rgba(0, 0, 0, .35); } + :-ms-input-placeholder { color: rgba(0, 0, 0, .35) !important; } + +/* Icons */ + +#viewport .lt:before, +#viewport .rt:before, +#chat button.menu:before, +#sidebar .chan:before, +#chat .title:before, +#footer .icon, +#chat .count:before, +#settings #play:before, +#form #submit:before, +#chat .invite .from:before, +#chat .join .from:before, +#chat .kick .from:before, +#chat .part .from:before, +#chat .quit .from:before, +#chat .topic .from:before, +#chat .mode .from:before, +#chat .ctcp .from:before, +#chat .whois .from:before, +#chat .nick .from:before, +#chat .action .from:before, +.context-menu-item:before, +#nick button:before { + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; /* Can't have font-size inherit on line above, so need to override */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +#viewport .lt:before { content: "\f0c9"; /* http://fontawesome.io/icon/bars/ */ } +#viewport .rt:before { content: "\f0c0"; /* http://fontawesome.io/icon/users/ */ } +#chat button.menu:before { content: "\f142"; /* http://fontawesome.io/icon/ellipsis-v/ */ } + +.context-menu-user:before { content: "\f007"; /* http://fontawesome.io/icon/user/ */ } +.context-menu-chan:before { content: "\f0f6"; /* http://fontawesome.io/icon/file-text-o/ */ } +.context-menu-close:before { content: "\f00d"; /* http://fontawesome.io/icon/times/ */ } + +#sidebar .chan.lobby:before, +#chat .lobby .title:before { content: "\f0a0"; /* http://fontawesome.io/icon/hdd-o/ */ } + +#sidebar .chan.query:before, +#chat .query .title:before { content: "\f0e6"; /* http://fontawesome.io/icon/comments-o/ */ } + +#sidebar .chan.channel:before, +#chat .channel .title:before { content: "\f0f6"; /* http://fontawesome.io/icon/file-text-o/ */ } + +#sidebar .chan.special:before, +#chat .special .title:before { content: "\f03a"; /* http://fontawesome.io/icon/list/ */ } + +#footer .sign-in:before { content: "\f023"; /* http://fontawesome.io/icon/lock/ */ } +#footer .connect:before { content: "\f067"; /* http://fontawesome.io/icon/plus/ */ } +#footer .settings:before { content: "\f013"; /* http://fontawesome.io/icon/cog/ */ } +#footer .sign-out:before { content: "\f011"; /* http://fontawesome.io/icon/power-off/ */ } + +#form #submit:before { content: "\f1d8"; /* http://fontawesome.io/icon/paper-plane/ */ } + +#chat .invite .from:before { + content: "\f003"; /* http://fontawesome.io/icon/envelope-o/ */ + color: #2ecc40; +} + +#chat .part .from:before, +#chat .quit .from:before { + content: "\f08b"; /* http://fontawesome.io/icon/sign-out/ */ + color: #ff4136; + display: inline-block; + -webkit-transform: rotate(180deg); + transform: rotate(180deg); +} + +#chat .topic .from:before { + content: "\f0a1"; /* http://fontawesome.io/icon/bullhorn/ */ + color: #2ecc40; +} + +#chat .mode .from:before { + content: "\f05a"; /* http://fontawesome.io/icon/info-circle/ */ + color: #2ecc40; +} + +#chat .ctcp .from:before { + content: "\f0f6"; /* http://fontawesome.io/icon/file-text-o/ */ +} + +#chat .whois .from:before { + content: "\f007"; /* http://fontawesome.io/icon/user/ */ + color: #2ecc40; +} + +#chat .nick .from:before { + content: "\f007"; /* http://fontawesome.io/icon/user/ */ + color: #2ecc40; +} + +#chat .join .from:before { + content: "\f090"; /* http://fontawesome.io/icon/sign-in/ */ + color: #2ecc40; +} + +#chat .kick .from:before { + content: "\f05e"; /* http://fontawesome.io/icon/ban/ */ + color: #ff4136; +} + +#chat .action .from:before { + content: "\f005"; /* http://fontawesome.io/icon/star/ */ +} + +#chat .count:before { + color: #cfcfcf; + content: "\f002"; /* http://fontawesome.io/icon/search/ */ + position: absolute; + right: 18px; + font-size: 14px; + line-height: 50px; +} + +#settings #play:before { + content: "\f028"; /* http://fontawesome.io/icon/volume-up/ */ + margin-right: 9px; +} + +#set-nick:before { + content: "\f040"; /* http://fontawesome.io/icon/pencil/ */ +} + +#submit-nick:before { + content: "\f00c"; /* http://fontawesome.io/icon/check/ */ +} + +#cancel-nick:before { + content: "\f00d"; /* http://fontawesome.io/icon/times/ */ +} + +/* End icons */ + #wrap { height: 100%; overflow: hidden; } + #viewport { height: 100%; - transition: all .4s; + transition: transform 160ms, -webkit-transform 160ms; -webkit-transform: translateZ(0); - transform: translateZ(0); + transform: translateZ(0); -webkit-perspective: 1000; - perspective: 1000; + perspective: 1000; } + +#viewport.menu-open { + -webkit-transform: translate3d(220px, 0, 0); + transform: translate3d(220px, 0, 0); +} + +#viewport.menu-dragging { + transition: none !important; +} + +#viewport.menu-open .messages { + pointer-events: none; +} + #viewport .lt, -#viewport .rt { +#viewport .rt, +#chat button.menu { color: #ccc; display: none; float: left; - line-height: 40px; + font-size: 14px; + line-height: 1; height: 36px; margin: 6px 12px 0 -12px; width: 36px; } -#viewport .lt:before, -#viewport .rt:before { - font: 14px FontAwesome; - content: "\f0c9"; + +#viewport .lt { + position: relative; } + +/* Notification dot on the top right corner of the menu icon */ +#viewport .lt:after { + content: ""; + position: absolute; + top: 9px; + right: 7px; + background-color: #e74c3c; + width: 10px; + height: 10px; + border-radius: 50%; + border: 2px solid white; + opacity: 0; + transition: opacity .2s; +} + +#viewport .lt.notified:after { + opacity: 1; +} + +#viewport .rt-tooltip { + float: right; +} + #viewport .rt { display: block; - float: right; - margin: 6px -12px 0 12px; + margin: 6px -12px 0 0; } + +#chat button.menu { + display: block; + float: right; + margin: 6px -8px 0 12px; +} + #viewport.rt #chat .sidebar { -webkit-transform: translate3d(180px, 0, 0); - transform: translate3d(180px, 0, 0); + transform: translate3d(180px, 0, 0); } + #sidebar { - bottom: 52px; + bottom: 48px; left: 0; - overflow: hidden; - /*overflow-y: auto;*/ + overflow: auto; + overflow-x: hidden; -webkit-overflow-scrolling: touch; position: absolute; top: 0; width: 220px; } + #sidebar button, #sidebar .chan, #sidebar .sign-out { @@ -150,22 +371,26 @@ button { cursor: pointer; font-size: 14px; } + #sidebar button:hover, #sidebar .chan:hover, #sidebar .active { color: #fff; } + #sidebar .networks { - min-height: 100%; padding: 20px 30px 0; } + #sidebar .networks:empty { padding: 0; } + #sidebar .network, #sidebar .network-placeholder { margin-bottom: 30px; } + #sidebar .empty { color: #9ca5b4; line-height: 1.6; @@ -174,158 +399,196 @@ button { padding: 20px 40px; text-align: center; } + #sidebar .chan, #sidebar .chan-placeholder { display: block; margin: 1px -10px; - padding: 6px 10px 8px; + padding: 6px 10px 8px 36px; position: relative; text-align: left; transition: color .2s; width: 180px; } + #sidebar .chan-placeholder { padding-bottom: 10px; } + #sidebar .chan:first-child { color: #84ce88; font-size: 15px; font-weight: bold; } + #sidebar .chan:first-child:hover, #sidebar .chan:first-child.active { color: #c0f8c3; } + #sidebar .chan:before, #chat .title:before { - font: 14px FontAwesome; float: left; margin-top: 3px; margin-right: 12px; - width: 14px; text-align: center; } + +#sidebar .chan:before { + position: absolute; + top: 4px; + left: 10px; +} + #chat .title:before { margin-top: 17px; } -#sidebar .chan.lobby:before, -#chat .lobby .title:before { - content: "\f0a0"; + +#sidebar .chan .name { + position: relative; + z-index: 0; + display: block; + overflow: hidden; + white-space: nowrap; + margin-right: 5px; } -#sidebar .chan.query:before, -#chat .query .title:before { - content: "\f0e6"; -} -#sidebar .chan.channel:before, -#chat .channel .title:before { - content: "\f0f6"; -} -#sidebar .chan:hover .badge { - opacity: 0; -} -#sidebar .chan:hover .close { - opacity: .2; + +#sidebar .chan .name:after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 20px; + background: linear-gradient(to right, rgba(69, 81, 100, 0) 0%, rgba(69, 81, 100, 1) 100%); + content: " "; } + #sidebar .badge { background: rgba(255, 255, 255, .06); border-radius: 3px; color: #afb6c0; font-size: 10px; margin-top: 1px; + margin-right: -5px; + margin-left: 5px; padding: 3px 6px; - position: absolute; - right: 5px; - transition: all .2s; + float: right; + transition: opacity .2s, background-color .2s, color .2s; } + #sidebar .badge.highlight { background: #fff; color: #49505a; } + +#sidebar .chan.active .badge, #sidebar .badge:empty { - display: none; + opacity: 0; } + #sidebar .close { - background: no-repeat url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+DQogPGc+DQogIDx0aXRsZT5MYXllciAxPC90aXRsZT4NCiAgPHBhdGggZmlsbD0iI2ZmZmZmZiIgaWQ9InN2Z18xIiBkPSJtMTIuODcyLDEuNTYyYzAuMTk1MDAxLDAuMTk0IDAuMTk1MDAxLDAuNTEzIDAsMC43MDdsLTMuODg5LDMuODkxYy0wLjE5MywwLjE5NCAtMC4xOTMsMC41MTMgMCwwLjcwOGwzLjg4NywzLjg5MmMwLjE5NSwwLjE5NCAwLjE5NSwwLjUxMyAwLDAuNzA3bC0xLjQxNTk5OSwxLjQxM2MtMC4xOTMwMDEsMC4xOTQgLTAuNTEyLDAuMTk0IC0wLjcwNzAwMSwwbC0zLjg4NSwtMy44OTJjLTAuMTk0LC0wLjE5NCAtMC41MTMsLTAuMTk0IC0wLjcwNywwbC0zLjg4OSwzLjg4OWMtMC4xOTQsMC4xOTUgLTAuNTEzLDAuMTk1IC0wLjcwNywwbC0xLjQxNCwtMS40MTU5OTljLTAuMTk0LC0wLjE5MzAwMSAtMC4xOTQsLTAuNTEyIDAsLTAuNzA3MDAxbDMuODksLTMuODg5YzAuMTk0LC0wLjE5NCAwLjE5NCwtMC41MTMgMCwtMC43MDhsLTMuODg3LC0zLjg5MWMtMC4xOTQsLTAuMTk1IC0wLjE5NCwtMC41MTMgMCwtMC43MDdsMS40MTUsLTEuNDE0YzAuMTk0LC0wLjE5NCAwLjUxMywtMC4xOTQgMC43MDcsMGwzLjg4NSwzLjg5MWMwLjE5NCwwLjE5NSAwLjUxMywwLjE5NSAwLjcwNywwLjAwMWwzLjg4OCwtMy44OWMwLjE5NSwtMC4xOTMgMC41MTQsLTAuMTkzIDAuNzA3LDBsMS40MTUsMS40MTV6Ii8+DQogPC9nPg0KPC9zdmc+); - background-size: 50%; - background-position: 5px 6px; border-radius: 3px; - height: 18px; - margin-top: 1px; margin-right: 5px; + visibility: hidden; opacity: 0; position: absolute; + z-index: 2; right: 0; - transition: all .2s; + transition: opacity .2s, background-color .2s; +} + +#sidebar .close:before { + font-size: 18px; + font-weight: normal; + display: inline-block; + line-height: 18px; width: 18px; + height: 18px; + text-align: center; + content: "×"; + color: #fff; } -#sidebar .close:hover { + +#sidebar .chan.active .close { + visibility: visible; + opacity: .4; +} + +#sidebar .chan.active .close:hover { background-color: rgba(0, 0, 0, .1); - opacity: .7 !important; + opacity: 1; } + #sidebar .tse-scrollbar { top: 2px; right: 3px; } + +#sidebar, +#footer { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + #footer { background: rgba(0, 0, 0, .06); - border-radius: 2px; - bottom: 4px; - height: 48px; - left: 5px; - line-height: 48px; + bottom: 0; + height: 45px; + left: 0; + font-size: 14px; + line-height: 45px; position: absolute; text-align: center; - width: 210px; -} -#footer button { - border: 0; + width: 220px; } + #footer button.active { color: #fff; } + #footer .icon { color: #9ca5b4; display: inline-block; - font: 14px FontAwesome; line-height: 34px; - padding: 0px 12px; + padding: 0 12px; } + .signed-out #footer .sign-in { display: inline-block; } + .signed-out #footer .connect, .signed-out #footer .sign-out { display: none; } + .public #footer .sign-in, .public #footer .sign-out { display: none; } + #footer .sign-in { display: none; } -#footer .sign-in:before { - content: "\f023"; -} -#footer .connect:before { - content: "\f067"; -} -#footer .settings:before { - content: "\f013"; -} -#footer .sign-out:before { - content: "\f13e"; -} + #main { - background: #fff; - border-radius: 2px; - bottom: 4px; + bottom: 0; left: 220px; - overflow: hidden; position: absolute; - right: 5px; - top: 4px; + right: 0; + top: 0; + display: -webkit-flex; + display: flex; + -webkit-flex-direction: column; + flex-direction: column; } + +.signed-out #main { + left: 0; /* Hide the sidebar when user is signed out */ +} + #header { display: none; height: 40px; @@ -333,16 +596,13 @@ button { top: 0; width: 100%; } -#windows { - bottom: 48px; - position: absolute; - top: 0px; - width: 100%; -} + #windows label { font-size: 14px; } + #windows .input { + background-color: white; border: 1px solid #cdd3da; border-radius: 2px; color: #222; @@ -352,25 +612,22 @@ button { outline: 0; padding: 8px 10px; transition: border-color .2s; - -webkit-appearance: none; width: 100%; } + +#windows select.input { + height: 35px; +} + +#user-specified-css-input { + resize: vertical; +} + #windows .input:hover, #windows .input:focus { border-color: #79838c; } -#windows .window:before, -#windows .chan:before { - background: #f4f4f4; - background-image: linear-gradient(#f4f4f4, #ececec); - border-bottom: 1px solid #d7d7d7; - content: " "; - display: block; - height: 10px; - position: relative; - z-index: 10; -} -#windows .chan, + #windows .window { background: #fff; bottom: 0; @@ -379,15 +636,14 @@ button { position: absolute; right: 0; top: 0; -} -#windows .window { - bottom: -44px !important; overflow-y: auto; -webkit-overflow-scrolling: touch; } + #windows .window h1 { - font: 36px Lato; + font-size: 36px; } + #windows .window h2 { border-bottom: 1px solid #eee; color: #7f8c8d; @@ -395,67 +651,80 @@ button { margin: 30px 0 10px; padding-bottom: 7px; } + #windows .active { display: block; } + #windows .header { border-bottom: 1px solid #e7e7e7; - line-height: 50px !important; + line-height: 48px; height: 48px; padding: 0 20px; + overflow: hidden; } + #windows .header .title { - font: 14px Lato; + font-size: 14px; } + #windows .header .topic { - /* Hidden for now */ - display: none; color: #777; margin-left: 8px; - text-transform: capitalize; -} -#windows .header .right { - float: right; - margin-right: -10px; - margin-top: -2px; -} -#windows .header .button { - background: #f4f4f4; - background-image: linear-gradient(#f4f4f4, #ececec); - border: 1px solid #d7d7d7; - border-bottom-color: #b7b7b7; - border-radius: 2px; - color: #555; - font: 12px Lato, sans-serif; - height: 25px; - line-height: 0; - padding: 0 10px; -} -#windows .header .button:hover { - opacity: 1; + word-break: break-all; } + #windows .window .header { display: none; } -#chat { + +#chat-container, +#chat .chan { + position: absolute; + top: 0; + right: 0; bottom: 0; left: 0; - position: absolute; - right: 0; - top: 0; } -#chat, -#windows .header { + +#windows #chat-container.active { + display: -webkit-flex; + display: flex; + -webkit-flex-direction: column; + flex-direction: column; +} + +#chat { + position: relative; + overflow: hidden; + -webkit-flex: 1; + flex: 1; +} + +#chat .chan { + display: none; +} + +#chat .chan.active { + display: block; +} + +#windows .header .topic, +.messages .msg, +.sidebar { font: 12px Consolas, Menlo, Monaco, "Lucida Console", "DejaVu Sans Mono", "Courier New", monospace; line-height: 1.4; } -#chat button:hover { - opacity: .6; + +#windows #chat .header { + display: block; } + #chat .chat, #chat .sidebar { - top: 58px; + top: 48px; } + #chat .chat { bottom: 0; left: 0; @@ -464,9 +733,15 @@ button { position: absolute; right: 180px; } -#viewport.rt .chat { - right: 0; + +#chat .special { + bottom: -47px; } + +#viewport.rt .chat { + right: 0; +} + #chat .sidebar { background: #fff; border-left: 1px solid #e7e7e7; @@ -476,30 +751,30 @@ button { width: 180px; transition: all .4s; -webkit-transform: translateZ(0); - transform: translateZ(0); + transform: translateZ(0); -webkit-perspective: 1000; - perspective: 1000; + perspective: 1000; } + #chat .lobby .chat, +#chat .special .chat, #chat .query .chat { right: 0; } + #chat .lobby .sidebar, +#chat .special .sidebar, #chat .query .sidebar { display: none; } + #chat .show-more { display: none; padding: 10px; - position: absolute; + padding-bottom: 0; width: 100%; } -#chat .show-more.show + .messages .msg:first-child { - padding-top: 47px !important; -} -#chat .show-more.show + .messages .msg:first-child > span { - padding-top: 52px !important; -} + #chat .show-more-button { background: #f4f4f4; background-image: linear-gradient(#f4f4f4, #ececec); @@ -507,36 +782,67 @@ button { border-bottom-color: #b7b7b7; border-radius: 2px; color: #555; - font: 12px Lato, sans-serif; + font-size: 12px; height: 34px; line-height: 0; width: 100%; } + #chat .show-more-button:hover { opacity: 1; } + #chat .messages { display: table; + table-layout: fixed; width: 100%; + padding: 10px 0; } + #chat .msg { - display: table-row; word-wrap: break-word; + word-break: break-word; /* Webkit-specific */ } -#chat .msg:first-child > span { - padding-top: 10px; + +#chat .unread-marker { + position: relative; + text-align: center; + opacity: .5; + margin: 0 10px; + z-index: 0; + font-weight: bold; + font-size: 12px; } -#chat .msg:last-child { - height: 100%; + +#chat .unread-marker:before { + position: absolute; + z-index: -1; + content: ""; + left: 0; + right: 0; + top: 50%; + border-top: 1px solid #e74c3c; } -#chat .msg:last-child .text { - padding-bottom: 10px; + +#chat .unread-marker-text:before { + content: "New messages"; + background-color: white; + color: #e74c3c; + padding: 0 10px; } -#chat .msg .type { - color: #ccc; + +#chat .unread-marker:last-child { display: none; - font-style: normal; } + +.inline-channel { + cursor: pointer; +} + +.inline-channel:hover { + opacity: .6; +} + #chat .time, #chat .from, #chat .text { @@ -544,123 +850,234 @@ button { padding: 2px 0; vertical-align: top; } + #chat .time { color: #ddd; text-align: right; - width: 46px; + max-width: 46px; min-width: 46px; } + #chat .from { border-right: 1px solid #f6f6f6; color: #b1c3ce; padding-right: 10px; text-align: right; - width: 134px; + max-width: 134px; min-width: 134px; } + +#loading a, +#chat .special .time, +#chat .special .from { + display: none; +} + #chat a { - color: #84ce88; color: #50a656; } -#chat.no-colors .from button, -#chat.no-colors .sidebar button { - color: #84ce88 !important; - color: #50a656 !important; + +/* Nicknames */ + +#chat .user { + cursor: pointer; + color: #50a656; } + +#chat .user:hover { + opacity: .6; +} + +#chat.colored-nicks .user.color-1 { color: #1396cf; } +#chat.colored-nicks .user.color-2 { color: #ffcf89; } +#chat.colored-nicks .user.color-3 { color: #00dc5f; } +#chat.colored-nicks .user.color-4 { color: #ff5bc8; } +#chat.colored-nicks .user.color-5 { color: #ff0e1b; } +#chat.colored-nicks .user.color-6 { color: #000094; } +#chat.colored-nicks .user.color-7 { color: #006441; } +#chat.colored-nicks .user.color-8 { color: #00566e; } +#chat.colored-nicks .user.color-9 { color: #ff0078; } +#chat.colored-nicks .user.color-10 { color: #15d5a3; } +#chat.colored-nicks .user.color-11 { color: #006b3b; } +#chat.colored-nicks .user.color-12 { color: #00c5ba; } +#chat.colored-nicks .user.color-13 { color: #00465b; } +#chat.colored-nicks .user.color-14 { color: #ffafce; } +#chat.colored-nicks .user.color-15 { color: #ff3b12; } +#chat.colored-nicks .user.color-16 { color: #16cc6a; } +#chat.colored-nicks .user.color-17 { color: #ff0072; } +#chat.colored-nicks .user.color-18 { color: #ff5877; } +#chat.colored-nicks .user.color-19 { color: #ff1753; } +#chat.colored-nicks .user.color-20 { color: #007a56; } +#chat.colored-nicks .user.color-21 { color: #095092; } +#chat.colored-nicks .user.color-22 { color: #000bde; } +#chat.colored-nicks .user.color-23 { color: #00bca9; } +#chat.colored-nicks .user.color-24 { color: #00367d; } +#chat.colored-nicks .user.color-25 { color: #009ec4; } +#chat.colored-nicks .user.color-26 { color: #006119; } +#chat.colored-nicks .user.color-27 { color: #008bb8; } +#chat.colored-nicks .user.color-28 { color: #469c00; } +#chat.colored-nicks .user.color-29 { color: #ff0f95; } +#chat.colored-nicks .user.color-30 { color: #ff7615; } +#chat.colored-nicks .user.color-31 { color: #ff4846; } +#chat.colored-nicks .user.color-32 { color: #ff199b; } + #chat .text { padding-left: 10px; padding-right: 6px; } -#chat .wrap, -#chat .text a { - font-style: normal; - word-break: break-all; - word-wrap: break-word; -} + #chat .self .text { color: #999; } -#chat .join .type, -#chat .part .type, -#chat .mode .type, -#chat .nick .type, -#chat .kick .type, -#chat .quit .type, -#chat .quit .type, -#chat .topic .type { - display: inline; + +#chat .msg.motd .text, +#chat .msg.message .text, +#chat .msg.action .action-text, +#chat .msg.notice .text { + white-space: pre-wrap; + overflow: hidden; } -#chat .error, -#chat .error .from, -#chat .highlight, -#chat .highlight .from { + +#chat .msg.channel_list_loading .text { + color: #999; + font-style: italic; + padding-left: 20px; +} + +#chat .msg.channel_list_truncated .text { color: #f00; + padding-left: 20px; } -#chat.hide-join .join span, -#chat.hide-mode .mode span, -#chat.hide-motd .motd span, -#chat.hide-nick .nick span, -#chat.hide-part .part span, + +#chat table.channel-list { + margin: 5px 10px; + width: calc(100% - 30px); +} + +#chat table.channel-list th, +#chat table.channel-list td { + padding: 5px; + vertical-align: top; + border-bottom: #eee 1px solid; +} + +#chat table.channel-list .channel, +#chat table.channel-list .topic { + text-align: left; +} + +#chat table.channel-list .users { + text-align: center; +} + +#chat table.channel-list td.channel .inline-channel { + color: #428bca; +} + +#chat table.channel-list td { + color: #555; +} + +#chat.hide-join .join, +#chat.hide-mode .mode, +#chat.hide-motd .motd, +#chat.hide-nick .nick, +#chat.hide-part .part, #chat.hide-quit .quit { display: none !important; } -#chat .notice .type { - display: none; + +#chat .join .text, +#chat .kick .text, +#chat .mode .text, +#chat .nick .text, +#chat .part .text, +#chat .quit .text, +#chat .topic .text, +#chat .topic_set_by .text { + color: #999; } -#chat .action, -#chat .chan .action .user { - color: #f39c12 !important; + +#chat .action .from, +#chat .action .text, +#chat .action .user { + color: #f39c12; } -#chat .action .user:before { - content: "* "; + +#chat .notice .time, +#chat .notice .text, +#chat .chan .notice .user { + color: #0074d9 !important; } -#chat .action .user:after { - content: ""; + +#chat .notice .user:before { + content: "Notice: "; } + +#chat .error, +#chat .error .from, +#chat .channel .highlight .from, +#chat .channel .highlight .text, +#chat .channel .highlight .user { + color: #f00; +} + +#chat .msg.toggle .time { + visibility: hidden; +} + #chat .toggle-button { background: #f5f5f5; border-radius: 2px; display: inline-block; color: #666; height: 1em; - line-height: 0px; - padding: 0px 6px; + line-height: 0; + padding: 0 6px; } + #chat .toggle-content { background: #f5f5f5; border-radius: 2px; display: none; color: #222; - font: 12px Lato; + font-size: 12px; max-width: 100%; padding: 6px 8px; margin-top: 2px; } + #chat .toggle-content a { color: inherit; } + #chat .toggle-content img { max-width: 100%; - max-height: 100%; + max-height: 250px; display: block; margin: 2px 0; } + #chat .toggle-content .thumb { max-height: 110px; max-width: 210px; } + #chat .toggle-content .head { font-weight: bold; } + #chat .toggle-content .body { color: #999; max-width: 460px; word-break: normal; word-wrap: break-word; } + #chat .toggle-content.show { display: inline-block !important; } + #chat .count { background: #fafafa; height: 48px; @@ -669,16 +1086,7 @@ button { right: 0; top: 0; } -#chat .count:before { - color: #cfcfcf; - font: 14px FontAwesome; - content: "\f002"; - position: absolute; - right: 18px; - line-height: 50px; - transition: color .2s; - z-index: 0; -} + #chat .search { color: #222; border: 0; @@ -689,6 +1097,7 @@ button { position: relative; width: 100%; } + #chat .names { bottom: 0; overflow: auto; @@ -699,14 +1108,13 @@ button { top: 48px; width: 100%; } -#chat .names button { + +#chat .names .user { display: block; line-height: 1.6; padding: 0 16px; } -#chat .names .inner { - width: 300px; -} + #chat .user-mode:before { content: ""; border-bottom: 1px solid #eee; @@ -715,173 +1123,460 @@ button { padding: 12px 16px 10px; margin-bottom: 10px; } + #chat .user-mode.owner:before { content: "Owners"; } + #chat .user-mode.admin:before { content: "Administrators"; } + #chat .user-mode.op:before { content: "Operators"; } + #chat .user-mode.half-op:before { content: "Half-Operators"; } + #chat .user-mode.voice:before { content: "Voiced"; } + #chat .user-mode.normal:before { content: "Users"; } + +#loading { + font-size: 14px; + z-index: 1; +} + +#loading p { + margin-top: 10px; +} + +#loading-slow { + display: none; +} + #sign-in label { display: block; margin-top: 10px; } -#sign-in .title { - margin-bottom: 10px; -} + #sign-in .remember { float: left; font-size: 14px; margin-top: 12px; } + #sign-in .remember input { float: left; margin: 3px 10px 0 0; } + #sign-in .btn { margin-top: 25px; } + #sign-in .error { color: #e74c3c; margin-top: 1em; } -#sign-in .container { - margin-top: 120px; -} + #connect label { display: block; margin-top: 11px; } -#connect .title { - margin-bottom: 10px; -} + #connect .port:before { content: ":"; margin: 9px 0 0 -17px; position: absolute; } + #connect .tls { float: left; font-size: 14px; margin-top: 6px; } + #connect .tls input { float: left; margin: 3px 10px 0 0; } + #connect .btn { float: left; margin-top: 30px; } -#settings .title { - margin-bottom: -10px; -} + #settings .opt { display: block; padding: 5px 0 10px 1px; } + #settings .opt input { float: left; margin: 4px 10px 0 0; } + #settings .about, #settings #play { color: #7f8c8d; } + #settings .about small { margin-left: 2px; } + +#settings #play { + font-size: 14px; + transition: opacity .2s; +} + #settings #play:hover { opacity: .8; } -#settings #play:before { - content: "\f028"; - font: 14px FontAwesome; - margin-right: 9px; -} + #settings .about { font-size: 14px; padding-top: 2px; line-height: 1.8; } + +#settings #change-password .error, +#settings #change-password .success { + margin-bottom: 1em; +} + +#settings #change-password .error { + color: #e74c3c; +} + +#settings #change-password .success { + color: #2ecc40; +} + +#settings .error { + color: #e74c3c; + margin-top: .2em; +} + #form { - background: #e4eaee; background: #eee; - border-top: 1px solid #cfdae1; border-top: 1px solid #ddd; - bottom: 0; - height: 48px; - left: 0; - position: absolute; - right: 0px; + -webkit-flex: 0 0 auto; + flex: 0 0 auto; + padding: 5px; } -#form .inner { - bottom: 7px; - left: 7px; - position: absolute; - right: 7px; - top: 6px; -} -#form .input { + +#windows #form .input { font: 12px Consolas, Menlo, Monaco, "Lucida Console", "DejaVu Sans Mono", "Courier New", monospace; - left: 0; - height: 34px; - margin-right: 64px; - position: relative; + border: 1px solid #ddd; + border-radius: 2px; + margin: 0; + padding: 0; + background: white; + display: -webkit-flex; + display: flex; + -webkit-align-items: flex-end; + align-items: flex-end; } + +[contenteditable]:focus { + outline: none; +} + +/* Nick editor */ + #form #nick { background: #f6f6f6; color: #666; - position: absolute; font: inherit; font-size: 11px; - margin: 5px; - line-height: 26px; + margin: 4px; + line-height: 22px; height: 24px; - padding: 0 9px; - border-radius: 1px; + padding-left: 9px; + padding-right: 5px; + border-radius: 2px; -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -#form #input { - border: 1px solid #cfdae1; - border: 1px solid #ddd; - font: inherit; - border-radius: 2px; - height: 100%; - outline: none; - padding: 0 10px; - -webkit-appearance: none; - width: 100%; -} -#form #submit { - background: #f4f4f4; - background-image: linear-gradient(#f4f4f4, #ececec); - border: 1px solid #d7d7d7; - border-bottom-color: #b7b7b7; - border-radius: 2px; - font: 12px Lato, sans-serif; - color: #555; - height: 34px; - position: absolute; - right: 0; - transition: opacity .3s; - width: 58px; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-flex: 0 0 auto; + flex: 0 0 auto; + border: 1px solid transparent; + transition: border-color .2s; } +#form #nick-value { + padding-right: 5px; +} + +#form #nick.editable { + border-color: black; +} + +#nick button#set-nick, +#nick button#submit-nick, +#nick button#cancel-nick { + color: #aaa; + width: 18px; +} + +#nick.editable button#set-nick, +#nick.editable #set-nick-tooltip, +#nick button#submit-nick, +#nick:not(.editable) #save-nick-tooltip, +#nick button#cancel-nick, +#nick:not(.editable) #cancel-nick-tooltip { + display: none; +} + +#nick.editable button#submit-nick, +#nick.editable button#cancel-nick { + display: inline-block; +} + +/* End nick editor */ + +#form #input { + background: transparent; + border: none; + font: inherit; + min-height: 18px; /* Required when computing input height at char deletion */ + height: 18px; + max-height: 90px; + line-height: 1.5; + outline: none; + margin: 5px; + padding: 0; + resize: none; + -webkit-flex: 1 0 auto; + flex: 1 0 auto; + align-self: center; +} + +#form #submit { + color: #9ca5b4; + font-size: 14px; + height: 32px; + transition: opacity .2s; + width: 32px; + -webkit-flex: 0 0 auto; + flex: 0 0 auto; +} + +#form #submit:hover { + opacity: .6; +} + +#context-menu-container { + display: none; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1000; + background: transparent; +} + +#context-menu { + position: absolute; + list-style: none; + margin: 0; + padding: 0; + min-width: 160px; + font-size: 14px; + background-color: #fff; + box-shadow: 0 3px 12px rgba(0, 0, 0, .15); + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 2px; +} + +.context-menu-divider { + height: 1px; + margin: 6px 0; + background-color: rgba(0, 0, 0, .1); +} + +.context-menu-item { + cursor: pointer; + display: block; + padding: 4px 8px; + color: #333; + margin-top: 6px; + margin-bottom: 6px; +} + +.context-menu-item:hover { + background-color: #f6f6f6; +} + +.context-menu-item:before { + width: 20px; + display: inline-block; +} + +/** + * Tooltips + * See http://primercss.io/tooltips/ + */ +.tooltipped { + position: relative; +} + +.tooltipped:after { + position: absolute; + z-index: 1000000; + display: inline-block; + visibility: hidden; + opacity: 0; + padding: 5px 8px; + font: 12px Lato; + line-height: 1.2; + 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: #222; + border-radius: 3px; + -webkit-font-smoothing: subpixel-antialiased; + transition: .2s; +} + +.tooltipped:before { + position: absolute; + z-index: 1000001; + display: inline-block; + visibility: hidden; + opacity: 0; + width: 0; + height: 0; + color: #fff; + pointer-events: none; + content: ""; + border: 5px solid transparent; + transition: .2s; +} + +.tooltipped:hover:before, +.tooltipped:hover:after, +.tooltipped:active:before, +.tooltipped:active:after, +.tooltipped:focus:before, +.tooltipped:focus:after { + visibility: visible; + opacity: 1; + text-decoration: none; +} + +.tooltipped-s:after, +.tooltipped-se:after, +.tooltipped-sw:after { + top: 100%; + right: 50%; + margin-top: 5px; +} + +.tooltipped-s:before, +.tooltipped-se:before, +.tooltipped-sw:before { + top: auto; + right: 50%; + bottom: -5px; + margin-right: -5px; + border-bottom-color: #222; +} + +.tooltipped-se:after { + right: auto; + left: 50%; + margin-left: -15px; +} + +.tooltipped-sw:after { + margin-right: -15px; +} + +.tooltipped-n:after, +.tooltipped-ne:after, +.tooltipped-nw:after { + right: 50%; + bottom: 100%; + margin-bottom: 5px; +} + +.tooltipped-n:before, +.tooltipped-ne:before, +.tooltipped-nw:before { + top: -5px; + right: 50%; + bottom: auto; + margin-right: -5px; + border-top-color: #222; +} + +.tooltipped-ne:after { + right: auto; + left: 50%; + margin-left: -15px; +} + +.tooltipped-nw:after { + margin-right: -15px; +} + +.tooltipped-s:after, +.tooltipped-n:after { + -webkit-transform: translateX(50%); + transform: translateX(50%); +} + +.tooltipped-w:after { + right: 100%; + bottom: 50%; + margin-right: 5px; + -webkit-transform: translateY(50%); + transform: translateY(50%); +} + +.tooltipped-w:before { + top: 50%; + bottom: 50%; + left: -5px; + margin-top: -5px; + border-left-color: #222; +} + +.tooltipped-e:after { + bottom: 50%; + left: 100%; + margin-left: 5px; + -webkit-transform: translateY(50%); + transform: translateY(50%); +} + +.tooltipped-e:before { + top: 50%; + right: -5px; + bottom: 50%; + margin-top: -5px; + border-right-color: #222; +} + +/* End tooltips */ /** * IRC Message Styling @@ -889,248 +1584,205 @@ button { * Colours are credit to http://clrs.cc/ */ .irc-fg0 { color: #fff; } + .irc-fg1 { color: #000; } + .irc-fg2 { color: #001f3f; } + .irc-fg3 { color: #2ecc40; } + .irc-fg4 { color: #ff4136; } + .irc-fg5 { color: #85144b; } + .irc-fg6 { color: #b10dc9; } + .irc-fg7 { color: #ff851b; } + .irc-fg8 { color: #ffdc00; } + .irc-fg9 { color: #01ff70; } + .irc-fg10 { color: #39cccc; } + .irc-fg11 { color: #7fdbff; } + .irc-fg12 { color: #0074d9; } + .irc-fg13 { color: #f012be; } + .irc-fg14 { color: #aaa; } + .irc-fg15 { color: #ddd; } + .irc-bg0 { background: #fff; } + .irc-bg1 { background: #000; } + .irc-bg2 { background: #001f3f; } + .irc-bg3 { background: #2ecc40; } + .irc-bg4 { background: #ff4136; } + .irc-bg5 { background: #85144b; } + .irc-bg6 { background: #b10dc9; } + .irc-bg7 { background: #ff851b; } + .irc-bg8 { background: #ffdc00; } + .irc-bg9 { background: #01ff70; } + .irc-bg10 { background: #39cccc; } + .irc-bg11 { background: #7fdbff; } + .irc-bg12 { background: #0074d9; } + .irc-bg13 { background: #f012be; } + .irc-bg14 { background: #aaa; } + .irc-bg15 { background: #ddd; } .irc-bold { - font-weight: bold; + font-weight: bold; } .irc-underline { - text-decoration: underline; + text-decoration: underline; } .irc-italic { - font-style:italic -} - -/** - * TrackpadScrollEmulator - * Version: 1.0.6 - * Author: Jonathan Nicol @f6design - * https://github.com/jnicol/trackpad-scroll-emulator - */ -.tse-scrollable { - position: relative; - overflow: hidden; -} -.tse-scrollable .tse-scroll-content { - overflow: hidden; - overflow-y: scroll; - -webkit-overflow-scrolling: touch; -} -.tse-scrollable .tse-scroll-content::-webkit-scrollbar { - width: 0; - height: 0; -} -.tse-scrollbar { - z-index: 99; - position: absolute; - top: 0; - right: 0; - bottom: 0; - width: 11px; -} -.tse-scrollbar .drag-handle { - position: absolute; - right: 2px; - border-radius: 2px; - min-height: 10px; - width: 6px; - opacity: 0.1; - transition: opacity 0.2s linear; - background: #000; - -webkit-background-clip: padding-box; - -moz-background-clip: padding; -} -.tse-scrollbar:hover .drag-handle { - opacity: 0.25; - transition: opacity 0 linear; -} -.tse-scrollbar .drag-handle.visible { - opacity: 0.2; -} -.scrollbar-width-tester::-webkit-scrollbar { - width: 0; - height: 0; + font-style: italic; } @media (max-width: 768px) { + /** + * TODO Replace this with `@media (hover: hover)` when Firefox supports it + * See: + * - http://stackoverflow.com/a/28058919/1935861 + * - http://caniuse.com/#feat=css-media-interaction + * - https://www.w3.org/TR/mediaqueries-4/ + * - https://developer.mozilla.org/en-US/docs/Web/CSS/@media/hover + */ + .tooltipped:hover:before, + .tooltipped:hover:after, + .tooltipped:active:before, + .tooltipped:active:after, + .tooltipped:focus:before, + .tooltipped:focus:after { + visibility: hidden; + opacity: 0; + } + .container { margin-top: 60px !important; } - #viewport.lt { - -webkit-transform: translate3d(220px, 0, 0); - transform: translate3d(220px, 0, 0); - } + #viewport.rt #chat .sidebar { -webkit-transform: translate3d(-180px, 0, 0); - transform: translate3d(-180px, 0, 0); + transform: translate3d(-180px, 0, 0); } - #sidebar { + + #sidebar, + #footer { left: -220px; } - #footer { - left: -215px; - width: 215px; - } - #sidebar .close { - display: none; - } - #sidebar .chan:hover .badge { - opacity: 1; - } + #sidebar .empty:before { margin-top: 0; } + #main { - left: 5px; - right: 5px; + left: 0; } + #chat .chat { right: 0; } + #viewport .lt, #viewport .channel .rt { display: block; } - #viewport .rt { - margin-left: 18px; - } + #windows .window .header { display: block; } + #chat .sidebar { right: -180px; } + #chat .title:before { display: none; } } +@media (min-width: 769px) { + #viewport { + -webkit-transform: none !important; + transform: none !important; + } + + #viewport.menu-open { + transition: none; + } +} + @media (max-width: 479px) { .container { margin: 40px 0 !important; } + #connect .tls { margin: 20px 0; } + #windows .input { margin-bottom: 2px; } + #chat .messages { display: block; padding: 5px 10px; } + #chat .msg { display: block; padding: 2px 0; } - #chat .msg:last-child { - height: auto; - } + + #chat .time, #chat .from, #chat .text { - background: none; border: 0; display: inline; padding: 0; } - #chat .time { - display: none; - } - #chat.hide-join .join, - #chat.hide-mode .mode, - #chat.hide-motd .motd, - #chat.hide-nick .nick, - #chat.hide-part .part, - #chat.hide-quit .quit { - display: none !important; + + #chat .unread-marker { + margin: 0; } } -@media print { - * { - position: relative !important; - overflow: visible !important; - } - body { - background: #fff; - } - .lt, - .rt, - .window:before, - .chan:before, - .title:before { - display: none !important; - } - .sidebar, - #form, - #sidebar { - display: none; - } - #windows .header { - border-bottom: 0; - padding-left: 10px; - } - #main { - left: 0; - } - #chat { - font-size: 11px; - } - #chat .chat { - bottom: 0; - left: 0; - top: 0; - right: 0; - } - #chat .messages { - display: block; - padding: 5px 10px; - } - #chat .msg { - display: block; - padding: 2px 0; - } - #chat .msg:last-child { - height: auto; - } - #chat .from, - #chat .text, - #chat .time { - background: none; - border: 0; - display: inline; - padding: 0; - } +::-webkit-scrollbar { + width: 8px; + background-color: rgba(0, 0, 0, 0); +} + +::-webkit-scrollbar:hover { + background-color: rgba(0, 0, 0, .09); +} + +::-webkit-scrollbar-thumb:vertical { + background: rgba(0, 0, 0, .5); + border-radius: 100px; +} + +::-webkit-scrollbar-thumb:vertical:active { + background: rgba(0, 0, 0, .6); } diff --git a/sources/client/img/favicon-notification.png b/sources/client/img/favicon-notification.png new file mode 100644 index 0000000..1eb1e77 Binary files /dev/null and b/sources/client/img/favicon-notification.png differ diff --git a/sources/client/index.html b/sources/client/index.html index 165ff5e..25be00a 100644 --- a/sources/client/index.html +++ b/sources/client/index.html @@ -8,47 +8,75 @@ - + + - Shout + The Lounge - - + + + + + + + - - - - "> + ">
-