@@ -0,0 +1,5 @@ | |||||
{ | |||||
"presets": ["es2015", "stage-2"], | |||||
"plugins": ["transform-runtime"], | |||||
"comments": false | |||||
} |
@@ -0,0 +1,9 @@ | |||||
root = true | |||||
[*] | |||||
charset = utf-8 | |||||
indent_style = space | |||||
indent_size = 2 | |||||
end_of_line = lf | |||||
insert_final_newline = true | |||||
trim_trailing_whitespace = true |
@@ -0,0 +1,13 @@ | |||||
module.exports = { | |||||
root: true, | |||||
extends: "airbnb/base", | |||||
// required to lint *.vue files | |||||
plugins: [ | |||||
'html' | |||||
], | |||||
// add your custom rules here | |||||
'rules': { | |||||
'max-len': 0, | |||||
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 | |||||
} | |||||
} |
@@ -0,0 +1,7 @@ | |||||
.DS_Store | |||||
node_modules/ | |||||
dist/ | |||||
npm-debug.log | |||||
selenium-debug.log | |||||
test/unit/coverage | |||||
test/e2e/reports |
@@ -0,0 +1,27 @@ | |||||
# lesspass | |||||
> open source password manager | |||||
## Build Setup | |||||
``` bash | |||||
# install dependencies | |||||
npm install | |||||
# serve with hot reload at localhost:8080 | |||||
npm run dev | |||||
# build for production with minification | |||||
npm run build | |||||
# run unit tests | |||||
npm run unit | |||||
# run e2e tests | |||||
npm run e2e | |||||
# run all tests | |||||
npm test | |||||
``` | |||||
For detailed explanation on how things work, checkout the [guide](https://github.com/vuejs-templates/webpack#vue-webpack-boilerplate) and [docs for vue-loader](http://vuejs.github.io/vue-loader). |
@@ -1,28 +0,0 @@ | |||||
<style> | |||||
body { | |||||
background-color: #f7f7f7; | |||||
color: #1a1a1a; | |||||
} | |||||
.form-control, .btn, .input-group-addon { | |||||
border-radius: 0 !important; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="app"> | |||||
<lesspass-header></lesspass-header> | |||||
<router-view></router-view> | |||||
</div> | |||||
</template> | |||||
<script> | |||||
import LesspassHeader from './header/header.vue'; | |||||
export default { | |||||
data: function () { | |||||
return {} | |||||
}, | |||||
components: { | |||||
LesspassHeader | |||||
} | |||||
} | |||||
</script> |
@@ -1,33 +0,0 @@ | |||||
<style> | |||||
#header { | |||||
background-color: #1a1a1a; | |||||
height: 38px; | |||||
color: #ffffff; | |||||
} | |||||
#header .nav-link { | |||||
padding-left: 1em; | |||||
padding-right: 1em; | |||||
color: inherit; | |||||
} | |||||
#header .nav-link { | |||||
line-height: 38px; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="header"> | |||||
<div class="container"> | |||||
<nav class="nav nav-inline pull-right"> | |||||
<a class="nav-link" v-bind:class="{ 'bg-primary': $route.path=='/login/'}" | |||||
v-link="{ path: '/login/' }"> | |||||
<i class="fa fa-lock"></i> {{ $t('login.login') }} | |||||
</a> | |||||
<a class="nav-link" v-bind:class="{ 'bg-primary': $route.path=='/register/' || $route.path=='/presentation/'}" | |||||
v-link="{ path: '/register/' }"> | |||||
<i class="fa fa-user-plus"></i> {{ $t('login.register') }} | |||||
</a> | |||||
</nav> | |||||
</div> | |||||
</div> | |||||
</template> |
@@ -1,77 +0,0 @@ | |||||
<style> | |||||
#features { | |||||
background-color: #025aa5; | |||||
color: #f2f2f2; | |||||
} | |||||
#features a { | |||||
color: inherit; | |||||
text-decoration: underline; | |||||
} | |||||
#features .container { | |||||
position: relative; | |||||
padding-top: 20vh; | |||||
padding-bottom: 20vh; | |||||
} | |||||
#features .features__card { | |||||
background-color: transparent; | |||||
border: none; | |||||
/*color: #1B2529;*/ | |||||
border-radius: 0 !important; | |||||
} | |||||
#features .features__card img { | |||||
height: 120px; | |||||
} | |||||
@media (min-width: 768px) { | |||||
#features .features__card { | |||||
width: 25% | |||||
} | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="features"> | |||||
<div class="container"> | |||||
<div class="row text-xs-center"> | |||||
<div class="card-deck-wrapper"> | |||||
<div class="card-deck"> | |||||
<div class="card features__card p-t-2"> | |||||
<img class="card-img-top" src="./responsive.png" alt="Card image cap"> | |||||
<div class="card-block"> | |||||
<h4 class="card-title">{{{ $t('features.responsive_title') }}}</h4> | |||||
<p class="card-text">{{{ $t('features.responsive') }}}</p> | |||||
</div> | |||||
</div> | |||||
<div class="card features__card p-t-2"> | |||||
<img class="card-img-top" src="./no-cloud.png" alt="Card image cap"> | |||||
<div class="card-block"> | |||||
<h4 class="card-title">{{{ $t('features.no_cloud_title') }}}</h4> | |||||
<p class="card-text">{{{ $t('features.no_cloud') }}}</p> | |||||
</div> | |||||
</div> | |||||
<div class="card features__card p-t-2"> | |||||
<img class="card-img-top" src="./open-source.png" alt="Card image cap"> | |||||
<div class="card-block"> | |||||
<h4 class="card-title">{{{ $t('features.open_source_title') }}}</h4> | |||||
<p class="card-text">{{{ $t('features.open_source') }}}</p> | |||||
</div> | |||||
</div> | |||||
<div class="card features__card p-t-2"> | |||||
<img class="card-img-top" src="./free.png" alt="Card image cap"> | |||||
<div class="card-block"> | |||||
<h4 class="card-title">{{{ $t('features.free_title') }}}</h4> | |||||
<p class="card-text">{{{ $t('features.free') }}}</p> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</template> |
@@ -1,25 +0,0 @@ | |||||
<style> | |||||
#footer { | |||||
background-color: #202020; | |||||
color: #f2f2f2; | |||||
font-size: 0.8em; | |||||
} | |||||
#footer a{ | |||||
color: inherit; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="footer" class="text-xs-center"> | |||||
<div class="container"> | |||||
<div class="row p-t-3 p-b-1"> | |||||
<div class="col-lg-12 p-t-3 p-b-1 text-xs-right"> | |||||
<p> | |||||
© LessPass | |||||
- {{ $t('footer.created_by') }} <a href="mailto:guillaume@oslab.fr">Guillaume Vincent</a> | |||||
</p> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</template> |
@@ -1,56 +0,0 @@ | |||||
<style> | |||||
#hero { | |||||
background-color: #f7f7f7; | |||||
color: #323232; | |||||
} | |||||
#hero a { | |||||
color: inherit; | |||||
} | |||||
#hero #hero__title { | |||||
text-transform: uppercase; | |||||
font-size: 2.1rem; | |||||
padding-top: .70rem; | |||||
} | |||||
@media (min-width: 480px) { | |||||
#hero .hero__headlines { | |||||
padding-top: 12vh; | |||||
padding-bottom: 17vh; | |||||
} | |||||
#hero #hero__title { | |||||
font-size: 2.5rem; | |||||
} | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="hero"> | |||||
<div class="container"> | |||||
<div class="row hero__headlines"> | |||||
<div class="col-md-6"> | |||||
<h1 id="hero__title">{{{ $t('headlines.title') }}}</h1> | |||||
<p class="lead hidden-xs-down"> | |||||
<b>LessPass</b> {{ $t('headlines.subtitle') }} | |||||
</p> | |||||
</div> | |||||
<div class="col-md-6 col-lg-5 col-lg-offset-1"> | |||||
<password-generator></password-generator> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</template> | |||||
<script> | |||||
import PasswordGenerator from '../password-generator/password-generator.vue'; | |||||
export default { | |||||
data: function () { | |||||
return {} | |||||
}, | |||||
components: { | |||||
PasswordGenerator | |||||
} | |||||
} | |||||
</script> |
@@ -1,59 +0,0 @@ | |||||
<style> | |||||
#how-it-works { | |||||
background-color: #134a6a; | |||||
color: #f2f2f2; | |||||
} | |||||
#how-it-works #how-it-works__self_hosted { | |||||
background-color: #f7f7f7; | |||||
padding: 1em; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="how-it-works"> | |||||
<div class="container"> | |||||
<div class="row p-y-3"> | |||||
<div class="col-lg-8"> | |||||
<h3>{{ $t('how_it_works.title') }}</h3> | |||||
<p> | |||||
{{ $t('how_it_works.detail') }} | |||||
</p> | |||||
</div> | |||||
</div> | |||||
<div class="row p-y-3"> | |||||
<div class="col-lg-6 p-y-2"> | |||||
<h5>{{ $t('how_it_works.always_sync') }}</h5> | |||||
<p> | |||||
{{ $t('how_it_works.always_sync_detail') }} | |||||
</p> | |||||
</div> | |||||
<div class="col-lg-6"> | |||||
<img src="./responsive.png" alt="logo" class="img-fluid"> | |||||
</div> | |||||
</div> | |||||
<div class="row p-y-3"> | |||||
<div class="col-lg-3 col-lg-offset-2 text-xs-center col-md-4 col-md-offset-1"> | |||||
<img src="./logo.png" alt="logo" class="img-fluid"> | |||||
</div> | |||||
<div class="col-lg-6 p-y-2 col-md-6 col-md-offset-1"> | |||||
<h5>{{ $t('how_it_works.derivation') }}</h5> | |||||
<p> | |||||
{{ $t('how_it_works.derivation_detail') }} | |||||
</p> | |||||
</div> | |||||
</div> | |||||
<div class="row p-y-3"> | |||||
<div class="col-lg-6 col-md-10"> | |||||
<h5>{{ $t('how_it_works.self_hosting') }}</h5> | |||||
<p> | |||||
{{ $t('how_it_works.self_hosting_detail') }} | |||||
</p> | |||||
<pre id="how-it-works__self_hosted"><code>git clone https://github.com/lesspass/lesspass | |||||
cd lesspass | |||||
docker-compose up -d</code></pre> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</template> |
@@ -1,32 +0,0 @@ | |||||
<template> | |||||
<div id="app"> | |||||
<lesspass-navbar></lesspass-navbar> | |||||
<lesspass-hero></lesspass-hero> | |||||
<lesspass-features></lesspass-features> | |||||
<lesspass-testimonials></lesspass-testimonials> | |||||
<lesspass-howitworks></lesspass-howitworks> | |||||
<lesspass-footer></lesspass-footer> | |||||
</div> | |||||
</template> | |||||
<script> | |||||
import LesspassNavbar from './navbar/navbar.vue'; | |||||
import LesspassHero from './hero/hero.vue'; | |||||
import LesspassFeatures from './features/features.vue'; | |||||
import LesspassHowitworks from './howitworks/howitworks.vue'; | |||||
import LesspassTestimonials from './testimonials/testimonials.vue'; | |||||
import LesspassFooter from './footer/footer.vue'; | |||||
export default { | |||||
data: function () { | |||||
return {} | |||||
}, | |||||
components: { | |||||
LesspassNavbar, | |||||
LesspassHero, | |||||
LesspassFeatures, | |||||
LesspassHowitworks, | |||||
LesspassTestimonials, | |||||
LesspassFooter | |||||
} | |||||
} | |||||
</script> |
@@ -1,30 +0,0 @@ | |||||
<style> | |||||
#navbar { | |||||
background-color: #f7f7f7; | |||||
color: #1a1a1a; | |||||
padding-top: 1em; | |||||
} | |||||
#navbar #navbar__logo { | |||||
height: 32px; | |||||
} | |||||
#navbar .navbar { | |||||
padding: 1em 0; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="navbar"> | |||||
<div class="container"> | |||||
<nav class="navbar"> | |||||
<ul class="nav navbar-nav"> | |||||
<li class="nav-item"> | |||||
<a href="https://lesspass.com/"> | |||||
<img id="navbar__logo" src="./logo.png" alt="logo"> | |||||
</a> | |||||
</li> | |||||
</ul> | |||||
</nav> | |||||
</div> | |||||
</div> | |||||
</template> |
@@ -1,213 +0,0 @@ | |||||
<style> | |||||
#password-generator .c-input { | |||||
color: inherit; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="password-generator"> | |||||
<form> | |||||
<div class="form-group row"> | |||||
<div class="col-lg-6 m-t-1"> | |||||
<label for="pg-email" class="sr-only"> | |||||
{{ $t('passwordgenerator.who_are_you') }} | |||||
</label> | |||||
<input id="pg-email" | |||||
class="form-control" | |||||
type="text" | |||||
placeholder="{{ $t('passwordgenerator.who_are_you') }}" | |||||
value="{{email}}" | |||||
v-model="email" | |||||
v-on:blur="updateMasterPassword"> | |||||
</div> | |||||
<div class="col-lg-6 m-t-1"> | |||||
<label for="pg-masterpassword" class="sr-only"> | |||||
{{ $t('passwordgenerator.what_is_your_secret') }} | |||||
</label> | |||||
<div class="input-group"> | |||||
<input id="pg-masterpassword" | |||||
class="form-control" | |||||
type="password" | |||||
placeholder="{{ $t('passwordgenerator.what_is_your_secret') }}" | |||||
v-model="password" | |||||
v-on:blur="updateMasterPassword"> | |||||
<span class="input-group-btn" @click="changeType('pg-masterpassword')"> | |||||
<button class="btn btn-secondary" type="button"><i class="fa fa-eye"></i></button> | |||||
</span> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="form-group row"> | |||||
<div class="col-lg-12"> | |||||
<label for="pg-site" class="sr-only"> | |||||
{{ $t('passwordgenerator.where_are_you_going') }} | |||||
</label> | |||||
<input id="pg-site" | |||||
class="form-control" | |||||
type="text" | |||||
placeholder="{{ $t('passwordgenerator.where_are_you_going') }}" | |||||
v-model="site"> | |||||
</div> | |||||
</div> | |||||
<div class="form-group row"> | |||||
<div class="col-lg-12"> | |||||
<label for="generatedPassword" class="sr-only"> | |||||
{{ $t('passwordgenerator.generated_password') }} | |||||
</label> | |||||
<div class="input-group"> | |||||
<input type="text" id="generatedPassword" class="form-control hint--bottom" | |||||
v-model="generatedPassword" | |||||
v-bind:disabled="!generatedPassword"> | |||||
<span class="input-group-btn"> | |||||
<button id="copyBtn" data-clipboard-target="#generatedPassword" | |||||
class="btn btn-primary" type="button"> | |||||
{{ $t('passwordgenerator.copy') }} | |||||
</button> | |||||
</span> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="form-group row"> | |||||
<div class="col-lg-12"> | |||||
<a data-toggle="collapse" data-parent="#accordion" href="#advancedOptions" | |||||
aria-expanded="true" aria-controls="advancedOptions"> | |||||
<i class="fa fa-cog"></i> {{ $t('passwordgenerator.advanced_options') }} | |||||
</a> | |||||
<div id="advancedOptions" class="panel-collapse collapse m-t-1" role="tabpanel" | |||||
aria-labelledby="advancedOptions"> | |||||
<div class="row"> | |||||
<div class="col-lg-5"> | |||||
<label class="c-input c-checkbox"> | |||||
<input type="checkbox" id="lowercase" value="lowercase" | |||||
v-model="passwordInfo.settings" checked> | |||||
<span class="c-indicator"></span> | |||||
{{ $t('passwordgenerator.lowercase_options') }} | |||||
</label> | |||||
</div> | |||||
<div class="col-lg-7"> | |||||
<label class="c-input c-checkbox"> | |||||
<input type="checkbox" id="uppercase" value="uppercase" | |||||
v-model="passwordInfo.settings" checked> | |||||
<span class="c-indicator"></span> | |||||
{{ $t('passwordgenerator.uppercase_options') }} | |||||
</label> | |||||
</div> | |||||
</div> | |||||
<div class="row"> | |||||
<div class="col-lg-5"> | |||||
<label class="c-input c-checkbox"> | |||||
<input type="checkbox" id="numbers" value="numbers" | |||||
v-model="passwordInfo.settings" | |||||
checked> | |||||
<span class="c-indicator"></span> | |||||
{{ $t('passwordgenerator.numbers_options') }} | |||||
</label> | |||||
</div> | |||||
<div class="col-lg-7"> | |||||
<label class="c-input c-checkbox"> | |||||
<input type="checkbox" id="symbols" value="symbols" | |||||
v-model="passwordInfo.settings" | |||||
checked> | |||||
<span class="c-indicator"></span> | |||||
{{ $t('passwordgenerator.symbols_options') }} | |||||
</label> | |||||
</div> | |||||
</div> | |||||
<div class="row m-t-1"> | |||||
<div class="col-lg-4 m-b-1"> | |||||
<label for="passwordLength" class="sr-only"> | |||||
{{ $t('passwordgenerator.length') }} | |||||
</label> | |||||
<div class="input-group input-group-sm"> | |||||
<span class="input-group-addon" id="passwordLengthAddon"> | |||||
{{ $t('passwordgenerator.length') }} | |||||
</span> | |||||
<input type="number" class="form-control" id="passwordLength" | |||||
aria-describedby="passwordLengthAddon" v-model="passwordInfo.length" | |||||
value="12" min="6" max="64"> | |||||
</div> | |||||
</div> | |||||
<div class="col-lg-4 m-b-1"> | |||||
<label for="passwordCounter" class="sr-only"> | |||||
{{ $t('passwordgenerator.counter') }} | |||||
</label> | |||||
<div class="input-group input-group-sm"> | |||||
<span class="input-group-addon" id="passwordCounterAddon"> | |||||
{{ $t('passwordgenerator.counter') }} | |||||
</span> | |||||
<input type="number" class="form-control" id="passwordCounter" | |||||
aria-describedby="passwordCounterAddon" | |||||
v-model="passwordInfo.counter" | |||||
value="1" min="1" max="100"> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</form> | |||||
</div> | |||||
</template> | |||||
<script> | |||||
import lesspass from 'lesspass' | |||||
import Clipboard from 'clipboard'; | |||||
export default { | |||||
data: function () { | |||||
return { | |||||
email: '', | |||||
password: '', | |||||
site: '', | |||||
passwordInfo: { | |||||
counter: 1, | |||||
length: 12, | |||||
settings: ["lowercase", "uppercase", "numbers", "symbols"] | |||||
}, | |||||
masterPassword: '' | |||||
} | |||||
}, | |||||
methods: { | |||||
updateMasterPassword: function (event) { | |||||
var self = this; | |||||
var email = this.email; | |||||
var password = this.password; | |||||
if (email && password) { | |||||
lesspass.createMasterPassword(email, password).then(function (masterPassword) { | |||||
self.$set('masterPassword', masterPassword); | |||||
console.log(masterPassword); | |||||
}); | |||||
} | |||||
}, | |||||
changeType: function (id) { | |||||
if (document.getElementById(id).type == 'password') { | |||||
document.getElementById(id).type = 'text' | |||||
} else { | |||||
document.getElementById(id).type = 'password' | |||||
} | |||||
} | |||||
}, | |||||
computed: { | |||||
generatedPassword: function () { | |||||
var masterPassword = this.masterPassword; | |||||
var site = this.site; | |||||
if (masterPassword && site) { | |||||
var entry = { | |||||
site: site, | |||||
password: this.passwordInfo | |||||
}; | |||||
return lesspass.createPassword(masterPassword, entry); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
var cb = new Clipboard('#copyBtn'); | |||||
cb.on('success', function (e) { | |||||
e.clearSelection(); | |||||
}); | |||||
cb.on('error', function (e) { | |||||
}); | |||||
</script> |
@@ -1,89 +0,0 @@ | |||||
<style> | |||||
#testimonials { | |||||
background-color: #202020; | |||||
color: #f2f2f2; | |||||
} | |||||
#testimonials .thumbnail { | |||||
width: 42px; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="testimonials"> | |||||
<div class="container p-y-3"> | |||||
<div class="row m-y-3"> | |||||
<div class="col-lg-10 col-lg-offset-1"> | |||||
<div class="media"> | |||||
<a class="media-left" href="#"> | |||||
<img src="./el.jpg" alt="Edouard Lopez" class="img-circle thumbnail"> | |||||
</a> | |||||
<div class="media-body"> | |||||
<h5 class="media-heading">{{{ $t('feedback.feedback_1') }}}</h5> | |||||
<p>{{{ $t('feedback.feedback_1_author') }}}</p> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="row m-y-3"> | |||||
<div class="col-lg-10 col-lg-offset-1"> | |||||
<div class="media"> | |||||
<div class="media-body text-xs-right"> | |||||
<h5 class="media-heading">{{{ $t('feedback.feedback_2') }}}</h5> | |||||
<p>{{{ $t('feedback.feedback_2_author') }}}</p> | |||||
</div> | |||||
<a class="media-right" href="#"> | |||||
<img src="./gv.jpg" alt="guillaume vincent" class="img-circle thumbnail"> | |||||
</a> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</template> | |||||
<!-- | |||||
<style> | |||||
.lesspass-feedback { | |||||
background-color: #252830; | |||||
color: #D3D8E8; | |||||
} | |||||
.lesspass-feedback .thumbnail { | |||||
width: 42px; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div class="lesspass-feedback p-y-3"> | |||||
<div class="container"> | |||||
<div class="row"> | |||||
<div class="col-lg-8 col-lg-offset-2"> | |||||
<blockquote class="blockquote m-b-3"> | |||||
<p class="m-b-0"> | |||||
<img src="../assets/images/el.jpg" alt="Edouard Lopez" class="img-circle thumbnail"> | |||||
{{{ $t('feedback.feedback_1') }}} | |||||
</p> | |||||
<footer class="blockquote-footer">{{{ $t('feedback.feedback_1_author') }}}</footer> | |||||
</blockquote> | |||||
<blockquote class="blockquote m-y-3 blockquote-reverse"> | |||||
<p class="m-b-0"> | |||||
{{{ $t('feedback.feedback_2') }}} | |||||
<img src="../assets/images/gv.jpg" alt="guillaume vincent" class="img-circle thumbnail"> | |||||
</p> | |||||
<footer class="blockquote-footer">{{{ $t('feedback.feedback_2_author') }}}</footer> | |||||
</blockquote> | |||||
<blockquote class="blockquote"> | |||||
<p class="m-b-0"> | |||||
<!–<img src="" alt="..." class="img-circle thumbnail">–> | |||||
{{{ $t('feedback.what_do_you_think') }}} | |||||
</p> | |||||
<footer class="blockquote-footer"> | |||||
<a href="mailto:contact@oslab.fr">{{{ $t('feedback.send_us_email') }}}</a> | |||||
</footer> | |||||
</blockquote> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</template>--> |
@@ -1,31 +0,0 @@ | |||||
<template> | |||||
<div class="container"> | |||||
<div class="row m-y-3"> | |||||
<div class="col-lg-12"> | |||||
<form> | |||||
<input class="form-control" id="search-input" placeholder="Search..." autocomplete="off" | |||||
type="text"> | |||||
<div class="dropdown-menu bd-search-results" id="search-results"></div> | |||||
</form> | |||||
</div> | |||||
</div> | |||||
<div class="row"> | |||||
<div class="col-lg-12"> | |||||
<ol> | |||||
<li v-for="entry in entries"> | |||||
{{ entry.title }} | |||||
</li> | |||||
</ol> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</template> | |||||
<script> | |||||
export default { | |||||
data: function () { | |||||
return { | |||||
entries: [] | |||||
} | |||||
} | |||||
} |
@@ -1,59 +0,0 @@ | |||||
<style> | |||||
#login{ | |||||
padding-top: 2rem; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="login"> | |||||
<div class="container"> | |||||
<div class="row"> | |||||
<div class="col-md-6 col-md-offset-3 col-lg-4 col-lg-offset-4"> | |||||
<form> | |||||
<fieldset class="form-group"> | |||||
<label class="sr-only" for="email">{{$t('login.Email')}}</label> | |||||
<input type="email" class="form-control form-control-sm" id="email" | |||||
placeholder="{{$t('login.Email')}}" | |||||
v-model="credentials.email"> | |||||
</fieldset> | |||||
<fieldset class="form-group"> | |||||
<label class="sr-only" for="password">{{$t('login.Password')}}</label> | |||||
<input type="password" class="form-control form-control-sm" id="password" | |||||
placeholder="{{$t('login.Password')}}" | |||||
v-model="credentials.password"> | |||||
</fieldset> | |||||
<button type="submit" class="btn btn-primary btn-sm btn-block" @click="signin()"> | |||||
{{$t('login.Sign_in')}} | |||||
</button> | |||||
</form> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</template> | |||||
<script> | |||||
import auth from '../services/auth.js'; | |||||
import router from '../routes.js'; | |||||
export default { | |||||
data: function () { | |||||
return { | |||||
user: auth.user, | |||||
credentials: { | |||||
email: '', | |||||
password: '' | |||||
} | |||||
} | |||||
}, | |||||
methods: { | |||||
signin() { | |||||
var credentials = { | |||||
email: this.credentials.email, | |||||
password: this.credentials.password | |||||
}; | |||||
auth.login(this, credentials, function () { | |||||
router.go('/'); | |||||
}); | |||||
} | |||||
} | |||||
} | |||||
</script> |
@@ -1,34 +0,0 @@ | |||||
<template> | |||||
<div id="login"> | |||||
<div class="container"> | |||||
{{$t('register.beta')}} | |||||
</div> | |||||
</div> | |||||
</template> | |||||
<script> | |||||
import auth from '../services/auth.js'; | |||||
import router from '../routes.js'; | |||||
export default { | |||||
data: function () { | |||||
return { | |||||
user: auth.user, | |||||
credentials: { | |||||
email: '', | |||||
password: '' | |||||
} | |||||
} | |||||
}, | |||||
methods: { | |||||
register() { | |||||
var credentials = { | |||||
email: this.credentials.email, | |||||
password: this.credentials.password | |||||
}; | |||||
auth.register(this, credentials, function () { | |||||
router.go('/login/'); | |||||
}) | |||||
} | |||||
} | |||||
} | |||||
</script> |
@@ -1,123 +0,0 @@ | |||||
var I18n = require('vue-i18n'); | |||||
var Vue = require('vue'); | |||||
const locales = { | |||||
"en": { | |||||
"lang": "en", | |||||
"headlines": { | |||||
"title": "Open Source<br>Password Manager", | |||||
"subtitle": "replaces all your tools that record your passwords as LastPass, 1Password, Keepass, Excel spreadsheet, post it, etc ..." | |||||
}, | |||||
"footer": { | |||||
"created_by": "created by" | |||||
}, | |||||
"passwordgenerator": { | |||||
"who_are_you": "Email / Username", | |||||
"what_is_your_secret": "Password", | |||||
"where_are_you_going": "Site (e.g. twitter.com)", | |||||
"copy": "Copy", | |||||
"advanced_options": "Advanced options", | |||||
"lowercase_options": "lowercase (a-z)", | |||||
"uppercase_options": "UPPERCASE (A-Z)", | |||||
"numbers_options": "numbers (0-9)", | |||||
"symbols_options": "symbols (@&%?)", | |||||
"counter": "Counter", | |||||
"generated_password": "Generated password", | |||||
"length": "Length" | |||||
}, | |||||
"features": { | |||||
"no_cloud_title": "No storage", | |||||
"responsive_title": "Available everywhere", | |||||
"open_source_title": "Open Source", | |||||
"free_title": "Free", | |||||
"no_cloud": "LessPass regenerates your passwords when you need them. No cloud storage is required", | |||||
"responsive": "LessPass is a web application and works on all devices (computer, smartphone, tablet and your smartTV)", | |||||
"open_source": "LessPass is <strong>open-source</strong>. So its security can be audited. Source code is available on <a href='https://github.com/lesspass/core'>Github</a>", | |||||
"free": "LessPass is free<br>and always will be" | |||||
}, | |||||
"how_it_works": { | |||||
"title": "How LessPass works ?", | |||||
"detail": "LessPass is a password manager that guarantees you to generate the same password on the basis of unique information you provide. You can use LessPass to create passwords for various internet services (social networks , email, server passwords , ...).", | |||||
"always_sync": "No synchronisation", | |||||
"always_sync_detail": "LessPass don’t need any cloud storage. It’s a webapp, with some Javascript, that derive your password in a secure way.", | |||||
"derivation": "Math and Crypto", | |||||
"derivation_detail": "LessPass use different key derivation functions to transform your personal information into an unique password. These transformations are robust against brute force attacks.", | |||||
"self_hosting": "Self hosted ", | |||||
"self_hosting_detail": "LessPass can be hosted on your server :" | |||||
}, | |||||
"feedback": { | |||||
"feedback_1": "Finally a security tool that I did not need to trust.", | |||||
"feedback_1_author": "Édouard Lopez, LessPass Team Member", | |||||
"feedback_2": "I no longer need a personal cloud to manage my passwords.<br>One secret and I have access to my passwords everywhere.", | |||||
"feedback_2_author": "Guillaume Vincent, LessPass Founder" | |||||
}, | |||||
"login": { | |||||
"login": "Login", | |||||
"register": "Register" | |||||
} | |||||
}, | |||||
"fr": { | |||||
"lang": "fr", | |||||
"headlines": { | |||||
"title": "Gestionnaire de mot de passe open source", | |||||
"subtitle": "remplace tous vos outils qui sauvegardent vos mots de passe comme Lastpass, 1password, Keepass, tableur Excel, post it, etc..." | |||||
}, | |||||
"footer": { | |||||
"created_by": "créé par" | |||||
}, | |||||
"passwordgenerator": { | |||||
"who_are_you": "Email / Nom d'utilisateur", | |||||
"what_is_your_secret": "Mot de passe", | |||||
"where_are_you_going": "Site (ex: twitter.com)", | |||||
"copy": "Copier", | |||||
"advanced_options": "Options avancées", | |||||
"lowercase_options": "minuscules (a-z)", | |||||
"uppercase_options": "MAJUSCULES (A-Z)", | |||||
"numbers_options": "nombres (0-9)", | |||||
"symbols_options": "caractères spéciaux (@&%?)", | |||||
"counter": "Version", | |||||
"generated_password": "Mot de passe généré", | |||||
"length": "Longueur" | |||||
}, | |||||
"features": { | |||||
"no_cloud_title": "Pas de stockage", | |||||
"responsive_title": "Disponible partout", | |||||
"open_source_title": "Open Source", | |||||
"free_title": "Gratuit", | |||||
"no_cloud": "LessPass régénère vos mots de passe à chaque fois que vous en avez besoin.<br>Aucun stockage sur le cloud n'est nécessaire", | |||||
"responsive": "LessPass est une application web qui fonctionne<br>sur tous les appareils :<br>ordinateur, smartphone, tablette et smartTV", | |||||
"open_source": "LessPass est open source. Le code source est disponible sur <a href='https://github.com/lesspass/core'>Github</a>, vous pouvez l'auditer", | |||||
"free": "LessPass est gratuit et le sera toujours" | |||||
}, | |||||
"how_it_works": { | |||||
"title": "Comment fonctionne LessPass ?", | |||||
"detail": "LessPass est un gestionnaire de mot de passe qui n'enregistre pas vos mots de passe. Il les regénère sur la base d'informations uniques que vous lui fournissez. Vous pouvez donc utiliser LessPass pour créer des mots de passe pour vos différents services internet (Réseaux sociaux, mails, mots de passe serveurs, ...).", | |||||
"always_sync": "Pas besoin de synchronisation", | |||||
"always_sync_detail": "Vous n'avez plus besoin de synchroniser sur le cloud vos coffres fort pour mots de passe. LessPass est une application web qui dérive vos mots de passe de manière sécurisée.", | |||||
"derivation": "Mathématique et chiffrement", | |||||
"derivation_detail": "LastPass utilise différentes fonctions de dérivation pour transformer vos informations personnelles en un mot de passe unique. Ces transformations sont robustes aux attaques par force brute.", | |||||
"self_hosting": "Auto Hébergement", | |||||
"self_hosting_detail": "Vous pouvez héberger LessPass sur vos serveurs :" | |||||
}, | |||||
"feedback": { | |||||
"feedback_1": "Enfin un outil de sécurité a qui je n'ai pas besoin de faire confiance.", | |||||
"feedback_1_author": "Édouard Lopez,<br> membre de l'équipe de LessPass", | |||||
"feedback_2": "Je n'ai plus besoin d'un cloud personnel pour gérer mes mots de passe.<br> Une seule phrase secrete et j'ai accès à mes mots de passe partout.", | |||||
"feedback_2_author": "Guillaume Vincent,<br> créateur de LessPass" | |||||
}, | |||||
"login": { | |||||
"login": "Connexion", | |||||
"register": "Inscription" | |||||
} | |||||
} | |||||
}; | |||||
var browserLanguage = (navigator.language || navigator.browserLanguage).split('-')[0]; | |||||
var lang = browserLanguage in locales ? browserLanguage : 'en'; | |||||
Vue.use(I18n, { | |||||
lang: lang, | |||||
locales: locales | |||||
}); | |||||
module.exports = locales; |
@@ -1,10 +0,0 @@ | |||||
import 'bootstrap/dist/css/bootstrap.css'; | |||||
import 'font-awesome/css/font-awesome.min.css'; | |||||
import 'bootstrap/dist/js/umd/collapse.js'; | |||||
import Vue from 'vue'; | |||||
import Resource from 'vue-resource'; | |||||
Vue.use(Resource); | |||||
import './locales'; | |||||
import './routes' |
@@ -1,48 +0,0 @@ | |||||
import Vue from 'vue'; | |||||
import Router from 'vue-router'; | |||||
import App from './app.vue'; | |||||
import LandingPage from './landing-page/index.vue'; | |||||
import LessPassConnected from './lesspass/index.vue'; | |||||
import LoginPage from './lesspass/login.vue'; | |||||
import RegisterPage from './lesspass/register.vue'; | |||||
Vue.use(Router); | |||||
var router = new Router(); | |||||
router.map({ | |||||
'/': { | |||||
auth: true, | |||||
component: LessPassConnected | |||||
}, | |||||
'/presentation/': { | |||||
component: LandingPage | |||||
}, | |||||
'/login/': { | |||||
component: LoginPage | |||||
}, | |||||
'/register/': { | |||||
component: RegisterPage | |||||
} | |||||
}); | |||||
router.redirect({ | |||||
'*': '/' | |||||
}); | |||||
router.start(App, '#app'); | |||||
var Auth = require('./services/auth.js'); | |||||
Auth.checkAuth(); | |||||
router.beforeEach(function (transition) { | |||||
if (transition.to.auth && !Auth.user.authenticated) { | |||||
transition.redirect('/presentation/') | |||||
} else { | |||||
transition.next() | |||||
} | |||||
}); | |||||
module.exports = router; |
@@ -1,56 +0,0 @@ | |||||
import logging from './logging.js'; | |||||
module.exports = { | |||||
user: { | |||||
authenticated: false | |||||
}, | |||||
login(context, credentials, callback) { | |||||
var self = this; | |||||
context.$http.post('/api/sessions/', credentials).then( | |||||
function (response) { | |||||
localStorage.setItem('token', response.data.token); | |||||
self.user.authenticated = true; | |||||
logging.success(this.$t('login.welcome')); | |||||
if (callback) { | |||||
callback(); | |||||
} | |||||
}, | |||||
function () { | |||||
logging.error(this.$t('login.credentials_invalids')); | |||||
} | |||||
); | |||||
}, | |||||
register(context, user, callback) { | |||||
context.$http.post('/api/users/', user).then( | |||||
function (response) { | |||||
if (callback) { | |||||
callback(); | |||||
} | |||||
}, | |||||
function (error) { | |||||
logging.warning(this.$t('register.beta')); | |||||
} | |||||
); | |||||
}, | |||||
logout(callback) { | |||||
localStorage.removeItem('token'); | |||||
this.user.authenticated = false; | |||||
if (callback) { | |||||
callback(); | |||||
} | |||||
}, | |||||
checkAuth() { | |||||
var jwt = localStorage.getItem('token'); | |||||
this.user.authenticated = !!jwt; | |||||
}, | |||||
getAuthHeader() { | |||||
return { | |||||
'Authorization': 'Bearer ' + localStorage.getItem('token') | |||||
} | |||||
} | |||||
}; |
@@ -1,35 +0,0 @@ | |||||
import toastr from 'toastr'; | |||||
import 'toastr/build/toastr.min.css'; | |||||
toastr.options = { | |||||
"closeButton": true, | |||||
"debug": false, | |||||
"newestOnTop": true, | |||||
"progressBar": false, | |||||
"positionClass": "toast-top-center", | |||||
"preventDuplicates": false, | |||||
"onclick": null, | |||||
"showDuration": "300", | |||||
"hideDuration": "1000", | |||||
"timeOut": "10000", | |||||
"extendedTimeOut": "1000", | |||||
"showEasing": "swing", | |||||
"hideEasing": "linear", | |||||
"showMethod": "fadeIn", | |||||
"hideMethod": "fadeOut" | |||||
}; | |||||
module.exports = { | |||||
error(message){ | |||||
toastr.error(message); | |||||
}, | |||||
success(message){ | |||||
toastr.success(message); | |||||
}, | |||||
warning(message){ | |||||
toastr.warning(message); | |||||
}, | |||||
clear(){ | |||||
toastr.clear(); | |||||
} | |||||
}; |
@@ -1,12 +1,12 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<browserconfig> | |||||
<msapplication> | |||||
<tile> | |||||
<square70x70logo src="/mstile-70x70.png"/> | |||||
<square150x150logo src="/mstile-150x150.png"/> | |||||
<square310x310logo src="/mstile-310x310.png"/> | |||||
<wide310x150logo src="/mstile-310x150.png"/> | |||||
<TileColor>#da532c</TileColor> | |||||
</tile> | |||||
</msapplication> | |||||
</browserconfig> | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<browserconfig> | |||||
<msapplication> | |||||
<tile> | |||||
<square70x70logo src="/mstile-70x70.png"/> | |||||
<square150x150logo src="/mstile-150x150.png"/> | |||||
<square310x310logo src="/mstile-310x310.png"/> | |||||
<wide310x150logo src="/mstile-310x150.png"/> | |||||
<TileColor>#da532c</TileColor> | |||||
</tile> | |||||
</msapplication> | |||||
</browserconfig> |
@@ -1,41 +1,41 @@ | |||||
{ | |||||
"name": "LessPass", | |||||
"icons": [ | |||||
{ | |||||
"src": "\/android-chrome-36x36.png", | |||||
"sizes": "36x36", | |||||
"type": "image\/png", | |||||
"density": 0.75 | |||||
}, | |||||
{ | |||||
"src": "\/android-chrome-48x48.png", | |||||
"sizes": "48x48", | |||||
"type": "image\/png", | |||||
"density": 1 | |||||
}, | |||||
{ | |||||
"src": "\/android-chrome-72x72.png", | |||||
"sizes": "72x72", | |||||
"type": "image\/png", | |||||
"density": 1.5 | |||||
}, | |||||
{ | |||||
"src": "\/android-chrome-96x96.png", | |||||
"sizes": "96x96", | |||||
"type": "image\/png", | |||||
"density": 2 | |||||
}, | |||||
{ | |||||
"src": "\/android-chrome-144x144.png", | |||||
"sizes": "144x144", | |||||
"type": "image\/png", | |||||
"density": 3 | |||||
}, | |||||
{ | |||||
"src": "\/android-chrome-192x192.png", | |||||
"sizes": "192x192", | |||||
"type": "image\/png", | |||||
"density": 4 | |||||
} | |||||
] | |||||
} | |||||
{ | |||||
"name": "LessPass", | |||||
"icons": [ | |||||
{ | |||||
"src": "\/android-chrome-36x36.png", | |||||
"sizes": "36x36", | |||||
"type": "image\/png", | |||||
"density": 0.75 | |||||
}, | |||||
{ | |||||
"src": "\/android-chrome-48x48.png", | |||||
"sizes": "48x48", | |||||
"type": "image\/png", | |||||
"density": 1 | |||||
}, | |||||
{ | |||||
"src": "\/android-chrome-72x72.png", | |||||
"sizes": "72x72", | |||||
"type": "image\/png", | |||||
"density": 1.5 | |||||
}, | |||||
{ | |||||
"src": "\/android-chrome-96x96.png", | |||||
"sizes": "96x96", | |||||
"type": "image\/png", | |||||
"density": 2 | |||||
}, | |||||
{ | |||||
"src": "\/android-chrome-144x144.png", | |||||
"sizes": "144x144", | |||||
"type": "image\/png", | |||||
"density": 3 | |||||
}, | |||||
{ | |||||
"src": "\/android-chrome-192x192.png", | |||||
"sizes": "192x192", | |||||
"type": "image\/png", | |||||
"density": 4 | |||||
} | |||||
] | |||||
} |
@@ -1,21 +1,21 @@ | |||||
<?xml version="1.0" standalone="no"?> | |||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" | |||||
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> | |||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" | |||||
width="280.000000pt" height="280.000000pt" viewBox="0 0 280.000000 280.000000" | |||||
preserveAspectRatio="xMidYMid meet"> | |||||
<metadata> | |||||
Created by potrace 1.11, written by Peter Selinger 2001-2013 | |||||
</metadata> | |||||
<g transform="translate(0.000000,280.000000) scale(0.100000,-0.100000)" | |||||
fill="#000000" stroke="none"> | |||||
<path d="M0 1400 l0 -1400 1400 0 1400 0 0 1400 0 1400 -1400 0 -1400 0 0 | |||||
-1400z m1534 1064 c92 -24 170 -70 245 -145 213 -213 212 -542 -2 -758 -46 | |||||
-48 -83 -73 -149 -104 l-88 -42 0 -242 0 -242 78 -3 77 -3 3 -127 3 -127 -78 | |||||
-3 -78 -3 -3 -42 -3 -42 78 -3 78 -3 3 -127 3 -128 -226 0 -226 0 3 548 3 549 | |||||
-85 40 c-338 162 -415 598 -152 861 110 109 228 160 376 161 43 1 106 -6 140 | |||||
-15z"/> | |||||
<path d="M1319 2257 c-151 -43 -243 -163 -242 -318 0 -95 31 -168 98 -233 108 | |||||
-106 293 -118 416 -28 149 110 176 323 59 471 -72 91 -220 139 -331 108z"/> | |||||
</g> | |||||
</svg> | |||||
<?xml version="1.0" standalone="no"?> | |||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" | |||||
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> | |||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" | |||||
width="280.000000pt" height="280.000000pt" viewBox="0 0 280.000000 280.000000" | |||||
preserveAspectRatio="xMidYMid meet"> | |||||
<metadata> | |||||
Created by potrace 1.11, written by Peter Selinger 2001-2013 | |||||
</metadata> | |||||
<g transform="translate(0.000000,280.000000) scale(0.100000,-0.100000)" | |||||
fill="#000000" stroke="none"> | |||||
<path d="M0 1400 l0 -1400 1400 0 1400 0 0 1400 0 1400 -1400 0 -1400 0 0 | |||||
-1400z m1534 1064 c92 -24 170 -70 245 -145 213 -213 212 -542 -2 -758 -46 | |||||
-48 -83 -73 -149 -104 l-88 -42 0 -242 0 -242 78 -3 77 -3 3 -127 3 -127 -78 | |||||
-3 -78 -3 -3 -42 -3 -42 78 -3 78 -3 3 -127 3 -128 -226 0 -226 0 3 548 3 549 | |||||
-85 40 c-338 162 -415 598 -152 861 110 109 228 160 376 161 43 1 106 -6 140 | |||||
-15z"/> | |||||
<path d="M1319 2257 c-151 -43 -243 -163 -242 -318 0 -95 31 -168 98 -233 108 | |||||
-106 293 -118 416 -28 149 110 176 323 59 471 -72 91 -220 139 -331 108z"/> | |||||
</g> | |||||
</svg> |
@@ -1,134 +1,134 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
height="150" | |||||
version="1.0" | |||||
viewBox="0 0 960 150" | |||||
width="960" | |||||
xml:space="preserve" | |||||
id="svg2" | |||||
inkscape:version="0.48.4 r9939" | |||||
sodipodi:docname="featurettes.svg"><metadata | |||||
id="metadata66"><rdf:RDF><cc:Work | |||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs | |||||
id="defs64" /><sodipodi:namedview | |||||
pagecolor="#0275d8" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1333" | |||||
inkscape:window-height="744" | |||||
id="namedview62" | |||||
showgrid="false" | |||||
inkscape:zoom="1.0727273" | |||||
inkscape:cx="653.82492" | |||||
inkscape:cy="60.167955" | |||||
inkscape:window-x="33" | |||||
inkscape:window-y="24" | |||||
inkscape:window-maximized="1" | |||||
inkscape:current-layer="g4288" | |||||
showborder="true" | |||||
inkscape:showpageshadow="false" /><g | |||||
id="Artboard" | |||||
transform="translate(0,40)" /><g | |||||
id="g4288" | |||||
inkscape:export-xdpi="115" | |||||
inkscape:export-ydpi="115"><g | |||||
id="g4279" | |||||
inkscape:export-filename="/home/guillaume/workspace/lesspass/lesspass/app/assets/images/no-cloud.png" | |||||
inkscape:export-xdpi="219.54187" | |||||
inkscape:export-ydpi="219.54187"><g | |||||
id="g4196" | |||||
transform="translate(6.497146,11.819039)"><path | |||||
id="path22" | |||||
d="m 120.27048,26.707981 c 5.62791,0 10.50637,3.206851 12.89812,7.898618 3.80536,-1.62029 8.09675,1.071241 8.2548,5.239121 3.46384,1.221296 5.95149,4.514546 5.95149,8.397272 0,4.921657 -3.9905,8.908881 -8.91104,8.908881 l -29.70346,0 c 0,0.0011 -8.911043,-1.652618 -8.911043,-10.396212 0,-4.37014 2.699483,-8.103278 6.519223,-9.640674 3.02615,-7.400721 7.91479,-10.407006 13.90191,-10.407006 z" | |||||
style="fill:none;stroke:#ffffff;stroke-width:2.21049023;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | |||||
inkscape:connector-curvature="0" /><g | |||||
transform="matrix(1.1052452,0,0,1.1052452,-32.079628,15.016247)" | |||||
id="g4266"><path | |||||
style="fill:#ffffff" | |||||
d="m 108.97854,44.531879 c -1.105,0 -2,0.895 -2,2 l 0,15.5 20,0 0,-15.5 c 0,-1.105 -0.89498,-2 -2,-2 l -16,0 z m 3.5,3 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m 5,0 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m 5,0 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m -15.5,16.5 0,1.75 20,0 0,-1.75 -20,0 z m 0,3.75 0,1.75 20,0 0,-1.75 -20,0 z m 0,3.75 0,3 c 0,1.105 0.895,2 2,2 l 16,0 c 1.10502,0 2,-0.895 2,-2 l 0,-3 -20,0 z" | |||||
id="path14" | |||||
inkscape:connector-curvature="0" /><path | |||||
inkscape:connector-curvature="0" | |||||
id="path4262" | |||||
d="m 132.86626,44.531879 c -1.105,0 -2,0.895 -2,2 l 0,15.5 20,0 0,-15.5 c 0,-1.105 -0.89498,-2 -2,-2 l -16,0 z m 3.5,3 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m 5,0 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m 5,0 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m -15.5,16.5 0,1.75 20,0 0,-1.75 -20,0 z m 0,3.75 0,1.75 20,0 0,-1.75 -20,0 z m 0,3.75 0,3 c 0,1.105 0.895,2 2,2 l 16,0 c 1.10502,0 2,-0.895 2,-2 l 0,-3 -20,0 z" | |||||
style="fill:#ffffff" /><path | |||||
style="fill:#ffffff" | |||||
d="m 156.75397,44.531879 c -1.105,0 -2,0.895 -2,2 l 0,15.5 20,0 0,-15.5 c 0,-1.105 -0.89498,-2 -2,-2 l -16,0 z m 3.5,3 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m 5,0 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m 5,0 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m -15.5,16.5 0,1.75 20,0 0,-1.75 -20,0 z m 0,3.75 0,1.75 20,0 0,-1.75 -20,0 z m 0,3.75 0,3 c 0,1.105 0.895,2 2,2 l 16,0 c 1.10502,0 2,-0.895 2,-2 l 0,-3 -20,0 z" | |||||
id="path4264" | |||||
inkscape:connector-curvature="0" /></g></g><path | |||||
style="opacity:0.80800003;fill:#ff0000;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | |||||
d="M 87.90006,115.97181 168.31848,36.871728" | |||||
id="path4273" | |||||
inkscape:connector-curvature="0" /></g><path | |||||
sodipodi:nodetypes="cscscssscccccscscsssssscccssscsssccsscsssssssscscsssscssscssscscscccsccssscssccccc" | |||||
inkscape:connector-curvature="0" | |||||
id="path4302" | |||||
d="m 409.28158,111.8599 c 0.10678,-0.27821 -0.7617,-1.65893 -2.37139,-3.77021 l -2.53987,-3.33125 -0.0265,-13.222244 c -0.0153,-7.272241 -0.11882,-13.371647 -0.23167,-13.554207 -0.14962,-0.241988 -3.06733,-0.331948 -10.76645,-0.331948 -8.13458,0 -10.61453,-0.08226 -10.79296,-0.357945 -0.12746,-0.196881 -0.29611,-6.80091 -0.37484,-14.675639 l -0.14319,-14.317692 -32.07165,0 -32.07163,0 0,21.762897 0,21.76288 15.31993,0.149454 c 8.42597,0.08226 15.35682,0.178837 15.4019,0.214754 0.045,0.03589 0.045,1.321696 0,2.857266 l -0.0819,2.791949 -3.1499,0.07803 c -2.5459,0.06297 -3.21853,0.169578 -3.50782,0.555841 -0.46421,0.619769 -0.45146,0.806714 0.0921,1.350216 0.67557,0.675588 15.31932,0.675588 15.99489,0 0.5435,-0.543502 0.55624,-0.730447 0.0921,-1.350216 -0.28929,-0.386263 -0.96192,-0.492844 -3.50783,-0.555841 l -3.14989,-0.07803 0,-2.863545 0,-2.863528 6.01286,-0.07769 c 5.40037,-0.06974 6.0494,-0.02759 6.37138,0.412683 0.259,0.354187 0.35849,2.090344 0.35849,6.254902 l 0,5.764633 -2.6082,3.48614 c -1.61368,2.15686 -2.54521,3.6503 -2.44298,3.91666 0.14522,0.3786 3.17365,0.43054 25.09597,0.43054 22.13439,0 24.94964,-0.0493 25.0992,-0.43895 z m -45.71667,-2.38428 c 0,-0.29281 0.52639,-1.1304 1.16975,-1.86129 l 1.16976,-1.3289 18.2307,0.008 c 13.88125,0.007 18.33835,0.0924 18.68183,0.35794 0.73723,0.5701 2.27136,2.83413 2.10399,3.10498 -0.0862,0.13946 -9.29126,0.25058 -20.75546,0.25058 -19.88968,0 -20.60057,-0.0183 -20.60057,-0.5324 z m 2.91244,-6.26851 c -0.3592,-0.69879 -0.38024,-22.074431 -0.0224,-22.743099 0.27019,-0.504912 1.03412,-0.524376 17.81025,-0.453762 l 17.52793,0.0738 0.075,11.453673 c 0.0414,6.299519 0.0135,11.614978 -0.0626,11.812098 -0.10797,0.28157 -3.88261,0.35842 -17.60404,0.35842 -16.34572,0 -17.48302,-0.0322 -17.7241,-0.50112 z M 320.09638,89.333278 c -0.26033,-0.260335 -0.34362,-4.93165 -0.34362,-19.271616 0,-14.339967 0.0833,-19.011281 0.34362,-19.271616 0.49857,-0.498564 59.23487,-0.498564 59.73342,0 0.52777,0.527778 0.49134,26.094563 -0.0378,26.533718 -0.25189,0.209049 -2.95072,0.342542 -7.94632,0.393015 l -7.56486,0.0765 -0.078,5.562218 c -0.0493,3.511901 -0.19408,5.702141 -0.39302,5.941844 -0.43992,0.530062 -43.18416,0.565268 -43.71344,0.03605 z m 8.46617,22.730392 c 0.28162,-0.18156 0.34542,-2.11117 0.28635,-8.66142 l -0.076,-8.427813 -5.44073,0 -5.44073,0 0,8.590623 0,8.59062 5.15439,0.0708 c 2.83489,0.0389 5.31741,-0.0344 5.5167,-0.16283 z m -8.35975,-3.85786 c -0.36196,-0.36197 -0.44997,-3.53374 -0.44997,-6.46777 0,-4.803147 -0.0328,-4.759123 3.54116,-4.759123 1.8731,0 2.84557,0.117973 3.10157,0.376141 0.27682,0.279172 0.35595,1.38625 0.30704,4.294972 -0.0558,3.31864 -0.14099,6.34409 -0.55584,6.6475 -0.75495,0.55202 -5.37142,0.48079 -5.94394,-0.0917 z" | |||||
style="fill:#ffffff" | |||||
inkscape:export-filename="/home/guillaume/workspace/lesspass/lesspass/app/assets/images/all-devices.png" | |||||
inkscape:export-xdpi="281.62247" | |||||
inkscape:export-ydpi="281.62247" /><g | |||||
style="fill:#f2f2f2" | |||||
transform="matrix(2.8436861,0,0,2.8436861,562.94828,42.012392)" | |||||
id="g4347" | |||||
inkscape:export-filename="/home/guillaume/workspace/lesspass/lesspass/app/assets/images/open-source.png" | |||||
inkscape:export-xdpi="281.25003" | |||||
inkscape:export-ydpi="281.25003"><g | |||||
style="fill:#f2f2f2" | |||||
id="g4305"><g | |||||
style="fill:#f2f2f2" | |||||
id="g4307"><path | |||||
style="fill:#f2f2f2" | |||||
inkscape:connector-curvature="0" | |||||
d="m 17.655,23.253 c -0.045,0 -0.09,-0.006 -0.134,-0.018 -0.128,-0.036 -0.236,-0.121 -0.302,-0.236 L 13.524,16.46 c -0.136,-0.24 -0.051,-0.545 0.188,-0.681 1.103,-0.625 1.787,-1.787 1.787,-3.032 0,-1.93 -1.57,-3.5 -3.5,-3.5 -1.93,0 -3.5,1.57 -3.5,3.5 0,1.245 0.685,2.407 1.787,3.032 0.239,0.136 0.324,0.441 0.188,0.681 L 6.78,22.999 C 6.715,23.114 6.606,23.199 6.478,23.235 6.35,23.27 6.213,23.253 6.098,23.188 2.337,21.057 0,17.056 0,12.747 c 0,-6.617 5.383,-12 12,-12 6.617,0 12,5.383 12,12 0,4.31 -2.337,8.311 -6.099,10.441 -0.075,0.043 -0.16,0.065 -0.246,0.065 z m -3.028,-6.874 3.212,5.683 C 21.035,20.054 23,16.53 23,12.747 c 0,-6.065 -4.935,-11 -11,-11 -6.065,0 -11,4.935 -11,11 0,3.783 1.965,7.307 5.161,9.315 L 9.373,16.379 C 8.207,15.536 7.5,14.186 7.5,12.747 c 0,-2.481 2.019,-4.5 4.5,-4.5 2.481,0 4.5,2.019 4.5,4.5 0,1.439 -0.707,2.789 -1.873,3.632 z" | |||||
id="path4309" /></g></g><g | |||||
style="fill:#f2f2f2" | |||||
id="g4311" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4313" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4315" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4317" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4319" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4321" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4323" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4325" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4327" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4329" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4331" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4333" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4335" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4337" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4339" /></g><path | |||||
style="fill:#f2f2f2" | |||||
d="m 800.28067,102.841 c -3.60083,-4.907156 -7.3782,-9.69372 -10.66998,-14.819714 3.85019,-4.488546 9.07561,-7.497602 13.6021,-11.240731 11.86869,-8.982467 23.82949,-17.842212 35.73889,-26.770439 4.35801,-0.72313 10.22842,1.659622 13.46578,-1.862643 3.17592,-4.466391 9.14628,-6.897444 14.42617,-4.91462 4.15064,1.031433 5.72397,5.740878 3.77976,9.304463 -1.83727,4.08764 -4.88233,7.625853 -5.71165,12.147096 -1.28228,4.594386 -2.07279,9.316419 -3.5205,13.866194 -9.41417,8.415437 -19.85674,15.573691 -29.85719,23.261004 -6.65859,4.98943 -13.33491,9.95767 -20.1435,14.7415 -4.16653,-4.17799 -7.47273,-9.09103 -11.10988,-13.71211 z m 35.55864,-6.281104 c 7.71134,-5.926782 15.73354,-11.466909 23.06447,-17.874715 2.77424,-3.458443 2.43868,-8.196332 3.75046,-12.244638 0.97498,-4.537751 2.48124,-8.989464 2.79554,-13.647187 -3.26983,-1.322791 -6.87449,-0.335482 -10.30512,-0.505845 -2.13496,-0.281578 -3.84568,0.129579 -3.58726,2.74983 -0.95883,4.643826 7.43516,1.845399 5.95749,7.357968 -0.80959,5.527784 -8.64079,2.777015 -7.30926,-2.139649 -0.89659,-2.426194 1.45195,-8.174228 -1.59322,-8.468559 -2.9964,-0.08845 -5.99279,-0.176894 -8.98919,-0.265341 -15.641,11.882058 -31.63643,23.31411 -46.86027,35.734004 -1.41082,4.199869 4.48866,6.962648 5.91767,10.67397 4.19109,5.607656 8.31003,11.279606 12.85983,16.606316 8.20804,-5.84429 16.21567,-11.96212 24.29886,-17.976154 z m -27.0369,-1.12558 c -3.18169,-2.431751 -5.08512,-7.017266 -0.32855,-8.804835 1.3613,-1.397966 4.54265,-1.03287 1.88931,0.928551 -3.75452,0.692509 -1.96697,7.586142 1.3619,4.050776 2.50974,-2.745513 3.43271,0.587793 0.90528,1.821973 -4.50957,1.230332 4.58111,6.518378 0.22086,6.266561 -1.56911,-1.19689 -2.76076,-2.78839 -4.0488,-4.263026 z m 7.94569,-6.51951 c -2.87484,-2.339884 -4.97076,-7.143108 -0.32283,-8.791687 3.81212,-3.743963 8.1252,1.052876 7.74001,4.674194 1.68089,0.280109 7.28083,3.064984 2.82105,3.045903 -2.49743,-1.323364 -9.80147,-0.930691 -5.79804,2.899427 2.23659,2.923222 -1.10573,3.486108 -2.18114,0.816888 -0.77858,-0.859352 -1.52633,-1.746121 -2.25905,-2.644725 z m 2.66337,-3.29496 c 5.16935,-2.393159 -1.41142,-7.336139 -3.4332,-2.45714 -0.66785,1.748975 2.02142,4.309861 3.4332,2.45714 z m 6.91927,-4.49864 c -3.50817,-2.560655 -4.39986,-7.633179 0.24906,-9.341355 1.86352,-1.849718 4.43972,-0.3112 1.44137,1.272605 -3.41063,0.905606 -2.69821,7.366937 0.84159,4.37462 1.47249,-1.561952 5.69949,-2.722982 2.68328,0.530401 -3.3081,0.780803 -3.25322,5.359195 0.46051,4.874467 1.50261,-0.228417 5.99224,-5.064655 4.82992,-1.209222 -1.96759,2.316954 -6.22178,6.035034 -8.57766,1.975536 -0.46168,-0.94654 -1.31757,-1.62967 -1.92807,-2.477052 z m 8.96185,-6.85252 c -2.97071,-2.515216 -5.38493,-6.960838 -0.72322,-9.11999 1.20565,-1.988081 5.52545,-1.788028 2.35223,0.500795 -3.54167,0.842394 -2.83188,7.721589 0.9851,4.366449 1.26533,-1.589688 5.11118,-1.6034 2.15807,0.614948 -4.43849,2.10074 -0.0108,8.556753 2.75631,3.617272 1.36051,-1.480403 4.31599,-1.905557 2.15847,0.510333 -1.96945,2.889935 -6.40963,5.850644 -8.2654,1.194286 -0.47655,-0.559086 -0.94891,-1.121713 -1.42156,-1.684093 z m 20.858,-12.89835 c -0.53906,-2.907645 -4.48278,-1.218847 -1.5137,0.544441 0.49766,0.347783 1.58909,0.28367 1.5137,-0.544441 z m 13.28476,-10.31225 c 2.23228,-5.175194 -4.84261,-7.779636 -8.87078,-6.676124 -2.5337,0.491003 -6.76192,3.304785 -6.39586,5.323376 3.89359,1.237162 8.12261,0.212808 12.02913,1.04115 1.71171,0.550354 2.23867,4.195007 3.03794,0.918145 l 0.19957,-0.606547 z" | |||||
id="path4384" | |||||
inkscape:connector-curvature="0" | |||||
inkscape:export-filename="/home/guillaume/workspace/lesspass/lesspass/app/assets/images/free.png" | |||||
inkscape:export-xdpi="243" | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
height="150" | |||||
version="1.0" | |||||
viewBox="0 0 960 150" | |||||
width="960" | |||||
xml:space="preserve" | |||||
id="svg2" | |||||
inkscape:version="0.48.4 r9939" | |||||
sodipodi:docname="featurettes.svg"><metadata | |||||
id="metadata66"><rdf:RDF><cc:Work | |||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs | |||||
id="defs64" /><sodipodi:namedview | |||||
pagecolor="#0275d8" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1333" | |||||
inkscape:window-height="744" | |||||
id="namedview62" | |||||
showgrid="false" | |||||
inkscape:zoom="1.0727273" | |||||
inkscape:cx="653.82492" | |||||
inkscape:cy="60.167955" | |||||
inkscape:window-x="33" | |||||
inkscape:window-y="24" | |||||
inkscape:window-maximized="1" | |||||
inkscape:current-layer="g4288" | |||||
showborder="true" | |||||
inkscape:showpageshadow="false" /><g | |||||
id="Artboard" | |||||
transform="translate(0,40)" /><g | |||||
id="g4288" | |||||
inkscape:export-xdpi="115" | |||||
inkscape:export-ydpi="115"><g | |||||
id="g4279" | |||||
inkscape:export-filename="/home/guillaume/workspace/lesspass/lesspass/app/assets/images/no-cloud.png" | |||||
inkscape:export-xdpi="219.54187" | |||||
inkscape:export-ydpi="219.54187"><g | |||||
id="g4196" | |||||
transform="translate(6.497146,11.819039)"><path | |||||
id="path22" | |||||
d="m 120.27048,26.707981 c 5.62791,0 10.50637,3.206851 12.89812,7.898618 3.80536,-1.62029 8.09675,1.071241 8.2548,5.239121 3.46384,1.221296 5.95149,4.514546 5.95149,8.397272 0,4.921657 -3.9905,8.908881 -8.91104,8.908881 l -29.70346,0 c 0,0.0011 -8.911043,-1.652618 -8.911043,-10.396212 0,-4.37014 2.699483,-8.103278 6.519223,-9.640674 3.02615,-7.400721 7.91479,-10.407006 13.90191,-10.407006 z" | |||||
style="fill:none;stroke:#ffffff;stroke-width:2.21049023;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | |||||
inkscape:connector-curvature="0" /><g | |||||
transform="matrix(1.1052452,0,0,1.1052452,-32.079628,15.016247)" | |||||
id="g4266"><path | |||||
style="fill:#ffffff" | |||||
d="m 108.97854,44.531879 c -1.105,0 -2,0.895 -2,2 l 0,15.5 20,0 0,-15.5 c 0,-1.105 -0.89498,-2 -2,-2 l -16,0 z m 3.5,3 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m 5,0 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m 5,0 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m -15.5,16.5 0,1.75 20,0 0,-1.75 -20,0 z m 0,3.75 0,1.75 20,0 0,-1.75 -20,0 z m 0,3.75 0,3 c 0,1.105 0.895,2 2,2 l 16,0 c 1.10502,0 2,-0.895 2,-2 l 0,-3 -20,0 z" | |||||
id="path14" | |||||
inkscape:connector-curvature="0" /><path | |||||
inkscape:connector-curvature="0" | |||||
id="path4262" | |||||
d="m 132.86626,44.531879 c -1.105,0 -2,0.895 -2,2 l 0,15.5 20,0 0,-15.5 c 0,-1.105 -0.89498,-2 -2,-2 l -16,0 z m 3.5,3 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m 5,0 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m 5,0 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m -15.5,16.5 0,1.75 20,0 0,-1.75 -20,0 z m 0,3.75 0,1.75 20,0 0,-1.75 -20,0 z m 0,3.75 0,3 c 0,1.105 0.895,2 2,2 l 16,0 c 1.10502,0 2,-0.895 2,-2 l 0,-3 -20,0 z" | |||||
style="fill:#ffffff" /><path | |||||
style="fill:#ffffff" | |||||
d="m 156.75397,44.531879 c -1.105,0 -2,0.895 -2,2 l 0,15.5 20,0 0,-15.5 c 0,-1.105 -0.89498,-2 -2,-2 l -16,0 z m 3.5,3 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m 5,0 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m 5,0 a 1.5,1.5 0 0 1 1.5,1.5 1.5,1.5 0 0 1 -1.5,1.5 1.5,1.5 0 0 1 -1.5,-1.5 1.5,1.5 0 0 1 1.5,-1.5 z m -15.5,16.5 0,1.75 20,0 0,-1.75 -20,0 z m 0,3.75 0,1.75 20,0 0,-1.75 -20,0 z m 0,3.75 0,3 c 0,1.105 0.895,2 2,2 l 16,0 c 1.10502,0 2,-0.895 2,-2 l 0,-3 -20,0 z" | |||||
id="path4264" | |||||
inkscape:connector-curvature="0" /></g></g><path | |||||
style="opacity:0.80800003;fill:#ff0000;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | |||||
d="M 87.90006,115.97181 168.31848,36.871728" | |||||
id="path4273" | |||||
inkscape:connector-curvature="0" /></g><path | |||||
sodipodi:nodetypes="cscscssscccccscscsssssscccssscsssccsscsssssssscscsssscssscssscscscccsccssscssccccc" | |||||
inkscape:connector-curvature="0" | |||||
id="path4302" | |||||
d="m 409.28158,111.8599 c 0.10678,-0.27821 -0.7617,-1.65893 -2.37139,-3.77021 l -2.53987,-3.33125 -0.0265,-13.222244 c -0.0153,-7.272241 -0.11882,-13.371647 -0.23167,-13.554207 -0.14962,-0.241988 -3.06733,-0.331948 -10.76645,-0.331948 -8.13458,0 -10.61453,-0.08226 -10.79296,-0.357945 -0.12746,-0.196881 -0.29611,-6.80091 -0.37484,-14.675639 l -0.14319,-14.317692 -32.07165,0 -32.07163,0 0,21.762897 0,21.76288 15.31993,0.149454 c 8.42597,0.08226 15.35682,0.178837 15.4019,0.214754 0.045,0.03589 0.045,1.321696 0,2.857266 l -0.0819,2.791949 -3.1499,0.07803 c -2.5459,0.06297 -3.21853,0.169578 -3.50782,0.555841 -0.46421,0.619769 -0.45146,0.806714 0.0921,1.350216 0.67557,0.675588 15.31932,0.675588 15.99489,0 0.5435,-0.543502 0.55624,-0.730447 0.0921,-1.350216 -0.28929,-0.386263 -0.96192,-0.492844 -3.50783,-0.555841 l -3.14989,-0.07803 0,-2.863545 0,-2.863528 6.01286,-0.07769 c 5.40037,-0.06974 6.0494,-0.02759 6.37138,0.412683 0.259,0.354187 0.35849,2.090344 0.35849,6.254902 l 0,5.764633 -2.6082,3.48614 c -1.61368,2.15686 -2.54521,3.6503 -2.44298,3.91666 0.14522,0.3786 3.17365,0.43054 25.09597,0.43054 22.13439,0 24.94964,-0.0493 25.0992,-0.43895 z m -45.71667,-2.38428 c 0,-0.29281 0.52639,-1.1304 1.16975,-1.86129 l 1.16976,-1.3289 18.2307,0.008 c 13.88125,0.007 18.33835,0.0924 18.68183,0.35794 0.73723,0.5701 2.27136,2.83413 2.10399,3.10498 -0.0862,0.13946 -9.29126,0.25058 -20.75546,0.25058 -19.88968,0 -20.60057,-0.0183 -20.60057,-0.5324 z m 2.91244,-6.26851 c -0.3592,-0.69879 -0.38024,-22.074431 -0.0224,-22.743099 0.27019,-0.504912 1.03412,-0.524376 17.81025,-0.453762 l 17.52793,0.0738 0.075,11.453673 c 0.0414,6.299519 0.0135,11.614978 -0.0626,11.812098 -0.10797,0.28157 -3.88261,0.35842 -17.60404,0.35842 -16.34572,0 -17.48302,-0.0322 -17.7241,-0.50112 z M 320.09638,89.333278 c -0.26033,-0.260335 -0.34362,-4.93165 -0.34362,-19.271616 0,-14.339967 0.0833,-19.011281 0.34362,-19.271616 0.49857,-0.498564 59.23487,-0.498564 59.73342,0 0.52777,0.527778 0.49134,26.094563 -0.0378,26.533718 -0.25189,0.209049 -2.95072,0.342542 -7.94632,0.393015 l -7.56486,0.0765 -0.078,5.562218 c -0.0493,3.511901 -0.19408,5.702141 -0.39302,5.941844 -0.43992,0.530062 -43.18416,0.565268 -43.71344,0.03605 z m 8.46617,22.730392 c 0.28162,-0.18156 0.34542,-2.11117 0.28635,-8.66142 l -0.076,-8.427813 -5.44073,0 -5.44073,0 0,8.590623 0,8.59062 5.15439,0.0708 c 2.83489,0.0389 5.31741,-0.0344 5.5167,-0.16283 z m -8.35975,-3.85786 c -0.36196,-0.36197 -0.44997,-3.53374 -0.44997,-6.46777 0,-4.803147 -0.0328,-4.759123 3.54116,-4.759123 1.8731,0 2.84557,0.117973 3.10157,0.376141 0.27682,0.279172 0.35595,1.38625 0.30704,4.294972 -0.0558,3.31864 -0.14099,6.34409 -0.55584,6.6475 -0.75495,0.55202 -5.37142,0.48079 -5.94394,-0.0917 z" | |||||
style="fill:#ffffff" | |||||
inkscape:export-filename="/home/guillaume/workspace/lesspass/lesspass/app/assets/images/all-devices.png" | |||||
inkscape:export-xdpi="281.62247" | |||||
inkscape:export-ydpi="281.62247" /><g | |||||
style="fill:#f2f2f2" | |||||
transform="matrix(2.8436861,0,0,2.8436861,562.94828,42.012392)" | |||||
id="g4347" | |||||
inkscape:export-filename="/home/guillaume/workspace/lesspass/lesspass/app/assets/images/open-source.png" | |||||
inkscape:export-xdpi="281.25003" | |||||
inkscape:export-ydpi="281.25003"><g | |||||
style="fill:#f2f2f2" | |||||
id="g4305"><g | |||||
style="fill:#f2f2f2" | |||||
id="g4307"><path | |||||
style="fill:#f2f2f2" | |||||
inkscape:connector-curvature="0" | |||||
d="m 17.655,23.253 c -0.045,0 -0.09,-0.006 -0.134,-0.018 -0.128,-0.036 -0.236,-0.121 -0.302,-0.236 L 13.524,16.46 c -0.136,-0.24 -0.051,-0.545 0.188,-0.681 1.103,-0.625 1.787,-1.787 1.787,-3.032 0,-1.93 -1.57,-3.5 -3.5,-3.5 -1.93,0 -3.5,1.57 -3.5,3.5 0,1.245 0.685,2.407 1.787,3.032 0.239,0.136 0.324,0.441 0.188,0.681 L 6.78,22.999 C 6.715,23.114 6.606,23.199 6.478,23.235 6.35,23.27 6.213,23.253 6.098,23.188 2.337,21.057 0,17.056 0,12.747 c 0,-6.617 5.383,-12 12,-12 6.617,0 12,5.383 12,12 0,4.31 -2.337,8.311 -6.099,10.441 -0.075,0.043 -0.16,0.065 -0.246,0.065 z m -3.028,-6.874 3.212,5.683 C 21.035,20.054 23,16.53 23,12.747 c 0,-6.065 -4.935,-11 -11,-11 -6.065,0 -11,4.935 -11,11 0,3.783 1.965,7.307 5.161,9.315 L 9.373,16.379 C 8.207,15.536 7.5,14.186 7.5,12.747 c 0,-2.481 2.019,-4.5 4.5,-4.5 2.481,0 4.5,2.019 4.5,4.5 0,1.439 -0.707,2.789 -1.873,3.632 z" | |||||
id="path4309" /></g></g><g | |||||
style="fill:#f2f2f2" | |||||
id="g4311" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4313" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4315" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4317" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4319" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4321" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4323" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4325" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4327" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4329" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4331" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4333" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4335" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4337" /><g | |||||
style="fill:#f2f2f2" | |||||
id="g4339" /></g><path | |||||
style="fill:#f2f2f2" | |||||
d="m 800.28067,102.841 c -3.60083,-4.907156 -7.3782,-9.69372 -10.66998,-14.819714 3.85019,-4.488546 9.07561,-7.497602 13.6021,-11.240731 11.86869,-8.982467 23.82949,-17.842212 35.73889,-26.770439 4.35801,-0.72313 10.22842,1.659622 13.46578,-1.862643 3.17592,-4.466391 9.14628,-6.897444 14.42617,-4.91462 4.15064,1.031433 5.72397,5.740878 3.77976,9.304463 -1.83727,4.08764 -4.88233,7.625853 -5.71165,12.147096 -1.28228,4.594386 -2.07279,9.316419 -3.5205,13.866194 -9.41417,8.415437 -19.85674,15.573691 -29.85719,23.261004 -6.65859,4.98943 -13.33491,9.95767 -20.1435,14.7415 -4.16653,-4.17799 -7.47273,-9.09103 -11.10988,-13.71211 z m 35.55864,-6.281104 c 7.71134,-5.926782 15.73354,-11.466909 23.06447,-17.874715 2.77424,-3.458443 2.43868,-8.196332 3.75046,-12.244638 0.97498,-4.537751 2.48124,-8.989464 2.79554,-13.647187 -3.26983,-1.322791 -6.87449,-0.335482 -10.30512,-0.505845 -2.13496,-0.281578 -3.84568,0.129579 -3.58726,2.74983 -0.95883,4.643826 7.43516,1.845399 5.95749,7.357968 -0.80959,5.527784 -8.64079,2.777015 -7.30926,-2.139649 -0.89659,-2.426194 1.45195,-8.174228 -1.59322,-8.468559 -2.9964,-0.08845 -5.99279,-0.176894 -8.98919,-0.265341 -15.641,11.882058 -31.63643,23.31411 -46.86027,35.734004 -1.41082,4.199869 4.48866,6.962648 5.91767,10.67397 4.19109,5.607656 8.31003,11.279606 12.85983,16.606316 8.20804,-5.84429 16.21567,-11.96212 24.29886,-17.976154 z m -27.0369,-1.12558 c -3.18169,-2.431751 -5.08512,-7.017266 -0.32855,-8.804835 1.3613,-1.397966 4.54265,-1.03287 1.88931,0.928551 -3.75452,0.692509 -1.96697,7.586142 1.3619,4.050776 2.50974,-2.745513 3.43271,0.587793 0.90528,1.821973 -4.50957,1.230332 4.58111,6.518378 0.22086,6.266561 -1.56911,-1.19689 -2.76076,-2.78839 -4.0488,-4.263026 z m 7.94569,-6.51951 c -2.87484,-2.339884 -4.97076,-7.143108 -0.32283,-8.791687 3.81212,-3.743963 8.1252,1.052876 7.74001,4.674194 1.68089,0.280109 7.28083,3.064984 2.82105,3.045903 -2.49743,-1.323364 -9.80147,-0.930691 -5.79804,2.899427 2.23659,2.923222 -1.10573,3.486108 -2.18114,0.816888 -0.77858,-0.859352 -1.52633,-1.746121 -2.25905,-2.644725 z m 2.66337,-3.29496 c 5.16935,-2.393159 -1.41142,-7.336139 -3.4332,-2.45714 -0.66785,1.748975 2.02142,4.309861 3.4332,2.45714 z m 6.91927,-4.49864 c -3.50817,-2.560655 -4.39986,-7.633179 0.24906,-9.341355 1.86352,-1.849718 4.43972,-0.3112 1.44137,1.272605 -3.41063,0.905606 -2.69821,7.366937 0.84159,4.37462 1.47249,-1.561952 5.69949,-2.722982 2.68328,0.530401 -3.3081,0.780803 -3.25322,5.359195 0.46051,4.874467 1.50261,-0.228417 5.99224,-5.064655 4.82992,-1.209222 -1.96759,2.316954 -6.22178,6.035034 -8.57766,1.975536 -0.46168,-0.94654 -1.31757,-1.62967 -1.92807,-2.477052 z m 8.96185,-6.85252 c -2.97071,-2.515216 -5.38493,-6.960838 -0.72322,-9.11999 1.20565,-1.988081 5.52545,-1.788028 2.35223,0.500795 -3.54167,0.842394 -2.83188,7.721589 0.9851,4.366449 1.26533,-1.589688 5.11118,-1.6034 2.15807,0.614948 -4.43849,2.10074 -0.0108,8.556753 2.75631,3.617272 1.36051,-1.480403 4.31599,-1.905557 2.15847,0.510333 -1.96945,2.889935 -6.40963,5.850644 -8.2654,1.194286 -0.47655,-0.559086 -0.94891,-1.121713 -1.42156,-1.684093 z m 20.858,-12.89835 c -0.53906,-2.907645 -4.48278,-1.218847 -1.5137,0.544441 0.49766,0.347783 1.58909,0.28367 1.5137,-0.544441 z m 13.28476,-10.31225 c 2.23228,-5.175194 -4.84261,-7.779636 -8.87078,-6.676124 -2.5337,0.491003 -6.76192,3.304785 -6.39586,5.323376 3.89359,1.237162 8.12261,0.212808 12.02913,1.04115 1.71171,0.550354 2.23867,4.195007 3.03794,0.918145 l 0.19957,-0.606547 z" | |||||
id="path4384" | |||||
inkscape:connector-curvature="0" | |||||
inkscape:export-filename="/home/guillaume/workspace/lesspass/lesspass/app/assets/images/free.png" | |||||
inkscape:export-xdpi="243" | |||||
inkscape:export-ydpi="243" /></g></svg> | inkscape:export-ydpi="243" /></g></svg> |
@@ -1,198 +1,198 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<!-- Created with Inkscape (http://www.inkscape.org/) --> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
id="svg3039" | |||||
version="1.1" | |||||
inkscape:version="0.48.4 r9939" | |||||
width="400" | |||||
height="300" | |||||
sodipodi:docname="lesspass.svg"> | |||||
<metadata | |||||
id="metadata3045"> | |||||
<rdf:RDF> | |||||
<cc:Work | |||||
rdf:about=""> | |||||
<dc:format>image/svg+xml</dc:format> | |||||
<dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||||
<dc:title></dc:title> | |||||
</cc:Work> | |||||
</rdf:RDF> | |||||
</metadata> | |||||
<defs | |||||
id="defs3043"> | |||||
<filter | |||||
id="filter5169" | |||||
style="color-interpolation-filters:sRGB;" | |||||
inkscape:label="Drop Shadow"> | |||||
<feFlood | |||||
id="feFlood5171" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite5173" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur5175" | |||||
in="composite" | |||||
stdDeviation="2" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset5177" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite5179" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
<filter | |||||
id="filter3013" | |||||
style="color-interpolation-filters:sRGB;" | |||||
inkscape:label="Drop Shadow"> | |||||
<feFlood | |||||
id="feFlood3015" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite3017" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur3019" | |||||
in="composite" | |||||
stdDeviation="1" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset3021" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite3023" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
<filter | |||||
id="filter3097" | |||||
style="color-interpolation-filters:sRGB;" | |||||
inkscape:label="Drop Shadow"> | |||||
<feFlood | |||||
id="feFlood3099" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite3101" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur3103" | |||||
in="composite" | |||||
stdDeviation="2" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset3105" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite3107" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
</defs> | |||||
<sodipodi:namedview | |||||
pagecolor="#b1b1b1" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1333" | |||||
inkscape:window-height="744" | |||||
id="namedview3041" | |||||
showgrid="false" | |||||
inkscape:zoom="1.99" | |||||
inkscape:cx="182.29418" | |||||
inkscape:cy="134.46388" | |||||
inkscape:window-x="33" | |||||
inkscape:window-y="24" | |||||
inkscape:window-maximized="1" | |||||
inkscape:current-layer="svg3039" | |||||
showguides="true" | |||||
inkscape:guide-bbox="true" | |||||
inkscape:showpageshadow="false" /> | |||||
<rect | |||||
style="opacity:0.90000000000000002;fill:#0275d8;fill-opacity:1;stroke:none" | |||||
id="rect3843" | |||||
width="120.10646" | |||||
height="120.10646" | |||||
x="95.2127" | |||||
y="225.32025" | |||||
rx="24.021292" | |||||
transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)" | |||||
inkscape:export-filename="/home/guillaume/workspace/oslab/lesspass/app/assets/images/logo.png" | |||||
inkscape:export-xdpi="115.20001" | |||||
inkscape:export-ydpi="115.20001" /> | |||||
<path | |||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3013);enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" | |||||
d="m 311.57912,47 c -12.36404,0 -22.47187,10.13599 -22.47187,22.5 0,10.27949 6.99118,18.97952 16.45312,21.62813 l 0,45.87187 4.21875,0 7.81876,0 6.21562,0 c 0.12595,0 0.225,-0.0991 0.225,-0.225 l 0,-10.2375 c 0,-0.12594 -0.10402,-0.26004 -0.225,-0.225 l -6.21562,0 0,-3.85312 6.21562,0 c 0.12595,0 0.225,-0.0991 0.225,-0.225 l 0,-10.2375 c 0,-0.12595 -0.099,-0.225 -0.225,-0.225 l -6.21562,0 0,-20.64375 C 327.0598,88.47952 334.051,79.7795 334.051,69.5 334.051,57.13598 323.94312,47 311.57912,47 z m 0,8.83125 c 7.59627,0 13.64063,6.07247 13.64063,13.66875 0,7.59632 -6.04436,13.64063 -13.64063,13.64063 -7.59624,0 -13.64062,-6.04431 -13.64062,-13.64063 0,-7.59628 6.04438,-13.66875 13.64062,-13.66875 z" | |||||
id="path3056" | |||||
inkscape:connector-curvature="0" | |||||
sodipodi:nodetypes="ssccccssssccssssccsssssss" | |||||
inkscape:export-xdpi="115.20001" | |||||
inkscape:export-ydpi="115.20001" | |||||
inkscape:export-filename="/home/guillaume/workspace/oslab/lesspass/app/assets/images/logo.png" /> | |||||
<path | |||||
style="opacity:0.9;fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter3097)" | |||||
d="m 101.39259,17.016268 c -5.751278,0.275685 -11.432799,2.620297 -15.843752,7.03125 L 34.580088,75.01626 c -9.410033,9.41003 -9.410033,24.55872 0,33.96875 l 50.96875,50.96875 c 9.410033,9.41003 24.558722,9.41003 33.968752,0 l 50.96875,-50.96875 c 9.41003,-9.41003 9.41003,-24.55872 0,-33.96875 L 119.51759,24.047518 c -4.99908,-4.99908 -11.60689,-7.343692 -18.125,-7.03125 z m 0,30.000002 c 0.38173,-0.0196 0.76987,0 1.15625,0 12.364,0 22.46875,10.13598 22.46875,22.49999 0,10.2795 -7.00683,18.97639 -16.46875,21.625 l 0,20.625 6.21875,0 c 0.126,0 0.21875,0.0928 0.21875,0.21875 l 0,10.25 c 0,0.1259 -0.0928,0.21875 -0.21875,0.21875 l -6.21875,0 0,3.875 6.21875,0 c 0.12098,-0.035 0.21875,0.0928 0.21875,0.21875 l 0,10.21875 c 0,0.1259 -0.0928,0.25 -0.21875,0.25 l -6.21875,0 -7.8125,0 -4.218752,0 0,-45.875 c -9.46194,-2.64861 -16.46875,-11.34551 -16.46875,-21.625 0,-11.97763 9.510121,-21.89377 21.343752,-22.49999 z m 1.15625,8.8125 c -7.596242,0 -13.656252,6.09122 -13.656252,13.68749 0,7.59632 6.06001,13.625 13.656252,13.625 7.59627,0 13.625,-6.02868 13.625,-13.625 0,-7.59627 -6.02873,-13.68749 -13.625,-13.68749 z" | |||||
id="rect3044" | |||||
inkscape:connector-curvature="0" /> | |||||
<rect | |||||
style="opacity:0.90000000000000002;fill:#137bd4;fill-opacity:1;stroke:none" | |||||
id="rect3127" | |||||
width="116.58292" | |||||
height="116.58292" | |||||
x="141.70854" | |||||
y="176.42212" | |||||
rx="0" | |||||
inkscape:export-filename="/home/guillaume/Desktop/path3129.png" | |||||
inkscape:export-xdpi="216" | |||||
inkscape:export-ydpi="216" /> | |||||
<path | |||||
inkscape:export-ydpi="216.93787" | |||||
inkscape:export-xdpi="216.93787" | |||||
sodipodi:nodetypes="ssccccssssccssssccsssssss" | |||||
inkscape:connector-curvature="0" | |||||
id="path3129" | |||||
d="m 199.99999,189.71357 c -12.36404,0 -22.47187,10.13599 -22.47187,22.5 0,10.27949 6.99118,18.97952 16.45312,21.62813 l 0,45.87187 4.21875,0 7.81876,0 6.21562,0 c 0.12595,0 0.225,-0.0991 0.225,-0.225 l 0,-10.2375 c 0,-0.12594 -0.10402,-0.26004 -0.225,-0.225 l -6.21562,0 0,-3.85312 6.21562,0 c 0.12595,0 0.225,-0.0991 0.225,-0.225 l 0,-10.2375 c 0,-0.12595 -0.099,-0.225 -0.225,-0.225 l -6.21562,0 0,-20.64375 c 9.46192,-2.64861 16.45312,-11.34863 16.45312,-21.62813 0,-12.36402 -10.10787,-22.5 -22.47187,-22.5 z m 0,8.83125 c 7.59627,0 13.64063,6.07247 13.64063,13.66875 0,7.59632 -6.04436,13.64063 -13.64063,13.64063 -7.59624,0 -13.64062,-6.04431 -13.64062,-13.64063 0,-7.59628 6.04438,-13.66875 13.64062,-13.66875 z" | |||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3013);enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" | |||||
inkscape:export-filename="/home/guillaume/Desktop/path3129.png" /> | |||||
</svg> | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<!-- Created with Inkscape (http://www.inkscape.org/) --> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
id="svg3039" | |||||
version="1.1" | |||||
inkscape:version="0.48.4 r9939" | |||||
width="400" | |||||
height="300" | |||||
sodipodi:docname="lesspass.svg"> | |||||
<metadata | |||||
id="metadata3045"> | |||||
<rdf:RDF> | |||||
<cc:Work | |||||
rdf:about=""> | |||||
<dc:format>image/svg+xml</dc:format> | |||||
<dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||||
<dc:title></dc:title> | |||||
</cc:Work> | |||||
</rdf:RDF> | |||||
</metadata> | |||||
<defs | |||||
id="defs3043"> | |||||
<filter | |||||
id="filter5169" | |||||
style="color-interpolation-filters:sRGB;" | |||||
inkscape:label="Drop Shadow"> | |||||
<feFlood | |||||
id="feFlood5171" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite5173" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur5175" | |||||
in="composite" | |||||
stdDeviation="2" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset5177" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite5179" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
<filter | |||||
id="filter3013" | |||||
style="color-interpolation-filters:sRGB;" | |||||
inkscape:label="Drop Shadow"> | |||||
<feFlood | |||||
id="feFlood3015" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite3017" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur3019" | |||||
in="composite" | |||||
stdDeviation="1" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset3021" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite3023" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
<filter | |||||
id="filter3097" | |||||
style="color-interpolation-filters:sRGB;" | |||||
inkscape:label="Drop Shadow"> | |||||
<feFlood | |||||
id="feFlood3099" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite3101" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur3103" | |||||
in="composite" | |||||
stdDeviation="2" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset3105" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite3107" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
</defs> | |||||
<sodipodi:namedview | |||||
pagecolor="#b1b1b1" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1333" | |||||
inkscape:window-height="744" | |||||
id="namedview3041" | |||||
showgrid="false" | |||||
inkscape:zoom="1.99" | |||||
inkscape:cx="182.29418" | |||||
inkscape:cy="134.46388" | |||||
inkscape:window-x="33" | |||||
inkscape:window-y="24" | |||||
inkscape:window-maximized="1" | |||||
inkscape:current-layer="svg3039" | |||||
showguides="true" | |||||
inkscape:guide-bbox="true" | |||||
inkscape:showpageshadow="false" /> | |||||
<rect | |||||
style="opacity:0.90000000000000002;fill:#0275d8;fill-opacity:1;stroke:none" | |||||
id="rect3843" | |||||
width="120.10646" | |||||
height="120.10646" | |||||
x="95.2127" | |||||
y="225.32025" | |||||
rx="24.021292" | |||||
transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)" | |||||
inkscape:export-filename="/home/guillaume/workspace/oslab/lesspass/app/assets/images/logo.png" | |||||
inkscape:export-xdpi="115.20001" | |||||
inkscape:export-ydpi="115.20001" /> | |||||
<path | |||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3013);enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" | |||||
d="m 311.57912,47 c -12.36404,0 -22.47187,10.13599 -22.47187,22.5 0,10.27949 6.99118,18.97952 16.45312,21.62813 l 0,45.87187 4.21875,0 7.81876,0 6.21562,0 c 0.12595,0 0.225,-0.0991 0.225,-0.225 l 0,-10.2375 c 0,-0.12594 -0.10402,-0.26004 -0.225,-0.225 l -6.21562,0 0,-3.85312 6.21562,0 c 0.12595,0 0.225,-0.0991 0.225,-0.225 l 0,-10.2375 c 0,-0.12595 -0.099,-0.225 -0.225,-0.225 l -6.21562,0 0,-20.64375 C 327.0598,88.47952 334.051,79.7795 334.051,69.5 334.051,57.13598 323.94312,47 311.57912,47 z m 0,8.83125 c 7.59627,0 13.64063,6.07247 13.64063,13.66875 0,7.59632 -6.04436,13.64063 -13.64063,13.64063 -7.59624,0 -13.64062,-6.04431 -13.64062,-13.64063 0,-7.59628 6.04438,-13.66875 13.64062,-13.66875 z" | |||||
id="path3056" | |||||
inkscape:connector-curvature="0" | |||||
sodipodi:nodetypes="ssccccssssccssssccsssssss" | |||||
inkscape:export-xdpi="115.20001" | |||||
inkscape:export-ydpi="115.20001" | |||||
inkscape:export-filename="/home/guillaume/workspace/oslab/lesspass/app/assets/images/logo.png" /> | |||||
<path | |||||
style="opacity:0.9;fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter3097)" | |||||
d="m 101.39259,17.016268 c -5.751278,0.275685 -11.432799,2.620297 -15.843752,7.03125 L 34.580088,75.01626 c -9.410033,9.41003 -9.410033,24.55872 0,33.96875 l 50.96875,50.96875 c 9.410033,9.41003 24.558722,9.41003 33.968752,0 l 50.96875,-50.96875 c 9.41003,-9.41003 9.41003,-24.55872 0,-33.96875 L 119.51759,24.047518 c -4.99908,-4.99908 -11.60689,-7.343692 -18.125,-7.03125 z m 0,30.000002 c 0.38173,-0.0196 0.76987,0 1.15625,0 12.364,0 22.46875,10.13598 22.46875,22.49999 0,10.2795 -7.00683,18.97639 -16.46875,21.625 l 0,20.625 6.21875,0 c 0.126,0 0.21875,0.0928 0.21875,0.21875 l 0,10.25 c 0,0.1259 -0.0928,0.21875 -0.21875,0.21875 l -6.21875,0 0,3.875 6.21875,0 c 0.12098,-0.035 0.21875,0.0928 0.21875,0.21875 l 0,10.21875 c 0,0.1259 -0.0928,0.25 -0.21875,0.25 l -6.21875,0 -7.8125,0 -4.218752,0 0,-45.875 c -9.46194,-2.64861 -16.46875,-11.34551 -16.46875,-21.625 0,-11.97763 9.510121,-21.89377 21.343752,-22.49999 z m 1.15625,8.8125 c -7.596242,0 -13.656252,6.09122 -13.656252,13.68749 0,7.59632 6.06001,13.625 13.656252,13.625 7.59627,0 13.625,-6.02868 13.625,-13.625 0,-7.59627 -6.02873,-13.68749 -13.625,-13.68749 z" | |||||
id="rect3044" | |||||
inkscape:connector-curvature="0" /> | |||||
<rect | |||||
style="opacity:0.90000000000000002;fill:#137bd4;fill-opacity:1;stroke:none" | |||||
id="rect3127" | |||||
width="116.58292" | |||||
height="116.58292" | |||||
x="141.70854" | |||||
y="176.42212" | |||||
rx="0" | |||||
inkscape:export-filename="/home/guillaume/Desktop/path3129.png" | |||||
inkscape:export-xdpi="216" | |||||
inkscape:export-ydpi="216" /> | |||||
<path | |||||
inkscape:export-ydpi="216.93787" | |||||
inkscape:export-xdpi="216.93787" | |||||
sodipodi:nodetypes="ssccccssssccssssccsssssss" | |||||
inkscape:connector-curvature="0" | |||||
id="path3129" | |||||
d="m 199.99999,189.71357 c -12.36404,0 -22.47187,10.13599 -22.47187,22.5 0,10.27949 6.99118,18.97952 16.45312,21.62813 l 0,45.87187 4.21875,0 7.81876,0 6.21562,0 c 0.12595,0 0.225,-0.0991 0.225,-0.225 l 0,-10.2375 c 0,-0.12594 -0.10402,-0.26004 -0.225,-0.225 l -6.21562,0 0,-3.85312 6.21562,0 c 0.12595,0 0.225,-0.0991 0.225,-0.225 l 0,-10.2375 c 0,-0.12595 -0.099,-0.225 -0.225,-0.225 l -6.21562,0 0,-20.64375 c 9.46192,-2.64861 16.45312,-11.34863 16.45312,-21.62813 0,-12.36402 -10.10787,-22.5 -22.47187,-22.5 z m 0,8.83125 c 7.59627,0 13.64063,6.07247 13.64063,13.66875 0,7.59632 -6.04436,13.64063 -13.64063,13.64063 -7.59624,0 -13.64062,-6.04431 -13.64062,-13.64063 0,-7.59628 6.04438,-13.66875 13.64062,-13.66875 z" | |||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3013);enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" | |||||
inkscape:export-filename="/home/guillaume/Desktop/path3129.png" /> | |||||
</svg> |
@@ -1,178 +1,178 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<!-- Created with Inkscape (http://www.inkscape.org/) --> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
id="svg3039" | |||||
version="1.1" | |||||
inkscape:version="0.48.4 r9939" | |||||
width="400" | |||||
height="90" | |||||
sodipodi:docname="logo-white.svg" | |||||
inkscape:export-filename="/home/guillaume/workspace/lesspass/lesspass/app/1-header/logo.png" | |||||
inkscape:export-xdpi="80" | |||||
inkscape:export-ydpi="80"> | |||||
<metadata | |||||
id="metadata3045"> | |||||
<rdf:RDF> | |||||
<cc:Work | |||||
rdf:about=""> | |||||
<dc:format>image/svg+xml</dc:format> | |||||
<dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||||
<dc:title></dc:title> | |||||
</cc:Work> | |||||
</rdf:RDF> | |||||
</metadata> | |||||
<defs | |||||
id="defs3043"> | |||||
<filter | |||||
id="filter5169" | |||||
inkscape:label="Drop Shadow" | |||||
color-interpolation-filters="sRGB"> | |||||
<feFlood | |||||
id="feFlood5171" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite5173" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur5175" | |||||
stdDeviation="2" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset5177" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite5179" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
<filter | |||||
id="filter3013" | |||||
inkscape:label="Drop Shadow" | |||||
color-interpolation-filters="sRGB"> | |||||
<feFlood | |||||
id="feFlood3015" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite3017" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur3019" | |||||
stdDeviation="1" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset3021" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite3023" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
<filter | |||||
id="filter3097" | |||||
inkscape:label="Drop Shadow" | |||||
color-interpolation-filters="sRGB"> | |||||
<feFlood | |||||
id="feFlood3099" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite3101" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur3103" | |||||
stdDeviation="2" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset3105" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite3107" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
</defs> | |||||
<sodipodi:namedview | |||||
pagecolor="#006699" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1333" | |||||
inkscape:window-height="744" | |||||
id="namedview3041" | |||||
showgrid="false" | |||||
inkscape:zoom="0.60866769" | |||||
inkscape:cx="191.43771" | |||||
inkscape:cy="112.67144" | |||||
inkscape:window-x="33" | |||||
inkscape:window-y="24" | |||||
inkscape:window-maximized="1" | |||||
inkscape:current-layer="svg3039" | |||||
showguides="true" | |||||
inkscape:guide-bbox="true" | |||||
inkscape:showpageshadow="false" | |||||
inkscape:snap-bbox="false" | |||||
showborder="true" /> | |||||
<path | |||||
style="opacity:0.90000000000000002;fill:#0275d8;fill-opacity:0.94117647;stroke:none;filter:url(#filter3097)" | |||||
d="m 101.39259,-192.98373 c -5.751278,0.27568 -11.432799,2.6203 -15.843752,7.03125 l -50.96875,50.96874 c -9.410033,9.41003 -9.410033,24.55872 0,33.96875 l 50.96875,50.96875 c 9.410033,9.41003 24.558722,9.41003 33.968752,0 l 50.96875,-50.96875 c 9.41003,-9.41003 9.41003,-24.55872 0,-33.96875 l -50.96875,-50.96874 c -4.99908,-4.99908 -11.60689,-7.34369 -18.125,-7.03125 z m 0,30 c 0.38173,-0.0196 0.76987,0 1.15625,0 12.364,0 22.46875,10.13598 22.46875,22.49999 0,10.2795 -7.00683,18.97639 -16.46875,21.625 l 0,20.625 6.21875,0 c 0.126,0 0.21875,0.0928 0.21875,0.21875 l 0,10.25 c 0,0.1259 -0.0928,0.21875 -0.21875,0.21875 l -6.21875,0 0,3.875 6.21875,0 c 0.12098,-0.035 0.21875,0.0928 0.21875,0.21875 l 0,10.21875 c 0,0.1259 -0.0928,0.25 -0.21875,0.25 l -6.21875,0 -7.8125,0 -4.218752,0 0,-45.875 c -9.46194,-2.64861 -16.46875,-11.34551 -16.46875,-21.625 0,-11.97763 9.510121,-21.89377 21.343752,-22.49999 z m 1.15625,8.8125 c -7.596242,0 -13.656252,6.09122 -13.656252,13.68749 0,7.59632 6.06001,13.625 13.656252,13.625 7.59627,0 13.625,-6.02868 13.625,-13.625 0,-7.59627 -6.02873,-13.68749 -13.625,-13.68749 z" | |||||
id="rect3044" | |||||
inkscape:connector-curvature="0" | |||||
transform="matrix(0.54970382,0,0,0.54970382,-10.596,110.68652)" | |||||
inkscape:export-filename="/home/guillaume/workspace/lesspass/lesspass/app/navbar/logo-white.png" | |||||
inkscape:export-xdpi="63" | |||||
inkscape:export-ydpi="63" /> | |||||
<text | |||||
xml:space="preserve" | |||||
style="font-size:72.84078979000000231px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:100%;letter-spacing:0px;word-spacing:0px;fill:#666666;fill-opacity:1;stroke:none;font-family:Manga Temple;-inkscape-font-specification:Manga Temple" | |||||
x="98.325371" | |||||
y="72.074348" | |||||
id="text3050" | |||||
sodipodi:linespacing="100%" | |||||
inkscape:export-filename="/home/guillaume/workspace/lesspass/lesspass/app/navbar/logo-white.png" | |||||
inkscape:export-xdpi="63" | |||||
inkscape:export-ydpi="63"><tspan | |||||
sodipodi:role="line" | |||||
id="tspan3052" | |||||
x="98.325371" | |||||
y="72.074348" | |||||
style="font-size:87.40895080999997901px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:100%;letter-spacing:-4.14706755000000005px;fill:#323232;fill-opacity:1;font-family:Ubuntu;-inkscape-font-specification:Ubuntu">lesspass</tspan></text> | |||||
</svg> | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<!-- Created with Inkscape (http://www.inkscape.org/) --> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
id="svg3039" | |||||
version="1.1" | |||||
inkscape:version="0.48.4 r9939" | |||||
width="400" | |||||
height="90" | |||||
sodipodi:docname="logo-white.svg" | |||||
inkscape:export-filename="/home/guillaume/workspace/lesspass/lesspass/app/1-header/logo.png" | |||||
inkscape:export-xdpi="80" | |||||
inkscape:export-ydpi="80"> | |||||
<metadata | |||||
id="metadata3045"> | |||||
<rdf:RDF> | |||||
<cc:Work | |||||
rdf:about=""> | |||||
<dc:format>image/svg+xml</dc:format> | |||||
<dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||||
<dc:title></dc:title> | |||||
</cc:Work> | |||||
</rdf:RDF> | |||||
</metadata> | |||||
<defs | |||||
id="defs3043"> | |||||
<filter | |||||
id="filter5169" | |||||
inkscape:label="Drop Shadow" | |||||
color-interpolation-filters="sRGB"> | |||||
<feFlood | |||||
id="feFlood5171" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite5173" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur5175" | |||||
stdDeviation="2" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset5177" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite5179" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
<filter | |||||
id="filter3013" | |||||
inkscape:label="Drop Shadow" | |||||
color-interpolation-filters="sRGB"> | |||||
<feFlood | |||||
id="feFlood3015" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite3017" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur3019" | |||||
stdDeviation="1" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset3021" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite3023" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
<filter | |||||
id="filter3097" | |||||
inkscape:label="Drop Shadow" | |||||
color-interpolation-filters="sRGB"> | |||||
<feFlood | |||||
id="feFlood3099" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite3101" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur3103" | |||||
stdDeviation="2" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset3105" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite3107" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
</defs> | |||||
<sodipodi:namedview | |||||
pagecolor="#006699" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1333" | |||||
inkscape:window-height="744" | |||||
id="namedview3041" | |||||
showgrid="false" | |||||
inkscape:zoom="0.60866769" | |||||
inkscape:cx="191.43771" | |||||
inkscape:cy="112.67144" | |||||
inkscape:window-x="33" | |||||
inkscape:window-y="24" | |||||
inkscape:window-maximized="1" | |||||
inkscape:current-layer="svg3039" | |||||
showguides="true" | |||||
inkscape:guide-bbox="true" | |||||
inkscape:showpageshadow="false" | |||||
inkscape:snap-bbox="false" | |||||
showborder="true" /> | |||||
<path | |||||
style="opacity:0.90000000000000002;fill:#0275d8;fill-opacity:0.94117647;stroke:none;filter:url(#filter3097)" | |||||
d="m 101.39259,-192.98373 c -5.751278,0.27568 -11.432799,2.6203 -15.843752,7.03125 l -50.96875,50.96874 c -9.410033,9.41003 -9.410033,24.55872 0,33.96875 l 50.96875,50.96875 c 9.410033,9.41003 24.558722,9.41003 33.968752,0 l 50.96875,-50.96875 c 9.41003,-9.41003 9.41003,-24.55872 0,-33.96875 l -50.96875,-50.96874 c -4.99908,-4.99908 -11.60689,-7.34369 -18.125,-7.03125 z m 0,30 c 0.38173,-0.0196 0.76987,0 1.15625,0 12.364,0 22.46875,10.13598 22.46875,22.49999 0,10.2795 -7.00683,18.97639 -16.46875,21.625 l 0,20.625 6.21875,0 c 0.126,0 0.21875,0.0928 0.21875,0.21875 l 0,10.25 c 0,0.1259 -0.0928,0.21875 -0.21875,0.21875 l -6.21875,0 0,3.875 6.21875,0 c 0.12098,-0.035 0.21875,0.0928 0.21875,0.21875 l 0,10.21875 c 0,0.1259 -0.0928,0.25 -0.21875,0.25 l -6.21875,0 -7.8125,0 -4.218752,0 0,-45.875 c -9.46194,-2.64861 -16.46875,-11.34551 -16.46875,-21.625 0,-11.97763 9.510121,-21.89377 21.343752,-22.49999 z m 1.15625,8.8125 c -7.596242,0 -13.656252,6.09122 -13.656252,13.68749 0,7.59632 6.06001,13.625 13.656252,13.625 7.59627,0 13.625,-6.02868 13.625,-13.625 0,-7.59627 -6.02873,-13.68749 -13.625,-13.68749 z" | |||||
id="rect3044" | |||||
inkscape:connector-curvature="0" | |||||
transform="matrix(0.54970382,0,0,0.54970382,-10.596,110.68652)" | |||||
inkscape:export-filename="/home/guillaume/workspace/lesspass/lesspass/app/navbar/logo-white.png" | |||||
inkscape:export-xdpi="63" | |||||
inkscape:export-ydpi="63" /> | |||||
<text | |||||
xml:space="preserve" | |||||
style="font-size:72.84078979000000231px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:100%;letter-spacing:0px;word-spacing:0px;fill:#666666;fill-opacity:1;stroke:none;font-family:Manga Temple;-inkscape-font-specification:Manga Temple" | |||||
x="98.325371" | |||||
y="72.074348" | |||||
id="text3050" | |||||
sodipodi:linespacing="100%" | |||||
inkscape:export-filename="/home/guillaume/workspace/lesspass/lesspass/app/navbar/logo-white.png" | |||||
inkscape:export-xdpi="63" | |||||
inkscape:export-ydpi="63"><tspan | |||||
sodipodi:role="line" | |||||
id="tspan3052" | |||||
x="98.325371" | |||||
y="72.074348" | |||||
style="font-size:87.40895080999997901px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:100%;letter-spacing:-4.14706755000000005px;fill:#323232;fill-opacity:1;font-family:Ubuntu;-inkscape-font-specification:Ubuntu">lesspass</tspan></text> | |||||
</svg> |
@@ -1,190 +1,190 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<!-- Created with Inkscape (http://www.inkscape.org/) --> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
id="svg3039" | |||||
version="1.1" | |||||
inkscape:version="0.48.4 r9939" | |||||
width="222" | |||||
height="60" | |||||
sodipodi:docname="logo.svg"> | |||||
<metadata | |||||
id="metadata3045"> | |||||
<rdf:RDF> | |||||
<cc:Work | |||||
rdf:about=""> | |||||
<dc:format>image/svg+xml</dc:format> | |||||
<dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||||
<dc:title></dc:title> | |||||
</cc:Work> | |||||
</rdf:RDF> | |||||
</metadata> | |||||
<defs | |||||
id="defs3043"> | |||||
<filter | |||||
id="filter5169" | |||||
style="color-interpolation-filters:sRGB" | |||||
inkscape:label="Drop Shadow"> | |||||
<feFlood | |||||
id="feFlood5171" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite5173" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur5175" | |||||
stdDeviation="2" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset5177" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite5179" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
<filter | |||||
id="filter3013" | |||||
style="color-interpolation-filters:sRGB" | |||||
inkscape:label="Drop Shadow"> | |||||
<feFlood | |||||
id="feFlood3015" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite3017" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur3019" | |||||
stdDeviation="1" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset3021" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite3023" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
<filter | |||||
id="filter3097" | |||||
style="color-interpolation-filters:sRGB" | |||||
inkscape:label="Drop Shadow"> | |||||
<feFlood | |||||
id="feFlood3099" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite3101" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur3103" | |||||
stdDeviation="2" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset3105" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite3107" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
</defs> | |||||
<sodipodi:namedview | |||||
pagecolor="#d8e4ea" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="1" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1333" | |||||
inkscape:window-height="744" | |||||
id="namedview3041" | |||||
showgrid="false" | |||||
inkscape:zoom="2.814285" | |||||
inkscape:cx="117.43149" | |||||
inkscape:cy="55.142702" | |||||
inkscape:window-x="33" | |||||
inkscape:window-y="24" | |||||
inkscape:window-maximized="1" | |||||
inkscape:current-layer="svg3039" | |||||
showguides="true" | |||||
inkscape:guide-bbox="true" | |||||
inkscape:showpageshadow="false" /> | |||||
<g | |||||
id="g3771" | |||||
transform="translate(-3.6657726,5.800689e-8)" | |||||
inkscape:export-filename="/home/guillaume/workspace/oslab/lesspass/design/images/logotext.png" | |||||
inkscape:export-xdpi="68.400002" | |||||
inkscape:export-ydpi="68.400002"> | |||||
<rect | |||||
inkscape:export-ydpi="115.20001" | |||||
inkscape:export-xdpi="115.20001" | |||||
inkscape:export-filename="/home/guillaume/workspace/oslab/lesspass/app/assets/images/logo.png" | |||||
transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)" | |||||
rx="8.0070972" | |||||
y="25.29842" | |||||
x="-17.127987" | |||||
height="40.035488" | |||||
width="40.035488" | |||||
id="rect3843" | |||||
style="opacity:0.9;fill:#0275d8;fill-opacity:1;stroke:none" /> | |||||
<path | |||||
transform="matrix(0.33333334,0,0,0.33333334,7.4464645,-3.3467343)" | |||||
inkscape:export-filename="/home/guillaume/workspace/oslab/lesspass/app/assets/images/logo.png" | |||||
inkscape:export-ydpi="115.20001" | |||||
inkscape:export-xdpi="115.20001" | |||||
sodipodi:nodetypes="ssccccssssccssssccsssssss" | |||||
inkscape:connector-curvature="0" | |||||
id="path3056" | |||||
d="m 79.920829,55.040201 c -12.36404,0 -22.47187,10.13599 -22.47187,22.5 0,10.27949 6.99118,18.97952 16.45312,21.62813 l 0,45.871869 4.21875,0 7.81876,0 6.21562,0 c 0.12595,0 0.225,-0.0991 0.225,-0.225 l 0,-10.2375 c 0,-0.12594 -0.10402,-0.26004 -0.225,-0.225 l -6.21562,0 0,-3.85312 6.21562,0 c 0.12595,0 0.225,-0.0991 0.225,-0.225 l 0,-10.2375 c 0,-0.12595 -0.099,-0.225 -0.225,-0.225 l -6.21562,0 0,-20.643749 c 9.46192,-2.64861 16.453121,-11.34863 16.453121,-21.62813 0,-12.36402 -10.107881,-22.5 -22.471881,-22.5 z m 0,8.83125 c 7.59627,0 13.64063,6.07247 13.64063,13.66875 0,7.59632 -6.04436,13.64063 -13.64063,13.64063 -7.59624,0 -13.64062,-6.04431 -13.64062,-13.64063 0,-7.59628 6.04438,-13.66875 13.64062,-13.66875 z" | |||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3013);enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" /> | |||||
<text | |||||
sodipodi:linespacing="125%" | |||||
id="text3355" | |||||
y="42.039795" | |||||
x="67.547058" | |||||
style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#cfd2da;fill-opacity:1;stroke:none;font-family:sans-serif" | |||||
xml:space="preserve"><tspan | |||||
style="font-size:35px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#252830;fill-opacity:1;font-family:Overpass;-inkscape-font-specification:Overpass" | |||||
y="42.039795" | |||||
x="67.547058" | |||||
id="tspan3357" | |||||
sodipodi:role="line">LessPass</tspan></text> | |||||
</g> | |||||
</svg> | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<!-- Created with Inkscape (http://www.inkscape.org/) --> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
id="svg3039" | |||||
version="1.1" | |||||
inkscape:version="0.48.4 r9939" | |||||
width="222" | |||||
height="60" | |||||
sodipodi:docname="logo.svg"> | |||||
<metadata | |||||
id="metadata3045"> | |||||
<rdf:RDF> | |||||
<cc:Work | |||||
rdf:about=""> | |||||
<dc:format>image/svg+xml</dc:format> | |||||
<dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||||
<dc:title></dc:title> | |||||
</cc:Work> | |||||
</rdf:RDF> | |||||
</metadata> | |||||
<defs | |||||
id="defs3043"> | |||||
<filter | |||||
id="filter5169" | |||||
style="color-interpolation-filters:sRGB" | |||||
inkscape:label="Drop Shadow"> | |||||
<feFlood | |||||
id="feFlood5171" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite5173" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur5175" | |||||
stdDeviation="2" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset5177" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite5179" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
<filter | |||||
id="filter3013" | |||||
style="color-interpolation-filters:sRGB" | |||||
inkscape:label="Drop Shadow"> | |||||
<feFlood | |||||
id="feFlood3015" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite3017" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur3019" | |||||
stdDeviation="1" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset3021" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite3023" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
<filter | |||||
id="filter3097" | |||||
style="color-interpolation-filters:sRGB" | |||||
inkscape:label="Drop Shadow"> | |||||
<feFlood | |||||
id="feFlood3099" | |||||
flood-opacity="0.4" | |||||
flood-color="rgb(0,0,0)" | |||||
result="flood" /> | |||||
<feComposite | |||||
id="feComposite3101" | |||||
in2="SourceGraphic" | |||||
in="flood" | |||||
operator="in" | |||||
result="composite1" /> | |||||
<feGaussianBlur | |||||
id="feGaussianBlur3103" | |||||
stdDeviation="2" | |||||
result="blur" /> | |||||
<feOffset | |||||
id="feOffset3105" | |||||
dx="4" | |||||
dy="4" | |||||
result="offset" /> | |||||
<feComposite | |||||
id="feComposite3107" | |||||
in2="offset" | |||||
in="SourceGraphic" | |||||
operator="over" | |||||
result="composite2" /> | |||||
</filter> | |||||
</defs> | |||||
<sodipodi:namedview | |||||
pagecolor="#d8e4ea" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="1" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1333" | |||||
inkscape:window-height="744" | |||||
id="namedview3041" | |||||
showgrid="false" | |||||
inkscape:zoom="2.814285" | |||||
inkscape:cx="117.43149" | |||||
inkscape:cy="55.142702" | |||||
inkscape:window-x="33" | |||||
inkscape:window-y="24" | |||||
inkscape:window-maximized="1" | |||||
inkscape:current-layer="svg3039" | |||||
showguides="true" | |||||
inkscape:guide-bbox="true" | |||||
inkscape:showpageshadow="false" /> | |||||
<g | |||||
id="g3771" | |||||
transform="translate(-3.6657726,5.800689e-8)" | |||||
inkscape:export-filename="/home/guillaume/workspace/oslab/lesspass/design/images/logotext.png" | |||||
inkscape:export-xdpi="68.400002" | |||||
inkscape:export-ydpi="68.400002"> | |||||
<rect | |||||
inkscape:export-ydpi="115.20001" | |||||
inkscape:export-xdpi="115.20001" | |||||
inkscape:export-filename="/home/guillaume/workspace/oslab/lesspass/app/assets/images/logo.png" | |||||
transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)" | |||||
rx="8.0070972" | |||||
y="25.29842" | |||||
x="-17.127987" | |||||
height="40.035488" | |||||
width="40.035488" | |||||
id="rect3843" | |||||
style="opacity:0.9;fill:#0275d8;fill-opacity:1;stroke:none" /> | |||||
<path | |||||
transform="matrix(0.33333334,0,0,0.33333334,7.4464645,-3.3467343)" | |||||
inkscape:export-filename="/home/guillaume/workspace/oslab/lesspass/app/assets/images/logo.png" | |||||
inkscape:export-ydpi="115.20001" | |||||
inkscape:export-xdpi="115.20001" | |||||
sodipodi:nodetypes="ssccccssssccssssccsssssss" | |||||
inkscape:connector-curvature="0" | |||||
id="path3056" | |||||
d="m 79.920829,55.040201 c -12.36404,0 -22.47187,10.13599 -22.47187,22.5 0,10.27949 6.99118,18.97952 16.45312,21.62813 l 0,45.871869 4.21875,0 7.81876,0 6.21562,0 c 0.12595,0 0.225,-0.0991 0.225,-0.225 l 0,-10.2375 c 0,-0.12594 -0.10402,-0.26004 -0.225,-0.225 l -6.21562,0 0,-3.85312 6.21562,0 c 0.12595,0 0.225,-0.0991 0.225,-0.225 l 0,-10.2375 c 0,-0.12595 -0.099,-0.225 -0.225,-0.225 l -6.21562,0 0,-20.643749 c 9.46192,-2.64861 16.453121,-11.34863 16.453121,-21.62813 0,-12.36402 -10.107881,-22.5 -22.471881,-22.5 z m 0,8.83125 c 7.59627,0 13.64063,6.07247 13.64063,13.66875 0,7.59632 -6.04436,13.64063 -13.64063,13.64063 -7.59624,0 -13.64062,-6.04431 -13.64062,-13.64063 0,-7.59628 6.04438,-13.66875 13.64062,-13.66875 z" | |||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3013);enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" /> | |||||
<text | |||||
sodipodi:linespacing="125%" | |||||
id="text3355" | |||||
y="42.039795" | |||||
x="67.547058" | |||||
style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#cfd2da;fill-opacity:1;stroke:none;font-family:sans-serif" | |||||
xml:space="preserve"><tspan | |||||
style="font-size:35px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#252830;fill-opacity:1;font-family:Overpass;-inkscape-font-specification:Overpass" | |||||
y="42.039795" | |||||
x="67.547058" | |||||
id="tspan3357" | |||||
sodipodi:role="line">LessPass</tspan></text> | |||||
</g> | |||||
</svg> |
@@ -1,2 +1,2 @@ | |||||
User-agent: * | |||||
User-agent: * | |||||
Allow: / | Allow: / |
@@ -1,31 +1,11 @@ | |||||
<!DOCTYPE html> | <!DOCTYPE html> | ||||
<html> | <html> | ||||
<head> | |||||
<head> | |||||
<meta charset="utf-8"> | <meta charset="utf-8"> | ||||
<title>LessPass</title> | |||||
<meta name="viewport" content="width=device-width, initial-scale=1"> | |||||
<!-- favicons --> | |||||
<link rel="apple-touch-icon" sizes="57x57" href="/apple-touch-icon-57x57.png"> | |||||
<link rel="apple-touch-icon" sizes="60x60" href="/apple-touch-icon-60x60.png"> | |||||
<link rel="apple-touch-icon" sizes="72x72" href="/apple-touch-icon-72x72.png"> | |||||
<link rel="apple-touch-icon" sizes="76x76" href="/apple-touch-icon-76x76.png"> | |||||
<link rel="apple-touch-icon" sizes="114x114" href="/apple-touch-icon-114x114.png"> | |||||
<link rel="apple-touch-icon" sizes="120x120" href="/apple-touch-icon-120x120.png"> | |||||
<link rel="apple-touch-icon" sizes="144x144" href="/apple-touch-icon-144x144.png"> | |||||
<link rel="apple-touch-icon" sizes="152x152" href="/apple-touch-icon-152x152.png"> | |||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-180x180.png"> | |||||
<link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32"> | |||||
<link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192"> | |||||
<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96"> | |||||
<link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16"> | |||||
<link rel="manifest" href="/manifest.json"> | |||||
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"> | |||||
<meta name="msapplication-TileColor" content="#da532c"> | |||||
<meta name="msapplication-TileImage" content="/mstile-144x144.png"> | |||||
<meta name="theme-color" content="#252830"> | |||||
</head> | |||||
<body> | |||||
<div id="app"></div> | |||||
<script src="dist/bundle.js"></script> | |||||
</body> | |||||
<title>lesspass</title> | |||||
</head> | |||||
<body> | |||||
<div id="app"></div> | |||||
<!-- built files will be auto injected --> | |||||
</body> | |||||
</html> | </html> |
@@ -1,77 +1,86 @@ | |||||
{ | { | ||||
"name": "lesspass.com", | |||||
"name": "lesspass", | |||||
"version": "1.0.0", | "version": "1.0.0", | ||||
"description": "lesspass single page app for https://lesspass.com", | |||||
"main": "app/app.js", | |||||
"description": "open source password manager", | |||||
"author": "Guillaume Vincent <guillaume@oslab.fr>", | |||||
"scripts": { | "scripts": { | ||||
"predev": "npm install", | |||||
"dev": "webpack-dev-server --inline --hot --host 0.0.0.0", | |||||
"prebuild": "rimraf dist && npm prune && npm install", | |||||
"build": "NODE_ENV=production webpack -p", | |||||
"start": "NODE_ENV=production node server.js" | |||||
"dev": "node build/dev-server.js", | |||||
"build": "rimraf dist && mkdirp dist && ncp static dist/static && cross-env NODE_ENV=production webpack --progress --hide-modules --config build/webpack.prod.conf.js", | |||||
"unit": "karma start test/unit/karma.conf.js --single-run", | |||||
"e2e": "node test/e2e/runner.js", | |||||
"test": "npm run unit && npm run e2e" | |||||
}, | }, | ||||
"repository": { | |||||
"type": "git", | |||||
"url": "git+ssh://git@github.com/guillaumevincent/lesspass.git" | |||||
}, | |||||
"keywords": [ | |||||
"keepass", | |||||
"lesspass" | |||||
], | |||||
"author": "Guillaume Vincent", | |||||
"license": "MIT", | |||||
"bugs": { | |||||
"url": "https://github.com/guillaumevincent/lesspass/issues" | |||||
}, | |||||
"homepage": "https://github.com/guillaumevincent/lesspass#readme", | |||||
"dependencies": { | "dependencies": { | ||||
"bootstrap": "^4.0.0-alpha.2", | "bootstrap": "^4.0.0-alpha.2", | ||||
"clipboard": "^1.5.8", | "clipboard": "^1.5.8", | ||||
"es6-promise": "^3.1.2", | |||||
"express": "^4.13.4", | "express": "^4.13.4", | ||||
"font-awesome": "^4.5.0", | "font-awesome": "^4.5.0", | ||||
"hint.css": "^2.1.0", | |||||
"jquery": "^2.2.1", | "jquery": "^2.2.1", | ||||
"lesspass": "^1.1.1", | "lesspass": "^1.1.1", | ||||
"tether": "^1.2.0", | "tether": "^1.2.0", | ||||
"toastr": "^2.1.2", | "toastr": "^2.1.2", | ||||
"vue": "^1.0.16", | |||||
"vue": "^1.0.17", | |||||
"vue-i18n": "^2.4.0", | "vue-i18n": "^2.4.0", | ||||
"vue-resource": "^0.7.0", | "vue-resource": "^0.7.0", | ||||
"vue-router": "^0.7.11" | |||||
"vue-router": "^0.7.11", | |||||
"whatwg-fetch": "^0.11.0" | |||||
}, | }, | ||||
"devDependencies": { | "devDependencies": { | ||||
"babel-core": "^6.5.1", | |||||
"babel-loader": "^6.2.3", | |||||
"babel-plugin-transform-runtime": "^6.5.0", | |||||
"babel-preset-es2015": "^6.5.0", | |||||
"babel-runtime": "^5.8.34", | |||||
"css-loader": "^0.23.1", | |||||
"file-loader": "^0.8.5", | |||||
"babel-core": "^6.0.0", | |||||
"babel-loader": "^6.0.0", | |||||
"babel-plugin-transform-runtime": "^6.0.0", | |||||
"babel-preset-es2015": "^6.0.0", | |||||
"babel-preset-stage-2": "^6.0.0", | |||||
"babel-runtime": "^5.8.0", | |||||
"chromedriver": "^2.21.2", | |||||
"connect-history-api-fallback": "^1.1.0", | |||||
"cross-env": "^1.0.7", | |||||
"cross-spawn": "^2.1.5", | |||||
"css-loader": "^0.23.0", | |||||
"eslint": "^2.4.0", | |||||
"eslint-config-airbnb": "^6.1.0", | |||||
"eslint-config-standard": "^5.1.0", | |||||
"eslint-friendly-formatter": "^1.2.2", | |||||
"eslint-loader": "^1.3.0", | |||||
"eslint-plugin-html": "^1.3.0", | |||||
"eslint-plugin-promise": "^1.0.8", | |||||
"eslint-plugin-react": "^4.2.2", | |||||
"eslint-plugin-standard": "^1.3.2", | |||||
"eventsource-polyfill": "^0.9.6", | |||||
"exports-loader": "^0.6.3", | |||||
"express": "^4.13.3", | |||||
"extract-text-webpack-plugin": "^1.0.1", | |||||
"file-loader": "^0.8.4", | |||||
"function-bind": "^1.0.2", | |||||
"html-webpack-plugin": "^2.8.1", | |||||
"http-proxy-middleware": "^0.11.0", | |||||
"imports-loader": "^0.6.5", | "imports-loader": "^0.6.5", | ||||
"jshint": "latest", | |||||
"mocha": "latest", | |||||
"node-sass": "^3.4.2", | |||||
"node-static": "latest", | |||||
"nodemon": "latest", | |||||
"npm-run-all": "latest", | |||||
"offline-plugin": "^2.0.4", | |||||
"rimraf": "^2.5.1", | |||||
"style-loader": "^0.13.0", | |||||
"template-html-loader": "0.0.3", | |||||
"uglify-js": "^2.6.2", | |||||
"inject-loader": "^2.0.1", | |||||
"isparta-loader": "^2.0.0", | |||||
"jasmine-core": "^2.4.1", | |||||
"json-loader": "^0.5.4", | |||||
"karma": "^0.13.15", | |||||
"karma-coverage": "^0.5.5", | |||||
"karma-jasmine": "^0.3.6", | |||||
"karma-phantomjs-launcher": "^1.0.0", | |||||
"karma-sourcemap-loader": "^0.3.7", | |||||
"karma-spec-reporter": "0.0.24", | |||||
"karma-webpack": "^1.7.0", | |||||
"mkdirp": "^0.5.1", | |||||
"ncp": "^2.0.0", | |||||
"nightwatch": "^0.8.18", | |||||
"phantomjs-prebuilt": "^2.1.3", | |||||
"rimraf": "^2.5.0", | |||||
"selenium-server": "2.52.0", | |||||
"url-loader": "^0.5.7", | "url-loader": "^0.5.7", | ||||
"vue-hot-reload-api": "^1.3.2", | |||||
"vue-html-loader": "^1.1.0", | |||||
"vue-loader": "^8.1.4", | |||||
"vue-hot-reload-api": "^1.2.0", | |||||
"vue-html-loader": "^1.0.0", | |||||
"vue-loader": "^8.1.3", | |||||
"vue-style-loader": "^1.0.0", | "vue-style-loader": "^1.0.0", | ||||
"vueify": "^8.3.5", | |||||
"vueify-insert-css": "^1.0.0", | |||||
"webpack": "^1.12.14", | |||||
"webpack-dev-server": "^1.14.1" | |||||
}, | |||||
"babel": { | |||||
"presets": [ | |||||
"es2015" | |||||
] | |||||
"webpack": "^1.12.2", | |||||
"webpack-dev-middleware": "^1.4.0", | |||||
"webpack-hot-middleware": "^2.6.0", | |||||
"webpack-merge": "^0.8.3" | |||||
} | } | ||||
} | } |
@@ -1,12 +0,0 @@ | |||||
var express = require('express'); | |||||
var app = express(); | |||||
app.use('/dist', express.static(__dirname + '/dist')); | |||||
app.get('/', function (req, res) { | |||||
res.sendFile(__dirname + '/index.html'); | |||||
}); | |||||
app.listen(8080, function () { | |||||
console.log('LessPass frontend listening on port 8080'); | |||||
}); |
@@ -0,0 +1,34 @@ | |||||
<style> | |||||
@import '../node_modules/bootstrap/dist/css/bootstrap.css'; | |||||
@import '../node_modules/font-awesome/css/font-awesome.css'; | |||||
@import '../node_modules/toastr/build/toastr.css'; | |||||
body { | |||||
background-color: #F5F5F5; | |||||
color: #323232; | |||||
} | |||||
.form-control, .btn, .input-group-addon { | |||||
border-radius: 0 !important; | |||||
} | |||||
.p-y-6 { | |||||
padding-top: 6rem !important; | |||||
padding-bottom: 6rem !important; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="app"> | |||||
<login-bar></login-bar> | |||||
<router-view></router-view> | |||||
</div> | |||||
</template> | |||||
<script type="text/ecmascript-6"> | |||||
import LoginBar from './landing-page/LoginBar/LoginBar'; | |||||
export default { | |||||
components: { | |||||
LoginBar, | |||||
}, | |||||
}; | |||||
</script> |
@@ -0,0 +1,7 @@ | |||||
<template> | |||||
<div id="index"> | |||||
<div class="container text-xs-center"> | |||||
index | |||||
</div> | |||||
</div> | |||||
</template> |
@@ -0,0 +1,64 @@ | |||||
<style> | |||||
#login { | |||||
padding-top: 2rem; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="login"> | |||||
<div class="container"> | |||||
<div class="row"> | |||||
<div class="col-md-6 col-md-offset-3 col-lg-4 col-lg-offset-4"> | |||||
<form v-on:submit.prevent> | |||||
<fieldset class="form-group"> | |||||
<label class="sr-only" for="email">{{$t('login.Email')}}</label> | |||||
<input type="email" class="form-control form-control-sm" id="email" | |||||
placeholder="{{$t('login.Email')}}" | |||||
v-model="credentials.email"> | |||||
</fieldset> | |||||
<fieldset class="form-group"> | |||||
<label class="sr-only" for="password">{{$t('login.Password')}}</label> | |||||
<input type="password" class="form-control form-control-sm" id="password" | |||||
placeholder="{{$t('login.Password')}}" | |||||
v-model="credentials.password"> | |||||
</fieldset> | |||||
<button type="submit" class="btn btn-primary btn-sm btn-block" @click="signin()"> | |||||
{{$t('login.Sign_in')}} | |||||
</button> | |||||
</form> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</template> | |||||
<script type="text/ecmascript-6"> | |||||
import auth from '../services/auth'; | |||||
import router from '../router'; | |||||
import logging from '../services/logging'; | |||||
export default { | |||||
data() { | |||||
return { | |||||
user: auth.user, | |||||
credentials: { | |||||
email: '', | |||||
password: '', | |||||
}, | |||||
}; | |||||
}, | |||||
methods: { | |||||
signin() { | |||||
const credentials = { | |||||
email: this.credentials.email, | |||||
password: this.credentials.password, | |||||
}; | |||||
auth.login(credentials) | |||||
.then(() => { | |||||
router.go('/app/'); | |||||
}) | |||||
.catch(() => { | |||||
logging.error(this.$t('login.credentials_invalids')); | |||||
}); | |||||
}, | |||||
}, | |||||
}; | |||||
</script> |
@@ -0,0 +1,11 @@ | |||||
<template> | |||||
<div id="register"> | |||||
<div class="container text-xs-center"> | |||||
<div class="row"> | |||||
<div class="col-lg-12 m-t-3"> | |||||
{{{$t('register.beta')}}} | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</template> |
@@ -0,0 +1,69 @@ | |||||
<style> | |||||
#features { | |||||
background-color: #025aa5; | |||||
color: #F5F5F5; | |||||
} | |||||
#features a { | |||||
color: inherit; | |||||
text-decoration: underline; | |||||
} | |||||
#features .features__card { | |||||
background-color: transparent; | |||||
border: none; | |||||
border-radius: 0 !important; | |||||
margin: 1em; | |||||
} | |||||
#features .features__card img { | |||||
height: 120px; | |||||
} | |||||
@media (min-width: 768px) { | |||||
#features .features__card { | |||||
width: 25% | |||||
} | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="features"> | |||||
<div class="container p-y-6"> | |||||
<div id="features__cards" class="row text-xs-center"> | |||||
<div class="card-deck-wrapper"> | |||||
<div class="card-deck"> | |||||
<div class="card features__card p-t-2"> | |||||
<img class="card-img-top" src="./responsive.png" alt="Card image cap"> | |||||
<div class="card-block"> | |||||
<h4 class="card-title">{{{ $t('features.responsive_title') }}}</h4> | |||||
<p class="card-text">{{{ $t('features.responsive') }}}</p> | |||||
</div> | |||||
</div> | |||||
<div class="card features__card p-t-2"> | |||||
<img class="card-img-top" src="./no-cloud.png" alt="Card image cap"> | |||||
<div class="card-block"> | |||||
<h4 class="card-title">{{{ $t('features.no_cloud_title') }}}</h4> | |||||
<p class="card-text">{{{ $t('features.no_cloud') }}}</p> | |||||
</div> | |||||
</div> | |||||
<div class="card features__card p-t-2"> | |||||
<img class="card-img-top" src="./open-source.png" alt="Card image cap"> | |||||
<div class="card-block"> | |||||
<h4 class="card-title">{{{ $t('features.open_source_title') }}}</h4> | |||||
<p class="card-text">{{{ $t('features.open_source') }}}</p> | |||||
</div> | |||||
</div> | |||||
<div class="card features__card p-t-2"> | |||||
<img class="card-img-top" src="./free.png" alt="Card image cap"> | |||||
<div class="card-block"> | |||||
<h4 class="card-title">{{{ $t('features.free_title') }}}</h4> | |||||
<p class="card-text">{{{ $t('features.free') }}}</p> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</template> |
@@ -0,0 +1,25 @@ | |||||
<style> | |||||
#footer { | |||||
background-color: #323232; | |||||
color: #F5F5F5; | |||||
font-size: 0.8em; | |||||
} | |||||
#footer a { | |||||
color: inherit; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="footer"> | |||||
<div class="container p-t-1"> | |||||
<div class="row"> | |||||
<div class="col-lg-12 text-xs-center"> | |||||
<p> | |||||
© LessPass | |||||
- {{ $t('footer.created_by') }} <a href="mailto:guillaume@oslab.fr">Guillaume Vincent</a> | |||||
</p> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</template> |
@@ -0,0 +1,15 @@ | |||||
<style> | |||||
#hero{ | |||||
padding-top: 2em; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="hero"> | |||||
<div class="container"> | |||||
<h1 id="hero__title">{{{ $t('headlines.title') }}}</h1> | |||||
<p class="lead hidden-xs-down"> | |||||
<b>LessPass</b> {{ $t('headlines.subtitle') }} | |||||
</p> | |||||
</div> | |||||
</div> | |||||
</template> |
@@ -0,0 +1,65 @@ | |||||
<style> | |||||
#how-it-works { | |||||
background-color: #025aa5; | |||||
color: #F5F5F5; | |||||
} | |||||
#how-it-works #how-it-works__self_hosted { | |||||
background-color: #323232; | |||||
color: #F5F5F5; | |||||
padding: 1em 1em 0; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="how-it-works"> | |||||
<div class="container p-y-6"> | |||||
<div class="row p-y-3"> | |||||
<div class="col-lg-8"> | |||||
<h3>{{{ $t('how_it_works.title') }}}</h3> | |||||
<p> | |||||
{{{ $t('how_it_works.detail') }}} | |||||
</p> | |||||
</div> | |||||
</div> | |||||
<div class="row p-y-3"> | |||||
<div class="col-lg-6 p-t-3"> | |||||
<h5>{{{ $t('how_it_works.always_sync') }}}</h5> | |||||
<p> | |||||
{{{ $t('how_it_works.always_sync_detail') }}} | |||||
</p> | |||||
</div> | |||||
<div class="col-lg-6"> | |||||
<img src="./responsive.png" alt="logo" class="img-fluid"> | |||||
</div> | |||||
</div> | |||||
<div class="row p-y-3"> | |||||
<div class="col-lg-6 col-lg-offset-6 m-t-3"> | |||||
<h5>{{{ $t('how_it_works.derivation') }}}</h5> | |||||
<p> | |||||
{{{ $t('how_it_works.derivation_detail') }}} | |||||
</p> | |||||
</div> | |||||
</div> | |||||
<div class="row p-y-3"> | |||||
<div class="col-lg-6 p-y-2"> | |||||
<h5>{{{ $t('how_it_works.self_hosting') }}}</h5> | |||||
<p> | |||||
{{{ $t('how_it_works.self_hosting_detail') }}} | |||||
</p> | |||||
<pre id="how-it-works__self_hosted"><code>git clone https://github.com/lesspass/lesspass | |||||
cd lesspass | |||||
docker-compose up -d</code> | |||||
</pre> | |||||
</div> | |||||
<div class="col-lg-6 hidden-xs-down"> | |||||
<div class="row p-t-3"> | |||||
<div class="col-sm-4"><img src="./git-logo2.png" alt="logo" class="img-fluid"></div> | |||||
<div class="col-sm-4"><img src="./docker-logo2.png" alt="logo" class="img-fluid"></div> | |||||
<div class="col-sm-4"><img src="./logo2.png" alt="logo" class="img-fluid"></div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</template> |
@@ -0,0 +1,71 @@ | |||||
<style> | |||||
@media (min-width: 480px) { | |||||
#header { | |||||
padding: 15vh 0; | |||||
} | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="landing-page"> | |||||
<lesspass-navbar></lesspass-navbar> | |||||
<div id="header" class="container"> | |||||
<div class="row"> | |||||
<div class="col-md-5"> | |||||
<lesspass-headlines></lesspass-headlines> | |||||
</div> | |||||
<div class="col-md-7"> | |||||
<password-generator></password-generator> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<lesspass-features></lesspass-features> | |||||
<lesspass-testimonials></lesspass-testimonials> | |||||
<lesspass-howitworks></lesspass-howitworks> | |||||
<lesspass-footer></lesspass-footer> | |||||
</div> | |||||
<!--<div id="hero"> | |||||
<div class="container"> | |||||
<div class="row hero__headlines"> | |||||
<div class="col-md-6"> | |||||
<h1 id="hero__title">{{{ $t('headlines.title') }}}</h1> | |||||
<p class="lead hidden-xs-down"> | |||||
<b>LessPass</b> {{ $t('headlines.subtitle') }} | |||||
</p> | |||||
</div> | |||||
<div class="col-md-6"> | |||||
<password-generator></password-generator> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<lesspass-features></lesspass-features> | |||||
<lesspass-testimonials></lesspass-testimonials> | |||||
<lesspass-howitworks></lesspass-howitworks> | |||||
<lesspass-footer></lesspass-footer>--> | |||||
</template> | |||||
<script type="text/ecmascript-6"> | |||||
import LesspassNavbar from './Navbar/Navbar'; | |||||
import LesspassHeadlines from './Headlines/Headlines'; | |||||
import PasswordGenerator from './PasswordGenerator/PasswordGenerator'; | |||||
import LesspassFeatures from './Features/Features'; | |||||
import LesspassHowitworks from './HowItWorks/HowItWorks'; | |||||
import LesspassTestimonials from './Testimonials/Testimonials'; | |||||
import LesspassFooter from './Footer/Footer'; | |||||
export default { | |||||
data() { | |||||
return {}; | |||||
}, | |||||
components: { | |||||
LesspassNavbar, | |||||
LesspassHeadlines, | |||||
PasswordGenerator, | |||||
LesspassFeatures, | |||||
LesspassHowitworks, | |||||
LesspassTestimonials, | |||||
LesspassFooter | |||||
}, | |||||
}; | |||||
</script> |
@@ -0,0 +1,33 @@ | |||||
<style> | |||||
#login-bar { | |||||
background-color: #424242; | |||||
height: 38px; | |||||
color: #F5F5F5; | |||||
} | |||||
#login-bar .nav-link { | |||||
padding-left: 1em; | |||||
padding-right: 1em; | |||||
color: inherit; | |||||
} | |||||
#login-bar .nav-link { | |||||
line-height: 38px; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="login-bar"> | |||||
<div class="container"> | |||||
<nav class="nav nav-inline pull-right"> | |||||
<a class="nav-link" v-bind:class="{ 'bg-primary': $route.path=='/login/'}" | |||||
v-link="{ path: '/login/' }"> | |||||
<i class="fa fa-lock"></i> {{ $t('login.login') }} | |||||
</a> | |||||
<a class="nav-link" v-bind:class="{ 'bg-primary': $route.path=='/register/' || $route.path=='/'}" | |||||
v-link="{ path: '/register/' }"> | |||||
<i class="fa fa-user-plus"></i> {{ $t('login.register') }} | |||||
</a> | |||||
</nav> | |||||
</div> | |||||
</div> | |||||
</template> |
@@ -0,0 +1,30 @@ | |||||
<style> | |||||
#navbar { | |||||
background-color: white; | |||||
border-bottom: 1px solid #e8e8e8; | |||||
margin: 0; | |||||
} | |||||
#navbar #navbar__logo { | |||||
height: 32px; | |||||
} | |||||
#navbar .navbar { | |||||
padding: 1em 0; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="navbar"> | |||||
<div class="container"> | |||||
<nav class="navbar"> | |||||
<ul class="nav navbar-nav"> | |||||
<li class="nav-item"> | |||||
<a href="https://lesspass.com/"> | |||||
<img id="navbar__logo" src="./logo.png" alt="logo"> | |||||
</a> | |||||
</li> | |||||
</ul> | |||||
</nav> | |||||
</div> | |||||
</div> | |||||
</template> |
@@ -0,0 +1,224 @@ | |||||
<style> | |||||
@media (min-width: 480px) { | |||||
#password-generator{ | |||||
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .2), 0 1px 1px 0 rgba(0, 0, 0, .14), 0 2px 1px -1px rgba(0, 0, 0, .12); | |||||
background-color: #ffffff; | |||||
border: none; | |||||
color: #323232; | |||||
padding: 2em; | |||||
} | |||||
} | |||||
#password-generator .c-input, #password-generator a { | |||||
color: inherit; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="password-generator"> | |||||
<form> | |||||
<div class="form-group row"> | |||||
<div class="col-lg-6 m-t-1"> | |||||
<label for="pg-email" class="sr-only"> | |||||
{{ $t('passwordgenerator.who_are_you') }} | |||||
</label> | |||||
<input id="pg-email" | |||||
class="form-control" | |||||
type="text" | |||||
placeholder="{{ $t('passwordgenerator.who_are_you') }}" | |||||
value="{{email}}" | |||||
v-model="email" | |||||
v-on:blur="updateMasterPassword"> | |||||
</div> | |||||
<div class="col-lg-6 m-t-1"> | |||||
<label for="pg-masterpassword" class="sr-only"> | |||||
{{ $t('passwordgenerator.what_is_your_secret') }} | |||||
</label> | |||||
<div class="input-group"> | |||||
<input id="pg-masterpassword" | |||||
class="form-control" | |||||
type="password" | |||||
placeholder="{{ $t('passwordgenerator.what_is_your_secret') }}" | |||||
v-model="password" | |||||
v-on:blur="updateMasterPassword"> | |||||
<span class="input-group-btn" @click="changeType('pg-masterpassword')"> | |||||
<button class="btn btn-secondary" type="button"><i class="fa fa-eye"></i></button> | |||||
</span> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="form-group row"> | |||||
<div class="col-lg-12"> | |||||
<label for="pg-site" class="sr-only"> | |||||
{{ $t('passwordgenerator.where_are_you_going') }} | |||||
</label> | |||||
<input id="pg-site" | |||||
class="form-control" | |||||
type="text" | |||||
placeholder="{{ $t('passwordgenerator.where_are_you_going') }}" | |||||
v-model="site"> | |||||
</div> | |||||
</div> | |||||
<div class="form-group row"> | |||||
<div class="col-lg-12"> | |||||
<label for="generatedPassword" class="sr-only"> | |||||
{{ $t('passwordgenerator.generated_password') }} | |||||
</label> | |||||
<div class="input-group"> | |||||
<input type="text" id="generatedPassword" class="form-control hint--bottom" | |||||
placeholder="{{ $t('passwordgenerator.generated_password') }}" | |||||
v-model="generatedPassword" | |||||
v-bind:disabled="!generatedPassword"> | |||||
<span class="input-group-btn"> | |||||
<button id="copyBtn" data-clipboard-target="#generatedPassword" | |||||
class="btn btn-primary" type="button"> | |||||
{{ $t('passwordgenerator.copy') }} | |||||
</button> | |||||
</span> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="form-group row"> | |||||
<div class="col-lg-12"> | |||||
<i class="fa fa-cog"></i> | |||||
<a data-toggle="collapse" data-parent="#accordion" href="#advancedOptions" | |||||
aria-expanded="true" aria-controls="advancedOptions"> | |||||
{{ $t('passwordgenerator.advanced_options') }} | |||||
</a> | |||||
<div id="advancedOptions" class="panel-collapse collapse m-t-1" role="tabpanel" | |||||
aria-labelledby="advancedOptions"> | |||||
<div class="row"> | |||||
<div class="col-lg-5"> | |||||
<label class="c-input c-checkbox"> | |||||
<input type="checkbox" id="lowercase" value="lowercase" | |||||
v-model="passwordInfo.settings" checked> | |||||
<span class="c-indicator"></span> | |||||
{{ $t('passwordgenerator.lowercase_options') }} | |||||
</label> | |||||
</div> | |||||
<div class="col-lg-7"> | |||||
<label class="c-input c-checkbox"> | |||||
<input type="checkbox" id="uppercase" value="uppercase" | |||||
v-model="passwordInfo.settings" checked> | |||||
<span class="c-indicator"></span> | |||||
{{ $t('passwordgenerator.uppercase_options') }} | |||||
</label> | |||||
</div> | |||||
</div> | |||||
<div class="row"> | |||||
<div class="col-lg-5"> | |||||
<label class="c-input c-checkbox"> | |||||
<input type="checkbox" id="numbers" value="numbers" | |||||
v-model="passwordInfo.settings" | |||||
checked> | |||||
<span class="c-indicator"></span> | |||||
{{ $t('passwordgenerator.numbers_options') }} | |||||
</label> | |||||
</div> | |||||
<div class="col-lg-7"> | |||||
<label class="c-input c-checkbox"> | |||||
<input type="checkbox" id="symbols" value="symbols" | |||||
v-model="passwordInfo.settings" | |||||
checked> | |||||
<span class="c-indicator"></span> | |||||
{{ $t('passwordgenerator.symbols_options') }} | |||||
</label> | |||||
</div> | |||||
</div> | |||||
<div class="row m-t-1"> | |||||
<div class="col-lg-5 m-b-1"> | |||||
<label for="passwordLength" class="sr-only"> | |||||
{{ $t('passwordgenerator.length') }} | |||||
</label> | |||||
<div class="input-group input-group-sm"> | |||||
<span class="input-group-addon" id="passwordLengthAddon"> | |||||
{{ $t('passwordgenerator.length') }} | |||||
</span> | |||||
<input type="number" class="form-control" id="passwordLength" | |||||
aria-describedby="passwordLengthAddon" v-model="passwordInfo.length" | |||||
value="12" min="6" max="64"> | |||||
</div> | |||||
</div> | |||||
<div class="col-lg-4 m-b-1"> | |||||
<label for="passwordCounter" class="sr-only"> | |||||
{{ $t('passwordgenerator.counter') }} | |||||
</label> | |||||
<div class="input-group input-group-sm"> | |||||
<span class="input-group-addon" id="passwordCounterAddon"> | |||||
{{ $t('passwordgenerator.counter') }} | |||||
</span> | |||||
<input type="number" class="form-control" id="passwordCounter" | |||||
aria-describedby="passwordCounterAddon" | |||||
v-model="passwordInfo.counter" | |||||
value="1" min="1" max="100"> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</form> | |||||
</div> | |||||
</template> | |||||
<script type="text/ecmascript-6"> | |||||
import lesspass from 'lesspass' | |||||
import Clipboard from 'clipboard'; | |||||
import 'bootstrap/dist/js/umd/collapse'; | |||||
export default { | |||||
data() { | |||||
return { | |||||
email: '', | |||||
password: '', | |||||
site: '', | |||||
passwordInfo: { | |||||
counter: 1, | |||||
length: 12, | |||||
settings: ["lowercase", "uppercase", "numbers", "symbols"] | |||||
}, | |||||
masterPassword: '' | |||||
}; | |||||
}, | |||||
methods: { | |||||
updateMasterPassword(event) { | |||||
var self = this; | |||||
var email = this.email; | |||||
var password = this.password; | |||||
if (email && password) { | |||||
lesspass.createMasterPassword(email, password).then(function (masterPassword) { | |||||
self.$set('masterPassword', masterPassword); | |||||
console.log(masterPassword); | |||||
}); | |||||
} | |||||
}, | |||||
changeType(id) { | |||||
if (document.getElementById(id).type == 'password') { | |||||
document.getElementById(id).type = 'text' | |||||
} else { | |||||
document.getElementById(id).type = 'password' | |||||
} | |||||
} | |||||
}, | |||||
computed: { | |||||
generatedPassword() { | |||||
var masterPassword = this.masterPassword; | |||||
var site = this.site; | |||||
if (masterPassword && site) { | |||||
var entry = { | |||||
site: site, | |||||
password: this.passwordInfo | |||||
}; | |||||
return lesspass.createPassword(masterPassword, entry); | |||||
} | |||||
return ''; | |||||
} | |||||
} | |||||
} | |||||
var cb = new Clipboard('#copyBtn'); | |||||
cb.on('success', function (e) { | |||||
e.clearSelection(); | |||||
}); | |||||
cb.on('error', function (e) { | |||||
}); | |||||
</script> |
@@ -0,0 +1,42 @@ | |||||
<style> | |||||
#testimonials { | |||||
background-color: #323232; | |||||
color: #F5F5F5; | |||||
} | |||||
#testimonials .thumbnail { | |||||
width: 42px; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="testimonials"> | |||||
<div class="container p-y-3"> | |||||
<div class="row m-y-3"> | |||||
<div class="col-lg-10 col-lg-offset-1"> | |||||
<div class="media"> | |||||
<a class="media-left" href="#"> | |||||
<img src="./el.jpg" alt="Edouard Lopez" class="img-circle thumbnail"> | |||||
</a> | |||||
<div class="media-body"> | |||||
<h5 class="media-heading">{{{ $t('feedback.feedback_1') }}}</h5> | |||||
<p>{{{ $t('feedback.feedback_1_author') }}}</p> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="row m-y-3"> | |||||
<div class="col-lg-10 col-lg-offset-1"> | |||||
<div class="media"> | |||||
<div class="media-body text-xs-right"> | |||||
<h5 class="media-heading">{{{ $t('feedback.feedback_2') }}}</h5> | |||||
<p>{{{ $t('feedback.feedback_2_author') }}}</p> | |||||
</div> | |||||
<a class="media-right" href="#"> | |||||
<img src="./gv.jpg" alt="guillaume vincent" class="img-circle thumbnail"> | |||||
</a> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</template> |
@@ -0,0 +1,139 @@ | |||||
const I18n = require('vue-i18n'); | |||||
const Vue = require('vue'); | |||||
const locales = { | |||||
en: { | |||||
lang: 'en', | |||||
headlines: { | |||||
title: 'Open Source<br>Password Manager', | |||||
subtitle: 'replaces all your tools that record your passwords as LastPass, 1Password, Keepass, Excel spreadsheet, post it, etc ...', | |||||
}, | |||||
footer: { | |||||
created_by: 'created by', | |||||
}, | |||||
passwordgenerator: { | |||||
who_are_you: 'Email / Username', | |||||
what_is_your_secret: 'Password', | |||||
where_are_you_going: 'Site (e.g. twitter.com)', | |||||
copy: 'Copy', | |||||
advanced_options: 'Advanced options', | |||||
lowercase_options: 'lowercase (a‑z)', | |||||
uppercase_options: 'UPPERCASE (A‑Z)', | |||||
numbers_options: 'numbers (0‑9)', | |||||
symbols_options: 'symbols (@&%?)', | |||||
counter: 'Counter', | |||||
generated_password: 'Generated password', | |||||
length: 'Length', | |||||
}, | |||||
features: { | |||||
no_cloud_title: 'No storage', | |||||
responsive_title: 'Available everywhere', | |||||
open_source_title: 'Open Source', | |||||
free_title: 'Free', | |||||
no_cloud: 'LessPass regenerates your passwords when you need them. No cloud storage is required', | |||||
responsive: 'LessPass is a web application and works on all devices (computer, smartphone, tablet and your smartTV)', | |||||
open_source: 'LessPass is <strong>open-source</strong>. So its security can be audited. Source code is available on <a href="https://github.com/lesspass/core">Github</a>', | |||||
free: 'LessPass is free<br>and always will be', | |||||
}, | |||||
how_it_works: { | |||||
title: 'How LessPass works ?', | |||||
detail: 'LessPass is a password manager that guarantees you to generate the same password on the basis of unique information you provide. You can use LessPass to create passwords for various internet services (social networks , email, server passwords , ...).', | |||||
always_sync: 'No synchronisation', | |||||
always_sync_detail: 'LessPass don’t need any cloud storage. It’s a webapp, with some Javascript, that derive your password in a secure way.', | |||||
derivation: 'Math and Crypto', | |||||
derivation_detail: 'LessPass use different key derivation functions to transform your personal information into an unique password. These transformations are robust against brute force attacks.', | |||||
self_hosting: 'Self hosted ', | |||||
self_hosting_detail: 'LessPass can be hosted on your server :', | |||||
}, | |||||
feedback: { | |||||
feedback_1: 'Finally a security tool that I did not need to trust.', | |||||
feedback_1_author: 'Édouard Lopez, LessPass Team Member', | |||||
feedback_2: 'I no longer need a personal cloud to manage my passwords.<br>One secret and I have access to my passwords everywhere.', | |||||
feedback_2_author: 'Guillaume Vincent, LessPass Founder', | |||||
}, | |||||
login: { | |||||
login: 'Login', | |||||
Email: 'Email', | |||||
Password: 'Password', | |||||
Sign_in: 'Sign In', | |||||
register: 'Register', | |||||
welcome: 'Login successful, welcome on LessPass', | |||||
credentials_invalids: '<strong>Invalid Email or Password.</strong><br> Please try again.', | |||||
}, | |||||
register: { | |||||
beta: 'Inscriptions are closed for now. To obtain an invitation to LessPass, send us an <a href="mailto:contact@oslab.fr">email</a>', | |||||
}, | |||||
}, | |||||
fr: { | |||||
lang: 'fr', | |||||
headlines: { | |||||
title: 'Gestionnaire de mot de passe open source', | |||||
subtitle: 'remplace tous vos outils qui sauvegardent vos mots de passe comme Lastpass, 1password, Keepass, tableur Excel, post it, etc...', | |||||
}, | |||||
footer: { | |||||
created_by: 'créé par', | |||||
}, | |||||
passwordgenerator: { | |||||
who_are_you: 'Email / Nom d\'utilisateur', | |||||
what_is_your_secret: 'Mot de passe', | |||||
where_are_you_going: 'Site (ex: twitter.com)', | |||||
copy: 'Copier', | |||||
advanced_options: 'Options avancées', | |||||
lowercase_options: 'minuscules (a‑z)', | |||||
uppercase_options: 'MAJUSCULES (A‑Z)', | |||||
numbers_options: 'nombres (0‑9)', | |||||
symbols_options: 'caractères spéciaux (@&%?)', | |||||
counter: 'Version', | |||||
generated_password: 'Mot de passe généré', | |||||
length: 'Longueur', | |||||
}, | |||||
features: { | |||||
no_cloud_title: 'Pas de stockage', | |||||
responsive_title: 'Disponible partout', | |||||
open_source_title: 'Open Source', | |||||
free_title: 'Gratuit', | |||||
no_cloud: 'LessPass régénère vos mots de passe à chaque fois que vous en avez besoin.<br>Aucun stockage sur le cloud n\'est nécessaire', | |||||
responsive: 'LessPass est une application web qui fonctionne<br>sur tous les appareils :<br>ordinateur, smartphone, tablette et smartTV', | |||||
open_source: 'LessPass est open source. Le code source est disponible sur <a href="https://github.com/lesspass/core">Github</a>, vous pouvez l\'auditer', | |||||
free: 'LessPass est gratuit et le sera toujours', | |||||
}, | |||||
how_it_works: { | |||||
title: 'Comment fonctionne LessPass ?', | |||||
detail: 'LessPass est un gestionnaire de mot de passe qui n\'enregistre pas vos mots de passe. Il les regénère sur la base d\'informations uniques que vous lui fournissez. Vous pouvez donc utiliser LessPass pour créer des mots de passe pour vos différents services internet (Réseaux sociaux, mails, mots de passe serveurs, ...).', | |||||
always_sync: 'Pas besoin de synchronisation', | |||||
always_sync_detail: 'Vous n\'avez plus besoin de synchroniser sur le cloud vos coffres fort pour mots de passe. LessPass est une application web qui dérive vos mots de passe de manière sécurisée.', | |||||
derivation: 'Mathématique et chiffrement', | |||||
derivation_detail: 'LastPass utilise différentes fonctions de dérivation pour transformer vos informations personnelles en un mot de passe unique. Ces transformations sont robustes aux attaques par force brute.', | |||||
self_hosting: 'Auto Hébergement', | |||||
self_hosting_detail: 'Vous pouvez héberger LessPass sur votre serveur :', | |||||
}, | |||||
feedback: { | |||||
feedback_1: 'Enfin un outil de sécurité a qui je n\'ai pas besoin de faire confiance.', | |||||
feedback_1_author: 'Édouard Lopez,<br> membre de l\'équipe de LessPass', | |||||
feedback_2: 'Je n\'ai plus besoin d\'un cloud personnel pour gérer mes mots de passe.<br> Une seule phrase secrete et j\'ai accès à mes mots de passe partout.', | |||||
feedback_2_author: 'Guillaume Vincent,<br> créateur de LessPass', | |||||
}, | |||||
login: { | |||||
login: 'Connexion', | |||||
Email: 'Email', | |||||
Password: 'Mot de passe', | |||||
Sign_in: 'Se connecter', | |||||
register: 'Inscription', | |||||
welcome: 'Connexion réussie, bienvenue sur LessPass', | |||||
credentials_invalids: 'L\'adresse e-mail et/ou mot de passe sont invalides', | |||||
}, | |||||
register: { | |||||
beta: 'Les inscriptions sont pour l\'intant fermées. Pour obtenir une invitation, envoyez nous un <a href="mailto:contact@oslab.fr">email</a>', | |||||
}, | |||||
}, | |||||
}; | |||||
const browserLanguage = (navigator.language || navigator.browserLanguage).split('-')[0]; | |||||
const lang = browserLanguage in locales ? browserLanguage : 'en'; | |||||
Vue.use(I18n, { | |||||
lang, | |||||
locales, | |||||
}); | |||||
module.exports = locales; |
@@ -0,0 +1,3 @@ | |||||
import 'vue'; | |||||
import './locales'; | |||||
import './router'; |
@@ -0,0 +1,51 @@ | |||||
import Vue from 'vue'; | |||||
import Router from 'vue-router'; | |||||
import App from './App'; | |||||
Vue.use(Router); | |||||
const router = new Router(); | |||||
import LandingPage from './landing-page/LandingPage'; | |||||
import LoginPage from './app/Login'; | |||||
import RegisterPage from './app/Register'; | |||||
import LessPassConnected from './app/Index'; | |||||
router.map({ | |||||
'/': { | |||||
auth: true, | |||||
component: LessPassConnected, | |||||
}, | |||||
'/login/': { | |||||
component: LoginPage, | |||||
}, | |||||
'/register/': { | |||||
component: RegisterPage, | |||||
}, | |||||
'/welcome/': { | |||||
component: LandingPage, | |||||
}, | |||||
}); | |||||
router.redirect({ | |||||
'*': '/', | |||||
}); | |||||
router.start(App, '#app'); | |||||
import Auth from './services/auth'; | |||||
Auth.checkAuth(); | |||||
router.beforeEach(transition => { | |||||
alert(transition.to.auth); | |||||
if (transition.to.auth && !Auth.user.authenticated) { | |||||
alert(Auth.user.authenticated); | |||||
transition.redirect('/welcome/'); | |||||
} else { | |||||
transition.next(); | |||||
} | |||||
}); | |||||
module.exports = router; |
@@ -0,0 +1,82 @@ | |||||
import logging from './logging'; | |||||
function checkStatus(response) { | |||||
if (response.status >= 200 && response.status < 300) { | |||||
return response; | |||||
} | |||||
const error = new Error(response.statusText); | |||||
error.response = response; | |||||
throw error; | |||||
} | |||||
function parseJSON(response) { | |||||
return response.json(); | |||||
} | |||||
module.exports = { | |||||
user: { | |||||
authenticated: false, | |||||
}, | |||||
login(credential) { | |||||
return fetch('/api/sessions/', { | |||||
method: 'post', | |||||
headers: { | |||||
Accept: 'application/json', | |||||
'Content-Type': 'application/json', | |||||
}, | |||||
body: JSON.stringify(credential), | |||||
}).then(checkStatus) | |||||
.then(parseJSON); | |||||
}, | |||||
login2(context, credentials, callback) { | |||||
const self = this; | |||||
fetch('/users.html'); | |||||
context.$http.post('/api/sessions/', credentials).then( | |||||
response => { | |||||
localStorage.setItem('token', response.data.token); | |||||
self.user.authenticated = true; | |||||
logging.success(this.$t('login.welcome')); | |||||
if (callback) { | |||||
callback(); | |||||
} | |||||
}, | |||||
() => { | |||||
logging.error(this.$t('login.credentials_invalids')); | |||||
} | |||||
); | |||||
}, | |||||
register(context, user, callback) { | |||||
context.$http.post('/api/users/', user).then( | |||||
() => { | |||||
if (callback) { | |||||
callback(); | |||||
} | |||||
}, | |||||
() => { | |||||
logging.warning(this.$t('register.beta')); | |||||
} | |||||
); | |||||
}, | |||||
logout(callback) { | |||||
localStorage.removeItem('token'); | |||||
this.user.authenticated = false; | |||||
if (callback) { | |||||
callback(); | |||||
} | |||||
}, | |||||
checkAuth() { | |||||
const jwt = localStorage.getItem('token'); | |||||
this.user.authenticated = !!jwt; | |||||
}, | |||||
getAuthHeader() { | |||||
const token = localStorage.getItem('token'); | |||||
return { | |||||
Authorization: `Bearer ${token}!`, | |||||
}; | |||||
}, | |||||
}; |
@@ -0,0 +1,34 @@ | |||||
import toastr from 'toastr'; | |||||
toastr.options = { | |||||
closeButton: true, | |||||
debug: false, | |||||
newestOnTop: true, | |||||
progressBar: false, | |||||
positionClass: 'toast-top-center', | |||||
preventDuplicates: false, | |||||
onclick: null, | |||||
showDuration: '300', | |||||
hideDuration: '1000', | |||||
timeOut: '10000', | |||||
extendedTimeOut: '1000', | |||||
showEasing: 'swing', | |||||
hideEasing: 'linear', | |||||
showMethod: 'fadeIn', | |||||
hideMethod: 'fadeOut', | |||||
}; | |||||
module.exports = { | |||||
error(message) { | |||||
toastr.error(message); | |||||
}, | |||||
success(message) { | |||||
toastr.success(message); | |||||
}, | |||||
warning(message) { | |||||
toastr.warning(message); | |||||
}, | |||||
clear() { | |||||
toastr.clear(); | |||||
}, | |||||
}; |
@@ -0,0 +1,26 @@ | |||||
// A custom Nightwatch assertion. | |||||
// the name of the method is the filename. | |||||
// can be used in tests like this: | |||||
// | |||||
// browser.assert.elementCount(selector, count) | |||||
// | |||||
// for how to write custom assertions see | |||||
// http://nightwatchjs.org/guide#writing-custom-assertions | |||||
exports.assertion = function (selector, count) { | |||||
this.message = 'Testing if element <' + selector + '> has count: ' + count | |||||
this.expected = count | |||||
this.pass = function (val) { | |||||
return val === this.expected | |||||
} | |||||
this.value = function (res) { | |||||
return res.value | |||||
} | |||||
this.command = function (cb) { | |||||
var self = this | |||||
return this.api.execute(function (selector) { | |||||
return document.querySelectorAll(selector).length | |||||
}, [selector], function (res) { | |||||
cb.call(self, res) | |||||
}) | |||||
} | |||||
} |
@@ -0,0 +1,40 @@ | |||||
// http://nightwatchjs.org/guide#settings-file | |||||
module.exports = { | |||||
"src_folders": ["test/e2e/specs"], | |||||
"output_folder": "test/e2e/reports", | |||||
"custom_assertions_path": ["test/e2e/custom-assertions"], | |||||
"selenium": { | |||||
"start_process": true, | |||||
"server_path": "node_modules/selenium-server/lib/runner/selenium-server-standalone-2.52.0.jar", | |||||
"host": "127.0.0.1", | |||||
"port": 4444, | |||||
"cli_args": { | |||||
"webdriver.chrome.driver": require('chromedriver').path | |||||
} | |||||
}, | |||||
"test_settings": { | |||||
"default": { | |||||
"selenium_port": 4444, | |||||
"selenium_host": "localhost", | |||||
"silent": true | |||||
}, | |||||
"chrome": { | |||||
"desiredCapabilities": { | |||||
"browserName": "chrome", | |||||
"javascriptEnabled": true, | |||||
"acceptSslCerts": true | |||||
} | |||||
}, | |||||
"firefox": { | |||||
"desiredCapabilities": { | |||||
"browserName": "firefox", | |||||
"javascriptEnabled": true, | |||||
"acceptSslCerts": true | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,23 @@ | |||||
<?xml version="1.0" encoding="UTF-8" ?> | |||||
<testsuites errors="0" | |||||
failures="0" | |||||
tests="1"> | |||||
<testsuite name="test" | |||||
errors="0" failures="0" hostname="" id="" package="test" skipped="0" | |||||
tests="1" time="17.59" timestamp="Tue, 15 Mar 2016 10:19:51 GMT"> | |||||
<testcase name="default e2e tests" time="17.59" assertions="4"> | |||||
</testcase> | |||||
</testsuite> | |||||
</testsuites> |
@@ -0,0 +1,23 @@ | |||||
<?xml version="1.0" encoding="UTF-8" ?> | |||||
<testsuites errors="0" | |||||
failures="0" | |||||
tests="1"> | |||||
<testsuite name="test" | |||||
errors="0" failures="0" hostname="" id="" package="test" skipped="0" | |||||
tests="1" time="18.37" timestamp="Tue, 15 Mar 2016 10:19:51 GMT"> | |||||
<testcase name="default e2e tests" time="18.37" assertions="4"> | |||||
</testcase> | |||||
</testsuite> | |||||
</testsuites> |
@@ -0,0 +1,30 @@ | |||||
// 1. start the dev server | |||||
var server = require('../../build/dev-server.js') | |||||
// 2. run the nightwatch test suite against it | |||||
// to run in additional browsers: | |||||
// 1. add an entry in test/e2e/nightwatch.conf.json under "test_settings" | |||||
// 2. add it to the --env flag below | |||||
// For more information on Nightwatch's config file, see | |||||
// http://nightwatchjs.org/guide#settings-file | |||||
var spawn = require('cross-spawn') | |||||
var runner = spawn( | |||||
'./node_modules/.bin/nightwatch', | |||||
[ | |||||
'--config', 'test/e2e/nightwatch.conf.js', | |||||
'--env', 'chrome,firefox' | |||||
], | |||||
{ | |||||
stdio: 'inherit' | |||||
} | |||||
) | |||||
runner.on('exit', function (code) { | |||||
server.close() | |||||
process.exit(code) | |||||
}) | |||||
runner.on('error', function (err) { | |||||
server.close() | |||||
throw err | |||||
}) |
@@ -0,0 +1,14 @@ | |||||
// For authoring Nightwatch tests, see | |||||
// http://nightwatchjs.org/guide#usage | |||||
module.exports = { | |||||
'default e2e tests': function (browser) { | |||||
browser | |||||
.url('http://localhost:8080') | |||||
.waitForElementVisible('#app', 5000) | |||||
.assert.elementPresent('.logo') | |||||
.assert.containsText('h1', 'Hello World!') | |||||
.assert.elementCount('p', 3) | |||||
.end() | |||||
} | |||||
} |
@@ -0,0 +1,5 @@ | |||||
{ | |||||
"env": { | |||||
"jasmine": true | |||||
} | |||||
} |
@@ -0,0 +1,13 @@ | |||||
// Polyfill fn.bind() for PhantomJS | |||||
/* eslint-disable no-extend-native */ | |||||
Function.prototype.bind = require('function-bind') | |||||
// require all test files (files that ends with .spec.js) | |||||
var testsContext = require.context('./specs', true, /\.spec$/) | |||||
testsContext.keys().forEach(testsContext) | |||||
// require all src files except main.js for coverage. | |||||
// you can also change this to match only the subset of files that | |||||
// you want coverage for. | |||||
var srcContext = require.context('../../src', true, /^\.\/(?!main(\.js)?$)/) | |||||
srcContext.keys().forEach(srcContext) |
@@ -0,0 +1,65 @@ | |||||
// This is a karma config file. For more details see | |||||
// http://karma-runner.github.io/0.13/config/configuration-file.html | |||||
// we are also using it with karma-webpack | |||||
// https://github.com/webpack/karma-webpack | |||||
var path = require('path') | |||||
var merge = require('webpack-merge') | |||||
var baseConfig = require('../../build/webpack.base.conf') | |||||
var projectRoot = path.resolve(__dirname, '../../') | |||||
var webpackConfig = merge(baseConfig, { | |||||
// use inline sourcemap for karma-sourcemap-loader | |||||
devtool: '#inline-source-map', | |||||
vue: { | |||||
loaders: { | |||||
js: 'isparta' | |||||
} | |||||
} | |||||
}) | |||||
// no need for app entry during tests | |||||
delete webpackConfig.entry | |||||
// make sure isparta loader is applied before eslint | |||||
webpackConfig.module.preLoaders.unshift({ | |||||
test: /\.js$/, | |||||
loader: 'isparta', | |||||
include: projectRoot, | |||||
exclude: /test\/unit|node_modules/ | |||||
}) | |||||
// only apply babel for test files when using isparta | |||||
webpackConfig.module.loaders.some(function (loader, i) { | |||||
if (loader.loader === 'babel') { | |||||
loader.include = /test\/unit/ | |||||
return true | |||||
} | |||||
}) | |||||
module.exports = function (config) { | |||||
config.set({ | |||||
// to run in additional browsers: | |||||
// 1. install corresponding karma launcher | |||||
// http://karma-runner.github.io/0.13/config/browsers.html | |||||
// 2. add it to the `browsers` array below. | |||||
browsers: ['PhantomJS'], | |||||
frameworks: ['jasmine'], | |||||
reporters: ['spec', 'coverage'], | |||||
files: ['./index.js'], | |||||
preprocessors: { | |||||
'./index.js': ['webpack', 'sourcemap'] | |||||
}, | |||||
webpack: webpackConfig, | |||||
webpackMiddleware: { | |||||
noInfo: true | |||||
}, | |||||
coverageReporter: { | |||||
dir: './coverage', | |||||
reporters: [ | |||||
{ type: 'lcov', subdir: '.' }, | |||||
{ type: 'text-summary' } | |||||
] | |||||
} | |||||
}) | |||||
} |
@@ -0,0 +1,15 @@ | |||||
import Vue from 'vue' | |||||
import Hello from 'src/components/Hello' | |||||
describe('Hello.vue', () => { | |||||
it('should render correct contents', () => { | |||||
const vm = new Vue({ | |||||
template: '<div><hello></hello></div>', | |||||
components: { Hello } | |||||
}).$mount() | |||||
expect(vm.$el.querySelector('.hello h1').textContent).toBe('Hello World!') | |||||
}) | |||||
}) | |||||
// also see example testing a component with mocks at | |||||
// https://github.com/vuejs/vue-loader-example/blob/master/test/unit/a.spec.js#L24-L49 |
@@ -1,49 +0,0 @@ | |||||
var webpack = require('webpack'); | |||||
var OfflinePlugin = require('offline-plugin'); | |||||
module.exports = { | |||||
context: __dirname + "/app", | |||||
entry: ["./main.js"], | |||||
output: { | |||||
path: __dirname + "/dist", | |||||
publicPath: '/dist/', | |||||
filename: "bundle.js" | |||||
}, | |||||
module: { | |||||
loaders: [ | |||||
{test: /\.vue$/, loader: 'vue'}, | |||||
{test: /\.js$/, loader: 'babel', exclude: /node_modules/}, | |||||
{test: /\.json$/, loader: 'json'}, | |||||
{test: /\.(png|jpg|gif)$/, loader: 'url', query: {limit: 11000, name: '[name].[ext]?[hash]'}}, | |||||
{test: /\.css$/, loader: 'style-loader!css-loader'}, | |||||
{test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/font-woff"}, | |||||
{test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/font-woff"}, | |||||
{test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/octet-stream"}, | |||||
{test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file"}, | |||||
{test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=image/svg+xml"} | |||||
] | |||||
}, | |||||
plugins: [ | |||||
new webpack.ProvidePlugin({ | |||||
$: "jquery", | |||||
jQuery: "jquery", | |||||
"window.jQuery": "jquery" | |||||
}) | |||||
] | |||||
}; | |||||
if (process.env.NODE_ENV === 'production') { | |||||
module.exports.plugins = (module.exports.plugins || []).concat([ | |||||
new webpack.DefinePlugin({'process.env': {NODE_ENV: '"production"'}}), | |||||
new webpack.optimize.UglifyJsPlugin({compress: {warnings: false}, comments: false}), | |||||
new webpack.optimize.OccurenceOrderPlugin(), | |||||
new webpack.optimize.DedupePlugin(), | |||||
new OfflinePlugin({ | |||||
caches: 'all', | |||||
scope: '/dist/', | |||||
updateStrategy: 'all', | |||||
ServiceWorker: {output: 'sw.js'}, | |||||
AppCache: false | |||||
}) | |||||
]) | |||||
} |