├── js ├── tests │ ├── styleMock.js │ ├── fileMock.js │ ├── assetsTransformer.js │ ├── export.test.js │ ├── activate.test.js │ └── setup.js ├── style │ ├── Vibur.woff2 │ ├── SourceCodePro-Bold.ttf │ ├── SourceCodePro-Regular.ttf │ ├── base.css │ ├── index.css │ ├── fonts.css │ ├── custom.css │ ├── neondreams.css │ ├── style.css │ └── variables.css ├── babel.config.js ├── src │ └── index.js ├── jest.config.js ├── .eslintrc.js └── package.json ├── .vscode └── settings.json ├── docs └── img │ └── Miami Nights.png ├── .github ├── dependabot.yml ├── workflows │ ├── copier.yaml │ └── build.yaml ├── dependabot.yaml ├── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md └── CODE_OF_CONDUCT.md ├── jupyterlab_miami_nights ├── extension │ ├── jupyterlab_miami_nights.json │ └── install.json ├── tests │ └── test_labextension.py └── __init__.py ├── .gitattributes ├── .copier-answers.yaml ├── LICENSE ├── .gitignore ├── pyproject.toml ├── Makefile └── README.md /js/tests/styleMock.js: -------------------------------------------------------------------------------- 1 | module.exports = {}; 2 | -------------------------------------------------------------------------------- /js/tests/fileMock.js: -------------------------------------------------------------------------------- 1 | module.exports = "test-file-stub"; 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "eslint.workingDirectories": ["./js"] 3 | } -------------------------------------------------------------------------------- /js/style/Vibur.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timkpaine/jupyterlab_miami_nights/HEAD/js/style/Vibur.woff2 -------------------------------------------------------------------------------- /docs/img/Miami Nights.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timkpaine/jupyterlab_miami_nights/HEAD/docs/img/Miami Nights.png -------------------------------------------------------------------------------- /js/style/SourceCodePro-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timkpaine/jupyterlab_miami_nights/HEAD/js/style/SourceCodePro-Bold.ttf -------------------------------------------------------------------------------- /js/style/SourceCodePro-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timkpaine/jupyterlab_miami_nights/HEAD/js/style/SourceCodePro-Regular.ttf -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: "weekly" 7 | -------------------------------------------------------------------------------- /jupyterlab_miami_nights/extension/jupyterlab_miami_nights.json: -------------------------------------------------------------------------------- 1 | { 2 | "ServerApp": { 3 | "jpserver_extensions": { 4 | "jupyterlab_miami_nights": true 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /js/tests/assetsTransformer.js: -------------------------------------------------------------------------------- 1 | import {basename} from "path"; 2 | 3 | export function process(src, filename) { 4 | return `module.exports = ${JSON.stringify(basename(filename))};`; 5 | } 6 | -------------------------------------------------------------------------------- /js/tests/export.test.js: -------------------------------------------------------------------------------- 1 | import "isomorphic-fetch"; 2 | 3 | import * as extension from "../src/index"; 4 | 5 | describe("Checks exports", () => { 6 | test("Check extension", () => { 7 | expect(extension); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /js/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | [ 4 | "@babel/preset-env", 5 | { 6 | targets: { 7 | node: "current", 8 | }, 9 | }, 10 | ], 11 | ], 12 | }; -------------------------------------------------------------------------------- /jupyterlab_miami_nights/extension/install.json: -------------------------------------------------------------------------------- 1 | { 2 | "packageManager": "python", 3 | "packageName": "jupyterlab-miami-nights", 4 | "uninstallInstructions": "Use your Python package manager (pip, conda, etc.) to uninstall the package jupyterlab-miami-nights" 5 | } -------------------------------------------------------------------------------- /js/tests/activate.test.js: -------------------------------------------------------------------------------- 1 | import "isomorphic-fetch"; 2 | 3 | import plugin from "../src/index"; 4 | 5 | describe("Checks activate", () => { 6 | test("Check activate", () => { 7 | const {activate} = plugin; 8 | expect(activate); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /js/style/base.css: -------------------------------------------------------------------------------- 1 | /* Set the default typography for monospace elements */ 2 | tt, 3 | code, 4 | kbd, 5 | samp, 6 | pre { 7 | font-family: var(--jp-code-font-family); 8 | font-size: var(--jp-code-font-size); 9 | line-height: var(--jp-code-line-height); 10 | } 11 | -------------------------------------------------------------------------------- /jupyterlab_miami_nights/tests/test_labextension.py: -------------------------------------------------------------------------------- 1 | from jupyterlab_miami_nights import _jupyter_labextension_paths 2 | 3 | 4 | class TestInit: 5 | def test__jupyter_labextension_paths(self): 6 | assert _jupyter_labextension_paths() == [{"dest": "jupyterlab_miami_nights", "src": "labextension"}] 7 | -------------------------------------------------------------------------------- /jupyterlab_miami_nights/__init__.py: -------------------------------------------------------------------------------- 1 | import json 2 | from pathlib import Path 3 | 4 | __version__ = "0.4.3" 5 | 6 | HERE = Path(__file__).parent.resolve() 7 | 8 | with (HERE / "labextension" / "package.json").open() as fid: 9 | data = json.load(fid) 10 | 11 | 12 | def _jupyter_labextension_paths(): 13 | return [{"src": "labextension", "dest": data["name"]}] 14 | -------------------------------------------------------------------------------- /.github/workflows/copier.yaml: -------------------------------------------------------------------------------- 1 | name: Copier Updates 2 | 3 | on: 4 | workflow_dispatch: 5 | schedule: 6 | - cron: "0 5 * * 0" 7 | 8 | jobs: 9 | update: 10 | permissions: 11 | contents: write 12 | pull-requests: write 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions-ext/copier-update@main 16 | with: 17 | token: ${{ secrets.WORKFLOW_TOKEN }} 18 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | examples/* linguist-documentation 2 | docs/* linguist-documentation 3 | *.ipynb linguist-documentation 4 | Makefile linguist-documentation 5 | 6 | *.css text=auto eol=lf 7 | *.html text=auto eol=lf 8 | *.js text=auto eol=lf 9 | *.json text=auto eol=lf 10 | *.less text=auto eol=lf 11 | *.md text=auto eol=lf 12 | *.py text=auto eol=lf 13 | *.toml text=auto eol=lf 14 | *.ts text=auto eol=lf 15 | *.yaml text=auto eol=lf 16 | -------------------------------------------------------------------------------- /js/style/index.css: -------------------------------------------------------------------------------- 1 | /*----------------------------------------------------------------------------- 2 | | Copyright (c) Jupyter Development Team. 3 | | Distributed under the terms of the Modified BSD License. 4 | |----------------------------------------------------------------------------*/ 5 | 6 | @import './variables.css'; 7 | @import './fonts.css'; 8 | @import './style.css'; 9 | @import './custom.css'; 10 | @import './neondreams.css'; 11 | 12 | @import './base.css'; -------------------------------------------------------------------------------- /js/tests/setup.js: -------------------------------------------------------------------------------- 1 | Object.defineProperty(window, "DragEvent", { 2 | value: class DragEvent {}, 3 | }); 4 | 5 | Object.defineProperty(window, "matchMedia", { 6 | writable: true, 7 | value: jest.fn().mockImplementation((query) => ({ 8 | matches: false, 9 | media: query, 10 | onchange: null, 11 | addListener: jest.fn(), // Deprecated 12 | removeListener: jest.fn(), // Deprecated 13 | addEventListener: jest.fn(), 14 | removeEventListener: jest.fn(), 15 | dispatchEvent: jest.fn(), 16 | })), 17 | }); 18 | -------------------------------------------------------------------------------- /.copier-answers.yaml: -------------------------------------------------------------------------------- 1 | # Changes here will be overwritten by Copier 2 | _commit: b74d698 3 | _src_path: https://github.com/python-project-templates/base.git 4 | add_docs: false 5 | add_extension: jupyter 6 | add_wiki: false 7 | email: t.paine154@gmail.com 8 | github: timkpaine 9 | project_description: Combination of VS Code's SynthWave '84 and JupyterLab's Neon 10 | Night, with the glowing of "Neon Dreams" enabled 11 | project_name: jupyterlab miami nights 12 | python_version_primary: '3.11' 13 | team: the jupyterlab miami nights authors 14 | -------------------------------------------------------------------------------- /.github/dependabot.yaml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: "weekly" 7 | labels: 8 | - "part: github_actions" 9 | 10 | - package-ecosystem: "pip" 11 | directory: "/" 12 | schedule: 13 | interval: "monthly" 14 | labels: 15 | - "lang: python" 16 | - "part: dependencies" 17 | 18 | - package-ecosystem: "npm" 19 | directory: "/js" 20 | schedule: 21 | interval: "monthly" 22 | labels: 23 | - "lang: javascript" 24 | - "part: dependencies" 25 | -------------------------------------------------------------------------------- /js/src/index.js: -------------------------------------------------------------------------------- 1 | import {IThemeManager} from "@jupyterlab/apputils"; 2 | 3 | /** 4 | * A flat, 80's neon inspired theme for JupyterLab. 5 | */ 6 | const plugin = { 7 | id: "jupyterlab_miami_nights:plugin", 8 | requires: [IThemeManager], 9 | activate: (app, manager) => { 10 | const style = "jupyterlab_miami_nights/index.css"; 11 | 12 | manager.register({ 13 | name: "JupyterLab Miami Nights", 14 | isLight: false, 15 | themeScrollbars: true, 16 | load: () => manager.loadCSS(style), 17 | unload: () => Promise.resolve(undefined), 18 | }); 19 | }, 20 | autoStart: true, 21 | }; 22 | 23 | export default plugin; 24 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /js/jest.config.js: -------------------------------------------------------------------------------- 1 | const esModules = [ 2 | "@finos", 3 | "@jupyter", 4 | "@jupyterlab", 5 | "@jupyter-widgets", 6 | "@microsoft", 7 | "@rjsf", 8 | "delaunator", 9 | "exenv-es6", 10 | "internmap", 11 | "lib0", 12 | "lodash-es", 13 | "nanoid", 14 | "robust-predicates", 15 | "y-protocols", 16 | ].join("|"); 17 | 18 | module.exports = { 19 | moduleDirectories: ["node_modules", "src", "tests"], 20 | moduleNameMapper: { 21 | "\\.(css|less|sass|scss)$": "/tests/styleMock.js", 22 | "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/tests/fileMock.js", 23 | }, 24 | reporters: [ "default", "jest-junit" ], 25 | setupFiles: ["/tests/setup.js"], 26 | testEnvironment: "jsdom", 27 | transform: { 28 | "^.+\\.jsx?$": "babel-jest", 29 | ".+\\.(css|styl|less|sass|scss)$": "jest-transform-css", 30 | }, 31 | transformIgnorePatterns: [`/node_modules/.pnpm/(?!(${esModules}))`], 32 | }; 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /js/style/fonts.css: -------------------------------------------------------------------------------- 1 | /*----------------------------------------------------------------------------- 2 | | Copyright (c) Jupyter Development Team. 3 | | Distributed under the terms of the Modified BSD License. 4 | |----------------------------------------------------------------------------*/ 5 | 6 | @font-face { 7 | font-family: 'Source Code Pro'; 8 | src: url('SourceCodePro-Regular.ttf') format('truetype'); 9 | font-weight: 400; 10 | font-style: normal; 11 | } 12 | 13 | @font-face { 14 | font-family: 'Source Code Pro'; 15 | src: url('SourceCodePro-Bold.ttf') format('truetype'); 16 | font-weight: 700; 17 | font-style: normal; 18 | } 19 | 20 | @font-face { 21 | font-family: 'Vibur'; 22 | font-style: normal; 23 | font-weight: 400; 24 | src: local('Vibur'), url('Vibur.woff2') format('woff2'); 25 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 26 | } 27 | 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2020, Tim Paine 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /js/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | parser: "@babel/eslint-parser", 3 | extends: ["airbnb-base", "prettier", "plugin:json/recommended"], 4 | plugins: ["prettier", "jest"], 5 | env: { 6 | browser: true, 7 | commonjs: true, 8 | es6: true, 9 | node: true, 10 | jasmine: true, 11 | jest: true, 12 | "jest/globals": true, 13 | }, 14 | parserOptions: { 15 | ecmaVersion: 2017, 16 | ecmaFeatures: {}, 17 | sourceType: "module", 18 | experimentalObjectRestSpread: true, 19 | }, 20 | rules: { 21 | "prettier/prettier": [ 22 | "error", 23 | { 24 | printWidth: 200, 25 | tabWidth: 2, 26 | bracketSpacing: false, 27 | }, 28 | ], 29 | "max-len": [ 30 | "warn", 31 | { 32 | code: 200, 33 | comments: 200, 34 | ignoreTrailingComments: true, 35 | }, 36 | ], 37 | camelcase: "off", 38 | "class-methods-use-this": "off", 39 | "constructor-super": "error", 40 | indent: "off", 41 | "linebreak-style": ["error", "unix"], 42 | "no-const-assign": "error", 43 | "no-nested-ternary": "warn", 44 | "no-this-before-super": "error", 45 | "no-undef": "error", 46 | "no-underscore-dangle": "off", 47 | "no-unreachable": "error", 48 | "no-unused-vars": "warn", 49 | "object-curly-spacing": "off", 50 | quotes: "off", 51 | "spaced-comment": "off", 52 | "valid-typeof": "error", 53 | 54 | "import/extensions": "off", 55 | "import/no-unresolved": "off", 56 | "import/prefer-default-export": "off", 57 | "import/no-extraneous-dependencies": "off", 58 | }, 59 | }; -------------------------------------------------------------------------------- /js/style/custom.css: -------------------------------------------------------------------------------- 1 | /* Custom*/ 2 | 3 | /* Left and top tool bar*/ 4 | .jp-SideBar.p-TabBar, #jp-top-panel { 5 | background-color: rgba(34, 33, 54, 0.65); /* last value is the transparency */ 6 | } 7 | 8 | /* Background */ 9 | 10 | /* Neon NIght Style */ 11 | .jp-LabShell { 12 | background: linear-gradient(to bottom right, rgba(0, 255, 255, 0.25), 13 | rgba(180, 0, 255, 0.25), rgba(140, 0, 255, 0.25), rgba(255, 0, 100, 0.25)); 14 | } 15 | 16 | .lm-DockPanel-tabBar .lm-TabBar-tab.jp-mod-current:before { 17 | background: linear-gradient(to right, 18 | #00000000, #3765e7, #a044ca, #ca44a9, #00000000) 19 | } 20 | 21 | 22 | /* Neon Sunset Style */ 23 | /* .jp-LabShell { 24 | background: linear-gradient(to bottom right, rgb(118 53 222 / 0.5), 25 | rgb(222 53 124 / 55%), rgb(244 218 36 / 0.6)); 26 | } 27 | 28 | .lm-DockPanel-tabBar .lm-TabBar-tab.jp-mod-current:before{ 29 | background: linear-gradient(to right, 30 | #00000000, #7334cb, #f36f8f, #ac7453, #00000000); 31 | } */ 32 | 33 | 34 | /* or use an image as the background */ 35 | /* .jp-LabShell { 36 | background: url('images/background.jpg') center/cover no-repeat; 37 | } 38 | 39 | .lm-DockPanel-tabBar .lm-TabBar-tab.jp-mod-current:before { 40 | background: linear-gradient(to right, 41 | #00000000, #3765e7, #a044ca, #ca44a9, #00000000) 42 | } */ 43 | 44 | 45 | /* Fonts*/ 46 | /* Code font */ 47 | :root { 48 | /* Code font */ 49 | --jp-code-font-family: Monaco, 'Source Code Pro', monospace; 50 | /* Prompt number of cell */ 51 | --jp-cell-prompt-font-family: 'Vibur'; 52 | } 53 | 54 | /* Opened files tab bar */ 55 | .lm-DockPanel-tabBar .lm-TabBar-tab { 56 | font-family: 'Neon Bugler'; 57 | font-size: 14px; 58 | } 59 | 60 | /* Search tool */ 61 | .jp-DocumentSearch-overlay *, .filter .bp3-input { 62 | font-family: 'Neon Bugler'; 63 | font-size: 15px; 64 | } -------------------------------------------------------------------------------- /.github/workflows/build.yaml: -------------------------------------------------------------------------------- 1 | name: Build Status 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - v* 9 | paths-ignore: 10 | - LICENSE 11 | - README.md 12 | pull_request: 13 | branches: 14 | - main 15 | workflow_dispatch: 16 | 17 | concurrency: 18 | group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} 19 | cancel-in-progress: true 20 | 21 | permissions: 22 | contents: read 23 | checks: write 24 | pull-requests: write 25 | 26 | jobs: 27 | build: 28 | runs-on: ${{ matrix.os }} 29 | 30 | strategy: 31 | matrix: 32 | os: [ubuntu-latest] 33 | python-version: ["3.11"] 34 | node-version: [22.x] 35 | 36 | steps: 37 | - uses: actions/checkout@v6 38 | 39 | - uses: actions-ext/python/setup@main 40 | with: 41 | version: ${{ matrix.python-version }} 42 | 43 | - uses: actions-ext/node/setup@main 44 | with: 45 | version: 22.x 46 | 47 | - name: Install dependencies 48 | run: make develop 49 | 50 | - name: Lint 51 | run: make lint 52 | if: matrix.os == 'ubuntu-latest' 53 | 54 | - name: Checks 55 | run: make checks 56 | if: matrix.os == 'ubuntu-latest' 57 | 58 | - name: Build 59 | run: make build 60 | 61 | - name: Test 62 | run: make coverage 63 | if: matrix.os == 'ubuntu-latest' 64 | 65 | - name: Upload test results (Python) 66 | uses: actions/upload-artifact@v6 67 | with: 68 | name: test-results-${{ matrix.os }}-${{ matrix.python-version }}-${{ matrix.node-version }} 69 | path: '**/junit.xml' 70 | if: ${{ always() }} 71 | 72 | - name: Publish Unit Test Results 73 | uses: EnricoMi/publish-unit-test-result-action@v2 74 | with: 75 | files: '**/junit.xml' 76 | if: matrix.os == 'ubuntu-latest' 77 | 78 | - name: Upload coverage 79 | uses: codecov/codecov-action@v5 80 | with: 81 | token: ${{ secrets.CODECOV_TOKEN }} 82 | 83 | - name: Make dist 84 | run: make dist 85 | if: matrix.os == 'ubuntu-latest' 86 | 87 | - uses: actions/upload-artifact@v6 88 | with: 89 | name: dist-${{matrix.os}} 90 | path: dist 91 | if: matrix.os == 'ubuntu-latest' 92 | 93 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.a 8 | *.so 9 | *.obj 10 | *.dll 11 | *.exp 12 | *.lib 13 | 14 | # Distribution / packaging 15 | .Python 16 | build/ 17 | develop-eggs/ 18 | dist/ 19 | downloads/ 20 | eggs/ 21 | .eggs/ 22 | lib/ 23 | lib64/ 24 | parts/ 25 | sdist/ 26 | var/ 27 | wheels/ 28 | pip-wheel-metadata/ 29 | share/python-wheels/ 30 | *.egg-info/ 31 | .installed.cfg 32 | *.egg 33 | MANIFEST 34 | 35 | # PyInstaller 36 | *.manifest 37 | *.spec 38 | 39 | # Installer logs 40 | pip-log.txt 41 | pip-delete-this-directory.txt 42 | 43 | # Unit test / coverage reports 44 | htmlcov/ 45 | .tox/ 46 | .nox/ 47 | .coverage 48 | .coverage.* 49 | .cache 50 | nosetests.xml 51 | coverage.xml 52 | junit.xml 53 | *.cover 54 | *.py,cover 55 | .hypothesis/ 56 | .pytest_cache/ 57 | 58 | # Translations 59 | *.mo 60 | *.pot 61 | 62 | # Django stuff: 63 | *.log 64 | local_settings.py 65 | db.sqlite3 66 | db.sqlite3-journal 67 | 68 | # Flask stuff: 69 | instance/ 70 | .webassets-cache 71 | 72 | # Scrapy stuff: 73 | .scrapy 74 | 75 | # PyBuilder 76 | target/ 77 | 78 | # IPython 79 | profile_default/ 80 | ipython_config.py 81 | 82 | # pyenv 83 | .python-version 84 | 85 | # pipenv 86 | Pipfile.lock 87 | 88 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 89 | __pypackages__/ 90 | 91 | # Celery stuff 92 | celerybeat-schedule 93 | celerybeat.pid 94 | 95 | # SageMath parsed files 96 | *.sage.py 97 | 98 | # Environments 99 | .env 100 | .venv 101 | env/ 102 | venv/ 103 | ENV/ 104 | env.bak/ 105 | venv.bak/ 106 | 107 | # Spyder project settings 108 | .spyderproject 109 | .spyproject 110 | 111 | # Rope project settings 112 | .ropeproject 113 | 114 | # mkdocs documentation 115 | /site 116 | 117 | # mypy 118 | .mypy_cache/ 119 | .dmypy.json 120 | dmypy.json 121 | 122 | # Pyre type checker 123 | .pyre/ 124 | 125 | # Documentation 126 | /site 127 | index.md 128 | docs/_build/ 129 | docs/src/_build/ 130 | docs/api 131 | docs/index.md 132 | docs/html 133 | docs/jupyter_execute 134 | index.md 135 | 136 | # JS 137 | js/coverage 138 | js/dist 139 | js/lib 140 | js/node_modules 141 | js/test-results 142 | js/playwright-report 143 | js/*.tgz 144 | jupyterlab_miami_nights/extension 145 | 146 | # Jupyter 147 | .ipynb_checkpoints 148 | .autoversion 149 | Untitled*.ipynb 150 | !jupyterlab_miami_nights/extension/jupyterlab_miami_nights.json 151 | !jupyterlab_miami_nights/extension/install.json 152 | jupyterlab_miami_nights/nbextension 153 | jupyterlab_miami_nights/labextension 154 | 155 | # Mac 156 | .DS_Store 157 | 158 | # Rust 159 | target 160 | -------------------------------------------------------------------------------- /js/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jupyterlab_miami_nights", 3 | "version": "0.4.3", 4 | "description": "A glowing 80s theme based on Synthwave '84 and JupyterLab's Neon Night theme by yeebc", 5 | "author": "the jupyterlab miami nights authors ", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/timkpaine/jupyterlab_miami_nights.git" 9 | }, 10 | "license": "BSD-3-Clause", 11 | "keywords": [ 12 | "jupyter", 13 | "jupyterlab", 14 | "jupyterlab-extension", 15 | "jupyterlab-theme", 16 | "neon", 17 | "cyberpunk" 18 | ], 19 | "main": "lib/index.js", 20 | "types": "lib/index.d.ts", 21 | "files": [ 22 | "lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}", 23 | "style/**/*.css", 24 | "style/index.js" 25 | ], 26 | "sideEffects": [ 27 | "style/*.css", 28 | "style/index.js" 29 | ], 30 | "directories": { 31 | "lib": "lib/" 32 | }, 33 | "jupyterlab": { 34 | "extension": "lib/index.js", 35 | "themePath": "lib/index.css", 36 | "outputDir": "../jupyterlab_miami_nights/labextension", 37 | "discovery": { 38 | "server": { 39 | "base": { 40 | "name": "jupyterlab_miami_nights" 41 | }, 42 | "managers": [ 43 | "pip" 44 | ] 45 | } 46 | } 47 | }, 48 | "scripts": { 49 | "build:babel": "babel src/ --source-maps --out-dir lib/", 50 | "build:css": "cpy \"style/*\" \"lib/\"", 51 | "build:labextension": "rimraf ../jupyterlab_miami_nights/labextension && jupyter labextension build .", 52 | "build": "pnpm clean && pnpm build:babel && pnpm build:css && pnpm build:labextension", 53 | "clean": "rimraf lib ../jupyterlab_miami_nights/labextension", 54 | "fix": "pnpm run lint --fix", 55 | "lint": "eslint -c .eslintrc.js --ext .js src/ tests/", 56 | "preinstall": "npx only-allow pnpm", 57 | "prepublishOnly": "pnpm run build", 58 | "test": "jest --coverage --collectCoverageFrom=src/*.{js}" 59 | }, 60 | "dependencies": { 61 | "@jupyterlab/application": "^4.4.10", 62 | "@jupyterlab/apputils": "^4.5.10", 63 | "highlight.js": "^11.11.1", 64 | "sanitize-html": "^2.17.0" 65 | }, 66 | "devDependencies": { 67 | "@babel/cli": "^7.28.3", 68 | "@babel/core": "^7.28.5", 69 | "@babel/eslint-parser": "^7.28.5", 70 | "@babel/preset-env": "^7.28.5", 71 | "@jupyterlab/builder": "^4.4.10", 72 | "babel-jest": "^30.2.0", 73 | "cpy-cli": "^6.0.0", 74 | "eslint": "^8.57.1", 75 | "eslint-config-airbnb": "^19.0.4", 76 | "eslint-config-airbnb-base": "^15.0.0", 77 | "eslint-config-prettier": "^10.1.8", 78 | "eslint-plugin-import": "^2.32.0", 79 | "eslint-plugin-jest": "^29.0.1", 80 | "eslint-plugin-json": "^3.1.0", 81 | "eslint-plugin-prettier": "^5.5.4", 82 | "isomorphic-fetch": "^3.0.0", 83 | "jest": "^30.2.0", 84 | "jest-environment-jsdom": "^30.2.0", 85 | "jest-junit": "^16.0.0", 86 | "jest-transform-css": "^6.0.3", 87 | "mkdirp": "^3.0.1", 88 | "prettier": "^3.6.2", 89 | "rimraf": "^6.1.0" 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at t.paine154@gmail.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /js/style/neondreams.css: -------------------------------------------------------------------------------- 1 | 2 | /* glow text */ 3 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.cm-builtin, 4 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.cm-def, 5 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.cm-error, 6 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.cm-keyword, 7 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.cm-line, 8 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.cm-link, 9 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.cm-number, 10 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.cm-property, 11 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.cm-string, 12 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.cm-variable, 13 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.cm-variable-2, 14 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.cm-variable-3, 15 | body[data-jp-theme-name="JupyterLab Miami Nights"] jp-button[title="Switch kernel"], 16 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼp, /* --jp-mirror-editor-meta-color */ 17 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼq, /* --jp-mirror-editor-header-color */ 18 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼr, /* --jp-mirror-editor-header-color */ 19 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼs, /* --jp-mirror-editor-keyword-color */ 20 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼt, /* --jp-mirror-editor-atom-color */ 21 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼu, /* --jp-mirror-editor-number-color */ 22 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼv, /* --jp-mirror-editor-def-color */ 23 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼw, /* --jp-mirror-editor-builtin-color */ 24 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼx, /* --jp-mirror-editor-variable-2-color */ 25 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼy, /* --jp-mirror-editor-punctuation-color */ 26 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼz, /* --jp-mirror-editor-property-color */ 27 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼ10, /* --jp-mirror-editor-operator-color */ 28 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼ11, /* --jp-mirror-editor-comment-color */ 29 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼ12, /* --jp-mirror-editor-string-color */ 30 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼ13, /* --jp-mirror-editor-string-2-color */ 31 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼ14, /* --jp-mirror-editor-bracket-color */ 32 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼ15, /* --jp-mirror-editor-tag-color */ 33 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼ16, /* --jp-mirror-editor-attribute-color */ 34 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼ17, /* --jp-mirror-editor-quote-color */ 35 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼ18, /* --jp-mirror-editor-link-color */ 36 | body[data-jp-theme-name="JupyterLab Miami Nights"] span.ͼ19 37 | { 38 | text-shadow: 0 0 2px #000, 0 0 10px; 39 | } 40 | 41 | /* side bar gradient */ 42 | body[data-jp-theme-name="JupyterLab Miami Nights"] .jp-SideBar .lm-TabBar-tab.lm-mod-current { 43 | background: linear-gradient(to bottom, #fff951 25%, #fc28a8) !important; 44 | } 45 | 46 | /* tab gradient */ 47 | body[data-jp-theme-name="JupyterLab Miami Nights"] .lm-DockPanel-tabBar .lm-TabBar-tab.lm-mod-current { 48 | background: linear-gradient(to right, #fc28a8, #03edf9) !important; 49 | } 50 | 51 | /* tab title font */ 52 | .lm-DockPanel-tabBar .lm-TabBar-tab { 53 | font-family: var(--jp-ui-font-family) !important; 54 | font-size: 14px; 55 | } 56 | 57 | /* tab title font */ 58 | .jp-DocumentSearch-overlay *, .filter .bp3-input { 59 | font-family: var(--jp-ui-font-family) !important; 60 | font-size: 15px; 61 | } 62 | 63 | /* tab title no shadow */ 64 | .lm-DockPanel-tabBar .lm-TabBar-tab:hover:not(.lm-mod-current), 65 | .lm-DockPanel-tabBar .lm-TabBar-tab.lm-mod-current { 66 | color: var(--jp-ui-font-color0) !important; 67 | text-shadow: unset !important; 68 | } 69 | 70 | /* tab x box */ 71 | div.lm-TabBar-tabCloseIcon > svg > g.jp-icon-selectable-inverse { 72 | fill: magenta !important; 73 | } 74 | 75 | /* tab x box */ 76 | div.lm-TabBar-tabCloseIcon > svg > g.jp-icon-selectable { 77 | fill: white !important; 78 | } 79 | 80 | div.lm-TabBar-tabCloseIcon:hover > svg > g.jp-icon-selectable { 81 | fill: cyan !important; 82 | } 83 | 84 | div.lm-TabBar-tabCloseIcon > svg > g.jp-icon-busy { 85 | fill: none !important; 86 | } 87 | 88 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["hatchling", "hatch-js", "jupyterlab>=4,<5"] 3 | build-backend="hatchling.build" 4 | 5 | [project] 6 | name = "jupyterlab-miami-nights" 7 | description = "A glowing 80s theme based on Synthwave '84 and JupyterLab's Neon Night theme by yeebc" 8 | authors = [{name = "the jupyterlab miami nights authors", email = "t.paine154@gmail.com"}] 9 | readme = "README.md" 10 | license = { text = "Apache-2.0" } 11 | version = "0.4.3" 12 | requires-python = ">=3.10" 13 | keywords = [ 14 | "Jupyter", 15 | "JupyterLab", 16 | ] 17 | 18 | classifiers = [ 19 | "Development Status :: 4 - Beta", 20 | "Framework :: Jupyter", 21 | "Framework :: Jupyter :: JupyterLab", 22 | "Programming Language :: Python", 23 | "Programming Language :: Python :: Implementation :: CPython", 24 | "Programming Language :: Python :: Implementation :: PyPy", 25 | "Programming Language :: Python :: 3", 26 | "Programming Language :: Python :: 3.10", 27 | "Programming Language :: Python :: 3.11", 28 | "Programming Language :: Python :: 3.12", 29 | "Programming Language :: Python :: 3.13", 30 | "Programming Language :: Python :: 3.14", 31 | ] 32 | 33 | dependencies = [ 34 | "jupyterlab>=4,<5", 35 | ] 36 | 37 | [project.optional-dependencies] 38 | develop = [ 39 | "build", 40 | "bump-my-version", 41 | "check-manifest", 42 | "codespell>=2.4,<2.5", 43 | "hatch-js", 44 | "hatchling", 45 | "mdformat>=0.7.22,<1.1", 46 | "mdformat-tables>=1", 47 | "jupyterlab>=4,<5", 48 | "pytest", 49 | "pytest-cov", 50 | "ruff>=0.9,<0.15", 51 | "twine", 52 | "wheel", 53 | ] 54 | 55 | [project.scripts] 56 | 57 | [project.urls] 58 | Repository = "https://github.com/timkpaine/jupyterlab_miami_nights" 59 | Homepage = "https://github.com/timkpaine/jupyterlab_miami_nights" 60 | 61 | [tool.bumpversion] 62 | current_version = "0.4.3" 63 | commit = true 64 | tag = true 65 | commit_args = "-s" 66 | 67 | [[tool.bumpversion.files]] 68 | filename = "jupyterlab_miami_nights/__init__.py" 69 | search = '__version__ = "{current_version}"' 70 | replace = '__version__ = "{new_version}"' 71 | 72 | [[tool.bumpversion.files]] 73 | filename = "pyproject.toml" 74 | search = 'version = "{current_version}"' 75 | replace = 'version = "{new_version}"' 76 | 77 | [[tool.bumpversion.files]] 78 | filename = "js/package.json" 79 | search = '"version": "{current_version}"' 80 | replace = '"version": "{new_version}"' 81 | 82 | [tool.check-manifest] 83 | ignore = [ 84 | ".copier-answers.yaml", 85 | "js/pnpm-lock.yaml", 86 | "Makefile", 87 | ".vscode/*", 88 | "jupyterlab_miami_nights/extension/**", 89 | "jupyterlab_miami_nights/labextension/**", 90 | "docs/**/*", 91 | "js/dist/**/*", 92 | "js/lib/*", 93 | ] 94 | 95 | [tool.coverage.run] 96 | branch = true 97 | omit = [ 98 | "jupyterlab_miami_nights/tests/integration/", 99 | ] 100 | [tool.coverage.report] 101 | exclude_also = [ 102 | "raise NotImplementedError", 103 | "if __name__ == .__main__.:", 104 | "@(abc\\.)?abstractmethod", 105 | ] 106 | ignore_errors = true 107 | fail_under = 50 108 | 109 | [tool.hatch.build] 110 | artifacts = [ 111 | "jupyterlab_miami_nights/labextension", 112 | ] 113 | 114 | [tool.hatch.build.sources] 115 | src = "/" 116 | 117 | [tool.hatch.build.targets.sdist] 118 | packages = [ 119 | "jupyterlab_miami_nights", 120 | "js" 121 | ] 122 | exclude = [ 123 | "/js/dist", 124 | "/js/node_modules", 125 | ] 126 | 127 | [tool.hatch.build.targets.wheel] 128 | packages = ["jupyterlab_miami_nights"] 129 | exclude = [ 130 | "/js" 131 | ] 132 | 133 | [tool.hatch.build.targets.wheel.shared-data] 134 | "jupyterlab_miami_nights/labextension" = "share/jupyter/labextensions/jupyterlab_miami_nights" 135 | "jupyterlab_miami_nights/extension/install.json" = "share/jupyter/labextensions/jupyterlab_miami_nights/install.json" 136 | 137 | [tool.hatch.build.hooks.hatch-js] 138 | path = "js" 139 | build_cmd = "build" 140 | tool = "pnpm" 141 | targets = [ 142 | "jupyterlab_miami_nights/labextension/package.json", 143 | ] 144 | 145 | [tool.pytest.ini_options] 146 | addopts = ["-vvv", "--junitxml=junit.xml"] 147 | testpaths = "jupyterlab_miami_nights/tests" 148 | 149 | [tool.ruff] 150 | line-length = 150 151 | 152 | [tool.ruff.lint] 153 | extend-select = ["I"] 154 | 155 | [tool.ruff.lint.isort] 156 | combine-as-imports = true 157 | default-section = "third-party" 158 | known-first-party = ["jupyterlab_miami_nights"] 159 | section-order = ["future", "standard-library", "third-party", "first-party", "local-folder"] 160 | 161 | [tool.ruff.lint.per-file-ignores] 162 | "__init__.py" = ["F401", "F403"] 163 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ######### 2 | # BUILD # 3 | ######### 4 | .PHONY: develop-py develop-js develop 5 | develop-py: 6 | uv pip install -e .[develop] 7 | 8 | develop-js: requirements-js 9 | 10 | develop: develop-js develop-py ## setup project for development 11 | 12 | .PHONY: requirements-py requirements-js requirements 13 | requirements-py: ## install prerequisite python build requirements 14 | python -m pip install --upgrade pip toml 15 | python -m pip install `python -c 'import toml; c = toml.load("pyproject.toml"); print("\n".join(c["build-system"]["requires"]))'` 16 | python -m pip install `python -c 'import toml; c = toml.load("pyproject.toml"); print(" ".join(c["project"]["optional-dependencies"]["develop"]))'` 17 | 18 | requirements-js: ## install prerequisite javascript build requirements 19 | cd js; pnpm install && npx playwright install 20 | 21 | requirements: requirements-js requirements-py ## setup project for development 22 | 23 | .PHONY: build-py build-js build 24 | build-py: 25 | python -m build -w -n 26 | 27 | build-js: 28 | cd js; pnpm build 29 | 30 | build: build-js build-py ## build the project 31 | 32 | .PHONY: install 33 | install: ## install python library 34 | uv pip install . 35 | 36 | ######### 37 | # LINTS # 38 | ######### 39 | .PHONY: lint-py lint-js lint-docs lint lints 40 | lint-py: ## run python linter with ruff 41 | python -m ruff check jupyterlab_miami_nights 42 | python -m ruff format --check jupyterlab_miami_nights 43 | 44 | lint-js: ## run js linter 45 | cd js; pnpm lint 46 | 47 | lint-docs: ## lint docs with mdformat and codespell 48 | python -m mdformat --check README.md 49 | python -m codespell_lib README.md 50 | 51 | lint: lint-js lint-py lint-docs ## run project linters 52 | 53 | # alias 54 | lints: lint 55 | 56 | .PHONY: fix-py fix-js fix-docs fix format 57 | fix-py: ## fix python formatting with ruff 58 | python -m ruff check --fix jupyterlab_miami_nights 59 | python -m ruff format jupyterlab_miami_nights 60 | 61 | fix-js: ## fix js formatting 62 | cd js; pnpm fix 63 | 64 | fix-docs: ## autoformat docs with mdformat and codespell 65 | python -m mdformat README.md 66 | python -m codespell_lib --write README.md 67 | 68 | fix: fix-js fix-py fix-docs ## run project autoformatters 69 | 70 | # alias 71 | format: fix 72 | 73 | ################ 74 | # Other Checks # 75 | ################ 76 | .PHONY: check-manifest checks check 77 | 78 | check-manifest: ## check python sdist manifest with check-manifest 79 | check-manifest -v 80 | 81 | checks: check-manifest 82 | 83 | # alias 84 | check: checks 85 | 86 | ######### 87 | # TESTS # 88 | ######### 89 | .PHONY: test-py tests-py coverage-py 90 | test-py: ## run python tests 91 | python -m pytest -v jupyterlab_miami_nights/tests 92 | 93 | # alias 94 | tests-py: test-py 95 | 96 | coverage-py: ## run python tests and collect test coverage 97 | python -m pytest -v jupyterlab_miami_nights/tests --cov=jupyterlab_miami_nights --cov-report term-missing --cov-report xml 98 | 99 | .PHONY: test-js tests-js coverage-js 100 | test-js: ## run js tests 101 | cd js; pnpm test 102 | 103 | # alias 104 | tests-js: test-js 105 | 106 | coverage-js: test-js ## run js tests and collect test coverage 107 | 108 | .PHONY: test coverage tests 109 | test: test-py test-js ## run all tests 110 | coverage: coverage-py coverage-js ## run all tests and collect test coverage 111 | 112 | # alias 113 | tests: test 114 | 115 | ########### 116 | # VERSION # 117 | ########### 118 | .PHONY: show-version patch minor major 119 | 120 | show-version: ## show current library version 121 | @bump-my-version show current_version 122 | 123 | patch: ## bump a patch version 124 | @bump-my-version bump patch 125 | 126 | minor: ## bump a minor version 127 | @bump-my-version bump minor 128 | 129 | major: ## bump a major version 130 | @bump-my-version bump major 131 | 132 | ######## 133 | # DIST # 134 | ######## 135 | .PHONY: dist dist-py dist-js dist-check publish 136 | 137 | dist-py: ## build python dists 138 | python -m build -w -s 139 | 140 | dist-js: # build js dists 141 | cd js; pnpm pack 142 | 143 | dist-check: ## run python dist checker with twine 144 | python -m twine check dist/* 145 | 146 | dist: clean build dist-js dist-py dist-check ## build all dists 147 | 148 | publish: dist ## publish python assets 149 | 150 | ######### 151 | # CLEAN # 152 | ######### 153 | .PHONY: deep-clean clean 154 | 155 | deep-clean: ## clean everything from the repository 156 | git clean -fdx 157 | 158 | clean: ## clean the repository 159 | rm -rf .coverage coverage cover htmlcov logs build dist *.egg-info 160 | 161 | ############################################################################################ 162 | 163 | .PHONY: help 164 | 165 | # Thanks to Francoise at marmelab.com for this 166 | .DEFAULT_GOAL := help 167 | help: 168 | @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' 169 | 170 | print-%: 171 | @echo '$*=$($*)' 172 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # jupyterlab miami nights 2 | 3 | Combination of VS Code's SynthWave '84 and JupyterLab's [Neon Night](https://github.com/yeebc/jupyterlab-neon-theme), with the glowing of "Neon Dreams" enabled 4 | 5 | 6 | [![Build Status](https://github.com/timkpaine/jupyterlab-miami-nights/actions/workflows/build.yaml/badge.svg?branch=main&event=push)](https://github.com/timkpaine/jupyterlab-miami-nights/actions/workflows/build.yaml) 7 | [![codecov](https://codecov.io/gh/timkpaine/jupyterlab-miami-nights/branch/main/graph/badge.svg)](https://codecov.io/gh/timkpaine/jupyterlab-miami-nights) 8 | [![License](https://img.shields.io/github/license/timkpaine/jupyterlab-miami-nights)](https://github.com/timkpaine/jupyterlab-miami-nights) 9 | [![PyPI](https://img.shields.io/pypi/v/jupyterlab-miami-nights.svg)](https://pypi.python.org/pypi/jupyterlab-miami-nights) 10 | [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/timkpaine/jupyterlab-miami-nights/main?urlpath=lab) 11 | 12 | ## Overview 13 | 14 | - All material changes are implemented in `neondreams.css` 15 | - Override all code elements to glow 16 | - Gradient to Tabs and Sidebar 17 | - Override fonts 18 | 19 | > [!NOTE] 20 | > This library was generated using [copier](https://copier.readthedocs.io/en/stable/) from the [Base Python Project Template repository](https://github.com/python-project-templates/base). 21 | 22 | # original readme below 23 | 24 | ______________________________________________________________________ 25 | 26 | # Jupyterlab Neon Theme 27 | 28 | ![Monthly Downloads](https://img.shields.io/npm/dm/@yeebc/jupyterlab_neon_theme?style=for-the-badge&color=36f9f6) 29 | ![GitHub stars](https://img.shields.io/github/stars/yeebc/jupyterlab-neon-theme?style=for-the-badge&color=fffb00) 30 | ![License](https://img.shields.io/npm/l/@yeebc/jupyterlab_neon_theme?style=for-the-badge&color=ef38e3) 31 | 32 | A flat, 80's neon inspired theme for JupyterLab. 33 | 34 | 35 | 36 | 37 | This theme is hightly inspired by artworks of 80's Neon, Synthwave and Cyberpunk. It is optimized for **long-term use** but colorful and cooool. 38 | 39 | ## Big update 40 | 41 | There is a big update for the color scheme since version 3.0.0. If you are **old users** and don't like the new style, please find the archive [here](https://github.com/yeebc/jupyterlab-neon-theme/tree/archive_version2.x). However, unfortunately it would not be maintained anymore. 42 | 43 | ## Bonuses 44 | 45 | **1. Search tool * Neon billboard** 46 | 47 | 48 | **2. Collapser * Neon light** 49 | 50 | 51 | **3. Scrollbar * FM-84's "Atlas" (only compatible with webKit browsers)** 52 | 53 | 54 | **4. Presentation mode (**Top menu** --> **View** --> **Presention mode**)** 55 | 56 | 57 | ## Customize 58 | 59 | You may don't like the default background or the transparent UI, so codes concerning these controversial designs are separately put into [`custom.css`](https://github.com/yeebc/jupyterlab-neon-theme/tree/master/style/custom.css) and detailly commented for you to customize. 60 | 61 | After you edited css files, please follow instructions in the [Development installation](https://github.com/yeebc/jupyterlab-neon-theme#development-installation) to reinstall. 62 | 63 | ### 1. Transparent left/top bar 64 | 65 | PLease follow the comments to adjust the transparency. 66 | 67 | ### 2. Background 68 | 69 | Two gradient backgrounds, 'Neon Night' and 'Neon Sunset', are provided. The default style is 'Neon Night' and you can uncomment codes to employ 'Neon Sunset' style. 70 | 71 | To use an image as background, uncomment the corresponding part of codes, and change the url to the path of your image. 72 | 73 | ### 3. Fonts 74 | 75 | To change fonts of editor and neon, firstly, add your font files to [`fonts`](https://github.com/yeebc/jupyterlab-neon-theme/tree/master/style/fonts) directory and update [`fonts.css`](https://github.com/yeebc/jupyterlab-neon-theme/blob/master/style/fonts.css) to register them. Then follow my comments to employ your registered fonts. 76 | 77 | ## Compatibility 78 | 79 | To support gradient scrollbars showed in screenshots, **webKit browsers** like chrome are required. Otherwise, please activate the **Theme Scrollbars** in the **Top menu** --> **Settings** --> **JupyterLab Theme** for dark scrollbars (except **Edge**). This color scheme is primarily designed for python and ipynb, so there may be issues in other situations. If any problem you find, please report it to me in the [Github](https://github.com/yeebc/jupyterlab-neon-theme/issues) and I'll try to fix it as soon as possible. 80 | 81 | ## Prerequisites 82 | 83 | - JupyterLab >= 2.0.0 84 | 85 | This theme is an extension of Jupyterlab. In order to install JupyterLab extensions, you need to have Node.js installed and enable the **Extension Manager** which is disabled by default. More information can be found in the [Official User Guide](https://jupyterlab.readthedocs.io/en/stable/user/extensions.html). 86 | 87 | ```bash 88 | conda install -c conda-forge nodejs 89 | ``` 90 | 91 | ## Package installation 92 | 93 | - Using GUI 94 | 95 | You can use the extension manager to find and install this theme for JupyterLab. Please check [Official User Guide](https://jupyterlab.readthedocs.io/en/stable/user/extensions.html#finding-extensions) for detailed instructions. 96 | 97 | - Using the command 98 | 99 | ```bash 100 | jupyter labextension install @yeebc/jupyterlab_neon_theme 101 | ``` 102 | 103 | ## Development installation 104 | 105 | For a development install (requires npm version 4 or later), clone this github repo and do the following in the repository directory: 106 | 107 | ```bash 108 | npm install 109 | jupyter labextension link . 110 | ``` 111 | 112 | To rebuild the package and the JupyterLab app: 113 | 114 | ```bash 115 | npm run build 116 | jupyter lab build 117 | ``` 118 | 119 | ## Contributing 120 | 121 | I welcome any contribution to this theme. You can get more imfomation about the project structure of JupyterLab theme extensions from [Official Document](https://jupyterlab.readthedocs.io/en/stable/developer/css.html). 122 | 123 | ## Thanks 124 | 125 | You may also like [SynthWave '84](https://github.com/robb0wen/synthwave-vscode), my favorite VS Code theme, with similar style and it is more compatible with HTML & CSS, JS. 126 | 127 | And [Welcome to 1984](https://github.com/juanmnl/vs-1984). 128 | -------------------------------------------------------------------------------- /js/style/style.css: -------------------------------------------------------------------------------- 1 | /* Fix layout color */ 2 | body { 3 | line-height: 1.3077; /* 17px for 13px font */ 4 | } 5 | 6 | #jupyterlab-splash.dark { 7 | background-color: var(--neon-night-bg0); 8 | } 9 | 10 | .cm-s-jupyter .CodeMirror-activeline-background, 11 | .cm-s-jupyter .CodeMirror-gutter, .lm-DockPanel-tabBar .lm-TabBar-tab, 12 | .lm-DockPanel-tabBar .lm-TabBar-tab.lm-mod-current, 13 | .lm-DockPanel-tabBar .lm-TabBar-tab:hover:not(.lm-mod-current) { 14 | background-color: var(--jp-layout-color0); 15 | } 16 | 17 | body, .lm-DockPanel-tabBar, #jp-main-dock-panel, .lm-Menu, .jp-Tooltip{ 18 | background-color: var(--jp-layout-color1); 19 | } 20 | 21 | .lm-MenuBar-item.lm-mod-active, 22 | .lm-MenuBar.lm-mod-active .lm-MenuBar-item.lm-mod-active { 23 | background-color: #5d5b7b54; 24 | } 25 | 26 | #jp-main-dock-panel { 27 | background: transparent; 28 | padding: 4px; 29 | } 30 | 31 | .lm-Menu, .jp-Tooltip { 32 | border: 1px solid #2f2d43; 33 | } 34 | 35 | .f17wptjy { 36 | background-color: #181818; 37 | } 38 | 39 | /* Translucent area */ 40 | .jp-SideBar.lm-TabBar, #jp-top-panel { 41 | backdrop-filter: blur(8px); 42 | -webkit-backdrop-filter: blur(8px); 43 | } 44 | 45 | .jp-SideBar .lm-TabBar-tab, .lm-MenuBar { 46 | background: unset !important; 47 | } 48 | 49 | 50 | /* Brackets */ 51 | div.CodeMirror span.CodeMirror-matchingbracket { 52 | color: var(--neon-night-green0); 53 | border-bottom: 1px solid var(--neon-night-green0); 54 | } 55 | 56 | div.CodeMirror span.CodeMirror-nonmatchingbracket { 57 | color: var(--neon-night-red); 58 | border-bottom: 1px solid var(--neon-night-red); 59 | } 60 | 61 | /*Flat scrollbar */ 62 | /* width */ 63 | ::-webkit-scrollbar { 64 | width: 6px; 65 | height: 6px; 66 | } 67 | 68 | /* Track */ 69 | ::-webkit-scrollbar-track { 70 | background: rgba(0, 0, 0, 0); 71 | } 72 | 73 | /* Handle */ 74 | ::-webkit-scrollbar-thumb { 75 | background:#5d5175; 76 | border-radius: 10px; 77 | min-height: 100px; 78 | } 79 | 80 | ::-webkit-scrollbar-thumb:horizontal:hover, ::-webkit-scrollbar-thumb:horizontal:active { 81 | background: linear-gradient(to right, #fafc32, #f45959, #ef1eaf); 82 | } 83 | 84 | ::-webkit-scrollbar-thumb:vertical:hover, ::-webkit-scrollbar-thumb:vertical:active { 85 | background: linear-gradient(to bottom, #fafc32, #f45959, #ef1eaf); 86 | } 87 | 88 | .widget-slider .ui-slider { 89 | background: linear-gradient(to right, #fafc32, #f45959, #ef1eaf) !important; 90 | border-radius: 4px !important; 91 | } 92 | 93 | /*Fix cursor of horizontal scrollbar*/ 94 | .CodeMirror-hscrollbar { 95 | cursor: auto; 96 | } 97 | 98 | /* Fix notebook style */ 99 | .cm-s-jupyter span.cm-keyword { 100 | font-weight: normal; 101 | } 102 | 103 | .cm-s-jupyter span.cm-variable-2 { 104 | font-weight: bold; 105 | } 106 | 107 | .jp-Cell .jp-InputArea-editor { 108 | padding: 2px 0; 109 | } 110 | 111 | .jp-OutputArea-child .jp-RenderedImage.jp-OutputArea-output{ 112 | text-align: center; 113 | } 114 | 115 | .jp-OutputArea-child .jp-OutputArea-output { 116 | margin-bottom: 3px; 117 | padding: var(--jp-code-padding); 118 | background-color: var(--neon-night-bg1); 119 | border-radius: 5px; 120 | } 121 | 122 | .jp-Cell, .jp-CodeConsole .jp-Cell { 123 | padding: 2px 0; 124 | } 125 | 126 | .jp-Cell.jp-MarkdownCell{ 127 | margin-top: 8px; 128 | } 129 | 130 | .jp-CodeCell.jp-mod-outputsScrolled .jp-Cell-outputArea { 131 | box-shadow: none; 132 | } 133 | 134 | /* Notebook prompt */ 135 | .jp-InputPrompt { 136 | color: var(--neon-night-cyan); 137 | text-shadow: var(--neon-night-text-shadow0); 138 | padding-top: 8px; /* Works well with 13px code size */ 139 | } 140 | 141 | .jp-OutputPrompt { 142 | color: #ffc8e0; 143 | text-shadow: var(--neon-night-text-shadow1); 144 | padding-top: 6px; /* Works well with 13px code size */ 145 | } 146 | 147 | .jp-Notebook .jp-Cell:not(.jp-mod-active) .jp-InputPrompt, 148 | .jp-Notebook .jp-Cell:not(.jp-mod-active) .jp-OutputPrompt { 149 | text-shadow: none; 150 | } 151 | 152 | .jp-NotebookTools .jp-InputPrompt{ 153 | padding-top: 8px; 154 | } 155 | 156 | /* Notebook collapser */ 157 | .jp-Cell .jp-Collapser:hover { 158 | box-shadow: none; 159 | } 160 | 161 | .jp-Cell .jp-Collapser { 162 | opacity: 0; 163 | } 164 | 165 | /* Neon off*/ 166 | .jp-Cell.jp-mod-active .jp-InputCollapser.jp-Cell-inputCollapser, 167 | .jp-InputCollapser.jp-Cell-inputCollapser.jp-Collapser, 168 | .jp-InputCollapser.jp-Cell-inputCollapser.jp-Collapser:hover{ 169 | background: var(--neon-night-blue1); 170 | } 171 | 172 | .jp-Cell.jp-mod-active .jp-OutputCollapser.jp-Cell-outputCollapser, 173 | .jp-OutputCollapser.jp-Cell-outputCollapser.jp-Collapser, 174 | .jp-OutputCollapser.jp-Cell-outputCollapser.jp-Collapser:hover{ 175 | background: var(--neon-night-purple2); 176 | } 177 | 178 | .jp-Cell.jp-mod-active .jp-InputCollapser.jp-Cell-inputCollapser, 179 | .jp-Cell.jp-mod-active .jp-OutputCollapser.jp-Cell-outputCollapser { 180 | transition: box-shadow cubic-bezier(0, 0.2, 0, 0.2) 0.5s, background cubic-bezier(0, 0.2, 0, 0.2) 0.5s; 181 | opacity: 1; 182 | } 183 | 184 | /* Neon on*/ 185 | .jp-Cell.jp-mod-active .jp-InputCollapser.jp-Cell-inputCollapser:hover { 186 | background: var(--neon-night-cyan); 187 | box-shadow: 0 0 1px, 0 0 15px #0225ff, 0 0 5px 0.1px #0225ff, inset 0 0 1px 0.2px #0225ff; 188 | } 189 | 190 | .jp-Cell.jp-mod-active .jp-OutputCollapser.jp-Cell-outputCollapser:hover { 191 | background: #ffc8e0; 192 | box-shadow: 0 0 1px, 0 0 15px #c10165, 0 0 5px 0.1px #c10165, inset 0 0 1px 0.2px #c10165; 193 | } 194 | 195 | span.cm-keyword { 196 | transition: text-shadow cubic-bezier(0, 0.2, 0, 0.2) 0.2s; 197 | } 198 | 199 | span.cm-keyword:hover { 200 | text-shadow: var(--neon-night-text-shadow0); 201 | } 202 | 203 | /* Let's lit neon in the presentation mode~ */ 204 | .jp-mod-presentationMode .jp-Notebook span.cm-keyword { 205 | text-shadow: var(--neon-night-text-shadow0); 206 | } 207 | 208 | /* Console */ 209 | .jp-CodeConsole-content .jp-Cell .jp-Collapser:hover { 210 | opacity: 1; 211 | box-shadow: none; 212 | } 213 | 214 | .jp-ConsolePanel::before { 215 | border-bottom: none; 216 | box-shadow: none; 217 | } 218 | 219 | /* Top, side, bottom bar */ 220 | #jp-top-panel { 221 | border-bottom: 1px solid #000; 222 | } 223 | 224 | .jp-SideBar .lm-TabBar-tab:not(.lm-mod-current) .jp-icon3[fill] { 225 | fill: var(--jp-inverse-layout-color4); 226 | } 227 | 228 | .jp-SideBar .lm-TabBar-tab.lm-mod-current .jp-icon3[fill]{ 229 | fill: var(--jp-inverse-layout-color2); 230 | } 231 | 232 | 233 | .jp-SideBar .lm-TabBar-tab:hover:not(.lm-mod-current) .jp-icon3[fill]{ 234 | fill: var(--jp-inverse-layout-color2); 235 | } 236 | 237 | .lm-CommandPalette-itemLabel > mark{ 238 | color: var(--neon-night-cyan); 239 | } 240 | 241 | /* Line numbers */ 242 | .CodeMirror-gutters { 243 | border-right: none; 244 | } 245 | 246 | .CodeMirror-linenumber { 247 | padding: 0 16px; 248 | } 249 | 250 | .jp-Notebook .CodeMirror-linenumber{ 251 | padding: 0 16px 0 8px; 252 | } 253 | 254 | /* Notebook tab bar */ 255 | .lm-DockPanel-tabBar { 256 | background: transparent; 257 | } 258 | 259 | .lm-DockPanel-tabBar .lm-TabBar-tab { 260 | margin-left: 2px; 261 | transition: text-shadow cubic-bezier(0, 0.2, 0, 0.2) 0.2s, color cubic-bezier(0, 0.2, 0, 0.2) 0.2s, 262 | opacity 0.2s; 263 | } 264 | 265 | .lm-DockPanel-tabBar .lm-TabBar-tab.jp-mod-current:before { 266 | top: auto; 267 | bottom: calc(-1 * var(--jp-border-width)); 268 | height: 1.5px; 269 | } 270 | 271 | .lm-DockPanel-tabBar .lm-TabBar-tab.lm-mod-closable > .lm-TabBar-tabCloseIcon { 272 | opacity: 0; 273 | } 274 | 275 | .lm-DockPanel-tabBar .lm-TabBar-tab.lm-mod-closable:hover:not(.lm-mod-current) > .lm-TabBar-tabCloseIcon, 276 | .lm-DockPanel-tabBar .lm-TabBar-tab.lm-mod-closable.lm-mod-current > .lm-TabBar-tabCloseIcon { 277 | opacity: 1; 278 | } 279 | 280 | .jp-Toolbar { 281 | padding: 0; 282 | z-index: 10; 283 | } 284 | 285 | .jp-Toolbar.jp-NotebookPanel-toolbar { 286 | padding: 2px 0; 287 | } 288 | 289 | 290 | .lm-DockPanel-tabBar .lm-TabBar-tab:hover:not(.lm-mod-current), 291 | .lm-DockPanel-tabBar .lm-TabBar-tab.lm-mod-current { 292 | color: #ffeef6; 293 | text-shadow: 0 0 2px #b33576, 0 0 6px #6b2e4e, 0 0 6px #6b2e4e, 2px 2px 1px #000; 294 | opacity: 1; 295 | } 296 | 297 | .lm-DockPanel-tabBar .lm-TabBar-tab { 298 | opacity: 0.6; 299 | } 300 | 301 | /* Search panel */ 302 | .jp-DocumentSearch-overlay { 303 | margin: 16px 16px 0 0; 304 | } 305 | 306 | .jp-DocumentSearch-overlay, .jp-DocumentSearch-overlay-row:first-of-type, 307 | .bp3-input-group.filter { 308 | border: 1.5px solid #eb244f; 309 | box-shadow: 0 0 5px 0 #951430, 0 0 10px 0px #951430, inset 0 0 5px 1px #951430; 310 | } 311 | 312 | .jp-DocumentSearch-overlay-row { 313 | margin-bottom: 0; 314 | } 315 | 316 | .jp-DocumentSearch-overlay-row:first-of-type { 317 | padding: 2px; 318 | } 319 | 320 | .jp-DocumentSearch-input, .filter .bp3-input{ 321 | color: var(--neon-night-green0); 322 | text-shadow: 0 0 5px #23854e, 0 0 5px #23854e, 0 0 2px #23854e; 323 | } 324 | 325 | .jp-DocumentSearch-index-counter { 326 | font-size: 14px; 327 | color: #ffa666; 328 | text-shadow: 0 0 5px #854c23, 0 0 5px #854c23, 0 0 2px #854c23; 329 | } 330 | 331 | .jp-InputGroupAction { 332 | padding: 5px; 333 | } 334 | 335 | /*Rendered text*/ 336 | .jp-RenderedText pre { 337 | color: #dedede; 338 | } 339 | 340 | .jp-RenderedText pre .ansi-red-fg, 341 | .jp-RenderedText pre .ansi-red-bg { 342 | color: var(--neon-night-red); 343 | } 344 | 345 | .jp-RenderedText pre .ansi-red-intense-fg, 346 | .jp-RenderedText pre .ansi-red-intense-bg { 347 | color: var(--neon-night-red); 348 | } 349 | 350 | .jp-RenderedText pre .ansi-blue-fg, 351 | .jp-RenderedText pre .ansi-blue-bg { 352 | color: var(--neon-night-purple1); 353 | } 354 | 355 | .jp-RenderedText pre .ansi-blue-intense-fg, 356 | .jp-RenderedText pre .ansi-blue-intense-bg { 357 | color: var(--neon-night-blue0); 358 | } 359 | 360 | .jp-RenderedText pre .ansi-green-fg, 361 | .jp-RenderedText pre .ansi-green-bg { 362 | color: var(--neon-night-purple3); 363 | } 364 | 365 | .jp-RenderedText pre .ansi-green-intense-fg, 366 | .jp-RenderedText pre .ansi-green-intense-bg { 367 | color: var(--neon-night-purple2); 368 | } 369 | 370 | .jp-RenderedText pre .ansi-yellow-fg, 371 | .jp-RenderedText pre .ansi-yellow-bg { 372 | color: var(--neon-night-yellow); 373 | background-color: var(--neon-night-red-transparent); 374 | } 375 | 376 | .jp-RenderedText pre .ansi-yellow-intense-fg, 377 | .jp-RenderedText pre .ansi-yellow-intense-bg { 378 | color: var(--neon-night-red); 379 | background-color: var(--neon-night-yellow); 380 | } 381 | 382 | .jp-RenderedText pre .ansi-cyan-fg, 383 | .jp-RenderedText pre .ansi-cyan-fg { 384 | color: var(--neon-night-yellow); 385 | } 386 | 387 | .jp-RenderedText pre .ansi-cyan-intense-fg, 388 | .jp-RenderedText pre .ansi-cyan-intense-bg { 389 | color: var(--neon-night-cyan); 390 | } 391 | 392 | .jp-RenderedText pre .ansi-magenta-fg, 393 | .jp-RenderedText pre .ansi-magenta-fg { 394 | color: var(--neon-night-pink); 395 | } 396 | 397 | .jp-RenderedText pre .ansi-magenta-intense-fg, 398 | .jp-RenderedText pre .ansi-magenta-intense-bg { 399 | color: var(--neon-night-peach); 400 | } 401 | 402 | .jp-DirListing-item.jp-mod-running .jp-DirListing-itemIcon:before { 403 | color: var(--neon-night-green0); 404 | } 405 | 406 | #setting-editor .jp-SettingsRawEditor .jp-Toolbar { 407 | padding: 4px; 408 | } 409 | 410 | #setting-editor .jp-PluginList li:hover { 411 | border-color: transparent; 412 | } -------------------------------------------------------------------------------- /js/style/variables.css: -------------------------------------------------------------------------------- 1 | /*----------------------------------------------------------------------------- 2 | | Copyright (c) Jupyter Development Team. 3 | | Distributed under the terms of the Modified BSD License. 4 | |----------------------------------------------------------------------------*/ 5 | 6 | /* 7 | The following CSS variables define the main, public API for styling JupyterLab. 8 | These variables should be used by all plugins wherever possible. In other 9 | words, plugins should not define custom colors, sizes, etc unless absolutely 10 | necessary. This enables users to change the visual theme of JupyterLab 11 | by changing these variables. 12 | 13 | Many variables appear in an ordered sequence (0,1,2,3). These sequences 14 | are designed to work well together, so for example, `--jp-border-color1` should 15 | be used with `--jp-layout-color1`. The numbers have the following meanings: 16 | 17 | * 0: super-primary, reserved for special emphasis 18 | * 1: primary, most important under normal situations 19 | * 2: secondary, next most important under normal situations 20 | * 3: tertiary, next most important under normal situations 21 | 22 | Throughout JupyterLab, we are mostly following principles from Google's 23 | Material Design when selecting colors. We are not, however, following 24 | all of MD as it is not optimized for dense, information rich UIs. 25 | */ 26 | 27 | :root { 28 | /* Basic color scheme*/ 29 | --neon-night-red: #ff0079; 30 | --neon-night-red-transparent: #ff00798a; 31 | --neon-night-blue0: #51cdff; 32 | --neon-night-blue1: #00acff; 33 | --neon-night-yellow: #ffde63; 34 | --neon-night-green0: #00ff98; 35 | --neon-night-green1: #c4f68c; 36 | --neon-night-cyan: #3cfffc; 37 | --neon-night-peach: #ff63a6; 38 | --neon-night-pink: #ff8c8c; 39 | --neon-night-purple0: #ff37f2; 40 | --neon-night-purple1: #a2adff; 41 | --neon-night-purple2: #ff72cf; 42 | --neon-night-purple3: #DF81FC; 43 | --neon-night-purple4: #696092; 44 | --neon-night-purple5: #c375ff; 45 | --neon-night-orange: #ff9246; 46 | --neon-night-fg0: #F8F8F2; 47 | --neon-night-bg0: #211d35; 48 | --neon-night-bg1: #2f2a46; 49 | --neon-night-bg2: #3a2e6b; 50 | 51 | --neon-night-text-shadow0: 0 0 2px #0225ff, 0 0 6px #0225ff, 0 0 6px #0225ff, 2px 2px 1px #000; 52 | --neon-night-text-shadow1: 0 0 2px #c10165, 0 0 6px #c10165, 0 0 6px #c10165, 2px 2px 1px #000; 53 | 54 | --jp-private-horizontal-tab-height: 28px; 55 | 56 | /* Elevation 57 | * 58 | * We style box-shadows using Material Design's idea of elevation. These particular numbers are taken from here: 59 | * 60 | * https://github.com/material-components/material-components-web 61 | * https://material-components-web.appspot.com/elevation.html 62 | */ 63 | 64 | /* The dark theme shadows need a bit of work, but this will probably also require work on the core layout 65 | * colors used in the theme as well. */ 66 | --jp-shadow-base-lightness: 32; 67 | --jp-shadow-umbra-color: rgba( 68 | var(--jp-shadow-base-lightness), 69 | var(--jp-shadow-base-lightness), 70 | var(--jp-shadow-base-lightness), 71 | 0.2 72 | ); 73 | --jp-shadow-penumbra-color: rgba( 74 | var(--jp-shadow-base-lightness), 75 | var(--jp-shadow-base-lightness), 76 | var(--jp-shadow-base-lightness), 77 | 0.14 78 | ); 79 | --jp-shadow-ambient-color: rgba( 80 | var(--jp-shadow-base-lightness), 81 | var(--jp-shadow-base-lightness), 82 | var(--jp-shadow-base-lightness), 83 | 0.12 84 | ); 85 | --jp-elevation-z0: none; 86 | --jp-elevation-z1: 0 2px 1px -1px var(--jp-shadow-umbra-color), 87 | 0 1px 1px 0 var(--jp-shadow-penumbra-color), 88 | 0 1px 3px 0 var(--jp-shadow-ambient-color); 89 | --jp-elevation-z2: 0 3px 1px -2px var(--jp-shadow-umbra-color), 90 | 0 2px 2px 0 var(--jp-shadow-penumbra-color), 91 | 0 1px 5px 0 var(--jp-shadow-ambient-color); 92 | --jp-elevation-z4: 0 2px 4px -1px var(--jp-shadow-umbra-color), 93 | 0 4px 5px 0 var(--jp-shadow-penumbra-color), 94 | 0 1px 10px 0 var(--jp-shadow-ambient-color); 95 | --jp-elevation-z6: 0 3px 5px -1px var(--jp-shadow-umbra-color), 96 | 0 6px 10px 0 var(--jp-shadow-penumbra-color), 97 | 0 1px 18px 0 var(--jp-shadow-ambient-color); 98 | --jp-elevation-z8: 0 5px 5px -3px var(--jp-shadow-umbra-color), 99 | 0 8px 10px 1px var(--jp-shadow-penumbra-color), 100 | 0 3px 14px 2px var(--jp-shadow-ambient-color); 101 | --jp-elevation-z12: 0 7px 8px -4px var(--jp-shadow-umbra-color), 102 | 0 12px 17px 2px var(--jp-shadow-penumbra-color), 103 | 0 5px 22px 4px var(--jp-shadow-ambient-color); 104 | --jp-elevation-z16: 0 8px 10px -5px var(--jp-shadow-umbra-color), 105 | 0 16px 24px 2px var(--jp-shadow-penumbra-color), 106 | 0 6px 30px 5px var(--jp-shadow-ambient-color); 107 | --jp-elevation-z20: 0 10px 13px -6px var(--jp-shadow-umbra-color), 108 | 0 20px 31px 3px var(--jp-shadow-penumbra-color), 109 | 0 8px 38px 7px var(--jp-shadow-ambient-color); 110 | --jp-elevation-z24: 0 11px 15px -7px var(--jp-shadow-umbra-color), 111 | 0 24px 38px 3px var(--jp-shadow-penumbra-color), 112 | 0 9px 46px 8px var(--jp-shadow-ambient-color); 113 | 114 | /* Borders 115 | * 116 | * The following variables, specify the visual styling of borders in JupyterLab. 117 | */ 118 | 119 | --jp-border-width: 1px; 120 | --jp-border-color0: var(--md-grey-700); 121 | --jp-border-color1: var(--md-grey-700); 122 | --jp-border-color2: var(--md-grey-800); 123 | --jp-border-color3: var(--md-grey-900); 124 | --jp-inverse-border-color: var(--md-grey-600); 125 | --jp-border-radius: 2px; 126 | 127 | /* UI Fonts 128 | * 129 | * The UI font CSS variables are used for the typography all of the JupyterLab 130 | * user interface elements that are not directly user generated content. 131 | * 132 | * The font sizing here is done assuming that the body font size of --jp-ui-font-size1 133 | * is applied to a parent element. When children elements, such as headings, are sized 134 | * in em all things will be computed relative to that body size. 135 | */ 136 | 137 | --jp-ui-font-scale-factor: 1.2; 138 | --jp-ui-font-size0: 0.83333em; 139 | --jp-ui-font-size1: 13px; /* Base font size */ 140 | --jp-ui-font-size2: 1.2em; 141 | --jp-ui-font-size3: 1.44em; 142 | --jp-ui-font-family: system-ui, -apple-system, blinkmacsystemfont, 'Segoe UI', 143 | helvetica, arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 144 | 'Segoe UI Symbol'; 145 | 146 | /* 147 | * Use these font colors against the corresponding main layout colors. 148 | * In a light theme, these go from dark to light. 149 | */ 150 | 151 | /* Defaults use Material Design specification */ 152 | --jp-ui-font-color0: rgba(255, 255, 255, 1); 153 | --jp-ui-font-color1: rgba(255, 255, 255, 0.87); 154 | --jp-ui-font-color2: rgba(255, 255, 255, 0.54); 155 | --jp-ui-font-color3: rgba(255, 255, 255, 0.38); 156 | 157 | /* 158 | * Use these against the brand/accent/warn/error colors. 159 | * These will typically go from light to darker, in both a dark and light theme. 160 | */ 161 | 162 | --jp-ui-inverse-font-color0: rgba(0, 0, 0, 1); 163 | --jp-ui-inverse-font-color1: rgba(0, 0, 0, 0.8); 164 | --jp-ui-inverse-font-color2: rgba(0, 0, 0, 0.5); 165 | --jp-ui-inverse-font-color3: rgba(0, 0, 0, 0.3); 166 | 167 | /* Content Fonts 168 | * 169 | * Content font variables are used for typography of user generated content. 170 | * 171 | * The font sizing here is done assuming that the body font size of --jp-content-font-size1 172 | * is applied to a parent element. When children elements, such as headings, are sized 173 | * in em all things will be computed relative to that body size. 174 | */ 175 | 176 | --jp-content-line-height: 1.6; 177 | --jp-content-font-scale-factor: 1.2; 178 | --jp-content-font-size0: 0.83333em; 179 | --jp-content-font-size1: 14px; /* Base font size */ 180 | --jp-content-font-size2: 1.2em; 181 | --jp-content-font-size3: 1.44em; 182 | --jp-content-font-size4: 1.728em; 183 | --jp-content-font-size5: 2.0736em; 184 | 185 | /* This gives a magnification of about 125% in presentation mode over normal. */ 186 | --jp-content-presentation-font-size1: 17px; 187 | --jp-content-heading-line-height: 1; 188 | --jp-content-heading-margin-top: 1.2em; 189 | --jp-content-heading-margin-bottom: 0.8em; 190 | --jp-content-heading-font-weight: 500; 191 | 192 | /* Defaults use Material Design specification */ 193 | --jp-content-font-color0: rgba(255, 255, 255, 1); 194 | /* OVERRIDE */ 195 | /* --jp-content-font-color1: rgba(255, 255, 255, 1); */ 196 | --jp-content-font-color1: var(--neon-night-fg0); 197 | --jp-content-font-color2: rgba(255, 255, 255, 0.7); 198 | --jp-content-font-color3: rgba(255, 255, 255, 0.5); 199 | /* OVERRIDE */ 200 | /* --jp-content-link-color: var(--md-blue-300); */ 201 | --jp-content-link-color: var(--neon-night-blue0); 202 | --jp-content-font-family: system-ui, -apple-system, blinkmacsystemfont, 203 | 'Segoe UI', helvetica, arial, sans-serif, 'Apple Color Emoji', 204 | 'Segoe UI Emoji', 'Segoe UI Symbol'; 205 | 206 | /* 207 | * Code Fonts 208 | * 209 | * Code font variables are used for typography of code and other monospaces content. 210 | */ 211 | 212 | --jp-code-font-size: 13px; 213 | --jp-code-line-height: 1.3077; /* 17px for 13px base */ 214 | --jp-code-padding: 5px; /* 5px for 13px base, codemirror highlighting needs integer px value */ 215 | /* OVERRIDE */ 216 | /* --jp-code-font-family-default: menlo, consolas, 'DejaVu Sans Mono', monospace; */ 217 | --jp-code-font-family-default: "Source Code Pro", monospace; 218 | --jp-code-font-family: var(--jp-code-font-family-default); 219 | 220 | /* This gives a magnification of about 125% in presentation mode over normal. */ 221 | --jp-code-presentation-font-size: 16px; 222 | 223 | /* may need to tweak cursor width if you change font size */ 224 | --jp-code-cursor-width0: 1.4px; 225 | --jp-code-cursor-width1: 2px; 226 | --jp-code-cursor-width2: 4px; 227 | 228 | /* Layout 229 | * 230 | * The following are the main layout colors use in JupyterLab. In a light 231 | * theme these would go from light to dark. 232 | */ 233 | 234 | /* OVERRIDE */ 235 | /* --jp-layout-color0: #111; */ 236 | /* --jp-layout-color1: var(--md-grey-900); */ 237 | /* --jp-layout-color2: var(--md-grey-800); */ 238 | /* --jp-layout-color3: var(--md-grey-700); */ 239 | /* --jp-layout-color4: var(--md-grey-600); */ 240 | --jp-layout-color0: var(--neon-night-bg0); 241 | --jp-layout-color1: var(--neon-night-bg0); 242 | --jp-layout-color2: var(--neon-night-bg2); 243 | --jp-layout-color3: var(--neon-night-bg0); 244 | --jp-layout-color4: var(--neon-night-orange); 245 | 246 | 247 | 248 | /* Inverse Layout 249 | * 250 | * The following are the inverse layout colors use in JupyterLab. In a light 251 | * theme these would go from dark to light. 252 | */ 253 | 254 | --jp-inverse-layout-color0: white; 255 | --jp-inverse-layout-color1: white; 256 | --jp-inverse-layout-color2: var(--md-grey-200); 257 | --jp-inverse-layout-color3: var(--md-grey-400); 258 | --jp-inverse-layout-color4: var(--md-grey-600); 259 | 260 | /* Brand/accent */ 261 | 262 | /* OVERRIDE */ 263 | /* --jp-brand-color0: var(--md-blue-700); */ 264 | --jp-brand-color0: var(--neon-night-blue0); 265 | /* --jp-brand-color1: var(--md-blue-500); */ 266 | --jp-brand-color1: var(--neon-night-bg2); 267 | --jp-brand-color2: var(--md-blue-300); 268 | --jp-brand-color3: var(--md-blue-100); 269 | --jp-brand-color4: var(--md-blue-50); 270 | --jp-accent-color0: var(--md-green-700); 271 | --jp-accent-color1: var(--md-green-500); 272 | --jp-accent-color2: var(--md-green-300); 273 | --jp-accent-color3: var(--md-green-100); 274 | 275 | /* State colors (warn, error, success, info) */ 276 | 277 | /* OVERRIDE */ 278 | /* --jp-warn-color0: var(--md-orange-700); */ 279 | /* --jp-warn-color1: var(--md-orange-500); */ 280 | /* --jp-warn-color2: var(--md-orange-300); */ 281 | /* --jp-warn-color3: var(--md-orange-100); */ 282 | --jp-warn-color0: var(--neon-night-purple2); 283 | --jp-warn-color1: var(--neon-night-red); 284 | --jp-warn-color2: var(--neon-night-peach); 285 | --jp-warn-color3: var(--neon-night-peach); 286 | --jp-error-color0: var(--md-red-700); 287 | --jp-error-color1: var(--md-red-500); 288 | --jp-error-color2: var(--md-red-300); 289 | --jp-error-color3: var(--md-red-100); 290 | --jp-success-color0: var(--md-green-700); 291 | --jp-success-color1: var(--md-green-500); 292 | --jp-success-color2: var(--md-green-300); 293 | --jp-success-color3: var(--md-green-100); 294 | --jp-info-color0: var(--md-cyan-700); 295 | --jp-info-color1: var(--md-cyan-500); 296 | --jp-info-color2: var(--md-cyan-300); 297 | --jp-info-color3: var(--md-cyan-100); 298 | 299 | /* Cell specific styles */ 300 | 301 | /* OVERRIDE */ 302 | --jp-cell-padding: 5px; 303 | --jp-cell-collapser-width: 8px; 304 | --jp-cell-collapser-min-height: 20px; 305 | --jp-cell-collapser-not-active-hover-opacity: 0.6; 306 | /* --jp-cell-editor-background: var(--jp-layout-color1); */ 307 | --jp-cell-editor-background: var(--neon-night-bg0); 308 | /* --jp-cell-editor-border-color: var(--md-grey-700); */ 309 | --jp-cell-editor-border-color: var(--md-grey-300); 310 | --jp-cell-editor-box-shadow: inset 0 0 2px var(--md-blue-300); 311 | /* --jp-cell-editor-active-background: var(--jp-layout-color0); */ 312 | --jp-cell-editor-active-background: var(--neon-night-bg0); 313 | /* --jp-cell-editor-active-border-color: var(--jp-brand-color1); */ 314 | --jp-cell-editor-active-border-color: var(--jp-brand-color2); 315 | --jp-cell-prompt-width: 64px; 316 | /* --jp-cell-prompt-font-family: var(--jp-code-font-family-default); */ 317 | --jp-cell-prompt-font-family: 'Source Code Pro', monospace; 318 | --jp-cell-prompt-letter-spacing: 0; 319 | --jp-cell-prompt-opacity: 1; 320 | --jp-cell-prompt-not-active-opacity: 1; 321 | /* --jp-cell-prompt-not-active-font-color: var(--md-grey-300); */ 322 | --jp-cell-prompt-not-active-font-color: var(--neon-night-fg0); 323 | /* A custom blend of MD grey and blue 600 324 | * See https://meyerweb.com/eric/tools/color-blend/#546E7A:1E88E5:5:hex */ 325 | --jp-cell-inprompt-font-color: var(--neon-night-cyan); 326 | 327 | /* A custom blend of MD grey and blue 600 328 | * See https://meyerweb.com/eric/tools/color-blend/#546E7A:1E88E5:5:hex */ 329 | --jp-cell-inprompt-font-color: #307fc1; 330 | 331 | /* A custom blend of MD grey and orange 600 332 | * https://meyerweb.com/eric/tools/color-blend/#546E7A:F4511E:5:hex */ 333 | --jp-cell-outprompt-font-color: #bf5b3d; 334 | 335 | /* Notebook specific styles */ 336 | 337 | --jp-notebook-padding: 10px; 338 | --jp-notebook-select-background: var(--jp-layout-color1); 339 | --jp-notebook-multiselected-color: rgba(33, 150, 243, 0.24); 340 | 341 | /* The scroll padding is calculated to fill enough space at the bottom of the 342 | notebook to show one single-line cell (with appropriate padding) at the top 343 | when the notebook is scrolled all the way to the bottom. We also subtract one 344 | pixel so that no scrollbar appears if we have just one single-line cell in the 345 | notebook. This padding is to enable a 'scroll past end' feature in a notebook. 346 | */ 347 | --jp-notebook-scroll-padding: calc( 348 | 100% - var(--jp-code-font-size) * var(--jp-code-line-height) - 349 | var(--jp-code-padding) - var(--jp-cell-padding) - 1px 350 | ); 351 | 352 | /* Rendermime styles */ 353 | 354 | /* OVERRIDE */ 355 | /* --jp-rendermime-error-background: rgba(244, 67, 54, 0.28); */ 356 | /* --jp-rendermime-table-row-background: var(--md-grey-900); */ 357 | /* --jp-rendermime-table-row-hover-background: rgba(3, 169, 244, 0.2); */ 358 | --jp-rendermime-error-background: rgba(244, 67, 54, 0.28); 359 | --jp-rendermime-table-row-background: var(--neon-night-bg1); 360 | --jp-rendermime-table-row-hover-background: var(--jp-brand-color1); 361 | 362 | /* Dialog specific styles */ 363 | 364 | --jp-dialog-background: rgba(0, 0, 0, 0.6); 365 | 366 | /* Console specific styles */ 367 | 368 | --jp-console-padding: 10px; 369 | 370 | /* Toolbar specific styles */ 371 | 372 | --jp-toolbar-border-color: var(--jp-border-color2); 373 | --jp-toolbar-micro-height: 8px; 374 | --jp-toolbar-background: var(--jp-layout-color1); 375 | --jp-toolbar-box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.8); 376 | --jp-toolbar-header-margin: 4px 4px 0 4px; 377 | --jp-toolbar-active-background: var(--jp-layout-color0); 378 | 379 | /* Statusbar specific styles */ 380 | 381 | --jp-statusbar-height: 24px; 382 | 383 | /* Input field styles */ 384 | 385 | /* OVERRIDE */ 386 | /* --jp-input-box-shadow: inset 0 0 2px var(--md-blue-300); */ 387 | /* --jp-input-active-background: var(--jp-layout-color0); */ 388 | /* --jp-input-hover-background: var(--jp-layout-color2); */ 389 | /* --jp-input-background: var(--md-grey-800); */ 390 | /* --jp-input-border-color: var(--jp-inverse-border-color); */ 391 | /* --jp-input-active-border-color: var(--jp-brand-color1); */ 392 | /* --jp-input-active-box-shadow-color: rgba(19, 124, 189, 0.3); */ 393 | --jp-input-box-shadow: inset 0px -1px 0 0px var(--jp-mirror-editor-comment-color), inset 0px 1px 0 0px var(--jp-mirror-editor-comment-color); 394 | --jp-input-active-background: var(--neon-night-bg1); 395 | --jp-input-hover-background: var(--neon-night-bg1); 396 | --jp-input-background: var(--neon-night-bg1); 397 | --jp-input-border-color: var(--jp-border-color1); 398 | --jp-input-active-border-color: var(--jp-brand-color1); 399 | --jp-input-active-box-shadow-color: inset 0px -1px 0 0px var(--jp-mirror-editor-comment-color), inset 0px 1px 0 0px var(--jp-mirror-editor-comment-color); 400 | 401 | /* General editor styles */ 402 | 403 | --jp-editor-selected-background: var(--jp-layout-color2); 404 | --jp-editor-selected-focused-background: rgba(33, 150, 243, 0.24); 405 | /* OVERRIDE */ 406 | /* --jp-editor-cursor-color: var(--jp-ui-font-color0); */ 407 | --jp-editor-cursor-color: var(--neon-night-green0); 408 | 409 | /* Code mirror specific styles */ 410 | 411 | /* OVERRIDE */ 412 | /* --jp-mirror-editor-keyword-color: var(--md-green-500); */ 413 | /* --jp-mirror-editor-atom-color: var(--md-blue-300); */ 414 | /* --jp-mirror-editor-number-color: var(--md-green-400); */ 415 | /* --jp-mirror-editor-def-color: var(--md-blue-600); */ 416 | /* --jp-mirror-editor-variable-color: var(--md-grey-300); */ 417 | /* --jp-mirror-editor-variable-2-color: var(--md-blue-500); */ 418 | /* --jp-mirror-editor-variable-3-color: var(--md-green-600); */ 419 | /* --jp-mirror-editor-punctuation-color: var(--md-blue-400); */ 420 | /* --jp-mirror-editor-property-color: var(--md-blue-400); */ 421 | /* --jp-mirror-editor-operator-color: #a2f; */ 422 | /* --jp-mirror-editor-comment-color: #408080; */ 423 | /* --jp-mirror-editor-string-color: #ff7070; */ 424 | /* --jp-mirror-editor-string-2-color: var(--md-purple-300); */ 425 | /* --jp-mirror-editor-meta-color: #a2f; */ 426 | /* --jp-mirror-editor-qualifier-color: #555; */ 427 | /* --jp-mirror-editor-builtin-color: var(--md-green-600); */ 428 | /* --jp-mirror-editor-bracket-color: #997; */ 429 | /* --jp-mirror-editor-tag-color: var(--md-green-700); */ 430 | /* --jp-mirror-editor-attribute-color: var(--md-blue-700); */ 431 | /* --jp-mirror-editor-header-color: var(--md-blue-500); */ 432 | /* --jp-mirror-editor-quote-color: var(--md-green-300); */ 433 | /* --jp-mirror-editor-link-color: var(--md-blue-700); */ 434 | /* --jp-mirror-editor-error-color: #f00; */ 435 | /* --jp-mirror-editor-hr-color: #999; */ 436 | --jp-mirror-editor-keyword-color: var(--neon-night-cyan); 437 | --jp-mirror-editor-atom-color: var(--neon-night-yellow); 438 | --jp-mirror-editor-number-color: var(--neon-night-green0); 439 | --jp-mirror-editor-def-color: var(--neon-night-yellow); 440 | --jp-mirror-editor-variable-color: var(--neon-night-fg0); 441 | --jp-mirror-editor-variable-2-color: var(--neon-night-purple2); 442 | --jp-mirror-editor-variable-3-color: var(--neon-night-orange); 443 | --jp-mirror-editor-punctuation-color: var(--neon-night-purple1); 444 | --jp-mirror-editor-property-color: var(--neon-night-purple1); 445 | --jp-mirror-editor-operator-color: var(--neon-night-purple0); 446 | --jp-mirror-editor-comment-color: var(--neon-night-purple4); 447 | --jp-mirror-editor-string-color: var(--neon-night-purple5); 448 | --jp-mirror-editor-string-2-color:var(--neon-night-green1); 449 | --jp-mirror-editor-meta-color: var(--neon-night-purple0); 450 | --jp-mirror-editor-qualifier-color: var(--neon-night-pink); 451 | --jp-mirror-editor-builtin-color: var(--neon-night-yellow); 452 | --jp-mirror-editor-bracket-color: var(--neon-night-green0); 453 | --jp-mirror-editor-tag-color: var(--neon-night-cyan); 454 | --jp-mirror-editor-attribute-color: var(--neon-night-green0); 455 | --jp-mirror-editor-header-color: var(--neon-night-purple2); 456 | --jp-mirror-editor-quote-color: var(--neon-night-cyan); 457 | --jp-mirror-editor-link-color: var(--neon-night-blue0); 458 | --jp-mirror-editor-error-color: var(--neon-night-red); 459 | --jp-mirror-editor-hr-color: #999; 460 | 461 | /* 462 | RTC user specific colors. 463 | These colors are used for the cursor, username in the editor, 464 | and the icon of the user. 465 | */ 466 | 467 | --jp-collaborator-color1: #ad4a00; 468 | --jp-collaborator-color2: #7b6a00; 469 | --jp-collaborator-color3: #007e00; 470 | --jp-collaborator-color4: #008772; 471 | --jp-collaborator-color5: #0079b9; 472 | --jp-collaborator-color6: #8b45c6; 473 | --jp-collaborator-color7: #be208b; 474 | 475 | /* Vega extension styles */ 476 | 477 | --jp-vega-background: var(--md-grey-400); 478 | 479 | /* Sidebar-related styles */ 480 | 481 | --jp-sidebar-min-width: 250px; 482 | 483 | /* Search-related styles */ 484 | 485 | --jp-search-toggle-off-opacity: 0.6; 486 | --jp-search-toggle-hover-opacity: 0.8; 487 | --jp-search-toggle-on-opacity: 1; 488 | /* OVERRIDE */ 489 | /* --jp-search-selected-match-background-color: rgb(255, 225, 0); */ 490 | --jp-search-selected-match-background-color: var(--neon-night-green0); 491 | --jp-search-selected-match-color: black; 492 | /* --jp-search-unselected-match-background-color: var( 493 | --jp-inverse-layout-color0 494 | ); */ 495 | --jp-search-unselected-match-color: var(--jp-ui-inverse-font-color0); 496 | --jp-search-unselected-match-background-color: var(--neon-night-orange); 497 | 498 | /* scrollbar related styles. Supports every browser except Edge. */ 499 | 500 | /* colors based on JetBrain's Darcula theme */ 501 | 502 | --jp-scrollbar-background-color: #3f4244; 503 | --jp-scrollbar-thumb-color: 88, 96, 97; /* need to specify thumb color as an RGB triplet */ 504 | --jp-scrollbar-endpad: 3px; /* the minimum gap between the thumb and the ends of a scrollbar */ 505 | 506 | /* hacks for setting the thumb shape. These do nothing in Firefox */ 507 | 508 | --jp-scrollbar-thumb-margin: 3.5px; /* the space in between the sides of the thumb and the track */ 509 | --jp-scrollbar-thumb-radius: 9px; /* set to a large-ish value for rounded endcaps on the thumb */ 510 | 511 | /* Icon colors that work well with light or dark backgrounds */ 512 | /* OVERRIDE */ 513 | /* --jp-icon-contrast-color0: var(--md-purple-600); */ 514 | /* --jp-icon-contrast-color1: var(--md-green-600); */ 515 | /* --jp-icon-contrast-color2: var(--md-pink-600); */ 516 | /* --jp-icon-contrast-color3: var(--md-blue-600); */ 517 | --jp-icon-contrast-color0: var(--neon-night-yellow); 518 | --jp-icon-contrast-color1: var(--neon-night-green0); 519 | --jp-icon-contrast-color2: var(--neon-night-purple1); 520 | --jp-icon-contrast-color3: var(--neon-night-orange); 521 | 522 | 523 | /* Button colors */ 524 | --jp-accept-color-normal: var(--md-blue-700); 525 | --jp-accept-color-hover: var(--md-blue-800); 526 | --jp-accept-color-active: var(--md-blue-900); 527 | --jp-warn-color-normal: var(--md-red-700); 528 | --jp-warn-color-hover: var(--md-red-800); 529 | --jp-warn-color-active: var(--md-red-900); 530 | --jp-reject-color-normal: var(--md-grey-600); 531 | --jp-reject-color-hover: var(--md-grey-700); 532 | --jp-reject-color-active: var(--md-grey-800); 533 | 534 | /* File or activity icons and switch semantic variables */ 535 | --jp-jupyter-icon-color: #f37626; 536 | --jp-notebook-icon-color: #f37626; 537 | --jp-json-icon-color: var(--md-orange-500); 538 | --jp-console-icon-background-color: var(--md-blue-500); 539 | --jp-console-icon-color: white; 540 | --jp-terminal-icon-background-color: var(--md-grey-200); 541 | --jp-terminal-icon-color: var(--md-grey-800); 542 | --jp-text-editor-icon-color: var(--md-grey-200); 543 | --jp-inspector-icon-color: var(--md-grey-200); 544 | --jp-switch-color: var(--md-grey-400); 545 | --jp-switch-true-position-color: var(--md-orange-700); 546 | 547 | 548 | /* Widgets */ 549 | --jp-widgets-slider-handle-background-color: var(--neon-night-yellow); 550 | --jp-widgets-slider-active-handle-color: var(--neon-night-orange); 551 | 552 | } 553 | 554 | --------------------------------------------------------------------------------