From d239070adbe60e8a3a84c8cbe69107b7ee6648d6 Mon Sep 17 00:00:00 2001
From: Matthew Hodgson <matthew@matrix.org>
Date: Sun, 19 Jul 2015 03:19:37 +0100
Subject: [PATCH] implement login

---
 skins/base/css/molecules/ServerConfig.css  |  31 ++++++++
 skins/base/css/templates/Login.css         |  79 ++++++++++++++++++++-
 skins/base/img/logo.png                    | Bin 0 -> 14893 bytes
 skins/base/views/molecules/ServerConfig.js |  17 ++---
 skins/base/views/templates/Login.js        |  31 ++++----
 skins/base/views/templates/Register.js     |  11 ++-
 6 files changed, 139 insertions(+), 30 deletions(-)
 create mode 100644 skins/base/css/molecules/ServerConfig.css
 create mode 100644 skins/base/img/logo.png

diff --git a/skins/base/css/molecules/ServerConfig.css b/skins/base/css/molecules/ServerConfig.css
new file mode 100644
index 00000000..db0572c8
--- /dev/null
+++ b/skins/base/css/molecules/ServerConfig.css
@@ -0,0 +1,31 @@
+/*
+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_ServerConfig {
+    margin-top: 7px;
+}
+
+.mx_ServerConfig .mx_Login_field {
+    margin-top: 4px;
+    margin-bottom: 5px;
+}
+
+.mx_ServerConfig_help:link {
+    opacity: 0.8;
+    font-size: 14px;
+    font-weight: 300;
+    color: #4a4a4a;
+}
\ No newline at end of file
diff --git a/skins/base/css/templates/Login.css b/skins/base/css/templates/Login.css
index 7dbcde1c..b8cab4a4 100644
--- a/skins/base/css/templates/Login.css
+++ b/skins/base/css/templates/Login.css
@@ -15,8 +15,81 @@ limitations under the License.
 */
 
 .mx_Login {
-    width: 600px;
-    height: 350px;
-    position: relative;
+    width: 100%;
+    height: 100%;
+    display: -webkit-box;
+    display: -moz-box;
+    display: -ms-flexbox;
+    display: -webkit-flex;
+    display: flex;
+    -webkit-align-items: center;
+    align-items: center;
+    -webkit-justify-content: center;
+    justify-content: center;
+}
+
+.mx_Login h2 {
+    color: #4a4a4a;
+    font-weight: 300;
+    margin-top: 32px;
+    margin-bottom: 20px;
+}
+
+.mx_Login_box {
+    width: 300px;
+}
+
+.mx_Login_logo {
+    text-align: center;
+}
+
+.mx_Login_field {
+    width: 100%;
+    border-radius: 3px;
+    border: 1px solid #c7c7c7;
+    font-weight: 300;
+    font-size: 14px;
+    padding: 9px;
+    margin-bottom: 14px;
+}
+
+.mx_Login_submit {
+    margin-top: 35px;
+    margin-bottom: 24px;
+    width: 100%;
+    border-radius: 40px;
+    height: 40px;
+    border: 0px;
+    background-color: #76cfa6;
+    font-size: 16px;
+    color: #fff;
+}
+
+.mx_Login_label {
+    font-size: 14px;
+    opacity: 0.8;
+}
+
+.mx_Login_advanced_checkbox {
+    margin-right: 10px;
+}
+
+.mx_Login_create {
+    display: block;
+    text-align: center;
+    width: 100%;
+    font-size: 14px;
+    opacity: 0.8;
+}
+
+.mx_Login_error {
+    color: #ff2020;
+    font-weight: bold;
+    text-align: center;
+    margin-bottom: 24px;
+}
+
+.mx_Login_create:link {
+    color: #4a4a4a;
 }
 
diff --git a/skins/base/img/logo.png b/skins/base/img/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..7cea081a8f452453d0f471a4510dd31d9af95d6c
GIT binary patch
literal 14893
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

literal 0
HcmV?d00001

