vector wireframes

This commit is contained in:
Matthew Hodgson 2015-07-13 01:51:24 +01:00
parent 98baa0cb0a
commit bfe0cdcfd1
43 changed files with 741 additions and 128 deletions

1
examples/trivial/img Symbolic link
View file

@ -0,0 +1 @@
../../skins/base/img

View file

@ -3,6 +3,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Matrix React SDK Example</title> <title>Matrix React SDK Example</title>
<link href='http://fonts.googleapis.com/css?family=Muli:300,400' rel='stylesheet' type='text/css'>
</head> </head>
<body style="height: 100%;"> <body style="height: 100%;">
<section id="matrixchat" style="height: 100%;"></section> <section id="matrixchat" style="height: 100%;"></section>

View file

@ -15,6 +15,4 @@ limitations under the License.
*/ */
.mx_MessageTimestamp { .mx_MessageTimestamp {
display: table-cell;
white-space: pre;
} }

View file

@ -15,9 +15,21 @@ limitations under the License.
*/ */
body { body {
font-family: Helvetica, Arial, Sans-Serif; font-family: 'Muli', Helvetica, Arial, Sans-Serif;
font-weight: 300;
font-size: 15px;
color: #747474;
border: 0px;
margin: 0px;
} }
div.error { div.error {
color: red; color: red;
} }
h2 {
font-weight: 400;
font-size: 20px;
margin-top: 16px;
margin-bottom: 16px;
}

View file

