diff --git a/README.md b/README.md index 58bea9d9a..540c57507 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 e31fbd9d9..3863cd144 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 000000000..3dbf451cd --- /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 2beea4238..b8efcdb4c 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 ae49a3470..d36966d29 100644 --- a/src/components/structures/BottomLeftMenu.js +++ b/src/components/structures/BottomLeftMenu.js @@ -52,13 +52,13 @@ module.exports = React.createClass({
- +
- +
- +
diff --git a/src/components/structures/RightPanel.js b/src/components/structures/RightPanel.js index 431bdba5f..ca9376e1b 100644 --- a/src/components/structures/RightPanel.js +++ b/src/components/structures/RightPanel.js @@ -136,8 +136,8 @@ module.exports = React.createClass({ buttonGroup =
- { membersBadge } + { membersHighlight }
diff --git a/src/components/structures/RoomDirectory.js b/src/components/structures/RoomDirectory.js index 81429a0e4..e4a8524b9 100644 --- a/src/components/structures/RoomDirectory.js +++ b/src/components/structures/RoomDirectory.js @@ -21,7 +21,7 @@ var React = require('react'); var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg'); var ContentRepo = require("matrix-js-sdk").ContentRepo; var Modal = require('matrix-react-sdk/lib/Modal'); -var sdk = require('matrix-react-sdk') +var sdk = require('matrix-react-sdk'); var dis = require('matrix-react-sdk/lib/dispatcher'); var GeminiScrollbar = require('react-gemini-scrollbar'); @@ -282,8 +282,7 @@ module.exports = React.createClass({
- + { this.getRows(this.state.roomAlias) } diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index 497acdec0..a5a6fd217 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -61,8 +61,12 @@ var RoomSubList = React.createClass({ label: React.PropTypes.string.isRequired, tagName: React.PropTypes.string, editable: React.PropTypes.bool, + order: React.PropTypes.string.isRequired, - selectedRoom: React.PropTypes.string.isRequired, + + // undefined if no room is selected (eg we are showing settings) + selectedRoom: React.PropTypes.string, + startAsHidden: React.PropTypes.bool, showSpinner: React.PropTypes.bool, // true to show a spinner if 0 elements when expanded collapsed: React.PropTypes.bool.isRequired, // is LeftPanel collapsed? diff --git a/src/components/structures/SearchBox.js b/src/components/structures/SearchBox.js index 5e5a19e65..7fc510004 100644 --- a/src/components/structures/SearchBox.js +++ b/src/components/structures/SearchBox.js @@ -94,7 +94,7 @@ module.exports = React.createClass({ , +
Resend
); @@ -103,7 +103,7 @@ module.exports = React.createClass({ if (!eventStatus) { // sent redactButton = ( -
+
Redact
); @@ -111,14 +111,14 @@ module.exports = React.createClass({ if (eventStatus === "queued" || eventStatus === "not_sent") { cancelButton = ( -
+
Cancel Sending
); } viewSourceButton = ( -
+
View Source
); @@ -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 000000000..6b8852730 --- /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 ( +
+
+ +
+
+ + + All messages (loud) +
+
+ + + All messages +
+
+ + + Mentions only +
+
+ + + Mute +
+
+ ); + } +}); diff --git a/src/components/views/globals/MatrixToolbar.js b/src/components/views/globals/MatrixToolbar.js index b176ff2ea..a22e15ffc 100644 --- a/src/components/views/globals/MatrixToolbar.js +++ b/src/components/views/globals/MatrixToolbar.js @@ -35,7 +35,7 @@ module.exports = React.createClass({ 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 000000000..8db010a2b --- /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 1d4be178b..69fe39af2 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 000000000..7523bd103 --- /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 d28f4d948..954556017 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 e25928b92..598952380 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 66d81f9c0..7d0e4badd 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 000000000..9036e12bf --- /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 829c82278..57da9faaa 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 9242af89a..9af21003d 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 c0e919b88..824568775 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 770a3a625..eca63c782 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 000000000..1b60834a4 --- /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 000000000..0fa40fe1e --- /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 ea12c953f..316246cb3 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 7257d8b4a..9567869e7 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 8f9db8fec..b54fea981 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 000000000..85e8080c8 --- /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 000000000..1f0685264 --- /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 dc0454d12..03223f259 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 b5e910210..a8297f46c 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 7ad5e8933..61fbbf740 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 3aec0fa7f..deb8cd3f9 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 000000000..2d96b1456 --- /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 000000000..3693b7a82 --- /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 000000000..861f2975d --- /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 000000000..d801823b5 --- /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 000000000..f53b868a7 --- /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 6ed94b4b2..252bd2df3 100644 --- a/src/skins/vector/img/icons-create-room.svg +++ b/src/skins/vector/img/icons-create-room.svg @@ -1,20 +1,18 @@ - - - icons_create_room + + + 0F9BCC43-B3A7-4C9F-8E34-1F38194362C2 Created with sketchtool. - - - - - - - - - + + + + + + + - \ No newline at end of file + diff --git a/src/skins/vector/img/icons-directory.svg b/src/skins/vector/img/icons-directory.svg index 00869b9b3..1f1cc29a8 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-CB729162705A Created 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 000000000..d6867a3f3 --- /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 000000000..b026718b8 --- /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 000000000..4f5002ab7 --- /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 000000000..117d134c9 --- /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 609695305..3ca2b655f 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-E19278CF66E3 Created 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 000000000..9074fcf9f --- /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 000000000..3571ec7f2 --- /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 b5e587576..000000000 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 0f115966a..000000000 --- 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 000000000..9eb279f85 --- /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 000000000..55fa06d11 --- /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 8f3701cbe..4c9dd9ee0 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 37a3e9e65..6580161b9 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 e69cf06cf..5b80ede38 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 08c96dd51..a78beac10 100644 --- a/vector/index.html +++ b/vector/index.html @@ -24,6 +24,8 @@
+ + diff --git a/webpack.config.js b/webpack.config.js index 91d0564c4..95afcfba9 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