From 167f1d3366abd50c7e1f2b45967c00d2de0f1486 Mon Sep 17 00:00:00 2001 From: Alice Gaudon Date: Thu, 23 Apr 2020 18:07:39 +0200 Subject: [PATCH] Add assets --- .gitignore | 2 + assets/config.json | 10 + assets/img/logo.svg | 71 +++++ assets/img/logox1024.png | Bin 0 -> 44311 bytes assets/img/logox128.png | Bin 0 -> 4594 bytes assets/js/app.js | 6 + assets/js/external_links.js | 9 + assets/js/message_icons.js | 21 ++ assets/sass/_fonts.scss | 81 ++++++ assets/sass/_vars.scss | 23 ++ assets/sass/app.scss | 1 + assets/sass/error.scss | 90 +++++++ assets/sass/layout.scss | 512 ++++++++++++++++++++++++++++++++++++ package.json | 35 ++- public/.gitkeep | 0 webpack.config.js | 86 ++++++ 16 files changed, 944 insertions(+), 3 deletions(-) create mode 100644 assets/config.json create mode 100644 assets/img/logo.svg create mode 100644 assets/img/logox1024.png create mode 100644 assets/img/logox128.png create mode 100644 assets/js/app.js create mode 100644 assets/js/external_links.js create mode 100644 assets/js/message_icons.js create mode 100644 assets/sass/_fonts.scss create mode 100644 assets/sass/_vars.scss create mode 100644 assets/sass/app.scss create mode 100644 assets/sass/error.scss create mode 100644 assets/sass/layout.scss create mode 100644 public/.gitkeep create mode 100644 webpack.config.js diff --git a/.gitignore b/.gitignore index eb79dd5..700344c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ node_modules .idea +public +dist \ No newline at end of file diff --git a/assets/config.json b/assets/config.json new file mode 100644 index 0000000..5c18915 --- /dev/null +++ b/assets/config.json @@ -0,0 +1,10 @@ +{ + "bundles": { + "app": "js/app.js", + "layout": "sass/layout.scss", + "error": "sass/error.scss", + "logo": "img/logo.svg", + "logo_png": "img/logox128.png", + "logo_png_xxl": "img/logox1024.png" + } +} \ No newline at end of file diff --git a/assets/img/logo.svg b/assets/img/logo.svg new file mode 100644 index 0000000..e81b818 --- /dev/null +++ b/assets/img/logo.svg @@ -0,0 +1,71 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/assets/img/logox1024.png b/assets/img/logox1024.png new file mode 100644 index 0000000000000000000000000000000000000000..f5894c04183b54fb175f42d95d0524a623eaa2b4 GIT binary patch literal 44311 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 literal 0 HcmV?d00001 diff --git a/assets/img/logox128.png b/assets/img/logox128.png new file mode 100644 index 0000000000000000000000000000000000000000..a1252a5699c5f7d90a53bc6514923011cea9f8ff GIT binary patch literal 4594 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 { + document.querySelectorAll('a[target="_blank"]').forEach(el => { + el.innerHTML += ``; + }); + + feather.replace(); +}); \ No newline at end of file diff --git a/assets/js/message_icons.js b/assets/js/message_icons.js new file mode 100644 index 0000000..b625f55 --- /dev/null +++ b/assets/js/message_icons.js @@ -0,0 +1,21 @@ +import feather from "feather-icons"; + +document.addEventListener('DOMContentLoaded', () => { + const messageTypeToIcon = { + info: 'info', + success: 'check', + warning: 'alert-triangle', + error: 'x-circle', + question: 'help-circle', + }; + document.querySelectorAll('.message').forEach(el => { + const type = el.dataset['type']; + const icon = el.querySelector('.icon'); + const svgContainer = document.createElement('div'); + svgContainer.innerHTML = feather.icons[messageTypeToIcon[type]].toSvg(); + el.insertBefore(svgContainer.firstChild, icon); + icon.remove(); + }); + + feather.replace(); +}); \ No newline at end of file diff --git a/assets/sass/_fonts.scss b/assets/sass/_fonts.scss new file mode 100644 index 0000000..6c26b55 --- /dev/null +++ b/assets/sass/_fonts.scss @@ -0,0 +1,81 @@ +/* vietnamese */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: local('Nunito Sans Light'), local('NunitoSans-Light'), url(https://fonts.gstatic.com/s/nunitosans/v5/pe03MImSLYBIv1o4X1M8cc8WAc5iU1EQVg.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: local('Nunito Sans Light'), local('NunitoSans-Light'), url(https://fonts.gstatic.com/s/nunitosans/v5/pe03MImSLYBIv1o4X1M8cc8WAc5jU1EQVg.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: local('Nunito Sans Light'), local('NunitoSans-Light'), url(https://fonts.gstatic.com/s/nunitosans/v5/pe03MImSLYBIv1o4X1M8cc8WAc5tU1E.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local('Nunito Sans Regular'), local('NunitoSans-Regular'), url(https://fonts.gstatic.com/s/nunitosans/v5/pe0qMImSLYBIv1o4X1M8cceyI9tScg.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local('Nunito Sans Regular'), local('NunitoSans-Regular'), url(https://fonts.gstatic.com/s/nunitosans/v5/pe0qMImSLYBIv1o4X1M8ccezI9tScg.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local('Nunito Sans Regular'), local('NunitoSans-Regular'), url(https://fonts.gstatic.com/s/nunitosans/v5/pe0qMImSLYBIv1o4X1M8cce9I9s.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: local('Nunito Sans Bold'), local('NunitoSans-Bold'), url(https://fonts.gstatic.com/s/nunitosans/v5/pe03MImSLYBIv1o4X1M8cc8GBs5iU1EQVg.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: local('Nunito Sans Bold'), local('NunitoSans-Bold'), url(https://fonts.gstatic.com/s/nunitosans/v5/pe03MImSLYBIv1o4X1M8cc8GBs5jU1EQVg.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: local('Nunito Sans Bold'), local('NunitoSans-Bold'), url(https://fonts.gstatic.com/s/nunitosans/v5/pe03MImSLYBIv1o4X1M8cc8GBs5tU1E.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/assets/sass/_vars.scss b/assets/sass/_vars.scss new file mode 100644 index 0000000..5c7b523 --- /dev/null +++ b/assets/sass/_vars.scss @@ -0,0 +1,23 @@ +$primary: #1e2932; +$primaryForeground: #f0f0f0; +$secondary: #00766c; +$secondaryForeground: $primaryForeground; + +$backgroundColor: $primary; +$defaultTextColor: $primaryForeground; + +$info: #49fb; +$infoText: darken($info, 42%); +$infoColor: desaturate($infoText, 50%); + +$success: #5f5b; +$successText: darken($success, 45%); +$successColor: desaturate($successText, 50%); + +$warning: #fc0b; +$warningText: darken($warning, 30%); +$warningColor: desaturate($warningText, 50%); + +$error: #f00b; +$errorText: darken($error, 30%); +$errorColor: desaturate($errorText, 50%); diff --git a/assets/sass/app.scss b/assets/sass/app.scss new file mode 100644 index 0000000..933fea1 --- /dev/null +++ b/assets/sass/app.scss @@ -0,0 +1 @@ +@import "layout"; \ No newline at end of file diff --git a/assets/sass/error.scss b/assets/sass/error.scss new file mode 100644 index 0000000..d36ad0b --- /dev/null +++ b/assets/sass/error.scss @@ -0,0 +1,90 @@ +@import "layout"; + +header, footer { + margin: 0; + padding: 0; + height: 0; +} + +main { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + + .messages { + margin-bottom: 32px; + } + + .error-code { + font-size: 36px; + } + + .error-message { + font-size: 32px; + } + + .error-instructions { + margin-top: 32px; + font-size: 20px; + } + + nav { + margin-top: 32px; + } + + &::before { + content: "Oops"; + position: absolute; + z-index: -1; + + font-size: #{'min(50vh, 40vw)'}; + opacity: 0.025; + } +} + +.contact { + text-align: center; + padding: 8px; +} + +.logo { + position: absolute; + top: 0; + left: 0; + width: 100%; + margin-top: 24px; + text-align: center; + + a { + position: relative; + padding: 16px; + + color: $defaultTextColor; + + &:hover { + color: #fff; + + &::before { + opacity: 0.2; + } + } + + &::before { + content: ""; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + + background-image: url(../img/logo.svg); + background-repeat: no-repeat; + background-position: center; + background-size: 64px; + + opacity: 0.075; + filter: contrast(0); + } + } +} \ No newline at end of file diff --git a/assets/sass/layout.scss b/assets/sass/layout.scss new file mode 100644 index 0000000..0eb03a5 --- /dev/null +++ b/assets/sass/layout.scss @@ -0,0 +1,512 @@ +@import "vars"; +@import 'fonts'; + +* { + box-sizing: border-box; +} + +html, body { + height: 100%; +} + +body { + display: flex; + flex-direction: column; + + margin: 0; + font-family: "Nunito Sans", sans-serif; + font-size: 16px; + + color: $defaultTextColor; + background-color: $backgroundColor; +} + +header { + display: flex; + flex-direction: row; + justify-content: space-between; + + $headerHeight: 64px; + height: $headerHeight; + line-height: $headerHeight; + + $headerBackground: darken($primary, 1.75%); + background-color: $headerBackground; + + .logo { + display: flex; + flex-direction: row; + + padding: 0 24px 0 16px; + font-size: 32px; + color: $defaultTextColor; + + &:hover { + color: lighten($defaultTextColor, 10%); + } + + img { + width: $headerHeight; + height: $headerHeight; + margin-right: 16px; + } + } + + nav ul { + display: flex; + flex-direction: row; + margin: 0; + padding: 0; + + font-size: 20px; + + li { + list-style: none; + + a, span { + display: flex; + flex-direction: row; + align-items: center; + height: 64px; + padding: 0 24px; + + .feather { + --icon-size: 24px; + margin-right: 10px; + } + } + + a:hover { + background-color: #fff1; + } + } + } +} + +footer { + padding: 8px; + margin-top: 8px; + text-align: center; + background-color: darken($primary, 3%); +} + +main { + flex: 1; + padding: 8px; +} + +h1 { + text-align: center; + font-size: 32px; + + & + p { + text-align: center; + font-size: 20px; + } +} + +h1, h2 { + font-weight: 100; +} + +h3, h4 { + font-weight: 300; +} + +section > h2, .panel > h2 { + display: flex; + flex-direction: row; + align-items: center; + position: relative; + text-align: center; + margin-top: 16px; + + &::before, &::after { + content: ""; + flex: 1; + margin: 0 32px; + height: 0; + border-bottom: 1px solid $defaultTextColor; + opacity: 0.2; + } +} + +section > hr, .panel > hr { + border: 0; + border-bottom: 1px solid $defaultTextColor; + opacity: 0.2; + + margin: 8px 32px; +} + +a { + color: $secondary; + text-decoration: none; + + &:hover { + color: lighten($secondary, 10%); + } + + .feather.feather-external-link { + --icon-size: 16px; + margin-left: 4px; + margin-top: -3px; + } +} + +form { + padding: 8px 16px; + text-align: center; + + .form-field { + position: relative; + display: flex; + flex-direction: column; + margin: 16px auto; + + label { + position: absolute; + left: 8px; + top: 20px; + user-select: none; + font-size: 16px; + opacity: 0.75; + + transition-property: top, font-size; + transition-duration: 150ms; + transition-timing-function: ease-out; + + cursor: text; + } + + input, select, .input-group { + border: 0; + border-bottom: 2px solid #0008; + color: $defaultTextColor; + background: rgba(255, 255, 255, 0.05); + border-radius: 3px 3px 0 0; + font-size: 16px; + + &:focus, &:not([value=""]) { + ~ label { + top: 8px; + font-size: 14px; + } + } + } + + input, select, .form-display { + display: block; + padding: 32px 8px 8px 8px; + width: 100%; + } + + select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + + &::-ms-expand { + display: none; + } + + & + .feather { + position: absolute; + z-index: -1; + right: 8px; + bottom: 8px; + + transition: transform 150ms ease-out; + } + + // Temporary + &:focus + .feather { + transform: rotateX(180deg); + } + } + + input[type=color] { + height: calc(32px + 8px + 32px); + } + + &.inline { + flex-direction: row; + + input[type=checkbox] { + text-align: left; + width: min-content; + height: min-content; + + & ~ label { + position: static; + display: inline; + padding-left: 8px; + font-size: 16px; + } + } + } + + .input-group { + display: flex; + flex-shrink: 1; + flex-direction: row; + + div { + position: relative; + flex: 1; + + input { + width: 100%; + margin-top: 24px; + padding-top: 8px; + border: 0; + background: transparent; + } + + > input + * { + position: absolute; + top: 32px; + right: 28px; + user-select: none; + text-align: right; + } + } + } + + .error, .hint { + padding: 2px; + text-align: left; + font-size: 14px; + + .feather { + --icon-size: 14px; + } + } + + .error { + color: $error; + } + } +} + +button, .button { + display: inline-flex; + margin: 8px; + padding: 12px 16px; + border: 0; + border-radius: 5px; + cursor: pointer; + + text-transform: uppercase; + font-size: 16px; + font-weight: bolder; + + line-height: 16px; + + .feather { + --icon-size: 16px; + margin-right: 8px; + } + + &, &.primary { + color: $primaryForeground; + background-color: $secondary; + + &:hover { + background-color: lighten($secondary, 10%); + } + } + + &.info { + background-color: $infoColor; + } + + &.success { + background-color: $successColor; + } + + &.warning { + background-color: $warningColor; + } + + &.error, &.danger { + background-color: $errorColor; + + &:hover { + background-color: lighten($errorColor, 10%); + } + } + + &.transparent { + background-color: transparent; + } + + &:hover { + color: $primaryForeground; + } +} + +.data-table { + width: 100%; + text-align: left; + border-collapse: collapse; + + th, td { + padding: 8px; + } + + th { + border-bottom: 1px solid #ffffff17; + } + + tr:nth-child(even) { + background-color: #ffffff08; + } + + tr:hover { + background-color: #ffffff18; + } + + thead tr:hover { + background-color: transparent; + } +} + +// --- +// --- Layout helpers +// --- +.center { + text-align: center; +} + +.container { + padding: 0 16px; + max-width: 632px; + margin: 0 auto; +} + +.panel { + margin: 16px 0; + padding: 8px; + border: 1px solid rgba(0, 0, 0, 0.1); + background-color: rgba(255, 255, 255, 0.03); + border-radius: 5px; + + p { + margin: 16px 8px; + } +} + +.sub-panel { + margin: 32px -18px; + padding: 1px 16px; + border: 2px solid rgba(255, 255, 255, 0.05); + border-radius: 5px; + + input, select, .input-group { + border-radius: 5px !important; + border-width: 0 !important; + } +} + + +// --- +// --- Feather +// --- +.feather { + flex-shrink: 0; + --icon-size: 24px; + width: var(--icon-size); + height: var(--icon-size); + stroke: currentColor; + stroke-width: 2; + stroke-linecap: square; + stroke-linejoin: miter; + fill: none; + vertical-align: middle; +} + +// --- +// --- Helper classes +// --- +.message { + display: flex; + flex-direction: row; + align-items: center; + + padding: 8px 16px; + + border-radius: 5px; + + .feather { + --icon-size: 24px; + margin-right: 8px; + } + + &:not(&-discreet) { + background-color: #fff5; + + &[data-type=info], &[data-type=question] { + background-color: $infoColor; + } + + &[data-type=success] { + background-color: $successColor; + } + + &[data-type=warning] { + background-color: $warningColor; + } + + &[data-type=error] { + background-color: $errorColor; + } + } + + &-discreet { + opacity: 0.75; + + .feather { + --icon-size: 20px; + } + } +} + +.messages .message:not(:last-child) { + margin-bottom: 8px; +} + +.container > .messages:first-child { + margin-top: 16px; +} + +.copyable-text { + display: flex; + flex-direction: row; + margin: 8px; + + background-color: darken($backgroundColor, 2%); + border-radius: 5px; + overflow: hidden; + + .title { + padding: 8px; + } + + .content { + overflow: hidden; + white-space: nowrap; + padding: 8px; + } + + .copy-button { + margin: 0; + padding: 0; + border-radius: 0; + + .feather { + --icon-size: 20px; + margin: 8px; + } + } +} \ No newline at end of file diff --git a/package.json b/package.json index 9ce3150..d088e21 100644 --- a/package.json +++ b/package.json @@ -2,19 +2,48 @@ "name": "aldap", "version": "0.1.0", "description": "Authentication LDAP server", - "main": "index.js", "repository": "git@gitlab.com:ArisuOngaku/aldap.git", "author": "Alice Gaudon ", - "license": "MIT", "private": true, + "main": "dist/main.js", + "scripts": { + "test": "jest --verbose --runInBand", + "dist-webpack": "webpack --mode production", + "dist": "tsc && npm run dist-webpack", + "dev": "concurrently -k -n \"Typescript,Node,Webpack,Maildev\" -p \"[{name}]\" -c \"blue,green,red,yellow\" \"tsc --watch\" \"nodemon dist/main.js\" \"webpack --watch --mode development\" \"maildev\"", + "start": "yarn dist && node dist/main.js" + }, "devDependencies": { + "@babel/core": "^7.9.0", + "@babel/preset-env": "^7.9.5", + "@types/config": "^0.0.36", + "@types/express": "^4.17.6", "@types/node": "^13.13.2", + "babel-loader": "^8.1.0", + "concurrently": "^5.1.0", + "css-loader": "^3.5.2", + "feather-icons": "^4.28.0", + "file-loader": "^6.0.0", + "imagemin": "^7.0.1", + "imagemin-gifsicle": "^7.0.0", + "imagemin-mozjpeg": "^8.0.0", + "imagemin-pngquant": "^8.0.0", + "imagemin-svgo": "^7.1.0", + "img-loader": "^3.0.1", "jest": "^25.4.0", + "mini-css-extract-plugin": "^0.9.0", + "node-sass": "^4.14.0", + "nodemon": "^2.0.3", + "sass-loader": "^8.0.2", "ts-jest": "^25.4.0", "typescript": "^3.8.3", + "uglifyjs-webpack-plugin": "^2.2.0", + "webpack": "^4.43.0", + "webpack-cli": "^3.3.11", "wms-core": "^0.2.0" }, "dependencies": { - "config": "^3.3.1" + "config": "^3.3.1", + "express": "^4.17.1" } } diff --git a/public/.gitkeep b/public/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..478541b --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,86 @@ +const path = require('path'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); + +const dev = process.env.NODE_ENV === 'development'; + +const userConfig = require('./assets/config.json'); +for (const b in userConfig.bundles) { + if (userConfig.bundles.hasOwnProperty(b)) { + userConfig.bundles[b] = `./assets/${userConfig.bundles[b]}`; + } +} + +const config = { + entry: userConfig.bundles, + output: { + path: path.resolve(__dirname, 'public/js'), + filename: '[name].js' + }, + devtool: dev ? 'eval-source-map' : undefined, + module: { + rules: [ + { + test: /\.js$/i, + use: [ + { + loader: 'babel-loader', + options: { + presets: ['@babel/preset-env'], + } + } + ] + }, + { + test: /\.s[ac]ss$/i, + use: [ + { + loader: MiniCssExtractPlugin.loader, + options: { + publicPath: '/', + } + }, + 'css-loader', + 'sass-loader', + ] + }, + { + test: /\.(woff2?|eot|ttf|otf)$/i, + use: 'file-loader?name=../fonts/[name].[ext]', + }, + { + test: /\.(png|jpe?g|gif|svg)$/i, + use: [ + 'file-loader?name=../img/[name].[ext]', + { + loader: 'img-loader', + options: { + enabled: !dev, + plugins: [ + require('imagemin-gifsicle')({}), + require('imagemin-mozjpeg')({}), + require('imagemin-pngquant')({}), + require('imagemin-svgo')({}), + ] + } + } + ] + } + ], + }, + plugins: [ + new MiniCssExtractPlugin({ + filename: '../css/[name].css', + }), + ] +}; + +if (!dev) { + config.optimization = { + minimizer: [ + new UglifyJSPlugin(), + ] + }; +} + +module.exports = config; \ No newline at end of file