From 2f99c9f5add9876036bc2d176cbe1afa7aeeebdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20B=C3=A4dorf?= Date: Thu, 17 Feb 2022 14:04:19 +0000 Subject: [PATCH] First version of design system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add SPOT foundation styles * Initial work on buttons * Implement basic examples page * Improve spot-checkbox * Add outline buttons in HTML * Checkbox works * Add filter chips * Initial text field implementation * Chip field initial implementation, add filter-chip component * Keep old styleguide page * Add drop modal component * Finish checkbox list * Improve action bar * Add drop modal alignment options * Fix drop modal zindex * Make sure clicks do not close the drop modal, add escape closing event for drop modal * Add spot-body * Don't hide drop modal body via display * Update buttons and colors * Add basic button type * Set line height for typography styles * Add basic toggle component * Better docs * Fix toggle font size * Add current date color * Fix names for form components * Fix package-lock.json Co-authored-by: Henriette Darge Co-authored-by: Oliver Günther --- config/routes.rb | 1 + frontend/package-lock.json | 1214 ++++++++++++++++- frontend/package.json | 5 +- frontend/src/app/app.module.ts | 3 + .../option-list/option-list.component.ts | 7 +- .../spot/components/checkbox.component.html | 10 + .../app/spot/components/checkbox.component.ts | 69 + .../spot/components/chip-field.component.html | 30 + .../spot/components/chip-field.component.ts | 94 ++ .../spot/components/drop-modal.component.html | 8 + .../spot/components/drop-modal.component.ts | 74 + .../components/filter-chip.component.html | 7 + .../spot/components/filter-chip.component.ts | 20 + .../spot/components/text-field.component.html | 10 + .../spot/components/text-field.component.ts | 60 + .../app/spot/components/toggle.component.html | 13 + .../app/spot/components/toggle.component.ts | 59 + .../src/app/spot/spot-docs.component.html | 215 +++ frontend/src/app/spot/spot-docs.component.ts | 35 + frontend/src/app/spot/spot.module.ts | 40 + frontend/src/app/spot/spot.routes.ts | 41 + .../spot/styles/sass/blocks/action-bar.sass | 26 + .../src/app/spot/styles/sass/blocks/body.sass | 13 + .../app/spot/styles/sass/blocks/button.sass | 182 +++ .../app/spot/styles/sass/blocks/checkbox.sass | 62 + .../spot/styles/sass/blocks/chip-field.sass | 7 + .../spot/styles/sass/blocks/drop-modal.sass | 43 + .../spot/styles/sass/blocks/filter-chip.sass | 24 + .../app/spot/styles/sass/blocks/index.sass | 12 + .../src/app/spot/styles/sass/blocks/list.sass | 28 + .../spot/styles/sass/blocks/text-field.sass | 32 + .../app/spot/styles/sass/blocks/toggle.sass | 44 + frontend/src/app/spot/styles/sass/index.sass | 4 + .../src/app/spot/styles/sass/typography.sass | 48 + .../src/app/spot/styles/sass/variables.sass | 1 + frontend/src/app/spot/styles/sass/zindex.sass | 6 + .../src/app/spot/styles/tokens/colors.yml | 66 + .../app/spot/styles/tokens/dist/tokens.json | 57 + .../app/spot/styles/tokens/dist/tokens.sass | 56 + .../src/app/spot/styles/tokens/shadows.yml | 18 + .../src/app/spot/styles/tokens/spacings.yml | 47 + .../src/app/spot/styles/tokens/tokens.yml | 4 + frontend/src/global_styles/openproject.sass | 1 + nix/shell.nix | 3 +- 44 files changed, 2784 insertions(+), 15 deletions(-) create mode 100644 frontend/src/app/spot/components/checkbox.component.html create mode 100644 frontend/src/app/spot/components/checkbox.component.ts create mode 100644 frontend/src/app/spot/components/chip-field.component.html create mode 100644 frontend/src/app/spot/components/chip-field.component.ts create mode 100644 frontend/src/app/spot/components/drop-modal.component.html create mode 100644 frontend/src/app/spot/components/drop-modal.component.ts create mode 100644 frontend/src/app/spot/components/filter-chip.component.html create mode 100644 frontend/src/app/spot/components/filter-chip.component.ts create mode 100644 frontend/src/app/spot/components/text-field.component.html create mode 100644 frontend/src/app/spot/components/text-field.component.ts create mode 100644 frontend/src/app/spot/components/toggle.component.html create mode 100644 frontend/src/app/spot/components/toggle.component.ts create mode 100644 frontend/src/app/spot/spot-docs.component.html create mode 100644 frontend/src/app/spot/spot-docs.component.ts create mode 100644 frontend/src/app/spot/spot.module.ts create mode 100644 frontend/src/app/spot/spot.routes.ts create mode 100644 frontend/src/app/spot/styles/sass/blocks/action-bar.sass create mode 100644 frontend/src/app/spot/styles/sass/blocks/body.sass create mode 100644 frontend/src/app/spot/styles/sass/blocks/button.sass create mode 100644 frontend/src/app/spot/styles/sass/blocks/checkbox.sass create mode 100644 frontend/src/app/spot/styles/sass/blocks/chip-field.sass create mode 100644 frontend/src/app/spot/styles/sass/blocks/drop-modal.sass create mode 100644 frontend/src/app/spot/styles/sass/blocks/filter-chip.sass create mode 100644 frontend/src/app/spot/styles/sass/blocks/index.sass create mode 100644 frontend/src/app/spot/styles/sass/blocks/list.sass create mode 100644 frontend/src/app/spot/styles/sass/blocks/text-field.sass create mode 100644 frontend/src/app/spot/styles/sass/blocks/toggle.sass create mode 100644 frontend/src/app/spot/styles/sass/index.sass create mode 100644 frontend/src/app/spot/styles/sass/typography.sass create mode 100644 frontend/src/app/spot/styles/sass/variables.sass create mode 100644 frontend/src/app/spot/styles/sass/zindex.sass create mode 100644 frontend/src/app/spot/styles/tokens/colors.yml create mode 100644 frontend/src/app/spot/styles/tokens/dist/tokens.json create mode 100644 frontend/src/app/spot/styles/tokens/dist/tokens.sass create mode 100644 frontend/src/app/spot/styles/tokens/shadows.yml create mode 100644 frontend/src/app/spot/styles/tokens/spacings.yml create mode 100644 frontend/src/app/spot/styles/tokens/tokens.yml diff --git a/config/routes.rb b/config/routes.rb index 5c183e85bb..e7675eb845 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -583,6 +583,7 @@ OpenProject::Application.routes.draw do # Development route for styleguide if Rails.env.development? + get '/spot-docs', to: 'angular#empty_layout' get '/styleguide' => redirect('/assets/styleguide.html') end end diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 4452875dd9..a46dfc9918 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -4840,11 +4840,128 @@ "resolved": "https://registry.npmjs.org/animation-frame-polyfill/-/animation-frame-polyfill-1.0.1.tgz", "integrity": "sha1-X1rZk6eHlL0Xas3lttzmKGdBDJ0=" }, + "ansi-bgblack": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz", + "integrity": "sha1-poulAHiHcBtqr74/oNrf36juPKI=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgblue": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz", + "integrity": "sha1-Z73ATtybm1J4lp2hlt6j11yMNhM=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgcyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz", + "integrity": "sha1-WEiUJWAL3p9VBwaN2Wnr/bUP52g=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bggreen": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz", + "integrity": "sha1-TjGRJIUplD9DIelr8THRwTgWr0k=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgmagenta": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz", + "integrity": "sha1-myhDLAduqpmUGGcqPvvhk5HCx6E=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgred": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgred/-/ansi-bgred-0.1.1.tgz", + "integrity": "sha1-p2+Sg4OCukMpCmwXeEJPmE1vEEE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgwhite": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz", + "integrity": "sha1-ZQRlE3elim7OzQMxmU5IAljhG6g=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgyellow": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz", + "integrity": "sha1-w/4usIzUdmSAKeaHTRWgs49h1E8=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-black": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-black/-/ansi-black-0.1.1.tgz", + "integrity": "sha1-9hheiJNgslRaHsUMC/Bj/EMDJFM=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-blue": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-blue/-/ansi-blue-0.1.1.tgz", + "integrity": "sha1-FbgEmQ6S/JyoxUds6PaZd3wh7b8=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bold": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bold/-/ansi-bold-0.1.1.tgz", + "integrity": "sha1-PmOVCvWswq4uZw5vZ96xFdGl9QU=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-dim": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-dim/-/ansi-dim-0.1.1.tgz", + "integrity": "sha1-QN5MYDqoCG2Oeoa4/5mNXDbu/Ww=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -4853,17 +4970,107 @@ "type-fest": "^0.21.3" } }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-green": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz", + "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-grey": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-grey/-/ansi-grey-0.1.1.tgz", + "integrity": "sha1-WdmLasK6GfilF5jphT+6eDOaM8E=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-hidden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-hidden/-/ansi-hidden-0.1.1.tgz", + "integrity": "sha1-7WpMSY0rt8uyidvyqNHcyFZ/rg8=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", "dev": true }, + "ansi-inverse": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-inverse/-/ansi-inverse-0.1.1.tgz", + "integrity": "sha1-tq9Fgm/oJr+1KKbHmIV5Q1XM0mk=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-italic": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-italic/-/ansi-italic-0.1.1.tgz", + "integrity": "sha1-EEdDRj9iXBQqA2c5z4XtpoiYbyM=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-magenta": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-magenta/-/ansi-magenta-0.1.1.tgz", + "integrity": "sha1-BjtboW+z8j4c/aKwfAqJ3hHkMK4=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, + "ansi-reset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-reset/-/ansi-reset-0.1.1.tgz", + "integrity": "sha1-5+cSksPH3c1NYu9KbHwFmAkRw7c=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-strikethrough": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz", + "integrity": "sha1-2Eh3FAss/wfRyT685pkE9oiF5Wg=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -4872,6 +5079,39 @@ "color-convert": "^1.9.0" } }, + "ansi-underline": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-underline/-/ansi-underline-0.1.1.tgz", + "integrity": "sha1-38kg9Ml7WXfqFi34/7mIMIqqcaQ=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-white": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-white/-/ansi-white-0.1.1.tgz", + "integrity": "sha1-nHe3wZPF7pkuYBHTbsTJIbRXiUQ=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "ansi-yellow": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-yellow/-/ansi-yellow-0.1.1.tgz", + "integrity": "sha1-y5NW8vRscy8OMZnmEClVp32oPB0=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -4967,6 +5207,25 @@ "is-string": "^1.0.5" } }, + "array-sort": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-0.1.4.tgz", + "integrity": "sha512-BNcM+RXxndPxiZ2rd76k6nyQLRZr2/B/sdi8pQ+Joafr5AH279L40dfokSUTp8O+AaqYjXWhblBWa2st2nc4fQ==", + "dev": true, + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -5995,6 +6254,23 @@ "typedarray": "^0.0.6" } }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "confusing-browser-globals": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", @@ -6218,6 +6494,12 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "core.lambda": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/core.lambda/-/core.lambda-1.0.0.tgz", + "integrity": "sha1-EmCyV9SLb4MMBgvx/OVnZp9NHTU=", + "dev": true + }, "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -6246,6 +6528,38 @@ "yaml": "^1.10.0" } }, + "create-frame": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/create-frame/-/create-frame-1.0.0.tgz", + "integrity": "sha1-i5XyaR4ySbYIBEPjPQutn49pdao=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "isobject": "^3.0.0", + "lazy-cache": "^2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "create-point-cb": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-point-cb/-/create-point-cb-1.2.0.tgz", @@ -6802,12 +7116,38 @@ "assert-plus": "^1.0.0" } }, + "data.either": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/data.either/-/data.either-1.5.1.tgz", + "integrity": "sha1-cfnb/I/jqwES5S5ENHC81Sb1C0c=", + "dev": true + }, "date-format": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", "integrity": "sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ==", "dev": true }, + "date.js": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/date.js/-/date.js-0.3.3.tgz", + "integrity": "sha512-HgigOS3h3k6HnW011nAb43c5xx5rBXk8P2v/WIT9Zv4koIaVXiH2BURguI78VVp+5Qc076T7OR378JViCnZtBw==", + "dev": true, + "requires": { + "debug": "~3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -6854,6 +7194,23 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "default-gateway": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", @@ -7385,6 +7742,12 @@ "is-arrayish": "^0.2.1" } }, + "error-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/error-symbol/-/error-symbol-0.1.0.tgz", + "integrity": "sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y=", + "dev": true + }, "es-abstract": { "version": "1.18.0-next.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", @@ -8465,6 +8828,23 @@ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", "dev": true }, + "falsey": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/falsey/-/falsey-0.3.2.tgz", + "integrity": "sha512-lxEuefF5MBIVDmE6XeqCdM4BWk1+vYmGZtkbKZ/VFcg6uBBw6fXNEbWmxCjDdQlFc9hy450nkiWwM3VAW6G1qg==", + "dev": true, + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -8712,6 +9092,15 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -8776,6 +9165,12 @@ "readable-stream": "^2.0.0" } }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true + }, "fs-extra": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", @@ -8912,6 +9307,42 @@ "has-symbols": "^1.0.1" } }, + "get-object": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/get-object/-/get-object-0.2.0.tgz", + "integrity": "sha1-2S/31RkMZFMM2gVD2sY6PUf+jAw=", + "dev": true, + "requires": { + "is-number": "^2.0.2", + "isobject": "^0.2.0" + }, + "dependencies": { + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-0.2.0.tgz", + "integrity": "sha1-o0MhkvObkQtfAsyYlIeDbscKqF4=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -8985,26 +9416,299 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" }, + "gulp-header": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", + "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==", + "dev": true, + "requires": { + "concat-with-sourcemaps": "*", + "lodash.template": "^4.4.0", + "through2": "^2.0.0" + } + }, "gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, "requires": { - "duplexer": "^0.1.2" + "duplexer": "^0.1.2" + } + }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "handlebars-helper-create-frame": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/handlebars-helper-create-frame/-/handlebars-helper-create-frame-0.1.0.tgz", + "integrity": "sha1-iqUdEK62QI/MZgXUDXc1YohIegM=", + "dev": true, + "requires": { + "create-frame": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "handlebars-helpers": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/handlebars-helpers/-/handlebars-helpers-0.10.0.tgz", + "integrity": "sha512-QiyhQz58u/DbuV41VnfpE0nhy6YCH4vB514ajysV8SoKmP+DxU+pR+fahVyNECHj+jiwEN2VrvxD/34/yHaLUg==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-sort": "^0.1.4", + "create-frame": "^1.0.0", + "define-property": "^1.0.0", + "falsey": "^0.3.2", + "for-in": "^1.0.2", + "for-own": "^1.0.0", + "get-object": "^0.2.0", + "get-value": "^2.0.6", + "handlebars": "^4.0.11", + "handlebars-helper-create-frame": "^0.1.0", + "handlebars-utils": "^1.0.6", + "has-value": "^1.0.0", + "helper-date": "^1.0.1", + "helper-markdown": "^1.0.0", + "helper-md": "^0.2.2", + "html-tag": "^2.0.0", + "is-even": "^1.0.0", + "is-glob": "^4.0.0", + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "lazy-cache": "^2.0.2", + "logging-helpers": "^1.0.0", + "micromatch": "^3.1.4", + "relative": "^3.0.2", + "striptags": "^3.1.0", + "to-gfm-code-block": "^0.1.1", + "year": "^0.2.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + } + } + }, + "handlebars-utils": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/handlebars-utils/-/handlebars-utils-1.0.6.tgz", + "integrity": "sha512-d5mmoQXdeEqSKMtQQZ9WkiUcO1E3tPbWxluCK9hVgIDPzQa9WsKo3Lbe/sGflTe7TomHEeZaOgwIkyIr1kfzkw==", + "dev": true, + "requires": { + "kind-of": "^6.0.0", + "typeof-article": "^0.1.1" } }, - "hammerjs": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", - "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -9156,6 +9860,97 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, + "helper-date": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/helper-date/-/helper-date-1.0.1.tgz", + "integrity": "sha512-wU3VOwwTJvGr/w5rZr3cprPHO+hIhlblTJHD6aFBrKLuNbf4lAmkawd2iK3c6NbJEvY7HAmDpqjOFSI5/+Ey2w==", + "dev": true, + "requires": { + "date.js": "^0.3.1", + "handlebars-utils": "^1.0.4", + "moment": "^2.18.1" + } + }, + "helper-markdown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/helper-markdown/-/helper-markdown-1.0.0.tgz", + "integrity": "sha512-AnDqMS4ejkQK0MXze7pA9TM3pu01ZY+XXsES6gEE0RmCGk5/NIfvTn0NmItfyDOjRAzyo9z6X7YHbHX4PzIvOA==", + "dev": true, + "requires": { + "handlebars-utils": "^1.0.2", + "highlight.js": "^9.12.0", + "remarkable": "^1.7.1" + }, + "dependencies": { + "autolinker": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz", + "integrity": "sha1-BlK0kYgYefB3XazgzcoyM5QqTkc=", + "dev": true, + "requires": { + "gulp-header": "^1.7.1" + } + }, + "highlight.js": { + "version": "9.18.5", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.5.tgz", + "integrity": "sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==", + "dev": true + }, + "remarkable": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz", + "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==", + "dev": true, + "requires": { + "argparse": "^1.0.10", + "autolinker": "~0.28.0" + } + } + } + }, + "helper-md": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/helper-md/-/helper-md-0.2.2.tgz", + "integrity": "sha1-wfWdflW7riM2L9ig6XFgeuxp1B8=", + "dev": true, + "requires": { + "ent": "^2.2.0", + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "remarkable": "^1.6.2" + }, + "dependencies": { + "autolinker": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz", + "integrity": "sha1-BlK0kYgYefB3XazgzcoyM5QqTkc=", + "dev": true, + "requires": { + "gulp-header": "^1.7.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "remarkable": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz", + "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==", + "dev": true, + "requires": { + "argparse": "^1.0.10", + "autolinker": "~0.28.0" + } + } + } + }, "highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -9201,6 +9996,16 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "html-tag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tag/-/html-tag-2.0.0.tgz", + "integrity": "sha512-XxzooSo6oBoxBEUazgjdXj7VwTn/iSTSZzTYKzYY6I916tkaYzypHxy+pbVU1h+0UQ9JlVf5XkNQyxOAiiQO1g==", + "dev": true, + "requires": { + "is-self-closing": "^1.0.1", + "kind-of": "^6.0.0" + } + }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -9509,6 +10314,12 @@ "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" }, + "immutable-ext": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/immutable-ext/-/immutable-ext-1.1.2.tgz", + "integrity": "sha512-hJ8s03f3U8lfE9ecb8ZafLvLj9Ptpd5YNHD+VYSu1QPCP1knab1VpUJ5QlixlRosUQ6uY45gVl9evuqSHeodWQ==", + "dev": true + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -9606,6 +10417,12 @@ "wrappy": "1" } }, + "info-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/info-symbol/-/info-symbol-0.1.0.tgz", + "integrity": "sha1-J4QdcoZ920JCzWEtecEGM4gcang=", + "dev": true + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -9909,6 +10726,15 @@ "is-window": "^1.0.2" } }, + "is-even": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-even/-/is-even-1.0.0.tgz", + "integrity": "sha1-drUFX7rY0pSoa2qUkBXhyXtxfAY=", + "dev": true, + "requires": { + "is-odd": "^0.1.2" + } + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -9970,6 +10796,35 @@ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==" }, + "is-odd": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-0.1.2.tgz", + "integrity": "sha1-vFc7XONx7yqtbm9JeZtyvvE5eKc=", + "dev": true, + "requires": { + "is-number": "^3.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -10024,6 +10879,15 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, + "is-self-closing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-self-closing/-/is-self-closing-1.0.1.tgz", + "integrity": "sha512-E+60FomW7Blv5GXTlYee2KDrnG6srxF7Xt1SjrhWUGUEsTFIqY/nq2y3DaftCsgUMdh89V07IVfhY9KIJhLezg==", + "dev": true, + "requires": { + "self-closing-tags": "^1.0.1" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -10680,6 +11544,15 @@ "language-subtag-registry": "~0.3.2" } }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "dev": true, + "requires": { + "set-getter": "^0.1.0" + } + }, "less": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/less/-/less-4.1.1.tgz", @@ -10826,6 +11699,12 @@ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -10849,6 +11728,25 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -10861,6 +11759,16 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, + "log-ok": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz", + "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=", + "dev": true, + "requires": { + "ansi-green": "^0.1.1", + "success-symbol": "^0.1.0" + } + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -10915,6 +11823,58 @@ } } }, + "log-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.2.1.tgz", + "integrity": "sha1-pMIXoN2aUFFdm5ICBgkas9TgMc8=", + "dev": true, + "requires": { + "ansi-colors": "^0.2.0", + "error-symbol": "^0.1.0", + "info-symbol": "^0.1.0", + "log-ok": "^0.1.1", + "success-symbol": "^0.1.0", + "time-stamp": "^1.0.1", + "warning-symbol": "^0.1.0" + }, + "dependencies": { + "ansi-colors": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-0.2.0.tgz", + "integrity": "sha1-csMd4qDZoszQysMMyYI+6y9kNLU=", + "dev": true, + "requires": { + "ansi-bgblack": "^0.1.1", + "ansi-bgblue": "^0.1.1", + "ansi-bgcyan": "^0.1.1", + "ansi-bggreen": "^0.1.1", + "ansi-bgmagenta": "^0.1.1", + "ansi-bgred": "^0.1.1", + "ansi-bgwhite": "^0.1.1", + "ansi-bgyellow": "^0.1.1", + "ansi-black": "^0.1.1", + "ansi-blue": "^0.1.1", + "ansi-bold": "^0.1.1", + "ansi-cyan": "^0.1.1", + "ansi-dim": "^0.1.1", + "ansi-gray": "^0.1.1", + "ansi-green": "^0.1.1", + "ansi-grey": "^0.1.1", + "ansi-hidden": "^0.1.1", + "ansi-inverse": "^0.1.1", + "ansi-italic": "^0.1.1", + "ansi-magenta": "^0.1.1", + "ansi-red": "^0.1.1", + "ansi-reset": "^0.1.1", + "ansi-strikethrough": "^0.1.1", + "ansi-underline": "^0.1.1", + "ansi-white": "^0.1.1", + "ansi-yellow": "^0.1.1", + "lazy-cache": "^2.0.1" + } + } + } + }, "log4js": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz", @@ -10945,6 +11905,16 @@ } } }, + "logging-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/logging-helpers/-/logging-helpers-1.0.0.tgz", + "integrity": "sha512-qyIh2goLt1sOgQQrrIWuwkRjUx4NUcEqEGAcYqD8VOnOC6ItwkrVE8/tA4smGpjzyp4Svhc6RodDp9IO5ghpyA==", + "dev": true, + "requires": { + "isobject": "^3.0.0", + "log-utils": "^0.2.1" + } + }, "loglevel": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", @@ -10959,6 +11929,12 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, "lowlight": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", @@ -11566,6 +12542,15 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, "node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -12058,6 +13043,24 @@ } } }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -14658,6 +15661,26 @@ } } }, + "relative": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/relative/-/relative-3.0.2.tgz", + "integrity": "sha1-Dc2OxUpdNaPBXhBFA9ZTdbWlNn8=", + "dev": true, + "requires": { + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, "remarkable": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz", @@ -15225,6 +16248,12 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", "dev": true }, + "self-closing-tags": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/self-closing-tags/-/self-closing-tags-1.0.1.tgz", + "integrity": "sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA==", + "dev": true + }, "selfsigned": { "version": "1.10.11", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", @@ -15367,6 +16396,15 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "set-getter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz", + "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==", + "dev": true, + "requires": { + "to-object-path": "^0.3.0" + } + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -16310,6 +17348,12 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "striptags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.2.0.tgz", + "integrity": "sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==", + "dev": true + }, "style-loader": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.2.1.tgz", @@ -16376,6 +17420,12 @@ "normalize-path": "^3.0.0" } }, + "success-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz", + "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc=", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -16746,6 +17796,83 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "theo": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/theo/-/theo-8.1.5.tgz", + "integrity": "sha512-K2veBfvmNKzox3dkjVJIOCPFhu8DK2YqOpYe68yvD9VjD+g7vqqQQ9f8uvdCxhDnQbHJVo8GFgtBQZjJA/DKJw==", + "dev": true, + "requires": { + "core.lambda": "1.0.0", + "data.either": "1.5.1", + "fs-extra": "5.0.0", + "glob": "7.1.2", + "handlebars": "^4.7.2", + "handlebars-helpers": "0.10.0", + "immutable": "3.8.2", + "immutable-ext": "1.1.2", + "js-yaml": "3.13.1", + "json5": "0.5.1", + "lodash": "^4.17.15", + "no-case": "2.3.2", + "resolve-from": "4.0.0", + "tinycolor2": "1.4.1", + "xml": "1.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -16771,6 +17898,12 @@ "resolved": "https://registry.npmjs.org/ticky/-/ticky-1.0.1.tgz", "integrity": "sha1-t8+nHnaPHJAAxJe5FRswlHxQ5G0=" }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, "timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", @@ -16786,6 +17919,12 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, + "tinycolor2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", + "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=", + "dev": true + }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -16817,6 +17956,12 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, + "to-gfm-code-block": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-gfm-code-block/-/to-gfm-code-block-0.1.1.tgz", + "integrity": "sha1-JdBFpfrlUxielje1kJANpzLYqoI=", + "dev": true + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -17029,6 +18174,26 @@ } } }, + "typeof-article": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/typeof-article/-/typeof-article-0.1.1.tgz", + "integrity": "sha1-nwfnM8P7tkb/qeYcCN66zUYOBq8=", + "dev": true, + "requires": { + "kind-of": "^3.1.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "typescript": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", @@ -17041,6 +18206,13 @@ "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", "dev": true }, + "uglify-js": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.1.tgz", + "integrity": "sha512-FAGKF12fWdkpvNJZENacOH0e/83eG6JyVQyanIJaBXCN1J11TUQv1T1/z8S+Z0CG0ZPk1nPcreF/c7lrTd0TEQ==", + "dev": true, + "optional": true + }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -17318,6 +18490,12 @@ "makeerror": "1.0.x" } }, + "warning-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/warning-symbol/-/warning-symbol-0.1.0.tgz", + "integrity": "sha1-uzHdEbeg+dZ6su2V9Fe2WCW7rSE=", + "dev": true + }, "watchpack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", @@ -18108,6 +19286,12 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -18212,6 +19396,12 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, + "year": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/year/-/year-0.2.1.tgz", + "integrity": "sha1-QIOuUgoxiyPshgN/MADLiSvfm7A=", + "dev": true + }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index 31fc015965..65987f34f0 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -23,6 +23,7 @@ "@types/jquery": "^3.3.33", "@types/jqueryui": "^1.12.10", "@types/lodash": "^4.14.149", + "@types/mime": "^2.0.3", "@types/moment-timezone": "^0.5.12", "@types/mousetrap": "^1.6.3", "@types/pako": "^1.0.1", @@ -33,7 +34,6 @@ "@typescript-eslint/eslint-plugin": "4.23.0", "@typescript-eslint/parser": "4.23.0", "browserslist": "^4.9.1", - "@types/mime": "^2.0.3", "codelyzer": "^6.0.0", "eslint": "^7.26.0", "eslint-config-airbnb-base": "^14.2.1", @@ -54,7 +54,9 @@ "karma-jasmine": "~3.3.0", "karma-jasmine-html-reporter": "^1.5.0", "karma-spec-reporter": "^0.0.32", + "optimist": "^0.6.1", "source-map-explorer": "^2.5.2", + "theo": "^8.1.5", "ts-node": "~8.3.0", "typescript": "~4.2.4", "webpack-bundle-analyzer": "^4.4.2" @@ -143,6 +145,7 @@ "prebuild": "./scripts/link_plugin_placeholder.js", "build": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build --configuration production --named-chunks --extract-css --source-map", "build:watch": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build --watch --named-chunks --extract-css", + "tokens:generate": "theo src/app/spot/styles/tokens/tokens.yml --transform web --format sass,json --dest src/app/spot/styles/tokens/dist", "preserve": "./scripts/link_plugin_placeholder.js", "serve": "NG_PERSISTENT_BUILD_CACHE=1 node --max_old_space_size=8096 ./node_modules/@angular/cli/bin/ng serve --host 0.0.0.0 --public-host http://localhost:4200", "serve:test": "NG_PERSISTENT_BUILD_CACHE=1 node --max_old_space_size=8096 ./node_modules/@angular/cli/bin/ng serve --host 0.0.0.0 --disable-host-check --public-host http://frontend-test:4200", diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index 6bc6835b2b..7fc9b8e5f3 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -37,6 +37,7 @@ import { OpContextMenuTrigger } from 'core-app/shared/components/op-context-menu import { States } from 'core-app/core/states/states.service'; import { OpenprojectFieldsModule } from 'core-app/shared/components/fields/openproject-fields.module'; import { OPSharedModule } from 'core-app/shared/shared.module'; +import { OpSpotModule } from 'core-app/spot/spot.module'; import { OpDragScrollDirective } from 'core-app/shared/directives/op-drag-scroll/op-drag-scroll.directive'; import { DynamicBootstrapper } from 'core-app/core/setup/globals/dynamic-bootstrapper'; import { OpenprojectWorkPackagesModule } from 'core-app/features/work-packages/openproject-work-packages.module'; @@ -109,6 +110,8 @@ export function initializeServices(injector:Injector) { BrowserModule, // Commons OPSharedModule, + // Design System + OpSpotModule, // State module OpenProjectStateModule, // Router module diff --git a/frontend/src/app/shared/components/option-list/option-list.component.ts b/frontend/src/app/shared/components/option-list/option-list.component.ts index 0dc6323c21..eb881fcfc7 100644 --- a/frontend/src/app/shared/components/option-list/option-list.component.ts +++ b/frontend/src/app/shared/components/option-list/option-list.component.ts @@ -1,5 +1,10 @@ import { - Component, EventEmitter, forwardRef, HostBinding, Input, Output, + Component, + EventEmitter, + forwardRef, + HostBinding, + Input, + Output, } from '@angular/core'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; diff --git a/frontend/src/app/spot/components/checkbox.component.html b/frontend/src/app/spot/components/checkbox.component.html new file mode 100644 index 0000000000..25ce053977 --- /dev/null +++ b/frontend/src/app/spot/components/checkbox.component.html @@ -0,0 +1,10 @@ + + diff --git a/frontend/src/app/spot/components/checkbox.component.ts b/frontend/src/app/spot/components/checkbox.component.ts new file mode 100644 index 0000000000..f9a06c00cf --- /dev/null +++ b/frontend/src/app/spot/components/checkbox.component.ts @@ -0,0 +1,69 @@ +import { + Component, + ElementRef, + EventEmitter, + ViewChild, + forwardRef, + HostBinding, + Input, + Output, +} from '@angular/core'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; + +export type SpotCheckboxState = true|false|null; + +@Component({ + selector: 'spot-checkbox', + templateUrl: './checkbox.component.html', + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => SpotCheckboxComponent), + multi: true, + }], +}) +export class SpotCheckboxComponent implements ControlValueAccessor { + @HostBinding('class.spot-checkbox') public className = true; + + @ViewChild('input') public input:ElementRef; + + @Input() disabled = false; + + @Input() name = `spot-checkbox-${+(new Date())}`; + + @Output() checkedChange = new EventEmitter(); + + @Input() public checked = false; + + onStateChange() { + const value = this.input.nativeElement.checked; + this.checkedChange.emit(value); + this.onChange(value); + this.onTouched(value); + } + + writeValue(value:SpotCheckboxState) { + // This is set in a timeout because the initial value is set before the template is ready, + // which causes the input nativeElement to not be available yet. + setTimeout(() => { + const input = this.input.nativeElement; + if (value === null) { + input.indeterminate = true; + } else { + input.indeterminate = false; + } + + this.checked = !!value; + }); + } + + onChange = (_:SpotCheckboxState) => {}; + onTouched = (_:SpotCheckboxState) => {}; + + registerOnChange(fn:any) { + this.onChange = fn; + } + + registerOnTouched(fn:any) { + this.onTouched = fn; + } +} diff --git a/frontend/src/app/spot/components/chip-field.component.html b/frontend/src/app/spot/components/chip-field.component.html new file mode 100644 index 0000000000..80bdc022c8 --- /dev/null +++ b/frontend/src/app/spot/components/chip-field.component.html @@ -0,0 +1,30 @@ + + + + +
+ +
+ + + diff --git a/frontend/src/app/spot/components/chip-field.component.ts b/frontend/src/app/spot/components/chip-field.component.ts new file mode 100644 index 0000000000..d3b5fb5639 --- /dev/null +++ b/frontend/src/app/spot/components/chip-field.component.ts @@ -0,0 +1,94 @@ +import { + Component, + ElementRef, + ViewChild, + forwardRef, + HostBinding, + HostListener, + Input, +} from '@angular/core'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; + +@Component({ + selector: 'spot-chip-field', + templateUrl: './chip-field.component.html', + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => SpotChipFieldComponent), + multi: true, + }], +}) +export class SpotChipFieldComponent implements ControlValueAccessor { + @HostBinding('class.spot-chip-field') public classNameChipField = true; + @HostBinding('class.spot-text-field') public classNameTextField = true; + + @HostListener('click') public onParentClick() { + this.input.nativeElement.focus(); + } + + @ViewChild('input') public input:ElementRef; + + @Input() name = `spot-chip-field-${+(new Date())}`; + @Input() disabled = false; + @Input() public placeholder = ''; + @Input('value') public _value:string[] = []; + + public textValue = ''; + + public get value():string[] { + return this._value; + } + + public set value(value:string[]) { + this._value = value; + this.onChange(value); + this.onTouched(value); + } + + public remove(i:number) { + this.value = this.value.slice(0, i).concat(this.value.slice(i + 1)); + } + + public onBackspace(e:KeyboardEvent) { + if (this.textValue !== '') { + return; + } + + e.preventDefault(); + + this.value = this.value.slice(0, this.value.length - 1); + } + + public onEnter(e:KeyboardEvent) { + e.stopPropagation(); + + if (this.textValue === '') { + return; + } + + e.preventDefault(); + + this.value = [ + ...this.value, + this.textValue, + ]; + + this.textValue = ''; + } + + writeValue(value:string[]) { + this.value = value; + } + + onChange = (_:string[]) => {}; + onTouched = (_:string[]) => {}; + + registerOnChange(fn:any) { + this.onChange = fn; + } + + registerOnTouched(fn:any) { + this.onTouched = fn; + } +} + diff --git a/frontend/src/app/spot/components/drop-modal.component.html b/frontend/src/app/spot/components/drop-modal.component.html new file mode 100644 index 0000000000..648360d287 --- /dev/null +++ b/frontend/src/app/spot/components/drop-modal.component.html @@ -0,0 +1,8 @@ + +
+ +
diff --git a/frontend/src/app/spot/components/drop-modal.component.ts b/frontend/src/app/spot/components/drop-modal.component.ts new file mode 100644 index 0000000000..de075db1e7 --- /dev/null +++ b/frontend/src/app/spot/components/drop-modal.component.ts @@ -0,0 +1,74 @@ +import { + Component, + HostBinding, + Input, + Output, + EventEmitter, + OnDestroy, +} from '@angular/core'; + +enum SpotDropModalAlignmentOption { + BottomCenter = 'bottom-center', + BottomLeft = 'bottom-left', + BottomRight = 'bottom-right', + TopCenter = 'top-center', + TopLeft = 'top-left', + TopRight = 'top-right', +} + +@Component({ + selector: 'spot-drop-modal', + templateUrl: './drop-modal.component.html', +}) +export class SpotDropModalComponent implements OnDestroy { + @HostBinding('class.spot-drop-modal') public className = true; + + @HostBinding('class.spot-drop-modal_opened') public _open = false; + + @Input('open') + public set open(value:boolean) { + this._open = value; + + if (this._open) { + /* We have to set these listeners next tick, because they're so far up the tree. + * If the open value was set because of a click listener in the trigger slot, + * that event would reach the event listener added here and close the modal right away. + */ + setTimeout(() => { + document.body.addEventListener('click', this.closeEventListener); + }) + } else { + document.body.removeEventListener('click', this.closeEventListener); + this.closed.emit(); + } + } + + public get open():boolean { + return this._open; + } + + @Input('alignment') public alignment:SpotDropModalAlignmentOption = SpotDropModalAlignmentOption.BottomCenter; + + get alignmentClass() { + return `spot-drop-modal--body_${this.alignment}`; + } + + @Output() closed = new EventEmitter(); + + private closeEventListener = this.close.bind(this); + + public close():void { + this.open = false; + } + + public onBodyClick(e:MouseEvent) { + // We stop propagation here so that clicks inside the body do not + // close the modal when the event reaches the document body + e.stopPropagation(); + } + + public ngOnDestroy():void { + document.body.removeEventListener('click', this.closeEventListener); + } +} + diff --git a/frontend/src/app/spot/components/filter-chip.component.html b/frontend/src/app/spot/components/filter-chip.component.html new file mode 100644 index 0000000000..888b0f12a9 --- /dev/null +++ b/frontend/src/app/spot/components/filter-chip.component.html @@ -0,0 +1,7 @@ + +
{{ title }}
diff --git a/frontend/src/app/spot/components/filter-chip.component.ts b/frontend/src/app/spot/components/filter-chip.component.ts new file mode 100644 index 0000000000..87d0d804f0 --- /dev/null +++ b/frontend/src/app/spot/components/filter-chip.component.ts @@ -0,0 +1,20 @@ +import { + Component, + EventEmitter, + HostBinding, + Input, + Output, +} from '@angular/core'; + +@Component({ + selector: 'spot-filter-chip', + templateUrl: './filter-chip.component.html', +}) +export class SpotFilterChipComponent { + @HostBinding('class.spot-filter-chip') public className = true; + + @Input() removable = true; + @Input() title = ''; + + @Output() remove = new EventEmitter(); +} diff --git a/frontend/src/app/spot/components/text-field.component.html b/frontend/src/app/spot/components/text-field.component.html new file mode 100644 index 0000000000..de50e6a4ff --- /dev/null +++ b/frontend/src/app/spot/components/text-field.component.html @@ -0,0 +1,10 @@ + + + diff --git a/frontend/src/app/spot/components/text-field.component.ts b/frontend/src/app/spot/components/text-field.component.ts new file mode 100644 index 0000000000..8b56078abe --- /dev/null +++ b/frontend/src/app/spot/components/text-field.component.ts @@ -0,0 +1,60 @@ +import { + Component, + ElementRef, + ViewChild, + forwardRef, + HostBinding, + HostListener, + Input, +} from '@angular/core'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; + +@Component({ + selector: 'spot-text-field', + templateUrl: './text-field.component.html', + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => SpotTextFieldComponent), + multi: true, + }], +}) +export class SpotTextFieldComponent implements ControlValueAccessor { + @HostBinding('class.spot-text-field') public className = true; + + @HostListener('click') public onParentClick() { + this.input.nativeElement.focus(); + } + + @ViewChild('input') public input:ElementRef; + + @Input() name = `spot-text-field-${+(new Date())}`; + @Input() disabled = false; + @Input() public placeholder = ''; + @Input('value') public _value = ''; + + public get value():string { + return this._value; + } + + public set value(value:string) { + this._value = value; + this.onChange(value); + this.onTouched(value); + } + + writeValue(value:string) { + this.value = value; + } + + onChange = (_:string) => {}; + onTouched = (_:string) => {}; + + registerOnChange(fn:any) { + this.onChange = fn; + } + + registerOnTouched(fn:any) { + this.onTouched = fn; + } +} + diff --git a/frontend/src/app/spot/components/toggle.component.html b/frontend/src/app/spot/components/toggle.component.html new file mode 100644 index 0000000000..0c223b773e --- /dev/null +++ b/frontend/src/app/spot/components/toggle.component.html @@ -0,0 +1,13 @@ + diff --git a/frontend/src/app/spot/components/toggle.component.ts b/frontend/src/app/spot/components/toggle.component.ts new file mode 100644 index 0000000000..3c8eeacd14 --- /dev/null +++ b/frontend/src/app/spot/components/toggle.component.ts @@ -0,0 +1,59 @@ +import { + Component, + EventEmitter, + forwardRef, + HostBinding, + Input, + Output, +} from '@angular/core'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; + +export interface SpotToggleOption { + value:T; + title:string; +}; + +@Component({ + selector: 'spot-toggle', + templateUrl: './toggle.component.html', + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => SpotToggleComponent), + multi: true, + }], +}) +export class SpotToggleComponent implements ControlValueAccessor { + @HostBinding('class.spot-toggle') public className = true; + + @Output() checkedChange = new EventEmitter(); + + @Input() options:SpotToggleOption[] = []; + @Input() name = `spot-toggle-${+(new Date())}`; + @Input('value') public _value:T; + + public get value():T { + return this._value; + } + + public set value(value:T) { + this._value = value; + this.onChange(value); + this.onTouched(value); + } + + writeValue(value:T) { + this.value = value; + } + + onChange = (_:T) => {}; + onTouched = (_:T) => {}; + + registerOnChange(fn:any) { + this.onChange = fn; + } + + registerOnTouched(fn:any) { + this.onTouched = fn; + } +} + diff --git a/frontend/src/app/spot/spot-docs.component.html b/frontend/src/app/spot/spot-docs.component.html new file mode 100644 index 0000000000..5c19b734d4 --- /dev/null +++ b/frontend/src/app/spot/spot-docs.component.html @@ -0,0 +1,215 @@ +