diff --git a/skins/base/views/molecules/ServerConfig.js b/skins/base/views/molecules/ServerConfig.js
index e06536c5..c533cf94 100644
--- a/skins/base/views/molecules/ServerConfig.js
+++ b/skins/base/views/molecules/ServerConfig.js
@@ -26,17 +26,12 @@ module.exports = React.createClass({
 
     render: function() {
         return (
-            <div className="HomeServerTextBox">
-                <table className="serverConfig">
-                <tr>
-                <td>Home Server URL</td>
-                <td><input type="text" value={this.state.hs_url} onChange={this.hsChanged} /></td>
-                </tr>
-                <tr>
-                <td>Identity Server URL</td>
-                <td><input type="text" value={this.state.is_url} onChange={this.isChanged} /></td>
-                </tr>
-                </table>
+            <div className="mx_ServerConfig">
+                <label className="mx_Login_label mx_ServerConfig_hslabel" htmlFor="hsurl">Home server URL</label>
+                <input className="mx_Login_field" id="hsurl" type="text" value={this.state.hs_url} onChange={this.hsChanged} />
+                <label className="mx_Login_label mx_ServerConfig_islabel" htmlFor="isurl">Identity server URL</label>
+                <input className="mx_Login_field" type="text" value={this.state.is_url} onChange={this.isChanged} />
+                <a className="mx_ServerConfig_help" href="#">What does this mean?</a>
             </div>
         );
     }
diff --git a/skins/base/views/templates/Login.js b/skins/base/views/templates/Login.js
index 0fd64ce5..ee7273b8 100644
--- a/skins/base/views/templates/Login.js
+++ b/skins/base/views/templates/Login.js
@@ -111,13 +111,13 @@ module.exports = React.createClass({
                 }
                 return (
                     <div>
-                        <input type="checkbox" value={this.state.serverConfigVisible} onChange={this.onServerConfigVisibleChange} />
-                        Use custom server options (advanced)
+                        <input className="mx_Login_advanced_checkbox" id="advanced" type="checkbox" value={this.state.serverConfigVisible} onChange={this.onServerConfigVisibleChange} />
+                        <label className="mx_Login_label" htmlFor="advanced">Use custom server options (advanced)</label>
                         <div style={serverConfigStyle}>
-                        <ServerConfig ref="serverConfig"
-                            defaultHsUrl={this.customHsUrl} defaultIsUrl={this.customIsUrl}
-                            onHsUrlChanged={this.onHsUrlChanged}
-                        />
+                            <ServerConfig ref="serverConfig"
+                                defaultHsUrl={this.customHsUrl} defaultIsUrl={this.customIsUrl}
+                                onHsUrlChanged={this.onHsUrlChanged}
+                            />
                         </div>
                     </div>
                 );
@@ -126,10 +126,10 @@ module.exports = React.createClass({
                 return (
                     <div>
                         <form onSubmit={this.onUserPassEntered}>
-                        <input ref="user" type="text" placeholder="username" /><br />
-                        <input ref="pass" type="password" placeholder="password" /><br />
+                        <input className="mx_Login_field" ref="user" type="text" placeholder="Email or user name" /><br />
+                        <input className="mx_Login_field" ref="pass" type="password" placeholder="Password" /><br />
                         {this.componentForStep('choose_hs')}
-                        <input type="submit" value="Log in" />
+                        <input className="mx_Login_submit" type="submit" value="Log in" />
                         </form>
                     </div>
                 );
@@ -144,10 +144,10 @@ module.exports = React.createClass({
         } else {
             return (
                 <div>
-                    <h1>Please log in:</h1>
+                    <h2>Sign in</h2>
                     {this.componentForStep(this.state.step)}
-                    <div className="error">{this.state.errorText}</div>
-                    <a onClick={this.showRegister} href="#">Create a new account</a>
+                    <div className="mx_Login_error">{this.state.errorText}</div>
+                    <a className="mx_Login_create" onClick={this.showRegister} href="#">Create a new account</a>
                 </div>
             );
         }
@@ -156,7 +156,12 @@ module.exports = React.createClass({
     render: function() {
         return (
             <div className="mx_Login">
-            {this.loginContent()}
+                <div className="mx_Login_box">
+                    <div className="mx_Login_logo">
+                        <img  src="/img/logo.png" width="249" height="76" alt="vector"/>
+                    </div>
+                    {this.loginContent()}
+                </div>
             </div>
         );
     }
diff --git a/skins/base/views/templates/Register.js b/skins/base/views/templates/Register.js
index 23367378..866f777b 100644
--- a/skins/base/views/templates/Register.js
+++ b/skins/base/views/templates/Register.js
@@ -129,7 +129,7 @@ module.exports = React.createClass({
             case 'stage_m.login.recaptcha':
                 return (
                     <div ref="recaptchaContainer">
-                        This Home Server would like to make sure you're not a robot
+                        This Home Server would like to make sure you are not a robot
                         <div id="mx_recaptcha"></div>
                     </div>
                 );
@@ -180,8 +180,13 @@ module.exports = React.createClass({
 
     render: function() {
         return (
-            <div className="mx_Register">
-            {this.registerContent()}
+            <div className="mx_Login">
+                <div className="mx_Login_box">
+                    <div className="mx_Login_logo">
+                        <img  src="/img/logo.png" width="249" height="76" alt="vector"/>
+                    </div>
+                    {this.registerContent()}
+                </div>
             </div>
         );
     }