diff --git a/README.md b/README.md
index 58bea9d9ad..540c575071 100644
--- a/README.md
+++ b/README.md
@@ -6,9 +6,12 @@ Vector is a Matrix web client built using the Matrix React SDK (https://github.c
Getting Started
===============
-Vector is a modular webapp built with modern ES6 and requires and npm build system to build.
-Instructions for building are below, but building from source shouldn't be necessary
-for simple deployments.
+The easiest way to test Vector is to just use the hosted copy at https://vector.im/beta.
+The develop branch is continuously deployed by Jenkins at https://vector.im/develop for
+those who like living dangerously.
+
+To host your own copy of Vector, the quickest bet is to use a pre-built released version
+of Vector:
1. Download the latest version from https://vector.im/packages/
1. Untar the tarball on your web server
@@ -20,7 +23,7 @@ for simple deployments.
Building From Source
====================
-If you do wish to build vector from source:
+Vector is a modular webapp built with modern ES6 and requires a npm build system to build.
1. Install or update `node.js` so that your `npm` is at least at version `2.0.0`
1. Clone the repo: `git clone https://github.com/vector-im/vector-web.git`
@@ -50,8 +53,32 @@ You can configure the app by copying `vector/config.sample.json` to
1. `default_hs_url` is the default home server url.
1. `default_is_url` is the default identity server url (this is the server used
for verifying third party identifiers like email addresses). If this is blank,
- registering with an email address or adding an email address to your account
- will not work.
+ registering with an email address, adding an email address to your account,
+ or inviting users via email address will not work. Matrix identity servers are
+ very simple web services which map third party identifiers (currently only email
+ addresses) to matrix IDs: see http://matrix.org/docs/spec/identity_service/unstable.html
+ for more details. Currently the only public matrix identity servers are https://matrix.org
+ and https://vector.im. In future identity servers will be decentralised.
+
+
+Running as a Desktop app
+========================
+
+In future we'll do an official distribution of Vector as an desktop app. Meanwhile,
+there are a few options:
+
+@asdf:matrix.org points out that you can use nativefier and it just works(tm):
+
+```
+sudo npm install nativefier -g
+nativefier https://vector.im/beta/
+```
+
+krisa has a dedicated electron project at https://github.com/krisak/vector-electron-desktop
+(although you should swap out the 'vector' folder for the latest vector tarball you want to run)
+
+There's also a (much) older electron distribution at https://github.com/stevenhammerton/vector-desktop
+
Development
===========
diff --git a/package.json b/package.json
index e31fbd9d97..3863cd1443 100644
--- a/package.json
+++ b/package.json
@@ -18,17 +18,18 @@
"build:compile": "babel --source-maps -d lib src",
"build:bundle": "NODE_ENV=production webpack -p lib/vector/index.js vector/bundle.js",
"build:bundle:dev": "NODE_ENV=production webpack --optimize-occurence-order lib/vector/index.js vector/bundle.js",
- "build": "npm run build:css && npm run build:emojione && npm run build:compile && npm run build:bundle",
- "build:dev": "npm run build:css && npm run build:compile && npm run build:bundle:dev",
+ "build:staticfiles": "scripts/staticfiles.js",
+ "build": "npm run build:staticfiles && npm run build:emojione && npm run build:css && npm run build:compile && npm run build:bundle",
+ "build:dev": "npm run build:staticfiles && npm run build:emojione && npm run build:css && npm run build:compile && npm run build:bundle:dev",
"package": "scripts/package.sh",
"start:emojione": "cpx \"node_modules/emojione/assets/svg/*\" vector/emojione/svg/ -w",
"start:js": "webpack -w src/vector/index.js vector/bundle.js",
"start:js:prod": "NODE_ENV=production webpack -w src/vector/index.js vector/bundle.js",
"start:skins:css": "catw \"src/skins/vector/css/**/*.css\" -o vector/components.css",
"//cache": "Note the -c 1 below due to https://code.google.com/p/chromium/issues/detail?id=508270",
- "start": "parallelshell \"npm run start:js\" \"npm run start:emojione\" \"npm run start:skins:css\" \"http-server -c 1 vector\"",
- "start:prod": "parallelshell \"npm run start:js:prod\" \"npm run start:skins:css\" \"http-server -c 1 vector\"",
- "clean": "rimraf lib vector/bundle.css vector/bundle.js vector/bundle.js.map vector/webpack.css* vector/emojione",
+ "start": "parallelshell \"npm run build:staticfiles\" \"npm run start:emojione\" \"npm run start:js\" \"npm run start:skins:css\" \"http-server -c 1 vector\"",
+ "start:prod": "parallelshell \"npm run build:staticfiles\" \"npm run start:emojione\" \"npm run start:js:prod\" \"npm run start:skins:css\" \"http-server -c 1 vector\"",
+ "clean": "rimraf lib vector/olm.js vector/bundle.css vector/bundle.js vector/bundle.js.map vector/webpack.css* vector/emojione",
"prepublish": "npm run build:css && npm run build:compile",
"test": "karma start --single-run=true --autoWatch=false --browsers PhantomJS --colors=false",
"test:multi": "karma start"
@@ -41,7 +42,7 @@
"extract-text-webpack-plugin": "^0.9.1",
"filesize": "^3.1.2",
"flux": "~2.0.3",
- "gemini-scrollbar": "matrix-org/gemini-scrollbar#468544d",
+ "gemini-scrollbar": "matrix-org/gemini-scrollbar#b302279",
"gfm.css": "^1.1.1",
"highlight.js": "^9.0.0",
"linkifyjs": "^2.0.0-beta.4",
@@ -53,7 +54,7 @@
"react-dnd": "^2.1.4",
"react-dnd-html5-backend": "^2.1.2",
"react-dom": "^15.2.1",
- "react-gemini-scrollbar": "matrix-org/react-gemini-scrollbar#dbf0abf",
+ "react-gemini-scrollbar": "matrix-org/react-gemini-scrollbar#5e97aef",
"sanitize-html": "^1.11.1"
},
"devDependencies": {
@@ -65,6 +66,7 @@
"css-raw-loader": "^0.1.1",
"emojione": "^2.2.3",
"expect": "^1.16.0",
+ "fs-extra": "^0.30.0",
"http-server": "^0.8.4",
"json-loader": "^0.5.3",
"karma": "^0.13.22",
diff --git a/scripts/staticfiles.js b/scripts/staticfiles.js
new file mode 100755
index 0000000000..3dbf451cd3
--- /dev/null
+++ b/scripts/staticfiles.js
@@ -0,0 +1,21 @@
+#!/usr/bin/env node
+
+// copy static files from node_modules to the vector directory
+//
+
+var fs = require('fs-extra');
+
+function exists(f) {
+ try {
+ fs.statSync(f);
+ return true;
+ } catch(e) {
+ return false;
+ }
+}
+
+const olm = 'node_modules/olm/olm.js';
+if (exists(olm)) {
+ console.log("copy", olm, "-> vector");
+ fs.copySync(olm, 'vector/olm.js');
+}
diff --git a/src/component-index.js b/src/component-index.js
index 2beea42381..b8efcdb4ca 100644
--- a/src/component-index.js
+++ b/src/component-index.js
@@ -34,6 +34,8 @@ module.exports.components['structures.RoomDirectory'] = require('./components/st
module.exports.components['structures.RoomSubList'] = require('./components/structures/RoomSubList');
module.exports.components['structures.SearchBox'] = require('./components/structures/SearchBox');
module.exports.components['structures.ViewSource'] = require('./components/structures/ViewSource');
+module.exports.components['views.context_menus.MessageContextMenu'] = require('./components/views/context_menus/MessageContextMenu');
+module.exports.components['views.context_menus.NotificationStateContextMenu'] = require('./components/views/context_menus/NotificationStateContextMenu');
module.exports.components['views.elements.ImageView'] = require('./components/views/elements/ImageView');
module.exports.components['views.elements.Spinner'] = require('./components/views/elements/Spinner');
module.exports.components['views.globals.GuestWarningBar'] = require('./components/views/globals/GuestWarningBar');
@@ -45,9 +47,9 @@ module.exports.components['views.login.VectorLoginHeader'] = require('./componen
module.exports.components['views.messages.DateSeparator'] = require('./components/views/messages/DateSeparator');
module.exports.components['views.messages.MessageTimestamp'] = require('./components/views/messages/MessageTimestamp');
module.exports.components['views.rooms.BottomLeftMenuTile'] = require('./components/views/rooms/BottomLeftMenuTile');
-module.exports.components['views.rooms.MessageContextMenu'] = require('./components/views/rooms/MessageContextMenu');
module.exports.components['views.rooms.RoomDNDView'] = require('./components/views/rooms/RoomDNDView');
module.exports.components['views.rooms.RoomDropTarget'] = require('./components/views/rooms/RoomDropTarget');
module.exports.components['views.rooms.RoomTooltip'] = require('./components/views/rooms/RoomTooltip');
module.exports.components['views.rooms.SearchBar'] = require('./components/views/rooms/SearchBar');
+module.exports.components['views.settings.IntegrationsManager'] = require('./components/views/settings/IntegrationsManager');
module.exports.components['views.settings.Notifications'] = require('./components/views/settings/Notifications');
diff --git a/src/components/structures/BottomLeftMenu.js b/src/components/structures/BottomLeftMenu.js
index ae49a34706..d36966d297 100644
--- a/src/components/structures/BottomLeftMenu.js
+++ b/src/components/structures/BottomLeftMenu.js
@@ -52,13 +52,13 @@ module.exports = React.createClass({
);
@@ -126,7 +126,7 @@ module.exports = React.createClass({
if (this.props.eventTileOps) {
if (this.props.eventTileOps.isWidgetHidden()) {
unhidePreviewButton = (
-
+
Unhide Preview
)
@@ -136,7 +136,7 @@ module.exports = React.createClass({
// XXX: this should be https://matrix.to.
// XXX: if we use room ID, we should also include a server where the event can be found (other than in the domain of the event ID)
permalinkButton = (
-
diff --git a/src/components/views/context_menus/NotificationStateContextMenu.js b/src/components/views/context_menus/NotificationStateContextMenu.js
new file mode 100644
index 0000000000..6b8852730b
--- /dev/null
+++ b/src/components/views/context_menus/NotificationStateContextMenu.js
@@ -0,0 +1,153 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var q = require("q");
+var React = require('react');
+var classNames = require('classnames');
+var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
+var dis = require('matrix-react-sdk/lib/dispatcher');
+
+module.exports = React.createClass({
+ displayName: 'NotificationStateContextMenu',
+
+ propTypes: {
+ room: React.PropTypes.object.isRequired,
+ /* callback called when the menu is dismissed */
+ onFinished: React.PropTypes.func,
+ },
+
+ getInitialState: function() {
+ var areNotifsMuted = false;
+ var cli = MatrixClientPeg.get();
+ if (!cli.isGuest()) {
+ var roomPushRule = cli.getRoomPushRule("global", this.props.room.roomId);
+ if (roomPushRule) {
+ if (0 <= roomPushRule.actions.indexOf("dont_notify")) {
+ areNotifsMuted = true;
+ }
+ }
+ }
+
+ return {
+ areNotifsMuted: areNotifsMuted,
+ };
+ },
+
+ _save: function( areNotifsMuted ) {
+ var self = this;
+ const roomId = this.props.room.roomId;
+ var cli = MatrixClientPeg.get();
+
+ if (!cli.isGuest()) {
+ // Wrapping this in a q promise, as setRoomMutePushRule can return
+ // a promise or a value
+ q(cli.setRoomMutePushRule("global", roomId, areNotifsMuted))
+ .then(function(s) {
+ self.setState({areNotifsMuted: areNotifsMuted});
+
+ // delay slightly so that the user can see their state change
+ // before closing the menu
+ return q.delay(500).then(function() {
+ // tell everyone that wants to know of the change in
+ // notification state
+ dis.dispatch({
+ action: 'notification_change',
+ roomId: self.props.room.roomId,
+ areNotifsMuted: areNotifsMuted,
+ });
+
+ // Close the context menu
+ if (self.props.onFinished) {
+ self.props.onFinished();
+ };
+ });
+ }).fail(function(error) {
+ // TODO: some form of error notification to the user
+ // to inform them that their state change failed.
+ });
+ }
+ },
+
+ _onClickAlertMe: function() {
+ // Placeholder
+ },
+
+ _onClickAllNotifs: function() {
+ this._save(false);
+ },
+
+ _onClickMentions: function() {
+ this._save(true);
+ },
+
+ _onClickMute: function() {
+ // Placeholder
+ },
+
+ render: function() {
+ var cli = MatrixClientPeg.get();
+
+ var alertMeClasses = classNames({
+ 'mx_NotificationStateContextMenu_field': true,
+ 'mx_NotificationStateContextMenu_fieldDisabled': true,
+ });
+
+ var allNotifsClasses = classNames({
+ 'mx_NotificationStateContextMenu_field': true,
+ 'mx_NotificationStateContextMenu_fieldSet': !this.state.areNotifsMuted,
+ });
+
+ var mentionsClasses = classNames({
+ 'mx_NotificationStateContextMenu_field': true,
+ 'mx_NotificationStateContextMenu_fieldSet': this.state.areNotifsMuted,
+ });
+
+ var muteNotifsClasses = classNames({
+ 'mx_NotificationStateContextMenu_field': true,
+ 'mx_NotificationStateContextMenu_fieldDisabled': true,
+ });
+
+ return (
+
You are not receiving desktop notifications. Enable them now
@@ -43,4 +43,3 @@ module.exports = React.createClass({
);
}
});
-
diff --git a/src/components/views/settings/IntegrationsManager.js b/src/components/views/settings/IntegrationsManager.js
new file mode 100644
index 0000000000..8db010a2b0
--- /dev/null
+++ b/src/components/views/settings/IntegrationsManager.js
@@ -0,0 +1,56 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var React = require('react');
+var sdk = require('matrix-react-sdk');
+var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
+
+module.exports = React.createClass({
+ displayName: 'IntegrationsManager',
+
+ propTypes: {
+ src: React.PropTypes.string.isRequired, // the source of the integration manager being embedded
+ onFinished: React.PropTypes.func.isRequired, // callback when the lightbox is dismissed
+ },
+
+ // XXX: keyboard shortcuts for managing dialogs should be done by the modal
+ // dialog base class somehow, surely...
+ componentDidMount: function() {
+ document.addEventListener("keydown", this.onKeyDown);
+ },
+
+ componentWillUnmount: function() {
+ document.removeEventListener("keydown", this.onKeyDown);
+ },
+
+ onKeyDown: function(ev) {
+ if (ev.keyCode == 27) { // escape
+ ev.stopPropagation();
+ ev.preventDefault();
+ this.props.onFinished();
+ }
+ },
+
+ render: function() {
+ return (
+
+
+
+ );
+ }
+});
diff --git a/src/skins/vector/css/common.css b/src/skins/vector/css/common.css
index 1d4be178b5..69fe39af22 100644
--- a/src/skins/vector/css/common.css
+++ b/src/skins/vector/css/common.css
@@ -52,6 +52,10 @@ a:visited {
color: #76cfa6;
}
+input[type=text].error, input[type=password].error {
+ border: 1px solid red;
+}
+
input[type=text]:focus, textarea:focus {
border: 1px solid #76CFA6;
outline: none;
@@ -80,53 +84,27 @@ input[type=text]:focus, textarea:focus {
position: absolute;
}
-/* hack to avoid accidental click-throughs if you miss the narrow scrollbar */
+/* Expand thumbs on hoverover */
+.gm-scrollbar {
+ border-radius: 5px ! important;
+}
.gm-scrollbar.-vertical {
- border-left: 6px solid transparent;
+ width: 6px;
+ transition: width 120ms ease-out ! important;
}
-
-.mx_ContextualMenu_background {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- opacity: 1.0;
- z-index: 2000;
+.gm-scrollbar.-vertical:hover,
+.gm-scrollbar.-vertical:active {
+ width: 8px;
+ transition: width 120ms ease-out ! important;
}
-
-.mx_ContextualMenu {
- border: 1px solid #a4a4a4;
- border-radius: 8px;
- background-color: #fff;
- color: #747474;
- position: fixed;
- z-index: 2001;
- padding: 6px;
+.gm-scrollbar.-horizontal {
+ height: 6px;
+ transition: height 120ms ease-out ! important;
}
-
-.mx_ContextualMenu_chevron_right {
- padding: 12px;
- position: absolute;
- right: -21px;
- top: 0px;
-}
-
-.mx_ContextualMenu_chevron_left {
- padding: 12px;
- position: absolute;
- left: -21px;
- top: 0px;
-}
-
-.mx_ContextualMenu_field {
- padding: 3px 6px 3px 6px;
- cursor: pointer;
-}
-
-.mx_ContextualMenu_spinner {
- display: block;
- margin: 0 auto;
+.gm-scrollbar.-horizontal:hover,
+.gm-scrollbar.-horizontal:active {
+ height: 8px;
+ transition: height 120ms ease-out ! important;
}
.mx_Dialog_wrapper {
@@ -233,6 +211,17 @@ input[type=text]:focus, textarea:focus {
background-color: #76cfa6;
}
+.mx_Dialog button.danger, .mx_Dialog input[type="submit"].danger {
+ background-color: #ff0064;
+ border: solid 1px #ff0064;
+}
+
+.mx_Dialog button:disabled, .mx_Dialog input[type="submit"]:disabled {
+ background-color: #777777;
+ border: solid 1px #777777;
+ opacity: 0.7;
+}
+
.mx_Dialog_title {
min-height: 16px;
padding-top: 40px;
@@ -242,6 +231,10 @@ input[type=text]:focus, textarea:focus {
color: #454545;
}
+.mx_Dialog_title.danger {
+ color: #ff0064;
+}
+
.mx_TextInputDialog_label {
text-align: left;
padding-bottom: 12px;
@@ -270,3 +263,15 @@ input[type=text]:focus, textarea:focus {
background-color: #76CFA6;
color: white;
}
+
+/** green button with rounded corners */
+.textButton {
+ color: #fff;
+ background-color: #76cfa6;
+ border-radius: 17px;
+ text-align: center;
+ padding-left: 1em;
+ padding-right: 1em;
+ cursor: pointer;
+ display: inline;
+}
diff --git a/src/skins/vector/css/matrix-react-sdk/structures/ContextualMenu.css b/src/skins/vector/css/matrix-react-sdk/structures/ContextualMenu.css
new file mode 100644
index 0000000000..7523bd103c
--- /dev/null
+++ b/src/skins/vector/css/matrix-react-sdk/structures/ContextualMenu.css
@@ -0,0 +1,106 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_ContextualMenu_wrapper {
+ position: fixed;
+ z-index: 2000;
+}
+
+.mx_ContextualMenu_background {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 1.0;
+ z-index: 2000;
+}
+
+.mx_ContextualMenu {
+ border: solid 1px rgba(187, 187, 187, 0.5);
+ border-radius: 4px;
+ background-color: #f6f6f6;
+ color: #4a4a4a;
+ position: absolute;
+ padding: 6px;
+ font-size: 14px;
+ z-index: 2001;
+}
+
+.mx_ContextualMenu.mx_ContextualMenu_right {
+ right: 8px;
+}
+
+.mx_ContextualMenu_chevron_right {
+ position: absolute;
+ right: -8px;
+ top: 0px;
+ width: 0;
+ height: 0;
+ border-top: 8px solid transparent;
+ border-left: 8px solid rgba(187, 187, 187, 0.5);
+ border-bottom: 8px solid transparent;
+}
+
+.mx_ContextualMenu_chevron_right:after{
+ content:'';
+ width: 0;
+ height: 0;
+ border-top: 7px solid transparent;
+ border-left: 7px solid #f6f6f6;
+ border-bottom: 7px solid transparent;
+ position:absolute;
+ top: -7px;
+ right: 1px;
+}
+
+.mx_ContextualMenu.mx_ContextualMenu_left {
+ left: 8px;
+}
+
+.mx_ContextualMenu_chevron_left {
+ position: absolute;
+ left: -8px;
+ top: 0px;
+ width: 0;
+ height: 0;
+ border-top: 8px solid transparent;
+ border-right: 8px solid rgba(187, 187, 187, 0.5);
+ border-bottom: 8px solid transparent;
+}
+
+.mx_ContextualMenu_chevron_left:after{
+ content:'';
+ width: 0;
+ height: 0;
+ border-top: 7px solid transparent;
+ border-right: 7px solid #f6f6f6;
+ border-bottom: 7px solid transparent;
+ position:absolute;
+ top: -7px;
+ left: 1px;
+}
+
+.mx_ContextualMenu_field {
+ padding: 3px 6px 3px 6px;
+ cursor: pointer;
+ white-space: nowrap;
+}
+
+.mx_ContextualMenu_spinner {
+ display: block;
+ margin: 0 auto;
+}
diff --git a/src/skins/vector/css/matrix-react-sdk/structures/MatrixChat.css b/src/skins/vector/css/matrix-react-sdk/structures/MatrixChat.css
index d28f4d948e..9545560174 100644
--- a/src/skins/vector/css/matrix-react-sdk/structures/MatrixChat.css
+++ b/src/skins/vector/css/matrix-react-sdk/structures/MatrixChat.css
@@ -93,8 +93,8 @@ limitations under the License.
background-color: #eaf5f0;
- -webkit-flex: 0 0 210px;
- flex: 0 0 210px;
+ -webkit-flex: 0 0 235px;
+ flex: 0 0 235px;
}
.mx_MatrixChat .mx_LeftPanel.collapsed {
diff --git a/src/skins/vector/css/matrix-react-sdk/structures/SearchBox.css b/src/skins/vector/css/matrix-react-sdk/structures/SearchBox.css
index e25928b926..5989523806 100644
--- a/src/skins/vector/css/matrix-react-sdk/structures/SearchBox.css
+++ b/src/skins/vector/css/matrix-react-sdk/structures/SearchBox.css
@@ -16,8 +16,8 @@ limitations under the License.
.mx_SearchBox {
height: 24px;
- margin-left: 16px;
- margin-right: 20px;
+ margin-left: 18px;
+ margin-right: 18px;
padding-top: 24px;
padding-bottom: 22px;
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
@@ -28,11 +28,13 @@ limitations under the License.
.mx_SearchBox_searchButton {
margin-right: 10px;
+ margin-top: 5px;
pointer-events: none;
}
.mx_SearchBox_closeButton {
cursor: pointer;
+ margin-top: -5px;
}
.mx_SearchBox_search {
@@ -65,4 +67,4 @@ limitations under the License.
.mx_SearchBox object {
pointer-events: none;
-}
\ No newline at end of file
+}
diff --git a/src/skins/vector/css/matrix-react-sdk/structures/UserSettings.css b/src/skins/vector/css/matrix-react-sdk/structures/UserSettings.css
index 66d81f9c0e..7d0e4badd6 100644
--- a/src/skins/vector/css/matrix-react-sdk/structures/UserSettings.css
+++ b/src/skins/vector/css/matrix-react-sdk/structures/UserSettings.css
@@ -94,6 +94,10 @@ limitations under the License.
cursor: pointer;
}
+.mx_UserSettings_button.danger {
+ background-color: #ff0064;
+}
+
.mx_UserSettings_section {
margin-left: 63px;
margin-top: 28px;
diff --git a/src/skins/vector/css/matrix-react-sdk/views/messages/UnknownBody.css b/src/skins/vector/css/matrix-react-sdk/views/messages/UnknownBody.css
new file mode 100644
index 0000000000..9036e12bf0
--- /dev/null
+++ b/src/skins/vector/css/matrix-react-sdk/views/messages/UnknownBody.css
@@ -0,0 +1,16 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_UnknownBody {
+ white-space: pre-wrap;
+}
diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/MemberInfo.css b/src/skins/vector/css/matrix-react-sdk/views/rooms/MemberInfo.css
index 829c822784..57da9faaa6 100644
--- a/src/skins/vector/css/matrix-react-sdk/views/rooms/MemberInfo.css
+++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/MemberInfo.css
@@ -17,6 +17,7 @@ limitations under the License.
.mx_MemberInfo {
margin-top: 20px;
height: 100%;
+ overflow-y: auto;
}
.mx_MemberInfo h2 {
diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/MessageComposer.css b/src/skins/vector/css/matrix-react-sdk/views/rooms/MessageComposer.css
index 9242af89a9..9af21003db 100644
--- a/src/skins/vector/css/matrix-react-sdk/views/rooms/MessageComposer.css
+++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/MessageComposer.css
@@ -109,9 +109,10 @@ limitations under the License.
.mx_MessageComposer_videocall {
/*display: table-cell;*/
/*vertical-align: middle;*/
- padding-left: 10px;
- padding-right: 10px;
+ /*padding-left: 10px;*/
+ padding-right: 5px;
cursor: pointer;
+ padding-top: 4px;
}
.mx_MessageComposer_upload object,
@@ -121,16 +122,3 @@ limitations under the License.
pointer-events: none;
}
-.mx_MessageComposer_videocall {
- padding-right: 10px;
- padding-top: 4px;
-}
-
-.mx_MessageComposer_voicecall {
- padding-right: 10px;
- padding-top: 4px;
-}
-
-.mx_MessageComposer_upload object {
- margin-top: 5px;
-}
diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/RoomHeader.css b/src/skins/vector/css/matrix-react-sdk/views/rooms/RoomHeader.css
index c0e919b88f..8245687751 100644
--- a/src/skins/vector/css/matrix-react-sdk/views/rooms/RoomHeader.css
+++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/RoomHeader.css
@@ -103,7 +103,8 @@ limitations under the License.
.mx_RoomHeader_rightRow {
margin-top: 4px;
background-color: #fff;
-
+ display: flex;
+ align-items: center;
-webkit-box-ordinal-group: 3;
-moz-box-ordinal-group: 3;
-ms-flex-order: 3;
@@ -161,13 +162,6 @@ limitations under the License.
opacity: 0.6;
}
-.mx_RoomHeader_settingsButton {
- display: inline-block;
- position: relative;
- bottom: 10px;
- left: 4px;
-}
-
.mx_RoomHeader_settingsButton object {
pointer-events: none;
}
@@ -183,10 +177,6 @@ limitations under the License.
color: #76cfa6;
}
-.mx_RoomHeader_leaveButton {
- margin-top: -1px;
-}
-
.mx_RoomHeader_placeholder {
color: #a2a2a2 ! important;
}
@@ -243,10 +233,7 @@ limitations under the License.
}
.mx_RoomHeader_button {
- display: table-cell;
- vertical-align: top;
- padding-left: 8px;
- padding-right: 8px;
+ margin-left: 8px;
cursor: pointer;
}
diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/RoomTile.css b/src/skins/vector/css/matrix-react-sdk/views/rooms/RoomTile.css
index 770a3a625f..eca63c782b 100644
--- a/src/skins/vector/css/matrix-react-sdk/views/rooms/RoomTile.css
+++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/RoomTile.css
@@ -15,18 +15,25 @@ limitations under the License.
*/
.mx_RoomTile {
+ position: relative;
cursor: pointer;
- /* This fixes wrapping of long room names, but breaks drag & drop previews */
- /* display: table-row; */
font-size: 13px;
display: block;
+ height: 34px;
+}
+
+.mx_RoomTile_nameContainer {
+ display: inline-block;
+ width: 180px;
+ height: 24px;
}
.mx_RoomTile_avatar {
display: inline-block;
- padding-top: 6px;
- padding-bottom: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
padding-left: 18px;
+ padding-right: 6px;
width: 24px;
height: 24px;
vertical-align: middle;
@@ -34,13 +41,17 @@ limitations under the License.
.mx_RoomTile_name {
display: inline-block;
- width: 100px;
+ position: relative;
+ width: 165px;
vertical-align: middle;
- overflow: hidden;
- word-break: break-word;
- padding-left: 11px;
- padding-right: 15px;
+ padding-left: 6px;
+ padding-right: 6px;
+ padding-top: 2px;
+ padding-bottom: 3px;
color: rgba(69, 69, 69, 0.8);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
}
.mx_RoomTile_ellipsis .mx_RoomTile_name {
@@ -53,17 +64,16 @@ limitations under the License.
*/
}
+.collapsed .mx_RoomTile_nameContainer {
+ height: 0;
+}
+
.collapsed .mx_RoomTile_name {
display: none;
}
-.collapsed .mx_RoomTile {
- height: 36px;
-}
-
.collapsed .mx_RoomTile_badge {
- top: -40px;
- left: 30px;
+ top: -2px;
min-width: 12px;
height: 16px;
border-radius: 16px;
@@ -71,6 +81,11 @@ limitations under the License.
z-index: 200;
}
+/* Hide the bottom of speech bubble */
+.collapsed .mx_RoomTile_highlight .mx_RoomTile_badge:after {
+ display: none;
+}
+
/* This is the bottom of the speech bubble */
.mx_RoomTile_highlight .mx_RoomTile_badge:after {
content: "";
@@ -78,39 +93,39 @@ limitations under the License.
display: block;
width: 0;
height: 0;
- margin-left: 4px;
+ margin-left: 6px;
border-top: 8px solid #ff0064;
border-right: 10px solid transparent;
}
-/* Because the specificity of this and the above ".mx_RoomTile_highlight .mx_RoomTile_badge:after"
-style are the same, this style needs to be AFTER it to take effect when matched */
-.collapsed .mx_RoomTile_badge:after {
- display: none;
-}
-
.mx_RoomTile_badge {
display: inline-block;
- min-width: 14px;
- height: 18px;
- position: relative;
- left: 8px;
- top: 2px;
- border-radius: 18px;
+ min-width: 19px;
+ height: 17px;
+ position: absolute;
+ right: 8px; /*gutter */
+ top: 9px;
+ border-radius: 14px;
color: #fff;
- font-weight: bold;
+ font-weight: 600;
font-size: 11px;
text-align: center;
- padding-top: 2px;
+ padding-top: 1px;
padding-left: 4px;
padding-right: 4px;
}
-.mx_RoomTile_badge:hover {
+.mx_RoomTile .mx_RoomTile_badge.mx_RoomTile_badgeButton,
+.mx_RoomTile.mx_RoomTile_menu .mx_RoomTile_badge {
letter-spacing: 0.1em;
opacity: 1;
}
+.mx_RoomTile.mx_RoomTile_noBadges .mx_RoomTile_badge.mx_RoomTile_badgeButton,
+.mx_RoomTile.mx_RoomTile_menu.mx_RoomTile_noBadges .mx_RoomTile_badge {
+ background-color: rgb(214, 214, 214);
+}
+
.mx_RoomTile_unreadNotify .mx_RoomTile_badge {
background-color: #76cfa6;
}
@@ -119,26 +134,18 @@ style are the same, this style needs to be AFTER it to take effect when matched
background-color: #ff0064;
}
-.mx_RoomTile_badge_no_unread {
- background-color: rgb(214, 214, 214);
- opacity: 0;
-}
-
.mx_RoomTile_unread, .mx_RoomTile_highlight {
- font-weight: bold;
+ font-weight: 800;
}
-.mx_RoomTile_selected .mx_RoomTile_name span {
- display: inline-block;
- position: relative;
- width: 100%;
- padding: 4px;
- margin-top: -4px;
- margin-bottom: -4px;
- border-radius: 2px;
+.mx_RoomTile_selected {
background-color: rgba(118,207,166,0.2);
}
+.mx_RoomTile .mx_RoomTile_name.mx_RoomTile_badgeShown {
+ width: 140px;
+}
+
.mx_RoomTile_arrow {
position: absolute;
right: 0px;
diff --git a/src/skins/vector/css/matrix-react-sdk/views/settings/DevicesPanel.css b/src/skins/vector/css/matrix-react-sdk/views/settings/DevicesPanel.css
new file mode 100644
index 0000000000..1b60834a4e
--- /dev/null
+++ b/src/skins/vector/css/matrix-react-sdk/views/settings/DevicesPanel.css
@@ -0,0 +1,47 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_DevicesPanel {
+ display: table;
+ table-layout: fixed;
+ width: 880px;
+ border-spacing: 2px;
+}
+
+.mx_DevicesPanel_header {
+ display: table-header-group;
+ font-weight: bold;
+}
+
+.mx_DevicesPanel_header > div {
+ display: table-cell;
+}
+
+.mx_DevicesPanel_header .mx_DevicesPanel_deviceLastSeen {
+ width: 30%;
+}
+
+.mx_DevicesPanel_header .mx_DevicesPanel_deviceButtons {
+ width: 20%;
+}
+
+.mx_DevicesPanel_device {
+ display: table-row;
+}
+
+.mx_DevicesPanel_device > div {
+ display: table-cell;
+}
diff --git a/src/skins/vector/css/matrix-react-sdk/views/settings/IntegrationsManager.css b/src/skins/vector/css/matrix-react-sdk/views/settings/IntegrationsManager.css
new file mode 100644
index 0000000000..0fa40fe1ef
--- /dev/null
+++ b/src/skins/vector/css/matrix-react-sdk/views/settings/IntegrationsManager.css
@@ -0,0 +1,33 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_IntegrationsManager {
+ display: -webkit-flex;
+ display: flex;
+ width: 100%;
+ height: 100%;
+ -webkit-align-items: center;
+ align-items: center;
+ justify-content: center;
+ -webkit-justify-content: center;
+}
+
+.mx_IntegrationsManager iframe {
+ background-color: #fff;
+ border: 0px;
+ width: 720px;
+ height: 512px;
+}
diff --git a/src/skins/vector/css/vector-web/structures/LeftPanel.css b/src/skins/vector/css/vector-web/structures/LeftPanel.css
index ea12c953fe..316246cb33 100644
--- a/src/skins/vector/css/vector-web/structures/LeftPanel.css
+++ b/src/skins/vector/css/vector-web/structures/LeftPanel.css
@@ -51,6 +51,10 @@ limitations under the License.
overflow-y: auto;
}
+.mx_LeftPanel.collapsed .mx_BottomLeftMenu {
+ flex: 0 0 120px;
+}
+
.mx_LeftPanel .mx_BottomLeftMenu {
-webkit-box-ordinal-group: 3;
-moz-box-ordinal-group: 3;
@@ -59,10 +63,11 @@ limitations under the License.
order: 3;
border-top: 1px solid rgba(0, 0, 0, 0.1);
- margin-left: 18px;
- margin-right: 18px;
+ margin-left: 16px; /* gutter */
+ margin-right: 16px; /* gutter */
-webkit-flex: 0 0 60px;
flex: 0 0 60px;
+ z-index: 1;
}
.mx_LeftPanel .mx_BottomLeftMenu_options {
@@ -95,3 +100,7 @@ limitations under the License.
.mx_LeftPanel .mx_BottomLeftMenu_settings {
float: right;
}
+
+.mx_LeftPanel.collapsed .mx_BottomLeftMenu_settings {
+ float: none;
+}
diff --git a/src/skins/vector/css/vector-web/structures/RightPanel.css b/src/skins/vector/css/vector-web/structures/RightPanel.css
index 7257d8b4a0..9567869e7d 100644
--- a/src/skins/vector/css/vector-web/structures/RightPanel.css
+++ b/src/skins/vector/css/vector-web/structures/RightPanel.css
@@ -43,7 +43,7 @@ limitations under the License.
/** Fixme - factor this out with the main header **/
.mx_RightPanel_headerButtonGroup {
- margin-top: 25px;
+ margin-top: 6px;
float: left;
background-color: #fff;
margin-left: -4px;
@@ -55,34 +55,27 @@ limitations under the License.
vertical-align: middle;
padding-left: 15px;
padding-right: 15px;
+ text-align: center;
position: relative;
}
.mx_RightPanel_headerButton object {
pointer-events: none;
+ padding-bottom: 3px;
}
.mx_RightPanel_headerButton_highlight {
- position: absolute;
- bottom: -2px;
- left: 10px;
width: 25px;
- height: 4px;
- background-color: #76cfa6;
+ height: 5px;
+ border-radius: 5px;
+ background-color: rgba(118, 207, 166, 0.2);
}
.mx_RightPanel_headerButton_badge {
- position: absolute;
- top: 4px;
- left: 28px;
- font-size: 12px;
- background-color: #76cfa6;
- color: #fff;
+ font-size: 11px;
+ color: #76cfa6;
font-weight: bold;
- border-radius: 20px;
- padding-left: 4px;
- padding-right: 4px;
- padding-top: 0px;
+ padding-bottom: 2px;
}
.mx_RightPanel .mx_MemberList,
diff --git a/src/skins/vector/css/vector-web/structures/RoomSubList.css b/src/skins/vector/css/vector-web/structures/RoomSubList.css
index 8f9db8fec1..b54fea9818 100644
--- a/src/skins/vector/css/vector-web/structures/RoomSubList.css
+++ b/src/skins/vector/css/vector-web/structures/RoomSubList.css
@@ -25,8 +25,8 @@ limitations under the License.
color: #3d3b39;
font-weight: 600;
font-size: 13px;
- padding-left: 12px;
- padding-right: 12px;
+ padding-left: 16px; /* gutter */
+ padding-right: 16px; /* gutter */
margin-top: 8px;
margin-bottom: 4px;
cursor: pointer;
diff --git a/src/skins/vector/css/vector-web/views/context_menus/MessageContextMenu.css b/src/skins/vector/css/vector-web/views/context_menus/MessageContextMenu.css
new file mode 100644
index 0000000000..85e8080c88
--- /dev/null
+++ b/src/skins/vector/css/vector-web/views/context_menus/MessageContextMenu.css
@@ -0,0 +1,25 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_MessageContextMenu_field {
+ padding: 3px 6px 3px 6px;
+ cursor: pointer;
+ white-space: nowrap;
+}
+
+.mx_MessageContextMenu_field.mx_MessageContextMenu_fieldSet {
+ font-weight: bold;
+}
diff --git a/src/skins/vector/css/vector-web/views/context_menus/NotificationStateContextMenu.css b/src/skins/vector/css/vector-web/views/context_menus/NotificationStateContextMenu.css
new file mode 100644
index 0000000000..1f0685264b
--- /dev/null
+++ b/src/skins/vector/css/vector-web/views/context_menus/NotificationStateContextMenu.css
@@ -0,0 +1,56 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_NotificationStateContextMenu_picker {
+ position: absolute;
+ top: 16px;
+ left: 5px;
+}
+
+.mx_NotificationStateContextMenu_field {
+ padding-top: 4px;
+ padding-right: 6px;
+ padding-bottom: 10px;
+ padding-left: 8px; /* 20px */
+ cursor: pointer;
+ white-space: nowrap;
+ display: flex;
+ align-items: center;
+}
+
+.mx_NotificationStateContextMenu_field.mx_NotificationStateContextMenu_fieldSet {
+ font-weight: bold;
+}
+
+.mx_NotificationStateContextMenu_field.mx_NotificationStateContextMenu_fieldDisabled {
+ color: rgba(0, 0, 0, 0.2);
+}
+
+.mx_NotificationStateContextMenu_icon {
+ padding-right: 4px;
+ padding-left: 4px;
+}
+
+.mx_NotificationStateContextMenu_activeIcon {
+ display: inline-block;
+ opacity: 0;
+ position: relative;
+ left: -5px;
+}
+
+.mx_NotificationStateContextMenu_fieldSet .mx_NotificationStateContextMenu_activeIcon {
+ opacity: 1;
+}
diff --git a/src/skins/vector/css/vector-web/views/elements/ImageView.css b/src/skins/vector/css/vector-web/views/elements/ImageView.css
index dc0454d12c..03223f259e 100644
--- a/src/skins/vector/css/vector-web/views/elements/ImageView.css
+++ b/src/skins/vector/css/vector-web/views/elements/ImageView.css
@@ -69,6 +69,7 @@ limitations under the License.
.mx_ImageView_labelWrapper {
position: absolute;
top: 0px;
+ right: 0px;
height: 100%;
overflow: auto;
pointer-events: all;
diff --git a/src/skins/vector/css/vector-web/views/globals/MatrixToolbar.css b/src/skins/vector/css/vector-web/views/globals/MatrixToolbar.css
index b5e910210e..a8297f46c2 100644
--- a/src/skins/vector/css/vector-web/views/globals/MatrixToolbar.css
+++ b/src/skins/vector/css/vector-web/views/globals/MatrixToolbar.css
@@ -33,6 +33,11 @@ limitations under the License.
margin-top: -2px;
}
+.mx_MatrixToolbar_content {
+ -webkit-flex: 1;
+ flex: 1;
+}
+
.mx_MatrixToolbar_link
{
color: #fff ! important;
@@ -41,10 +46,7 @@ limitations under the License.
}
.mx_MatrixToolbar_close {
- -webkit-flex: 1;
- flex: 1;
cursor: pointer;
- text-align: right;
}
.mx_MatrixToolbar_close img {
diff --git a/src/skins/vector/css/vector-web/views/rooms/RoomDropTarget.css b/src/skins/vector/css/vector-web/views/rooms/RoomDropTarget.css
index 7ad5e89334..61fbbf7400 100644
--- a/src/skins/vector/css/vector-web/views/rooms/RoomDropTarget.css
+++ b/src/skins/vector/css/vector-web/views/rooms/RoomDropTarget.css
@@ -16,8 +16,8 @@ limitations under the License.
.mx_RoomDropTarget {
font-size: 13px;
- margin-left: 10px;
- margin-right: 15px;
+ margin-left: 18px;
+ margin-right: 18px;
padding-top: 5px;
padding-bottom: 5px;
border: 1px dashed #76cfa6;
@@ -28,6 +28,7 @@ limitations under the License.
.collapsed .mx_RoomDropTarget {
margin-right: 10px;
+ margin-left: 10px;
}
.mx_RoomDropTarget_placeholder {
diff --git a/src/skins/vector/css/vector-web/views/rooms/RoomTooltip.css b/src/skins/vector/css/vector-web/views/rooms/RoomTooltip.css
index 3aec0fa7f6..deb8cd3f96 100644
--- a/src/skins/vector/css/vector-web/views/rooms/RoomTooltip.css
+++ b/src/skins/vector/css/vector-web/views/rooms/RoomTooltip.css
@@ -14,19 +14,19 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
+.mx_RoomTooltip_chevron {
+ position: absolute;
+ left: -9px;
+ top: 7px;
+}
+
.mx_RoomTooltip {
display: none;
position: fixed;
border: 1px solid #a4a4a4;
border-radius: 8px;
background-color: #fff;
- z-index: 1000;
- left: 64px;
+ z-index: 2000;
+ left: 52px;
padding: 6px;
}
-
-.mx_RoomTooltip_chevron {
- position: absolute;
- left: -9px;
- top: 8px;
-}
diff --git a/src/skins/vector/img/icon-call.svg b/src/skins/vector/img/icon-call.svg
new file mode 100644
index 0000000000..2d96b1456b
--- /dev/null
+++ b/src/skins/vector/img/icon-call.svg
@@ -0,0 +1,8 @@
+
+
+
diff --git a/src/skins/vector/img/icon-context-mute-mentions.svg b/src/skins/vector/img/icon-context-mute-mentions.svg
new file mode 100644
index 0000000000..3693b7a82a
--- /dev/null
+++ b/src/skins/vector/img/icon-context-mute-mentions.svg
@@ -0,0 +1,11 @@
+
+
+
diff --git a/src/skins/vector/img/icon-context-mute-off-copy.svg b/src/skins/vector/img/icon-context-mute-off-copy.svg
new file mode 100644
index 0000000000..861f2975de
--- /dev/null
+++ b/src/skins/vector/img/icon-context-mute-off-copy.svg
@@ -0,0 +1,10 @@
+
+
+
diff --git a/src/skins/vector/img/icon-context-mute-off.svg b/src/skins/vector/img/icon-context-mute-off.svg
new file mode 100644
index 0000000000..d801823b5d
--- /dev/null
+++ b/src/skins/vector/img/icon-context-mute-off.svg
@@ -0,0 +1,9 @@
+
+
+
diff --git a/src/skins/vector/img/icon-context-mute.svg b/src/skins/vector/img/icon-context-mute.svg
new file mode 100644
index 0000000000..f53b868a76
--- /dev/null
+++ b/src/skins/vector/img/icon-context-mute.svg
@@ -0,0 +1,9 @@
+
+
+
diff --git a/src/skins/vector/img/icons-create-room.svg b/src/skins/vector/img/icons-create-room.svg
index 6ed94b4b29..252bd2df3b 100644
--- a/src/skins/vector/img/icons-create-room.svg
+++ b/src/skins/vector/img/icons-create-room.svg
@@ -1,20 +1,18 @@
-
diff --git a/src/skins/vector/img/icons-directory.svg b/src/skins/vector/img/icons-directory.svg
index 00869b9b3d..1f1cc29a82 100644
--- a/src/skins/vector/img/icons-directory.svg
+++ b/src/skins/vector/img/icons-directory.svg
@@ -1,21 +1,21 @@
-
-
- icons_directory
+
+
+ E34C64ED-EBD7-49B6-BDD9-CB729162705ACreated with sketchtool.
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/src/skins/vector/img/icons-people.svg b/src/skins/vector/img/icons-people.svg
new file mode 100644
index 0000000000..d6867a3f3a
--- /dev/null
+++ b/src/skins/vector/img/icons-people.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/skins/vector/img/icons-search-copy.svg b/src/skins/vector/img/icons-search-copy.svg
new file mode 100644
index 0000000000..b026718b84
--- /dev/null
+++ b/src/skins/vector/img/icons-search-copy.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/skins/vector/img/icons-search.svg b/src/skins/vector/img/icons-search.svg
new file mode 100644
index 0000000000..4f5002ab79
--- /dev/null
+++ b/src/skins/vector/img/icons-search.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/skins/vector/img/icons-settings-room.svg b/src/skins/vector/img/icons-settings-room.svg
new file mode 100644
index 0000000000..117d134c95
--- /dev/null
+++ b/src/skins/vector/img/icons-settings-room.svg
@@ -0,0 +1,15 @@
+
+
+
+ 69011392-CE9D-4404-A85C-A8548C5D850B
+ Created with sketchtool.
+
+
+
+
+
+
+
+
+
+
diff --git a/src/skins/vector/img/icons-settings.svg b/src/skins/vector/img/icons-settings.svg
index 6096953055..3ca2b655f4 100644
--- a/src/skins/vector/img/icons-settings.svg
+++ b/src/skins/vector/img/icons-settings.svg
@@ -1,17 +1,15 @@
-
-
- icons_settings
+
+
+ 4D42A2A7-7430-4D4F-A0A2-E19278CF66E3Created with sketchtool.
-
-
-
-
-
-
-
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/src/skins/vector/img/icons-upload.svg b/src/skins/vector/img/icons-upload.svg
new file mode 100644
index 0000000000..9074fcf9fa
--- /dev/null
+++ b/src/skins/vector/img/icons-upload.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/skins/vector/img/icons-video.svg b/src/skins/vector/img/icons-video.svg
new file mode 100644
index 0000000000..3571ec7f21
--- /dev/null
+++ b/src/skins/vector/img/icons-video.svg
@@ -0,0 +1,20 @@
+
+
+
+ 05D354CE-86A7-4B6F-B9BE-F1CEBBD81B21
+ Created with sketchtool.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/skins/vector/img/members.png b/src/skins/vector/img/members.png
deleted file mode 100644
index b5e5875768..0000000000
Binary files a/src/skins/vector/img/members.png and /dev/null differ
diff --git a/src/skins/vector/img/members.svg b/src/skins/vector/img/members.svg
deleted file mode 100644
index 0f115966ab..0000000000
--- a/src/skins/vector/img/members.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
- icons_people
- Created with bin/sketchtool.
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/skins/vector/img/notif-active.svg b/src/skins/vector/img/notif-active.svg
new file mode 100644
index 0000000000..9eb279f851
--- /dev/null
+++ b/src/skins/vector/img/notif-active.svg
@@ -0,0 +1,20 @@
+
+
+
+ E15782FC-B5FA-472A-AE12-CFFF484E7253
+ Created with sketchtool.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/skins/vector/img/notif-slider.svg b/src/skins/vector/img/notif-slider.svg
new file mode 100644
index 0000000000..55fa06d11a
--- /dev/null
+++ b/src/skins/vector/img/notif-slider.svg
@@ -0,0 +1,22 @@
+
+
+
+ 16CB4618-0BD3-4568-BB20-FC56EBC46046
+ Created with sketchtool.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/vector/index.js b/src/vector/index.js
index 8f3701cbeb..4c9dd9ee0f 100644
--- a/src/vector/index.js
+++ b/src/vector/index.js
@@ -205,13 +205,13 @@ function getConfig() {
async function loadApp() {
if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
- if (confirm("Vector runs much better as an app on iOS. Get the app?")) {
+ if (confirm("Vector is not supported on mobile web. Install the app?")) {
window.location = "https://itunes.apple.com/us/app/vector.im/id1083446067";
return;
}
}
else if (/Android/.test(navigator.userAgent)) {
- if (confirm("Vector runs much better as an app on Android. Get the app?")) {
+ if (confirm("Vector is not supported on mobile web. Install the app?")) {
window.location = "https://play.google.com/store/apps/details?id=im.vector.alpha";
return;
}
diff --git a/test/app-tests/joining.js b/test/app-tests/joining.js
index 37a3e9e650..6580161b9b 100644
--- a/test/app-tests/joining.js
+++ b/test/app-tests/joining.js
@@ -80,7 +80,13 @@ describe('joining a room', function () {
httpBackend.when('GET', '/directory/room/'+encodeURIComponent(ROOM_ALIAS)).respond(200, { room_id: ROOM_ID });
// start with a logged-in client
- peg.replaceUsingAccessToken(HS_URL, IS_URL, USER_ID, ACCESS_TOKEN);
+ peg.replaceUsingCreds({
+ homeserverUrl: HS_URL,
+ identityServerUrl: IS_URL,
+ userId: USER_ID,
+ accessToken: ACCESS_TOKEN,
+ guest: false,
+ });
var mc = ;
matrixChat = ReactDOM.render(mc, parentDiv);
diff --git a/vector/config.sample.json b/vector/config.sample.json
index e69cf06cf5..5b80ede382 100644
--- a/vector/config.sample.json
+++ b/vector/config.sample.json
@@ -3,5 +3,6 @@
"default_is_url": "https://vector.im",
"brand": "Vector",
"integrations_ui_url": "http://localhost:8081/",
- "integrations_rest_url": "http://localhost:5050"
+ "integrations_rest_url": "http://localhost:5050",
+ "enableLabs": true
}
diff --git a/vector/index.html b/vector/index.html
index 08c96dd519..a78beac108 100644
--- a/vector/index.html
+++ b/vector/index.html
@@ -24,6 +24,8 @@
+
+
diff --git a/webpack.config.js b/webpack.config.js
index 91d0564c47..95afcfba98 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -43,12 +43,16 @@ module.exports = {
// same goes for js-sdk
"matrix-js-sdk": path.resolve('./node_modules/matrix-js-sdk'),
-
- // make sure we use the version of olm from vector-web rather than
- // js-sdk.
- "olm": path.resolve('./node_modules/olm'),
},
},
+ externals: {
+ // olm takes ages for webpack to process, and it's already heavily
+ // optimised, so there is little to gain by us uglifying it. We
+ // therefore use it via a separate tag in index.html (which
+ // loads it into the browser global `Olm`), and reference it as an
+ // external here.
+ "olm": "Olm",
+ },
plugins: [
new webpack.DefinePlugin({
'process.env': {
@@ -59,20 +63,6 @@ module.exports = {
new ExtractTextPlugin("bundle.css", {
allChunks: true
}),
-
- // olm.js includes "require 'fs'", which is never
- // executed in the browser. Ignore it.
- new webpack.IgnorePlugin(/^fs$/, /\/olm$/)
],
devtool: 'source-map'
};
-
-// ignore olm.js if it's not installed, to avoid a scary-looking error.
-try {
- require('olm');
- console.log("Olm is installed; including it in webpack bundle");
-} catch (e) {
- module.exports.plugins.push(
- new webpack.IgnorePlugin(/^olm$/)
- );
-}