From 235aed21ec9a9e410daaa75e7354bf4f0879f72c Mon Sep 17 00:00:00 2001 From: martinRenou Date: Tue, 18 Jan 2022 10:26:55 +0100 Subject: [PATCH] Automatically download labvariables CSS instead of shipping them --- .gitignore | 8 +- pyproject.toml | 11 +- setup.py | 78 ++++- .../templates/classic/static/labvariables.css | 209 ------------ .../classic/static/materialcolors.css | 304 ------------------ .../templates/reveal/static/labvariables.css | 209 ------------ .../reveal/static/materialcolors.css | 304 ------------------ .../voila.test.ts-snapshots/reveal-linux.png | Bin 10832 -> 12587 bytes 8 files changed, 94 insertions(+), 1029 deletions(-) delete mode 100644 share/jupyter/voila/templates/classic/static/labvariables.css delete mode 100644 share/jupyter/voila/templates/classic/static/materialcolors.css delete mode 100644 share/jupyter/voila/templates/reveal/static/labvariables.css delete mode 100644 share/jupyter/voila/templates/reveal/static/materialcolors.css diff --git a/.gitignore b/.gitignore index cfa182b1a..658dbadfe 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,12 @@ package-lock.json share/jupyter/voila/templates/base/static/*voila.js share/jupyter/voila/templates/base/static/*[woff|woff2|eot|svg] +share/jupyter/voila/templates/classic/static/labvariables.css +share/jupyter/voila/templates/classic/static/materialcolors.css + +share/jupyter/voila/templates/reveal/static/labvariables.css +share/jupyter/voila/templates/reveal/static/materialcolors.css + lib voila/labextension @@ -40,4 +46,4 @@ tsconfig.tsbuildinfo ui-tests/playwright-report ui-tests/test-results ui-tests/benchmark-results -ui-tests/jlab_root \ No newline at end of file +ui-tests/jlab_root diff --git a/pyproject.toml b/pyproject.toml index cc6bfd117..10f898649 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,4 +28,13 @@ before-build-python = ["jlpm clean"] version-cmd = "python scripts/bump-version.py --force" [tool.check-manifest] -ignore = [".binder/**", "docs/**", "notebooks/**", "packages/**", "share/**/*.js", "share/**/*.woff", "*.json", "*.gif", "yarn.lock", "environment.yml", "readthedocs.yml", ".*", "lint-staged.config.js", "scripts/**", "voila/labextension/**", "voila/static/**", "tests/**", "ui-tests/**"] +ignore = [ + ".binder/**", "docs/**", "notebooks/**", + "packages/**", + "share/**/*.js", "share/**/*.woff", "share/**/*.css", + "*.json", "*.gif", "yarn.lock", + "environment.yml", "readthedocs.yml", ".*", + "lint-staged.config.js", "scripts/**", + "voila/labextension/**", "voila/static/**", + "tests/**", "ui-tests/**", +] diff --git a/setup.py b/setup.py index ceff1ced5..61fac8636 100644 --- a/setup.py +++ b/setup.py @@ -7,8 +7,10 @@ # The full license is in the file LICENSE, distributed with this software. # ############################################################################# from pathlib import Path - +from urllib.request import urlopen import setuptools +import sys +import os HERE = Path(__file__).parent.resolve() @@ -47,6 +49,75 @@ ("share/jupyter/voila/templates", "share/jupyter/voila/templates", "**/*[!.map]"), ] + +jupyterlab_apputils_version = "3.2.8" +jupyterlab_theme_light_version = "3.2.8" + +css_files = [ + ( + "https://unpkg.com/@jupyterlab/apputils@%s/style/materialcolors.css" + % jupyterlab_apputils_version, + "materialcolors.css", + ), + ( + "https://unpkg.com/@jupyterlab/theme-light-extension@%s/style/variables.css" + % jupyterlab_theme_light_version, + "labvariables.css", + ), +] + + +class FetchCSS(setuptools.Command): + """Fetch CSS files from the CDNs.""" + + description = "Fetch CSS from CDN" + user_options = [] + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + for template_name in ["classic", "reveal"]: + for url, filename in css_files: + directory = os.path.join( + "share", "jupyter", "voila", "templates", template_name, "static" + ) + dest = os.path.join(directory, filename) + if not os.path.exists(directory): + os.makedirs(directory) + if not os.path.exists(".git") and os.path.exists(dest): + # not running from git, nothing to do + return + print("Downloading CSS: %s" % url) + try: + css = urlopen(url).read() + except Exception as e: + msg = "Failed to download css from %s: %s" % (url, e) + print(msg, file=sys.stderr) + + if os.path.exists(dest): + print("Already have CSS: %s, moving on." % dest) + else: + raise OSError("Need CSS to proceed.") + return + + with open(dest, "wb") as f: + f.write(css) + print("Downloaded Notebook CSS to %s" % dest) + + +def download_css_first(command): + class CSSFirst(command): + def run(self): + self.distribution.run_command("download_css") + return command.run(self) + + return CSSFirst + + try: from jupyter_packaging import wrap_installers, npm_builder, get_data_files @@ -54,6 +125,11 @@ builder = npm_builder(build_cmd="build", npm="jlpm", force=True) cmdclass = wrap_installers(post_develop=builder, ensured_targets=ensured_targets) + cmdclass["download_css"] = FetchCSS + cmdclass["develop"] = download_css_first(cmdclass["develop"]) + cmdclass["sdist"] = download_css_first(cmdclass["sdist"]) + cmdclass["bdist_wheel"] = download_css_first(cmdclass["bdist_wheel"]) + setup_args = dict(cmdclass=cmdclass, data_files=get_data_files(data_files_spec)) except ImportError: setup_args = dict() diff --git a/share/jupyter/voila/templates/classic/static/labvariables.css b/share/jupyter/voila/templates/classic/static/labvariables.css deleted file mode 100644 index d98715743..000000000 --- a/share/jupyter/voila/templates/classic/static/labvariables.css +++ /dev/null @@ -1,209 +0,0 @@ -/*----------------------------------------------------------------------------- -| Copyright (c) Jupyter Development Team. -| Distributed under the terms of the Modified BSD License. -|----------------------------------------------------------------------------*/ - -/* -This file is copied from the JupyterLab project to define default styling for -when the widget styling is compiled down to eliminate CSS variables. We make one -change - we comment out the font import below. -*/ - -@import "./materialcolors.css"; - -/* -The following CSS variables define the main, public API for styling JupyterLab. -These variables should be used by all plugins wherever possible. In other -words, plugins should not define custom colors, sizes, etc unless absolutely -necessary. This enables users to change the visual theme of JupyterLab -by changing these variables. - -Many variables appear in an ordered sequence (0,1,2,3). These sequences -are designed to work well together, so for example, `--jp-border-color1` should -be used with `--jp-layout-color1`. The numbers have the following meanings: - -* 0: super-primary, reserved for special emphasis -* 1: primary, most important under normal situations -* 2: secondary, next most important under normal situations -* 3: tertiary, next most important under normal situations - -Throughout JupyterLab, we are mostly following principles from Google's -Material Design when selecting colors. We are not, however, following -all of MD as it is not optimized for dense, information rich UIs. -*/ - - -/* - * Optional monospace font for input/output prompt. - */ - /* Commented out in ipywidgets since we don't need it. */ -/* @import url('https://fonts.googleapis.com/css?family=Roboto+Mono'); */ - -/* - * Added for compatibility with output area - */ -:root { - --jp-icon-search: none; - --jp-ui-select-caret: none; -} - - -:root { - - /* Borders - - The following variables, specify the visual styling of borders in JupyterLab. - */ - - --jp-border-width: 1px; - --jp-border-color0: var(--md-grey-700); - --jp-border-color1: var(--md-grey-500); - --jp-border-color2: var(--md-grey-300); - --jp-border-color3: var(--md-grey-100); - - /* UI Fonts - - The UI font CSS variables are used for the typography all of the JupyterLab - user interface elements that are not directly user generated content. - */ - - --jp-ui-font-scale-factor: 1.2; - --jp-ui-font-size0: calc(var(--jp-ui-font-size1)/var(--jp-ui-font-scale-factor)); - --jp-ui-font-size1: 13px; /* Base font size */ - --jp-ui-font-size2: calc(var(--jp-ui-font-size1)*var(--jp-ui-font-scale-factor)); - --jp-ui-font-size3: calc(var(--jp-ui-font-size2)*var(--jp-ui-font-scale-factor)); - --jp-ui-icon-font-size: 14px; /* Ensures px perfect FontAwesome icons */ - --jp-ui-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - - /* Use these font colors against the corresponding main layout colors. - In a light theme, these go from dark to light. - */ - - --jp-ui-font-color0: rgba(0,0,0,1.0); - --jp-ui-font-color1: rgba(0,0,0,0.8); - --jp-ui-font-color2: rgba(0,0,0,0.5); - --jp-ui-font-color3: rgba(0,0,0,0.3); - - /* Use these against the brand/accent/warn/error colors. - These will typically go from light to darker, in both a dark and light theme - */ - - --jp-ui-inverse-font-color0: rgba(255, 255, 255, 1); - --jp-ui-inverse-font-color1: rgba(255, 255, 255, 1); - --jp-ui-inverse-font-color2: rgba(255, 255, 255, 0.7); - --jp-ui-inverse-font-color3: rgba(255, 255, 255, 0.5); - - /* For backwards compatibility, we still define these below until ipywidgets 8.0. - See https://github.com/jupyter-widgets/ipywidgets/pull/2801 */ - --jp-inverse-ui-font-color0: rgba(255,255,255,1); - --jp-inverse-ui-font-color1: rgba(255,255,255,1.0); - --jp-inverse-ui-font-color2: rgba(255,255,255,0.7); - --jp-inverse-ui-font-color3: rgba(255,255,255,0.5); - - /* Content Fonts - - Content font variables are used for typography of user generated content. - */ - - --jp-content-font-size: 13px; - --jp-content-line-height: 1.5; - --jp-content-font-color0: black; - --jp-content-font-color1: black; - --jp-content-font-color2: var(--md-grey-700); - --jp-content-font-color3: var(--md-grey-500); - - --jp-ui-font-scale-factor: 1.2; - --jp-ui-font-size0: calc(var(--jp-ui-font-size1)/var(--jp-ui-font-scale-factor)); - --jp-ui-font-size1: 13px; /* Base font size */ - --jp-ui-font-size2: calc(var(--jp-ui-font-size1)*var(--jp-ui-font-scale-factor)); - --jp-ui-font-size3: calc(var(--jp-ui-font-size2)*var(--jp-ui-font-scale-factor)); - - --jp-code-font-size: 13px; - --jp-code-line-height: 1.307; - --jp-code-padding: 5px; - --jp-code-font-family: monospace; - - - /* Layout - - The following are the main layout colors use in JupyterLab. In a light - theme these would go from light to dark. - */ - - --jp-layout-color0: white; - --jp-layout-color1: white; - --jp-layout-color2: var(--md-grey-200); - --jp-layout-color3: var(--md-grey-400); - - /* Brand/accent */ - - --jp-brand-color0: var(--md-blue-700); - --jp-brand-color1: var(--md-blue-500); - --jp-brand-color2: var(--md-blue-300); - --jp-brand-color3: var(--md-blue-100); - - --jp-accent-color0: var(--md-green-700); - --jp-accent-color1: var(--md-green-500); - --jp-accent-color2: var(--md-green-300); - --jp-accent-color3: var(--md-green-100); - - /* State colors (warn, error, success, info) */ - - --jp-warn-color0: var(--md-orange-700); - --jp-warn-color1: var(--md-orange-500); - --jp-warn-color2: var(--md-orange-300); - --jp-warn-color3: var(--md-orange-100); - - --jp-error-color0: var(--md-red-700); - --jp-error-color1: var(--md-red-500); - --jp-error-color2: var(--md-red-300); - --jp-error-color3: var(--md-red-100); - - --jp-success-color0: var(--md-green-700); - --jp-success-color1: var(--md-green-500); - --jp-success-color2: var(--md-green-300); - --jp-success-color3: var(--md-green-100); - - --jp-info-color0: var(--md-cyan-700); - --jp-info-color1: var(--md-cyan-500); - --jp-info-color2: var(--md-cyan-300); - --jp-info-color3: var(--md-cyan-100); - - /* Cell specific styles */ - - --jp-cell-padding: 5px; - --jp-cell-editor-background: #f7f7f7; - --jp-cell-editor-border-color: #cfcfcf; - --jp-cell-editor-background-edit: var(--jp-ui-layout-color1); - --jp-cell-editor-border-color-edit: var(--jp-brand-color1); - --jp-cell-prompt-width: 100px; - --jp-cell-prompt-font-family: 'Roboto Mono', monospace; - --jp-cell-prompt-letter-spacing: 0px; - --jp-cell-prompt-opacity: 1.0; - --jp-cell-prompt-opacity-not-active: 0.4; - --jp-cell-prompt-font-color-not-active: var(--md-grey-700); - /* A custom blend of MD grey and blue 600 - * See https://meyerweb.com/eric/tools/color-blend/#546E7A:1E88E5:5:hex */ - --jp-cell-inprompt-font-color: #307FC1; - /* A custom blend of MD grey and orange 600 - * https://meyerweb.com/eric/tools/color-blend/#546E7A:F4511E:5:hex */ - --jp-cell-outprompt-font-color: #BF5B3D; - - /* Notebook specific styles */ - - --jp-notebook-padding: 10px; - --jp-notebook-scroll-padding: 100px; - - /* Console specific styles */ - - --jp-console-background: var(--md-grey-100); - - /* Toolbar specific styles */ - - --jp-toolbar-border-color: var(--md-grey-400); - --jp-toolbar-micro-height: 8px; - --jp-toolbar-background: var(--jp-layout-color0); - --jp-toolbar-box-shadow: 0px 0px 2px 0px rgba(0,0,0,0.24); - --jp-toolbar-header-margin: 4px 4px 0px 4px; - --jp-toolbar-active-background: var(--md-grey-300); -} diff --git a/share/jupyter/voila/templates/classic/static/materialcolors.css b/share/jupyter/voila/templates/classic/static/materialcolors.css deleted file mode 100644 index 9b8872a85..000000000 --- a/share/jupyter/voila/templates/classic/static/materialcolors.css +++ /dev/null @@ -1,304 +0,0 @@ -/** - * The material design colors are adapted from google-material-color v1.2.6 - * https://github.com/danlevan/google-material-color - * https://github.com/danlevan/google-material-color/blob/f67ca5f4028b2f1b34862f64b0ca67323f91b088/dist/palette.var.css - * - * The license for the material design color CSS variables is as follows (see - * https://github.com/danlevan/google-material-color/blob/f67ca5f4028b2f1b34862f64b0ca67323f91b088/LICENSE) - * - * The MIT License (MIT) - * - * Copyright (c) 2014 Dan Le Van - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -:root { - --md-red-50: #FFEBEE; - --md-red-100: #FFCDD2; - --md-red-200: #EF9A9A; - --md-red-300: #E57373; - --md-red-400: #EF5350; - --md-red-500: #F44336; - --md-red-600: #E53935; - --md-red-700: #D32F2F; - --md-red-800: #C62828; - --md-red-900: #B71C1C; - --md-red-A100: #FF8A80; - --md-red-A200: #FF5252; - --md-red-A400: #FF1744; - --md-red-A700: #D50000; - - --md-pink-50: #FCE4EC; - --md-pink-100: #F8BBD0; - --md-pink-200: #F48FB1; - --md-pink-300: #F06292; - --md-pink-400: #EC407A; - --md-pink-500: #E91E63; - --md-pink-600: #D81B60; - --md-pink-700: #C2185B; - --md-pink-800: #AD1457; - --md-pink-900: #880E4F; - --md-pink-A100: #FF80AB; - --md-pink-A200: #FF4081; - --md-pink-A400: #F50057; - --md-pink-A700: #C51162; - - --md-purple-50: #F3E5F5; - --md-purple-100: #E1BEE7; - --md-purple-200: #CE93D8; - --md-purple-300: #BA68C8; - --md-purple-400: #AB47BC; - --md-purple-500: #9C27B0; - --md-purple-600: #8E24AA; - --md-purple-700: #7B1FA2; - --md-purple-800: #6A1B9A; - --md-purple-900: #4A148C; - --md-purple-A100: #EA80FC; - --md-purple-A200: #E040FB; - --md-purple-A400: #D500F9; - --md-purple-A700: #AA00FF; - - --md-deep-purple-50: #EDE7F6; - --md-deep-purple-100: #D1C4E9; - --md-deep-purple-200: #B39DDB; - --md-deep-purple-300: #9575CD; - --md-deep-purple-400: #7E57C2; - --md-deep-purple-500: #673AB7; - --md-deep-purple-600: #5E35B1; - --md-deep-purple-700: #512DA8; - --md-deep-purple-800: #4527A0; - --md-deep-purple-900: #311B92; - --md-deep-purple-A100: #B388FF; - --md-deep-purple-A200: #7C4DFF; - --md-deep-purple-A400: #651FFF; - --md-deep-purple-A700: #6200EA; - - --md-indigo-50: #E8EAF6; - --md-indigo-100: #C5CAE9; - --md-indigo-200: #9FA8DA; - --md-indigo-300: #7986CB; - --md-indigo-400: #5C6BC0; - --md-indigo-500: #3F51B5; - --md-indigo-600: #3949AB; - --md-indigo-700: #303F9F; - --md-indigo-800: #283593; - --md-indigo-900: #1A237E; - --md-indigo-A100: #8C9EFF; - --md-indigo-A200: #536DFE; - --md-indigo-A400: #3D5AFE; - --md-indigo-A700: #304FFE; - - --md-blue-50: #E3F2FD; - --md-blue-100: #BBDEFB; - --md-blue-200: #90CAF9; - --md-blue-300: #64B5F6; - --md-blue-400: #42A5F5; - --md-blue-500: #2196F3; - --md-blue-600: #1E88E5; - --md-blue-700: #1976D2; - --md-blue-800: #1565C0; - --md-blue-900: #0D47A1; - --md-blue-A100: #82B1FF; - --md-blue-A200: #448AFF; - --md-blue-A400: #2979FF; - --md-blue-A700: #2962FF; - - --md-light-blue-50: #E1F5FE; - --md-light-blue-100: #B3E5FC; - --md-light-blue-200: #81D4FA; - --md-light-blue-300: #4FC3F7; - --md-light-blue-400: #29B6F6; - --md-light-blue-500: #03A9F4; - --md-light-blue-600: #039BE5; - --md-light-blue-700: #0288D1; - --md-light-blue-800: #0277BD; - --md-light-blue-900: #01579B; - --md-light-blue-A100: #80D8FF; - --md-light-blue-A200: #40C4FF; - --md-light-blue-A400: #00B0FF; - --md-light-blue-A700: #0091EA; - - --md-cyan-50: #E0F7FA; - --md-cyan-100: #B2EBF2; - --md-cyan-200: #80DEEA; - --md-cyan-300: #4DD0E1; - --md-cyan-400: #26C6DA; - --md-cyan-500: #00BCD4; - --md-cyan-600: #00ACC1; - --md-cyan-700: #0097A7; - --md-cyan-800: #00838F; - --md-cyan-900: #006064; - --md-cyan-A100: #84FFFF; - --md-cyan-A200: #18FFFF; - --md-cyan-A400: #00E5FF; - --md-cyan-A700: #00B8D4; - - --md-teal-50: #E0F2F1; - --md-teal-100: #B2DFDB; - --md-teal-200: #80CBC4; - --md-teal-300: #4DB6AC; - --md-teal-400: #26A69A; - --md-teal-500: #009688; - --md-teal-600: #00897B; - --md-teal-700: #00796B; - --md-teal-800: #00695C; - --md-teal-900: #004D40; - --md-teal-A100: #A7FFEB; - --md-teal-A200: #64FFDA; - --md-teal-A400: #1DE9B6; - --md-teal-A700: #00BFA5; - - --md-green-50: #E8F5E9; - --md-green-100: #C8E6C9; - --md-green-200: #A5D6A7; - --md-green-300: #81C784; - --md-green-400: #66BB6A; - --md-green-500: #4CAF50; - --md-green-600: #43A047; - --md-green-700: #388E3C; - --md-green-800: #2E7D32; - --md-green-900: #1B5E20; - --md-green-A100: #B9F6CA; - --md-green-A200: #69F0AE; - --md-green-A400: #00E676; - --md-green-A700: #00C853; - - --md-light-green-50: #F1F8E9; - --md-light-green-100: #DCEDC8; - --md-light-green-200: #C5E1A5; - --md-light-green-300: #AED581; - --md-light-green-400: #9CCC65; - --md-light-green-500: #8BC34A; - --md-light-green-600: #7CB342; - --md-light-green-700: #689F38; - --md-light-green-800: #558B2F; - --md-light-green-900: #33691E; - --md-light-green-A100: #CCFF90; - --md-light-green-A200: #B2FF59; - --md-light-green-A400: #76FF03; - --md-light-green-A700: #64DD17; - - --md-lime-50: #F9FBE7; - --md-lime-100: #F0F4C3; - --md-lime-200: #E6EE9C; - --md-lime-300: #DCE775; - --md-lime-400: #D4E157; - --md-lime-500: #CDDC39; - --md-lime-600: #C0CA33; - --md-lime-700: #AFB42B; - --md-lime-800: #9E9D24; - --md-lime-900: #827717; - --md-lime-A100: #F4FF81; - --md-lime-A200: #EEFF41; - --md-lime-A400: #C6FF00; - --md-lime-A700: #AEEA00; - - --md-yellow-50: #FFFDE7; - --md-yellow-100: #FFF9C4; - --md-yellow-200: #FFF59D; - --md-yellow-300: #FFF176; - --md-yellow-400: #FFEE58; - --md-yellow-500: #FFEB3B; - --md-yellow-600: #FDD835; - --md-yellow-700: #FBC02D; - --md-yellow-800: #F9A825; - --md-yellow-900: #F57F17; - --md-yellow-A100: #FFFF8D; - --md-yellow-A200: #FFFF00; - --md-yellow-A400: #FFEA00; - --md-yellow-A700: #FFD600; - - --md-amber-50: #FFF8E1; - --md-amber-100: #FFECB3; - --md-amber-200: #FFE082; - --md-amber-300: #FFD54F; - --md-amber-400: #FFCA28; - --md-amber-500: #FFC107; - --md-amber-600: #FFB300; - --md-amber-700: #FFA000; - --md-amber-800: #FF8F00; - --md-amber-900: #FF6F00; - --md-amber-A100: #FFE57F; - --md-amber-A200: #FFD740; - --md-amber-A400: #FFC400; - --md-amber-A700: #FFAB00; - - --md-orange-50: #FFF3E0; - --md-orange-100: #FFE0B2; - --md-orange-200: #FFCC80; - --md-orange-300: #FFB74D; - --md-orange-400: #FFA726; - --md-orange-500: #FF9800; - --md-orange-600: #FB8C00; - --md-orange-700: #F57C00; - --md-orange-800: #EF6C00; - --md-orange-900: #E65100; - --md-orange-A100: #FFD180; - --md-orange-A200: #FFAB40; - --md-orange-A400: #FF9100; - --md-orange-A700: #FF6D00; - - --md-deep-orange-50: #FBE9E7; - --md-deep-orange-100: #FFCCBC; - --md-deep-orange-200: #FFAB91; - --md-deep-orange-300: #FF8A65; - --md-deep-orange-400: #FF7043; - --md-deep-orange-500: #FF5722; - --md-deep-orange-600: #F4511E; - --md-deep-orange-700: #E64A19; - --md-deep-orange-800: #D84315; - --md-deep-orange-900: #BF360C; - --md-deep-orange-A100: #FF9E80; - --md-deep-orange-A200: #FF6E40; - --md-deep-orange-A400: #FF3D00; - --md-deep-orange-A700: #DD2C00; - - --md-brown-50: #EFEBE9; - --md-brown-100: #D7CCC8; - --md-brown-200: #BCAAA4; - --md-brown-300: #A1887F; - --md-brown-400: #8D6E63; - --md-brown-500: #795548; - --md-brown-600: #6D4C41; - --md-brown-700: #5D4037; - --md-brown-800: #4E342E; - --md-brown-900: #3E2723; - - --md-grey-50: #FAFAFA; - --md-grey-100: #F5F5F5; - --md-grey-200: #EEEEEE; - --md-grey-300: #E0E0E0; - --md-grey-400: #BDBDBD; - --md-grey-500: #9E9E9E; - --md-grey-600: #757575; - --md-grey-700: #616161; - --md-grey-800: #424242; - --md-grey-900: #212121; - - --md-blue-grey-50: #ECEFF1; - --md-blue-grey-100: #CFD8DC; - --md-blue-grey-200: #B0BEC5; - --md-blue-grey-300: #90A4AE; - --md-blue-grey-400: #78909C; - --md-blue-grey-500: #607D8B; - --md-blue-grey-600: #546E7A; - --md-blue-grey-700: #455A64; - --md-blue-grey-800: #37474F; - --md-blue-grey-900: #263238; -} \ No newline at end of file diff --git a/share/jupyter/voila/templates/reveal/static/labvariables.css b/share/jupyter/voila/templates/reveal/static/labvariables.css deleted file mode 100644 index 1b1ad577b..000000000 --- a/share/jupyter/voila/templates/reveal/static/labvariables.css +++ /dev/null @@ -1,209 +0,0 @@ -/*----------------------------------------------------------------------------- -| Copyright (c) Jupyter Development Team. -| Distributed under the terms of the Modified BSD License. -|----------------------------------------------------------------------------*/ - -/* -This file is copied from the JupyterLab project to define default styling for -when the widget styling is compiled down to eliminate CSS variables. We make one -change - we comment out the font import below. -*/ - -@import "./materialcolors.css"; - -/* -The following CSS variables define the main, public API for styling JupyterLab. -These variables should be used by all plugins wherever possible. In other -words, plugins should not define custom colors, sizes, etc unless absolutely -necessary. This enables users to change the visual theme of JupyterLab -by changing these variables. - -Many variables appear in an ordered sequence (0,1,2,3). These sequences -are designed to work well together, so for example, `--jp-border-color1` should -be used with `--jp-layout-color1`. The numbers have the following meanings: - -* 0: super-primary, reserved for special emphasis -* 1: primary, most important under normal situations -* 2: secondary, next most important under normal situations -* 3: tertiary, next most important under normal situations - -Throughout JupyterLab, we are mostly following principles from Google's -Material Design when selecting colors. We are not, however, following -all of MD as it is not optimized for dense, information rich UIs. -*/ - - -/* - * Optional monospace font for input/output prompt. - */ - /* Commented out in ipywidgets since we don't need it. */ -/* @import url('https://fonts.googleapis.com/css?family=Roboto+Mono'); */ - -/* - * Added for compabitility with output area - */ -:root { - --jp-icon-search: none; - --jp-ui-select-caret: none; -} - - -:root { - - /* Borders - - The following variables, specify the visual styling of borders in JupyterLab. - */ - - --jp-border-width: 1px; - --jp-border-color0: var(--md-grey-700); - --jp-border-color1: var(--md-grey-500); - --jp-border-color2: var(--md-grey-300); - --jp-border-color3: var(--md-grey-100); - - /* UI Fonts - - The UI font CSS variables are used for the typography all of the JupyterLab - user interface elements that are not directly user generated content. - */ - - --jp-ui-font-scale-factor: 1.2; - --jp-ui-font-size0: calc(var(--jp-ui-font-size1)/var(--jp-ui-font-scale-factor)); - --jp-ui-font-size1: 13px; /* Base font size */ - --jp-ui-font-size2: calc(var(--jp-ui-font-size1)*var(--jp-ui-font-scale-factor)); - --jp-ui-font-size3: calc(var(--jp-ui-font-size2)*var(--jp-ui-font-scale-factor)); - --jp-ui-icon-font-size: 14px; /* Ensures px perfect FontAwesome icons */ - --jp-ui-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - - /* Use these font colors against the corresponding main layout colors. - In a light theme, these go from dark to light. - */ - - --jp-ui-font-color0: rgba(0,0,0,1.0); - --jp-ui-font-color1: rgba(0,0,0,0.8); - --jp-ui-font-color2: rgba(0,0,0,0.5); - --jp-ui-font-color3: rgba(0,0,0,0.3); - - /* Use these against the brand/accent/warn/error colors. - These will typically go from light to darker, in both a dark and light theme - */ - - --jp-ui-inverse-font-color0: rgba(255, 255, 255, 1); - --jp-ui-inverse-font-color1: rgba(255, 255, 255, 1); - --jp-ui-inverse-font-color2: rgba(255, 255, 255, 0.7); - --jp-ui-inverse-font-color3: rgba(255, 255, 255, 0.5); - - /* For backwards compatibility, we still define these below until ipywidgets 8.0. - See https://github.com/jupyter-widgets/ipywidgets/pull/2801 */ - --jp-inverse-ui-font-color0: rgba(255,255,255,1); - --jp-inverse-ui-font-color1: rgba(255,255,255,1.0); - --jp-inverse-ui-font-color2: rgba(255,255,255,0.7); - --jp-inverse-ui-font-color3: rgba(255,255,255,0.5); - - /* Content Fonts - - Content font variables are used for typography of user generated content. - */ - - --jp-content-font-size: 13px; - --jp-content-line-height: 1.5; - --jp-content-font-color0: black; - --jp-content-font-color1: black; - --jp-content-font-color2: var(--md-grey-700); - --jp-content-font-color3: var(--md-grey-500); - - --jp-ui-font-scale-factor: 1.2; - --jp-ui-font-size0: calc(var(--jp-ui-font-size1)/var(--jp-ui-font-scale-factor)); - --jp-ui-font-size1: 13px; /* Base font size */ - --jp-ui-font-size2: calc(var(--jp-ui-font-size1)*var(--jp-ui-font-scale-factor)); - --jp-ui-font-size3: calc(var(--jp-ui-font-size2)*var(--jp-ui-font-scale-factor)); - - --jp-code-font-size: 13px; - --jp-code-line-height: 1.307; - --jp-code-padding: 5px; - --jp-code-font-family: monospace; - - - /* Layout - - The following are the main layout colors use in JupyterLab. In a light - theme these would go from light to dark. - */ - - --jp-layout-color0: white; - --jp-layout-color1: white; - --jp-layout-color2: var(--md-grey-200); - --jp-layout-color3: var(--md-grey-400); - - /* Brand/accent */ - - --jp-brand-color0: var(--md-blue-700); - --jp-brand-color1: var(--md-blue-500); - --jp-brand-color2: var(--md-blue-300); - --jp-brand-color3: var(--md-blue-100); - - --jp-accent-color0: var(--md-green-700); - --jp-accent-color1: var(--md-green-500); - --jp-accent-color2: var(--md-green-300); - --jp-accent-color3: var(--md-green-100); - - /* State colors (warn, error, success, info) */ - - --jp-warn-color0: var(--md-orange-700); - --jp-warn-color1: var(--md-orange-500); - --jp-warn-color2: var(--md-orange-300); - --jp-warn-color3: var(--md-orange-100); - - --jp-error-color0: var(--md-red-700); - --jp-error-color1: var(--md-red-500); - --jp-error-color2: var(--md-red-300); - --jp-error-color3: var(--md-red-100); - - --jp-success-color0: var(--md-green-700); - --jp-success-color1: var(--md-green-500); - --jp-success-color2: var(--md-green-300); - --jp-success-color3: var(--md-green-100); - - --jp-info-color0: var(--md-cyan-700); - --jp-info-color1: var(--md-cyan-500); - --jp-info-color2: var(--md-cyan-300); - --jp-info-color3: var(--md-cyan-100); - - /* Cell specific styles */ - - --jp-cell-padding: 5px; - --jp-cell-editor-background: #f7f7f7; - --jp-cell-editor-border-color: #cfcfcf; - --jp-cell-editor-background-edit: var(--jp-ui-layout-color1); - --jp-cell-editor-border-color-edit: var(--jp-brand-color1); - --jp-cell-prompt-width: 100px; - --jp-cell-prompt-font-family: 'Roboto Mono', monospace; - --jp-cell-prompt-letter-spacing: 0px; - --jp-cell-prompt-opacity: 1.0; - --jp-cell-prompt-opacity-not-active: 0.4; - --jp-cell-prompt-font-color-not-active: var(--md-grey-700); - /* A custom blend of MD grey and blue 600 - * See https://meyerweb.com/eric/tools/color-blend/#546E7A:1E88E5:5:hex */ - --jp-cell-inprompt-font-color: #307FC1; - /* A custom blend of MD grey and orange 600 - * https://meyerweb.com/eric/tools/color-blend/#546E7A:F4511E:5:hex */ - --jp-cell-outprompt-font-color: #BF5B3D; - - /* Notebook specific styles */ - - --jp-notebook-padding: 10px; - --jp-notebook-scroll-padding: 100px; - - /* Console specific styles */ - - --jp-console-background: var(--md-grey-100); - - /* Toolbar specific styles */ - - --jp-toolbar-border-color: var(--md-grey-400); - --jp-toolbar-micro-height: 8px; - --jp-toolbar-background: var(--jp-layout-color0); - --jp-toolbar-box-shadow: 0px 0px 2px 0px rgba(0,0,0,0.24); - --jp-toolbar-header-margin: 4px 4px 0px 4px; - --jp-toolbar-active-background: var(--md-grey-300); -} diff --git a/share/jupyter/voila/templates/reveal/static/materialcolors.css b/share/jupyter/voila/templates/reveal/static/materialcolors.css deleted file mode 100644 index 9b8872a85..000000000 --- a/share/jupyter/voila/templates/reveal/static/materialcolors.css +++ /dev/null @@ -1,304 +0,0 @@ -/** - * The material design colors are adapted from google-material-color v1.2.6 - * https://github.com/danlevan/google-material-color - * https://github.com/danlevan/google-material-color/blob/f67ca5f4028b2f1b34862f64b0ca67323f91b088/dist/palette.var.css - * - * The license for the material design color CSS variables is as follows (see - * https://github.com/danlevan/google-material-color/blob/f67ca5f4028b2f1b34862f64b0ca67323f91b088/LICENSE) - * - * The MIT License (MIT) - * - * Copyright (c) 2014 Dan Le Van - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -:root { - --md-red-50: #FFEBEE; - --md-red-100: #FFCDD2; - --md-red-200: #EF9A9A; - --md-red-300: #E57373; - --md-red-400: #EF5350; - --md-red-500: #F44336; - --md-red-600: #E53935; - --md-red-700: #D32F2F; - --md-red-800: #C62828; - --md-red-900: #B71C1C; - --md-red-A100: #FF8A80; - --md-red-A200: #FF5252; - --md-red-A400: #FF1744; - --md-red-A700: #D50000; - - --md-pink-50: #FCE4EC; - --md-pink-100: #F8BBD0; - --md-pink-200: #F48FB1; - --md-pink-300: #F06292; - --md-pink-400: #EC407A; - --md-pink-500: #E91E63; - --md-pink-600: #D81B60; - --md-pink-700: #C2185B; - --md-pink-800: #AD1457; - --md-pink-900: #880E4F; - --md-pink-A100: #FF80AB; - --md-pink-A200: #FF4081; - --md-pink-A400: #F50057; - --md-pink-A700: #C51162; - - --md-purple-50: #F3E5F5; - --md-purple-100: #E1BEE7; - --md-purple-200: #CE93D8; - --md-purple-300: #BA68C8; - --md-purple-400: #AB47BC; - --md-purple-500: #9C27B0; - --md-purple-600: #8E24AA; - --md-purple-700: #7B1FA2; - --md-purple-800: #6A1B9A; - --md-purple-900: #4A148C; - --md-purple-A100: #EA80FC; - --md-purple-A200: #E040FB; - --md-purple-A400: #D500F9; - --md-purple-A700: #AA00FF; - - --md-deep-purple-50: #EDE7F6; - --md-deep-purple-100: #D1C4E9; - --md-deep-purple-200: #B39DDB; - --md-deep-purple-300: #9575CD; - --md-deep-purple-400: #7E57C2; - --md-deep-purple-500: #673AB7; - --md-deep-purple-600: #5E35B1; - --md-deep-purple-700: #512DA8; - --md-deep-purple-800: #4527A0; - --md-deep-purple-900: #311B92; - --md-deep-purple-A100: #B388FF; - --md-deep-purple-A200: #7C4DFF; - --md-deep-purple-A400: #651FFF; - --md-deep-purple-A700: #6200EA; - - --md-indigo-50: #E8EAF6; - --md-indigo-100: #C5CAE9; - --md-indigo-200: #9FA8DA; - --md-indigo-300: #7986CB; - --md-indigo-400: #5C6BC0; - --md-indigo-500: #3F51B5; - --md-indigo-600: #3949AB; - --md-indigo-700: #303F9F; - --md-indigo-800: #283593; - --md-indigo-900: #1A237E; - --md-indigo-A100: #8C9EFF; - --md-indigo-A200: #536DFE; - --md-indigo-A400: #3D5AFE; - --md-indigo-A700: #304FFE; - - --md-blue-50: #E3F2FD; - --md-blue-100: #BBDEFB; - --md-blue-200: #90CAF9; - --md-blue-300: #64B5F6; - --md-blue-400: #42A5F5; - --md-blue-500: #2196F3; - --md-blue-600: #1E88E5; - --md-blue-700: #1976D2; - --md-blue-800: #1565C0; - --md-blue-900: #0D47A1; - --md-blue-A100: #82B1FF; - --md-blue-A200: #448AFF; - --md-blue-A400: #2979FF; - --md-blue-A700: #2962FF; - - --md-light-blue-50: #E1F5FE; - --md-light-blue-100: #B3E5FC; - --md-light-blue-200: #81D4FA; - --md-light-blue-300: #4FC3F7; - --md-light-blue-400: #29B6F6; - --md-light-blue-500: #03A9F4; - --md-light-blue-600: #039BE5; - --md-light-blue-700: #0288D1; - --md-light-blue-800: #0277BD; - --md-light-blue-900: #01579B; - --md-light-blue-A100: #80D8FF; - --md-light-blue-A200: #40C4FF; - --md-light-blue-A400: #00B0FF; - --md-light-blue-A700: #0091EA; - - --md-cyan-50: #E0F7FA; - --md-cyan-100: #B2EBF2; - --md-cyan-200: #80DEEA; - --md-cyan-300: #4DD0E1; - --md-cyan-400: #26C6DA; - --md-cyan-500: #00BCD4; - --md-cyan-600: #00ACC1; - --md-cyan-700: #0097A7; - --md-cyan-800: #00838F; - --md-cyan-900: #006064; - --md-cyan-A100: #84FFFF; - --md-cyan-A200: #18FFFF; - --md-cyan-A400: #00E5FF; - --md-cyan-A700: #00B8D4; - - --md-teal-50: #E0F2F1; - --md-teal-100: #B2DFDB; - --md-teal-200: #80CBC4; - --md-teal-300: #4DB6AC; - --md-teal-400: #26A69A; - --md-teal-500: #009688; - --md-teal-600: #00897B; - --md-teal-700: #00796B; - --md-teal-800: #00695C; - --md-teal-900: #004D40; - --md-teal-A100: #A7FFEB; - --md-teal-A200: #64FFDA; - --md-teal-A400: #1DE9B6; - --md-teal-A700: #00BFA5; - - --md-green-50: #E8F5E9; - --md-green-100: #C8E6C9; - --md-green-200: #A5D6A7; - --md-green-300: #81C784; - --md-green-400: #66BB6A; - --md-green-500: #4CAF50; - --md-green-600: #43A047; - --md-green-700: #388E3C; - --md-green-800: #2E7D32; - --md-green-900: #1B5E20; - --md-green-A100: #B9F6CA; - --md-green-A200: #69F0AE; - --md-green-A400: #00E676; - --md-green-A700: #00C853; - - --md-light-green-50: #F1F8E9; - --md-light-green-100: #DCEDC8; - --md-light-green-200: #C5E1A5; - --md-light-green-300: #AED581; - --md-light-green-400: #9CCC65; - --md-light-green-500: #8BC34A; - --md-light-green-600: #7CB342; - --md-light-green-700: #689F38; - --md-light-green-800: #558B2F; - --md-light-green-900: #33691E; - --md-light-green-A100: #CCFF90; - --md-light-green-A200: #B2FF59; - --md-light-green-A400: #76FF03; - --md-light-green-A700: #64DD17; - - --md-lime-50: #F9FBE7; - --md-lime-100: #F0F4C3; - --md-lime-200: #E6EE9C; - --md-lime-300: #DCE775; - --md-lime-400: #D4E157; - --md-lime-500: #CDDC39; - --md-lime-600: #C0CA33; - --md-lime-700: #AFB42B; - --md-lime-800: #9E9D24; - --md-lime-900: #827717; - --md-lime-A100: #F4FF81; - --md-lime-A200: #EEFF41; - --md-lime-A400: #C6FF00; - --md-lime-A700: #AEEA00; - - --md-yellow-50: #FFFDE7; - --md-yellow-100: #FFF9C4; - --md-yellow-200: #FFF59D; - --md-yellow-300: #FFF176; - --md-yellow-400: #FFEE58; - --md-yellow-500: #FFEB3B; - --md-yellow-600: #FDD835; - --md-yellow-700: #FBC02D; - --md-yellow-800: #F9A825; - --md-yellow-900: #F57F17; - --md-yellow-A100: #FFFF8D; - --md-yellow-A200: #FFFF00; - --md-yellow-A400: #FFEA00; - --md-yellow-A700: #FFD600; - - --md-amber-50: #FFF8E1; - --md-amber-100: #FFECB3; - --md-amber-200: #FFE082; - --md-amber-300: #FFD54F; - --md-amber-400: #FFCA28; - --md-amber-500: #FFC107; - --md-amber-600: #FFB300; - --md-amber-700: #FFA000; - --md-amber-800: #FF8F00; - --md-amber-900: #FF6F00; - --md-amber-A100: #FFE57F; - --md-amber-A200: #FFD740; - --md-amber-A400: #FFC400; - --md-amber-A700: #FFAB00; - - --md-orange-50: #FFF3E0; - --md-orange-100: #FFE0B2; - --md-orange-200: #FFCC80; - --md-orange-300: #FFB74D; - --md-orange-400: #FFA726; - --md-orange-500: #FF9800; - --md-orange-600: #FB8C00; - --md-orange-700: #F57C00; - --md-orange-800: #EF6C00; - --md-orange-900: #E65100; - --md-orange-A100: #FFD180; - --md-orange-A200: #FFAB40; - --md-orange-A400: #FF9100; - --md-orange-A700: #FF6D00; - - --md-deep-orange-50: #FBE9E7; - --md-deep-orange-100: #FFCCBC; - --md-deep-orange-200: #FFAB91; - --md-deep-orange-300: #FF8A65; - --md-deep-orange-400: #FF7043; - --md-deep-orange-500: #FF5722; - --md-deep-orange-600: #F4511E; - --md-deep-orange-700: #E64A19; - --md-deep-orange-800: #D84315; - --md-deep-orange-900: #BF360C; - --md-deep-orange-A100: #FF9E80; - --md-deep-orange-A200: #FF6E40; - --md-deep-orange-A400: #FF3D00; - --md-deep-orange-A700: #DD2C00; - - --md-brown-50: #EFEBE9; - --md-brown-100: #D7CCC8; - --md-brown-200: #BCAAA4; - --md-brown-300: #A1887F; - --md-brown-400: #8D6E63; - --md-brown-500: #795548; - --md-brown-600: #6D4C41; - --md-brown-700: #5D4037; - --md-brown-800: #4E342E; - --md-brown-900: #3E2723; - - --md-grey-50: #FAFAFA; - --md-grey-100: #F5F5F5; - --md-grey-200: #EEEEEE; - --md-grey-300: #E0E0E0; - --md-grey-400: #BDBDBD; - --md-grey-500: #9E9E9E; - --md-grey-600: #757575; - --md-grey-700: #616161; - --md-grey-800: #424242; - --md-grey-900: #212121; - - --md-blue-grey-50: #ECEFF1; - --md-blue-grey-100: #CFD8DC; - --md-blue-grey-200: #B0BEC5; - --md-blue-grey-300: #90A4AE; - --md-blue-grey-400: #78909C; - --md-blue-grey-500: #607D8B; - --md-blue-grey-600: #546E7A; - --md-blue-grey-700: #455A64; - --md-blue-grey-800: #37474F; - --md-blue-grey-900: #263238; -} \ No newline at end of file diff --git a/ui-tests/tests/voila.test.ts-snapshots/reveal-linux.png b/ui-tests/tests/voila.test.ts-snapshots/reveal-linux.png index 60c1c12883ca491198ee1d70985342fc48ca3b41..ea9596e94ed46c0363de1fe1b61668d82c89013b 100644 GIT binary patch literal 12587 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 yiFm9bDZ;LdtCdr8_y~5 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 Z7V^i&97XE|of>qElX|ByxMTJ={{x}hfu{ff