From b05b3a30ab4a5a8e164ef539dfc4811ce125d1e4 Mon Sep 17 00:00:00 2001 From: Min RK Date: Wed, 8 Jun 2022 12:59:32 +0200 Subject: [PATCH 01/33] autoconvert less to scss via less2sass: ``` for f in less/*.less; do less2sass $f done rm -v less/*.less git mv less scss ``` --- share/jupyterhub/static/less/style.less | 27 ------------------- share/jupyterhub/static/less/variables.less | 27 ------------------- .../{less/admin.less => scss/admin.scss} | 0 .../{less/error.less => scss/error.scss} | 2 +- .../{less/login.less => scss/login.scss} | 8 +++--- .../static/{less/page.less => scss/page.scss} | 18 ++++++------- share/jupyterhub/static/scss/style.scss | 27 +++++++++++++++++++ share/jupyterhub/static/scss/variables.scss | 27 +++++++++++++++++++ 8 files changed, 68 insertions(+), 68 deletions(-) delete mode 100644 share/jupyterhub/static/less/style.less delete mode 100644 share/jupyterhub/static/less/variables.less rename share/jupyterhub/static/{less/admin.less => scss/admin.scss} (100%) rename share/jupyterhub/static/{less/error.less => scss/error.scss} (89%) rename share/jupyterhub/static/{less/login.less => scss/login.scss} (79%) rename share/jupyterhub/static/{less/page.less => scss/page.scss} (74%) create mode 100644 share/jupyterhub/static/scss/style.scss create mode 100644 share/jupyterhub/static/scss/variables.scss diff --git a/share/jupyterhub/static/less/style.less b/share/jupyterhub/static/less/style.less deleted file mode 100644 index 8cd185b8..00000000 --- a/share/jupyterhub/static/less/style.less +++ /dev/null @@ -1,27 +0,0 @@ -/*! -* -* Twitter Bootstrap -* -*/ -@import "../components/bootstrap/less/bootstrap.less"; -@import "../components/bootstrap/less/responsive-utilities.less"; - -/*! -* -* Font Awesome -* -*/ -@import "../components/font-awesome/less/font-awesome.less"; -@fa-font-path: "../components/font-awesome/fonts"; - -/*! -* -* Jupyter -* -*/ - -@import "./variables.less"; -@import "./page.less"; -@import "./admin.less"; -@import "./error.less"; -@import "./login.less"; diff --git a/share/jupyterhub/static/less/variables.less b/share/jupyterhub/static/less/variables.less deleted file mode 100644 index 41adab1c..00000000 --- a/share/jupyterhub/static/less/variables.less +++ /dev/null @@ -1,27 +0,0 @@ -@border-radius-small: 2px; -@border-radius-base: 2px; -@border-radius-large: 3px; -@navbar-height: 40px; -@grid-float-breakpoint: @screen-xs-min; - -@navbar-default-color: #222; -@navbar-default-link-color: @navbar-default-color; -// darken background on hover, no change to text -@navbar-default-link-hover-color: @navbar-default-color; -@navbar-default-link-hover-bg: darken(@navbar-default-bg, 10%); - -@jupyter-orange: #f37524; - -@jupyter-red: #e34f21; -// color blind-friendly alternative to red/green -// from 5-class RdYlBu via colorbrewer.org -// eliminate distinction between 'primary' and 'success' -@brand-primary: #2c7bb6; -@brand-success: @brand-primary; -@brand-danger: #d7191c; - -@text-muted: #222; - -.btn-jupyter { - .button-variant(#fff; @jupyter-orange; @jupyter-red); -} diff --git a/share/jupyterhub/static/less/admin.less b/share/jupyterhub/static/scss/admin.scss similarity index 100% rename from share/jupyterhub/static/less/admin.less rename to share/jupyterhub/static/scss/admin.scss diff --git a/share/jupyterhub/static/less/error.less b/share/jupyterhub/static/scss/error.scss similarity index 89% rename from share/jupyterhub/static/less/error.less rename to share/jupyterhub/static/scss/error.scss index ac0fd116..50c1c658 100644 --- a/share/jupyterhub/static/less/error.less +++ b/share/jupyterhub/static/scss/error.scss @@ -6,7 +6,7 @@ div.error { div.ajax-error { padding: 1em; text-align: center; - .alert-danger(); + @include alert-danger(); } div.error > h1 { diff --git a/share/jupyterhub/static/less/login.less b/share/jupyterhub/static/scss/login.scss similarity index 79% rename from share/jupyterhub/static/less/login.less rename to share/jupyterhub/static/scss/login.scss index 43d3c289..1912a100 100644 --- a/share/jupyterhub/static/less/login.less +++ b/share/jupyterhub/static/scss/login.scss @@ -3,7 +3,7 @@ height: 80vh; & #insecure-login-warning { - .bg-warning(); + @include bg-warning(); padding: 10px; } @@ -30,8 +30,8 @@ .auth-form-header { padding: 10px 20px; color: #fff; - background: @jupyter-orange; - border-radius: @border-radius-large @border-radius-large 0 0; + background: $jupyter-orange; + border-radius: $border-radius-large $border-radius-large 0 0; font-size: large; } @@ -45,6 +45,6 @@ padding: 20px; border: thin silver solid; border-top: none; - border-radius: 0 0 @border-radius-large @border-radius-large; + border-radius: 0 0 $border-radius-large $border-radius-large; } } diff --git a/share/jupyterhub/static/less/page.less b/share/jupyterhub/static/scss/page.scss similarity index 74% rename from share/jupyterhub/static/less/page.less rename to share/jupyterhub/static/scss/page.scss index dc46e033..83923894 100644 --- a/share/jupyterhub/static/less/page.less +++ b/share/jupyterhub/static/scss/page.scss @@ -1,15 +1,15 @@ -@import "../components/bootstrap/less/variables.less"; +@import "../components/bootstrap/less/variables.scss"; -@logo-height: 28px; +$logo-height: 28px; #jupyterhub-logo { - @media (max-width: @grid-float-breakpoint) { + @media (max-width: $grid-float-breakpoint) { // same length as the navbar-toggle element, displayed on responsive mode margin-left: 15px; } .jpy-logo { - height: @logo-height; - margin-top: (@navbar-height - @logo-height) / 2; + height: $logo-height; + margin-top: ($navbar-height - $logo-height) / 2; } } @@ -18,7 +18,7 @@ span { // same as .nav > li > a from bootstrap, but applied to the span[id="login_widget"] // or any other span that matches .nav > li > span, but only in responsive mode - @media (max-width: @grid-float-breakpoint) { + @media (max-width: $grid-float-breakpoint) { position: relative; display: block; padding: 10px 15px; @@ -68,7 +68,7 @@ .form-control:focus { box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), - 0 0 8px @jupyter-orange; - border-color: @jupyter-orange; - outline-color: @jupyter-orange; + 0 0 8px $jupyter-orange; + border-color: $jupyter-orange; + outline-color: $jupyter-orange; } diff --git a/share/jupyterhub/static/scss/style.scss b/share/jupyterhub/static/scss/style.scss new file mode 100644 index 00000000..a478e2a3 --- /dev/null +++ b/share/jupyterhub/static/scss/style.scss @@ -0,0 +1,27 @@ +/*! +* +* Twitter Bootstrap +* +*/ +@import "../components/bootstrap/less/bootstrap.scss"; +@import "../components/bootstrap/less/responsive-utilities.scss"; + +/*! +* +* Font Awesome +* +*/ +@import "../components/font-awesome/less/font-awesome.scss"; +$fa-font-path: "../components/font-awesome/fonts"; + +/*! +* +* Jupyter +* +*/ + +@import "./variables.scss"; +@import "./page.scss"; +@import "./admin.scss"; +@import "./error.scss"; +@import "./login.scss"; diff --git a/share/jupyterhub/static/scss/variables.scss b/share/jupyterhub/static/scss/variables.scss new file mode 100644 index 00000000..fd76034b --- /dev/null +++ b/share/jupyterhub/static/scss/variables.scss @@ -0,0 +1,27 @@ +$border-radius-small: 2px; +$border-radius-base: 2px; +$border-radius-large: 3px; +$navbar-height: 40px; +$grid-float-breakpoint: $screen-xs-min; + +$navbar-default-color: #222; +$navbar-default-link-color: $navbar-default-color; +// darken background on hover, no change to text +$navbar-default-link-hover-color: $navbar-default-color; +$navbar-default-link-hover-bg: darken($navbar-default-bg, 10%); + +$jupyter-orange: #f37524; + +$jupyter-red: #e34f21; +// color blind-friendly alternative to red/green +// from 5-class RdYlBu via colorbrewer.org +// eliminate distinction between 'primary' and 'success' +$brand-primary: #2c7bb6; +$brand-success: $brand-primary; +$brand-danger: #d7191c; + +$text-muted: #222; + +.btn-jupyter { + .button-variant(#fff; $jupyter-orange; $jupyter-red); +} From 8c5715621a20bc403ce79c611dd274fade79186c Mon Sep 17 00:00:00 2001 From: Min RK Date: Wed, 8 Jun 2022 13:51:23 +0200 Subject: [PATCH 02/33] work on updating to bs5 --- package.json | 12 +++++------ setup.py | 11 ++--------- share/jupyterhub/static/scss/error.scss | 1 - share/jupyterhub/static/scss/login.scss | 2 +- share/jupyterhub/static/scss/page.scss | 5 ++++- share/jupyterhub/static/scss/style.scss | 22 ++++++++++++++++----- share/jupyterhub/static/scss/variables.scss | 4 ---- share/jupyterhub/templates/page.html | 16 +++++++-------- 8 files changed, 37 insertions(+), 36 deletions(-) diff --git a/package.json b/package.json index fab5d46d..43ca7146 100644 --- a/package.json +++ b/package.json @@ -10,17 +10,15 @@ }, "scripts": { "postinstall": "python3 ./bower-lite", - "fmt": "prettier --write --trailing-comma es5 share/jupyterhub/static/js/*", - "lessc": "lessc" + "node-sass": "node-sass", + "css": "node-sass --include-dir share/jupyterhub/static/components --source-map true --source-map-contents true share/jupyterhub/static/scss/style.scss -o share/jupyterhub/static/css" }, "devDependencies": { - "less": "^3.9.0", - "less-plugin-clean-css": "^1.5.1", - "prettier": "^1.16.4" + "node-sass": "^7.0.1" }, "dependencies": { - "bootstrap": "^3.4.1", - "font-awesome": "^4.7.0", + "@fortawesome/fontawesome-free": "^6.1.1", + "bootstrap": "^5.1.3", "jquery": "^3.5.1", "moment": "^2.29.4", "requirejs": "^2.3.6" diff --git a/setup.py b/setup.py index 4fdc4069..696819f0 100755 --- a/setup.py +++ b/setup.py @@ -146,21 +146,14 @@ class CSS(BaseCommand): self.run_command('js') print("Building css with less") - style_less = pjoin(static, 'less', 'style.less') + style_less = pjoin(static, 'scss', 'style.scss') style_css = pjoin(static, 'css', 'style.min.css') sourcemap = style_css + '.map' args = [ 'npm', 'run', - 'lessc', - '--', - '--clean-css', - f'--source-map-basepath={static}', - f'--source-map={sourcemap}', - '--source-map-rootpath=../', - style_less, - style_css, + 'css', ] try: check_call(args, cwd=here, shell=shell) diff --git a/share/jupyterhub/static/scss/error.scss b/share/jupyterhub/static/scss/error.scss index 50c1c658..973f374b 100644 --- a/share/jupyterhub/static/scss/error.scss +++ b/share/jupyterhub/static/scss/error.scss @@ -6,7 +6,6 @@ div.error { div.ajax-error { padding: 1em; text-align: center; - @include alert-danger(); } div.error > h1 { diff --git a/share/jupyterhub/static/scss/login.scss b/share/jupyterhub/static/scss/login.scss index 1912a100..6acdab02 100644 --- a/share/jupyterhub/static/scss/login.scss +++ b/share/jupyterhub/static/scss/login.scss @@ -3,7 +3,7 @@ height: 80vh; & #insecure-login-warning { - @include bg-warning(); + // @include bg-warning(); padding: 10px; } diff --git a/share/jupyterhub/static/scss/page.scss b/share/jupyterhub/static/scss/page.scss index 83923894..3796fc05 100644 --- a/share/jupyterhub/static/scss/page.scss +++ b/share/jupyterhub/static/scss/page.scss @@ -1,4 +1,4 @@ -@import "../components/bootstrap/less/variables.scss"; +@import "./variables.scss"; $logo-height: 28px; @@ -71,4 +71,7 @@ $logo-height: 28px; 0 0 8px $jupyter-orange; border-color: $jupyter-orange; outline-color: $jupyter-orange; + +.btn-jupyter { + @include button-variant(#fff, $jupyter-orange, $jupyter-red); } diff --git a/share/jupyterhub/static/scss/style.scss b/share/jupyterhub/static/scss/style.scss index a478e2a3..97b100bf 100644 --- a/share/jupyterhub/static/scss/style.scss +++ b/share/jupyterhub/static/scss/style.scss @@ -1,18 +1,31 @@ +/*! variables */ +@import "./variables.scss"; + /*! * * Twitter Bootstrap * */ -@import "../components/bootstrap/less/bootstrap.scss"; -@import "../components/bootstrap/less/responsive-utilities.scss"; +@import "../components/bootstrap/scss/functions"; // Required +@import "../components/bootstrap/scss/variables"; // Required +@import "../components/bootstrap/scss/mixins"; // Required + +@import "../components/bootstrap/scss/root"; // Required +@import "../components/bootstrap/scss/reboot"; // Required + +@import "../components/bootstrap/scss/alert"; +@import "../components/bootstrap/scss/buttons"; +@import "../components/bootstrap/scss/containers"; +@import "../components/bootstrap/scss/grid"; +@import "../components/bootstrap/scss/utilities"; /*! * * Font Awesome * */ -@import "../components/font-awesome/less/font-awesome.scss"; -$fa-font-path: "../components/font-awesome/fonts"; +// $fa-font-path: "../components/font-awesome/fonts"; +// @import "../components/font-awesome/scss/font-awesome.scss"; /*! * @@ -20,7 +33,6 @@ $fa-font-path: "../components/font-awesome/fonts"; * */ -@import "./variables.scss"; @import "./page.scss"; @import "./admin.scss"; @import "./error.scss"; diff --git a/share/jupyterhub/static/scss/variables.scss b/share/jupyterhub/static/scss/variables.scss index fd76034b..bd7a0a67 100644 --- a/share/jupyterhub/static/scss/variables.scss +++ b/share/jupyterhub/static/scss/variables.scss @@ -21,7 +21,3 @@ $brand-success: $brand-primary; $brand-danger: #d7191c; $text-muted: #222; - -.btn-jupyter { - .button-variant(#fff; $jupyter-orange; $jupyter-red); -} diff --git a/share/jupyterhub/templates/page.html b/share/jupyterhub/templates/page.html index 52b71a26..958e5ffb 100644 --- a/share/jupyterhub/templates/page.html +++ b/share/jupyterhub/templates/page.html @@ -32,7 +32,7 @@ {% block stylesheet %} - + {% endblock %} {% block favicon %} @@ -54,12 +54,12 @@ bootstrap: '../components/bootstrap/dist/js/bootstrap.min', moment: "../components/moment/moment", }, - shim: { - bootstrap: { - deps: ["jquery"], - exports: "bootstrap" - }, - } + // shim: { + // bootstrap: { + // deps: ["jquery"], + // exports: "bootstrap" + // }, + // } }); @@ -187,7 +187,7 @@ {% endblock %} {% call modal('Error', btn_label='OK') %} -
+
The error
{% endcall %} From dfbe7257e60325985b69ccd2322bc254a163e3ce Mon Sep 17 00:00:00 2001 From: Min RK Date: Thu, 4 Apr 2024 15:58:44 +0200 Subject: [PATCH 03/33] make it easier to debug static files --- jupyterhub/handlers/static.py | 4 +++- testing/jupyterhub_config.py | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/jupyterhub/handlers/static.py b/jupyterhub/handlers/static.py index e9c54199..f5608e06 100644 --- a/jupyterhub/handlers/static.py +++ b/jupyterhub/handlers/static.py @@ -15,7 +15,9 @@ class CacheControlStaticFilesHandler(StaticFileHandler): return None def set_extra_headers(self, path): - if "v" not in self.request.arguments: + if "v" not in self.request.arguments or self.settings.get( + "no_cache_static", False + ): self.add_header("Cache-Control", "no-cache") diff --git a/testing/jupyterhub_config.py b/testing/jupyterhub_config.py index c82e8511..920156e4 100644 --- a/testing/jupyterhub_config.py +++ b/testing/jupyterhub_config.py @@ -19,3 +19,10 @@ c.JupyterHub.spawner_class = SimpleLocalProcessSpawner # only listen on localhost for testing c.JupyterHub.bind_url = 'http://127.0.0.1:8000' + +c.JupyterHub.tornado_settings = { + "no_cache_static": True, +} + +c.JupyterHub.admin_users = {"admin"} +c.JupyterHub.allow_all = True From cca49486e3ba296594c38a11d955ccaa35becd95 Mon Sep 17 00:00:00 2001 From: Min RK Date: Thu, 4 Apr 2024 15:58:57 +0200 Subject: [PATCH 04/33] build with sass --- package-lock.json | 403 +++++++++++++++++++++++----------------------- package.json | 7 +- 2 files changed, 207 insertions(+), 203 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb4b639d..c86fbfc7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,209 +10,205 @@ "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { - "bootstrap": "^3.4.1", - "font-awesome": "^4.7.0", + "@fortawesome/fontawesome-free": "^6.1.1", + "bootstrap": "^5.3.0", "jquery": "^3.5.1", "moment": "^2.29.4", "requirejs": "^2.3.6" }, "devDependencies": { - "less": "^3.9.0", - "less-plugin-clean-css": "^1.5.1", - "prettier": "^1.16.4" + "sass": "^1.74.1" } }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "dev": true, - "engines": { - "node": ">=0.4.2" - } - }, - "node_modules/bootstrap": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", - "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", + "node_modules/@fortawesome/fontawesome-free": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.2.tgz", + "integrity": "sha512-hRILoInAx8GNT5IMkrtIt9blOdrqHOnPBH+k70aWUAqPZPgopb9G5EQJFpaBx/S8zp2fC+mPW349Bziuk1o28Q==", + "hasInstallScript": true, "engines": { "node": ">=6" } }, - "node_modules/clean-css": { - "version": "3.4.28", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", - "integrity": "sha512-aTWyttSdI2mYi07kWqHi24NUU9YlELFKGOAgFzZjDN1064DMAOy2FBuoyGmkKRlXkbpXd0EVHmiVkbKhKoirTw==", - "dev": true, - "dependencies": { - "commander": "2.8.x", - "source-map": "0.4.x" - }, - "bin": { - "cleancss": "bin/cleancss" - }, - "engines": { - "node": ">=0.10.0" + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" } }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { - "amdefine": ">=0.0.4" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=0.8.0" + "node": ">= 8" } }, - "node_modules/commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==", + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, - "dependencies": { - "graceful-readlink": ">= 1.0.0" - }, "engines": { - "node": ">= 0.6.x" - } - }, - "node_modules/copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, - "dependencies": { - "is-what": "^3.14.1" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/mesqueeb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "node_modules/bootstrap": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "optional": true, "dependencies": { - "prr": "~1.0.1" + "fill-range": "^7.0.1" }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/font-awesome": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", - "integrity": "sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg==", "engines": { - "node": ">=0.10.3" + "node": ">=8" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "optional": true + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } }, - "node_modules/graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", "dev": true }, - "node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "optional": true, - "bin": { - "image-size": "bin/image-size.js" + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, "node_modules/jquery": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.0.tgz", "integrity": "sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ==" }, - "node_modules/less": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/less/-/less-3.13.1.tgz", - "integrity": "sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==", - "dev": true, - "dependencies": { - "copy-anything": "^2.0.1", - "tslib": "^1.10.0" - }, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "native-request": "^1.0.5", - "source-map": "~0.6.0" - } - }, - "node_modules/less-plugin-clean-css": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/less-plugin-clean-css/-/less-plugin-clean-css-1.5.1.tgz", - "integrity": "sha512-Pc68AFHAEJO3aAoRvnUTW5iAiAv6y+TQsWLTTwVNqjiDno6xCvxz1AtfQl7Y0MZSpHPalFajM1EU4RB5UVINpw==", - "dev": true, - "dependencies": { - "clean-css": "^3.0.1" - }, - "engines": { - "node": ">=0.4.2" - } - }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "optional": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", @@ -221,42 +217,39 @@ "node": "*" } }, - "node_modules/native-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.1.0.tgz", - "integrity": "sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "optional": true - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "optional": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "bin": { - "prettier": "bin-prettier.js" + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" }, "engines": { - "node": ">=4" + "node": ">=8.10.0" } }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "optional": true - }, "node_modules/requirejs": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", @@ -269,31 +262,43 @@ "node": ">=0.4.0" } }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/sass": { + "version": "1.74.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.74.1.tgz", + "integrity": "sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==", "dev": true, - "optional": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, "bin": { - "semver": "bin/semver" + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, - "optional": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } } } } diff --git a/package.json b/package.json index 43ca7146..606817a1 100644 --- a/package.json +++ b/package.json @@ -10,15 +10,14 @@ }, "scripts": { "postinstall": "python3 ./bower-lite", - "node-sass": "node-sass", - "css": "node-sass --include-dir share/jupyterhub/static/components --source-map true --source-map-contents true share/jupyterhub/static/scss/style.scss -o share/jupyterhub/static/css" + "css": "sass -I share/jupyterhub/static/components --source-map share/jupyterhub/static/scss/style.scss:share/jupyterhub/static/css/style.css" }, "devDependencies": { - "node-sass": "^7.0.1" + "sass": "^1.74.1" }, "dependencies": { "@fortawesome/fontawesome-free": "^6.1.1", - "bootstrap": "^5.1.3", + "bootstrap": "^5.3.0", "jquery": "^3.5.1", "moment": "^2.29.4", "requirejs": "^2.3.6" From 2fe060861a132797593046ad703783244daa0c4c Mon Sep 17 00:00:00 2001 From: Min RK Date: Thu, 4 Apr 2024 16:10:15 +0200 Subject: [PATCH 05/33] progress toward bootstrap 5 --- .gitignore | 2 + jsx/.gitignore | 1 + .../ServerDashboard/ServerDashboard.jsx | 4 +- .../ServerDashboard/server-dashboard.css | 7 --- share/jupyterhub/static/scss/login.scss | 10 ++-- share/jupyterhub/static/scss/page.scss | 17 +++++- share/jupyterhub/static/scss/style.scss | 59 ++++++++++++++----- share/jupyterhub/static/scss/variables.scss | 24 +++----- share/jupyterhub/templates/login.html | 2 +- share/jupyterhub/templates/page.html | 35 +++++------ share/jupyterhub/templates/token.html | 28 ++++----- 11 files changed, 106 insertions(+), 83 deletions(-) diff --git a/.gitignore b/.gitignore index e3ca05fa..7683d902 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,8 @@ jupyterhub_cookie_secret jupyterhub.sqlite jupyterhub.sqlite* share/jupyterhub/static/components +share/jupyterhub/static/css/style.css +share/jupyterhub/static/css/style.css.map share/jupyterhub/static/css/style.min.css share/jupyterhub/static/css/style.min.css.map share/jupyterhub/static/js/admin-react.js* diff --git a/jsx/.gitignore b/jsx/.gitignore index 6ae0fdb6..a3485a53 100644 --- a/jsx/.gitignore +++ b/jsx/.gitignore @@ -1,2 +1,3 @@ node_modules build/admin-react.js +.yarn diff --git a/jsx/src/components/ServerDashboard/ServerDashboard.jsx b/jsx/src/components/ServerDashboard/ServerDashboard.jsx index 2d8a28a3..230fcd34 100644 --- a/jsx/src/components/ServerDashboard/ServerDashboard.jsx +++ b/jsx/src/components/ServerDashboard/ServerDashboard.jsx @@ -342,7 +342,7 @@ const ServerDashboard = (props) => { variant={open ? "secondary" : "primary"} size="sm" > - + {" "} @@ -565,7 +565,7 @@ const ServerDashboard = (props) => { Stop All {/* spacing between start/stop and Shutdown */} - + {/* Shutdown Jupyterhub */}