@ -0,0 +1,37 @@
/*
Copyright 2015 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_MemberTile {
cursor: pointer;
display: table-row;
}
.mx_MemberTile_avatar {
display: table-cell;
padding-right: 12px;
padding-top: 3px;
padding-bottom: 3px;
vertical-align: middle;
width: 32px;
height: 32px;
}
.mx_MemberTile_name {
display: table-cell;
vertical-align: middle;
overflow: hidden;
text-overflow: ellipsis;
}

View file

@ -14,7 +14,50 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
.mx_MessageComposer textarea { .mx_MessageComposer_wrapper {
width: 100%; max-width: 720px;
height: 50px;
vertical-align: middle;
margin: auto; margin: auto;
border-top: 1px solid #d8d8d8;
border-left: 1px solid #d8d8d8;
border-right: 1px solid #d8d8d8;
}
.mx_MessageComposer_row {
display: table-row;
width: 100%;
height: 50px;
}
.mx_MessageComposer .mx_MessageComposer_avatar {
display: table-cell;
padding-left: 12px;
padding-right: 12px;
padding-top: 3px;
padding-bottom: 3px;
vertical-align: middle;
width: 32px;
height: 32px;
}
.mx_MessageComposer_input {
display: table-cell;
width: 100%;
padding-right: 1em;
vertical-align: middle;
}
.mx_MessageComposer_input textarea {
font-size: 15px;
width: 100%;
height: 1em;
border: 0px;
resize: none;
outline: none;
padding-top: 0.7em;
padding-bottom: 0.7em;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
} }

View file

@ -15,11 +15,31 @@ limitations under the License.
*/ */
.mx_MessageTile { .mx_MessageTile {
display: table-row; width: 100%;
clear: both;
margin-top: 32px;
}
.mx_MessageTile_avatar {
padding-left: 12px;
padding-right: 12px;
margin-top: -7px;
float: left;
}
.mx_MessageTile .mx_SenderProfile {
color: #acacac;
font-size: 13px;
display: block;
}
.mx_MessageTile .mx_MessageTimestamp {
color: #acacac;
font-size: 13px;
float: right;
} }
.mx_MessageTile_content { .mx_MessageTile_content {
display: table-cell;
} }
.mx_MessageTile_sending { .mx_MessageTile_sending {

View file

@ -0,0 +1,27 @@
/*
Copyright 2015 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_RoomDropTarget {
font-size: 14px;
text-align: center;
margin-left: -8px;
margin-right: -8px;
padding-top: 16px;
padding-bottom: 16px;
background-color: #fbfbfb;
border: 1px dashed #d7d7d7;
border-radius: 8px;
}

View file

@ -15,6 +15,45 @@ limitations under the License.
*/ */
.mx_RoomHeader { .mx_RoomHeader {
height: 1em; }
padding: 0px;
.mx_RoomHeader_wrapper {
max-width: 720px;
margin: auto;
height: 50px;
}
.mx_RoomHeader_leftRow {
display: table-row;
height: 50px;
float: left;
}
.mx_RoomHeader_rightRow {
display: table-row;
height: 50px;
float: right;
}
.mx_RoomHeader_name {
display: table-cell;
vertical-align: middle;
height: 50px;
font-weight: 400;
font-size: 20px;
padding-left: 16px;
padding-right: 16px;
}
.mx_RoomHeader_avatar {
display: table-cell;
height: 50px;
vertical-align: middle;
}
.mx_RoomHeader_button {
height: 50px;
display: table-cell;
vertical-align: middle;
padding-right: 16px;
} }

View file

@ -15,31 +15,40 @@ limitations under the License.
*/ */
.mx_RoomTile { .mx_RoomTile {
padding: 5px;
cursor: pointer; cursor: pointer;
display: table-row;
} }
.mx_RoomTile.selected { .mx_RoomTile_selected {
text-decoration: underline; text-decoration: underline;
} }
.mx_RoomTile_name { .mx_RoomTile_avatar {
display: table-cell;
padding-right: 12px;
padding-top: 3px;
padding-bottom: 3px;
vertical-align: middle;
width: 32px;
height: 32px;
} }
.mx_RoomTile div { .mx_RoomTile_name {
display: table-cell;
vertical-align: middle;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
} }
.mx_RoomTile.unread { .mx_RoomTile_unread {
font-weight: bold; font-weight: bold;
} }
.mx_RoomTile.highlight { .mx_RoomTile_highlight {
background-color: lime; background-color: lime;
} }
.mx_RoomTile.invited { .mx_RoomTile_invited {
font-weight: bold; font-weight: bold;
} }

View file

@ -15,6 +15,4 @@ limitations under the License.
*/ */
.mx_SenderProfile { .mx_SenderProfile {
display: table-cell;
padding: 0px 1em 0em 1em;
} }

View file

@ -0,0 +1,88 @@
/*
Copyright 2015 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_LeftPanel {
position: relative;
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
flex-direction: column;
-webkit-flex-direction: column;
border-right: 1px solid #d8d8d8;
}
.mx_LeftPanel_hideButton {
position: absolute;
top: 10px;
right: 10px;
}
.mx_LeftPanel .mx_RoomList {
-webkit-box-ordinal-group: 1;
-moz-box-ordinal-group: 1;
-ms-flex-order: 1;
-webkit-order: 1;
order: 1;
padding-left: 16px;
padding-right: 16px;
/* background-color: #0ff; */
height: 100%;
overflow-y: scroll;
}
.mx_LeftPanel .mx_RoomCreate {
-webkit-box-ordinal-group: 2;
-moz-box-ordinal-group: 2;
-ms-flex-order: 2;
-webkit-order: 2;
order: 2;
padding-left: 16px;
padding-right: 16px;
min-height: 46px;
border-top: 1px solid #d8d8d8;
border-bottom: 1px solid #d8d8d8;
}
.mx_LeftPanel .mx_RoomCreate .mx_RoomCreate_table {
display: table;
width: 100%;
height: 46px;
}
.mx_LeftPanel .mx_DirectoryMenu {
-webkit-box-ordinal-group: 3;
-moz-box-ordinal-group: 3;
-ms-flex-order: 3;
-webkit-order: 3;
order: 3;
min-height: 150px;
padding-left: 16px;
padding-right: 16px;
}
.mx_LeftPanel .mx_DirectoryMenu .mx_DirectoryMenu_options {
margin-top: -12px;
width: 100%;
}

View file

@ -0,0 +1,42 @@
/*
Copyright 2015 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_MemberList {
width: 100%;
height: 100%;
margin-bottom: 100px;
}
.mx_MemberList_chevron {
position: absolute;
right: 20px;
margin-top: -5px;
}
.mx_MemberList_wrapper {
border: 1px solid #d8d8d8;
margin: 8px;
overflow-y: scroll;
height: auto;
max-height: 75%;
border-radius: 8px;
padding: 20px 24px 14px 24px;
table-layout: fixed;
}
.mx_MemberList h2 {
margin-top: 0px;
}

View file

@ -0,0 +1,54 @@
/*
Copyright 2015 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_RightPanel {
position: relative;
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
flex-direction: column;
-webkit-flex-direction: column;
}
.mx_RightPanel_header {
-webkit-box-ordinal-group: 1;
-moz-box-ordinal-group: 1;
-ms-flex-order: 1;
-webkit-order: 1;
order: 1;
flex: 0 0 50px;
text-align: right;
height: 50px;
border-bottom: 1px solid #d8d8d8;
}
.mx_RightPanel_headerButton {
margin-top: 9px;
margin-right: 16px;
}
.mx_RightPanel .mx_MemberList {
-webkit-box-ordinal-group: 2;
-moz-box-ordinal-group: 2;
-ms-flex-order: 2;
-webkit-order: 2;
order: 2;
}

View file

@ -16,3 +16,10 @@ limitations under the License.
.mx_RoomList { .mx_RoomList {
} }
.mx_RoomList_recents {
margin-top: -12px;
display: table;
table-layout: fixed;
width: 100%;
}

View file

@ -17,66 +17,74 @@ limitations under the License.
.mx_RoomView { .mx_RoomView {
word-wrap: break-word; word-wrap: break-word;
position: relative; position: relative;
}
.mx_RoomView .mx_RoomHeader {
height: 30px;
}
.mx_RoomView_roomWrapper {
display: -webkit-box; display: -webkit-box;
display: -moz-box; display: -moz-box;
display: -ms-flexbox; display: -ms-flexbox;
display: -webkit-flex; display: -webkit-flex;
display: flex; display: flex;
position: absolute;
width: 100%; width: 100%;
top: 32px; flex-direction: column;
bottom: 0px; -webkit-flex-direction: column;
} }
.mx_RoomView_messagePanel { .mx_RoomView .mx_RoomHeader {
-webkit-box-ordinal-group: 1; -webkit-box-ordinal-group: 1;
-moz-box-ordinal-group: 1; -moz-box-ordinal-group: 1;
-ms-flex-order: 1; -ms-flex-order: 1;
-webkit-order: 1; -webkit-order: 1;
order: 1; order: 1;
width: 100%;
height: 100%; flex: 0 0 50px;
/* background-color: #ff0; */ border-bottom: 1px solid #d8d8d8;
} }
.mx_RoomView_messageListWrapper { .mx_RoomView_auxPanel {
height: 100%;
overflow-y: scroll;
}
.mx_RoomView_MessageList {
display: table;
}
.mx_RoomView_invitePrompt {
}
.mx_RoomView .mx_MemberList {
-webkit-box-ordinal-group: 2; -webkit-box-ordinal-group: 2;
-moz-box-ordinal-group: 2; -moz-box-ordinal-group: 2;
-ms-flex-order: 2; -ms-flex-order: 2;
-webkit-order: 2; -webkit-order: 2;
order: 2; order: 2;
/* background-color: #0f0; */ width: 100%;
width: 250px; height: 0%;
overflow-y: scroll;
height: 100%;
} }
.mx_RoomView .mx_MemberList ul { .mx_RoomView_messagePanel {
margin: 0px; -webkit-box-ordinal-group: 3;
padding: 0px; -moz-box-ordinal-group: 3;
-ms-flex-order: 3;
-webkit-order: 3;
order: 3;
width: 100%;
height: 100%;
margin-bottom: 60px;
/* background-color: #ff0; */
overflow-y: scroll;
}
.mx_RoomView_messageListWrapper {
max-width: 720px;
margin: auto;
}
.mx_RoomView_MessageList {
width: 100%;
}
.mx_RoomView_invitePrompt {
} }
.mx_RoomView .mx_MessageComposer { .mx_RoomView .mx_MessageComposer {
-webkit-box-ordinal-group: 4;
-moz-box-ordinal-group: 4;
-ms-flex-order: 4;
-webkit-order: 4;
order: 4;
width: 100%; width: 100%;
bottom: 0px; flex: 0 0 50px;
/* background-color: #ff0; */
} }

