@@ -0,0 +1,13 @@ | |||||
FROM node:argon | |||||
RUN mkdir -p /frontend | |||||
WORKDIR /frontend | |||||
COPY package.json /frontend/ | |||||
RUN npm install | |||||
COPY . /frontend | |||||
RUN npm run build | |||||
EXPOSE 8080 | |||||
CMD [ "npm", "start" ] |
@@ -0,0 +1,28 @@ | |||||
<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> |
@@ -0,0 +1,33 @@ | |||||
<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> |
@@ -0,0 +1,77 @@ | |||||
<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> |
@@ -0,0 +1,25 @@ | |||||
<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> |
@@ -0,0 +1,56 @@ | |||||
<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> |
@@ -0,0 +1,59 @@ | |||||
<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> |
@@ -0,0 +1,32 @@ | |||||
<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> |
@@ -0,0 +1,30 @@ | |||||
<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> |
@@ -0,0 +1,213 @@ | |||||
<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> |
@@ -0,0 +1,89 @@ | |||||
<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>--> |
@@ -0,0 +1,31 @@ | |||||
<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: [] | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,59 @@ | |||||
<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> |
@@ -0,0 +1,34 @@ | |||||
<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> |
@@ -0,0 +1,123 @@ | |||||
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; |
@@ -0,0 +1,10 @@ | |||||
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' |
@@ -0,0 +1,48 @@ | |||||
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; |
@@ -0,0 +1,56 @@ | |||||
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') | |||||
} | |||||
} | |||||
}; |
@@ -0,0 +1,35 @@ | |||||
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(); | |||||
} | |||||
}; |
@@ -0,0 +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> |
@@ -0,0 +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 | |||||
} | |||||
] | |||||
} |
@@ -0,0 +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> |
@@ -0,0 +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" | |||||
inkscape:export-ydpi="243" /></g></svg> |
@@ -0,0 +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> |
@@ -0,0 +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> |
@@ -0,0 +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> |
@@ -0,0 +1,2 @@ | |||||
User-agent: * | |||||
Allow: / |
@@ -0,0 +1,31 @@ | |||||
<!DOCTYPE html> | |||||
<html> | |||||
<head> | |||||
<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> | |||||
</html> |
@@ -0,0 +1,77 @@ | |||||
{ | |||||
"name": "lesspass.com", | |||||
"version": "1.0.0", | |||||
"description": "lesspass single page app for https://lesspass.com", | |||||
"main": "app/app.js", | |||||
"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" | |||||
}, | |||||
"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": { | |||||
"bootstrap": "^4.0.0-alpha.2", | |||||
"clipboard": "^1.5.8", | |||||
"express": "^4.13.4", | |||||
"font-awesome": "^4.5.0", | |||||
"hint.css": "^2.1.0", | |||||
"jquery": "^2.2.1", | |||||
"lesspass": "^1.1.1", | |||||
"tether": "^1.2.0", | |||||
"toastr": "^2.1.2", | |||||
"vue": "^1.0.16", | |||||
"vue-i18n": "^2.4.0", | |||||
"vue-resource": "^0.7.0", | |||||
"vue-router": "^0.7.11" | |||||
}, | |||||
"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", | |||||
"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", | |||||
"url-loader": "^0.5.7", | |||||
"vue-hot-reload-api": "^1.3.2", | |||||
"vue-html-loader": "^1.1.0", | |||||
"vue-loader": "^8.1.4", | |||||
"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" | |||||
] | |||||
} | |||||
} |
@@ -0,0 +1,12 @@ | |||||
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,49 @@ | |||||
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 | |||||
}) | |||||
]) | |||||
} |