jupyterlab-pierre-light 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,29 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, Jeremy Tuloup
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.
package/README.md ADDED
@@ -0,0 +1,14 @@
1
+ # jupyterlab-pierre-light
2
+
3
+ A JupyterLab light theme matching the [Pierre](https://pierre.co) palette, the
4
+ same colors used by the `@pierre/diffs` viewer.
5
+
6
+ ```bash
7
+ pip install jupyterlab-pierre-light
8
+ ```
9
+
10
+ Then choose "Pierre Light" from Settings, Theme.
11
+
12
+ Part of [jupyterlab-pierre-theme](https://github.com/jtpio/jupyterlab-pierre-theme).
13
+ The palette is generated from [`@pierre/theme`](https://www.npmjs.com/package/@pierre/theme)
14
+ (MIT licensed).
package/lib/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { JupyterFrontEndPlugin } from '@jupyterlab/application';
2
+ declare const _default: JupyterFrontEndPlugin<void>[];
3
+ export default _default;
package/lib/index.js ADDED
@@ -0,0 +1,41 @@
1
+ import { IThemeManager } from '@jupyterlab/apputils';
2
+ import { EditorExtensionRegistry, IEditorExtensionRegistry } from '@jupyterlab/codemirror';
3
+ import { pierreSyntaxExtension } from './syntax';
4
+ /**
5
+ * The Pierre Light theme.
6
+ */
7
+ const theme = {
8
+ id: 'jupyterlab-pierre-light:plugin',
9
+ description: 'JupyterLab light theme matching the Pierre palette',
10
+ autoStart: true,
11
+ requires: [IThemeManager],
12
+ activate: (app, manager) => {
13
+ const style = 'jupyterlab-pierre-light/index.css';
14
+ manager.register({
15
+ name: 'Pierre Light',
16
+ isLight: true,
17
+ themeScrollbars: true,
18
+ load: () => manager.loadCSS(style),
19
+ unload: () => Promise.resolve(undefined)
20
+ });
21
+ }
22
+ };
23
+ /**
24
+ * Adds Pierre syntax colors for the CodeMirror tags JupyterLab's highlight
25
+ * style leaves unstyled. The rules are gated by the theme's `--jpp-*`
26
+ * variables (see src/syntax.ts), so registering this globally is safe: it
27
+ * only takes effect while a Pierre theme is active.
28
+ */
29
+ const editorSyntax = {
30
+ id: 'jupyterlab-pierre-light:editor-syntax',
31
+ description: 'Pierre syntax colors for the JupyterLab CodeMirror editor',
32
+ autoStart: true,
33
+ requires: [IEditorExtensionRegistry],
34
+ activate: (app, extensions) => {
35
+ extensions.addExtension({
36
+ name: 'jupyterlab-pierre-light:syntax',
37
+ factory: () => EditorExtensionRegistry.createImmutableExtension(pierreSyntaxExtension)
38
+ });
39
+ }
40
+ };
41
+ export default [theme, editorSyntax];
@@ -0,0 +1,6 @@
1
+ import { type Extension } from '@codemirror/state';
2
+ /**
3
+ * The Pierre editor highlight extension, layered on top of JupyterLab's own
4
+ * CodeMirror highlight style.
5
+ */
6
+ export declare const pierreSyntaxExtension: Extension;
package/lib/syntax.js ADDED
@@ -0,0 +1,48 @@
1
+ import { HighlightStyle, syntaxHighlighting } from '@codemirror/language';
2
+ import { tags as t } from '@lezer/highlight';
3
+ /**
4
+ * Highlight rules that bring the JupyterLab CodeMirror editor closer to the
5
+ * `@pierre/diffs` viewer. JupyterLab's default highlight style (in
6
+ * `@jupyterlab/codemirror`) leaves several tokens unstyled (type and class
7
+ * names, plain variable references, function calls) and paints booleans, null
8
+ * and keywords as bold keywords; Pierre colors them differently.
9
+ *
10
+ * Every value reads a `--jpp-*` custom property that only the Pierre themes
11
+ * define, so this extension can be registered globally and only takes effect
12
+ * under a Pierre theme:
13
+ *
14
+ * - The gap-filling rules (type, namespace, variable, function) have no
15
+ * JupyterLab rule to compete with. Under another theme the custom property
16
+ * is undefined, the declaration drops to its inherited value, and the token
17
+ * looks exactly as it would without this extension.
18
+ * - The override rules (booleans/null color, keyword weight) do compete with
19
+ * JupyterLab's rules, so they use `!important` to win. Their `var(...)`
20
+ * fallback is JupyterLab's own value, so under another theme they resolve to
21
+ * what JupyterLab already renders and nothing leaks.
22
+ *
23
+ * Note: `undefined` is a plain identifier to CodeMirror's grammar (not a
24
+ * literal like in TextMate), so it follows the variable color rather than the
25
+ * constant color the diff gives it.
26
+ */
27
+ const pierreHighlightStyle = HighlightStyle.define([
28
+ { tag: [t.typeName, t.className], color: 'var(--jpp-tok-type-color)' },
29
+ { tag: t.namespace, color: 'var(--jpp-tok-namespace-color)' },
30
+ { tag: [t.name, t.variableName], color: 'var(--jpp-tok-variable-color)' },
31
+ {
32
+ tag: [t.function(t.variableName), t.function(t.propertyName)],
33
+ color: 'var(--jpp-tok-function-color)'
34
+ },
35
+ {
36
+ tag: [t.bool, t.null],
37
+ color: 'var(--jpp-tok-constant-color, var(--jp-mirror-editor-keyword-color)) !important'
38
+ },
39
+ {
40
+ tag: [t.keyword, t.operator, t.bool, t.null],
41
+ fontWeight: 'var(--jpp-keyword-weight, bold) !important'
42
+ }
43
+ ]);
44
+ /**
45
+ * The Pierre editor highlight extension, layered on top of JupyterLab's own
46
+ * CodeMirror highlight style.
47
+ */
48
+ export const pierreSyntaxExtension = syntaxHighlighting(pierreHighlightStyle);
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "jupyterlab-pierre-light",
3
+ "version": "0.1.0",
4
+ "description": "JupyterLab light theme matching the Pierre palette",
5
+ "keywords": [
6
+ "jupyter",
7
+ "jupyterlab",
8
+ "jupyterlab-extension",
9
+ "theme",
10
+ "pierre"
11
+ ],
12
+ "homepage": "https://github.com/jtpio/jupyterlab-pierre-theme",
13
+ "bugs": {
14
+ "url": "https://github.com/jtpio/jupyterlab-pierre-theme/issues"
15
+ },
16
+ "license": "BSD-3-Clause",
17
+ "author": "Jeremy Tuloup",
18
+ "files": [
19
+ "lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}",
20
+ "style/**/*.{css,js,eot,gif,html,jpg,json,png,svg,woff2,ttf}",
21
+ "src/**/*.{ts,tsx}",
22
+ "!src/**/.ipynb_checkpoints/**"
23
+ ],
24
+ "main": "lib/index.js",
25
+ "types": "lib/index.d.ts",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "https://github.com/jtpio/jupyterlab-pierre-theme.git",
29
+ "directory": "packages/jupyterlab-pierre-light"
30
+ },
31
+ "scripts": {
32
+ "build": "pnpm build:lib && pnpm build:labextension:dev",
33
+ "build:prod": "pnpm clean && pnpm build:lib:prod && pnpm build:labextension",
34
+ "build:labextension": "jupyter-builder build .",
35
+ "build:labextension:dev": "jupyter-builder build --development True .",
36
+ "build:lib": "tsc --sourceMap",
37
+ "build:lib:prod": "tsc",
38
+ "clean": "pnpm clean:lib",
39
+ "clean:lib": "rimraf lib tsconfig.tsbuildinfo",
40
+ "clean:labextension": "rimraf jupyterlab_pierre_light/labextension jupyterlab_pierre_light/_version.py",
41
+ "clean:all": "pnpm clean:lib && pnpm clean:labextension",
42
+ "install:extension": "pnpm build",
43
+ "watch": "run-p watch:src watch:labextension",
44
+ "watch:src": "tsc -w --sourceMap",
45
+ "watch:labextension": "jupyter-builder watch ."
46
+ },
47
+ "dependencies": {
48
+ "@codemirror/language": "^6.0.0",
49
+ "@codemirror/state": "^6.0.0",
50
+ "@jupyterlab/application": "^4.0.0",
51
+ "@jupyterlab/apputils": "^4.0.0",
52
+ "@jupyterlab/codemirror": "^4.0.0",
53
+ "@lezer/highlight": "^1.0.0"
54
+ },
55
+ "devDependencies": {
56
+ "@jupyter/builder": "^1.0.0-beta.1",
57
+ "@jupyterlab/core-meta": "^4.6.0-beta.0",
58
+ "@module-federation/runtime-tools": "^2.0.0",
59
+ "npm-run-all2": "^7.0.1",
60
+ "rimraf": "^5.0.1",
61
+ "typescript": "~5.8.0"
62
+ },
63
+ "sideEffects": [
64
+ "style/*.css"
65
+ ],
66
+ "publishConfig": {
67
+ "access": "public"
68
+ },
69
+ "jupyterlab": {
70
+ "extension": true,
71
+ "outputDir": "jupyterlab_pierre_light/labextension",
72
+ "themePath": "style/index.css"
73
+ }
74
+ }
package/src/index.ts ADDED
@@ -0,0 +1,55 @@
1
+ import {
2
+ JupyterFrontEnd,
3
+ JupyterFrontEndPlugin
4
+ } from '@jupyterlab/application';
5
+
6
+ import { IThemeManager } from '@jupyterlab/apputils';
7
+ import {
8
+ EditorExtensionRegistry,
9
+ IEditorExtensionRegistry
10
+ } from '@jupyterlab/codemirror';
11
+
12
+ import { pierreSyntaxExtension } from './syntax';
13
+
14
+ /**
15
+ * The Pierre Light theme.
16
+ */
17
+ const theme: JupyterFrontEndPlugin<void> = {
18
+ id: 'jupyterlab-pierre-light:plugin',
19
+ description: 'JupyterLab light theme matching the Pierre palette',
20
+ autoStart: true,
21
+ requires: [IThemeManager],
22
+ activate: (app: JupyterFrontEnd, manager: IThemeManager) => {
23
+ const style = 'jupyterlab-pierre-light/index.css';
24
+
25
+ manager.register({
26
+ name: 'Pierre Light',
27
+ isLight: true,
28
+ themeScrollbars: true,
29
+ load: () => manager.loadCSS(style),
30
+ unload: () => Promise.resolve(undefined)
31
+ });
32
+ }
33
+ };
34
+
35
+ /**
36
+ * Adds Pierre syntax colors for the CodeMirror tags JupyterLab's highlight
37
+ * style leaves unstyled. The rules are gated by the theme's `--jpp-*`
38
+ * variables (see src/syntax.ts), so registering this globally is safe: it
39
+ * only takes effect while a Pierre theme is active.
40
+ */
41
+ const editorSyntax: JupyterFrontEndPlugin<void> = {
42
+ id: 'jupyterlab-pierre-light:editor-syntax',
43
+ description: 'Pierre syntax colors for the JupyterLab CodeMirror editor',
44
+ autoStart: true,
45
+ requires: [IEditorExtensionRegistry],
46
+ activate: (app: JupyterFrontEnd, extensions: IEditorExtensionRegistry) => {
47
+ extensions.addExtension({
48
+ name: 'jupyterlab-pierre-light:syntax',
49
+ factory: () =>
50
+ EditorExtensionRegistry.createImmutableExtension(pierreSyntaxExtension)
51
+ });
52
+ }
53
+ };
54
+
55
+ export default [theme, editorSyntax];
package/src/syntax.ts ADDED
@@ -0,0 +1,53 @@
1
+ import { HighlightStyle, syntaxHighlighting } from '@codemirror/language';
2
+ import { type Extension } from '@codemirror/state';
3
+ import { tags as t } from '@lezer/highlight';
4
+
5
+ /**
6
+ * Highlight rules that bring the JupyterLab CodeMirror editor closer to the
7
+ * `@pierre/diffs` viewer. JupyterLab's default highlight style (in
8
+ * `@jupyterlab/codemirror`) leaves several tokens unstyled (type and class
9
+ * names, plain variable references, function calls) and paints booleans, null
10
+ * and keywords as bold keywords; Pierre colors them differently.
11
+ *
12
+ * Every value reads a `--jpp-*` custom property that only the Pierre themes
13
+ * define, so this extension can be registered globally and only takes effect
14
+ * under a Pierre theme:
15
+ *
16
+ * - The gap-filling rules (type, namespace, variable, function) have no
17
+ * JupyterLab rule to compete with. Under another theme the custom property
18
+ * is undefined, the declaration drops to its inherited value, and the token
19
+ * looks exactly as it would without this extension.
20
+ * - The override rules (booleans/null color, keyword weight) do compete with
21
+ * JupyterLab's rules, so they use `!important` to win. Their `var(...)`
22
+ * fallback is JupyterLab's own value, so under another theme they resolve to
23
+ * what JupyterLab already renders and nothing leaks.
24
+ *
25
+ * Note: `undefined` is a plain identifier to CodeMirror's grammar (not a
26
+ * literal like in TextMate), so it follows the variable color rather than the
27
+ * constant color the diff gives it.
28
+ */
29
+ const pierreHighlightStyle = HighlightStyle.define([
30
+ { tag: [t.typeName, t.className], color: 'var(--jpp-tok-type-color)' },
31
+ { tag: t.namespace, color: 'var(--jpp-tok-namespace-color)' },
32
+ { tag: [t.name, t.variableName], color: 'var(--jpp-tok-variable-color)' },
33
+ {
34
+ tag: [t.function(t.variableName), t.function(t.propertyName)],
35
+ color: 'var(--jpp-tok-function-color)'
36
+ },
37
+ {
38
+ tag: [t.bool, t.null],
39
+ color:
40
+ 'var(--jpp-tok-constant-color, var(--jp-mirror-editor-keyword-color)) !important'
41
+ },
42
+ {
43
+ tag: [t.keyword, t.operator, t.bool, t.null],
44
+ fontWeight: 'var(--jpp-keyword-weight, bold) !important'
45
+ }
46
+ ]);
47
+
48
+ /**
49
+ * The Pierre editor highlight extension, layered on top of JupyterLab's own
50
+ * CodeMirror highlight style.
51
+ */
52
+ export const pierreSyntaxExtension: Extension =
53
+ syntaxHighlighting(pierreHighlightStyle);
package/style/base.css ADDED
@@ -0,0 +1,18 @@
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
+
12
+ /* Override FAST design system variables for tree items so the file browser
13
+ * rows follow the theme's layout colors. */
14
+ jp-tree-item.jp-TreeItem {
15
+ --neutral-fill-stealth-rest: var(--jp-layout-color1) !important;
16
+ --neutral-fill-stealth-hover: var(--jp-layout-color2) !important;
17
+ --neutral-fill-stealth-active: var(--jp-layout-color1) !important;
18
+ }
@@ -0,0 +1,2 @@
1
+ @import url('./variables.css');
2
+ @import url('./base.css');
@@ -0,0 +1,352 @@
1
+ /* ----------------------------------------------------------------------------
2
+ | Pierre theme for JupyterLab.
3
+ |
4
+ | Generated by scripts/generate-theme.mjs from @pierre/theme (pierre-light).
5
+ | Do not edit by hand; run "pnpm generate" to regenerate.
6
+ |--------------------------------------------------------------------------- */
7
+
8
+ :root {
9
+ /* Elevation */
10
+ --jp-shadow-base-lightness: 240;
11
+ --jp-shadow-umbra-color: rgba(
12
+ var(--jp-shadow-base-lightness),
13
+ var(--jp-shadow-base-lightness),
14
+ var(--jp-shadow-base-lightness),
15
+ 0.2
16
+ );
17
+ --jp-shadow-penumbra-color: rgba(
18
+ var(--jp-shadow-base-lightness),
19
+ var(--jp-shadow-base-lightness),
20
+ var(--jp-shadow-base-lightness),
21
+ 0.14
22
+ );
23
+ --jp-shadow-ambient-color: rgba(
24
+ var(--jp-shadow-base-lightness),
25
+ var(--jp-shadow-base-lightness),
26
+ var(--jp-shadow-base-lightness),
27
+ 0.12
28
+ );
29
+ --jp-elevation-z0: none;
30
+ --jp-elevation-z1:
31
+ 0 2px 1px -1px var(--jp-shadow-umbra-color),
32
+ 0 1px 1px 0 var(--jp-shadow-penumbra-color),
33
+ 0 1px 3px 0 var(--jp-shadow-ambient-color);
34
+ --jp-elevation-z2:
35
+ 0 3px 1px -2px var(--jp-shadow-umbra-color),
36
+ 0 2px 2px 0 var(--jp-shadow-penumbra-color),
37
+ 0 1px 5px 0 var(--jp-shadow-ambient-color);
38
+ --jp-elevation-z4:
39
+ 0 2px 4px -1px var(--jp-shadow-umbra-color),
40
+ 0 4px 5px 0 var(--jp-shadow-penumbra-color),
41
+ 0 1px 10px 0 var(--jp-shadow-ambient-color);
42
+ --jp-elevation-z6:
43
+ 0 3px 5px -1px var(--jp-shadow-umbra-color),
44
+ 0 6px 10px 0 var(--jp-shadow-penumbra-color),
45
+ 0 1px 18px 0 var(--jp-shadow-ambient-color);
46
+ --jp-elevation-z8:
47
+ 0 5px 5px -3px var(--jp-shadow-umbra-color),
48
+ 0 8px 10px 1px var(--jp-shadow-penumbra-color),
49
+ 0 3px 14px 2px var(--jp-shadow-ambient-color);
50
+ --jp-elevation-z12:
51
+ 0 7px 8px -4px var(--jp-shadow-umbra-color),
52
+ 0 12px 17px 2px var(--jp-shadow-penumbra-color),
53
+ 0 5px 22px 4px var(--jp-shadow-ambient-color);
54
+ --jp-elevation-z16:
55
+ 0 8px 10px -5px var(--jp-shadow-umbra-color),
56
+ 0 16px 24px 2px var(--jp-shadow-penumbra-color),
57
+ 0 6px 30px 5px var(--jp-shadow-ambient-color);
58
+ --jp-elevation-z20:
59
+ 0 10px 13px -6px var(--jp-shadow-umbra-color),
60
+ 0 20px 31px 3px var(--jp-shadow-penumbra-color),
61
+ 0 8px 38px 7px var(--jp-shadow-ambient-color);
62
+ --jp-elevation-z24:
63
+ 0 11px 15px -7px var(--jp-shadow-umbra-color),
64
+ 0 24px 38px 3px var(--jp-shadow-penumbra-color),
65
+ 0 9px 46px 8px var(--jp-shadow-ambient-color);
66
+
67
+ /* Borders */
68
+ --jp-border-width: 1px;
69
+ --jp-border-radius: 2px;
70
+ --jp-border-color0: #d4d4d4;
71
+ --jp-border-color1: #d4d4d4;
72
+ --jp-border-color2: #e5e5e5;
73
+ --jp-border-color3: #ededed;
74
+ --jp-inverse-border-color: #d4d4d4;
75
+
76
+ /* UI Fonts */
77
+ --jp-ui-font-scale-factor: 1.2;
78
+ --jp-ui-font-size0: 0.8333em;
79
+ --jp-ui-font-size1: 13px;
80
+ --jp-ui-font-size2: 1.2em;
81
+ --jp-ui-font-size3: 1.44em;
82
+ --jp-ui-font-family:
83
+ -apple-system, blinkmacsystemfont, 'Segoe UI', helvetica, arial, sans-serif,
84
+ 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
85
+ --jp-ui-font-color0: #0a0a0a;
86
+ --jp-ui-font-color1: rgba(10, 10, 10, 0.9);
87
+ --jp-ui-font-color2: rgba(10, 10, 10, 0.7);
88
+ --jp-ui-font-color3: rgba(10, 10, 10, 0.55);
89
+ --jp-ui-inverse-font-color0: rgba(255, 255, 255, 1);
90
+ --jp-ui-inverse-font-color1: rgba(255, 255, 255, 0.8);
91
+ --jp-ui-inverse-font-color2: rgba(255, 255, 255, 0.5);
92
+ --jp-ui-inverse-font-color3: rgba(255, 255, 255, 0.3);
93
+
94
+ /* Content Fonts */
95
+ --jp-content-line-height: 1.6;
96
+ --jp-content-font-scale-factor: 1.2;
97
+ --jp-content-font-size0: 0.8333em;
98
+ --jp-content-font-size1: 14px;
99
+ --jp-content-font-size2: 1.2em;
100
+ --jp-content-font-size3: 1.44em;
101
+ --jp-content-font-size4: 1.728em;
102
+ --jp-content-font-size5: 2.0736em;
103
+ --jp-content-presentation-font-size1: 17px;
104
+ --jp-content-heading-line-height: 1;
105
+ --jp-content-heading-margin-top: 1.2em;
106
+ --jp-content-heading-margin-bottom: 0.8em;
107
+ --jp-content-heading-font-weight: 500;
108
+ --jp-content-font-family:
109
+ system-ui, -apple-system, blinkmacsystemfont, 'Segoe UI', helvetica, arial,
110
+ sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
111
+ --jp-content-font-color0: #0a0a0a;
112
+ --jp-content-font-color1: rgba(10, 10, 10, 0.9);
113
+ --jp-content-font-color2: rgba(10, 10, 10, 0.7);
114
+ --jp-content-font-color3: rgba(10, 10, 10, 0.55);
115
+ --jp-content-link-color: #009fff;
116
+ --jp-content-link-visited-color: #693acf;
117
+ --jp-content-link-hover-color: #008ce0;
118
+
119
+ /* Code Fonts */
120
+ --jp-code-font-size: 13px;
121
+ --jp-code-line-height: 1.3077;
122
+ --jp-code-padding: 0.385em;
123
+ --jp-code-font-family-default: menlo, consolas, 'DejaVu Sans Mono', monospace;
124
+ --jp-code-font-family: var(--jp-code-font-family-default);
125
+ --jp-code-presentation-font-size: 16px;
126
+ --jp-code-cursor-width0: 1.4px;
127
+ --jp-code-cursor-width1: 2px;
128
+ --jp-code-cursor-width2: 4px;
129
+
130
+ /* Layout colors */
131
+ --jp-layout-color0: #fff;
132
+ --jp-layout-color1: #fff;
133
+ --jp-layout-color2: #f5f5f5;
134
+ --jp-layout-color3: #ededed;
135
+ --jp-layout-color4: #e5e5e5;
136
+ --jp-inverse-layout-color0: #0a0a0a;
137
+ --jp-inverse-layout-color1: #171717;
138
+ --jp-inverse-layout-color2: #262626;
139
+ --jp-inverse-layout-color3: #404040;
140
+ --jp-inverse-layout-color4: #525252;
141
+
142
+ /* Brand/Accent colors */
143
+ --jp-brand-color0: #007fcc;
144
+ --jp-brand-color1: #009fff;
145
+ --jp-brand-color2: #2eb0ff;
146
+ --jp-brand-color3: #73caff;
147
+ --jp-brand-color4: #b8e4ff;
148
+ --jp-accent-color0: #148659;
149
+ --jp-accent-color1: #18a46c;
150
+ --jp-accent-color2: #46b689;
151
+ --jp-accent-color3: #80cdae;
152
+
153
+ /* State colors */
154
+ --jp-warn-color0: #af8b0d;
155
+ --jp-warn-color1: #d5a910;
156
+ --jp-warn-color2: #ddba40;
157
+ --jp-warn-color3: #e8d07c;
158
+ --jp-error-color0: #af242c;
159
+ --jp-error-color1: #d52c36;
160
+ --jp-error-color2: #dd565e;
161
+ --jp-error-color3: #e88b90;
162
+ --jp-success-color0: #148659;
163
+ --jp-success-color1: #18a46c;
164
+ --jp-success-color2: #46b689;
165
+ --jp-success-color3: #80cdae;
166
+ --jp-info-color0: #1784a3;
167
+ --jp-info-color1: #1ca1c7;
168
+ --jp-info-color2: #49b4d2;
169
+ --jp-info-color3: #82cbe0;
170
+
171
+ /* Cell specific styles */
172
+ --jp-cell-padding: 5px;
173
+ --jp-cell-collapser-width: 8px;
174
+ --jp-cell-collapser-min-height: 20px;
175
+ --jp-cell-collapser-not-active-hover-opacity: 0.6;
176
+ --jp-cell-editor-background: var(--jp-layout-color1);
177
+ --jp-cell-editor-active-background: var(--jp-layout-color0);
178
+ --jp-cell-editor-active-border-color: var(--jp-brand-color1);
179
+ --jp-cell-editor-border-color: #d4d4d4;
180
+ --jp-cell-editor-box-shadow: inset 0 0 2px #009fff;
181
+ --jp-cell-prompt-width: 64px;
182
+ --jp-cell-prompt-font-family: var(--jp-code-font-family-default);
183
+ --jp-cell-prompt-letter-spacing: 0;
184
+ --jp-cell-prompt-opacity: 1;
185
+ --jp-cell-prompt-not-active-opacity: 1;
186
+ --jp-cell-prompt-not-active-font-color: rgba(10, 10, 10, 0.26);
187
+ --jp-cell-inprompt-font-color: #009fff;
188
+ --jp-cell-outprompt-font-color: #d5a910;
189
+
190
+ /* Notebook specific styles */
191
+ --jp-notebook-padding: 10px;
192
+ --jp-notebook-select-background: var(--jp-layout-color1);
193
+ --jp-notebook-multiselected-color: rgba(0, 159, 255, 0.24);
194
+ --jp-notebook-scroll-padding: calc(
195
+ 100% - var(--jp-code-font-size) * var(--jp-code-line-height) -
196
+ var(--jp-code-padding) - var(--jp-cell-padding) - 1px
197
+ );
198
+
199
+ /* Console specific styles */
200
+ --jp-console-padding: 10px;
201
+
202
+ /* Toolbar specific styles */
203
+ --jp-toolbar-border-color: var(--jp-border-color2);
204
+ --jp-toolbar-micro-height: 8px;
205
+ --jp-toolbar-background: var(--jp-layout-color1);
206
+ --jp-toolbar-header-margin: 4px 4px 0 4px;
207
+ --jp-toolbar-active-background: var(--jp-layout-color0);
208
+ --jp-toolbar-box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.24);
209
+
210
+ /* Statusbar specific styles */
211
+ --jp-statusbar-height: 24px;
212
+
213
+ /* Input field styles */
214
+ --jp-input-active-background: var(--jp-layout-color0);
215
+ --jp-input-hover-background: var(--jp-layout-color2);
216
+ --jp-input-border-color: var(--jp-inverse-border-color);
217
+ --jp-input-active-border-color: var(--jp-brand-color1);
218
+ --jp-input-box-shadow: inset 0 0 2px #009fff;
219
+ --jp-input-background: rgba(10, 10, 10, 0.04);
220
+ --jp-input-active-box-shadow-color: rgba(0, 159, 255, 0.3);
221
+
222
+ /* Rendermime styles */
223
+ --jp-rendermime-error-background: rgba(213, 44, 54, 0.28);
224
+ --jp-rendermime-table-row-background: var(--jp-layout-color0);
225
+ --jp-rendermime-table-row-hover-background: rgba(28, 161, 199, 0.2);
226
+
227
+ /* Dialog styles */
228
+ --jp-dialog-background: rgba(0, 0, 0, 0.25);
229
+
230
+ /* Editor styles */
231
+ --jp-editor-selected-background: #dfebff;
232
+ --jp-editor-selected-focused-background: rgba(0, 159, 255, 0.24);
233
+ --jp-editor-cursor-color: #009fff;
234
+
235
+ /* CodeMirror / mirror editor colors */
236
+ --jp-mirror-editor-keyword-color: #d32a61;
237
+ --jp-mirror-editor-atom-color: #1ca1c7;
238
+ --jp-mirror-editor-number-color: #1ca1c7;
239
+ --jp-mirror-editor-def-color: #d47628;
240
+ --jp-mirror-editor-variable-color: #d47628;
241
+ --jp-mirror-editor-variable-2-color: #d47628;
242
+ --jp-mirror-editor-variable-3-color: #d5901c;
243
+ --jp-mirror-editor-punctuation-color: #636363;
244
+ --jp-mirror-editor-property-color: #d47628;
245
+ --jp-mirror-editor-operator-color: #636363;
246
+ --jp-mirror-editor-comment-color: #737373;
247
+ --jp-mirror-editor-string-color: #199f43;
248
+ --jp-mirror-editor-string-2-color: #199f43;
249
+ --jp-mirror-editor-meta-color: #1a85d4;
250
+ --jp-mirror-editor-qualifier-color: #636363;
251
+ --jp-mirror-editor-builtin-color: #693acf;
252
+ --jp-mirror-editor-bracket-color: #636363;
253
+ --jp-mirror-editor-tag-color: #d5512f;
254
+ --jp-mirror-editor-attribute-color: #18a46c;
255
+ --jp-mirror-editor-header-color: #d5512f;
256
+ --jp-mirror-editor-quote-color: #737373;
257
+ --jp-mirror-editor-link-color: #009fff;
258
+ --jp-mirror-editor-error-color: #d52c36;
259
+ --jp-mirror-editor-hr-color: #636363;
260
+
261
+ /* Extra syntax colors for the CodeMirror tags JupyterLab's highlight style
262
+ leaves unstyled, read by the Pierre editor extension (src/syntax.ts).
263
+ Defined only here, so the extension stays inert under other themes. */
264
+ --jpp-tok-type-color: #a631be;
265
+ --jpp-tok-function-color: #693acf;
266
+ --jpp-tok-variable-color: #d47628;
267
+ --jpp-tok-namespace-color: #d5901c;
268
+ --jpp-tok-constant-color: #1ca1c7;
269
+ --jpp-keyword-weight: normal;
270
+
271
+ /* Scrollbar styles */
272
+ --jp-scrollbar-background-color: var(--jp-layout-color0);
273
+ --jp-scrollbar-thumb-color: 10, 10, 10;
274
+ --jp-scrollbar-endpad: 3px;
275
+ --jp-scrollbar-thumb-margin: 3.5px;
276
+ --jp-scrollbar-thumb-radius: 9px;
277
+
278
+ /* User colors */
279
+ --jp-collaborator-color1: #ad4a00;
280
+ --jp-collaborator-color2: #7b6a00;
281
+ --jp-collaborator-color3: #007e00;
282
+ --jp-collaborator-color4: #008772;
283
+ --jp-collaborator-color5: #0079b9;
284
+ --jp-collaborator-color6: #8b45c6;
285
+ --jp-collaborator-color7: #be208b;
286
+
287
+ /* Sidebar styles */
288
+ --jp-sidebar-min-width: 250px;
289
+
290
+ /* Search styles */
291
+ --jp-search-toggle-off-opacity: 0.6;
292
+ --jp-search-toggle-hover-opacity: 0.8;
293
+ --jp-search-toggle-on-opacity: 1;
294
+ --jp-search-unselected-match-color: var(--jp-ui-inverse-font-color0);
295
+ --jp-search-selected-match-background-color: rgba(28, 161, 199, 0.4);
296
+ --jp-search-selected-match-color: var(--jp-layout-color1);
297
+ --jp-search-unselected-match-background-color: rgba(28, 161, 199, 0.27);
298
+
299
+ /* Icon colors */
300
+ --jp-icon-contrast-color0: #693acf;
301
+ --jp-icon-contrast-color1: #18a46c;
302
+ --jp-icon-contrast-color2: #d52c36;
303
+ --jp-icon-contrast-color3: #009fff;
304
+
305
+ /* Button colors */
306
+ --jp-accept-color-normal: #007fcc;
307
+ --jp-accept-color-hover: #009fff;
308
+ --jp-accept-color-active: #2eb0ff;
309
+ --jp-warn-color-normal: #af242c;
310
+ --jp-warn-color-hover: #d52c36;
311
+ --jp-warn-color-active: #dd565e;
312
+ --jp-reject-color-normal: #9e9e9e;
313
+ --jp-reject-color-hover: #7e7e7e;
314
+ --jp-reject-color-active: #5f5f5f;
315
+
316
+ /* File/activity icons */
317
+ --jp-jupyter-icon-color: #d5a910;
318
+ --jp-notebook-icon-color: #d5a910;
319
+ --jp-json-icon-color: #d5a910;
320
+ --jp-console-icon-background-color: #009fff;
321
+ --jp-console-icon-color: var(--jp-layout-color1);
322
+ --jp-terminal-icon-background-color: var(--jp-layout-color3);
323
+ --jp-terminal-icon-color: rgba(10, 10, 10, 0.92);
324
+ --jp-text-editor-icon-color: rgba(10, 10, 10, 0.55);
325
+ --jp-inspector-icon-color: rgba(10, 10, 10, 0.55);
326
+ --jp-switch-color: #9e9e9e;
327
+ --jp-switch-true-position-color: #009fff;
328
+ --jp-switch-cursor-color: rgba(10, 10, 10, 0.8);
329
+
330
+ /* Vega */
331
+ --jp-vega-background: var(--jp-layout-color0);
332
+
333
+ /* Shortcut buttons */
334
+ --jp-shortcuts-button-background: #009fff;
335
+ --jp-shortcuts-button-hover-background: #2eb0ff;
336
+ }
337
+
338
+ /* Completer specific styles */
339
+
340
+ .jp-Completer {
341
+ --jp-completer-type-background0: transparent;
342
+ --jp-completer-type-background1: #1f77b4;
343
+ --jp-completer-type-background2: #ff7f0e;
344
+ --jp-completer-type-background3: #2ca02c;
345
+ --jp-completer-type-background4: #d62728;
346
+ --jp-completer-type-background5: #9467bd;
347
+ --jp-completer-type-background6: #8c564b;
348
+ --jp-completer-type-background7: #e377c2;
349
+ --jp-completer-type-background8: #7f7f7f;
350
+ --jp-completer-type-background9: #bcbd22;
351
+ --jp-completer-type-background10: #17becf;
352
+ }