├── .binder ├── apt.txt ├── user-settings │ └── @jupyterlab │ │ ├── apputils-extension │ │ └── themes.jupyterlab-settings │ │ └── terminal-extension │ │ └── plugin.jupyterlab-settings ├── jupyterlab-videochat │ └── branding.json ├── postBuild └── environment.yml ├── .prettierignore ├── lerna.json ├── .yarnrc ├── packages ├── brand │ ├── tsconfig.json │ ├── src │ │ ├── index.ts │ │ ├── typings.d.ts │ │ ├── tokens.ts │ │ └── util.ts │ ├── package.json │ └── style │ │ ├── img │ │ ├── wordmark.svg │ │ └── chevrons.svg │ │ ├── brand.css │ │ ├── presentation.css │ │ ├── fonts.css │ │ ├── variables.css │ │ └── index.css ├── dark │ ├── src │ │ ├── index.ts │ │ ├── tokens.ts │ │ ├── typings.d.ts │ │ └── plugin.ts │ ├── style │ │ ├── index.js │ │ ├── index.css │ │ └── variables.css │ ├── tsconfig.json │ └── package.json ├── light │ ├── src │ │ ├── index.ts │ │ ├── tokens.ts │ │ ├── typings.d.ts │ │ └── plugin.ts │ ├── style │ │ ├── index.js │ │ ├── index.css │ │ └── variables.css │ ├── tsconfig.json │ └── package.json └── _meta │ ├── src │ ├── index.ts │ └── typings.d.ts │ ├── tsconfig.json │ └── package.json ├── install.json ├── .github ├── pip-build.txt ├── .condarc └── workflows │ └── ci.yml ├── .gitignore ├── MANIFEST.in ├── py_src └── jupyterlab_gt_coar_theme │ ├── _version.py │ └── __init__.py ├── tsconfigbase.json ├── CONTRIBUTING.md ├── setup.cfg ├── LICENSE.txt ├── package.json ├── setup.py ├── CHANGELOG.md ├── README.md └── dodo.py /.binder/apt.txt: -------------------------------------------------------------------------------- 1 | firefox 2 | libgl1-mesa-glx -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | **/node_modules 3 | **/lib 4 | labextensions/ 5 | -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "lerna": "4.0.0", 3 | "npmClient": "jlpm", 4 | "useWorkspaces": true, 5 | "version": "independent" 6 | } 7 | -------------------------------------------------------------------------------- /.binder/user-settings/@jupyterlab/apputils-extension/themes.jupyterlab-settings: -------------------------------------------------------------------------------- 1 | { 2 | "theme": "GT COAR (Light)", 3 | "theme-scrollbars": true 4 | } 5 | -------------------------------------------------------------------------------- /.yarnrc: -------------------------------------------------------------------------------- 1 | yarn-offline-mirror "./.yarn-packages" 2 | yarn-offline-mirror-pruning true 3 | ignore-optional true 4 | network-timeout "300000" 5 | disable-self-update-check true 6 | -------------------------------------------------------------------------------- /.binder/user-settings/@jupyterlab/terminal-extension/plugin.jupyterlab-settings: -------------------------------------------------------------------------------- 1 | { 2 | "fontFamily": "\"Roboto Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace", 3 | "fontSize": 14 4 | } 5 | -------------------------------------------------------------------------------- /packages/brand/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfigbase", 3 | "compilerOptions": { 4 | "outDir": "./lib", 5 | "rootDir": "./src" 6 | }, 7 | "include": ["./src/**/*", "./src/typings.d.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /packages/dark/src/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | export * from './tokens'; 6 | -------------------------------------------------------------------------------- /packages/dark/style/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | 6 | import './index.css'; 7 | -------------------------------------------------------------------------------- /packages/light/src/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | export * from './tokens'; 6 | -------------------------------------------------------------------------------- /packages/light/style/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | 6 | import './index.css'; 7 | -------------------------------------------------------------------------------- /install.json: -------------------------------------------------------------------------------- 1 | { 2 | "packageManager": "python", 3 | "packageName": "jupyterlab-gt-coar-theme", 4 | "uninstallInstructions": "Use your Python package manager (pip, conda, etc.) to uninstall the package jupyterlab-gt-coar-theme" 5 | } 6 | -------------------------------------------------------------------------------- /packages/brand/src/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | export * from './tokens'; 6 | export * from './util'; 7 | -------------------------------------------------------------------------------- /packages/dark/src/tokens.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | export const NS = '@gt-coar/jupyterlab-theme-dark'; 6 | -------------------------------------------------------------------------------- /packages/light/src/tokens.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | export const NS = '@gt-coar/jupyterlab-theme-light'; 6 | -------------------------------------------------------------------------------- /packages/dark/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfigbase", 3 | "compilerOptions": { 4 | "outDir": "./lib", 5 | "rootDir": "./src" 6 | }, 7 | "include": ["./**/*"], 8 | "references": [ 9 | { 10 | "path": "../brand" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /packages/light/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfigbase", 3 | "compilerOptions": { 4 | "outDir": "./lib", 5 | "rootDir": "./src" 6 | }, 7 | "include": ["./src/**/*"], 8 | "references": [ 9 | { 10 | "path": "../brand" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /.github/pip-build.txt: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 2 | # Distributed under the terms of the BSD-3-Clause License. 3 | 4 | jupyterlab ==3.* 5 | doit 6 | twine 7 | pip 8 | black 9 | isort 10 | flake8 11 | pyflakes 12 | wheel 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/ 2 | .doit* 3 | .ipynb_checkpoints/ 4 | .venv/ 5 | .yarn-packages/ 6 | *.egg-info 7 | **/node_modules/ 8 | build/ 9 | dist/ 10 | labextensions/ 11 | lib/ 12 | node_modules/ 13 | untitled* 14 | Untitled* 15 | .mypy_cache/ 16 | .virtual_documents 17 | .vscode 18 | *.tsbuildinfo -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE.txt 2 | recursive-include py_src/jupyterlab_gt_coar_theme/labextension *.* 3 | 4 | exclude src lib package.json 5 | 6 | global-exclude *~ 7 | global-exclude *.pyc 8 | global-exclude *.pyo 9 | global-exclude .git 10 | global-exclude .ipynb_checkpoints/* 11 | global-exclude build_log.json 12 | -------------------------------------------------------------------------------- /packages/_meta/src/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | import '@gt-coar/jupyterlab-theme-brand'; 6 | import '@gt-coar/jupyterlab-theme-dark'; 7 | import '@gt-coar/jupyterlab-theme-light'; 8 | -------------------------------------------------------------------------------- /packages/_meta/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfigbase", 3 | "compilerOptions": { 4 | "outDir": "./lib", 5 | "rootDir": "./src" 6 | }, 7 | "include": ["./**/*"], 8 | "references": [ 9 | { 10 | "path": "../light" 11 | }, 12 | { 13 | "path": "../dark" 14 | }, 15 | { 16 | "path": "../brand" 17 | } 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /.binder/jupyterlab-videochat/branding.json: -------------------------------------------------------------------------------- 1 | { 2 | "backgroundColor": "#003057", 3 | "backgroundImageUrl": "https://raw.githubusercontent.com/gt-coar/jupyterlab-gt-coar-theme/master/style/img/wordmark.svg", 4 | "logoClickUrl": "https://github.com/gt-coar/jupyterlab-gt-coar-theme", 5 | "logoImageUrl": "https://raw.githubusercontent.com/gt-coar/jupyterlab-gt-coar-theme/master/style/img/wordmark.svg" 6 | } 7 | -------------------------------------------------------------------------------- /packages/_meta/src/typings.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | 6 | declare module '*.svg' { 7 | const value: string; 8 | export default value; 9 | } 10 | 11 | declare module '!!file-loader*' { 12 | const value: string; 13 | export default value; 14 | } 15 | -------------------------------------------------------------------------------- /packages/brand/src/typings.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | 6 | declare module '*.svg' { 7 | const value: string; 8 | export default value; 9 | } 10 | 11 | declare module '!!file-loader*' { 12 | const value: string; 13 | export default value; 14 | } 15 | -------------------------------------------------------------------------------- /packages/dark/src/typings.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | 6 | declare module '*.svg' { 7 | const value: string; 8 | export default value; 9 | } 10 | 11 | declare module '!!file-loader*' { 12 | const value: string; 13 | export default value; 14 | } 15 | -------------------------------------------------------------------------------- /packages/light/src/typings.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | 6 | declare module '*.svg' { 7 | const value: string; 8 | export default value; 9 | } 10 | 11 | declare module '!!file-loader*' { 12 | const value: string; 13 | export default value; 14 | } 15 | -------------------------------------------------------------------------------- /packages/dark/src/plugin.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | import { makeTheme } from '@gt-coar/jupyterlab-theme-brand'; 6 | 7 | import { NS } from './tokens'; 8 | 9 | const plugin = makeTheme({ ns: NS, variant: 'Dark', isLight: false }); 10 | 11 | export default [plugin]; 12 | -------------------------------------------------------------------------------- /packages/light/src/plugin.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | import { makeTheme } from '@gt-coar/jupyterlab-theme-brand'; 6 | 7 | import { NS } from './tokens'; 8 | 9 | const plugin = makeTheme({ ns: NS, variant: 'Light', isLight: false }); 10 | 11 | export default [plugin]; 12 | -------------------------------------------------------------------------------- /py_src/jupyterlab_gt_coar_theme/_version.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 2 | # Distributed under the terms of the BSD-3-Clause License. 3 | 4 | import json 5 | from pathlib import Path 6 | 7 | __js__ = [ 8 | json.loads(pkg_json.read_text(encoding="utf-8")) 9 | for pkg_json in sorted(Path(__file__).parent.glob("labextensions/*/package.json")) 10 | ] 11 | 12 | # have to pick one 13 | __version__ = __js__[0]["version"] 14 | -------------------------------------------------------------------------------- /py_src/jupyterlab_gt_coar_theme/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 2 | # Distributed under the terms of the BSD-3-Clause License. 3 | 4 | from ._version import __js__, __version__ 5 | 6 | 7 | def _jupyter_labextension_paths(): 8 | return [ 9 | {"src": f"""labextensions/{pkg["name"].split("-")[-1]}""", "dest": pkg["name"]} 10 | for pkg in __js__ 11 | ] 12 | 13 | 14 | __all__ = ["__version__", "__js__"] 15 | -------------------------------------------------------------------------------- /.github/.condarc: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 2 | # Distributed under the terms of the BSD-3-Clause License. 3 | 4 | local_repodata_ttl: 3600 5 | repodata_fns: [repodata.json] 6 | remote_connect_timeout_secs: 60 7 | remote_read_timeout_secs: 120 8 | remote_max_retries: 5 9 | remote_backoff_factor: 2 10 | show_channel_urls: true 11 | use_index_cache: true 12 | use_only_tar_bz2: true 13 | unsatisfiable_hints_check_depth: 0 14 | unsatisfiable_hints: false 15 | -------------------------------------------------------------------------------- /tsconfigbase.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowSyntheticDefaultImports": true, 4 | "composite": true, 5 | "declaration": true, 6 | "esModuleInterop": true, 7 | "incremental": true, 8 | "jsx": "react", 9 | "module": "esnext", 10 | "moduleResolution": "node", 11 | "noEmitOnError": true, 12 | "noImplicitAny": true, 13 | "noUnusedLocals": true, 14 | "preserveWatchOutput": true, 15 | "resolveJsonModule": true, 16 | "strict": true, 17 | "strictNullChecks": false, 18 | "target": "es2017", 19 | "types": [] 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /packages/brand/src/tokens.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | 6 | import WORDMARK_SVG from '../style/img/wordmark.svg'; 7 | import WORDMARK_URL from '!!file-loader?name=[path][name].[ext]&context=.!../style/img/wordmark.svg'; 8 | import CHEVRONS_URL from '!!file-loader?name=[path][name].[ext]&context=.!../style/img/chevrons.svg'; 9 | 10 | export const NS = '@gt-coar/jupyterlab-theme-brand'; 11 | export const NAME = 'GT COAR'; 12 | 13 | export const WORDMARK_ICON_ID = `${NS}:wordmark`; 14 | 15 | export { WORDMARK_URL, CHEVRONS_URL, WORDMARK_SVG }; 16 | 17 | export interface IThemeOptions { 18 | /** the package namespace */ 19 | ns: string; 20 | /** the variant name */ 21 | variant: string; 22 | /** whether the value is light-ish */ 23 | isLight: boolean; 24 | } 25 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to jupyterlab-gt-coar-theme 2 | 3 | ## Get an environment 4 | 5 | - get [Mambaforge](https://github.com/conda-forge/miniforge/releases) 6 | 7 | ```bash 8 | CONDARC=.github/.condarc mamba env update --file .binder/environment.yml 9 | ``` 10 | 11 | > you _can_ use `conda` for this, but it's slower and untested 12 | 13 | Activate your environment: 14 | 15 | ```bash 16 | conda activate jupyterlab-gt-coar-theme 17 | ``` 18 | 19 | ## Use `doit` 20 | 21 | [doit](https://pydoit.org) is used to manage everything _inside_ your environment. 22 | 23 | ``` 24 | doit list --all --status 25 | ``` 26 | 27 | ## Make a PR 28 | 29 | Issues (and PRs) welcome, and will be reviewed to the best of the maintainers' 30 | abilities/availability. Please ensure you've run `doit lint` before pushing! 31 | 32 | --- 33 | 34 | > Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme 35 | > contributors 36 | > 37 | > Distributed under the terms of the BSD-3-Clause License. 38 | -------------------------------------------------------------------------------- /.binder/postBuild: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 4 | # Distributed under the terms of the BSD-3-Clause License. 5 | set -eux 6 | 7 | doit 8 | 9 | mkdir -p ~/.jupyter/lab/ 10 | cp -r .binder/user-settings ~/.jupyter/lab/ 11 | 12 | jupyter labextension uninstall --no-build jupyter-offlinenotebook || echo "ok" 13 | jupyter labextension list 14 | 15 | mkdir examples 16 | 17 | git clone https://github.com/jupyrdf/ipyelk 18 | pushd ipyelk 19 | git checkout v1.0.0 20 | cp -r examples ../examples/ipyelk 21 | popd 22 | 23 | git clone https://github.com/bqplot/bqplot 24 | pushd bqplot 25 | git checkout 0.12.29 26 | cp -r examples ../examples/bqplot 27 | popd 28 | 29 | git clone https://github.com/deathbeds/wxyz 30 | pushd wxyz 31 | git checkout v0.5.1 32 | cp -r src/wxyz_notebooks/src/wxyz/notebooks ../examples/wxyz 33 | popd 34 | 35 | git clone https://github.com/robots-from-jupyter/robotkernel 36 | pushd robotkernel 37 | git checkout 1.5.0 38 | cp -r examples ../examples/robotkernel 39 | popd -------------------------------------------------------------------------------- /packages/_meta/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "@gt-coar/jupyterlab-theme-meta", 4 | "version": "0.3.0", 5 | "description": "[meta] an unofficial Georgia Tech theme for JupyterLab", 6 | "license": "BSD-3-Clause", 7 | "author": "jupyterlab-gt-coar-theme contributors ", 8 | "homepage": "https://github.com/gt-coar/jupyterlab-gt-coar-theme", 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/gt-coar/jupyterlab-gt-coar-theme" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/gt-coar/jupyterlab-gt-coar-theme/issues" 15 | }, 16 | "main": "lib/index.js", 17 | "files": [ 18 | "{lib,style,src}/**/*.{.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf,css}" 19 | ], 20 | "scripts": { 21 | "build:lib": "tsc -b", 22 | "watch:lib": "tsc -b -w --preserveWatchOutput" 23 | }, 24 | "types": "lib/index.d.ts", 25 | "dependencies": { 26 | "@gt-coar/jupyterlab-theme-brand": "file:../brand", 27 | "@gt-coar/jupyterlab-theme-dark": "file:../dark", 28 | "@gt-coar/jupyterlab-theme-light": "file:../light" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /packages/brand/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@gt-coar/jupyterlab-theme-brand", 3 | "version": "0.3.0", 4 | "description": "branding assets for an unofficial Georgia Tech theme for JupyterLab", 5 | "license": "BSD-3-Clause", 6 | "author": "jupyterlab-gt-coar-theme contributors ", 7 | "homepage": "https://github.com/gt-coar/jupyterlab-gt-coar-theme", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/gt-coar/jupyterlab-gt-coar-theme" 11 | }, 12 | "bugs": { 13 | "url": "https://github.com/gt-coar/jupyterlab-gt-coar-theme/issues" 14 | }, 15 | "main": "lib/index.js", 16 | "files": [ 17 | "{lib,style,src}/**/*.{.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf,css}" 18 | ], 19 | "types": "lib/index.d.ts", 20 | "dependencies": { 21 | "@fontsource/roboto": "~4.1.0", 22 | "@fontsource/roboto-mono": "^4.1.1", 23 | "@fontsource/roboto-slab": "~4.1.1", 24 | "@jupyterlab/application": "3" 25 | }, 26 | "devDependencies": { 27 | "base64-inline-loader": "^1.1.1" 28 | }, 29 | "keywords": [ 30 | "georgia-tech", 31 | "jupyter", 32 | "jupyterlab", 33 | "jupyterlab-extension" 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /.binder/environment.yml: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 2 | # Distributed under the terms of the BSD-3-Clause License. 3 | 4 | name: jupyterlab-gt-coar-theme 5 | 6 | channels: 7 | - https://conda.anaconda.org/conda-forge 8 | 9 | dependencies: 10 | - jupyterlab >=3.0.7 11 | - nodejs >=14,<15 12 | - python >=3.9,<3.10 13 | - doit 14 | # qa 15 | - twine 16 | - pip 17 | - black 18 | - isort 19 | - flake8 20 | - pyflakes 21 | - wheel 22 | # binder biz 23 | - nbgitpuller 24 | # demo/integration testing 25 | - bqplot 26 | - firefox 27 | - geckodriver 28 | - importnb 29 | - ipydrawio 30 | - ipyelk 31 | - ipywidgets 32 | - jupyter-videochat 33 | - jupyterlab_robotmode 34 | - jupyterlab-lsp 35 | - jupyterlab-tour 36 | - pandas 37 | - python-lsp-server 38 | - retrolab 39 | - robotframework >=4 40 | - robotframework-lsp 41 | - robotframework-seleniumlibrary 42 | - robotkernel >=1.5 43 | - wxyz_datagrid 44 | - wxyz_dvcs 45 | - wxyz_json_e 46 | - wxyz_json_schema_form 47 | - wxyz_jsonld 48 | - wxyz_lab 49 | - wxyz_svg 50 | - wxyz_tpl_jinja 51 | - wxyz_yaml 52 | - xeus-python 53 | -------------------------------------------------------------------------------- /packages/brand/style/img/wordmark.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 2 | # Distributed under the terms of the BSD-3-Clause License. 3 | 4 | [metadata] 5 | long_description = file: ./README.md 6 | long_description_content_type = text/markdown 7 | license_file = LICENSE.txt 8 | classifiers = 9 | Intended Audience :: Developers 10 | Intended Audience :: Science/Research 11 | License :: OSI Approved :: BSD License 12 | Programming Language :: Python 13 | Programming Language :: Python :: 3 14 | Programming Language :: Python :: 3.6 15 | Programming Language :: Python :: 3.7 16 | Programming Language :: Python :: 3.8 17 | Programming Language :: Python :: 3.9 18 | Framework :: Jupyter 19 | 20 | [options] 21 | python_requires = >=3.6 22 | package_dir = 23 | = py_src 24 | 25 | packages = find: 26 | include_package_data = True 27 | zip_safe = False 28 | 29 | install_requires = 30 | jupyterlab >=3,<4 31 | 32 | [options.packages.find] 33 | where = 34 | py_src 35 | 36 | [options.extras_require] 37 | lint = 38 | black 39 | flake8 40 | isort 41 | pyflakes 42 | dev = 43 | %(lint)s 44 | wheel 45 | twine 46 | doit 47 | 48 | [flake8] 49 | exclude = .git,.ipynb_checkpoints 50 | extend-ignore = E203,W503 51 | max-line-length = 88 52 | 53 | [isort] 54 | profile = black 55 | multi_line_output = 3 56 | known_first_party = jupyterlab_gt_coar_theme 57 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 2 | 3 | Redistribution and use in source and binary forms, with or without 4 | modification, are permitted provided that the following conditions are met: 5 | 6 | 1. Redistributions of source code must retain the above copyright notice, this 7 | list of conditions and the following disclaimer. 8 | 9 | 2. Redistributions in binary form must reproduce the above copyright notice, 10 | this list of conditions and the following disclaimer in the documentation 11 | and/or other materials provided with the distribution. 12 | 13 | 3. Neither the name of the copyright holder nor the names of its contributors 14 | may be used to endorse or promote products derived from this software 15 | without specific prior written permission. 16 | 17 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 18 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 21 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 23 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 24 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 25 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 | -------------------------------------------------------------------------------- /packages/brand/style/img/chevrons.svg: -------------------------------------------------------------------------------- 1 | 2 | 13 | 15 | 17 | 18 | 20 | image/svg+xml 21 | 23 | 24 | 25 | 26 | 27 | 30 | 33 | 37 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "@gt-coar/jupyterlab-theme-root", 4 | "version": "0.0.0", 5 | "description": "an unofficial Georgia Tech theme for JupyterLab", 6 | "license": "BSD-3-Clause", 7 | "author": "jupyterlab-gt-coar-theme contributors ", 8 | "homepage": "https://github.com/gt-coar/jupyterlab-gt-coar-theme", 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/gt-coar/jupyterlab-gt-coar-theme" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/gt-coar/jupyterlab-gt-coar-theme/issues" 15 | }, 16 | "scripts": { 17 | "bootstrap": "jlpm --prefer-offline --ignore-optional --ignore-scripts && jlpm clean && jlpm lint && jlpm build", 18 | "build": "jlpm build:lib && jlpm build:ext", 19 | "build:ext": "lerna run build:ext", 20 | "build:lib": "lerna run build:lib", 21 | "clean": "rimraf \"./packages/*/lib\" \"packages/*/*.tsbuildinfo\" ./py_src/jupyterlab_gt_coar_theme/labextensions", 22 | "lint": "jlpm lint:prettier:package-json && jlpm lint:prettier", 23 | "lint:prettier": "prettier --list-different --write \"*.{json,yml,md}\" \"{.binder,.github,py_src}/**/*.{json,md,yml}\" \"./packages/**/*.{ts,tsx,js,jsx,css,json,md,yml}\"", 24 | "lint:prettier:package-json": "prettier-package-json --write ./package.json \"packages/*/package.json\"", 25 | "watch:ext": "lerna run watch:ext --stream --parallel", 26 | "watch:lib": "lerna run watch:lib --stream" 27 | }, 28 | "workspaces": [ 29 | "packages/*" 30 | ], 31 | "devDependencies": { 32 | "lerna": "^4.0.0", 33 | "prettier": "^2.3.2", 34 | "prettier-package-json": "^2.6.0", 35 | "react": "^17.0.1", 36 | "rimraf": "^3.0.2", 37 | "typescript": "~4.3.4" 38 | }, 39 | "prettier": { 40 | "singleQuote": true, 41 | "proseWrap": "always", 42 | "printWidth": 88 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /packages/light/style/index.css: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | @import '~@gt-coar/jupyterlab-theme-brand/style/index.css'; 6 | @import './variables.css'; 7 | 8 | /* tabs */ 9 | .lm-DockPanel-tabBar .lm-TabBar-tab.lm-mod-current { 10 | background-color: var(--jp-layout-color0); 11 | } 12 | 13 | .lm-DockPanel-tabBar .lm-TabBar-tab.lm-mod-current.jp-mod-active { 14 | font-weight: 700; 15 | } 16 | 17 | /* buttons */ 18 | button.jp-mod-styled.jp-mod-accept { 19 | background-color: var(--gt-blue-80); 20 | color: var(--gt-gold-buzz-60); 21 | } 22 | 23 | button.jp-mod-styled.jp-mod-accept:hover, 24 | button.jp-mod-styled.jp-mod-accept:active { 25 | background-color: var(--gt-blue-link-hover); 26 | color: var(--gt-white); 27 | } 28 | 29 | /* menu */ 30 | #jp-top-panel, 31 | #jp-menu-panel, 32 | #menu-panel-wrapper, 33 | #menu-panel, 34 | #top-panel-wrapper, 35 | .lm-MenuBar { 36 | background-color: var(--gt-tertiary-atlanta-fog); 37 | } 38 | 39 | #jp-title-panel-title h1, 40 | #top-panel-wrapper h1 { 41 | color: var(--gt-gold-buzz); 42 | } 43 | 44 | .lm-MenuBar-item.lm-mod-active { 45 | background-color: var(--gt-blue-link-hover); 46 | color: var(--gt-superlight-grey); 47 | } 48 | 49 | .lm-MenuBar { 50 | color: var(--gt-superlight-grey); 51 | } 52 | 53 | .lm-MenuBar.lm-mod-active .lm-MenuBar-item.lm-mod-active { 54 | background-color: var(--gt-blue-link-hover); 55 | color: var(--gt-superlight-grey); 56 | border-color: transparent; 57 | } 58 | 59 | /* simple */ 60 | 61 | .jp-LabShell[data-shell-mode='single-document'] 62 | .lm-MenuBar.lm-mod-active 63 | .lm-MenuBar-item.lm-mod-active { 64 | border-top: var(--jp-border-width) solid var(--gt-gold-buzz); 65 | } 66 | 67 | /* retro */ 68 | .jp-RetroCheckpoint { 69 | color: var(--jp-layout-color1); 70 | } 71 | 72 | #top-panel-wrapper { 73 | border: 0; 74 | } 75 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 2 | # Distributed under the terms of the BSD-3-Clause License. 3 | 4 | import re 5 | from pathlib import Path 6 | import json 7 | 8 | import setuptools 9 | 10 | HERE = Path(__file__).parent 11 | MOD = "jupyterlab_gt_coar_theme" 12 | VARIANTS = ["dark", "light"] 13 | EXTS = [ 14 | HERE / "py_src" / MOD / f"labextensions/{v}" 15 | for v in VARIANTS 16 | ] 17 | PKG_JSONS = [ 18 | ext / "package.json" 19 | for ext in EXTS 20 | ] 21 | PKGS = [ 22 | json.loads(pkg_json.read_text(encoding="utf-8")) 23 | for pkg_json in PKG_JSONS 24 | ] 25 | 26 | SHARE = f"""share/jupyter/labextensions""" 27 | EXT_FILES = { 28 | f"""{SHARE}/{pkg["name"]}""": ["install.json"] 29 | for pkg in PKGS 30 | } 31 | 32 | for ext, pkg in zip(EXTS, PKGS): 33 | for ext_path in [ext] + [d for d in ext.rglob("*") if d.is_dir()]: 34 | target = f"""{SHARE}/{pkg["name"]}""" 35 | if ext_path != ext: 36 | target = f"""{target}/{ext_path.relative_to(ext)}""" 37 | EXT_FILES[target] = [ 38 | str(p.relative_to(HERE).as_posix()) 39 | for p in ext_path.glob("*") 40 | if not p.is_dir() 41 | ] 42 | 43 | DATA_FILES = sorted([(k, v) for k, v in EXT_FILES.items()]) 44 | 45 | SETUP_ARGS = dict( 46 | name=PKGS[0]["jupyterlab"]["discovery"]["server"]["base"]["name"], 47 | description=PKGS[0]["description"], 48 | version=PKGS[0]["version"], 49 | url=PKGS[0]["homepage"], 50 | license=PKGS[0]["license"], 51 | data_files=DATA_FILES, 52 | project_urls={ 53 | "Bug Tracker": PKGS[0]["bugs"]["url"], 54 | "Source Code": PKGS[0]["repository"]["url"] 55 | }, 56 | author=re.findall(r'^[^<]+', PKGS[0]["author"])[0].strip(), 57 | author_email=re.findall(r'<(.*)>$', PKGS[0]["author"])[0].strip() 58 | ) 59 | 60 | 61 | if __name__ == "__main__": 62 | setuptools.setup(**SETUP_ARGS) 63 | -------------------------------------------------------------------------------- /packages/dark/style/index.css: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | 6 | @import '~@gt-coar/jupyterlab-theme-brand/style/index.css'; 7 | @import './variables.css'; 8 | 9 | body { 10 | background-color: var(--jp-layout-color0); 11 | } 12 | 13 | /* tabs */ 14 | 15 | .lm-DockPanel-tabBar .lm-TabBar-tab.lm-mod-current { 16 | background-color: var(--jp-layout-color0); 17 | } 18 | 19 | .lm-DockPanel-tabBar .lm-TabBar-tab.lm-mod-current.jp-mod-active { 20 | font-weight: 700; 21 | } 22 | 23 | /* buttons */ 24 | 25 | button.jp-mod-styled.jp-mod-accept { 26 | background-color: var(--jp-brand-color1); 27 | color: var(--gt-blue-80); 28 | } 29 | 30 | button.jp-mod-styled.jp-mod-accept:hover, 31 | button.jp-mod-styled.jp-mod-accept:active { 32 | background-color: var(--jp-brand-color1); 33 | color: var(--jp-layout-color0); 34 | } 35 | 36 | /* menu */ 37 | #jp-title-panel-title h1 { 38 | color: var(--jp-brand-color1); 39 | } 40 | 41 | .lm-MenuBar-item.lm-mod-active { 42 | background-color: var(--jp-brand-color1); 43 | color: var(--jp-layout-color0); 44 | } 45 | 46 | .lm-MenuBar.lm-mod-active .lm-MenuBar-item.lm-mod-active { 47 | background-color: var(--jp-brand-color1); 48 | color: var(--jp-layout-color0); 49 | border-color: transparent; 50 | } 51 | 52 | .lm-TabBar-tab.p-TabBar-tab { 53 | border: 0; 54 | } 55 | 56 | /* notebook */ 57 | 58 | .jp-Notebook.jp-mod-editMode .jp-Cell.jp-mod-active .jp-InputArea-editor, 59 | .jp-InputArea-editor { 60 | border: 0; 61 | } 62 | 63 | /* completer */ 64 | 65 | .jp-Completer-item.jp-mod-active { 66 | color: var(--jp-layout-color0); 67 | font-weight: 700; 68 | } 69 | 70 | /* retro */ 71 | #top-panel-wrapper h1 { 72 | color: var(--gt-gold-buzz); 73 | } 74 | 75 | /* ipyelk */ 76 | :root { 77 | --jp-elk-edge-stroke: var(--gt-md-grey); 78 | --jp-elk-node-stroke: var(--gt-mddk-grey); 79 | --jp-elk-port-stroke: var(--gt-mddk-grey); 80 | } 81 | -------------------------------------------------------------------------------- /packages/dark/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@gt-coar/jupyterlab-theme-dark", 3 | "version": "0.3.0", 4 | "description": "an unofficial Georgia Tech theme for JupyterLab", 5 | "license": "BSD-3-Clause", 6 | "author": "jupyterlab-gt-coar-theme contributors ", 7 | "homepage": "https://github.com/gt-coar/jupyterlab-gt-coar-theme", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/gt-coar/jupyterlab-gt-coar-theme" 11 | }, 12 | "bugs": { 13 | "url": "https://github.com/gt-coar/jupyterlab-gt-coar-theme/issues" 14 | }, 15 | "main": "lib/index.js", 16 | "files": [ 17 | "{lib,style,src}/**/*.{.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf,css}" 18 | ], 19 | "scripts": { 20 | "build:ext": "jupyter labextension build --debug .", 21 | "watch:ext": "jupyter labextension watch --debug ." 22 | }, 23 | "sideEffects": [ 24 | "style/*.css" 25 | ], 26 | "types": "lib/index.d.ts", 27 | "dependencies": { 28 | "@gt-coar/jupyterlab-theme-brand": "^0.3.0" 29 | }, 30 | "devDependencies": { 31 | "@jupyterlab/builder": "^3.0.2", 32 | "base64-inline-loader": "^1.1.1" 33 | }, 34 | "keywords": [ 35 | "georgia-tech", 36 | "jupyter", 37 | "jupyterlab", 38 | "jupyterlab-extension" 39 | ], 40 | "jupyterlab": { 41 | "themePath": "style/index.css", 42 | "extension": "lib/plugin.js", 43 | "discovery": { 44 | "server": { 45 | "base": { 46 | "name": "jupyterlab-gt-coar-theme" 47 | }, 48 | "managers": [ 49 | "pip", 50 | "conda" 51 | ] 52 | } 53 | }, 54 | "sharedPackages": { 55 | "@gt-coar/jupyterlab-theme-brand": { 56 | "bundled": true, 57 | "singleton": true 58 | }, 59 | "@fontsource/roboto": { 60 | "bundled": false, 61 | "singleton": true 62 | }, 63 | "@fontsource/roboto-mono": { 64 | "bundled": false, 65 | "singleton": true 66 | }, 67 | "@fontsource/roboto-slab": { 68 | "bundled": false, 69 | "singleton": true 70 | } 71 | }, 72 | "outputDir": "../../py_src/jupyterlab_gt_coar_theme/labextensions/dark" 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /packages/light/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@gt-coar/jupyterlab-theme-light", 3 | "version": "0.3.0", 4 | "description": "an unofficial Georgia Tech theme for JupyterLab", 5 | "license": "BSD-3-Clause", 6 | "author": "jupyterlab-gt-coar-theme contributors ", 7 | "homepage": "https://github.com/gt-coar/jupyterlab-gt-coar-theme", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/gt-coar/jupyterlab-gt-coar-theme" 11 | }, 12 | "bugs": { 13 | "url": "https://github.com/gt-coar/jupyterlab-gt-coar-theme/issues" 14 | }, 15 | "main": "lib/index.js", 16 | "files": [ 17 | "{lib,style,src}/**/*.{.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf,css}" 18 | ], 19 | "scripts": { 20 | "build:ext": "jupyter labextension build --debug .", 21 | "watch:ext": "jupyter labextension watch --debug ." 22 | }, 23 | "sideEffects": [ 24 | "style/*.css" 25 | ], 26 | "types": "lib/index.d.ts", 27 | "dependencies": { 28 | "@gt-coar/jupyterlab-theme-brand": "^0.3.0" 29 | }, 30 | "devDependencies": { 31 | "@jupyterlab/builder": "^3.0.2", 32 | "base64-inline-loader": "^1.1.1" 33 | }, 34 | "keywords": [ 35 | "georgia-tech", 36 | "jupyter", 37 | "jupyterlab", 38 | "jupyterlab-extension" 39 | ], 40 | "jupyterlab": { 41 | "themePath": "style/index.css", 42 | "extension": "lib/plugin.js", 43 | "discovery": { 44 | "server": { 45 | "base": { 46 | "name": "jupyterlab-gt-coar-theme" 47 | }, 48 | "managers": [ 49 | "pip", 50 | "conda" 51 | ] 52 | } 53 | }, 54 | "sharedPackages": { 55 | "@gt-coar/jupyterlab-theme-brand": { 56 | "bundled": false, 57 | "singleton": true 58 | }, 59 | "@fontsource/roboto": { 60 | "bundled": false, 61 | "singleton": true 62 | }, 63 | "@fontsource/roboto-mono": { 64 | "bundled": false, 65 | "singleton": true 66 | }, 67 | "@fontsource/roboto-slab": { 68 | "bundled": false, 69 | "singleton": true 70 | } 71 | }, 72 | "outputDir": "../../py_src/jupyterlab_gt_coar_theme/labextensions/light" 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /packages/brand/style/brand.css: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | 6 | :root { 7 | /* lifted from site */ 8 | --gt-black: #262626; 9 | --gt-white: #ffffff; 10 | --gt-buzz-gold: #eeb211; 11 | --gt-gold: #b3a369; 12 | --gt-tech-gold: #b3a369; 13 | --gt-gold-grad-1: #bfb37c; 14 | --gt-tech-light-gold: #bfb37c; 15 | --gt-mdlt-gold: #ac9a58; 16 | --gt-md-gold: #a4925a; 17 | --gt-tech-medium-gold: #a4925a; 18 | --gt-drk-gold: #857437; 19 | --gt-tech-dark-gold: #857437; 20 | --gt-navy: #003057; 21 | --gt-blue: #004f9f; 22 | --gt-link-blue: #004f9f; 23 | --gt-blue-visited: #1879db; 24 | --gt-blue-hover: #1879db; 25 | --gt-link-hover-blue: #1879db; 26 | --gt-text-black: #262626; 27 | --gt-warm-gray: #d6dbd4; 28 | --gt-warm-grey: #d6dbd4; 29 | --gt-warm-gray-medium: #e5e7e4; 30 | --gt-warm-grey-medium: #e5e7e4; 31 | --gt-superlight-gray: #f2f2f2; 32 | --gt-superlight-grey: #f2f2f2; 33 | --gt-light-gray: #ccc; 34 | --gt-light-grey: #ccc; 35 | --gt-warm-gray-light: #f2f3f1; 36 | --gt-warm-grey-light: #f2f3f1; 37 | --gt-md-grey: #545454; 38 | --gt-medium-gray-light: #545454; 39 | --gt-medium-grey-light: #545454; 40 | --gt-mddk-grey: #8a8a8a; 41 | --gt-dark-gray: #3b3b3b; 42 | --gt-dark-grey: #3b3b3b; 43 | --gt-drk-grey: #3b3b3b; 44 | --gt-pimile-light: #f2f3f1; 45 | --gt-horizon: #f95e10; 46 | 47 | /* from brand guidelines */ 48 | --gt-blue: #003057; 49 | --gt-blue-80: #335161; 50 | --gt-blue-link: #004f9f; 51 | --gt-blue-link-hover: #1879db; 52 | --gt-grey-light: #e5e5e5; 53 | --gt-gold-buzz: #eaaa00; 54 | --gt-gold-buzz-60: #f5d580; 55 | --gt-tertiary-gray-matter: #54585a; 56 | --gt-tertiary-atlanta-fog: #002233; 57 | --gt-tertiary-mortar: #8e8b76; 58 | --gt-tertiary-pi-mile: #d6dbd4; 59 | --gt-tertiary-diploma: #f9f6e5; 60 | --gt-tertiary-tower-patina: #4b8b9b; 61 | --gt-tertiary-bobby-jones: #377117; 62 | --gt-tertiary-burger-bowl: #b7c42f; 63 | --gt-tertiary-the-whistle: #740053; 64 | --gt-tertiary-georgia-clay: #ad4025; 65 | --gt-tertiary-horizon: #f95e10; 66 | --gt-font-fallback: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, 67 | sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; 68 | --gt-font-primary: 'Roboto', var(--gt-font-fallback); 69 | --gt-font-secondary: 'Roboto Slab', var(--gt-font-fallback); 70 | --gt-font-mono: 'Roboto Mono', var(--jp-code-font-family-default); 71 | 72 | /* unicode for content */ 73 | --gt-chevron: '\276f'; 74 | 75 | /* thwg */ 76 | --thwg: #ba0c2f; 77 | } 78 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG 2 | 3 | ## [0.3.0] 4 | 5 | - fixes selectors to avoid broken variable redefinitions ([#13]) 6 | - breaks up into multiple packages ([#14]) 7 | - themes presentation/single-document mode ([#14]) 8 | - handles more third-party extensions 9 | - [ipyelk] 10 | 11 | [0.3.0]: https://pypi.org/project/jupyterlab-gt-coar-theme/0.3.0 12 | [#13]: https://github.com/gt-coar/jupyterlab-gt-coar-theme/issues/13 13 | [#14]: https://github.com/gt-coar/jupyterlab-gt-coar-theme/pull/14 14 | [ipyelk]: https://github.com/jupyrdf/ipyelk 15 | 16 | ## [0.2.4] 17 | 18 | - fixes `JSON` rich display size ([#11]) 19 | - handles more third-party extensions ([#12]) 20 | - [jupyterlab-classic] 21 | - uses `styleModule` ([#12]) 22 | 23 | [0.2.4]: https://pypi.org/project/jupyterlab-gt-coar-theme/0.2.4 24 | [#11]: https://github.com/gt-coar/jupyterlab-gt-coar-theme/issues/11 25 | [#12]: https://github.com/gt-coar/jupyterlab-gt-coar-theme/issues/12 26 | [jupyterlab-classic]: https://github.com/jtpio/jupyterlab-classic 27 | 28 | ## [0.2.3] 29 | 30 | - fixes `code` font size in headers ([#9]) 31 | - handles more third-party extensions 32 | - [jupyterlab-tour] 33 | 34 | [0.2.3]: https://pypi.org/project/jupyterlab-gt-coar-theme/0.2.3 35 | [#9]: https://github.com/gt-coar/jupyterlab-gt-coar-theme/issues/9 36 | [jupyterlab-tour]: https://github.com/jupyterlab-contrib/jupyterlab-tour 37 | 38 | ## [0.2.2] 39 | 40 | - improves dark mode contrast on some interactive features ([#7]) 41 | 42 | [0.2.2]: https://pypi.org/project/jupyterlab-gt-coar-theme/0.2.2 43 | [#7]: https://github.com/gt-coar/jupyterlab-gt-coar-theme/issues/7 44 | 45 | ## [0.2.1] 46 | 47 | - fixes toggle switch spacing when browser is zoomed ([#5]) 48 | - adds custom favicons ([#6]) 49 | 50 | [0.2.1]: https://pypi.org/project/jupyterlab-gt-coar-theme/0.2.1 51 | [#5]: https://github.com/gt-coar/jupyterlab-gt-coar-theme/issues/3 52 | [#6]: https://github.com/gt-coar/jupyterlab-gt-coar-theme/pull/6 53 | 54 | ## [0.2.0] 55 | 56 | - adds a dark theme ([#3]) 57 | - handles more core components 58 | - debugger 59 | - launcher 60 | - moon animation 61 | - handles more third-party extensions 62 | - [ipywidgets] 63 | - [bqplot] 64 | - [jupyterlab-lsp] 65 | 66 | [0.2.0]: https://pypi.org/project/jupyterlab-gt-coar-theme/0.2.0 67 | [#3]: https://github.com/gt-coar/jupyterlab-gt-coar-theme/issues/3 68 | [ipywidgets]: https://github.com/jupyter-widgets/ipywidgets 69 | [bqplot]: https://github.com/bqplot/bqplot 70 | [jupyterlab-lsp]: https://github.com/krassowski/jupyterlab-lsp 71 | 72 | ## [0.1.0] 73 | 74 | - initial release with light theme 75 | 76 | [0.1.0]: https://pypi.org/project/jupyterlab-gt-coar-theme/0.1.0 77 | 78 | --- 79 | 80 | > Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme 81 | > contributors 82 | > 83 | > Distributed under the terms of the BSD-3-Clause License. 84 | -------------------------------------------------------------------------------- /packages/brand/style/presentation.css: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | 6 | /* hide these entirely unless hovered */ 7 | .jp-mod-presentationMode .jp-SideBar, 8 | .jp-mod-presentationMode #jp-MainMenu, 9 | .jp-mod-presentationMode #jp-top-panel, 10 | .jp-mod-presentationMode #jp-menu-panel, 11 | .jp-mod-presentationMode #jp-bottom-panel { 12 | opacity: 0; 13 | transition: opacity 0.2s; 14 | } 15 | 16 | /* suggest these, if visible */ 17 | .jp-mod-presentationMode #jp-left-stack, 18 | .jp-mod-presentationMode #jp-right-stack, 19 | .jp-mod-presentationMode .jp-Placeholder-content, 20 | .jp-mod-presentationMode .jp-NotebookPanel-toolbar, 21 | .jp-mod-presentationMode .lm-DockPanel-tabBar.jp-Activity { 22 | opacity: 0.1; 23 | transition: opacity 0.2s; 24 | } 25 | 26 | /* bring some stuff back if hovered */ 27 | .jp-mod-presentationMode .jp-SideBar:hover, 28 | .jp-mod-presentationMode #jp-MainMenu:hover, 29 | .jp-mod-presentationMode #jp-top-panel:hover, 30 | .jp-mod-presentationMode #jp-menu-panel:hover, 31 | .jp-mod-presentationMode #jp-left-stack:hover, 32 | .jp-mod-presentationMode #jp-right-stack:hover, 33 | .jp-mod-presentationMode #jp-bottom-panel:hover, 34 | .jp-mod-presentationMode .jp-Placeholder-content:hover, 35 | .jp-mod-presentationMode .jp-NotebookPanel-toolbar:hover, 36 | .jp-mod-presentationMode .lm-DockPanel-tabBar.jp-Activity:hover { 37 | opacity: 0.9; 38 | transition: opacity 0.2s; 39 | } 40 | 41 | /* just clobber these */ 42 | .jp-mod-presentationMode .jp-InputPrompt, 43 | .jp-mod-presentationMode .jp-OutputPrompt { 44 | display: none; 45 | } 46 | 47 | .jp-mod-presentationMode, 48 | .jp-mod-presentationMode .lm-TabBar-content { 49 | background-color: var(--jp-layout-color0); 50 | } 51 | 52 | /* single document mode overloads */ 53 | .jp-mod-presentationMode[data-shell-mode='single-document'] #jp-top-panel { 54 | background-color: var(--jp-layout-color0); 55 | } 56 | 57 | .jp-mod-presentationMode[data-shell-mode='single-document'] #jp-top-panel { 58 | opacity: 1; 59 | min-height: 52px; 60 | height: 52px; 61 | align-items: center; 62 | } 63 | 64 | .jp-mod-presentationMode[data-shell-mode='single-document'] #jp-MainLogo { 65 | background-size: 36px; 66 | height: 48px; 67 | width: 48px; 68 | margin-left: 8px; 69 | } 70 | 71 | .jp-mod-presentationMode[data-shell-mode='single-document'] #jp-title-panel-title { 72 | height: 100%; 73 | } 74 | 75 | .jp-mod-presentationMode[data-shell-mode='single-document'] #jp-title-panel-title h1 { 76 | font-size: 36px; 77 | color: var(--jp-brand-color1); 78 | padding-top: 12px; 79 | } 80 | 81 | .jp-mod-presentationMode { 82 | --jp-notebook-scroll-padding: 0; 83 | } 84 | 85 | .jp-mod-presentationMode .lm-DockPanel-widget { 86 | border-color: transparent; 87 | } 88 | -------------------------------------------------------------------------------- /packages/brand/src/util.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | 6 | import { LabIcon, jupyterFaviconIcon } from '@jupyterlab/ui-components'; 7 | import { JupyterFrontEnd, JupyterFrontEndPlugin } from '@jupyterlab/application'; 8 | import { IThemeManager } from '@jupyterlab/apputils'; 9 | import { PageConfig } from '@jupyterlab/coreutils'; 10 | 11 | import { 12 | NAME, 13 | WORDMARK_SVG, 14 | WORDMARK_ICON_ID, 15 | CHEVRONS_URL, 16 | WORDMARK_URL, 17 | IThemeOptions, 18 | } from './tokens'; 19 | 20 | export const GT_ICON = new LabIcon({ name: WORDMARK_ICON_ID, svgstr: WORDMARK_SVG }); 21 | 22 | export const OG_FAVICON = jupyterFaviconIcon.svgstr; 23 | export const OG_FAVICON_MIME = 'image/x-icon'; 24 | export const GT_FAVICON_MIME = 'image/svg+xml'; 25 | 26 | export function makeTheme(opts: IThemeOptions): JupyterFrontEndPlugin { 27 | return { 28 | id: `${opts.ns}:${opts.variant.toLowerCase()}`, 29 | requires: [IThemeManager], 30 | autoStart: true, 31 | activate: async (app: JupyterFrontEnd, manager: IThemeManager) => { 32 | let faviconIdle: HTMLLinkElement; 33 | let faviconBusy: HTMLLinkElement; 34 | 35 | let ogFaviconIdle: string; 36 | let ogFaviconBusy: string; 37 | const baseUrl = PageConfig.getBaseUrl(); 38 | 39 | function toggleFavicons(restore = false) { 40 | if (faviconIdle == null) { 41 | faviconIdle = document.querySelector('link.favicon.idle'); 42 | ogFaviconIdle = `${baseUrl}static/favicons/favicon.ico`; 43 | faviconBusy = document.querySelector('link.favicon.busy'); 44 | ogFaviconBusy = `${baseUrl}static/favicons/favicon-busy-1.ico`; 45 | } 46 | if (faviconIdle && faviconBusy) { 47 | if (restore) { 48 | faviconIdle.href = ogFaviconIdle; 49 | faviconBusy.href = ogFaviconBusy; 50 | faviconIdle.type = faviconBusy.type = OG_FAVICON_MIME; 51 | jupyterFaviconIcon.svgstr = OG_FAVICON; 52 | } else { 53 | faviconIdle.href = WORDMARK_URL; 54 | faviconBusy.href = CHEVRONS_URL; 55 | faviconIdle.type = faviconBusy.type = GT_FAVICON_MIME; 56 | jupyterFaviconIcon.svgstr = WORDMARK_SVG; 57 | } 58 | } 59 | } 60 | 61 | manager.register({ 62 | name: `${NAME} (${opts.variant})`, 63 | isLight: opts.isLight, 64 | themeScrollbars: true, 65 | load: async () => { 66 | toggleFavicons(); 67 | return manager.loadCSS(`${opts.ns}/index.css`); 68 | }, 69 | unload: async () => { 70 | if (jupyterFaviconIcon.svgstr === WORDMARK_SVG) { 71 | toggleFavicons(true); 72 | } 73 | }, 74 | }); 75 | }, 76 | }; 77 | } 78 | -------------------------------------------------------------------------------- /packages/brand/style/fonts.css: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | 6 | /* roboto-latin-400-normal*/ 7 | @font-face { 8 | font-family: 'Roboto'; 9 | font-style: normal; 10 | font-display: swap; 11 | font-weight: 400; 12 | src: url('!!base64-inline-loader!~@fontsource/roboto/files/roboto-latin-400-normal.woff2'); 13 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, 14 | U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 15 | } 16 | 17 | @font-face { 18 | font-family: 'Roboto'; 19 | font-style: normal; 20 | font-display: swap; 21 | font-weight: 700; 22 | src: url('!!base64-inline-loader!~@fontsource/roboto/files/roboto-latin-700-normal.woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, 24 | U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 25 | } 26 | 27 | /* roboto-slab-latin-400-normal*/ 28 | @font-face { 29 | font-family: 'Roboto Slab'; 30 | font-style: normal; 31 | font-display: swap; 32 | font-weight: 400; 33 | src: url('!!base64-inline-loader!~@fontsource/roboto-slab/files/roboto-slab-latin-400-normal.woff2') 34 | format('woff2'); 35 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, 36 | U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 37 | } 38 | 39 | @font-face { 40 | font-family: 'Roboto Slab'; 41 | font-style: normal; 42 | font-display: swap; 43 | font-weight: 700; 44 | src: url('!!base64-inline-loader!~@fontsource/roboto-slab/files/roboto-slab-latin-700-normal.woff2') 45 | format('woff2'); 46 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, 47 | U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 48 | } 49 | 50 | /* roboto-mono-latin-400-normal*/ 51 | @font-face { 52 | font-family: 'Roboto Mono'; 53 | font-style: normal; 54 | font-display: swap; 55 | font-weight: 400; 56 | src: url('!!base64-inline-loader!~@fontsource/roboto-mono/files/roboto-mono-latin-400-normal.woff2') 57 | format('woff2'); 58 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, 59 | U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 60 | } 61 | 62 | @font-face { 63 | font-family: 'Roboto Mono'; 64 | font-style: normal; 65 | font-display: swap; 66 | font-weight: 700; 67 | src: url('!!base64-inline-loader!~@fontsource/roboto-mono/files/roboto-mono-latin-700-normal.woff2') 68 | format('woff2'); 69 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, 70 | U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 71 | } 72 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 2 | # Distributed under the terms of the BSD-3-Clause License. 3 | 4 | name: CI 5 | 6 | on: 7 | push: 8 | branches: [master] 9 | pull_request: 10 | branches: [master] 11 | 12 | env: 13 | # increment to reset all caches 14 | CACHE_EPOCH: 0 15 | # python cruft 16 | PYTHONIOENCODING: utf-8 17 | PYTHONUNBUFFERED: 1 18 | PIP_DISABLE_PIP_VERSION_CHECK: 1 19 | 20 | defaults: 21 | run: 22 | shell: bash -l {0} 23 | 24 | jobs: 25 | build: 26 | runs-on: ubuntu-latest 27 | steps: 28 | - uses: actions/checkout@v2 29 | 30 | - name: setup (python) 31 | uses: actions/setup-python@v2 32 | with: 33 | python-version: '3.9' 34 | architecture: x64 35 | 36 | - name: setup (node) 37 | uses: actions/setup-node@v2 38 | with: 39 | node-version: '14' 40 | 41 | - name: cache (pip) 42 | uses: actions/cache@v2 43 | with: 44 | path: ~/.cache/pip 45 | key: | 46 | ${{ env.CACHE_EPOCH }}-${{ runner.os }}-pip-${{ hashFiles('.github/pip-build.txt') }} 47 | restore-keys: | 48 | ${{ env.CACHE_EPOCH }}-${{ runner.os }}-pip- 49 | 50 | - name: cache (node) 51 | uses: actions/cache@v2 52 | id: cache-node-modules 53 | with: 54 | path: '**/node_modules' 55 | key: 56 | ${{ env.CACHE_EPOCH }}-${{ runner.os }}-node-build-${{ 57 | hashFiles('yarn.lock', '.gitub/pip-build.txt') }} 58 | 59 | - name: cache (yarn) 60 | uses: actions/cache@v1 61 | if: steps.cache-node-modules.outputs.cache-hit != 'true' 62 | id: cache-yarn-packages 63 | with: 64 | path: .yarn-packages 65 | key: 66 | ${{ env.CACHE_EPOCH }}-yarn-${{ runner.os }}-${{ hashFiles('yarn.lock') }} 67 | restore-keys: | 68 | ${{ env.CACHE_EPOCH }}-yarn-${{ runner.os }}- 69 | ${{ env.CACHE_EPOCH }}-yarn- 70 | 71 | - name: setup (pip) 72 | run: pip install -U pip wheel setuptools 73 | 74 | - name: setup (pip build) 75 | run: pip install -U -v -r .github/pip-build.txt 76 | 77 | - name: check (pip) 78 | run: | 79 | set -eux 80 | mkdir -p build/pip 81 | pip freeze | tee build/pip/dist.pip.freeze 82 | pip check 83 | 84 | - name: upload (pip freeze) 85 | uses: actions/upload-artifact@v2 86 | with: 87 | name: jupyterlab-gt-coar-theme ${{ github.run_number }} build pip freeze 88 | path: ./build/pip/ 89 | 90 | - name: list 91 | run: doit list --all --status 92 | 93 | - name: lint 94 | run: doit -n4 lint || doit lint 95 | 96 | - name: status (after lint) 97 | run: doit list --all --status | sort 98 | if: always() 99 | 100 | - name: build 101 | run: doit -n4 dist || doit dist 102 | 103 | - name: status (after build) 104 | run: doit list --all --status | sort 105 | if: always() 106 | 107 | - name: upload (dist) 108 | uses: actions/upload-artifact@v2 109 | with: 110 | name: jupyterlab-gt-coar-theme ${{ github.run_number }} dist 111 | path: ./dist 112 | 113 | install: 114 | runs-on: ${{ matrix.os }}-latest 115 | needs: [build] 116 | strategy: 117 | fail-fast: false 118 | matrix: 119 | os: [ubuntu, macos, windows] 120 | python: ['3.6', '3.9'] 121 | include: 122 | - python: '3.6' 123 | dist: '*.tar.gz' 124 | - python: '3.9' 125 | dist: '*.whl' 126 | - os: windows 127 | py_cmd: python 128 | - os: macos 129 | py_cmd: python3 130 | - os: ubuntu 131 | py_cmd: python 132 | steps: 133 | - name: Install Python 134 | uses: actions/setup-python@v2 135 | with: 136 | python-version: ${{ matrix.python }} 137 | architecture: 'x64' 138 | 139 | - uses: actions/download-artifact@v2 140 | with: 141 | name: jupyterlab-gt-coar-theme ${{ github.run_number }} dist 142 | path: ./dist 143 | 144 | - name: Install the prerequisites 145 | run: | 146 | ${{ matrix.py_cmd }} -m pip install pip wheel 147 | 148 | - name: Install the package 149 | run: | 150 | cd dist 151 | ${{ matrix.py_cmd }} -m pip install -vv ${{ matrix.dist }} 152 | 153 | - name: Validate environment 154 | run: | 155 | ${{ matrix.py_cmd }} -m pip freeze 156 | ${{ matrix.py_cmd }} -m pip check 157 | 158 | - name: Validate the install 159 | run: | 160 | jupyter labextension list 161 | jupyter labextension list 2>&1 | grep -ie "@gt-coar/jupyterlab-theme.*enabled.*ok" - 162 | -------------------------------------------------------------------------------- /packages/light/style/variables.css: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | 6 | :root { 7 | --jp-accent-color0: var(--md-green-900); 8 | --jp-accent-color1: var(--md-green-700); 9 | --jp-border-color0: var(--md-grey-400); 10 | --jp-border-color1: var(--md-grey-400); 11 | --jp-border-color2: var(--md-grey-300); 12 | --jp-border-color3: var(--md-grey-200); 13 | --jp-brand-color0: var(--md-blue-900); 14 | --jp-brand-color1: var(--md-blue-700); 15 | --jp-cell-editor-background: var(--md-grey-100); 16 | --jp-cell-editor-border-color: var(--md-grey-300); 17 | --jp-cell-prompt-not-active-font-color: var(--md-grey-700); 18 | --jp-cell-prompt-not-active-opacity: 0.5; 19 | --jp-content-font-color0: rgba(0, 0, 0, 1); 20 | --jp-content-font-color1: rgba(0, 0, 0, 0.87); 21 | --jp-content-font-color2: rgba(0, 0, 0, 0.54); 22 | --jp-content-font-color3: rgba(0, 0, 0, 0.38); 23 | --jp-content-link-color: var(--md-blue-700); 24 | --jp-dialog-background: rgba(0, 0, 0, 0.25); 25 | --jp-editor-selected-background: #d9d9d9; 26 | --jp-editor-selected-focused-background: #d7d4f0; 27 | --jp-error-color0: var(--md-red-900); 28 | --jp-error-color1: var(--md-red-700); 29 | --jp-info-color0: var(--md-cyan-900); 30 | --jp-info-color1: var(--md-cyan-700); 31 | --jp-input-active-background: var(--jp-layout-color1); 32 | --jp-input-background: var(--md-grey-100); 33 | --jp-input-hover-background: var(--jp-layout-color1); 34 | --jp-inverse-layout-color0: #111111; 35 | --jp-inverse-layout-color1: var(--md-grey-900); 36 | --jp-inverse-layout-color2: var(--md-grey-800); 37 | --jp-inverse-layout-color3: var(--md-grey-700); 38 | --jp-layout-color0: white; 39 | --jp-layout-color1: white; 40 | --jp-layout-color2: var(--md-grey-200); 41 | --jp-layout-color3: var(--md-grey-400); 42 | --jp-mirror-editor-atom-color: #88f; 43 | --jp-mirror-editor-attribute-color: #00c; 44 | --jp-mirror-editor-builtin-color: #008000; 45 | --jp-mirror-editor-def-color: #00f; 46 | --jp-mirror-editor-header-color: blue; 47 | --jp-mirror-editor-keyword-color: #008000; 48 | --jp-mirror-editor-link-color: #00c; 49 | --jp-mirror-editor-number-color: #080; 50 | --jp-mirror-editor-property-color: #05a; 51 | --jp-mirror-editor-punctuation-color: #05a; 52 | --jp-mirror-editor-quote-color: #090; 53 | --jp-mirror-editor-string-2-color: #708; 54 | --jp-mirror-editor-string-color: #ba2121; 55 | --jp-mirror-editor-tag-color: #170; 56 | --jp-mirror-editor-variable-2-color: #05a; 57 | --jp-mirror-editor-variable-3-color: #085; 58 | --jp-mirror-editor-variable-color: var(--md-grey-900); 59 | --jp-notebook-multiselected-color: var(--md-blue-50); 60 | --jp-rendermime-error-background: #fdd; 61 | --jp-rendermime-table-row-background: var(--md-grey-100); 62 | --jp-rendermime-table-row-hover-background: var(--md-light-blue-50); 63 | --jp-search-selected-match-background-color: rgb(245, 200, 0); 64 | --jp-search-toggle-off-opacity: 0.5; 65 | --jp-shadow-base-lightness: 0; 66 | --jp-success-color0: var(--md-green-900); 67 | --jp-success-color1: var(--md-green-700); 68 | --jp-toolbar-active-background: var(--md-grey-300); 69 | --jp-toolbar-border-color: var(--jp-border-color1); 70 | --jp-toolbar-box-shadow: 0px 0px 2px 0px rgba(0, 0, 0, 0.24); 71 | --jp-ui-font-color0: rgba(0, 0, 0, 1); 72 | --jp-ui-font-color1: rgba(0, 0, 0, 0.87); 73 | --jp-ui-font-color2: rgba(0, 0, 0, 0.54); 74 | --jp-ui-font-color3: rgba(0, 0, 0, 0.38); 75 | --jp-ui-inverse-font-color0: rgba(255, 255, 255, 1); 76 | --jp-ui-inverse-font-color1: rgba(255, 255, 255, 1); 77 | --jp-ui-inverse-font-color2: rgba(255, 255, 255, 0.7); 78 | --jp-ui-inverse-font-color3: rgba(255, 255, 255, 0.5); 79 | --jp-vega-background: white; 80 | --jp-warn-color0: var(--md-orange-900); 81 | --jp-warn-color1: var(--md-orange-700); 82 | --jp-brand-color0: var(--gt-blue) !important; 83 | --jp-brand-color1: var(--gt-blue-link) !important; 84 | --jp-layout-color0: var(--gt-white); 85 | --jp-layout-color1: var(--gt-white); 86 | --jp-layout-color2: var(--gt-superlight-grey); 87 | --jp-layout-color3: var(--gt-light-grey); 88 | --jp-warn-color0: var(--gt-tertiary-horizon); 89 | --jp-icon-contrast-color0: var(--gt-tertiary-the-whistle); 90 | 91 | /* ui */ 92 | --jp-input-box-shadow: inset 0 0 2px var(--gt-gold-buzz); 93 | --jp-cell-editor-box-shadow: var(--jp-input-box-shadow); 94 | 95 | /* code */ 96 | --jp-mirror-editor-header-color: var(--gt-blue); 97 | --jp-mirror-editor-keyword-color: var(--gt-tertiary-bobby-jones); 98 | --jp-mirror-editor-def-color: var(--gt-blue-link); 99 | --jp-mirror-editor-error-color: var(--thwg); 100 | --jp-mirror-editor-quote-color: var(--gt-tertiary-bobby-jones); 101 | --jp-mirror-editor-comment-color: var(--gt-tertiary-tower-patina); 102 | 103 | /* content */ 104 | --gtc-header-color: var(--gt-blue); 105 | --gtc-widgets-label-color: var(--gt-tertiary-tower-patina); 106 | --gtc-running-color: var(--gt-blue); 107 | } 108 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JupyterLab GT COAR Theme 2 | 3 | [![launch interactive demo on binder][binder-badge]][binder] 4 | [![install from PyPI][pypi-badge]][pypi] 5 | [![install from conda-forge][conda-forge-badge]][conda-forge] 6 | [![changelog][changelog-badge]][changelog] 7 | [![contributing][contributing-badge]][contributing] 8 | 9 | > an unoffical Georgia Tech theme for [JupyterLab] 3 10 | 11 | ## Install 12 | 13 | ```bash 14 | pip install jupyterlab-gt-coar-theme 15 | ``` 16 | 17 | or 18 | 19 | ```bash 20 | conda install -c conda-forge jupyterlab-gt-coar-theme 21 | ``` 22 | 23 | > See the [contributing guide][contributing] for a development install. 24 | 25 | ## Screenshots 26 | 27 | | Mode | Light | Dark | 28 | | -----------: | ---------------------------------------------------------------------- | -------------------------------------------------------------------- | 29 | | Full | ![a screenshot of the light theme][screenshot-light] | ![a screenshot of the dark theme][screenshot-dark] | 30 | | Presentation | ![a screenshot of the light presentation theme][screenshot-light-prez] | ![a screenshot of the dark presentation theme][screenshot-dark-prez] | 31 | 32 | [screenshot-light]: 33 | https://user-images.githubusercontent.com/7581399/106806206-a6a40900-6635-11eb-9e49-1c60fde1c1c5.png 34 | [screenshot-dark]: 35 | https://user-images.githubusercontent.com/7581399/107781115-864f0b00-6d15-11eb-998b-789bc24ba921.png 36 | [screenshot-light-prez]: 37 | https://user-images.githubusercontent.com/7581399/123836581-dcdd7000-d8d7-11eb-8e8a-a5c4ad708733.png 38 | [screenshot-dark-prez]: 39 | https://user-images.githubusercontent.com/7581399/123836579-dc44d980-d8d7-11eb-91e6-c6d81799e613.png 40 | 41 | ## Usage 42 | 43 | After launching JupyterLab, in the _Main Menu_, select _Settings ▸ JupyterLab Theme ▸ GT 44 | COAR (Light|Dark) Theme_. 45 | 46 | ## Uninstall 47 | 48 | ```bash 49 | pip uninstall jupyterlab-gt-coar-theme 50 | ``` 51 | 52 | or 53 | 54 | ```bash 55 | conda uninstall jupyterlab-gt-coar-theme 56 | ``` 57 | 58 | --- 59 | 60 | > Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme 61 | > contributors 62 | > 63 | > Distributed under the terms of the BSD-3-Clause License. 64 | 65 | [pypi-badge]: 66 | https://img.shields.io/pypi/v/jupyterlab-gt-coar-theme?logo=pypi&style=flat-square&color=004f9f 67 | [pypi]: https://pypi.org/project/jupyterlab-gt-coar-theme 68 | [conda-forge-badge]: 69 | https://img.shields.io/conda/vn/conda-forge/jupyterlab-gt-coar-theme?logo=conda-forge&color=004f9f&style=flat-square 70 | [conda-forge]: https://anaconda.org/conda-forge/jupyterlab-gt-coar-theme 71 | [binder-badge]: 72 | https://img.shields.io/badge/binder-demo-f95e10?style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFkAAABZCAMAAABi1XidAAAB8lBMVEX///9XmsrmZYH1olJXmsr1olJXmsrmZYH1olJXmsr1olJXmsrmZYH1olL1olJXmsr1olJXmsrmZYH1olL1olJXmsrmZYH1olJXmsr1olL1olJXmsrmZYH1olL1olJXmsrmZYH1olL1olL0nFf1olJXmsrmZYH1olJXmsq8dZb1olJXmsrmZYH1olJXmspXmspXmsr1olL1olJXmsrmZYH1olJXmsr1olL1olJXmsrmZYH1olL1olLeaIVXmsrmZYH1olL1olL1olJXmsrmZYH1olLna31Xmsr1olJXmsr1olJXmsrmZYH1olLqoVr1olJXmsr1olJXmsrmZYH1olL1olKkfaPobXvviGabgadXmsqThKuofKHmZ4Dobnr1olJXmsr1olJXmspXmsr1olJXmsrfZ4TuhWn1olL1olJXmsqBi7X1olJXmspZmslbmMhbmsdemsVfl8ZgmsNim8Jpk8F0m7R4m7F5nLB6jbh7jbiDirOEibOGnKaMhq+PnaCVg6qWg6qegKaff6WhnpKofKGtnomxeZy3noG6dZi+n3vCcpPDcpPGn3bLb4/Mb47UbIrVa4rYoGjdaIbeaIXhoWHmZYHobXvpcHjqdHXreHLroVrsfG/uhGnuh2bwj2Hxk17yl1vzmljzm1j0nlX1olL3AJXWAAAAbXRSTlMAEBAQHx8gICAuLjAwMDw9PUBAQEpQUFBXV1hgYGBkcHBwcXl8gICAgoiIkJCQlJicnJ2goKCmqK+wsLC4usDAwMjP0NDQ1NbW3Nzg4ODi5+3v8PDw8/T09PX29vb39/f5+fr7+/z8/Pz9/v7+zczCxgAABC5JREFUeAHN1ul3k0UUBvCb1CTVpmpaitAGSLSpSuKCLWpbTKNJFGlcSMAFF63iUmRccNG6gLbuxkXU66JAUef/9LSpmXnyLr3T5AO/rzl5zj137p136BISy44fKJXuGN/d19PUfYeO67Znqtf2KH33Id1psXoFdW30sPZ1sMvs2D060AHqws4FHeJojLZqnw53cmfvg+XR8mC0OEjuxrXEkX5ydeVJLVIlV0e10PXk5k7dYeHu7Cj1j+49uKg7uLU61tGLw1lq27ugQYlclHC4bgv7VQ+TAyj5Zc/UjsPvs1sd5cWryWObtvWT2EPa4rtnWW3JkpjggEpbOsPr7F7EyNewtpBIslA7p43HCsnwooXTEc3UmPmCNn5lrqTJxy6nRmcavGZVt/3Da2pD5NHvsOHJCrdc1G2r3DITpU7yic7w/7Rxnjc0kt5GC4djiv2Sz3Fb2iEZg41/ddsFDoyuYrIkmFehz0HR2thPgQqMyQYb2OtB0WxsZ3BeG3+wpRb1vzl2UYBog8FfGhttFKjtAclnZYrRo9ryG9uG/FZQU4AEg8ZE9LjGMzTmqKXPLnlWVnIlQQTvxJf8ip7VgjZjyVPrjw1te5otM7RmP7xm+sK2Gv9I8Gi++BRbEkR9EBw8zRUcKxwp73xkaLiqQb+kGduJTNHG72zcW9LoJgqQxpP3/Tj//c3yB0tqzaml05/+orHLksVO+95kX7/7qgJvnjlrfr2Ggsyx0eoy9uPzN5SPd86aXggOsEKW2Prz7du3VID3/tzs/sSRs2w7ovVHKtjrX2pd7ZMlTxAYfBAL9jiDwfLkq55Tm7ifhMlTGPyCAs7RFRhn47JnlcB9RM5T97ASuZXIcVNuUDIndpDbdsfrqsOppeXl5Y+XVKdjFCTh+zGaVuj0d9zy05PPK3QzBamxdwtTCrzyg/2Rvf2EstUjordGwa/kx9mSJLr8mLLtCW8HHGJc2R5hS219IiF6PnTusOqcMl57gm0Z8kanKMAQg0qSyuZfn7zItsbGyO9QlnxY0eCuD1XL2ys/MsrQhltE7Ug0uFOzufJFE2PxBo/YAx8XPPdDwWN0MrDRYIZF0mSMKCNHgaIVFoBbNoLJ7tEQDKxGF0kcLQimojCZopv0OkNOyWCCg9XMVAi7ARJzQdM2QUh0gmBozjc3Skg6dSBRqDGYSUOu66Zg+I2fNZs/M3/f/Grl/XnyF1Gw3VKCez0PN5IUfFLqvgUN4C0qNqYs5YhPL+aVZYDE4IpUk57oSFnJm4FyCqqOE0jhY2SMyLFoo56zyo6becOS5UVDdj7Vih0zp+tcMhwRpBeLyqtIjlJKAIZSbI8SGSF3k0pA3mR5tHuwPFoa7N7reoq2bqCsAk1HqCu5uvI1n6JuRXI+S1Mco54YmYTwcn6Aeic+kssXi8XpXC4V3t7/ADuTNKaQJdScAAAAAElFTkSuQmCC 73 | [binder]: https://mybinder.org/v2/gh/gt-coar/jupyterlab-gt-coar-theme/HEAD?urlpath=lab 74 | [jupyterlab]: https://github.com/jupyterlab/jupyterlab 75 | [changelog]: 76 | https://github.com/gt-coar/jupyterlab-gt-coar-theme/blob/master/CHANGELOG.md 77 | [changelog-badge]: https://img.shields.io/badge/CHANGELOG-md-f5d580?style=flat-square 78 | [contributing-badge]: 79 | https://img.shields.io/badge/CONTRIBUTING-md-f5d580?style=flat-square 80 | [contributing]: 81 | https://github.com/gt-coar/jupyterlab-gt-coar-theme/blob/master/CONTRIBUTING.md 82 | -------------------------------------------------------------------------------- /packages/dark/style/variables.css: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | 6 | :root { 7 | --jp-accent-color0: var(--md-green-700); 8 | --jp-accent-color1: var(--md-green-500); 9 | --jp-border-color0: var(--md-grey-700); 10 | --jp-border-color1: var(--md-grey-700); 11 | --jp-border-color2: var(--md-grey-800); 12 | --jp-border-color3: var(--md-grey-900); 13 | --jp-brand-color0: var(--md-blue-700); 14 | --jp-brand-color1: var(--md-blue-500); 15 | --jp-cell-editor-background: var(--jp-layout-color1); 16 | --jp-cell-editor-border-color: var(--md-grey-700); 17 | --jp-cell-prompt-not-active-font-color: var(--md-grey-300); 18 | --jp-cell-prompt-not-active-opacity: 1; 19 | --jp-content-font-color0: rgba(255, 255, 255, 1); 20 | --jp-content-font-color1: rgba(255, 255, 255, 1); 21 | --jp-content-font-color2: rgba(255, 255, 255, 0.7); 22 | --jp-content-font-color3: rgba(255, 255, 255, 0.5); 23 | --jp-content-link-color: var(--md-blue-300); 24 | --jp-dialog-background: rgba(0, 0, 0, 0.6); 25 | --jp-editor-selected-background: var(--jp-layout-color2); 26 | --jp-editor-selected-focused-background: rgba(33, 150, 243, 0.24); 27 | --jp-error-color0: var(--md-red-700); 28 | --jp-error-color1: var(--md-red-500); 29 | --jp-info-color0: var(--md-cyan-700); 30 | --jp-info-color1: var(--md-cyan-500); 31 | --jp-input-active-background: var(--jp-layout-color0); 32 | --jp-input-background: var(--md-grey-800); 33 | --jp-input-hover-background: var(--jp-layout-color2); 34 | --jp-inverse-layout-color0: white; 35 | --jp-inverse-layout-color1: white; 36 | --jp-inverse-layout-color2: var(--md-grey-200); 37 | --jp-inverse-layout-color3: var(--md-grey-400); 38 | --jp-layout-color0: #111111; 39 | --jp-layout-color1: var(--md-grey-900); 40 | --jp-layout-color2: var(--md-grey-800); 41 | --jp-layout-color3: var(--md-grey-700); 42 | --jp-mirror-editor-atom-color: var(--md-blue-300); 43 | --jp-mirror-editor-attribute-color: var(--md-blue-700); 44 | --jp-mirror-editor-builtin-color: var(--md-green-600); 45 | --jp-mirror-editor-def-color: var(--md-blue-600); 46 | --jp-mirror-editor-header-color: var(--md-blue-500); 47 | --jp-mirror-editor-keyword-color: var(--md-green-500); 48 | --jp-mirror-editor-link-color: var(--md-blue-700); 49 | --jp-mirror-editor-number-color: var(--md-green-400); 50 | --jp-mirror-editor-property-color: var(--md-blue-400); 51 | --jp-mirror-editor-punctuation-color: var(--md-blue-400); 52 | --jp-mirror-editor-quote-color: var(--md-green-300); 53 | --jp-mirror-editor-string-2-color: var(--md-purple-300); 54 | --jp-mirror-editor-string-color: #ff7070; 55 | --jp-mirror-editor-tag-color: var(--md-green-700); 56 | --jp-mirror-editor-variable-2-color: var(--md-blue-400); 57 | --jp-mirror-editor-variable-3-color: var(--md-green-600); 58 | --jp-mirror-editor-variable-color: var(--md-grey-300); 59 | --jp-notebook-multiselected-color: rgba(33, 150, 243, 0.24); 60 | --jp-rendermime-error-background: rgba(244, 67, 54, 0.28); 61 | --jp-rendermime-table-row-background: var(--md-grey-900); 62 | --jp-rendermime-table-row-hover-background: rgba(3, 169, 244, 0.2); 63 | --jp-scrollbar-background-color: #3f4244 !important; 64 | --jp-scrollbar-endpad: 3px; /* the minimum gap between the thumb and the ends of a scrollbar */ 65 | --jp-scrollbar-thumb-color: 88, 96, 97 !important; /* need to specify thumb color as an RGB triplet */ 66 | --jp-scrollbar-thumb-margin: 3.5px; /* the space in between the sides of the thumb and the track */ 67 | --jp-scrollbar-thumb-radius: 9px; /* set to a large-ish value for rounded endcaps on the thumb */ 68 | --jp-search-selected-match-background-color: rgb(255, 225, 0); 69 | --jp-search-toggle-off-opacity: 0.6; 70 | --jp-shadow-base-lightness: 32; 71 | --jp-success-color0: var(--md-green-700); 72 | --jp-success-color1: var(--md-green-500); 73 | --jp-toolbar-active-background: var(--jp-layout-color0); 74 | --jp-toolbar-border-color: var(--jp-border-color2); 75 | --jp-toolbar-box-shadow: 0px 0px 2px 0px rgba(0, 0, 0, 0.8); 76 | --jp-ui-font-color0: rgba(255, 255, 255, 1); 77 | --jp-ui-font-color1: rgba(255, 255, 255, 0.87); 78 | --jp-ui-font-color2: rgba(255, 255, 255, 0.54); 79 | --jp-ui-font-color3: rgba(255, 255, 255, 0.38); 80 | --jp-ui-inverse-font-color0: rgba(0, 0, 0, 1); 81 | --jp-ui-inverse-font-color1: rgba(0, 0, 0, 0.8); 82 | --jp-ui-inverse-font-color2: rgba(0, 0, 0, 0.5); 83 | --jp-ui-inverse-font-color3: rgba(0, 0, 0, 0.3); 84 | --jp-vega-background: var(--md-grey-400); 85 | --jp-warn-color0: var(--md-orange-700); 86 | --jp-warn-color1: var(--md-orange-500); 87 | --jp-brand-color0: var(--gt-gold-buzz) !important; 88 | --jp-brand-color1: var(--gt-gold-buzz-60) !important; 89 | --jp-layout-color0: var(--gt-black); 90 | --jp-inverse-layout-color3: var(--jp-brand-color1); 91 | --jp-warn-color0: var(--gt-tertiary-horizon); 92 | --jp-icon-contrast-color0: var(--jp-brand-color1); 93 | 94 | /* ui */ 95 | --jp-input-box-shadow: inset 0 0 2px var(--jp-brand-color0); 96 | --jp-cell-editor-box-shadow: var(--jp-input-box-shadow); 97 | 98 | /* code */ 99 | --jp-mirror-editor-header-color: var(--gt-gold); 100 | --jp-mirror-editor-keyword-color: var(--gt-tertiary-bobby-jones); 101 | --jp-mirror-editor-def-color: var(--gt-blue-link); 102 | --jp-mirror-editor-error-color: var(--thwg); 103 | --jp-mirror-editor-quote-color: var(--gt-tertiary-bobby-jones); 104 | --jp-mirror-editor-operator-color: #c261ff; 105 | --jp-mirror-editor-meta-color: #c261ff; 106 | --jp-mirror-editor-comment-color: var(--gt-tertiary-burger-bowl); 107 | 108 | --jp-cell-editor-border-color: transparent; 109 | 110 | --jp-border-color0: transparent !important; 111 | --jp-border-color1: transparent !important; 112 | --jp-border-color2: transparent !important; 113 | --jp-border-color3: transparent !important; 114 | 115 | /* content */ 116 | --gtc-header-color: var(--gt-gold); 117 | --gtc-widgets-label-color: var(--jp-brand-color1); 118 | --gtc-running-color: var(--jp-brand-color1); 119 | } 120 | -------------------------------------------------------------------------------- /packages/brand/style/variables.css: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | 6 | /* variables */ 7 | :root { 8 | --jp-content-line-height: 2; 9 | --jp-content-font-family: var(--gt-font-primary); 10 | --jp-ui-font-family: var(--gt-font-primary); 11 | --jp-code-font-family: var(--gt-font-mono); 12 | --jp-ui-font-size0: 14px; 13 | --jp-ui-font-size1: 15px; 14 | --jp-ui-font-size2: 1.2em; 15 | --jp-ui-font-size3: 1.5em; 16 | --jp-ui-font-size4: 1.9em; 17 | --jp-ui-font-size5: 2.2em; 18 | --jp-content-font-size0: 14px; 19 | --jp-content-font-size1: 15px; 20 | --jp-content-font-size2: 1.2em; 21 | --jp-content-font-size3: 1.5em; 22 | --jp-content-font-size4: 1.9em; 23 | --jp-content-font-size5: 2.2em; 24 | 25 | /* code */ 26 | --jp-mirror-editor-keyword-color: var(--gt-tertiary-bobby-jones); 27 | --jp-mirror-editor-def-color: var(--gt-blue-link); 28 | --jp-mirror-editor-error-color: var(--thwg); 29 | --jp-mirror-editor-quote-color: var(--gt-tertiary-bobby-jones); 30 | 31 | /* cursor */ 32 | --jp-code-cursor-width0: 2px; 33 | --jp-editor-cursor-color: var(--jp-brand-color1); 34 | 35 | /* launcher */ 36 | --jp-private-launcher-card-size: calc(var(--jp-ui-font-size2) * 6); 37 | 38 | /* colors */ 39 | --jp-accent-color2: var(--md-green-300); 40 | --jp-accent-color3: var(--md-green-100); 41 | --jp-border-color2: var(--md-grey-300); 42 | --jp-border-color3: var(--md-grey-200); 43 | --jp-border-radius: 2px; 44 | --jp-border-width: 1px; 45 | --jp-brand-color2: var(--md-blue-300); 46 | --jp-brand-color3: var(--md-blue-100); 47 | --jp-brand-color4: var(--md-blue-50); 48 | --jp-cell-collapser-min-height: 20px; 49 | --jp-cell-collapser-not-active-hover-opacity: 0.6; 50 | --jp-cell-collapser-width: 8px; 51 | --jp-cell-editor-active-background: var(--jp-layout-color0); 52 | --jp-cell-editor-active-border-color: var(--jp-brand-color1); 53 | --jp-cell-editor-box-shadow: inset 0 0 2px var(--md-blue-300); 54 | --jp-cell-inprompt-font-color: #307fc1; 55 | --jp-cell-outprompt-font-color: #bf5b3d; 56 | --jp-cell-padding: 5px; 57 | --jp-cell-prompt-font-family: var(--jp-code-font-family-default); 58 | --jp-cell-prompt-letter-spacing: 0px; 59 | --jp-cell-prompt-opacity: 1; 60 | --jp-cell-prompt-width: 64px; 61 | --jp-code-cursor-width0: 1.4px; 62 | --jp-code-cursor-width1: 2px; 63 | --jp-code-cursor-width2: 4px; 64 | --jp-code-font-family-default: Menlo, Consolas, 'DejaVu Sans Mono', monospace; 65 | --jp-code-font-family: var(--jp-code-font-family-default); 66 | --jp-code-font-size: 13px; 67 | --jp-code-line-height: 1.3077; /* 17px for 13px base */ 68 | --jp-code-padding: 5px; /* 5px for 13px base, codemirror highlighting needs integer px value */ 69 | --jp-code-presentation-font-size: 16px; 70 | --jp-console-padding: 10px; 71 | --jp-content-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, 72 | Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; 73 | --jp-content-font-scale-factor: 1.2; 74 | --jp-content-font-size0: 0.83333em; 75 | --jp-content-font-size1: 14px; /* Base font size */ 76 | --jp-content-font-size2: 1.2em; 77 | --jp-content-font-size3: 1.44em; 78 | --jp-content-font-size4: 1.728em; 79 | --jp-content-font-size5: 2.0736em; 80 | --jp-content-heading-font-weight: 500; 81 | --jp-content-heading-line-height: 1; 82 | --jp-content-heading-margin-bottom: 0.8em; 83 | --jp-content-heading-margin-top: 1.2em; 84 | --jp-content-line-height: 1.6; 85 | --jp-content-presentation-font-size1: 17px; 86 | --jp-editor-cursor-color: var(--jp-ui-font-color0); 87 | --jp-elevation-z0: none; 88 | --jp-elevation-z1: 0px 2px 1px -1px var(--jp-shadow-umbra-color), 89 | 0px 1px 1px 0px var(--jp-shadow-penumbra-color), 90 | 0px 1px 3px 0px var(--jp-shadow-ambient-color); 91 | --jp-elevation-z12: 0px 7px 8px -4px var(--jp-shadow-umbra-color), 92 | 0px 12px 17px 2px var(--jp-shadow-penumbra-color), 93 | 0px 5px 22px 4px var(--jp-shadow-ambient-color); 94 | --jp-elevation-z16: 0px 8px 10px -5px var(--jp-shadow-umbra-color), 95 | 0px 16px 24px 2px var(--jp-shadow-penumbra-color), 96 | 0px 6px 30px 5px var(--jp-shadow-ambient-color); 97 | --jp-elevation-z2: 0px 3px 1px -2px var(--jp-shadow-umbra-color), 98 | 0px 2px 2px 0px var(--jp-shadow-penumbra-color), 99 | 0px 1px 5px 0px var(--jp-shadow-ambient-color); 100 | --jp-elevation-z20: 0px 10px 13px -6px var(--jp-shadow-umbra-color), 101 | 0px 20px 31px 3px var(--jp-shadow-penumbra-color), 102 | 0px 8px 38px 7px var(--jp-shadow-ambient-color); 103 | --jp-elevation-z24: 0px 11px 15px -7px var(--jp-shadow-umbra-color), 104 | 0px 24px 38px 3px var(--jp-shadow-penumbra-color), 105 | 0px 9px 46px 8px var(--jp-shadow-ambient-color); 106 | --jp-elevation-z4: 0px 2px 4px -1px var(--jp-shadow-umbra-color), 107 | 0px 4px 5px 0px var(--jp-shadow-penumbra-color), 108 | 0px 1px 10px 0px var(--jp-shadow-ambient-color); 109 | --jp-elevation-z6: 0px 3px 5px -1px var(--jp-shadow-umbra-color), 110 | 0px 6px 10px 0px var(--jp-shadow-penumbra-color), 111 | 0px 1px 18px 0px var(--jp-shadow-ambient-color); 112 | --jp-elevation-z8: 0px 5px 5px -3px var(--jp-shadow-umbra-color), 113 | 0px 8px 10px 1px var(--jp-shadow-penumbra-color), 114 | 0px 3px 14px 2px var(--jp-shadow-ambient-color); 115 | --jp-error-color2: var(--md-red-300); 116 | --jp-error-color3: var(--md-red-100); 117 | --jp-icon-contrast-color0: var(--md-purple-600); 118 | --jp-icon-contrast-color1: var(--md-green-600); 119 | --jp-icon-contrast-color2: var(--md-pink-600); 120 | --jp-icon-contrast-color3: var(--md-blue-600); 121 | --jp-info-color2: var(--md-cyan-300); 122 | --jp-info-color3: var(--md-cyan-100); 123 | --jp-input-active-background: var(--jp-layout-color1); 124 | --jp-input-active-border-color: var(--jp-brand-color1); 125 | --jp-input-active-box-shadow-color: rgba(19, 124, 189, 0.3); 126 | --jp-input-background: var(--md-grey-100); 127 | --jp-input-border-color: var(--jp-border-color1); 128 | --jp-input-box-shadow: inset 0 0 2px var(--md-blue-300); 129 | --jp-input-hover-background: var(--jp-layout-color1); 130 | --jp-inverse-layout-color4: var(--md-grey-600); 131 | --jp-layout-color4: var(--md-grey-600); 132 | --jp-mirror-editor-bracket-color: #997; 133 | --jp-mirror-editor-comment-color: #408080; 134 | --jp-mirror-editor-error-color: #f00; 135 | --jp-mirror-editor-meta-color: #aa22ff; 136 | --jp-mirror-editor-operator-color: #aa22ff; 137 | --jp-mirror-editor-qualifier-color: #555; 138 | --jp-notebook-padding: 10px; 139 | --jp-notebook-scroll-padding: calc( 140 | 100% - var(--jp-code-font-size) * var(--jp-code-line-height) - 141 | var(--jp-code-padding) - var(--jp-cell-padding) - 1px 142 | ); 143 | --jp-notebook-select-background: var(--jp-layout-color1); 144 | --jp-search-selected-match-color: black; 145 | --jp-search-toggle-hover-opacity: 0.8; 146 | --jp-search-toggle-on-opacity: 1; 147 | --jp-search-unselected-match-background-color: var(--jp-inverse-layout-color0); 148 | --jp-search-unselected-match-color: var(--jp-ui-inverse-font-color0); 149 | --jp-shadow-ambient-color: rgba( 150 | var(--jp-shadow-base-lightness), 151 | var(--jp-shadow-base-lightness), 152 | var(--jp-shadow-base-lightness), 153 | 0.12 154 | ); 155 | --jp-shadow-penumbra-color: rgba( 156 | var(--jp-shadow-base-lightness), 157 | var(--jp-shadow-base-lightness), 158 | var(--jp-shadow-base-lightness), 159 | 0.14 160 | ); 161 | --jp-shadow-umbra-color: rgba( 162 | var(--jp-shadow-base-lightness), 163 | var(--jp-shadow-base-lightness), 164 | var(--jp-shadow-base-lightness), 165 | 0.2 166 | ); 167 | --jp-sidebar-min-width: 250px; 168 | --jp-success-color2: var(--md-green-300); 169 | --jp-success-color3: var(--md-green-100); 170 | --jp-toolbar-active-background: var(--md-grey-300); 171 | --jp-toolbar-background: var(--jp-layout-color1); 172 | --jp-toolbar-border-color: var(--jp-border-color1); 173 | --jp-toolbar-header-margin: 4px 4px 0px 4px; 174 | --jp-toolbar-micro-height: 8px; 175 | --jp-ui-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, 176 | sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; 177 | --jp-ui-font-scale-factor: 1.2; 178 | --jp-ui-font-size0: 0.83333em; 179 | --jp-ui-font-size1: 13px; /* Base font size */ 180 | --jp-ui-font-size2: 1.2em; 181 | --jp-ui-font-size3: 1.44em; 182 | --jp-warn-color2: var(--md-orange-300); 183 | --jp-warn-color3: var(--md-orange-100); 184 | } 185 | -------------------------------------------------------------------------------- /packages/brand/style/index.css: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | | Distributed under the terms of the BSD-3-Clause License. 4 | */ 5 | @import './fonts.css'; 6 | @import './brand.css'; 7 | @import './variables.css'; 8 | @import './presentation.css'; 9 | 10 | /* code */ 11 | tt, 12 | code, 13 | kbd, 14 | samp, 15 | pre { 16 | font-family: var(--jp-code-font-family); 17 | line-height: var(--jp-code-line-height); 18 | } 19 | 20 | tt, 21 | code, 22 | kbd, 23 | samp, 24 | pre { 25 | font-family: var(--jp-code-font-family); 26 | line-height: var(--jp-code-line-height); 27 | } 28 | 29 | div.CodeMirror span.CodeMirror-matchingbracket { 30 | color: var(--gt-blue-link-hover); 31 | } 32 | 33 | .CodeMirror-cursor { 34 | border-left-width: var(--jp-code-cursor-width0); 35 | } 36 | 37 | /* headings */ 38 | h1, 39 | h2, 40 | h3, 41 | h4, 42 | h5, 43 | h6 { 44 | font-family: var(--gt-font-secondary); 45 | font-weight: 700; 46 | color: var(--gtc-header-color); 47 | } 48 | 49 | /* menu */ 50 | #jp-MainLogo { 51 | background-image: url('./img/wordmark.svg'); 52 | background-size: 24px; 53 | background-repeat: no-repeat; 54 | background-position: center; 55 | } 56 | 57 | #jp-MainLogo g { 58 | visibility: hidden; 59 | } 60 | 61 | /* selected icons */ 62 | .jp-DirListing-item.jp-mod-selected .jp-icon-selectable[fill], 63 | #setting-editor .jp-PluginList li.jp-mod-selected .jp-icon-selectable[fill], 64 | .jp-FileBrowser-toolbar.jp-Toolbar 65 | .jp-Toolbar-item:first-child 66 | .jp-ToolbarButtonComponent 67 | .jp-icon3, 68 | .jp-Completer-item.jp-mod-active .jp-icon-selectable[fill], 69 | .jp-Completer-item.jp-mod-active svg path[fill] { 70 | fill: var(--jp-layout-color0); 71 | } 72 | 73 | [data-command='help:open'] { 74 | color: var(--jp-warn-color0); 75 | } 76 | 77 | .p-Menu-itemShortcut:not(:empty) { 78 | font-family: var(--jp-code-font-family); 79 | color: var(--jp-ui-font-color2); 80 | font-size: var(--jp-ui-font-size0); 81 | padding: 0.125em 0.5em; 82 | text-align: center; 83 | } 84 | 85 | /* commands */ 86 | .lm-CommandPalette-wrapper::after { 87 | background-color: var(--gt-gold-buzz-60); 88 | } 89 | 90 | /* files */ 91 | .jp-DirListing-item.jp-mod-selected { 92 | font-weight: 700; 93 | color: var(--jp-layout-color0); 94 | } 95 | 96 | /* running */ 97 | .jp-DirListing-item.jp-mod-running .jp-DirListing-itemIcon:before { 98 | color: var(--gtc-running-color); 99 | font-size: var(--jp-ui-font-size0); 100 | left: -0.75em !important; 101 | content: var(--gt-chevron); 102 | } 103 | 104 | .jp-DirListing-item.jp-mod-running.jp-mod-selected .jp-DirListing-itemIcon:before { 105 | color: var(--jp-layout-color0); 106 | } 107 | 108 | /* launcher */ 109 | .jp-Launcher-body { 110 | display: flex; 111 | flex-direction: row; 112 | overflow: hidden; 113 | position: relative; 114 | --gt-launcher-cwd-height: calc(var(--jp-ui-font-size1) * 4); 115 | } 116 | 117 | .jp-Launcher-content { 118 | flex: 1; 119 | overflow-y: auto; 120 | width: 100%; 121 | display: flex; 122 | flex-wrap: wrap; 123 | padding-top: var(--gt-launcher-cwd-height); 124 | } 125 | 126 | .jp-Launcher-cwd { 127 | position: absolute; 128 | right: 1em; 129 | top: 0; 130 | left: var(--jp-private-launcher-side-padding); 131 | height: var(--gt-launcher-cwd-height); 132 | } 133 | 134 | .jp-Launcher-cwd > *:first-child:not(:empty) { 135 | background: var(--jp-layout-color0); 136 | margin: 0; 137 | padding: 1em 0; 138 | } 139 | 140 | .jp-Launcher-section { 141 | flex: 1; 142 | display: flex; 143 | flex-direction: column; 144 | align-self: flex-start; 145 | } 146 | 147 | .jp-Launcher-cardContainer { 148 | flex-direction: row; 149 | flex-wrap: wrap; 150 | } 151 | 152 | .jp-LauncherCard { 153 | width: calc(var(--jp-private-launcher-card-size) * 1.618); 154 | background-color: var(--jp-layout-color0); 155 | } 156 | 157 | .jp-LauncherCard:hover, 158 | .jp-LauncherCard:focus { 159 | background-color: var(--jp-layout-color2); 160 | } 161 | 162 | .jp-LauncherCard-label p { 163 | font-size: var(--jp-ui-font-size1); 164 | font-weight: 700; 165 | } 166 | 167 | /* settings */ 168 | #setting-editor .jp-PluginList li.jp-mod-selected { 169 | color: var(--jp-layout-color0); 170 | font-weight: 700; 171 | } 172 | 173 | /* meta */ 174 | input.add-tag { 175 | min-width: 5em; 176 | } 177 | 178 | .tag.applied-tag:hover { 179 | text-decoration: line-through; 180 | background-color: var(--jp-warn-color0); 181 | color: var(--jp-layout-color0); 182 | } 183 | 184 | .tag.applied-tag:hover svg { 185 | opacity: 0; 186 | transition: opacity 0.2s; 187 | } 188 | 189 | /* simple */ 190 | .jp-LabShell[data-shell-mode='single-document'] 191 | .lm-MenuBar.lm-mod-active 192 | .lm-MenuBar-item.lm-mod-active { 193 | border-top: var(--jp-border-width) solid var(--gt-gold-buzz); 194 | } 195 | 196 | /* switch */ 197 | .jp-switch { 198 | height: unset; 199 | } 200 | 201 | .jp-switch-track { 202 | background-color: var(--jp-layout-color4); 203 | width: 2em; 204 | height: 1em; 205 | margin-right: 0.1em; 206 | } 207 | 208 | .jp-switch-track::before { 209 | background-color: var(--gt-navy); 210 | width: 1em; 211 | height: 1em; 212 | margin: 0; 213 | border: 0; 214 | top: 0; 215 | left: 0; 216 | } 217 | 218 | .jp-switch[aria-checked='true'] .jp-switch-track { 219 | background-color: var(--jp-layout-color4); 220 | } 221 | 222 | .jp-switch[aria-checked='true'] .jp-switch-track::before { 223 | right: 0; 224 | left: unset; 225 | background-color: var(--gt-gold-buzz-60); 226 | } 227 | 228 | /* debugger */ 229 | .jp-DebuggerCallstack-body ul li.selected { 230 | font-weight: 700; 231 | color: var(--jp-layout-color0); 232 | } 233 | 234 | .jp-DebuggerVariables-body ul li { 235 | font-family: var(--jp-code-font-family); 236 | } 237 | 238 | .jp-DebuggerEditor-highlight { 239 | background-color: var(--jp-layout-color2); 240 | border-right: solid 4px var(--gt-gold-buzz); 241 | } 242 | 243 | [data-jp-debugger='true'].jp-Editor .jp-mod-readOnly { 244 | background-color: var(--jp-layout-color0); 245 | } 246 | 247 | [data-jp-debugger='true'] .CodeMirror-gutter-wrapper::after, 248 | .jp-DebuggerEditor-marker::after, 249 | .jp-DebuggerBreakpoint-marker::after { 250 | color: var(--jp-brand-color1); 251 | font-size: var(--jp-ui-font-size0); 252 | content: var(--gt-chevron); 253 | } 254 | 255 | .jp-DebuggerEditor-marker::after { 256 | left: -0.6em; 257 | position: relative; 258 | } 259 | 260 | .jp-DebuggerEditor-marker:hover::after { 261 | opacity: 0.5; 262 | } 263 | 264 | .jp-DebuggerEditor-marker, 265 | .jp-DebuggerBreakpoint-marker { 266 | color: transparent; 267 | font-size: var(--jp-ui-font-size0); 268 | } 269 | 270 | .jp-DebuggerBreakpoints-body { 271 | padding: 0; 272 | } 273 | 274 | .jp-DebuggerBreakpoint { 275 | padding: 0.25em 0.25em 0.25em 0; 276 | font-family: var(--jp-code-font-family); 277 | } 278 | 279 | .jp-DebuggerSidebar .p-SplitPanel-child:nth-last-child(2) { 280 | padding-bottom: 3.25em; 281 | } 282 | 283 | .jp-DebuggerSources-body { 284 | max-height: 100%; 285 | } 286 | 287 | /* html */ 288 | .jp-RenderedHTMLCommon table { 289 | font-size: var(--jp-ui-font-size1); 290 | } 291 | 292 | .jp-RenderedHTMLCommon blockquote { 293 | border-left: 5px solid var(--gt-tertiary-burger-bowl); 294 | } 295 | 296 | /* json */ 297 | .jp-RenderedJSON { 298 | overflow-y: auto; 299 | height: 100%; 300 | } 301 | 302 | .jp-Notebook .jp-RenderedJSON, 303 | .jp-CodeConsole .jp-RenderedJSON { 304 | max-height: 75vh; 305 | } 306 | 307 | .jp-RenderedJSON .filter { 308 | float: right; 309 | margin-right: 0.25em; 310 | opacity: 0.75; 311 | position: sticky; 312 | right: unset; 313 | } 314 | 315 | .jp-RenderedJSON .filter .bp3-input { 316 | background-color: var(--jp-layout-color0) !important; 317 | min-width: 10vw; 318 | max-width: 33%; 319 | } 320 | 321 | /* moonimation */ 322 | #jupyterlab-splash .planet { 323 | background-color: var(--gt-gold) !important; 324 | border: solid 2px var(--gt-navy); 325 | } 326 | 327 | /* widgets */ 328 | .jupyter-widgets { 329 | --jp-widgets-font-size: var(--jp-ui-font-size2); 330 | --jp-widgets-input-background-color: var(--jp-layout-color2); 331 | --jp-widgets-input-color: var(--jp-ui-font-color0); 332 | --jp-widgets-label-color: var(--gtc-widgets-label-color); 333 | --jp-widgets-readout-color: var(--jp-ui-font-color0); 334 | --jp-widgets-slider-active-handle-color: var(--gtc-widgets-label-color); 335 | --jp-widgets-slider-border-width: 2px; 336 | --jp-widgets-slider-handle-background-color: var(--jp-layout-color0); 337 | --jp-widgets-slider-handle-border-color: var(--gtc-widgets-label-color); 338 | --jp-widgets-color: var(--jp-ui-font-color0); 339 | font-family: var(--jp-ui-font-family); 340 | } 341 | 342 | .jupyter-widgets .widget-label { 343 | font-weight: 700; 344 | width: unset; 345 | } 346 | 347 | /* bqplot */ 348 | [data-jp-theme-light='false'], 349 | [data-jp-theme-light='true'] { 350 | --bq-axislabel-font: 16px var(--gt-font-primary); 351 | --bq-axislabel-font-size: 16px; 352 | --bq-content-font-color: var(--gtc-widgets-label-color); 353 | --bq-font: 14px var(--gt-font-secondary); 354 | --bq-font-size: 14px; 355 | --bq-mainheading-font-size: 18px; 356 | --bq-mainheading-font: 18px var(--gt-font-primary); 357 | } 358 | 359 | /* tour */ 360 | .react-joyride__tooltip button[data-action='primary'] { 361 | color: var(--jp-layout-color0) !important; 362 | } 363 | 364 | /* retro */ 365 | #jp-RetroLogo svg { 366 | opacity: 0; 367 | max-width: 2em; 368 | } 369 | 370 | #jp-RetroLogo { 371 | background-image: url(./img/wordmark.svg); 372 | background-size: contain; 373 | background-repeat: no-repeat; 374 | background-position: center; 375 | } 376 | 377 | #spacer-widget { 378 | min-height: 0; 379 | height: 0; 380 | } 381 | -------------------------------------------------------------------------------- /dodo.py: -------------------------------------------------------------------------------- 1 | """automation for jupyterlab-gt-coar-theme""" 2 | # Copyright (c) 2021 University System of Georgia and jupyterlab-gt-coar-theme contributors 3 | # Distributed under the terms of the BSD-3-Clause License. 4 | 5 | import json 6 | import os 7 | import shutil 8 | import subprocess 9 | from datetime import datetime 10 | from hashlib import sha256 11 | from pathlib import Path 12 | 13 | from doit import tools 14 | 15 | os.environ.update( 16 | NODE_OPTS="--max-old-space-size=4096", 17 | PYTHONIOENCODING="utf-8", 18 | PIP_DISABLE_PIP_VERSION_CHECK="1", 19 | ) 20 | 21 | DOIT_CONFIG = { 22 | "backend": "sqlite3", 23 | "verbosity": 2, 24 | "par_type": "thread", 25 | "default_tasks": ["binder"], 26 | } 27 | 28 | 29 | def task_binder(): 30 | """prepare for basic interactive development, as on binder""" 31 | return dict(task_dep=["dev:ext"], actions=[["echo", "ok"]]) 32 | 33 | 34 | def task_setup(): 35 | """ensure a working setup""" 36 | yield dict( 37 | name="js", 38 | doc="ensure local npm dependencies", 39 | uptodate=[tools.config_changed(U.pkg_deps(P.PKG_JSONS))], 40 | actions=[[*C.JLPM, "--prefer-offline"], [*C.LERNA, "bootstrap"]], 41 | targets=[P.YARN_INTEGRITY], 42 | ) 43 | 44 | 45 | def task_build(): 46 | """build intermediate artifacts""" 47 | yield dict( 48 | name="lib", 49 | doc="build the js libs", 50 | file_dep=[P.YARN_INTEGRITY, *P.ALL_TS_SRC, *P.PKG_JSONS, *P.TSCONFIGS], 51 | actions=[[*C.JLPM, "build:lib"]], 52 | targets=[P.TSBUILD], 53 | ) 54 | 55 | yield dict( 56 | name="ext", 57 | doc="build the federated labextension", 58 | actions=[[*C.JLPM, "build:ext"]], 59 | file_dep=[P.TSBUILD, *P.ALL_STYLE], 60 | targets=[*B.EXT_PKGS], 61 | ) 62 | 63 | 64 | def task_dist(): 65 | """build artifacts for distribution""" 66 | for variant, tgz in B.NPM_TGZS.items(): 67 | yield dict( 68 | name=f"tgz:{variant}", 69 | doc=f"build the {variant} npm distribution", 70 | file_dep=[P.TSBUILD, *P.ALL_STYLE, *P.PKG_JSONS, *P.READMES, *P.LICENSES], 71 | actions=[ 72 | (tools.create_folder, [P.DIST]), 73 | tools.CmdAction( 74 | [*C.NPM_PACK, P.PACKAGES / variant], cwd=P.DIST, shell=False 75 | ), 76 | ], 77 | targets=[tgz], 78 | ) 79 | 80 | for cmd, dist in B.PY_DIST_CMD.items(): 81 | yield dict( 82 | name=cmd, 83 | doc=f"build the python {cmd}", 84 | actions=[[*C.SETUP, cmd], [*C.TWINE_CHECK, dist]], 85 | file_dep=[ 86 | *P.ALL_PY_SRC, 87 | *B.EXT_PKGS, 88 | P.README, 89 | P.LICENSE, 90 | P.MANIFEST, 91 | P.SETUP_PY, 92 | P.SETUP_CFG, 93 | ], 94 | targets=[dist], 95 | ) 96 | 97 | def _run_hash(): 98 | # mimic sha256sum CLI 99 | if P.SHA256SUMS.exists(): 100 | P.SHA256SUMS.unlink() 101 | 102 | lines = [] 103 | 104 | for p in B.HASH_DEPS: 105 | if p.parent != P.DIST: 106 | tgt = P.DIST / p.name 107 | if tgt.exists(): 108 | tgt.unlink() 109 | shutil.copy2(p, tgt) 110 | lines += [" ".join([sha256(p.read_bytes()).hexdigest(), p.name])] 111 | 112 | output = "\n".join(lines) 113 | print(output) 114 | P.SHA256SUMS.write_text(output) 115 | 116 | yield dict( 117 | name="hash", 118 | doc="make a hash bundle of the dist artifacts", 119 | actions=[_run_hash], 120 | file_dep=B.HASH_DEPS, 121 | targets=[P.SHA256SUMS], 122 | ) 123 | 124 | 125 | def task_dev(): 126 | """prepare for interactive development""" 127 | yield dict( 128 | name="py", 129 | doc="install python for interactive development", 130 | actions=[ 131 | [ 132 | *C.PIP, 133 | "install", 134 | "-e", 135 | ".", 136 | "--no-deps", 137 | "--ignore-installed", 138 | ] 139 | ], 140 | file_dep=[*B.EXT_PKGS], 141 | ) 142 | 143 | yield dict( 144 | name="ext", 145 | doc="ensure the labextension is symlinked for live development", 146 | actions=[[*C.LAB_EXT, "develop", "--overwrite", "."]], 147 | task_dep=["dev:py"], 148 | ) 149 | 150 | 151 | def task_lab(): 152 | """start jupyterlab""" 153 | return dict( 154 | uptodate=[lambda: False], 155 | task_dep=["dev:ext"], 156 | actions=[[*C.LAB, "--no-browser", "--debug"]], 157 | ) 158 | 159 | 160 | def task_watch(): 161 | """watch typescript sources, rebuilding as files change""" 162 | 163 | def _watch(): 164 | watchers = [ 165 | subprocess.Popen(args) 166 | for args in [ 167 | [*C.JLPM, "watch:lib"], 168 | [*C.JLPM, "watch:ext"], 169 | ] 170 | ] 171 | 172 | def stop(): 173 | [w.terminate() for w in watchers] 174 | [w.wait() for w in watchers] 175 | 176 | try: 177 | watchers[0].wait() 178 | except KeyboardInterrupt: 179 | pass 180 | finally: 181 | stop() 182 | return True 183 | 184 | return dict( 185 | uptodate=[lambda: False], 186 | task_dep=["dev:ext"], 187 | actions=[tools.PythonInteractiveAction(_watch)], 188 | ) 189 | 190 | 191 | def task_lint(): 192 | """apply source formatting and linting""" 193 | yield dict( 194 | name="py", 195 | doc="run basic python formatting/checking", 196 | file_dep=P.ALL_PY, 197 | actions=[ 198 | ["isort", *P.ALL_PY], 199 | ["black", "--quiet", *P.ALL_PY], 200 | ["pyflakes", *P.ALL_PY], 201 | ], 202 | ) 203 | 204 | yield dict( 205 | name="prettier", 206 | doc="format things with prettier", 207 | file_dep=[*P.ALL_PRETTIER, P.YARN_INTEGRITY], 208 | actions=[[*C.JLPM, "--silent", "lint"]], 209 | ) 210 | 211 | def _header(path): 212 | def _check(): 213 | any_text = path.read_text() 214 | problems = [] 215 | if C.COPYRIGHT not in any_text: 216 | problems += [f"{path.relative_to(P.ROOT)} missing copyright info"] 217 | if path != P.LICENSE and C.LICENSE not in any_text: 218 | problems += [f"{path.relative_to(P.ROOT)} missing license info"] 219 | if problems: 220 | print("\n".join(problems)) 221 | return False 222 | return True 223 | 224 | return _check 225 | 226 | for path in P.ALL_HEADERS: 227 | yield dict( 228 | name=f"headers:{path.relative_to(P.ROOT)}", 229 | doc=f"ensure license/copyright on {path.name}", 230 | file_dep=[path], 231 | actions=[_header(path)], 232 | ) 233 | 234 | 235 | class C: 236 | """commands and constants""" 237 | 238 | PYM = ["python", "-m"] 239 | PIP = [*PYM, "pip"] 240 | JP = ["jupyter"] 241 | LAB_EXT = [*JP, "labextension"] 242 | LAB = [*JP, "lab"] 243 | SETUP = ["python", "setup.py"] 244 | NPM_PACK = ["npm", "pack"] 245 | TWINE_CHECK = [*PYM, "twine", "check"] 246 | JLPM = ["jlpm"] 247 | LERNA = [*JLPM, "lerna"] 248 | ENC = dict(encoding="utf-8") 249 | 250 | # the first one will be used for various metadata tasks 251 | VARIANTS = ["dark", "light"] 252 | 253 | JS_TGZ_PREFIX = "gt-coar-jupyterlab-theme" 254 | PY_NAME = "jupyterlab-gt-coar-theme" 255 | 256 | # this line is very long, should end with "contributors," but close enough 257 | COPYRIGHT = ( 258 | "Copyright (c) {} " 259 | "University System of Georgia and jupyterlab-gt-coar-theme".format( 260 | datetime.now().year 261 | ) 262 | ) 263 | LICENSE = "Distributed under the terms of the BSD-3-Clause License." 264 | 265 | 266 | class U: 267 | @staticmethod 268 | def clean(paths): 269 | return [p for p in paths if "checkpoints" not in str(p)] 270 | 271 | @staticmethod 272 | def pkg_deps(pkg_jsons): 273 | deps = {} 274 | for pkg_json in pkg_jsons: 275 | pkg = json.loads(pkg_json.read_text(**C.ENC)) 276 | for key in ["dependencies", "devDependencies", "peerDependencies"]: 277 | deps.update(pkg.get(key, {})) 278 | return deps 279 | 280 | 281 | class P: 282 | """paths""" 283 | 284 | DODO = Path(__file__) 285 | ROOT = DODO.parent 286 | 287 | BUILD = ROOT / "build" 288 | DIST = ROOT / "dist" 289 | LIB = ROOT / "lib" 290 | BINDER = ROOT / ".binder" 291 | CI = ROOT / ".github" 292 | 293 | SETUP_PY = ROOT / "setup.py" 294 | SETUP_CFG = ROOT / "setup.cfg" 295 | MANIFEST = ROOT / "MANIFEST.in" 296 | 297 | PACKAGES = ROOT / "packages" 298 | META = PACKAGES / "_meta" 299 | META_PKG_JSON = META / "package.json" 300 | 301 | PKG_JSON = ROOT / "package.json" 302 | A_PKG_JSON = PACKAGES / f"{C.VARIANTS[0]}/package.json" 303 | PKG_JSONS = [PKG_JSON, *PACKAGES.glob("*/package.json")] 304 | TSCONFIG = ROOT / "tsconfigbase.json" 305 | TSCONFIGS = [TSCONFIG, *PACKAGES.glob("*/tsconfig.json")] 306 | TSBUILD = META / "tsconfig.tsbuildinfo" 307 | PY_SRC = ROOT / "py_src/jupyterlab_gt_coar_theme" 308 | EXT_DIST = PY_SRC / "labextensions" 309 | 310 | ALL_TS_SRC = sorted(PACKAGES.glob("*/src/*.ts")) 311 | ALL_PY_SRC = sorted(PY_SRC.rglob("*.py")) 312 | ALL_PY = [*ALL_PY_SRC, DODO] 313 | ALL_CSS = [*PACKAGES.rglob("*/style/**/*.css")] 314 | ALL_JSON = [ 315 | *ROOT.glob("*.json"), 316 | *PACKAGES.glob("*/*.json"), 317 | *BINDER.rglob("*.json"), 318 | ] 319 | README = ROOT / "README.md" 320 | READMES = [README, *PACKAGES.glob("*/README.md")] 321 | LICENSE = ROOT / "LICENSE.txt" 322 | LICENSES = [LICENSE, *PACKAGES.glob("*/LICENSE.txt")] 323 | ALL_MD = sorted([*ROOT.glob("*.md"), *PACKAGES.glob("*.md")]) 324 | ALL_STYLE = [*ALL_CSS, *PACKAGES.rglob("*/style/**/*.svg")] 325 | ALL_YAML = [*CI.rglob("*.yml"), *BINDER.glob("*.yml")] 326 | ALL_PRETTIER = [*ALL_MD, *ALL_STYLE, *ALL_JSON, *ALL_YAML, *ALL_TS_SRC] 327 | ALL_SHELL = [BINDER / "postBuild"] 328 | ALL_HEADERS = U.clean( 329 | [ 330 | *ALL_PY, 331 | *ALL_CSS, 332 | *ALL_TS_SRC, 333 | *ALL_MD, 334 | *ALL_YAML, 335 | *ALL_SHELL, 336 | LICENSE, 337 | SETUP_CFG, 338 | ] 339 | ) 340 | 341 | YARN_INTEGRITY = ROOT / "node_modules/.yarn-integrity" 342 | WEBPACK_JS = ROOT / "webpack.config.js" 343 | INDEX_CSS = LIB / "index.css" 344 | PLUGIN_JS = LIB / "index.js" 345 | 346 | SHA256SUMS = DIST / "SHA256SUMS" 347 | 348 | 349 | class D: 350 | """data""" 351 | 352 | PKG = json.loads(P.A_PKG_JSON.read_text(encoding="utf-8")) 353 | 354 | 355 | class B: 356 | """builds""" 357 | 358 | EXT_PKGS = [P.EXT_DIST / f"{v}/package.json" for v in C.VARIANTS] 359 | NPM_TGZS = { 360 | v: P.DIST / ("{}-{}-{}.tgz".format(C.JS_TGZ_PREFIX, v, D.PKG["version"])) 361 | for v in [*C.VARIANTS, "brand"] 362 | } 363 | SDIST = P.DIST / ("{}-{}.tar.gz".format(C.PY_NAME, D.PKG["version"])) 364 | WHEEL = P.DIST / ( 365 | "{}-{}-py3-none-any.whl".format(C.PY_NAME.replace("-", "_"), D.PKG["version"]) 366 | ) 367 | HASH_DEPS = [WHEEL, SDIST, *NPM_TGZS.values()] 368 | PY_DIST_CMD = {"sdist": SDIST, "bdist_wheel": WHEEL} 369 | --------------------------------------------------------------------------------