@@ -1,14 +1,30 @@ | |||||
import Vue from 'vue'; | import Vue from 'vue'; | ||||
import i18n from 'vue-i18n'; | |||||
import Header from './components/header.vue'; | |||||
import Headlines from './components/headlines.vue'; | |||||
import Jumbotron from './components/jumbotron.vue'; | |||||
import PasswordGenerator from './components/password-generator.vue'; | import PasswordGenerator from './components/password-generator.vue'; | ||||
import BootstrapHr from './components/bootstrap-hr.vue'; | import BootstrapHr from './components/bootstrap-hr.vue'; | ||||
import LesspassFeatures from './components/lesspass-features.vue'; | |||||
import Features from './components/features.vue'; | |||||
import Footer from './components/footer.vue'; | import Footer from './components/footer.vue'; | ||||
import locales from './locales/locales'; | |||||
var browserLanguage = (navigator.language || navigator.browserLanguage).split('-')[0]; | |||||
var lang = browserLanguage in locales ? browserLanguage : 'en'; | |||||
Vue.use(i18n, { | |||||
lang: lang, | |||||
locales: locales | |||||
}); | |||||
new Vue({ | new Vue({ | ||||
el: 'body', | el: 'body', | ||||
components: { | components: { | ||||
lesspassHeader: Header, | |||||
lesspassHeadlines: Headlines, | |||||
lesspassJumbotron: Jumbotron, | |||||
passwordGenerator: PasswordGenerator, | passwordGenerator: PasswordGenerator, | ||||
lesspassFeatures: LesspassFeatures, | |||||
lesspassFeatures: Features, | |||||
lesspassFooter: Footer, | lesspassFooter: Footer, | ||||
bootstrapHr: BootstrapHr | bootstrapHr: BootstrapHr | ||||
} | } |
@@ -25,16 +25,15 @@ | |||||
</style> | </style> | ||||
<template> | <template> | ||||
<div class="lesspass-features p-y-3 m-t-2"> | <div class="lesspass-features p-y-3 m-t-2"> | ||||
<div class="container"> | <div class="container"> | ||||
<div class="col-lg-8 col-lg-offset-2"> | <div class="col-lg-8 col-lg-offset-2"> | ||||
<h2>Vous devriez utiliser LessPass si :</h2> | |||||
<h2>{{ $t('you_should_use_lesspass') }} :</h2> | |||||
<ul> | <ul> | ||||
<li>vous voulez un mot de passe unique pour chaque site</li> | |||||
<li>vous aimez l'open source</li> | |||||
<li>vous voulez une application qui fonctionne sur ordinateur, smartphone ou tablette.</li> | |||||
<li>vous ne voulez pas stocker vos mots de passe sur le cloud</li> | |||||
<li>vous voulez vous souvenir que d'un seul mot de passe</li> | |||||
<li>{{ $t('unique_password') }}</li> | |||||
<li>{{ $t('love_open_source') }}</li> | |||||
<li>{{ $t('works_everywhere') }}</li> | |||||
<li>{{ $t('no_cloud') }}</li> | |||||
<li>{{ $t('only_one_password') }}</li> | |||||
</ul> | </ul> | ||||
</div> | </div> | ||||
</div> | </div> |
@@ -9,8 +9,8 @@ | |||||
<div class="container"> | <div class="container"> | ||||
<p> | <p> | ||||
LessPass | LessPass | ||||
- réalisé par <a href="http://guillaumevincent.com">Guillaume Vincent</a> | |||||
- <a href="https://github.com/oslab-fr/lesspass">code source</a> | |||||
- {{ $t('built_by') }} <a href="http://guillaumevincent.com">Guillaume Vincent</a> | |||||
- <a href="https://github.com/oslab-fr/lesspass">{{ $t('source_code') }}</a> | |||||
</p> | </p> | ||||
</div> | </div> | ||||
</footer> | </footer> |
@@ -0,0 +1,23 @@ | |||||
<style> | |||||
#header #logo-link { | |||||
margin: 0 auto; | |||||
width: 200px; | |||||
height: 45px; | |||||
} | |||||
#header #logo { | |||||
width: inherit; | |||||
height: inherit; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="header"> | |||||
<div class="container text-xs-center"> | |||||
<div id="logo-link"> | |||||
<a href="http://lesspass.com"> | |||||
<img id="logo" alt="lesspass" class="img-fluid" src="images/logo.png"> | |||||
</a> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</template> |
@@ -0,0 +1,12 @@ | |||||
<style> | |||||
#headlines { | |||||
padding-top: 2em; | |||||
padding-bottom: 1em; | |||||
} | |||||
</style> | |||||
<template> | |||||
<div id="headlines" class="container text-xs-center"> | |||||
<h1 class="blue">{{ $t('headlines_title') }}</h1> | |||||
<h2>{{ $t('headlines_subtitle') }}</h2> | |||||
</div> | |||||
</template> |
@@ -0,0 +1,19 @@ | |||||
<style> | |||||
</style> | |||||
<template> | |||||
<div class="container"> | |||||
<div class="jumbotron"> | |||||
<div class="row"> | |||||
<div class="col-lg-12"> | |||||
<p class="lead"> | |||||
<a href='https://lesspass.com/'>LessPass</a> {{ $t('what_is_lesspass') }} | |||||
</p> | |||||
<p class="lead"> | |||||
<a href='https://lesspass.com/'>LessPass</a> {{ $t('what_is_lesspass2') }} | |||||
</p> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</template> |
@@ -5,34 +5,38 @@ | |||||
border: 1px solid #434857; | border: 1px solid #434857; | ||||
} | } | ||||
</style> | </style> | ||||
"Email":"Email", | |||||
"Password":"Password", | |||||
"Site": "Web site", | |||||
"Copy": "Copy" | |||||
<template> | <template> | ||||
<div class="container"> | <div class="container"> | ||||
<form class="form-inline" id="passwordGenerator"> | <form class="form-inline" id="passwordGenerator"> | ||||
<div class="m-t-1"> | <div class="m-t-1"> | ||||
<div class="form-group"> | <div class="form-group"> | ||||
<label class="sr-only" for="email">Adresse email</label> | |||||
<input type="email" class="form-control" id="email" placeholder="Email" v-model="email" | |||||
<label class="sr-only" for="email">{{ $t('Email') }}</label> | |||||
<input type="email" class="form-control" id="email" placeholder="{{ $t('Email') }}" v-model="email" | |||||
v-on:blur="updateMasterPassword"> | v-on:blur="updateMasterPassword"> | ||||
</div> | </div> | ||||
<div class="form-group"> | <div class="form-group"> | ||||
<label class="sr-only" for="password">Mot de passe</label> | |||||
<input type="password" class="form-control" id="password" placeholder="Mot de passe" | |||||
<label class="sr-only" for="password">{{ $t('Password') }}</label> | |||||
<input type="password" class="form-control" id="password" placeholder="{{ $t('Password') }}" | |||||
v-model="password" v-on:blur="updateMasterPassword"> | v-model="password" v-on:blur="updateMasterPassword"> | ||||
</div> | </div> | ||||
<div class="form-group"> | <div class="form-group"> | ||||
<label class="sr-only" for="site">Site</label> | |||||
<input type="text" class="form-control" id="site" placeholder="Site (ex: facebook)" | |||||
<label class="sr-only" for="site">{{ $t('Site') }}</label> | |||||
<input type="text" class="form-control" id="site" placeholder="{{ $t('Site_placeholder') }}" | |||||
v-model="site"> | v-model="site"> | ||||
</div> | </div> | ||||
<div class="form-group"> | <div class="form-group"> | ||||
<label class="sr-only" for="generatedPassword">Mot de passe unique</label> | |||||
<label class="sr-only" for="generatedPassword">{{ $t('Unique_password') }}</label> | |||||
<div class="input-group"> | <div class="input-group"> | ||||
<input type="text" id="generatedPassword" class="form-control" v-model="generatedPassword"> | <input type="text" id="generatedPassword" class="form-control" v-model="generatedPassword"> | ||||
<span class="input-group-btn"> | <span class="input-group-btn"> | ||||
<button id="copyBtn" data-clipboard-target="#generatedPassword" | <button id="copyBtn" data-clipboard-target="#generatedPassword" | ||||
class="btn btn-primary" type="button"> | class="btn btn-primary" type="button"> | ||||
Copier | |||||
{{ $t('Copy') }} | |||||
</button> | </button> | ||||
</span> | </span> | ||||
</div> | </div> | ||||
@@ -41,7 +45,7 @@ | |||||
<div class="m-t-1"> | <div class="m-t-1"> | ||||
<div class="checkbox"> | <div class="checkbox"> | ||||
<label> | <label> | ||||
<input type="checkbox" v-model="showAdvancedOptions"> Options avancées | |||||
<input type="checkbox" v-model="showAdvancedOptions"> {{ $t('Advanced_options') }} | |||||
</label> | </label> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
@@ -49,25 +53,25 @@ | |||||
<div class="form-group"> | <div class="form-group"> | ||||
<label class="checkbox-inline"> | <label class="checkbox-inline"> | ||||
<input type="checkbox" id="lowercase" value="lowercase" v-model="passwordInfo.settings" checked> | <input type="checkbox" id="lowercase" value="lowercase" v-model="passwordInfo.settings" checked> | ||||
minuscules (a-z) | |||||
{{ $t('lowercase_options') }} | |||||
</label> | </label> | ||||
<label class="checkbox-inline"> | <label class="checkbox-inline"> | ||||
<input type="checkbox" id="uppercase" value="uppercase" v-model="passwordInfo.settings" checked> | <input type="checkbox" id="uppercase" value="uppercase" v-model="passwordInfo.settings" checked> | ||||
MAJUSCULES (A-Z) | |||||
{{ $t('uppercase_options') }} | |||||
</label> | </label> | ||||
<label class="checkbox-inline"> | <label class="checkbox-inline"> | ||||
<input type="checkbox" id="numbers" value="numbers" v-model="passwordInfo.settings" checked> | <input type="checkbox" id="numbers" value="numbers" v-model="passwordInfo.settings" checked> | ||||
nombres (0-9) | |||||
{{ $t('numbers_options') }} | |||||
</label> | </label> | ||||
<label class="checkbox-inline"> | <label class="checkbox-inline"> | ||||
<input type="checkbox" id="symbols" value="symbols" v-model="passwordInfo.settings" checked> | <input type="checkbox" id="symbols" value="symbols" v-model="passwordInfo.settings" checked> | ||||
caractères spéciaux (@&%?) | |||||
{{ $t('symbols_options') }} | |||||
</label> | </label> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="m-t-1" v-if="showAdvancedOptions"> | <div class="m-t-1" v-if="showAdvancedOptions"> | ||||
<div class="form-group"> | <div class="form-group"> | ||||
<label for="passwordLength">Longueur</label> | |||||
<label for="passwordLength">{{ $t('Length') }}</label> | |||||
<input id="passwordLength" type="range" value="12" min="6" max="64" v-model="passwordInfo.length" | <input id="passwordLength" type="range" value="12" min="6" max="64" v-model="passwordInfo.length" | ||||
class="form-control"> {{ passwordInfo.length }} | class="form-control"> {{ passwordInfo.length }} | ||||
</div> | </div> | ||||
@@ -0,0 +1,57 @@ | |||||
const locales = { | |||||
"en": { | |||||
"headlines_title": "Manage your passwords with confidence", | |||||
"headlines_subtitle": "LessPass does not store passwords, and neither should you !", | |||||
"what_is_lesspass": "doesn't save your passwords, it regenerates whenever you need it. Each password is unique to each site. All you need is to remember a single password, and LessPass does the rest.", | |||||
"what_is_lesspass2": "does not save passwords, there is nothing to steal.", | |||||
"built_by": "by", | |||||
"source_code": "Source code", | |||||
"you_should_use_lesspass": "You should use lesspass if", | |||||
"unique_password": "you want a unique password for each site", | |||||
"love_open_source": "vous love open source", | |||||
"works_everywhere": "you want an application that works on a computer, smartphone or tablet.", | |||||
"no_cloud": "you don't want to store your passwords in the cloud", | |||||
"only_one_password": "you want to remember only one password", | |||||
"Email": "Email", | |||||
"Password": "Password", | |||||
"Unique_password": "Unique password", | |||||
"Site": "Web site", | |||||
"Site_placeholder": "Web site (ex: Facebook)", | |||||
"Copy": "Copy", | |||||
"Advanced_options": "Advanced options", | |||||
"lowercase_options": "lowercase (a-z)", | |||||
"uppercase_options": "UPPERCASE (A-Z)", | |||||
"numbers_options": "numbers (0-9)", | |||||
"symbols_options": "symbols (@&%?)", | |||||
"Length": "Length" | |||||
}, | |||||
"fr": { | |||||
"headlines_title": "Gérez vos mots de passe en toute confiance", | |||||
"headlines_subtitle": "LessPass ne mémorise pas vos mots de passe, et vous non plus !", | |||||
"what_is_lesspass": "ne sauvegarde pas vos mots de passe, il les regénère à chaque fois que vous en avez besoin. Chaque mot de passe est unique et propre à chaque site. Tout ce dont vous avez besoin c'est de vous souvenir d'un seul mot de passe, et LessPass fait le reste.", | |||||
"what_is_lesspass2": "ne sauvegarde pas vos mots de passe, il n'y a donc rien à voler.", | |||||
"built_by": "Réalisé par", | |||||
"source_code": "Code source", | |||||
"you_should_use_lesspass": "Vous devriez utiliser LessPass si", | |||||
"unique_password": "vous voulez un mot de passe unique pour chaque site", | |||||
"love_open_source": "vous aimez l'open source", | |||||
"works_everywhere": "vous voulez une application qui fonctionne sur ordinateur, smartphone ou tablette.", | |||||
"no_cloud": "vous ne voulez pas stocker vos mots de passe sur le cloud", | |||||
"only_one_password": "vous voulez vous souvenir que d'un seul mot de passe", | |||||
"Email": "Email", | |||||
"Password": "Mot de passe", | |||||
"Unique_password": "Mot de passe unique", | |||||
"Site": "Site", | |||||
"Site_placeholder": "Site (ex: Facebook)", | |||||
"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 (@&%?)", | |||||
"Length": "Longueur" | |||||
} | |||||
}; | |||||
export default locales; |
@@ -15,7 +15,7 @@ | |||||
"copy:html": "cpy 'static/*.html' dist", | "copy:html": "cpy 'static/*.html' dist", | ||||
"copy:images": "cpy 'static/images/*.png' dist/images/", | "copy:images": "cpy 'static/images/*.png' dist/images/", | ||||
"build:css": "node-sass static/css/styles.scss dist/css/styles.css", | "build:css": "node-sass static/css/styles.scss dist/css/styles.css", | ||||
"build:app": "browserify -e ./app/app.js -o ./dist/app.js", | |||||
"build:app": "browserify -e ./app/app.js | uglifyjs > ./dist/app.js", | |||||
"prestart": "npm run build", | "prestart": "npm run build", | ||||
"start": "npm-run-all --parallel serve watch:static watch:app", | "start": "npm-run-all --parallel serve watch:static watch:app", | ||||
"serve": "static dist", | "serve": "static dist", | ||||
@@ -39,7 +39,8 @@ | |||||
"dependencies": { | "dependencies": { | ||||
"bootstrap": "^4.0.0-alpha.2", | "bootstrap": "^4.0.0-alpha.2", | ||||
"clipboard": "^1.5.5", | "clipboard": "^1.5.5", | ||||
"vue": "^1.0.12" | |||||
"vue": "^1.0.12", | |||||
"vue-i18n": "^2.3.3" | |||||
}, | }, | ||||
"devDependencies": { | "devDependencies": { | ||||
"babel-core": "^6.3.26", | "babel-core": "^6.3.26", | ||||
@@ -56,6 +57,7 @@ | |||||
"nodemon": "latest", | "nodemon": "latest", | ||||
"npm-run-all": "latest", | "npm-run-all": "latest", | ||||
"rimraf": "latest", | "rimraf": "latest", | ||||
"uglify-js": "^2.6.1", | |||||
"vue-hot-reload-api": "^1.2.2", | "vue-hot-reload-api": "^1.2.2", | ||||
"vueify": "^8.0.0", | "vueify": "^8.0.0", | ||||
"vueify-insert-css": "^1.0.0", | "vueify-insert-css": "^1.0.0", | ||||
@@ -8,24 +8,6 @@ body { | |||||
background-color: #252830; | background-color: #252830; | ||||
} | } | ||||
#header { | |||||
#logo-link { | |||||
margin: 0 auto; | |||||
width: 200px; | |||||
height: 45px; | |||||
#logo { | |||||
width: inherit; | |||||
height: inherit; | |||||
} | |||||
} | |||||
} | |||||
#headlines { | |||||
padding-top: 2em; | |||||
padding-bottom: 1em; | |||||
} | |||||
.blue { | .blue { | ||||
color: #0275D8; | color: #0275D8; | ||||
} | } | ||||
@@ -27,36 +27,10 @@ | |||||
<meta name="theme-color" content="#252830"> | <meta name="theme-color" content="#252830"> | ||||
</head> | </head> | ||||
<body> | <body> | ||||
<div id="header"> | |||||
<div class="container text-xs-center"> | |||||
<div id="logo-link"> | |||||
<a href="http://lesspass.com"> | |||||
<img id="logo" alt="lesspass" class="img-fluid" src="images/logo.png"> | |||||
</a> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div id="headlines" class="container text-xs-center"> | |||||
<h1 class="blue">Gérez vos mots de passe en toute confiance</h1> | |||||
<h2>LessPass ne mémorise pas vos mots de passe, et vous non plus !</h2> | |||||
</div> | |||||
<lesspass-header></lesspass-header> | |||||
<lesspass-headlines></lesspass-headlines> | |||||
<bootstrap-hr></bootstrap-hr> | <bootstrap-hr></bootstrap-hr> | ||||
<div class="container"> | |||||
<div class="jumbotron"> | |||||
<div class="row"> | |||||
<div class="col-lg-12"> | |||||
<p class="lead"> | |||||
<a href="https://lesspass.com/">LessPass</a> ne sauvegarde pas vos mots de passe, il les regénère à | |||||
chaque fois que vous en avez besoin. Chaque mot de passe est unique et propre à chaque site. Tout ce | |||||
dont vous avez besoin c'est de vous souvenir d'un seul mot de passe, et LessPass fait le reste. | |||||
</p> | |||||
<p class="lead"> | |||||
Comme LessPass ne sauvegarde pas vos mots de passe, il n'y a rien à voler. | |||||
</p> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<lesspass-jumbotron></lesspass-jumbotron> | |||||
<bootstrap-hr></bootstrap-hr> | <bootstrap-hr></bootstrap-hr> | ||||
<password-generator></password-generator> | <password-generator></password-generator> | ||||
<lesspass-features></lesspass-features> | <lesspass-features></lesspass-features> | ||||