View file

@ -18,62 +18,23 @@ limitations under the License.
position: relative; position: relative;
width: 100%; width: 100%;
height: 100%; height: 100%;
}
.mx_MatrixChat_chatWrapper {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
position: absolute;
width: 100%;
top: 0px;
bottom: 42px;
}
.mx_MatrixChat_leftPanel {
-webkit-box-ordinal-group: 1;
-moz-box-ordinal-group: 1;
-ms-flex-order: 1;
-webkit-order: 1;
order: 1;
display: -webkit-box; display: -webkit-box;
display: -moz-box; display: -moz-box;
display: -ms-flexbox; display: -ms-flexbox;
display: -webkit-flex; display: -webkit-flex;
display: flex; display: flex;
flex-direction: column;
-webkit-flex-direction: column;
/* background-color: #f00; */
width: 250px;
height: 100%;
} }
.mx_MatrixChat_leftPanel .mx_MatrixToolbar { .mx_MatrixChat .mx_LeftPanel {
-webkit-box-ordinal-group: 1; -webkit-box-ordinal-group: 1;
-moz-box-ordinal-group: 1; -moz-box-ordinal-group: 1;
-ms-flex-order: 1; -ms-flex-order: 1;
-webkit-order: 1; -webkit-order: 1;
order: 1; order: 1;
width: 100%; flex: 0 0 230px;
height: 40px;
}
.mx_MatrixChat_leftPanel .mx_RoomList {
-webkit-box-ordinal-group: 2;
-moz-box-ordinal-group: 2;
-ms-flex-order: 2;
-webkit-order: 2;
order: 2;
/* background-color: #0ff; */
width: 100%;
height: 100%; height: 100%;
overflow-y: scroll;
} }
.mx_MatrixChat .mx_RoomView { .mx_MatrixChat .mx_RoomView {
@ -87,3 +48,14 @@ limitations under the License.
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
.mx_MatrixChat .mx_RightPanel {
-webkit-box-ordinal-group: 3;
-moz-box-ordinal-group: 3;
-ms-flex-order: 3;
-webkit-order: 3;
order: 3;
flex: 0 0 230px;
height: 100%;
}

BIN
skins/base/img/attach.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 B

BIN
skins/base/img/chevron.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
skins/base/img/create.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 B

BIN
skins/base/img/file.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 B

BIN
skins/base/img/hide.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 B

BIN
skins/base/img/info.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 B

BIN
skins/base/img/members.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 B

BIN
skins/base/img/search.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 651 B

BIN
skins/base/img/video.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 471 B

BIN
skins/base/img/voip.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 541 B

View file

@ -0,0 +1,50 @@
/*
Copyright 2015 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 classNames = require('classnames');
//var DirectoryMenuController = require("../../../../src/controllers/molecules/DirectoryMenuController");
var MatrixClientPeg = require("../../../../src/MatrixClientPeg");
module.exports = React.createClass({
displayName: 'DirectoryMenu',
// mixins: [DirectoryMenuController],
render: function() {
return (
<div className="mx_DirectoryMenu">
<h2>Directory</h2>
<div className="mx_DirectoryMenu_options">
<div className="mx_RoomTile">
<div className="mx_RoomTile_avatar">
<img src="img/placeholder.png" width="32" height="32" alt="(+)"/>
</div>
<div className="mx_RoomTile_name">Users</div>
</div>
<div className="mx_RoomTile">
<div className="mx_RoomTile_avatar">
<img src="img/placeholder.png" width="32" height="32" alt="(+)"/>
</div>
<div className="mx_RoomTile_name">Rooms</div>
</div>
</div>
</div>
);
}
});

View file

@ -26,6 +26,7 @@ module.exports = React.createClass({
render: function() { render: function() {
return ( return (
<div className="mx_MemberTile"> <div className="mx_MemberTile">
<div className="mx_MemberTile_avatar"><img src="img/placeholder.png" width="32" height="32" alt="()"/></div>
<div className="mx_MemberTile_name">{this.props.member.name}</div> <div className="mx_MemberTile_name">{this.props.member.name}</div>
</div> </div>
); );

View file

@ -27,7 +27,16 @@ module.exports = React.createClass({
render: function() { render: function() {
return ( return (
<div className="mx_MessageComposer"> <div className="mx_MessageComposer">
<textarea ref="textarea" onKeyDown={this.onKeyDown} /> <div className="mx_MessageComposer_wrapper">
<div className="mx_MessageComposer_row">
<div className="mx_MessageComposer_avatar">
<img src="img/placeholder.png" width="32" height="32" alt="(+)"/>
</div>
<div className="mx_MessageComposer_input">
<textarea ref="textarea" onKeyDown={this.onKeyDown} placeholder="Type a message" />
</div>
</div>
</div>
</div> </div>
); );
}, },

View file

@ -56,6 +56,9 @@ module.exports = React.createClass({
}); });
return ( return (
<div className={classes}> <div className={classes}>
<div className="mx_MessageTile_avatar">
<img src="/img/placeholder.png" width="32" height="32"/>
</div>
<MessageTimestamp ts={this.props.mxEvent.getTs()} /> <MessageTimestamp ts={this.props.mxEvent.getTs()} />
<SenderProfile mxEvent={this.props.mxEvent} /> <SenderProfile mxEvent={this.props.mxEvent} />
<TileType mxEvent={this.props.mxEvent} /> <TileType mxEvent={this.props.mxEvent} />

View file

@ -0,0 +1,43 @@
/*
Copyright 2015 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 classNames = require('classnames');
//var RoomCreateController = require("../../../../src/controllers/molecules/RoomCreateController");
var MatrixClientPeg = require("../../../../src/MatrixClientPeg");
module.exports = React.createClass({
displayName: 'RoomCreate',
// mixins: [RoomCreateController],
render: function() {
return (
<div className="mx_RoomCreate">
<div className="mx_RoomCreate_table">
<div className="mx_RoomTile">
<div className="mx_RoomTile_avatar">
<img src="img/create.png" width="32" height="32" alt="(+)"/>
</div>
<div className="mx_RoomTile_name">Create new room</div>
</div>
</div>
</div>
);
}
});

View file

@ -0,0 +1,36 @@
/*
Copyright 2015 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 classNames = require('classnames');
//var RoomDropTargetController = require("../../../../src/controllers/molecules/RoomDropTargetController");
var MatrixClientPeg = require("../../../../src/MatrixClientPeg");
module.exports = React.createClass({
displayName: 'RoomDropTarget',
// mixins: [RoomDropTargetController],
render: function() {
return (
<div className="mx_RoomDropTarget">
{this.props.text}
</div>
);
}
});

View file

@ -27,7 +27,28 @@ module.exports = React.createClass({
render: function() { render: function() {
return ( return (
<div className="mx_RoomHeader"> <div className="mx_RoomHeader">
{this.props.room.name} <div className="mx_RoomHeader_wrapper">
<div className="mx_RoomHeader_leftRow">
<div className="mx_RoomHeader_avatar">
<img src="img/placeholder.png" width="32" height="32" alt="(+)"/>
</div>
<div className="mx_RoomHeader_name">{this.props.room.name}</div>
<div className="mx_RoomHeader_button">
<img src="img/info.png" width="32" height="32"/>
</div>
</div>
<div className="mx_RoomHeader_rightRow">
<div className="mx_RoomHeader_button">
<img src="img/search.png" width="32" height="32"/>
</div>
<div className="mx_RoomHeader_button">
<img src="img/video.png" width="32" height="32"/>
</div>
<div className="mx_RoomHeader_button">
<img src="img/voip.png" width="32" height="32"/>
</div>
</div>
</div>
</div> </div>
); );
}, },

View file

@ -30,13 +30,14 @@ module.exports = React.createClass({
var myUserId = MatrixClientPeg.get().credentials.userId; var myUserId = MatrixClientPeg.get().credentials.userId;
var classes = classNames({ var classes = classNames({
'mx_RoomTile': true, 'mx_RoomTile': true,
'selected': this.props.selected, 'mx_RoomTile_selected': this.props.selected,
'unread': this.props.unread, 'mx_RoomTile_unread': this.props.unread,
'highlight': this.props.highlight, 'mx_RoomTile_highlight': this.props.highlight,
'invited': this.props.room.currentState.members[myUserId].membership == 'invite' 'mx_RoomTile_invited': this.props.room.currentState.members[myUserId].membership == 'invite'
}); });
return ( return (
<div className={classes} onClick={this.onClick}> <div className={classes} onClick={this.onClick}>
<div className="mx_RoomTile_avatar"><img src="img/placeholder.png" width="32" height="32" alt="()"/></div>
<div className="mx_RoomTile_name">{this.props.room.name}</div> <div className="mx_RoomTile_name">{this.props.room.name}</div>
</div> </div>
); );

View file

@ -0,0 +1,40 @@
/*
Copyright 2015 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 ComponentBroker = require('../../../../src/ComponentBroker');
var RoomList = ComponentBroker.get('organisms/RoomList');
var DirectoryMenu = ComponentBroker.get('molecules/DirectoryMenu');
var RoomCreate = ComponentBroker.get('molecules/RoomCreate');
module.exports = React.createClass({
displayName: 'LeftPanel',
render: function() {
return (
<div className="mx_LeftPanel">
<img className="mx_LeftPanel_hideButton" src="img/hide.png" width="32" height="32" alt="<"/>
<RoomList selectedRoom={this.props.currentRoom} />
<RoomCreate/>
<DirectoryMenu />
</div>
);
}
});

View file

@ -34,11 +34,7 @@ module.exports = React.createClass({
return Object.keys(that.state.memberDict).map(function(userId) { return Object.keys(that.state.memberDict).map(function(userId) {
var m = that.state.memberDict[userId]; var m = that.state.memberDict[userId];
return ( return (
<li key={userId}> <MemberTile key={userId} member={m} />
<MemberTile
member={m}
/>
</li>
); );
}); });
}, },
@ -46,9 +42,17 @@ module.exports = React.createClass({
render: function() { render: function() {
return ( return (
<div className="mx_MemberList"> <div className="mx_MemberList">
<ul> <div className="mx_MemberList_chevron">
<img src="img/chevron.png" width="24" height="13"/>
</div>
<div className="mx_MemberList_wrapper">
<h2>Members</h2>
{this.makeMemberTiles()} {this.makeMemberTiles()}
</ul> <div className="mx_MemberTile">
<div className="mx_MemberTile_avatar"><img src="img/create.png" width="32" height="32" alt="()"/></div>
<div className="mx_MemberTile_name">Invite</div>
</div>
</div>
</div> </div>
); );
} }

View file

@ -0,0 +1,39 @@
/*
Copyright 2015 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 ComponentBroker = require('../../../../src/ComponentBroker');
var MemberList = ComponentBroker.get('organisms/MemberList');
module.exports = React.createClass({
displayName: 'RightPanel',
render: function() {
return (
<div className="mx_RightPanel">
<div className="mx_RightPanel_header">
<img className="mx_RightPanel_headerButton" src="img/file.png" width="32" height="32" alt="Files"/>
<img className="mx_RightPanel_headerButton" src="img/members.png" width="32" height="32" alt="Members"/>
</div>
<MemberList roomId={this.props.roomId} key={this.props.roomId} />
</div>
);
}
});

View file

@ -17,10 +17,12 @@ limitations under the License.
'use strict'; 'use strict';
var React = require('react'); var React = require('react');
var ComponentBroker = require('../../../../src/ComponentBroker');
var RoomDropTarget = ComponentBroker.get('molecules/RoomDropTarget');
var RoomListController = require("../../../../src/controllers/organisms/RoomList"); var RoomListController = require("../../../../src/controllers/organisms/RoomList");
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'RoomList', displayName: 'RoomList',
mixins: [RoomListController], mixins: [RoomListController],
@ -28,8 +30,17 @@ module.exports = React.createClass({
render: function() { render: function() {
return ( return (
<div className="mx_RoomList"> <div className="mx_RoomList">
<h2>Favourites</h2>
<RoomDropTarget text="Drop here to favourite"/>
<h2>Recents</h2>
<div className="mx_RoomList_recents">
{this.makeRoomTiles()} {this.makeRoomTiles()}
</div> </div>
<h2>Archive</h2>
<RoomDropTarget text="Drop here to archive"/>
</div>
); );
} }
}); });

View file

@ -25,7 +25,6 @@ var classNames = require("classnames");
var MessageTile = ComponentBroker.get('molecules/MessageTile'); var MessageTile = ComponentBroker.get('molecules/MessageTile');
var RoomHeader = ComponentBroker.get('molecules/RoomHeader'); var RoomHeader = ComponentBroker.get('molecules/RoomHeader');
var MemberList = ComponentBroker.get('organisms/MemberList');
var MessageComposer = ComponentBroker.get('molecules/MessageComposer'); var MessageComposer = ComponentBroker.get('molecules/MessageComposer');
var RoomViewController = require("../../../../src/controllers/organisms/RoomView"); var RoomViewController = require("../../../../src/controllers/organisms/RoomView");
@ -68,20 +67,17 @@ module.exports = React.createClass({
return ( return (
<div className="mx_RoomView"> <div className="mx_RoomView">
<RoomHeader room={this.state.room} /> <RoomHeader room={this.state.room} />
<div className="mx_RoomView_roomWrapper"> <div ref="messageWrapper" className="mx_RoomView_messagePanel" onScroll={this.onMessageListScroll}>
<div className="mx_RoomView_messagePanel"> <div className="mx_RoomView_messageListWrapper">
<div ref="messageWrapper" className="mx_RoomView_messageListWrapper" onScroll={this.onMessageListScroll}>
<div className="mx_RoomView_MessageList" aria-live="polite"> <div className="mx_RoomView_MessageList" aria-live="polite">
<div className={scrollheader_classes}> <div className={scrollheader_classes}>
</div> </div>
{this.getEventTiles()} {this.getEventTiles()}
</div> </div>
</div> </div>
</div>
<MessageComposer roomId={this.props.roomId} /> <MessageComposer roomId={this.props.roomId} />
</div> </div>
<MemberList roomId={this.props.roomId} key={this.props.roomId} />
</div>
</div>
); );
} }
}, },

View file

@ -19,9 +19,9 @@ limitations under the License.
var React = require('react'); var React = require('react');
var ComponentBroker = require('../../../../src/ComponentBroker'); var ComponentBroker = require('../../../../src/ComponentBroker');
var RoomList = ComponentBroker.get('organisms/RoomList'); var LeftPanel = ComponentBroker.get('organisms/LeftPanel');
var RoomView = ComponentBroker.get('organisms/RoomView'); var RoomView = ComponentBroker.get('organisms/RoomView');
var MatrixToolbar = ComponentBroker.get('molecules/MatrixToolbar'); var RightPanel = ComponentBroker.get('organisms/RightPanel');
var Login = ComponentBroker.get('templates/Login'); var Login = ComponentBroker.get('templates/Login');
var MatrixChatController = require("../../../../src/controllers/pages/MatrixChat"); var MatrixChatController = require("../../../../src/controllers/pages/MatrixChat");
@ -38,13 +38,9 @@ module.exports = React.createClass({
if (this.state.logged_in && this.state.ready) { if (this.state.logged_in && this.state.ready) {
return ( return (
<div className="mx_MatrixChat"> <div className="mx_MatrixChat">
<div className="mx_MatrixChat_chatWrapper"> <LeftPanel selectedRoom={this.state.currentRoom} />
<div className="mx_MatrixChat_leftPanel">
<RoomList selectedRoom={this.state.currentRoom} />
<MatrixToolbar />
</div>
<RoomView roomId={this.state.currentRoom} key={this.state.currentRoom} /> <RoomView roomId={this.state.currentRoom} key={this.state.currentRoom} />
</div> <RightPanel roomId={this.state.currentRoom} />
</div> </div>
); );
} else if (this.state.logged_in) { } else if (this.state.logged_in) {

View file

@ -82,4 +82,11 @@ require('../skins/base/views/organisms/RoomList');
require('../skins/base/views/organisms/RoomView'); require('../skins/base/views/organisms/RoomView');
require('../skins/base/views/templates/Login'); require('../skins/base/views/templates/Login');
require('../skins/base/views/organisms/Notifier'); require('../skins/base/views/organisms/Notifier');
// new for vector
require('../skins/base/views/organisms/LeftPanel');
require('../skins/base/views/organisms/RightPanel');
require('../skins/base/views/molecules/RoomCreate');
require('../skins/base/views/molecules/RoomDropTarget');
require('../skins/base/views/molecules/DirectoryMenu');
} }