vector wireframes

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

View File

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

View File

@ -15,9 +15,21 @@ limitations under the License.
*/
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 {
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.
*/
.mx_MessageComposer textarea {
width: 100%;
.mx_MessageComposer_wrapper {
max-width: 720px;
height: 50px;
vertical-align: middle;
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 {
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 {
display: table-cell;
}
.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 {
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 {
padding: 5px;
cursor: pointer;
display: table-row;
}
.mx_RoomTile.selected {
.mx_RoomTile_selected {
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;
text-overflow: ellipsis;
}
.mx_RoomTile.unread {
.mx_RoomTile_unread {
font-weight: bold;
}
.mx_RoomTile.highlight {
.mx_RoomTile_highlight {
background-color: lime;
}
.mx_RoomTile.invited {
.mx_RoomTile_invited {
font-weight: bold;
}

View File

@ -15,6 +15,4 @@ limitations under the License.
*/
.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_recents {
margin-top: -12px;
display: table;
table-layout: fixed;
width: 100%;
}

View File

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

View File

@ -18,62 +18,23 @@ limitations under the License.
position: relative;
width: 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: -moz-box;
display: -ms-flexbox;
display: -webkit-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;
-moz-box-ordinal-group: 1;
-ms-flex-order: 1;
-webkit-order: 1;
order: 1;
width: 100%;
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%;
flex: 0 0 230px;
height: 100%;
overflow-y: scroll;
}
.mx_MatrixChat .mx_RoomView {
@ -87,3 +48,14 @@ limitations under the License.
width: 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() {
return (
<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>
);

View File

@ -27,7 +27,16 @@ module.exports = React.createClass({
render: function() {
return (
<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>
);
},

View File

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

View File

@ -30,13 +30,14 @@ module.exports = React.createClass({
var myUserId = MatrixClientPeg.get().credentials.userId;
var classes = classNames({
'mx_RoomTile': true,
'selected': this.props.selected,
'unread': this.props.unread,
'highlight': this.props.highlight,
'invited': this.props.room.currentState.members[myUserId].membership == 'invite'
'mx_RoomTile_selected': this.props.selected,
'mx_RoomTile_unread': this.props.unread,
'mx_RoomTile_highlight': this.props.highlight,
'mx_RoomTile_invited': this.props.room.currentState.members[myUserId].membership == 'invite'
});
return (
<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>
);

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) {
var m = that.state.memberDict[userId];
return (
<li key={userId}>
<MemberTile
member={m}
/>
</li>
<MemberTile key={userId} member={m} />
);
});
},
@ -46,9 +42,17 @@ module.exports = React.createClass({
render: function() {
return (
<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()}
</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>
);
}

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';
var React = require('react');
var ComponentBroker = require('../../../../src/ComponentBroker');
var RoomDropTarget = ComponentBroker.get('molecules/RoomDropTarget');
var RoomListController = require("../../../../src/controllers/organisms/RoomList");
module.exports = React.createClass({
displayName: 'RoomList',
mixins: [RoomListController],
@ -28,7 +30,16 @@ module.exports = React.createClass({
render: function() {
return (
<div className="mx_RoomList">
{this.makeRoomTiles()}
<h2>Favourites</h2>
<RoomDropTarget text="Drop here to favourite"/>
<h2>Recents</h2>
<div className="mx_RoomList_recents">
{this.makeRoomTiles()}
</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 RoomHeader = ComponentBroker.get('molecules/RoomHeader');
var MemberList = ComponentBroker.get('organisms/MemberList');
var MessageComposer = ComponentBroker.get('molecules/MessageComposer');
var RoomViewController = require("../../../../src/controllers/organisms/RoomView");
@ -68,19 +67,16 @@ module.exports = React.createClass({
return (
<div className="mx_RoomView">
<RoomHeader room={this.state.room} />
<div className="mx_RoomView_roomWrapper">
<div className="mx_RoomView_messagePanel">
<div ref="messageWrapper" className="mx_RoomView_messageListWrapper" onScroll={this.onMessageListScroll}>
<div className="mx_RoomView_MessageList" aria-live="polite">
<div className={scrollheader_classes}>
</div>
{this.getEventTiles()}
<div ref="messageWrapper" className="mx_RoomView_messagePanel" onScroll={this.onMessageListScroll}>
<div className="mx_RoomView_messageListWrapper">
<div className="mx_RoomView_MessageList" aria-live="polite">
<div className={scrollheader_classes}>
</div>
{this.getEventTiles()}
</div>
<MessageComposer roomId={this.props.roomId} />
</div>
<MemberList roomId={this.props.roomId} key={this.props.roomId} />
</div>
<MessageComposer roomId={this.props.roomId} />
</div>
);
}

View File

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