Quellcode durchsuchen

integration of login page + added webpack dashboard plugin

Skylsmoi vor 6 Jahren
Ursprung
Commit
640dd4555a

+ 2 - 1
package.json Datei anzeigen

@@ -5,7 +5,7 @@
5 5
   "main": "index.js",
6 6
   "scripts": {
7 7
     "mockapi": "node jsonserver/server.js",
8
-    "servdev": "NODE_ENV=development webpack-dev-server --watch --colors --inline --hot --progress",
8
+    "servdev": "NODE_ENV=development webpack-dashboard -- webpack-dev-server --watch --colors --inline --hot --progress",
9 9
     "build": "NODE_ENV=production webpack -p",
10 10
     "test": "echo \"Error: no test specified\" && exit 1"
11 11
   },
@@ -43,6 +43,7 @@
43 43
   },
44 44
   "devDependencies": {
45 45
     "json-server": "^0.12.0",
46
+    "webpack-dashboard": "^1.0.2",
46 47
     "webpack-dev-server": "^2.9.2"
47 48
   },
48 49
   "standard": {

+ 23 - 0
src/component/Login/LoginBtnForgotPw.jsx Datei anzeigen

@@ -0,0 +1,23 @@
1
+import React from 'react'
2
+import PropTypes from 'prop-types'
3
+import classnames from 'classnames'
4
+
5
+const LoginBtnForgotPw = props => {
6
+  return (
7
+    <div className={classnames(props.customClass)}>
8
+      {props.label}
9
+    </div>
10
+  )
11
+}
12
+
13
+export default LoginBtnForgotPw
14
+
15
+LoginBtnForgotPw.PropTypes = {
16
+  customClass: PropTypes.string,
17
+  label: PropTypes.string
18
+}
19
+
20
+LoginBtnForgotPw.defaultProps = {
21
+  customClass: '',
22
+  label: ''
23
+}

+ 15 - 0
src/component/Login/LoginLogo.jsx Datei anzeigen

@@ -0,0 +1,15 @@
1
+import React from 'react'
2
+import PropTypes from 'prop-types'
3
+
4
+const Logo = props => {
5
+  return (
6
+    <div className='loginpage__content__logo'>
7
+      <img src={props.logoSrc} />
8
+    </div>
9
+  )
10
+}
11
+export default Logo
12
+
13
+Logo.PropTypes = {
14
+  logoSrc: PropTypes.string.isRequired
15
+}

+ 15 - 0
src/component/common/Card/Card.jsx Datei anzeigen

@@ -0,0 +1,15 @@
1
+import React from 'react'
2
+import PropTypes from 'prop-types'
3
+
4
+const Card = props => {
5
+  return (
6
+    <div className='loginpage__content__connection card'>
7
+      {props.children}
8
+    </div>
9
+  )
10
+}
11
+export default Card
12
+
13
+Card.PropTypes = {
14
+  children: PropTypes.element.isRequired
15
+}

+ 24 - 0
src/component/common/Card/CardBody.jsx Datei anzeigen

@@ -0,0 +1,24 @@
1
+import React from 'react'
2
+import PropTypes from 'prop-types'
3
+import classnames from 'classnames'
4
+
5
+const CardBody = props => {
6
+  return (
7
+    <div className='card-body'>
8
+      <form className={classnames(props.formClass)}>
9
+        {props.children}
10
+      </form>
11
+    </div>
12
+  )
13
+}
14
+
15
+export default CardBody
16
+
17
+CardBody.PropTypes = {
18
+  children: PropTypes.element.isRequired,
19
+  formClass: PropTypes.string
20
+}
21
+
22
+CardBody.defaultProps = {
23
+  formClass: ''
24
+}

+ 22 - 0
src/component/common/Card/CardHeader.jsx Datei anzeigen

@@ -0,0 +1,22 @@
1
+import React from 'react'
2
+import PropTypes from 'prop-types'
3
+import classnames from 'classnames'
4
+
5
+const CardHeader = props => {
6
+  return (
7
+    <div className={classnames('card-header', props.customClass)}>
8
+      {props.children}
9
+    </div>
10
+  )
11
+}
12
+
13
+export default CardHeader
14
+
15
+CardHeader.PropTypes = {
16
+  children: PropTypes.element.isRequired,
17
+  customClass: PropTypes.string
18
+}
19
+
20
+CardHeader.defaultProps = {
21
+  customClass: ''
22
+}

+ 32 - 0
src/component/common/Input/Button.jsx Datei anzeigen

@@ -0,0 +1,32 @@
1
+import React from 'react'
2
+import PropTypes from 'prop-types'
3
+import classnames from 'classnames'
4
+
5
+const Button = props => {
6
+  return (
7
+    <button
8
+      type={props.htmlType}
9
+      className={classnames(props.customClass, 'btn', `btn-${props.bootstrapType}`)}
10
+    >
11
+      {props.label}
12
+    </button>
13
+  )
14
+}
15
+
16
+export default Button
17
+
18
+Button.PropTypes = {
19
+  htmlType: PropTypes.oneOf(['button', 'submit', 'reset']).isRequired,
20
+  bootstrapType: PropTypes.oneOf(
21
+    ['primary', 'default', 'default', 'success', 'danger', 'warning', 'info', 'light', 'dark']
22
+  ).isRequired,
23
+  customClass: PropTypes.string,
24
+  label: PropTypes.string,
25
+  onClick: PropTypes.func
26
+}
27
+
28
+Button.defaultProps = {
29
+  customClass: '',
30
+  label: '',
31
+  onClick: () => {}
32
+}

+ 27 - 0
src/component/common/Input/InputCheckbox.jsx Datei anzeigen

@@ -0,0 +1,27 @@
1
+import React from 'react'
2
+import PropTypes from 'prop-types'
3
+import classnames from 'classnames'
4
+
5
+const InputGroupText = props => {
6
+  return (
7
+    <div className={classnames(`${props.parentClassName}`, props.customClass, 'form-check')}>
8
+      <label className={classnames(`${props.parentClassName}__label`, 'form-check-label')}>
9
+        <input type='checkbox' className={classnames(`${props.parentClassName}__label__checkbox`, 'form-check-input')} />
10
+        {props.label}
11
+      </label>
12
+    </div>
13
+  )
14
+}
15
+
16
+export default InputGroupText
17
+
18
+InputGroupText.PropTypes = {
19
+  parentClassName: PropTypes.string.isRequired,
20
+  customClass: PropTypes.string,
21
+  label: PropTypes.string
22
+}
23
+
24
+InputGroupText.defaultProps = {
25
+  customClass: '',
26
+  label: ''
27
+}

+ 42 - 0
src/component/common/Input/InputGroupText.jsx Datei anzeigen

@@ -0,0 +1,42 @@
1
+import React from 'react'
2
+import PropTypes from 'prop-types'
3
+import classnames from 'classnames'
4
+
5
+const InputGroupText = props => {
6
+  return (
7
+    <div className={classnames(`${props.parentClassName}`, props.customClass, 'form-group')}>
8
+      <div className={classnames(`${props.parentClassName}__icon`)}>
9
+        <i className={classnames('fa fa-fw', props.icon)} />
10
+      </div>
11
+      <input
12
+        type={props.type}
13
+        className={classnames(`${props.parentClassName}__input`, 'form-control')}
14
+        placeholder={props.placeHolder}
15
+        onChange={props.onChange}
16
+      />
17
+      <div className={classnames(`${props.parentClassName}__msgerror`, 'invalid-feedback')}>
18
+        {props.invalidMsg}
19
+      </div>
20
+    </div>
21
+  )
22
+}
23
+
24
+export default InputGroupText
25
+
26
+InputGroupText.PropTypes = {
27
+  parentClassName: PropTypes.string.isRequired,
28
+  customClass: PropTypes.string,
29
+  icon: PropTypes.string,
30
+  type: PropTypes.string.isRequired,
31
+  placeHolder: PropTypes.string,
32
+  invalidMsg: PropTypes.string,
33
+  onChange: PropTypes.func
34
+}
35
+
36
+InputGroupText.defaultProps = {
37
+  customClass: '',
38
+  icon: false,
39
+  placeHolder: '',
40
+  invalidMsg: false,
41
+  onChange: () => {}
42
+}

src/component/ConnectionForm.jsx → src/component/old_ConnectionForm.jsx Datei anzeigen


src/component/HeaderTpl.jsx → src/component/old_HeaderTpl.jsx Datei anzeigen


+ 3 - 12
src/container/Header.jsx Datei anzeigen

@@ -1,6 +1,5 @@
1 1
 import React from 'react'
2 2
 import { connect } from 'react-redux'
3
-// import HeaderTpl from '../component/HeaderTpl.jsx'
4 3
 import Logo from '../component/Header/Logo.jsx'
5 4
 import NavbarToggler from '../component/Header/NavbarToggler.jsx'
6 5
 import MenuLinkList from '../component/Header/MenuLinkList.jsx'
@@ -14,10 +13,6 @@ import flagFr from '../img/flagFr.png'
14 13
 import flagEn from '../img/flagEn.png'
15 14
 // import { updateUserLang } from '../action-creator.async.js'
16 15
 
17
-const HeaderWrapper = props => <header><nav className='header navbar navbar-expand-md navbar-light bg-light'>{props.children}</nav></header>
18
-const HeaderMenuRightWrapper = props => <div className='header__menu collapse navbar-collapse justify-content-end' id='navbarSupportedContent'>{props.children}</div>
19
-const MenuActionListWrapper = props => <ul className='header__menu__rightside'>{ props.children }</ul>
20
-
21 16
 class Header extends React.Component {
22 17
   // handleChangeLang = newLang => this.props.dispatch(updateUserLang(newLang))
23 18
   // handleSubmitSearch = search => console.log('search submited : ', search)
@@ -39,13 +34,6 @@ class Header extends React.Component {
39 34
   handleClickLogout = () => {}
40 35
 
41 36
   render () {
42
-    // return (
43
-    //   <HeaderTpl
44
-    //     user={this.props.user}
45
-    //     onChangeLang={this.handleChangeLang}
46
-    //     onSubmitSearch={this.handleSubmitSearch}
47
-    //   />
48
-    // )
49 37
     const { user } = this.props
50 38
     const langList = [{ // @TODO this should come from API
51 39
       id: 'fr',
@@ -65,6 +53,9 @@ class Header extends React.Component {
65 53
     //   'S_zkvxpAJO0g?size=800x600&size_mode=3'
66 54
     // }
67 55
 
56
+    const HeaderWrapper = props => <header><nav className='header navbar navbar-expand-md navbar-light bg-light'>{props.children}</nav></header>
57
+    const HeaderMenuRightWrapper = props => <div className='header__menu collapse navbar-collapse justify-content-end' id='navbarSupportedContent'>{props.children}</div>
58
+    const MenuActionListWrapper = props => <ul className='header__menu__rightside'>{ props.children }</ul>
68 59
     return (
69 60
       <HeaderWrapper>
70 61
         <Logo logoSrc={logoHeader} onClickImg={this.handleClickLogo} />

+ 113 - 77
src/container/Login.jsx Datei anzeigen

@@ -1,7 +1,15 @@
1 1
 import React from 'react'
2 2
 import { connect } from 'react-redux'
3
-// import { ConnectionForm } from '../component/ConnectionForm.jsx'
3
+import LoginLogo from '../component/Login/LoginLogo.jsx'
4
+import LoginLogoImg from '../img/logoTracimWhite.svg'
4 5
 import { userLogin } from '../action-creator.async.js'
6
+import Card from '../component/common/Card/Card.jsx'
7
+import CardHeader from '../component/common/Card/CardHeader.jsx'
8
+import CardBody from '../component/common/Card/CardBody.jsx'
9
+import InputGroupText from '../component/common/Input/InputGroupText.jsx'
10
+import InputCheckbox from '../component/common/Input/InputCheckbox.jsx'
11
+import Button from '../component/common/Input/Button.jsx'
12
+import LoginBtnForgotPw from '../component/Login/LoginBtnForgotPw.jsx'
5 13
 
6 14
 class Login extends React.Component {
7 15
   constructor (props) {
@@ -29,86 +37,114 @@ class Login extends React.Component {
29 37
     //     />
30 38
     //   </div>
31 39
     // )
32
-    return (
33
-      <div>{/*
34
-        <div className='loginpage'>
35
-
36
-          <section className='loginpage__content'>
37
-            <div className='sidebar'>
38
-              sidebar
39
-            </div>
40
-            <div className='container-fluid contentbody'>
41
-              <div className='loginpage__content__logo'>
42
-                <img src={logoAccueil} />
43
-              </div>
44
-
45
-              <div className='row justify-content-center'>
46
-                <div className='col-12 col-sm-11 col-md-8 col-lg-6 col-xl-5'>
47
-                  <div className='loginpage__content__connection card'>
48
-                    <div className='connection__header card-header text-center'>
49
-                      Connexion
50
-                    </div>
51
-
52
-                    <div className='card-body'>
53
-                      <form className='connection__form'>
54
-                        <div className='connection__form__groupemail form-group mb-3 mt-4'>
55
-                          <div className='connection__form__groupemail__icon'>
56
-                            <i className='fa fa-fw fa-envelope-open-o' />
57
-                          </div>
58
-                          <input type='email' className='connection__form__groupemail__input form-control' placeholder='Adresse Email' />
59
-                          <div className='connection__form__groupemail__msgerror invalid-feedback'>
60
-                            Invalid email.
61
-                          </div>
62
-                        </div>
63
-
64
-                        <div className='connection__form__groupepw form-group'>
65
-                          <div className='connection__form__groupepw__icon'>
66
-                            <i className='fa fa-fw fa-lock' />
67
-                          </div>
68
-                          <input type='password' className='connection__form__groupepw__pw form-control' id='password-co' placeholder='Mot de passe' />
69
-                          <div className='connection__form__groupepw__msgerror invalid-feedback'>
70
-                            Invalid password.
71
-                          </div>
72
-                        </div>
73
-
74
-                        <div className='row mt-4 mb-4'>
75
-                          <div className='col-12 col-sm-6 col-md-6 col-lg-6 col-xl-6'>
76
-                            <div className='connection__form__rememberme form-check'>
77
-                              <label className='connection__form__rememberme__label form-check-label'>
78
-                                <input type='checkbox' className='connection__form__rememberme__label__checkbox form-check-input' />
79
-                                Se souvenir de moi
80
-                              </label>
81
-                            </div>
82
-                          </div>
83
-
84
-                          <div className='col-12 col-sm-6 col-md-6 col-lg-6 text-sm-right'>
85
-                            <div className='connection__form__pwforgot'>
86
-                              Mot de passe oublié ?
87
-                            </div>
88
-                          </div>
89
-                        </div>
90
-
91
-                        <button type='submit' className='connection__form__btnsubmit btn btn-primary'>Connexion</button>
92
-                      </form>
93
-
94
-                    </div>
95
-                  </div>
96
-                </div>
97
-              </div>
98
-            </div>
99
-          </section>
100
-
101
-          <footer className='footer text-right'>
102
-            <div className='footer__text'>
103
-              Créer votre propre espace de travail collaboratif sur trac.im - Copyright 2013 - 2017
104
-            </div>
105
-            <img className='footer__logo' src={logoFooter} />
106
-          </footer>
107
-        </div> */}
40
+    const LoginWrapper = props => (
41
+      <div className='loginpage'>
42
+        <section className='loginpage__content'>
43
+          <div className='container-fluid contentbody'>
44
+            {props.children}
45
+          </div>
46
+        </section>
47
+      </div>
48
+    )
49
+    const LoginCardWrapper = props => (
50
+      <div className='row justify-content-center'>
51
+        <div className='col-12 col-sm-11 col-md-8 col-lg-6 col-xl-5'>
52
+          {props.children}
53
+        </div>
108 54
       </div>
109 55
     )
56
+    const LoginCardAction = props => (
57
+      <div className='row mt-4 mb-4'>
58
+        <div className='col-12 col-sm-6 col-md-6 col-lg-6 col-xl-6'>
59
+          {props.children[0]}
60
+        </div>
61
+        <div className='col-12 col-sm-6 col-md-6 col-lg-6 col-xl-6 text-sm-right'>
62
+          {props.children[1]}
63
+        </div>
64
+      </div>
65
+    )
66
+    return (
67
+      <LoginWrapper>
68
+        <LoginLogo logoSrc={LoginLogoImg} />
69
+
70
+        <LoginCardWrapper>
71
+          <Card customClass='loginpage__content__connection'>
72
+            <CardHeader customClass='connection__header text-center'>{'Connexion'}</CardHeader>
73
+
74
+            <CardBody formClass='connection__form'>
75
+              <InputGroupText
76
+                parentClassName='connection__form__groupemail'
77
+                customClass='mb-3 mt-4'
78
+                icon='fa-envelope-open-o'
79
+                type='email'
80
+                placeHolder='Adresse Email'
81
+                invalidMsg='Email invalide.'
82
+                onChange={this.handleChangeLogin}
83
+              />
84
+
85
+              <InputGroupText
86
+                parentClassName='connection__form__groupepw'
87
+                customClass=''
88
+                icon='fa-lock'
89
+                type='password'
90
+                placeHolder='Mot de passe'
91
+                invalidMsg='Mot de passe invalide.'
92
+                onChange={this.handleChangePassword}
93
+              />
94
+
95
+              <LoginCardAction>
96
+                <InputCheckbox
97
+                  parentClassName='connection__form__rememberme'
98
+                  customClass=''
99
+                  label='Se souvenir de moi'
100
+                />
101
+
102
+                <LoginBtnForgotPw
103
+                  customClass='connection__form__pwforgot'
104
+                  label='Mot de passe oublié ?'
105
+                />
106
+              </LoginCardAction>
107
+
108
+              <Button
109
+                htmlType='button'
110
+                bootstrapType='primary'
111
+                customClass='connection__form__btnsubmit'
112
+                label='Connexion'
113
+                onClick={this.handleClickSubmit}
114
+              />
115
+            </CardBody>
116
+          </Card>
117
+        </LoginCardWrapper>
118
+      </LoginWrapper>
119
+    )
110 120
   }
111 121
 }
112 122
 
113 123
 const mapStateToProps = ({ user }) => ({ user })
114 124
 export default connect(mapStateToProps)(Login)
125
+
126
+/*
127
+<form>
128
+  <div className='row mt-4 mb-4'>
129
+
130
+    <div className='col-12 col-sm-6 col-md-6 col-lg-6 col-xl-6'>
131
+      <div className='connection__form__rememberme form-check'>
132
+        <label className='connection__form__rememberme__label form-check-label'>
133
+          <input type='checkbox' className='connection__form__rememberme__label__checkbox form-check-input' />
134
+          Se souvenir de moi
135
+        </label>
136
+      </div>
137
+    </div>
138
+
139
+    <div className='col-12 col-sm-6 col-md-6 col-lg-6 text-sm-right'>
140
+      <div className='connection__form__pwforgot'>
141
+        Mot de passe oublié ?
142
+      </div>
143
+    </div>
144
+
145
+  </div>
146
+
147
+  <button type='submit' className='connection__form__btnsubmit btn btn-primary'>Connexion</button>
148
+
149
+</form>
150
+*/

+ 102 - 0
src/css/Login.styl Datei anzeigen

@@ -0,0 +1,102 @@
1
+.loginpage
2
+  &__content
3
+    position relative
4
+    min-height calc(100vh - 139px)
5
+    background dark-blue url('../img/tracimLogoAsBg.png') no-repeat 25% 3px
6
+    background-size contain
7
+    display table
8
+    width 100%
9
+    &__logo
10
+      margin 0 auto
11
+      padding 50px 0
12
+      width 170px
13
+    &__connection
14
+      border none
15
+      box-shadow shadow-right
16
+      margin-bottom 50px
17
+      .connection__header
18
+        background-color blue
19
+        color #FFF
20
+        font-size 25px
21
+    .connection__form
22
+      width 70%
23
+      margin 0 auto
24
+      &__rememberme
25
+        &__label
26
+          font-size 13px
27
+      &__groupemail
28
+        position relative
29
+        &__icon
30
+          position absolute
31
+          top 6px
32
+          left 10px
33
+          width 20px
34
+        &__input
35
+          padding-left 45px
36
+      &__groupepw
37
+        position relative
38
+        &__icon
39
+          font-size 20px
40
+          width 20px
41
+          position absolute
42
+          top 5px
43
+          left 8px
44
+        &__input
45
+          padding-left 45px
46
+      &__btnsubmit
47
+        width 150px
48
+        background-color green
49
+        border none
50
+        cursor pointer
51
+        display block
52
+        margin 0 auto
53
+        &:hover
54
+          background-color dark-green
55
+        &:focus
56
+          box-shadow shadow-all-side-green
57
+      &__pwforgot
58
+        cursor pointer
59
+        font-size 13px
60
+        margin-top 3px
61
+        &:hover::after
62
+          content ' '
63
+          position absolute
64
+          top 20px
65
+          right 15px
66
+          width 130px
67
+          padding-bottom 2px
68
+          border-bottom 1px solid dark-grey
69
+
70
+
71
+@media (min-width: min-lg) and (max-width: max-lg)
72
+  .loginpage__content
73
+    .connection__form
74
+      width 100%
75
+
76
+@media (min-width: min-md) and (max-width: max-md)
77
+  .loginpage__content
78
+    .connection__form
79
+      width 95%
80
+
81
+@media (min-width: min-sm) and (max-width: max-sm)
82
+  .loginpage__content
83
+    padding-top 69px
84
+    display block
85
+    min-height calc(100vh - 50px)
86
+    .connection__form
87
+      width 90%
88
+
89
+@media (max-width: max-xs)
90
+  .loginpage__content
91
+    padding-top 69px
92
+    min-height calc(100vh - 50px)
93
+    background-size cover
94
+    display block
95
+    &__connection
96
+      margin-top 90px
97
+    &__logo
98
+      display none
99
+    .connection__form
100
+      width 95%
101
+    .connection__form__pwforgot:hover::after
102
+      content normal

+ 9 - 3
src/css/index.styl Datei anzeigen

@@ -1,3 +1,9 @@
1
-@import "Variable"
2
-@import "Header"
3
-@import "Footer"
1
+body
2
+  font-family 'Quicksand', sans-serif
3
+
4
+@import 'Variable'
5
+
6
+@import 'Header'
7
+@import 'Footer'
8
+
9
+@import 'Login'

+ 50 - 0
src/img/logoTracimWhite.svg Datei anzeigen

@@ -0,0 +1,50 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+	 viewBox="0 0 457.5 133.5" enable-background="new 0 0 457.5 133.5" xml:space="preserve">
6
+<g id="Background">
7
+	<rect x="-149.6" y="-13.6" fill="transparent" width="800" height="600"/>
8
+</g>
9
+<g id="Logotype">
10
+	<g>
11
+		<g>
12
+			<path fill="#FFFFFF" d="M185.1,27.1v14.8h13.3v11.4h-13.3v24.3c0,3.2,0.6,5.3,1.8,6.4c1.2,1.1,2.9,1.7,5.3,1.7
13
+				c1.1,0,2.2-0.1,3.3-0.4c1.1-0.3,2.1-0.8,2.9-1.5l1.7,10.6c-1.7,1.5-3.4,2.7-5.2,3.4c-1.8,0.8-4.2,1.1-7.3,1.1
14
+				c-5.5,0-9.7-1.6-12.6-4.7c-2.8-3.1-4.3-8-4.3-14.6V53.3h-6.5V41.9h6.5v-9.1L185.1,27.1z"/>
15
+			<path fill="#FFFFFF" d="M239.2,52c-4.2,0-12,2.6-15.7,6.7v38.6h-14.3V41.9h14.3v6c3.7-4.8,10.8-7.3,15.7-7.3"/>
16
+			<path fill="#FFFFFF" d="M283.8,98.4c-4.4,0-8.9-1.5-10.8-4.6c-3.2,1.9-5.7,3.3-7.7,3.9c-1.9,0.7-3.8,1-5.6,1
17
+				c-4.4,0-8.1-1.5-11.1-4.6c-3-3-4.5-7.1-4.5-12.2c0-4.8,1.4-8.6,4.2-11.3c2.8-2.7,6.4-4.4,10.8-5.1l11.6-1.9V60
18
+				c0-2.8-0.8-4.6-2.4-5.5c-1.6-0.9-3.4-1.3-5.3-1.3c-2.4,0-4.7,0.4-7.2,1.2c-2.4,0.8-4.6,1.9-6.5,3.1l-2.3-12.2
19
+				c6.1-3.2,12.2-4.8,18.3-4.8c2.1,0,4.2,0.2,6.4,0.6c2.2,0.4,4.2,1.2,6,2.4c1.8,1.2,3.2,2.7,4.4,4.7c1.1,1.9,1.7,4.4,1.7,7.3
20
+				l0,26.1 M264.1,73c-1.9,0.3-3.5,1-4.7,2.3c-1.2,1.2-1.8,3-1.8,5.4c0,4.3,1.9,6.4,5.8,6.4c1.1,0,2.2-0.2,3.2-0.6
21
+				c1-0.4,2.4-1.1,4-2.1V71.8L264.1,73z"/>
22
+			<path fill="#FFFFFF" d="M330.4,54.6c-3.2-2.1-6.6-3.1-10.4-3.1c-4.6,0-7.8,1.5-9.8,4.5c-1.9,3-2.9,7-2.9,12.1
23
+				c0,4.8,0.9,9.1,2.7,12.7c1.8,3.6,5,5.4,9.8,5.4c1.9,0,4-0.3,6.3-0.9c2.3-0.6,4.3-1.6,5.9-3l1.9,10.2c-1.9,2.2-4.5,3.9-7.8,5.2
24
+				c-3.3,1.2-6.7,1.9-10.3,1.9c-7.1,0-12.6-2.6-16.5-7.7c-3.9-5.1-5.9-12.4-5.9-21.8c0-10,2.2-17.4,6.6-22.4
25
+				c4.4-5,10.7-7.5,18.7-7.5c5.5,0,10,1,13.5,2.9L330.4,54.6z"/>
26
+			<path fill="#FFFFFF" d="M349.5,18.9c2.5,0,4.5,0.7,5.9,2c1.5,1.3,2.2,3.4,2.2,6.1c0,2.6-0.7,4.7-2.2,6c-1.5,1.4-3.4,2.1-5.9,2.1
27
+				c-2.5,0-4.5-0.7-5.9-2.1c-1.5-1.4-2.2-3.4-2.2-6c0-2.8,0.7-4.8,2.2-6.1C345,19.5,347,18.9,349.5,18.9z M356.6,41.9v55.4h-14.3
28
+				V41.9H356.6z"/>
29
+			<path fill="#FFFFFF" d="M382.1,41.9v5.6c2.6-1.9,5.4-3.5,8.4-4.8c3-1.2,5.8-1.9,8.6-1.9c5.3,0,8.7,2.5,10.4,7.5
30
+				c2.8-1.9,5.7-3.7,8.8-5.2c3.1-1.5,6.2-2.3,9.2-2.3c3.6,0,6.4,1.1,8.3,3.4c1.9,2.3,2.9,6.1,2.9,11.3v41.7h-14.3V58.9
31
+				c0-4-1.4-6-4.2-6c-2.5,0-5.8,1.2-10,3.7v40.7h-14.1V58.9c0-4-1.5-6-4.4-6c-2.6,0-5.9,1.2-9.8,3.7v40.7h-14.3V41.9H382.1z"/>
32
+		</g>
33
+	</g>
34
+	<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M141.8,66.4c2.5,2.9,3.4,7,2,10.8c-1.4,3.9-4.7,6.6-8.6,7.4
35
+		c0,0-11.5,22.7-33.9,18.5c0,0,15.6-3.4,22.7-21.7c-3-3-4.2-7.4-2.7-11.6c1.5-4.1,5.2-6.9,9.4-7.5c-0.3-2.7-1.1-5.3-2.4-8
36
+		c-0.8-1.7-1-3.3-0.1-5c0,0,3.3-6,8.3-0.6S141.8,66.4,141.8,66.4z"/>
37
+	<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M102.7,122.6c-2.3,3.1-6.1,4.9-10.1,4.4c-4.1-0.5-7.4-3.2-9.1-6.8
38
+		c0,0-24.7-6.3-25.5-29c0,0,6.7,14.5,26.2,17.4c2.2-3.6,6.3-5.7,10.7-5.1c4.3,0.5,7.9,3.6,9.4,7.6c2.5-0.9,5-2.2,7.3-4
39
+		c1.5-1.2,3-1.7,4.8-1.2c0,0,6.6,1.9,2.4,8C114.5,119.9,102.7,122.6,102.7,122.6z"/>
40
+	<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M37.4,101.8c-3.5-1.7-5.9-5.1-6.2-9.1c-0.3-4.1,1.7-7.9,5-10.2
41
+		c0,0,1.6-25.4,23.8-30.4c0,0-13,9.3-12.3,29c3.9,1.5,6.7,5.1,7,9.6C55,95,52.7,99,49,101.2c1.3,2.3,3.1,4.5,5.3,6.4
42
+		c1.4,1.2,2.2,2.7,2,4.5c0,0-0.6,6.8-7.4,3.8C42.3,112.9,37.4,101.8,37.4,101.8z"/>
43
+	<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M37.5,38.3c0.1-3.8,2-7.5,5.6-9.5c3.6-2,7.9-1.8,11.3,0.1
44
+		c0,0,23.7-9.5,37.7,8.4c0,0-14-7.7-31.4,1.3c0.3,4.2-1.7,8.3-5.6,10.5c-3.8,2.1-8.5,1.7-12-0.6c-1.5,2.2-2.7,4.7-3.5,7.5
45
+		c-0.5,1.8-1.4,3.2-3.2,3.8c0,0-6.4,2.3-6.6-5C29.6,47.4,37.5,38.3,37.5,38.3z"/>
46
+	<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M97.6,14.3c3.5-1.6,7.7-1.4,11,1c3.3,2.4,5,6.4,4.7,10.3
47
+		c0,0,18.7,17.4,8.4,37.7c0,0,1-15.9-14.6-27.9c-3.7,2-8.2,2-11.9-0.6c-3.6-2.6-5.2-6.9-4.6-11.2c-2.6-0.4-5.4-0.4-8.3,0.1
48
+		c-1.8,0.3-3.5,0-4.8-1.3c0,0-4.9-4.8,1.8-8.1C85.9,11,97.6,14.3,97.6,14.3z"/>
49
+</g>
50
+</svg>

BIN
src/img/tracimLogoAsBg.png Datei anzeigen


+ 4 - 2
webpack.config.js Datei anzeigen

@@ -1,6 +1,7 @@
1 1
 const webpack = require('webpack')
2 2
 const path = require('path')
3 3
 const isProduction = process.env.NODE_ENV === 'production'
4
+const dashboardPlugin = require('webpack-dashboard/plugin')
4 5
 
5 6
 module.exports = {
6 7
   entry: {
@@ -70,7 +71,7 @@ module.exports = {
70 71
       test: /\.(jpg|png|svg)$/,
71 72
       loader: 'url-loader',
72 73
       options: {
73
-        limit: 25000
74
+        limit: 2000
74 75
       }
75 76
     }]
76 77
   },
@@ -82,7 +83,8 @@ module.exports = {
82 83
       new webpack.optimize.CommonsChunkPlugin({
83 84
         name: 'vendor',
84 85
         filename: 'tracim.vendor.bundle.js'
85
-      })
86
+      }),
87
+      new dashboardPlugin()
86 88
     ],
87 89
     ...(isProduction
88 90
       ? [ // production specific plugins