@@ -1 +1,2 @@ | |||||
node_modules | |||||
dist | |||||
node_modules |
@@ -1,181 +0,0 @@ | |||||
<!DOCTYPE html> | |||||
<html> | |||||
<head> | |||||
<meta charset="utf-8"> | |||||
<meta name="viewport" content="width=device-width"> | |||||
<link rel="stylesheet" href="styles/bootstrap.min.css"> | |||||
<link rel="stylesheet" href="styles/font-awesome.min.css"> | |||||
<link rel="stylesheet" href="styles/hint.min.css"> | |||||
<link rel="stylesheet" href="styles/style.min.css"> | |||||
</head> | |||||
<body> | |||||
<div id="passwordGenerator"> | |||||
<div class="card"> | |||||
<div id="password-block" class="card-block"> | |||||
<form id="generatedPasswordForm"> | |||||
<fieldset class="form-group"> | |||||
<label for="login" class="sr-only">Login</label> | |||||
<input id="login" | |||||
name="login" | |||||
type="text" | |||||
class="form-control" | |||||
placeholder="Login" | |||||
autofocus | |||||
autocomplete="off" | |||||
autocorrect="off" | |||||
autocapitalize="none"> | |||||
<!-- remove autofill for masterPassword --> | |||||
<input type="password" id="password" style="display: none"> | |||||
</fieldset> | |||||
<fieldset class="form-group"> | |||||
<label for="masterPassword" class="sr-only">Password</label> | |||||
<div class="input-group"> | |||||
<input id="masterPassword" | |||||
name="masterPassword" | |||||
type="password" | |||||
class="form-control" | |||||
placeholder="Master password" | |||||
autocomplete="off" | |||||
autocorrect="off" | |||||
autocapitalize="none"> | |||||
<span class="input-group-btn"> | |||||
<a id="displayMasterPasswordButton" class="btn btn-secondary" type="button" | |||||
tabindex="-1"> | |||||
<i class="fa fa-user-secret" aria-hidden="true"></i> | |||||
<small class="hint--top" id="fingerprint" aria-label="fingerprint"></small> | |||||
</a> | |||||
</span> | |||||
</div> | |||||
</fieldset> | |||||
<fieldset class="form-group"> | |||||
<label for="site" class="sr-only">Site</label> | |||||
<input id="site" | |||||
name="site" | |||||
type="text" | |||||
class="form-control" | |||||
placeholder="Site" | |||||
autofocus | |||||
autocomplete="off" | |||||
autocorrect="off" | |||||
autocapitalize="none"> | |||||
</fieldset> | |||||
<fieldset class="form-group"> | |||||
<div class="input-group"> | |||||
<span id="autoLoginButton" class="input-group-btn"> | |||||
<button class="btn btn-secondary"> | |||||
<i class="fa fa-magic" aria-hidden="true"></i> | |||||
</button> | |||||
</span> | |||||
<label for="generatedPassword" class="sr-only">Password Generated</label> | |||||
<input id="generatedPassword" | |||||
name="generatedPassword" | |||||
type="text" | |||||
class="form-control" | |||||
tabindex="-1" | |||||
readonly> | |||||
<span class="input-group-btn"> | |||||
<button id="copyPasswordButton" class="btn-copy btn btn-primary" type="button" | |||||
data-clipboard-target="#generatedPassword"> | |||||
<i class="fa fa-clipboard" aria-hidden="true"></i> | |||||
</button> | |||||
</span> | |||||
</div> | |||||
</fieldset> | |||||
<fieldset class="form-group m-b-0"> | |||||
<span id="displayOptionsButton"> | |||||
<i class="fa fa-gears"></i> Advanced options | |||||
</span> | |||||
</fieldset> | |||||
<fieldset class="form-group option-block m-t-1"> | |||||
<div class="row"> | |||||
<div class="col-xs-12"> | |||||
<label>Password groups :</label> | |||||
</div> | |||||
</div> | |||||
<div class="row"> | |||||
<div class="col-sm-6"> | |||||
<label class="c-input c-checkbox"> | |||||
<input type="checkbox" id="lowercase" value="lowercase" name="lowercase" | |||||
checked> | |||||
<span class="c-indicator"></span> Lower letters (a‑z) | |||||
</label> | |||||
</div> | |||||
<div class="col-sm-6"> | |||||
<label class="c-input c-checkbox"> | |||||
<input type="checkbox" id="uppercase" value="uppercase" name="uppercase" | |||||
checked> | |||||
<span class="c-indicator"></span> Upper letters (A-Z) | |||||
</label> | |||||
</div> | |||||
</div> | |||||
<div class="row"> | |||||
<div class="col-sm-6"> | |||||
<label class="c-input c-checkbox"> | |||||
<input type="checkbox" id="numbers" value="numbers" name="numbers" checked> | |||||
<span class="c-indicator"></span> Numbers (0-9) | |||||
</label> | |||||
</div> | |||||
<div class="col-sm-6"> | |||||
<label class="c-input c-checkbox"> | |||||
<input type="checkbox" id="symbols" value="symbols" name="symbols" checked> | |||||
<span class="c-indicator"></span> Special chars (@&%) | |||||
</label> | |||||
</div> | |||||
</div> | |||||
</fieldset> | |||||
<fieldset class="form-group option-block"> | |||||
<div class="row"> | |||||
<div class="col-xs-6"> | |||||
<label for="passwordLength">Length :</label> | |||||
<input id="passwordLength" | |||||
type="number" | |||||
class="form-control" | |||||
value="12" | |||||
min="6" | |||||
max="64"/> | |||||
</div> | |||||
<div class="col-xs-6"> | |||||
<label for="passwordCounter">Counter :</label> | |||||
<input id="passwordCounter" | |||||
type="number" class="form-control" | |||||
value="1" | |||||
min="1" | |||||
max="1000"/> | |||||
</div> | |||||
</div> | |||||
</fieldset> | |||||
<!-- | |||||
<fieldset class="form-group option-block"> | |||||
<div class="row"> | |||||
<div class="col-xs-12"> | |||||
<label class="c-input c-checkbox"> | |||||
<input type="checkbox" id="saveLocally" value="saveLocally" name="saveLocally"> | |||||
<span class="c-indicator"></span> Save passwords info locally | |||||
</label> | |||||
</div> | |||||
</div> | |||||
</fieldset> | |||||
<fieldset class="form-group option-block"> | |||||
<div class="row"> | |||||
<div class="col-xs-6"> | |||||
<button class="btn btn-success-outline btn-sm btn-block"> | |||||
<i class="fa fa-download" aria-hidden="true"></i> download passwords info | |||||
</button> | |||||
</div> | |||||
<div class="col-xs-6"> | |||||
<button class="btn btn-primary-outline btn-sm btn-block"> | |||||
<i class="fa fa-upload" aria-hidden="true"></i> load passwords info | |||||
</button> | |||||
</div> | |||||
</div> | |||||
</fieldset> | |||||
--> | |||||
</form> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<script src="js/lesspass.min.js"></script> | |||||
<script src="js/clipboard.min.js"></script> | |||||
<script src="js/password-generator.js"></script> | |||||
</body> | |||||
</html> |
@@ -1,125 +0,0 @@ | |||||
function showTooltip(elem, msg) { | |||||
var classNames = elem.className; | |||||
elem.setAttribute('class', classNames + ' hint--top'); | |||||
elem.setAttribute('aria-label', msg); | |||||
setTimeout(function () { | |||||
elem.setAttribute('class', classNames); | |||||
}, 2000); | |||||
} | |||||
window.onload = function () { | |||||
document.getElementById('generatedPassword').value = ''; | |||||
}; | |||||
function getColor(color) { | |||||
var colors = ['EBBB56', '59E0EB', 'E8F464', 'D2B4ED', 'BBE96D', 'EF9FC8', '8EE083', 'DCBFD6', 'DDD15A', 'A1C8E8', 'C4D977', 'F1A49E', '79E8A0', 'E9A970', '60E3B4', 'D4C47D', '73DDCA', 'C4EAA7', 'A7D6D4', '9CC795']; | |||||
var index = parseInt(color, 16) % colors.length; | |||||
return '#' + colors[index]; | |||||
} | |||||
document.getElementById('login').onblur = displayPasswordIndication; | |||||
document.getElementById('masterPassword').onblur = displayPasswordIndication; | |||||
function displayPasswordIndication() { | |||||
var login = document.getElementById('login').value; | |||||
var masterPassword = document.getElementById('masterPassword').value; | |||||
var fingerprint = document.getElementById('fingerprint'); | |||||
var displayMasterPasswordButton = document.getElementById('displayMasterPasswordButton'); | |||||
if (!login || !masterPassword) { | |||||
fingerprint.innerText = ''; | |||||
fingerprint.style.display = 'none'; | |||||
displayMasterPasswordButton.style.backgroundColor = '#FFFFFF'; | |||||
return; | |||||
} | |||||
lesspass.encryptLogin(login, masterPassword).then(function (secretHash) { | |||||
var color = secretHash.substring(0, 6); | |||||
var colorHex = getColor(color); | |||||
fingerprint.innerText = color; | |||||
fingerprint.style.display = 'inline'; | |||||
displayMasterPasswordButton.style.backgroundColor = colorHex; | |||||
}); | |||||
} | |||||
document.getElementById('copyPasswordButton').addEventListener('click', generatePassword); | |||||
document.getElementById('generatedPasswordForm').addEventListener('change', generatePassword); | |||||
document.getElementById('passwordLength').addEventListener('input', generatePassword); | |||||
document.getElementById('passwordCounter').addEventListener('input', generatePassword); | |||||
function getData() { | |||||
const defaultOptions = { | |||||
login: document.getElementById('login').value, | |||||
counter: document.getElementById('passwordCounter').value, | |||||
password: { | |||||
length: document.getElementById('passwordLength').value, | |||||
settings: [] | |||||
} | |||||
}; | |||||
const options = ['lowercase', 'uppercase', 'numbers', 'symbols']; | |||||
for (let i = 0; i < options.length; i++) { | |||||
if (document.getElementById(options[i]).checked) { | |||||
defaultOptions.password.settings.push(options[i]); | |||||
} | |||||
} | |||||
return defaultOptions; | |||||
} | |||||
function getFormData() { | |||||
const initData = getData(); | |||||
initData.masterPassword = document.getElementById('masterPassword').value; | |||||
initData.site = document.getElementById('site').value; | |||||
return initData; | |||||
} | |||||
function generatePassword() { | |||||
const data = getFormData(); | |||||
var generatedPasswordField = document.getElementById('generatedPassword'); | |||||
if (!data.login || !data.masterPassword || !data.site || !data.password.settings.length) { | |||||
generatedPasswordField.value = ''; | |||||
return; | |||||
} | |||||
lesspass.generatePassword(data.login, data.masterPassword, data.site, data).then(function (generatedPassword) { | |||||
generatedPasswordField.value = generatedPassword; | |||||
}); | |||||
} | |||||
document.getElementById('displayMasterPasswordButton').addEventListener('click', toggleMasterPassword); | |||||
function toggleMasterPassword() { | |||||
if (document.getElementById('masterPassword').type == 'password') { | |||||
document.getElementById('masterPassword').type = 'text'; | |||||
} else { | |||||
document.getElementById('masterPassword').type = 'password'; | |||||
} | |||||
} | |||||
var clipboard = new Clipboard('.btn-copy'); | |||||
clipboard.on('success', function (e) { | |||||
if (e.text) { | |||||
showTooltip(e.trigger, 'copied !'); | |||||
e.clearSelection(); | |||||
} | |||||
}); | |||||
clipboard.on('error', function (e) { | |||||
}); | |||||
document.getElementById('displayOptionsButton').addEventListener('click', toggleBlocks); | |||||
function toggle_visibility(className) { | |||||
var elements = document.getElementsByClassName(className); | |||||
for (var i = 0; i < elements.length; i++) { | |||||
var e = elements[i]; | |||||
if (e.style.display == 'block') { | |||||
e.style.display = 'none'; | |||||
} else { | |||||
e.style.display = 'block'; | |||||
} | |||||
} | |||||
} | |||||
function toggleBlocks() { | |||||
toggle_visibility('option-block'); | |||||
} |
@@ -0,0 +1,2 @@ | |||||
*{border-radius:0!important}i{cursor:pointer}#autoLoginButton,#fingerprint,.option-block{display:none}#displayOptionsButton{cursor:pointer}.card{border:none} | |||||
/*# sourceMappingURL=lesspass-pure.css.map*/ |
@@ -0,0 +1 @@ | |||||
{"version":3,"sources":[],"names":[],"mappings":"","file":"lesspass-pure.css","sourceRoot":""} |
@@ -0,0 +1 @@ | |||||
{"version":3,"sources":[],"names":[],"mappings":"","file":"lesspass-vendors.css","sourceRoot":""} |
@@ -0,0 +1,2 @@ | |||||
!function(t){function r(n){if(e[n])return e[n].exports;var o=e[n]={exports:{},id:n,loaded:!1};return t[n].call(o.exports,o,o.exports,r),o.loaded=!0,o.exports}var e={};return r.m=t,r.c=e,r.p="/dist/",r(0)}({0:function(t,r,e){"use strict";e(17)},17:function(t,r){}}); | |||||
//# sourceMappingURL=lesspass-vendors.js.map?d85e4fdbb5fb35c32626 |
@@ -0,0 +1 @@ | |||||
{"version":3,"sources":["webpack:///lesspass-vendors.js","webpack:///webpack/bootstrap d85e4fdbb5fb35c32626?bab7","webpack:///./src/vendors.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","m","c","p","0","17"],"mappings":"CAAS,SAAUA,GCInB,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAE,OAGA,IAAAC,GAAAF,EAAAD,IACAE,WACAE,GAAAJ,EACAK,QAAA,EAUA,OANAP,GAAAE,GAAAM,KAAAH,EAAAD,QAAAC,IAAAD,QAAAH,GAGAI,EAAAE,QAAA,EAGAF,EAAAD,QAvBA,GAAAD,KAqCA,OATAF,GAAAQ,EAAAT,EAGAC,EAAAS,EAAAP,EAGAF,EAAAU,EAAA,SAGAV,EAAA,KDMMW,EACA,SAASP,EAAQD,EAASH,GAE/B,YE/CDA,GAAA,KFqDMY,GACA,SAASR,EAAQD","file":"lesspass-vendors.js?d85e4fdbb5fb35c32626","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/dist/\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t__webpack_require__(17);\n\n/***/ },\n\n/***/ 17:\n/***/ function(module, exports) {\n\n\t// removed by extract-text-webpack-plugin\n\n/***/ }\n\n/******/ });\n\n\n/** WEBPACK FOOTER **\n ** lesspass-vendors.js?d85e4fdbb5fb35c32626\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/dist/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap d85e4fdbb5fb35c32626\n **/","import './vendors.scss'\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendors.js\n **/"],"sourceRoot":""} |
@@ -1 +0,0 @@ | |||||
*{border-radius:0!important}i{cursor:pointer}#autoLoginButton,.option-block{display:none}#displayOptionsButton{cursor:pointer}.card{border:none}#fingerprint{display:none} |
@@ -1,95 +0,0 @@ | |||||
'use strict'; | |||||
var gulp = require('gulp'); | |||||
var del = require('del'); | |||||
var concat = require('gulp-concat'); | |||||
var autoprefixer = require('gulp-autoprefixer'); | |||||
var minifyCss = require('gulp-cssnano'); | |||||
var paths = { | |||||
build: 'dist/', | |||||
html: [ | |||||
'index.html' | |||||
], | |||||
js: [ | |||||
'password-generator.js' | |||||
], | |||||
jsVendors: [ | |||||
'node_modules/lesspass/dist/lesspass.min.js', | |||||
'node_modules/clipboard/dist/clipboard.min.js' | |||||
], | |||||
styles: [ | |||||
'style.css' | |||||
], | |||||
stylesVendors: [ | |||||
'node_modules/bootstrap/dist/css/bootstrap.min.css', | |||||
'node_modules/font-awesome/css/font-awesome.min.css', | |||||
'node_modules/hint.css/hint.min.css' | |||||
], | |||||
images: [ | |||||
'images/**/*' | |||||
], | |||||
fonts: [ | |||||
'node_modules/font-awesome/fonts/**/*' | |||||
] | |||||
}; | |||||
gulp.task('clean', function (callback) { | |||||
return del(paths.build, {force: true}, callback); | |||||
}); | |||||
gulp.task('fonts', [], function () { | |||||
return gulp.src(paths.fonts) | |||||
.pipe(gulp.dest(paths.build + 'fonts/')); | |||||
}); | |||||
gulp.task('images', function () { | |||||
return gulp.src(paths.images) | |||||
.pipe(gulp.dest(paths.build + 'images/')); | |||||
}); | |||||
gulp.task('html', function () { | |||||
return gulp.src(paths.html) | |||||
.pipe(gulp.dest(paths.build)); | |||||
}); | |||||
gulp.task('styles', function () { | |||||
return gulp.src(paths.styles) | |||||
.pipe(concat('style.min.css')) | |||||
.pipe(autoprefixer('last 2 versions')) | |||||
.pipe(minifyCss()) | |||||
.pipe(gulp.dest(paths.build + '/styles')); | |||||
}); | |||||
gulp.task('stylesVendors', function () { | |||||
return gulp.src(paths.stylesVendors) | |||||
.pipe(gulp.dest(paths.build + 'styles/')); | |||||
}); | |||||
gulp.task('js', function () { | |||||
return gulp.src(paths.js) | |||||
.pipe(gulp.dest(paths.build + 'js/')); | |||||
}); | |||||
gulp.task('jsVendors', function () { | |||||
return gulp.src(paths.jsVendors) | |||||
.pipe(gulp.dest(paths.build + 'js/')); | |||||
}); | |||||
gulp.task('build', ['clean'], function () { | |||||
gulp.start('js', 'jsVendors', 'html', 'styles', 'stylesVendors', 'fonts', 'images'); | |||||
}); | |||||
gulp.task('watch', ['build'], function () { | |||||
gulp.watch(paths.js, ['js']); | |||||
gulp.watch(paths.jsVendors, ['jsVendors']); | |||||
gulp.watch(paths.styles, ['styles']); | |||||
gulp.watch(paths.stylesVendors, ['stylesVendors']); | |||||
gulp.watch(paths.html, ['html']); | |||||
gulp.watch(paths.images, ['images']); | |||||
gulp.watch(paths.fonts, ['fonts']); | |||||
}); | |||||
gulp.task('default', ['watch'], function () { | |||||
}); |
@@ -2,11 +2,10 @@ | |||||
<html> | <html> | ||||
<head> | <head> | ||||
<meta charset="utf-8"> | <meta charset="utf-8"> | ||||
<meta name="viewport" content="width=device-width"> | |||||
<link rel="stylesheet" href="styles/bootstrap.min.css"> | |||||
<link rel="stylesheet" href="styles/font-awesome.min.css"> | |||||
<link rel="stylesheet" href="styles/hint.min.css"> | |||||
<link rel="stylesheet" href="styles/style.min.css"> | |||||
<title>lesspass</title> | |||||
<meta name="viewport" content="width=device-width, initial-scale=1"> | |||||
<link rel="stylesheet" href="dist/lesspass-vendors.css"> | |||||
<link rel="stylesheet" href="dist/lesspass-pure.css"> | |||||
</head> | </head> | ||||
<body> | <body> | ||||
<div id="passwordGenerator"> | <div id="passwordGenerator"> | ||||
@@ -174,8 +173,7 @@ | |||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<script src="js/lesspass.min.js"></script> | |||||
<script src="js/clipboard.min.js"></script> | |||||
<script src="js/password-generator.js"></script> | |||||
<script src="dist/lesspass-vendors.js"></script> | |||||
<script src="dist/lesspass-pure.js"></script> | |||||
</body> | </body> | ||||
</html> | </html> |
@@ -1,32 +1,52 @@ | |||||
{ | { | ||||
"name": "lesspass-pure", | |||||
"version": "1.0.0", | |||||
"author": "Guillaume Vincent <guillaume@oslab.fr>", | |||||
"description": "lesspass web component built with webpack", | |||||
"main": "src/app.js", | |||||
"scripts": { | "scripts": { | ||||
"build": "gulp build", | |||||
"build:watch": "gulp", | |||||
"test": "xo" | |||||
"dev": "webpack-dev-server", | |||||
"build": "rm -rf dist && NODE_ENV=production webpack", | |||||
"prepublish": "npm run build" | |||||
}, | }, | ||||
"repository": { | |||||
"type": "git", | |||||
"url": "git+ssh://git@github.com:lesspass/pure.git" | |||||
}, | |||||
"engines": { | |||||
"node": ">=4.2.6" | |||||
}, | |||||
"license": "MIT", | |||||
"bugs": { | |||||
"url": "https://github.com/lesspass/pure/issues" | |||||
}, | |||||
"homepage": "https://github.com/lesspass/pure#readme", | |||||
"dependencies": { | "dependencies": { | ||||
"lesspass": "^3.1.3" | |||||
}, | |||||
"devDependencies": { | |||||
"bootstrap": "^4.0.0-alpha.2", | "bootstrap": "^4.0.0-alpha.2", | ||||
"clipboard": "^1.5.12", | "clipboard": "^1.5.12", | ||||
"font-awesome": "^4.6.3", | "font-awesome": "^4.6.3", | ||||
"hint.css": "^2.3.1", | "hint.css": "^2.3.1", | ||||
"lesspass": "^3.1.3" | |||||
}, | |||||
"devDependencies": { | |||||
"del": "^2.2.1", | |||||
"gulp": "^3.9.1", | |||||
"gulp-autoprefixer": "^3.1.0", | |||||
"gulp-concat": "^2.6.0", | |||||
"gulp-cssnano": "^2.1.2", | |||||
"xo": "^0.16.0" | |||||
"babel-core": "^6.10.4", | |||||
"babel-loader": "^6.2.4", | |||||
"babel-preset-es2015": "^6.9.0", | |||||
"css-loader": "^0.23.1", | |||||
"extract-text-webpack-plugin": "^1.0.1", | |||||
"file-loader": "^0.9.0", | |||||
"html-webpack-plugin": "^2.22.0", | |||||
"node-sass": "^3.8.0", | |||||
"sass-loader": "^4.0.0", | |||||
"style-loader": "^0.13.1", | |||||
"url-loader": "^0.5.7", | |||||
"webpack": "^1.13.1", | |||||
"webpack-dev-server": "^1.14.1" | |||||
}, | }, | ||||
"xo": { | |||||
"space": true, | |||||
"envs": [ | |||||
"browser", | |||||
"webextensions" | |||||
"babel": { | |||||
"presets": [ | |||||
"es2015" | |||||
], | ], | ||||
"ignores": [ | |||||
"dist/**" | |||||
] | |||||
"comments": false | |||||
} | } | ||||
} | |||||
} |
@@ -4,6 +4,15 @@ LessPass pure html, js and css component used in the web extension and the front | |||||
![LessPass Component](screenshot.png?raw=true "Demo") | ![LessPass Component](screenshot.png?raw=true "Demo") | ||||
# Install | |||||
npm install lesspass-pure | |||||
# Test | |||||
npm run dev | |||||
open [http://localhost:8080/](http://localhost:8080/) | |||||
# Build | # Build | ||||
@@ -1,4 +1,6 @@ | |||||
/* global lesspass Clipboard */ | |||||
import './app.scss' | |||||
import lesspass from 'lesspass'; | |||||
import Clipboard from 'clipboard'; | |||||
function showTooltip(elem, msg) { | function showTooltip(elem, msg) { | ||||
var classNames = elem.className; | var classNames = elem.className; |
@@ -0,0 +1,19 @@ | |||||
* { | |||||
border-radius: 0 !important; | |||||
} | |||||
i { | |||||
cursor: pointer; | |||||
} | |||||
.option-block, #autoLoginButton, #fingerprint { | |||||
display: none; | |||||
} | |||||
#displayOptionsButton { | |||||
cursor: pointer; | |||||
} | |||||
.card { | |||||
border: none; | |||||
} |
@@ -0,0 +1 @@ | |||||
import './vendors.scss' |
@@ -0,0 +1,3 @@ | |||||
@import "~bootstrap/dist/css/bootstrap.css"; | |||||
@import "~font-awesome/css/font-awesome.css"; | |||||
@import "~hint.css/hint.css"; |
@@ -1,23 +0,0 @@ | |||||
* { | |||||
border-radius: 0 !important; | |||||
} | |||||
i { | |||||
cursor: pointer; | |||||
} | |||||
.option-block, #autoLoginButton { | |||||
display: none; | |||||
} | |||||
#displayOptionsButton { | |||||
cursor: pointer; | |||||
} | |||||
.card { | |||||
border: none; | |||||
} | |||||
#fingerprint { | |||||
display: none; | |||||
} |
@@ -0,0 +1,60 @@ | |||||
var path = require('path'); | |||||
var webpack = require('webpack'); | |||||
var ExtractTextPlugin = require("extract-text-webpack-plugin"); | |||||
module.exports = { | |||||
entry: { | |||||
pure: "./src/app", | |||||
vendors: "./src/vendors" | |||||
}, | |||||
output: { | |||||
path: 'dist', | |||||
publicPath: '/dist/', | |||||
filename: 'lesspass-[name].js?[hash]' | |||||
}, | |||||
module: { | |||||
loaders: [ | |||||
{ | |||||
test: /\.js$/, | |||||
loader: 'babel-loader', | |||||
exclude: /node_modules/ | |||||
}, | |||||
{ | |||||
test: /\.(png|jpg|gif|svg|woff2?|eot|ttf)(\?.*)?$/, | |||||
loader: 'url-loader', | |||||
query: { | |||||
limit: 10000, | |||||
name: '[name].[ext]?[hash]' | |||||
} | |||||
}, | |||||
{ | |||||
test: /\.css$/, | |||||
loader: ExtractTextPlugin.extract("style-loader", "css-loader") | |||||
}, | |||||
{ | |||||
test: /\.scss$/, | |||||
loader: ExtractTextPlugin.extract("style-loader", "css-loader!sass-loader") | |||||
} | |||||
] | |||||
}, | |||||
plugins: [ | |||||
new ExtractTextPlugin("lesspass-[name].css") | |||||
] | |||||
}; | |||||
if (process.env.NODE_ENV === 'production') { | |||||
module.exports.devtool = '#source-map'; | |||||
module.exports.plugins = (module.exports.plugins || []).concat([ | |||||
new webpack.DefinePlugin({ | |||||
'process.env': { | |||||
NODE_ENV: '"production"' | |||||
} | |||||
}), | |||||
new webpack.optimize.UglifyJsPlugin({ | |||||
compress: { | |||||
warnings: false | |||||
} | |||||
}), | |||||
new webpack.optimize.OccurenceOrderPlugin() | |||||
]); | |||||
} |