Buttons

+ + + + + + +
+ + + + + + + +
+ + + + + + + +

Toggles

+ + +Currently selected value is {{ toggleValue }} + +

Checkbox

+ + + + + + + + + + + + + +

Lists

+ +
    +
  • + +
  • +
  • + +
      +
    • + +
    • +
    • + +
    • +
    +
  • +
+ +

Filter Chip

+ + + + +

Text Field

+ + + + + + + + + + + + + + + + + + + + + + +

Chip Field

+ + + +

Drop Modal

+ + + + + + +

Test

+
+
+ +

Action Bar

+ +
+
+ +
+
+ + +
+
diff --git a/frontend/src/app/spot/spot-docs.component.ts b/frontend/src/app/spot/spot-docs.component.ts new file mode 100644 index 0000000000..778ff09cc1 --- /dev/null +++ b/frontend/src/app/spot/spot-docs.component.ts @@ -0,0 +1,35 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'spot-docs', + templateUrl: './spot-docs.component.html', +}) +export class SpotDocsComponent { + indeterminateState = null; + checkboxValue = null; + textFieldValue = 'ngModel value'; + dropModalOpen = false; + alignment = 'bottom-center'; + + toggleValue = null; + toggleOptions = [ + {value: 1, title: '1'}, + {value: 2, title: '2'} + ]; + + onRemoveChip() { + alert('Remove chip'); + } + + checkboxValueString() { + if (this.checkboxValue === null) { + return 'null (indeterminate)'; + } + + if (this.checkboxValue) { + return 'true (checked)'; + } + + return 'false (unchecked)'; + } +} diff --git a/frontend/src/app/spot/spot.module.ts b/frontend/src/app/spot/spot.module.ts new file mode 100644 index 0000000000..85d2d8ab86 --- /dev/null +++ b/frontend/src/app/spot/spot.module.ts @@ -0,0 +1,40 @@ +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { CommonModule } from '@angular/common'; +import { UIRouterModule } from '@uirouter/angular'; +import { SPOT_DOCS_ROUTES } from './spot.routes'; +import { SpotCheckboxComponent } from './components/checkbox.component'; +import { SpotToggleComponent } from './components/toggle.component'; +import { SpotTextFieldComponent } from './components/text-field.component'; +import { SpotFilterChipComponent } from './components/filter-chip.component'; +import { SpotChipFieldComponent } from './components/chip-field.component'; +import { SpotDropModalComponent } from './components/drop-modal.component'; +import { SpotDocsComponent } from './spot-docs.component'; + +@NgModule({ + imports: [ + // Routes for /spot-docs + UIRouterModule.forChild({ states: SPOT_DOCS_ROUTES }), + FormsModule, + CommonModule, + ], + declarations: [ + SpotDocsComponent, + + SpotCheckboxComponent, + SpotToggleComponent, + SpotTextFieldComponent, + SpotFilterChipComponent, + SpotChipFieldComponent, + SpotDropModalComponent, + ], + exports: [ + SpotCheckboxComponent, + SpotToggleComponent, + SpotTextFieldComponent, + SpotFilterChipComponent, + SpotChipFieldComponent, + SpotDropModalComponent, + ], +}) +export class OpSpotModule { } diff --git a/frontend/src/app/spot/spot.routes.ts b/frontend/src/app/spot/spot.routes.ts new file mode 100644 index 0000000000..dc29d6047f --- /dev/null +++ b/frontend/src/app/spot/spot.routes.ts @@ -0,0 +1,41 @@ +// -- copyright +// OpenProject is an open source project management software. +// Copyright (C) 2012-2021 the OpenProject GmbH +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License version 3. +// +// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +// Copyright (C) 2006-2013 Jean-Philippe Lang +// Copyright (C) 2010-2013 the ChiliProject Team +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// See COPYRIGHT and LICENSE files for more details. +//++ + +import { Ng2StateDeclaration } from '@uirouter/angular'; +import { SpotDocsComponent } from './spot-docs.component'; + +export const SPOT_DOCS_ROUTES:Ng2StateDeclaration[] = [ + { + name: 'styleguide', + parent: 'root', + url: '/spot-docs', + views: { + '!$default': { component: SpotDocsComponent }, + }, + }, +]; diff --git a/frontend/src/app/spot/styles/sass/blocks/action-bar.sass b/frontend/src/app/spot/styles/sass/blocks/action-bar.sass new file mode 100644 index 0000000000..6b383b58b1 --- /dev/null +++ b/frontend/src/app/spot/styles/sass/blocks/action-bar.sass @@ -0,0 +1,26 @@ +.spot-action-bar + display: flex + flex-direction: row + flex-wrap: nowrap + justify-content: space-between + padding: $spot-spacing-0_75 + background-color: $spot-color-basic-gray-6 + + &--left, + &--right + display: flex + flex-direction: row + flex-wrap: wrap + align-items: center + + &--left + justify-content: flex-start + + > *:not(:last-child) + margin-right: $spot-spacing-1 + + &--right + justify-content: flex-end + + > *:not(:first-child) + margin-left: $spot-spacing-1 diff --git a/frontend/src/app/spot/styles/sass/blocks/body.sass b/frontend/src/app/spot/styles/sass/blocks/body.sass new file mode 100644 index 0000000000..370c81086a --- /dev/null +++ b/frontend/src/app/spot/styles/sass/blocks/body.sass @@ -0,0 +1,13 @@ +.spot-body + display: flex + flex-direction: column + + > .spot-text-field, + > .spot-list + margin: $spot-spacing-0_5 + + &:first-child + margin-top: $spot-spacing-1 + + &:last-child + margin-bottom: $spot-spacing-1 diff --git a/frontend/src/app/spot/styles/sass/blocks/button.sass b/frontend/src/app/spot/styles/sass/blocks/button.sass new file mode 100644 index 0000000000..93285a91b7 --- /dev/null +++ b/frontend/src/app/spot/styles/sass/blocks/button.sass @@ -0,0 +1,182 @@ +.spot-button + @include spot-body-small + + display: inline-flex + flex-direction: row + flex-wrap: nowrap + margin: 0 + padding: $spot-spacing-0_5 + border-width: 1px + border-style: solid + border-radius: $spot-spacing-1 + border-color: $spot-color-basic-white + background-color: $spot-color-basic-white + color: $spot-color-main + cursor: pointer + + &, * + box-sizing: border-box + + &:hover + background-color: $spot-color-basic-gray-6 + border-color: $spot-color-basic-gray-6 + color: $spot-color-main-dark + + &:active + background-color: $spot-color-basic-gray-6 + border-color: $spot-color-basic-gray-6 + color: $spot-color-main + + &_main + border-color: $spot-color-main + background-color: $spot-color-main + color: $spot-color-basic-white + + &:hover + border-color: $spot-color-main-light + background-color: $spot-color-main-light + color: $spot-color-main-dark + + &:active + border-color: $spot-color-main-light + background-color: $spot-color-main-light + color: $spot-color-main + + &_accent + border-color: $spot-color-accent + background-color: $spot-color-accent + color: $spot-color-basic-white + + &:hover + border-color: $spot-color-accent-light + background-color: $spot-color-accent-light + color: $spot-color-accent-dark + + &:active + border-color: $spot-color-accent-light + background-color: $spot-color-accent-light + color: $spot-color-accent + + &_danger + border-color: $spot-color-danger + background-color: $spot-color-danger + color: $spot-color-basic-white + + &:hover + border-color: $spot-color-danger-light + background-color: $spot-color-danger-light + color: $spot-color-danger-dark + + &:active + border-color: $spot-color-danger-light + background-color: $spot-color-danger-light + color: $spot-color-danger + + &[disabled], + &_disabled + &, + &:hover, + &:active + border-color: $spot-color-basic-gray-4 + background-color: $spot-color-basic-gray-4 + color: $spot-color-basic-white + cursor: default + + &_outlined + background-color: transparent + border-color: $spot-color-basic-white + color: $spot-color-basic-white + + &:hover + background-color: $spot-color-basic-gray-6 + border-color: $spot-color-main + color: $spot-color-main + + &:active + background-color: $spot-color-basic-white + border-color: $spot-color-basic-white + color: $spot-color-main + + &_outlined#{&}_main + background-color: transparent + border-color: $spot-color-main + color: $spot-color-main + + &:hover + background-color: $spot-color-main-light + border-color: $spot-color-main + color: $spot-color-main + + &:active + background-color: $spot-color-main + border-color: $spot-color-basic-white + color: $spot-color-basic-white + + &_outlined#{&}_accent + background-color: transparent + border-color: $spot-color-accent + color: $spot-color-accent + + &:hover + background-color: $spot-color-accent-light + border-color: $spot-color-accent + color: $spot-color-accent + + &:active + background-color: $spot-color-accent + border-color: $spot-color-basic-white + color: $spot-color-basic-white + + &_outlined#{&}_danger + background-color: transparent + border-color: $spot-color-danger + color: $spot-color-danger + + &:hover + background-color: $spot-color-danger-light + border-color: $spot-color-danger + color: $spot-color-danger + + &:active + background-color: $spot-color-danger + border-color: $spot-color-basic-white + color: $spot-color-basic-white + + &_basic + background-color: transparent + border-color: transparent + color: $spot-color-basic-white + + &:hover, + &:active + background-color: transparent + border-color: transparent + color: $spot-color-main + + &_basic#{&}_main + color: $spot-color-main + + &:hover + color: $spot-color-main-dark + + &:active + color: $spot-color-main + + &_basic#{&}_accent + color: $spot-color-accent + + &:hover + color: $spot-color-accent-dark + + &:active + color: $spot-color-accent + + &_basic#{&}_danger + color: $spot-color-danger + + &:hover + color: $spot-color-danger-dark + + &:active + color: $spot-color-danger + diff --git a/frontend/src/app/spot/styles/sass/blocks/checkbox.sass b/frontend/src/app/spot/styles/sass/blocks/checkbox.sass new file mode 100644 index 0000000000..9e22d0781f --- /dev/null +++ b/frontend/src/app/spot/styles/sass/blocks/checkbox.sass @@ -0,0 +1,62 @@ +.spot-checkbox + display: inline-flex + justify-content: center + align-items: center + height: $spot-spacing-1_5 + width: $spot-spacing-1_5 + + &, * + box-sizing: border-box + + &--input + position: absolute + height: 1px + width: 1px + overflow: hidden + clip: rect(1px,1px,1px,1px) + + &--fake + box-sizing: border-box + display: flex + justify-content: center + align-items: center + height: $spot-spacing-1 + width: $spot-spacing-1 + border-radius: 3px + border: 1px solid $spot-color-main + cursor: pointer + + &::before, + &::after + display: block + content: '' + + &--input:indeterminate + &--fake::before + width: 8px + height: 2px + background-color: $spot-color-main + + &--input:checked + &--fake::before, + &--input:checked + &--fake::after + border-radius: 1px + position: absolute + + &--input:checked + &--fake::before + width: 2px + height: 5px + background-color: $spot-color-main + transform: translateX(-2.3px) translateY(1.4px) rotate(-40deg) + + &--input:checked + &--fake::after + width: 8px + height: 2px + background-color: $spot-color-main + transform: translateX(1px) rotate(-45deg) + + &--input:disabled + &--fake + border-color: $spot-color-basic-gray-3 + cursor: default + + &--input:disabled + &--fake::before, + &--input:disabled + &--fake::after + background-color: $spot-color-basic-gray-3 diff --git a/frontend/src/app/spot/styles/sass/blocks/chip-field.sass b/frontend/src/app/spot/styles/sass/blocks/chip-field.sass new file mode 100644 index 0000000000..30958e088a --- /dev/null +++ b/frontend/src/app/spot/styles/sass/blocks/chip-field.sass @@ -0,0 +1,7 @@ +.spot-chip-field + &--values + display: flex + + &--value + &:not(:last-child) + margin-right: $spot-spacing-0_5 diff --git a/frontend/src/app/spot/styles/sass/blocks/drop-modal.sass b/frontend/src/app/spot/styles/sass/blocks/drop-modal.sass new file mode 100644 index 0000000000..165dedc159 --- /dev/null +++ b/frontend/src/app/spot/styles/sass/blocks/drop-modal.sass @@ -0,0 +1,43 @@ +.spot-drop-modal + position: relative + display: inline-flex + + &--body + @include spot-z-index("drop-modal") + + box-shadow: $spot-shadow-light-mid + position: absolute + background: $spot-color-basic-white + border-radius: 5px + pointer-events: none + opacity: 0 + + &_bottom-center + top: 100% + left: 50% + transform: translateX(-50%) + + &_bottom-left + top: 100% + left: 0% + + &_bottom-right + top: 100% + right: 0% + + &_top-center + bottom: 100% + left: 50% + transform: translateX(-50%) + + &_top-left + bottom: 100% + left: 0% + + &_top-right + bottom: 100% + right: 0% + + &_opened &--body + pointer-events: all + opacity: 1 diff --git a/frontend/src/app/spot/styles/sass/blocks/filter-chip.sass b/frontend/src/app/spot/styles/sass/blocks/filter-chip.sass new file mode 100644 index 0000000000..64290385c2 --- /dev/null +++ b/frontend/src/app/spot/styles/sass/blocks/filter-chip.sass @@ -0,0 +1,24 @@ +.spot-filter-chip + @include spot-caption + + display: inline-flex + align-items: center + flex-wrap: nowrap + background-color: $spot-color-main-light + color: $spot-color-basic-gray-1 + border-radius: 5px + + &--remove + display: flex + justify-content: center + align-items: center + border: 0 + border-right: 1px solid rgba($spot-color-main, 0.5) + background: transparent + cursor: pointer + padding: $spot-spacing-0_25 + + &--title + padding: $spot-spacing-0_25 + + diff --git a/frontend/src/app/spot/styles/sass/blocks/index.sass b/frontend/src/app/spot/styles/sass/blocks/index.sass new file mode 100644 index 0000000000..06767309bc --- /dev/null +++ b/frontend/src/app/spot/styles/sass/blocks/index.sass @@ -0,0 +1,12 @@ +// This directory will hold files that implement the styles for specific blocks and components +// Import them here +@import './button' +@import './toggle' +@import './checkbox' +@import './text-field' +@import './filter-chip' +@import './chip-field' +@import './drop-modal' +@import './list' +@import './action-bar' +@import './body' diff --git a/frontend/src/app/spot/styles/sass/blocks/list.sass b/frontend/src/app/spot/styles/sass/blocks/list.sass new file mode 100644 index 0000000000..9ca6fcee26 --- /dev/null +++ b/frontend/src/app/spot/styles/sass/blocks/list.sass @@ -0,0 +1,28 @@ +.spot-list + display: flex + flex-direction: column + list-style: none + margin: 0 + + &--item + display: flex + flex-direction: column + + &-action + display: flex + align-items: center + justify-content: flex-start + padding: $spot-spacing-0_5 + background-color: transparent + margin: 0 + border: 0 + cursor: pointer + + &-title + &:not(:first-child) + margin-left: $spot-spacing-0_5 + &:not(:last-child) + margin-left: $spot-spacing-0_5 + + .spot-list + margin-left: $spot-spacing-1_5 diff --git a/frontend/src/app/spot/styles/sass/blocks/text-field.sass b/frontend/src/app/spot/styles/sass/blocks/text-field.sass new file mode 100644 index 0000000000..7897fa1096 --- /dev/null +++ b/frontend/src/app/spot/styles/sass/blocks/text-field.sass @@ -0,0 +1,32 @@ +.spot-text-field + @include spot-body-small + + border: 1px solid $spot-color-basic-gray-3 + color: $spot-color-basic-black + border-radius: 4px + padding: $spot-spacing-0_5 + background-color: $spot-color-basic-white + display: inline-flex + justify-content: center + align-items: center + + &::placeholder + color: $spot-color-basic-gray-3 + + &:focus, + &:focus-within + border-color: $spot-color-main-dark + color: $spot-color-main-dark + + &--input + background: transparent + border: 0 + padding: 0 + flex-grow: 1 + outline: 0 + + &:not(:first-child) + margin-left: $spot-spacing-0_5 + + &:not(:last-child) + margin-right: $spot-spacing-0_5 diff --git a/frontend/src/app/spot/styles/sass/blocks/toggle.sass b/frontend/src/app/spot/styles/sass/blocks/toggle.sass new file mode 100644 index 0000000000..edffbbadf8 --- /dev/null +++ b/frontend/src/app/spot/styles/sass/blocks/toggle.sass @@ -0,0 +1,44 @@ +.spot-toggle + display: flex + border: 0 + margin: 0 + padding: 0 + + &--option + @include spot-body-small + + display: flex + flex-direction: row + flex-wrap: nowrap + margin: 0 + padding: $spot-spacing-0_5 + border-width: 1px + border-style: solid + border-color: $spot-color-main + background-color: transparent + color: $spot-color-main + cursor: pointer + + &:not(:last-child) + border-right: 0 + + &:first-child + padding-left: $spot-spacing-0_75 + border-top-left-radius: $spot-spacing-1 + border-bottom-left-radius: $spot-spacing-1 + + &:last-child + padding-right: $spot-spacing-0_75 + border-top-right-radius: $spot-spacing-1 + border-bottom-right-radius: $spot-spacing-1 + + &_selected + background-color: $spot-color-main-light + + + &--option-input + position: absolute + height: 1px + width: 1px + overflow: hidden + clip: rect(1px,1px,1px,1px) diff --git a/frontend/src/app/spot/styles/sass/index.sass b/frontend/src/app/spot/styles/sass/index.sass new file mode 100644 index 0000000000..e815ae53f4 --- /dev/null +++ b/frontend/src/app/spot/styles/sass/index.sass @@ -0,0 +1,4 @@ +@import 'variables' +@import 'typography' +@import 'zindex' +@import 'blocks' diff --git a/frontend/src/app/spot/styles/sass/typography.sass b/frontend/src/app/spot/styles/sass/typography.sass new file mode 100644 index 0000000000..c9627613fe --- /dev/null +++ b/frontend/src/app/spot/styles/sass/typography.sass @@ -0,0 +1,48 @@ +@mixin spot-header-big($weight: bold, $style: normal) + font-family: Lato, sans-serif + font-size: 2rem + font-weight: $weight + font-style: $style + line-height: 1.2em + +@mixin spot-header-small($weight: bold, $style: normal) + font-family: Lato, sans-serif + font-size: 1.5rem + font-weight: $weight + font-style: $style + line-height: 1.2em + +@mixin spot-subheader-big($weight: bold, $style: normal) + font-family: Lato, sans-serif + font-size: 1.25rem + font-weight: $weight + font-style: $style + line-height: 1.2em + +@mixin spot-subheader-small($weight: bold, $style: normal) + font-family: Lato, sans-serif + font-size: 1.125rem + font-weight: $weight + font-style: $style + line-height: 1.2em + +@mixin spot-body-big($weight: normal, $style: normal) + font-family: Lato, sans-serif + font-size: 1rem + font-weight: $weight + font-style: $style + line-height: 1.2em + +@mixin spot-body-small($weight: normal, $style: normal) + font-family: Lato, sans-serif + font-size: 0.875rem + font-weight: $weight + font-style: $style + line-height: 1.2em + +@mixin spot-caption($weight: normal, $style: normal) + font-family: Lato, sans-serif + font-size: 0.75rem + font-weight: $weight + font-style: $style + line-height: 1.2em diff --git a/frontend/src/app/spot/styles/sass/variables.sass b/frontend/src/app/spot/styles/sass/variables.sass new file mode 100644 index 0000000000..f0005a570d --- /dev/null +++ b/frontend/src/app/spot/styles/sass/variables.sass @@ -0,0 +1 @@ +@import '../tokens/dist/tokens.sass' diff --git a/frontend/src/app/spot/styles/sass/zindex.sass b/frontend/src/app/spot/styles/sass/zindex.sass new file mode 100644 index 0000000000..b891ac6bba --- /dev/null +++ b/frontend/src/app/spot/styles/sass/zindex.sass @@ -0,0 +1,6 @@ +@use "sass:map" + +$spot-z-indexes: ( "drop-modal": 1000 ) + +@mixin spot-z-index($type, $addition: 0) + z-index: map.get($spot-z-indexes, $type) + $addition diff --git a/frontend/src/app/spot/styles/tokens/colors.yml b/frontend/src/app/spot/styles/tokens/colors.yml new file mode 100644 index 0000000000..f35bbeac76 --- /dev/null +++ b/frontend/src/app/spot/styles/tokens/colors.yml @@ -0,0 +1,66 @@ +props: + - name: spot-color-basic-black + value: "#000000" + - name: spot-color-basic-gray-1 + value: "#333333" + - name: spot-color-basic-gray-2 + value: "#555555" + - name: spot-color-basic-gray-3 + value: "#878787" + - name: spot-color-basic-gray-4 + value: "#cccccc" + - name: spot-color-basic-gray-5 + value: "#e0e0e0" + - name: spot-color-basic-gray-6 + value: "#f3f3f3" + - name: spot-color-basic-white + value: "#ffffff" + + - name: spot-color-main + value: "#1a67a3" + - name: spot-color-main-dark + value: "#034579" + - name: spot-color-main-light + value: "#d1e5f5" + + - name: spot-color-accent + value: "#308720" + - name: spot-color-accent-dark + value: "#007528" + - name: spot-color-accent-light + value: "#bfeeb6" + + - name: spot-color-danger + value: "#d01100" + - name: spot-color-danger-dark + value: "#7D000D" + - name: spot-color-danger-light + value: "#F4ABA9" + + - name: spot-color-indication-notification + value: "#00A3FF" + - name: spot-color-indication-flagged + value: "#1CB6C0" + - name: spot-color-indication-current-date + value: "#ffffE1" + + - name: spot-color-feedback-error-dark + value: "#CA3F3F" + - name: spot-color-feedback-error-light + value: "#FEDADA" + - name: spot-color-feedback-warning-dark + value: "#EF9E56" + - name: spot-color-feedback-warning-light + value: "#FFE6C6" + - name: spot-color-feedback-success-dark + value: "#35C53F" + - name: spot-color-feedback-success-light + value: "#D8FDD1" + - name: spot-color-feedback-info-dark + value: "#8FC0DB" + - name: spot-color-feedback-info-light + value: "#E3F5FF" + +global: + type: color + category: colors diff --git a/frontend/src/app/spot/styles/tokens/dist/tokens.json b/frontend/src/app/spot/styles/tokens/dist/tokens.json new file mode 100644 index 0000000000..52e295cc39 --- /dev/null +++ b/frontend/src/app/spot/styles/tokens/dist/tokens.json @@ -0,0 +1,57 @@ +{ + "spot-color-basic-black": "rgb(0, 0, 0)", + "spot-color-basic-gray-1": "rgb(51, 51, 51)", + "spot-color-basic-gray-2": "rgb(85, 85, 85)", + "spot-color-basic-gray-3": "rgb(135, 135, 135)", + "spot-color-basic-gray-4": "rgb(204, 204, 204)", + "spot-color-basic-gray-5": "rgb(224, 224, 224)", + "spot-color-basic-gray-6": "rgb(243, 243, 243)", + "spot-color-basic-white": "rgb(255, 255, 255)", + "spot-color-main": "rgb(26, 103, 163)", + "spot-color-main-dark": "rgb(3, 69, 121)", + "spot-color-main-light": "rgb(209, 229, 245)", + "spot-color-accent": "rgb(48, 135, 32)", + "spot-color-accent-dark": "rgb(0, 117, 40)", + "spot-color-accent-light": "rgb(191, 238, 182)", + "spot-color-danger": "rgb(208, 17, 0)", + "spot-color-danger-dark": "rgb(125, 0, 13)", + "spot-color-danger-light": "rgb(244, 171, 169)", + "spot-color-indication-notification": "rgb(0, 163, 255)", + "spot-color-indication-flagged": "rgb(28, 182, 192)", + "spot-color-indication-current-date": "rgb(255, 255, 225)", + "spot-color-feedback-error-dark": "rgb(202, 63, 63)", + "spot-color-feedback-error-light": "rgb(254, 218, 218)", + "spot-color-feedback-warning-dark": "rgb(239, 158, 86)", + "spot-color-feedback-warning-light": "rgb(255, 230, 198)", + "spot-color-feedback-success-dark": "rgb(53, 197, 63)", + "spot-color-feedback-success-light": "rgb(216, 253, 209)", + "spot-color-feedback-info-dark": "rgb(143, 192, 219)", + "spot-color-feedback-info-light": "rgb(227, 245, 255)", + "spot-spacing-5": "5rem", + "spot-spacing-6": "6rem", + "spot-spacing-1_75": "1.75rem", + "spot-spacing-7": "7rem", + "spot-spacing-0_75": "0.75rem", + "spot-spacing-8": "8rem", + "spot-spacing-9": "9rem", + "spot-spacing-2_25": "2.25rem", + "spot-spacing-1_25": "1.25rem", + "spot-spacing-0_25": "0.25rem", + "spot-spacing-0_5": "0.5rem", + "spot-spacing-1_5": "1.5rem", + "spot-spacing-2_5": "2.5rem", + "spot-spacing-10": "10rem", + "spot-spacing-3_5": "3.5rem", + "spot-spacing-4_5": "4.5rem", + "spot-spacing-5_5": "5.5rem", + "spot-spacing-1": "1rem", + "spot-spacing-2": "2rem", + "spot-spacing-3": "3rem", + "spot-spacing-4": "4rem", + "spot-shadow-light-low": "2px 2px 5px rgba(0, 0, 0, 0.15)", + "spot-shadow-light-mid": "4px 4px 10px rgba(0, 0, 0, 0.15)", + "spot-shadow-light-high": "6px 6px 20px rgba(0, 0, 0, 0.15)", + "spot-shadow-hard-low": "2px 2px 5px rgba(0, 0, 0, 0.25)", + "spot-shadow-hard-mid": "4px 4px 10px rgba(0, 0, 0, 0.25)", + "spot-shadow-hard-high": "6px 6px 20px rgba(0, 0, 0, 0.25)" +} \ No newline at end of file diff --git a/frontend/src/app/spot/styles/tokens/dist/tokens.sass b/frontend/src/app/spot/styles/tokens/dist/tokens.sass new file mode 100644 index 0000000000..e7ba295450 --- /dev/null +++ b/frontend/src/app/spot/styles/tokens/dist/tokens.sass @@ -0,0 +1,56 @@ + +$spot-color-basic-black: rgb(0, 0, 0) +$spot-color-basic-gray-1: rgb(51, 51, 51) +$spot-color-basic-gray-2: rgb(85, 85, 85) +$spot-color-basic-gray-3: rgb(135, 135, 135) +$spot-color-basic-gray-4: rgb(204, 204, 204) +$spot-color-basic-gray-5: rgb(224, 224, 224) +$spot-color-basic-gray-6: rgb(243, 243, 243) +$spot-color-basic-white: rgb(255, 255, 255) +$spot-color-main: rgb(26, 103, 163) +$spot-color-main-dark: rgb(3, 69, 121) +$spot-color-main-light: rgb(209, 229, 245) +$spot-color-accent: rgb(48, 135, 32) +$spot-color-accent-dark: rgb(0, 117, 40) +$spot-color-accent-light: rgb(191, 238, 182) +$spot-color-danger: rgb(208, 17, 0) +$spot-color-danger-dark: rgb(125, 0, 13) +$spot-color-danger-light: rgb(244, 171, 169) +$spot-color-indication-notification: rgb(0, 163, 255) +$spot-color-indication-flagged: rgb(28, 182, 192) +$spot-color-indication-current-date: rgb(255, 255, 225) +$spot-color-feedback-error-dark: rgb(202, 63, 63) +$spot-color-feedback-error-light: rgb(254, 218, 218) +$spot-color-feedback-warning-dark: rgb(239, 158, 86) +$spot-color-feedback-warning-light: rgb(255, 230, 198) +$spot-color-feedback-success-dark: rgb(53, 197, 63) +$spot-color-feedback-success-light: rgb(216, 253, 209) +$spot-color-feedback-info-dark: rgb(143, 192, 219) +$spot-color-feedback-info-light: rgb(227, 245, 255) +$spot-spacing-5: 5rem +$spot-spacing-6: 6rem +$spot-spacing-1-75: 1.75rem +$spot-spacing-7: 7rem +$spot-spacing-0-75: 0.75rem +$spot-spacing-8: 8rem +$spot-spacing-9: 9rem +$spot-spacing-2-25: 2.25rem +$spot-spacing-1-25: 1.25rem +$spot-spacing-0-25: 0.25rem +$spot-spacing-0-5: 0.5rem +$spot-spacing-1-5: 1.5rem +$spot-spacing-2-5: 2.5rem +$spot-spacing-10: 10rem +$spot-spacing-3-5: 3.5rem +$spot-spacing-4-5: 4.5rem +$spot-spacing-5-5: 5.5rem +$spot-spacing-1: 1rem +$spot-spacing-2: 2rem +$spot-spacing-3: 3rem +$spot-spacing-4: 4rem +$spot-shadow-light-low: 2px 2px 5px rgba(0, 0, 0, 0.15) +$spot-shadow-light-mid: 4px 4px 10px rgba(0, 0, 0, 0.15) +$spot-shadow-light-high: 6px 6px 20px rgba(0, 0, 0, 0.15) +$spot-shadow-hard-low: 2px 2px 5px rgba(0, 0, 0, 0.25) +$spot-shadow-hard-mid: 4px 4px 10px rgba(0, 0, 0, 0.25) +$spot-shadow-hard-high: 6px 6px 20px rgba(0, 0, 0, 0.25) diff --git a/frontend/src/app/spot/styles/tokens/shadows.yml b/frontend/src/app/spot/styles/tokens/shadows.yml new file mode 100644 index 0000000000..73e340a826 --- /dev/null +++ b/frontend/src/app/spot/styles/tokens/shadows.yml @@ -0,0 +1,18 @@ +props: + spot-shadow-light-low: + value: "2px 2px 5px rgba(0, 0, 0, 0.15)" + spot-shadow-light-mid: + value: "4px 4px 10px rgba(0, 0, 0, 0.15)" + spot-shadow-light-high: + value: "6px 6px 20px rgba(0, 0, 0, 0.15)" + + spot-shadow-hard-low: + value: "2px 2px 5px rgba(0, 0, 0, 0.25)" + spot-shadow-hard-mid: + value: "4px 4px 10px rgba(0, 0, 0, 0.25)" + spot-shadow-hard-high: + value: "6px 6px 20px rgba(0, 0, 0, 0.25)" + +global: + type: box-shadow + category: shadows diff --git a/frontend/src/app/spot/styles/tokens/spacings.yml b/frontend/src/app/spot/styles/tokens/spacings.yml new file mode 100644 index 0000000000..0e32776362 --- /dev/null +++ b/frontend/src/app/spot/styles/tokens/spacings.yml @@ -0,0 +1,47 @@ +props: + spot-spacing-0_25: + value: "0.25rem" + spot-spacing-0_5: + value: "0.5rem" + spot-spacing-0_75: + value: "0.75rem" + spot-spacing-1: + value: "1rem" + spot-spacing-1_25: + value: "1.25rem" + spot-spacing-1_5: + value: "1.5rem" + spot-spacing-1_75: + value: "1.75rem" + spot-spacing-2: + value: "2rem" + spot-spacing-2_25: + value: "2.25rem" + spot-spacing-2_5: + value: "2.5rem" + spot-spacing-3: + value: "3rem" + spot-spacing-3_5: + value: "3.5rem" + spot-spacing-4: + value: "4rem" + spot-spacing-4_5: + value: "4.5rem" + spot-spacing-5: + value: "5rem" + spot-spacing-5_5: + value: "5.5rem" + spot-spacing-6: + value: "6rem" + spot-spacing-7: + value: "7rem" + spot-spacing-8: + value: "8rem" + spot-spacing-9: + value: "9rem" + spot-spacing-10: + value: "10rem" + +global: + type: spacing + category: spacings diff --git a/frontend/src/app/spot/styles/tokens/tokens.yml b/frontend/src/app/spot/styles/tokens/tokens.yml new file mode 100644 index 0000000000..1812f8a13f --- /dev/null +++ b/frontend/src/app/spot/styles/tokens/tokens.yml @@ -0,0 +1,4 @@ +imports: + - ./colors.yml + - ./spacings.yml + - ./shadows.yml diff --git a/frontend/src/global_styles/openproject.sass b/frontend/src/global_styles/openproject.sass index 9986d8b19e..bdd4541312 100644 --- a/frontend/src/global_styles/openproject.sass +++ b/frontend/src/global_styles/openproject.sass @@ -5,6 +5,7 @@ @import "content/_index.sass" @import "./common/openproject-common.module" +@import "../app/spot/styles/sass" @import "../app/shared/components/modal/modal.module" // Dynamically linked plugin styles from Rails plugins diff --git a/nix/shell.nix b/nix/shell.nix index 590fa621b8..f44b59be6b 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -1,4 +1,5 @@ -{ pkgs ? import {} }: +{ pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/8ca77a63599ed951d6a2d244c1d62092776a3fe1.tar.gz") {} +}: with pkgs; let op-get-test-failures = writeShellScriptBin "op-get-test-failures" ''