xtralab 0.14.1 → 0.15.1

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.
Files changed (236) hide show
  1. package/README.md +10 -0
  2. package/lib/about/icons.d.ts +0 -5
  3. package/lib/about/icons.js +0 -5
  4. package/lib/about/index.d.ts +4 -8
  5. package/lib/about/index.js +6 -17
  6. package/lib/agentSessions.d.ts +9 -29
  7. package/lib/agentSessions.js +2 -7
  8. package/lib/askAgent/editorSelection.d.ts +20 -26
  9. package/lib/askAgent/editorSelection.js +11 -26
  10. package/lib/askAgent/icons.d.ts +2 -3
  11. package/lib/askAgent/icons.js +2 -3
  12. package/lib/askAgent/index.d.ts +4 -26
  13. package/lib/askAgent/index.js +54 -158
  14. package/lib/askAgent/popup.d.ts +12 -16
  15. package/lib/askAgent/popup.js +18 -37
  16. package/lib/askAgent/prompt.d.ts +3 -5
  17. package/lib/askAgent/prompt.js +6 -19
  18. package/lib/askAgent/queue.d.ts +11 -21
  19. package/lib/askAgent/queue.js +9 -19
  20. package/lib/askAgent/queuePanel.d.ts +13 -18
  21. package/lib/askAgent/queuePanel.js +15 -37
  22. package/lib/askAgent/targetPicker.d.ts +2 -9
  23. package/lib/askAgent/targetPicker.js +6 -11
  24. package/lib/askAgent/tokens.d.ts +32 -46
  25. package/lib/askAgent/tokens.js +4 -6
  26. package/lib/commandBar/index.d.ts +4 -13
  27. package/lib/commandBar/index.js +21 -39
  28. package/lib/customPanel/index.d.ts +7 -0
  29. package/lib/customPanel/index.js +89 -0
  30. package/lib/editorBreadcrumbs/index.d.ts +3 -6
  31. package/lib/editorBreadcrumbs/index.js +10 -6
  32. package/lib/editorBreadcrumbs/widget.d.ts +17 -4
  33. package/lib/editorBreadcrumbs/widget.js +11 -17
  34. package/lib/editorIndent/index.d.ts +4 -12
  35. package/lib/editorIndent/index.js +8 -23
  36. package/lib/fileBrowser/commands.d.ts +28 -19
  37. package/lib/fileBrowser/commands.js +51 -98
  38. package/lib/fileBrowser/contents.d.ts +14 -0
  39. package/lib/fileBrowser/contents.js +28 -0
  40. package/lib/fileBrowser/dragAndDrop.d.ts +79 -0
  41. package/lib/fileBrowser/dragAndDrop.js +110 -0
  42. package/lib/fileBrowser/fileBrowser.d.ts +21 -9
  43. package/lib/fileBrowser/fileBrowser.js +211 -405
  44. package/lib/fileBrowser/gitStatus.d.ts +4 -9
  45. package/lib/fileBrowser/gitStatus.js +7 -17
  46. package/lib/fileBrowser/gitignore.d.ts +4 -17
  47. package/lib/fileBrowser/gitignore.js +4 -25
  48. package/lib/fileBrowser/icons.d.ts +7 -17
  49. package/lib/fileBrowser/icons.js +25 -80
  50. package/lib/fileBrowser/index.js +41 -10
  51. package/lib/fileBrowser/widget.d.ts +170 -53
  52. package/lib/fileBrowser/widget.js +242 -18
  53. package/lib/fileTypeIcons/index.js +0 -10
  54. package/lib/git/api.d.ts +5 -13
  55. package/lib/git/api.js +10 -36
  56. package/lib/git/askRequest.d.ts +4 -8
  57. package/lib/git/askRequest.js +6 -20
  58. package/lib/git/commands.d.ts +40 -5
  59. package/lib/git/commands.js +16 -10
  60. package/lib/git/diffModel.js +4 -0
  61. package/lib/git/diffSurface.d.ts +41 -55
  62. package/lib/git/diffSurface.js +42 -117
  63. package/lib/git/diffWidget.d.ts +81 -2
  64. package/lib/git/diffWidget.js +62 -12
  65. package/lib/git/imageDiff.d.ts +5 -6
  66. package/lib/git/imageDiff.js +18 -48
  67. package/lib/git/index.d.ts +0 -3
  68. package/lib/git/index.js +3 -8
  69. package/lib/git/notebookDiff.d.ts +110 -33
  70. package/lib/git/notebookDiff.js +52 -195
  71. package/lib/git/tokens.d.ts +73 -31
  72. package/lib/git/tokens.js +2 -3
  73. package/lib/highlight/index.d.ts +4 -10
  74. package/lib/highlight/index.js +10 -41
  75. package/lib/index.d.ts +0 -9
  76. package/lib/index.js +2 -9
  77. package/lib/launcher/agents.d.ts +55 -51
  78. package/lib/launcher/agents.js +25 -54
  79. package/lib/launcher/availability.d.ts +3 -9
  80. package/lib/launcher/availability.js +3 -9
  81. package/lib/launcher/commands.d.ts +7 -32
  82. package/lib/launcher/commands.js +14 -45
  83. package/lib/launcher/dashboard.d.ts +19 -24
  84. package/lib/launcher/dashboard.js +21 -67
  85. package/lib/launcher/editorRegistry.d.ts +10 -22
  86. package/lib/launcher/editorRegistry.js +14 -18
  87. package/lib/launcher/editors.d.ts +39 -45
  88. package/lib/launcher/editors.js +8 -34
  89. package/lib/launcher/icons.d.ts +0 -12
  90. package/lib/launcher/icons.js +14 -37
  91. package/lib/launcher/index.js +12 -55
  92. package/lib/launcher/invocation.d.ts +4 -10
  93. package/lib/launcher/invocation.js +7 -22
  94. package/lib/launcher/registry.d.ts +9 -7
  95. package/lib/launcher/registry.js +9 -7
  96. package/lib/launcher/schemaDefaults.d.ts +2 -9
  97. package/lib/launcher/schemaDefaults.js +37 -13
  98. package/lib/launcher/tokens.d.ts +10 -22
  99. package/lib/launcher/tokens.js +5 -8
  100. package/lib/menuBar/index.d.ts +3 -10
  101. package/lib/menuBar/index.js +11 -28
  102. package/lib/menus/index.d.ts +3 -9
  103. package/lib/menus/index.js +14 -30
  104. package/lib/omnibox/files.d.ts +2 -4
  105. package/lib/omnibox/files.js +5 -11
  106. package/lib/omnibox/index.d.ts +4 -14
  107. package/lib/omnibox/index.js +9 -27
  108. package/lib/omnibox/model.d.ts +38 -10
  109. package/lib/omnibox/model.js +15 -33
  110. package/lib/omnibox/recents.d.ts +15 -17
  111. package/lib/omnibox/recents.js +12 -17
  112. package/lib/omnibox/tokens.d.ts +5 -10
  113. package/lib/omnibox/tokens.js +2 -6
  114. package/lib/omnibox/widget.d.ts +11 -7
  115. package/lib/omnibox/widget.js +8 -16
  116. package/lib/searchReplace/index.d.ts +4 -20
  117. package/lib/searchReplace/index.js +7 -27
  118. package/lib/showOutput/index.d.ts +3 -12
  119. package/lib/showOutput/index.js +6 -22
  120. package/lib/sidebar/index.d.ts +4 -13
  121. package/lib/sidebar/index.js +73 -46
  122. package/lib/terminalNotifications/index.d.ts +4 -10
  123. package/lib/terminalNotifications/index.js +6 -20
  124. package/lib/terminals/agentTerminals.d.ts +12 -5
  125. package/lib/terminals/agentTerminals.js +25 -44
  126. package/lib/terminals/detection.d.ts +4 -8
  127. package/lib/terminals/detection.js +4 -8
  128. package/lib/terminals/index.d.ts +0 -33
  129. package/lib/terminals/index.js +24 -102
  130. package/lib/terminals/model.d.ts +64 -139
  131. package/lib/terminals/model.js +80 -220
  132. package/lib/terminals/tokens.d.ts +11 -22
  133. package/lib/terminals/tokens.js +2 -2
  134. package/lib/terminals/widget.d.ts +72 -38
  135. package/lib/terminals/widget.js +173 -73
  136. package/lib/topBar/icons.d.ts +3 -8
  137. package/lib/topBar/icons.js +3 -8
  138. package/lib/topBar/index.d.ts +4 -11
  139. package/lib/topBar/index.js +10 -38
  140. package/lib/walkthrough/index.d.ts +4 -9
  141. package/lib/walkthrough/index.js +6 -20
  142. package/lib/walkthrough/panel.d.ts +40 -9
  143. package/lib/walkthrough/panel.js +4 -10
  144. package/package.json +2 -2
  145. package/schema/launcher.json +2 -2
  146. package/schema/sidebar.json +47 -7
  147. package/src/about/icons.ts +0 -5
  148. package/src/about/index.tsx +6 -17
  149. package/src/agentSessions.ts +9 -29
  150. package/src/askAgent/editorSelection.ts +22 -29
  151. package/src/askAgent/icons.ts +2 -3
  152. package/src/askAgent/index.ts +54 -158
  153. package/src/askAgent/popup.tsx +23 -45
  154. package/src/askAgent/prompt.ts +6 -19
  155. package/src/askAgent/queue.ts +13 -24
  156. package/src/askAgent/queuePanel.tsx +21 -46
  157. package/src/askAgent/targetPicker.tsx +5 -15
  158. package/src/askAgent/tokens.ts +32 -46
  159. package/src/commandBar/index.ts +24 -39
  160. package/src/customPanel/index.ts +119 -0
  161. package/src/editorBreadcrumbs/index.ts +10 -6
  162. package/src/editorBreadcrumbs/widget.ts +23 -17
  163. package/src/editorIndent/index.ts +17 -23
  164. package/src/fileBrowser/commands.ts +70 -98
  165. package/src/fileBrowser/contents.ts +33 -0
  166. package/src/fileBrowser/dragAndDrop.ts +188 -0
  167. package/src/fileBrowser/fileBrowser.tsx +259 -440
  168. package/src/fileBrowser/gitStatus.ts +7 -17
  169. package/src/fileBrowser/gitignore.ts +4 -25
  170. package/src/fileBrowser/icons.ts +25 -80
  171. package/src/fileBrowser/index.ts +43 -10
  172. package/src/fileBrowser/widget.tsx +344 -64
  173. package/src/fileTypeIcons/index.ts +0 -10
  174. package/src/git/api.ts +10 -36
  175. package/src/git/askRequest.ts +6 -20
  176. package/src/git/commands.ts +70 -10
  177. package/src/git/diffModel.ts +25 -0
  178. package/src/git/diffSurface.tsx +71 -159
  179. package/src/git/diffWidget.tsx +104 -14
  180. package/src/git/imageDiff.tsx +45 -51
  181. package/src/git/index.ts +3 -8
  182. package/src/git/notebookDiff.tsx +211 -238
  183. package/src/git/tokens.ts +73 -31
  184. package/src/highlight/index.ts +10 -41
  185. package/src/index.ts +2 -9
  186. package/src/launcher/agents.ts +74 -92
  187. package/src/launcher/availability.ts +3 -9
  188. package/src/launcher/commands.ts +14 -51
  189. package/src/launcher/dashboard.tsx +49 -88
  190. package/src/launcher/editorRegistry.ts +21 -29
  191. package/src/launcher/editors.ts +39 -58
  192. package/src/launcher/icons.ts +15 -37
  193. package/src/launcher/index.ts +12 -55
  194. package/src/launcher/invocation.ts +7 -22
  195. package/src/launcher/registry.ts +9 -7
  196. package/src/launcher/schemaDefaults.ts +43 -13
  197. package/src/launcher/tokens.ts +10 -22
  198. package/src/menuBar/index.ts +11 -28
  199. package/src/menus/index.ts +14 -30
  200. package/src/omnibox/files.ts +10 -14
  201. package/src/omnibox/index.ts +9 -27
  202. package/src/omnibox/model.ts +50 -38
  203. package/src/omnibox/recents.ts +17 -22
  204. package/src/omnibox/tokens.ts +5 -10
  205. package/src/omnibox/widget.tsx +14 -19
  206. package/src/searchReplace/index.ts +7 -27
  207. package/src/showOutput/index.ts +6 -22
  208. package/src/sidebar/index.ts +103 -52
  209. package/src/terminalNotifications/index.ts +42 -25
  210. package/src/terminals/agentTerminals.ts +25 -49
  211. package/src/terminals/detection.ts +4 -8
  212. package/src/terminals/index.ts +31 -102
  213. package/src/terminals/model.ts +130 -246
  214. package/src/terminals/tokens.ts +11 -22
  215. package/src/terminals/widget.tsx +229 -113
  216. package/src/topBar/icons.ts +3 -8
  217. package/src/topBar/index.ts +21 -44
  218. package/src/walkthrough/index.ts +6 -20
  219. package/src/walkthrough/panel.ts +40 -10
  220. package/style/about.css +2 -7
  221. package/style/askAgent.css +8 -40
  222. package/style/base.css +25 -73
  223. package/style/chrome.css +108 -308
  224. package/style/commandBar.css +4 -20
  225. package/style/customPanel.css +6 -0
  226. package/style/git.css +22 -184
  227. package/style/highlight.css +1 -3
  228. package/style/index.js +1 -0
  229. package/style/launcher.css +6 -70
  230. package/style/omnibox.css +2 -14
  231. package/style/showOutput.css +0 -6
  232. package/style/sidebar.css +29 -9
  233. package/style/tabs.css +5 -13
  234. package/style/terminals.css +18 -123
  235. package/style/topBar.css +2 -22
  236. package/style/walkthrough.css +0 -8
package/style/chrome.css CHANGED
@@ -1,31 +1,8 @@
1
1
  /*
2
- * The chrome layer: a token-driven modernization pass over stock JupyterLab
3
- * and Lumino chrome, so the app reads as a quiet native window rather than a
4
- * paneled web app.
5
- *
6
- * The language, in one place:
7
- * - one surface, separated by hairlines (--jp-border-color2), not the stock
8
- * grid of grey-400 borders;
9
- * - a radius scale: controls ~5-6px, popovers 8-10px, dialogs 12px;
10
- * - soft large-blur shadows rebuilt from each theme's own shadow pieces;
11
- * - state washes mixed from the theme's foreground (color-mix over
12
- * --jp-ui-font-color1) instead of opaque layout-color blocks;
13
- * - 100-150ms ease on hover state changes;
14
- * - frosted translucency on transient overlays (menus, palette, omnibox).
15
- *
16
- * Two ground rules keep this safe:
17
- * 1. Every color derives from the active theme's --jp-* tokens (or a
18
- * color-mix over them), so the layer composes with JupyterLab
19
- * Light/Dark and both Pierre themes. Theme-conditional rules key off
20
- * body[data-jp-theme-light].
21
- * 2. Lumino positions panels, tab bars, and menus with pixel math, so
22
- * rules stick to paint-only properties (color, background,
23
- * border-color, border-radius, box-shadow, opacity, transition).
24
- * Where a stock border exists, only its color changes — widths stay.
25
- *
26
- * Token overrides live on `body`, not :root: themes define their tokens on
27
- * :root in stylesheets loaded after this one, and inheritance from body
28
- * beats :root regardless of load order.
2
+ * Token-driven restyle of stock JupyterLab/Lumino chrome into a quiet
3
+ * native window. Colors derive from the theme's --jp-* tokens; rules stay
4
+ * paint-only (Lumino positions chrome with pixel math). Token overrides
5
+ * sit on `body`: body inheritance beats the themes' later-loaded :root.
29
6
  */
30
7
 
31
8
  /* stylelint-disable no-descending-specificity */
@@ -35,14 +12,9 @@
35
12
  |---------------------------------------------------------------------------- */
36
13
 
37
14
  body {
38
- /* Controls-tier corner radius. Every styled button/input/select and the
39
- FAST toolkit (which forwards this token to its shadow-DOM controls via
40
- applyJupyterTheme -> controlCornerRadius) follows. */
15
+ /* FAST forwards this to its shadow-DOM controls via
16
+ applyJupyterTheme -> controlCornerRadius. */
41
17
  --jp-border-radius: 6px;
42
-
43
- /* Elevation ramp: fewer layers, larger blur, negative spread. Built from
44
- the theme's own shadow color pieces, so each theme keeps its shadow
45
- character (including Pierre light's deliberately faint shadows). */
46
18
  --jp-elevation-z1: 0 1px 2px var(--jp-shadow-ambient-color);
47
19
  --jp-elevation-z2:
48
20
  0 1px 3px var(--jp-shadow-penumbra-color),
@@ -68,17 +40,11 @@ body {
68
40
  --jp-elevation-z24:
69
41
  0 28px 56px -14px var(--jp-shadow-umbra-color),
70
42
  0 8px 20px -8px var(--jp-shadow-ambient-color);
71
-
72
- /* Toolbars separate with their existing border-bottom alone; the stock
73
- omnidirectional 2px smudge shadow under every toolbar goes. */
74
43
  --jp-toolbar-box-shadow: none;
75
44
  --jp-toolbar-border-color: var(--jp-border-color2);
76
45
 
77
- /* Inputs: rest on the theme's border ramp instead of the heavy
78
- --jp-inverse-border-color (#757575 in both stock JupyterLab themes),
79
- and focus with a soft outer ring instead of the inset blue glow. The
80
- border-color swap to --jp-input-active-border-color that ships with
81
- every stock :focus rule stays, giving the border + halo combo. */
46
+ /* Stock :focus rules still swap to --jp-input-active-border-color,
47
+ giving border + halo. */
82
48
  --jp-input-border-color: var(--jp-border-color1);
83
49
  --jp-input-box-shadow: 0 0 0 3px
84
50
  color-mix(
@@ -86,9 +52,6 @@ body {
86
52
  var(--jp-input-active-border-color, var(--jp-brand-color1)) 22%,
87
53
  transparent
88
54
  );
89
-
90
- /* Focused notebook/console cell: same outer-halo language, derived from
91
- the theme's active cell border color (brand in all shipped themes). */
92
55
  --jp-cell-editor-box-shadow: 0 0 0 3px
93
56
  color-mix(
94
57
  in srgb,
@@ -96,18 +59,11 @@ body {
96
59
  transparent
97
60
  );
98
61
 
99
- /* The stock JupyterLab themes color the ON state of switches ORANGE
100
- (md-orange-900/700) — point it at the brand color instead (a no-op for
101
- the Pierre themes). accent-color inherits into every native
102
- checkbox/radio (dialogs, Settings editor, search filters). */
62
+ /* Stock themes color the switch ON state orange; point it at brand. */
103
63
  --jp-switch-true-position-color: var(--jp-brand-color1);
104
64
 
105
65
  accent-color: var(--jp-brand-color1);
106
66
 
107
- /* One selection language: brand-derived focused selection (JupyterLab
108
- Light still ships a 2010-era solid lavender), neutral grey-out when
109
- unfocused, light brand wash for multi-selected cells. Alpha values
110
- layer correctly over the active-line highlight. */
111
67
  --jp-editor-selected-focused-background: color-mix(
112
68
  in srgb,
113
69
  var(--jp-brand-color1) 22%,
@@ -123,93 +79,69 @@ body {
123
79
  var(--jp-brand-color1) 12%,
124
80
  transparent
125
81
  );
126
-
127
- /* Dataframe row hover: brand wash instead of per-theme ad-hoc blues
128
- (solid baby-blue in JupyterLab Light). */
129
82
  --jp-rendermime-table-row-hover-background: color-mix(
130
83
  in srgb,
131
84
  var(--jp-brand-color1) 10%,
132
85
  transparent
133
86
  );
134
87
 
135
- /* System monospace (SF Mono on macOS via ui-monospace), falling back to
136
- the exact stock stack elsewhere. The prompt font follows so In[n]/Out[n]
137
- match the editor. The terminal font is a JS setting, not CSS. */
88
+ /* The terminal font is a JS setting, not CSS. */
138
89
  --jp-code-font-family:
139
90
  ui-monospace, 'SF Mono', sfmono-regular, menlo, consolas,
140
91
  'DejaVu Sans Mono', monospace;
141
92
  --jp-cell-prompt-font-family: var(--jp-code-font-family);
142
93
  }
143
94
 
144
- /*
145
- * Light themes draw the chrome skeleton in a heavy mid-grey
146
- * (--jp-border-color1 is #bdbdbd in JupyterLab Light). Step it down to the
147
- * theme's own next ramp value for the hairline look. Dark themes keep their
148
- * stronger line: shadows carry less depth information there, so color1
149
- * stays for edge definition.
150
- */
95
+ /* Dark themes keep the heavy --jp-border-color1 — shadows carry less depth
96
+ information there. */
151
97
  body[data-jp-theme-light='true'] {
152
98
  --jp-border-color1: var(--jp-border-color2);
153
99
  }
154
100
 
155
- /* The Pierre themes define neither focus-outline token, so stock
156
- :focus-visible rules collapse to browser-default outlines there. Backfill
157
- with the values JupyterLab Light uses. Scoped to the Pierre themes only:
158
- JupyterLab Dark defines its own deliberately lighter #38a0f5 focus color,
159
- which an unscoped body-level token would silently override. */
101
+ /* The Pierre themes define no focus-outline tokens, so stock :focus-visible
102
+ falls to browser defaults; backfill. Scoped so JupyterLab Dark's own
103
+ lighter focus color is not overridden. */
160
104
  body[data-jp-theme-name='Pierre Light'],
161
105
  body[data-jp-theme-name='Pierre Dark'] {
162
106
  --jp-focus-outline-color: var(--jp-brand-color1);
163
107
  --jp-focus-outline-width: 2px;
164
108
  }
165
109
 
166
- /*
167
- * Slim quiet scrollbars everywhere. scrollbar-color inherits (crossing
168
- * shadow-DOM boundaries), so the body rule recolors every scroll surface;
169
- * scrollbar-width does NOT inherit, hence the separate descendant rule.
170
- * In Chromium a non-auto value for either property disables
171
- * ::-webkit-scrollbar styling on that element, which is also why the
172
- * carve-outs below reset both to `auto`. body[data-jp-theme-light] matches
173
- * every theme (the attribute is always present) and out-specifies core's
174
- * optional [data-jp-theme-scrollbars='true'] rule. Elements that set their
175
- * own scrollbar-color (e.g. core's .jp-scrollbar-tiny) keep it — a direct
176
- * declaration always beats an inherited value.
177
- */
110
+ /* Slim quiet scrollbars. scrollbar-color inherits across shadow-DOM
111
+ boundaries, scrollbar-width does not — hence the descendant rule. In
112
+ Chromium a non-auto value for either disables ::-webkit-scrollbar styling,
113
+ so the carve-outs below reset both to `auto`. body[data-jp-theme-light]
114
+ matches every theme and out-specifies [data-jp-theme-scrollbars]. */
178
115
  body[data-jp-theme-light] {
179
116
  scrollbar-color: color-mix(in srgb, var(--jp-ui-font-color1) 28%, transparent)
180
117
  transparent;
181
118
  }
182
119
 
183
120
  /* The universal selector does not pierce shadow DOM, so @pierre internals
184
- are untouched by the width rule. */
121
+ are untouched. */
185
122
  body[data-jp-theme-light],
186
123
  body[data-jp-theme-light] * {
187
124
  scrollbar-width: thin;
188
125
  }
189
126
 
190
127
  /* Carve-out: the dock tab strip keeps its hand-built 2px webkit scrollbar
191
- (style/tabs.css); element-level `auto` re-enables those rules. */
128
+ (style/tabs.css). */
192
129
  .lm-DockPanel-tabBar .lm-TabBar-content {
193
130
  scrollbar-width: auto;
194
131
  scrollbar-color: auto;
195
132
  }
196
133
 
197
- /* Carve-out: @pierre/trees (file browser) and @pierre/diffs (git diffs)
198
- build their own hover-revealed webkit scrollbars inside shadow roots —
199
- including a scrollbar-measuring element that feeds the trees gutter
200
- width. Resetting the hosts to `auto` makes their shadow trees inherit
201
- `auto` again, re-enabling both. The body[...] prefix out-specifies the
202
- universal width rule above. */
134
+ /* Carve-out: @pierre/trees and @pierre/diffs build their own webkit
135
+ scrollbars inside shadow roots (one measures scrollbar width for the
136
+ trees gutter); `auto` on the hosts lets the shadow trees inherit it. */
203
137
  body[data-jp-theme-light] file-tree-container,
204
138
  body[data-jp-theme-light] diffs-container {
205
139
  scrollbar-width: auto;
206
140
  scrollbar-color: auto;
207
141
  }
208
142
 
209
- /* Carve-out: Lumino's drag cursor backdrop (the invisible scroll box that
210
- follows the pointer while a splitter handle is held) hides its scrollbars
211
- with scrollbar-width: none; the universal thin rule above out-specifies
212
- that and would paint its thumbs as gray pills floating near the cursor. */
143
+ /* Carve-out: Lumino's drag cursor backdrop hides its scrollbars; the thin
144
+ rule above would paint gray pills that follow the cursor. */
213
145
  body[data-jp-theme-light] .lm-cursor-backdrop {
214
146
  scrollbar-width: none;
215
147
  }
@@ -218,7 +150,6 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
218
150
  | Window chrome: seams, menu bar, activity strips, status bar, splitters
219
151
  |---------------------------------------------------------------------------- */
220
152
 
221
- /* Structural hairlines: recolor the shell's skeleton borders (widths stay). */
222
153
  #jp-top-panel {
223
154
  border-bottom-color: var(--jp-border-color2);
224
155
  }
@@ -236,17 +167,11 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
236
167
  }
237
168
 
238
169
  /*
239
- * Re-assert the sidebar width floor over inline styles. Stock intends
240
- * --jp-sidebar-min-width as the floor for sidebar stack children, but a
241
- * widget moved into a sidebar (Move Widget To, or a drag) keeps the tiny
242
- * inline min-width Lumino wrote while it lived in the dock — and inline
243
- * beats the stylesheet, so the floor never engages for it. Combined with
244
- * the shell saving the raw split sizes while a sidebar is collapsed
245
- * (collapsed = ~0, unguarded upstream, unlike the down area's
246
- * _lastDownAreaSize), a restored workspace then expands that sidebar to a
247
- * 1px sliver. !important is the one thing that outranks an inline style;
248
- * with the floor restored, even a zero saved size expands to a usable
249
- * panel.
170
+ * Re-assert the sidebar width floor over inline styles: a widget moved into
171
+ * a sidebar keeps the tiny inline min-width Lumino wrote while it lived in
172
+ * the dock, and the shell saves ~0 split sizes for collapsed sidebars, so a
173
+ * restored workspace can expand one to a 1px sliver. !important is the one
174
+ * thing that outranks an inline style.
250
175
  */
251
176
  #jp-left-stack > .lm-Widget,
252
177
  #jp-right-stack > .lm-Widget {
@@ -257,26 +182,16 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
257
182
  border-bottom-color: var(--jp-border-color2);
258
183
  }
259
184
 
260
- /* Borders framing each open document/panel in the dock. */
261
185
  .lm-Widget.lm-DockPanel-widget,
262
186
  .lm-TabPanel-stackedPanel.lm-TabPanel-stackedPanel {
263
187
  border-color: var(--jp-border-color2);
264
188
  }
265
189
 
266
- /* The 5px gutters between tiled editors show whatever paints behind the
267
- dock panel — stock falls through to the body's layout-color3 (#bdbdbd in
268
- JupyterLab Light). A quiet surface makes split views separate with a
269
- soft seam instead of a dark bar. */
190
+ /* The 5px gutters between tiled editors show this surface. */
270
191
  #jp-main-dock-panel {
271
192
  background: var(--jp-layout-color2);
272
193
  }
273
194
 
274
- /*
275
- * Menu bar: stock hover is an opaque grey block, and the OPEN item paints
276
- * an opaque fill + 1px side borders + z6 shadow to fake a "tab connected
277
- * to the menu". Rounded translucent highlights instead; the transparent
278
- * 1px borders Lumino reserves keep their widths, so nothing shifts.
279
- */
280
195
  .lm-MenuBar-item {
281
196
  border-radius: 5px;
282
197
  transition: background-color 120ms ease;
@@ -300,21 +215,11 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
300
215
  border-top-color: transparent;
301
216
  }
302
217
 
303
- /*
304
- * Activity strips (left/right sidebar tab bars, in either orientation) and
305
- * the down-area tab bar: stock draws them as bordered layout-color2 bands
306
- * with separators between tabs and an opaque current tab — a classic
307
- * tab-widget look. Flatten onto the window surface: hairline seams, muted
308
- * icons that wake on hover, translucent washes, and a 2px brand accent on
309
- * the current tab's outer edge. All separator overrides change border
310
- * COLOR only, so the 1px widths Lumino measured stay.
311
- */
312
218
  .jp-SideBar.lm-TabBar,
313
219
  #jp-down-stack .lm-TabBar {
314
220
  background: var(--jp-layout-color1);
315
221
  }
316
222
 
317
- /* Hairline between the strip and its neighbor, all four placements. */
318
223
  .jp-SideBar.lm-TabBar.jp-mod-left::after {
319
224
  border-right-color: var(--jp-border-color2);
320
225
  }
@@ -331,7 +236,6 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
331
236
  border-top-color: var(--jp-border-color2);
332
237
  }
333
238
 
334
- /* Separators off — vertical orientation… */
335
239
  .jp-SideBar.lm-TabBar[data-orientation='vertical']
336
240
  .lm-TabBar-tab
337
241
  + .lm-TabBar-tab,
@@ -349,7 +253,6 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
349
253
  border-bottom-color: transparent;
350
254
  }
351
255
 
352
- /* …and horizontal orientation. */
353
256
  .jp-SideBar.lm-TabBar[data-orientation='horizontal']
354
257
  .lm-TabBar-tab
355
258
  + .lm-TabBar-tab,
@@ -367,14 +270,12 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
367
270
  border-right-color: transparent;
368
271
  }
369
272
 
370
- /* The current tab's "internal border override" pseudo-element paints an
371
- opaque frame over the strip's edge hairline; keep the hairline running
372
- continuously instead. */
273
+ /* The current tab's ::after paints an opaque frame over the strip's edge
274
+ hairline; keep the hairline running continuously. */
373
275
  .jp-SideBar .lm-TabBar-tab.lm-mod-current::after {
374
276
  border-color: transparent;
375
277
  }
376
278
 
377
- /* Resting / hover / current fills. */
378
279
  .jp-SideBar .lm-TabBar-tab:not(.lm-mod-current),
379
280
  #jp-down-stack .lm-TabBar-tab:not(.lm-mod-current) {
380
281
  background: transparent;
@@ -390,7 +291,6 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
390
291
  background: color-mix(in srgb, var(--jp-ui-font-color1) 4%, transparent);
391
292
  }
392
293
 
393
- /* Current-tab accent on the strip's outer edge (VS Code activity bar). */
394
294
  .jp-SideBar.jp-mod-left .lm-TabBar-tab.lm-mod-current {
395
295
  box-shadow: inset 2px 0 0 0 var(--jp-brand-color1);
396
296
  }
@@ -407,7 +307,6 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
407
307
  box-shadow: inset 0 2px 0 0 var(--jp-brand-color1);
408
308
  }
409
309
 
410
- /* Muted icons that wake on hover/selection. */
411
310
  .jp-SideBar .lm-TabBar-tabIcon.jp-SideBar-tabIcon {
412
311
  opacity: 0.7;
413
312
  transition: opacity 120ms ease;
@@ -423,8 +322,6 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
423
322
  opacity: 1;
424
323
  }
425
324
 
426
- /* Down-area tab bar: the current tab keeps its stock bordered-box
427
- mechanics (translateY merge with the panel), on hairlines. */
428
325
  #jp-down-stack > .lm-TabBar {
429
326
  border-top-color: var(--jp-border-color2);
430
327
  border-bottom-color: var(--jp-border-color2);
@@ -434,21 +331,14 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
434
331
  border-color: var(--jp-border-color2);
435
332
  }
436
333
 
437
- /* Stock gives the first-child current tab its own higher-specificity
438
- border-right rule; recolor it at matching specificity or the seam stays
439
- on the stronger border-color1 in dark themes. */
334
+ /* Stock's first-child current tab has a higher-specificity border-right
335
+ rule; recolor at matching specificity or the seam stays darker. */
440
336
  #jp-down-stack > .lm-TabBar .lm-TabBar-tab.lm-mod-current:first-child {
441
337
  border-right-color: var(--jp-border-color2);
442
338
  }
443
339
 
444
- /*
445
- * Status bar: stock is a layout-color2 band with full-strength text, a
446
- * hover that jumps to solid layout-color3, and a solid brand-blue block
447
- * for the popup-open state. Window surface + hairline, muted text that
448
- * wakes on hover, translucent fills. The hairline is an inset shadow, not
449
- * a border: the bar is a border-box .lm-Widget and a border would eat into
450
- * the 24px height its items fill.
451
- */
340
+ /* The status-bar hairline is an inset shadow, not a border — the bar is a
341
+ border-box .lm-Widget and a border would eat into its 24px height. */
452
342
  #jp-main-statusbar.jp-StatusBar-Widget {
453
343
  background: var(--jp-layout-color1);
454
344
  box-shadow: inset 0 1px 0 var(--jp-border-color2);
@@ -462,8 +352,7 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
462
352
  color 120ms ease;
463
353
  }
464
354
 
465
- /* Stock .jp-StatusBar-TextItem hardcodes font-color1; inherit the muted
466
- item color so hover brightens both together. */
355
+ /* Stock TextItem hardcodes font-color1; inherit so hover brightens both. */
467
356
  .jp-StatusBar-Widget .jp-StatusBar-Item .jp-StatusBar-TextItem {
468
357
  color: inherit;
469
358
  }
@@ -491,9 +380,8 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
491
380
  }
492
381
 
493
382
  /* The log-console chip marks its open state with jp-mod-selected (a solid
494
- brand block with white text in stock, no Popup involved). The muting
495
- rules above would leave grey text on that solid brand background; give
496
- the state the same translucent-brand treatment as jp-mod-clicked. */
383
+ brand block in stock); the muting rules above would leave grey text on
384
+ it, so give it the same treatment as jp-mod-clicked. */
497
385
  .jp-StatusBar-Widget .jp-StatusBar-Item.jp-mod-selected {
498
386
  color: var(--jp-ui-font-color1);
499
387
  background-color: color-mix(in srgb, var(--jp-brand-color1) 22%, transparent);
@@ -503,19 +391,12 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
503
391
  color: var(--jp-ui-font-color1);
504
392
  }
505
393
 
506
- /* Status bar hover popups hardcode a Material shadow; fold them into the
507
- themed ramp so they soften with everything else. */
508
394
  .jp-StatusBar-HoverItem {
509
395
  box-shadow: var(--jp-elevation-z6);
510
396
  }
511
397
 
512
- /*
513
- * Resize handle affordance: the shell's split handles are 1px wide with an
514
- * invisible 8px hit area; dock handles between tiled editors are 5px.
515
- * Stock gives no hover feedback at all. Paint the accent on hover, delayed
516
- * 150ms so it never flashes while the pointer crosses a boundary (the VS
517
- * Code sash pattern). Background paint only.
518
- */
398
+ /* Hover accent delayed 150ms so it never flashes while the pointer
399
+ crosses a boundary. */
519
400
  #jp-main-split-panel > .lm-SplitPanel-handle,
520
401
  #jp-main-vsplit-panel > .lm-SplitPanel-handle {
521
402
  background-color: transparent;
@@ -528,8 +409,8 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
528
409
  transition-delay: 150ms;
529
410
  }
530
411
 
531
- /* Dock handles are 5px thick; a solid fill reads fat. Paint a 2px center
532
- line on the existing ::after hit-area overlay and fade it in. */
412
+ /* Dock handles are 5px thick; paint a 2px center line on the existing
413
+ ::after hit-area overlay instead of a fat solid fill. */
533
414
  #jp-main-dock-panel .lm-DockPanel-handle::after {
534
415
  opacity: 0;
535
416
  transition: opacity 120ms ease;
@@ -565,35 +446,28 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
565
446
  |---------------------------------------------------------------------------- */
566
447
 
567
448
  /*
568
- * Flat modern tab strip: slightly recessed surface, transparent inactive
569
- * tabs with muted labels, inset hairline separators, and a current tab
570
- * that merges with the toolbar below plus a rounded accent indicator.
571
- * Composes with the adaptive tab widths in style/tabs.css (no width/flex/
572
- * padding here). Doubled classes lift specificity over the stock rules in
573
- * @jupyterlab/application/style/tabs.css without depending on load order.
449
+ * Flat tab strip. Composes with the adaptive tab widths in style/tabs.css
450
+ * (no width/flex/padding here). Doubled classes lift specificity over the
451
+ * stock rules without depending on load order.
574
452
  */
575
453
 
576
- /* The strip: recessed surface with a hairline baseline drawn as an INSET
577
- SHADOW (not a border, so the Lumino-measured bar height is unchanged).
578
- The opaque current tab paints over it, producing the "active tab merges
579
- with the toolbar below" seam for free. Dock tab bars only: the app's one
580
- .lm-TabPanel-tabBar is the down-area bar, which draws real top/bottom
581
- borders of its own — the inset baseline would double its bottom seam. */
454
+ /* The strip baseline is an INSET SHADOW, not a border, so the bar height
455
+ Lumino measured is unchanged; the opaque current tab paints over it,
456
+ merging with the toolbar below. Dock tab bars only: the down-area
457
+ .lm-TabPanel-tabBar draws real borders and would double its seam. */
582
458
  .lm-DockPanel-tabBar[data-orientation='horizontal'] {
583
459
  background: var(--jp-layout-color2);
584
460
  box-shadow: inset 0 calc(-1 * var(--jp-border-width)) 0
585
461
  var(--jp-border-color2);
586
462
  }
587
463
 
588
- /* Companion recolor for the thin tab-strip scrollbar (style/tabs.css):
589
- let the strip surface show through instead of a layout-color1 track. */
464
+ /* Let the strip surface show through the thin tab-strip scrollbar
465
+ (style/tabs.css). */
590
466
  .lm-DockPanel-tabBar .lm-TabBar-content::-webkit-scrollbar,
591
467
  .lm-DockPanel-tabBar .lm-TabBar-content::-webkit-scrollbar-track {
592
468
  background: transparent;
593
469
  }
594
470
 
595
- /* Inactive tabs: flat on the strip, muted label. border-color transparent
596
- keeps the stock 1px border in the box model. */
597
471
  .lm-DockPanel-tabBar .lm-TabBar-tab.lm-TabBar-tab,
598
472
  .lm-TabPanel-tabBar .lm-TabBar-tab.lm-TabBar-tab {
599
473
  color: var(--jp-ui-font-color2);
@@ -604,16 +478,14 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
604
478
  color 120ms ease;
605
479
  }
606
480
 
607
- /* The stock per-tab bottom hairline is superseded by the strip's inset
608
- baseline. Single class on purpose: this ties the stock base rule (same
609
- specificity, we load later) while staying BELOW the stock :focus-visible
610
- recolor, so the keyboard-focus underline still renders. */
481
+ /* The strip's inset baseline supersedes the stock per-tab hairline. Single
482
+ class on purpose: ties the stock rule (we load later) while staying below
483
+ its :focus-visible recolor, so the keyboard underline still renders. */
611
484
  .lm-DockPanel-tabBar .lm-TabBar-tab:not(.lm-mod-current)::after,
612
485
  .lm-DockPanel-tabBar .lm-TabBar-addButton::after {
613
486
  border-bottom-color: transparent;
614
487
  }
615
488
 
616
- /* Hover: a soft half-step toward the active surface. */
617
489
  .lm-DockPanel-tabBar .lm-TabBar-tab.lm-TabBar-tab:hover:not(.lm-mod-current),
618
490
  .lm-TabPanel-tabBar .lm-TabBar-tab.lm-TabBar-tab:hover:not(.lm-mod-current) {
619
491
  color: var(--jp-ui-font-color1);
@@ -624,7 +496,6 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
624
496
  );
625
497
  }
626
498
 
627
- /* Current tab: full-contrast surface + hairline sides. */
628
499
  .lm-DockPanel-tabBar .lm-TabBar-tab.lm-TabBar-tab.lm-mod-current,
629
500
  .lm-TabPanel-tabBar .lm-TabBar-tab.lm-TabBar-tab.lm-mod-current {
630
501
  color: var(--jp-ui-font-color1);
@@ -632,12 +503,7 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
632
503
  border-color: var(--jp-border-color2);
633
504
  }
634
505
 
635
- /* The stock edge-to-edge 2px brand bar on the app-level active tab is kept
636
- as-is: it doubles as the tab's separator edge in the flat strip. */
637
-
638
- /* Inset hairline separators between inactive tabs. Absolutely positioned
639
- ::before, so no layout impact. Current tabs are excluded because their
640
- ::before is the accent indicator. */
506
+ /* Current tabs excluded: their ::before is the accent indicator. */
641
507
  .lm-DockPanel-tabBar
642
508
  .lm-TabBar-tab
643
509
  + .lm-TabBar-tab:not(.lm-mod-current, .jp-mod-current)::before {
@@ -650,20 +516,14 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
650
516
  background: var(--jp-border-color2);
651
517
  }
652
518
 
653
- /* No separator immediately right of the current tab — its contrast edge is
654
- the separator. Must come after the rule above. */
519
+ /* No separator right of the current tab — its contrast edge is the
520
+ separator. Must come after the rule above. */
655
521
  .lm-DockPanel-tabBar
656
522
  .lm-TabBar-tab.lm-mod-current
657
523
  + .lm-TabBar-tab.lm-TabBar-tab::before {
658
524
  content: none;
659
525
  }
660
526
 
661
- /* A dragged dock tab is always lm-mod-current (Lumino selects the pressed
662
- tab on pointerdown, and dock tab bars disallow deselect), so the opaque
663
- current-tab surface above already keeps its label legible during drags. */
664
-
665
- /* The + button sits on the strip: drop its own layout-color2 box and give
666
- it a rounded hover chip consistent with toolbar buttons. */
667
527
  .lm-DockPanel-tabBar .lm-TabBar-addButton.lm-TabBar-addButton,
668
528
  .lm-TabPanel-tabBar .lm-TabBar-addButton.lm-TabBar-addButton {
669
529
  background-color: transparent;
@@ -681,12 +541,10 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
681
541
  }
682
542
 
683
543
  /*
684
- * Tab close button: dimmed until the tab is hovered (45%, not 0, so the
685
- * target stays discoverable), with a soft rounded chip when the icon
686
- * itself is hovered. The chip is background + a 2px spread shadow of the
687
- * same color, so the icon's box never changes and the adaptive tab widths
688
- * stay stable. Dirty tabs render the unsaved dot inside the close-icon
689
- * slot and stay at full opacity.
544
+ * Close icon at 45% (not 0 — stays discoverable) until the tab is hovered.
545
+ * The hover chip is background + a 2px spread shadow of the same color, so
546
+ * the icon's box never changes and the adaptive tab widths stay stable.
547
+ * Dirty tabs render the unsaved dot in this slot at full opacity.
690
548
  */
691
549
  .lm-DockPanel-tabBar .lm-TabBar-tab.lm-mod-closable > .lm-TabBar-tabCloseIcon {
692
550
  opacity: 0.45;
@@ -723,11 +581,9 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
723
581
  |---------------------------------------------------------------------------- */
724
582
 
725
583
  /*
726
- * Toolbar buttons are <jp-button appearance="stealth"> elements; the inner
727
- * control is an exported shadow part, and document-level ::part() rules win
728
- * over the component's internal FAST-palette fills — so hover chrome
729
- * becomes theme-derived and consistent across every toolbar. The blue
730
- * new-launcher CTA keeps its own accept-color hover (style/base.css).
584
+ * Toolbar buttons are <jp-button appearance="stealth"> elements; document
585
+ * ::part(control) rules win over the component's internal FAST-palette
586
+ * fills. The blue new-launcher CTA keeps its own hover (style/base.css).
731
587
  */
732
588
  .jp-Toolbar .jp-ToolbarButtonComponent::part(control) {
733
589
  border-radius: 5px;
@@ -742,7 +598,7 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
742
598
  }
743
599
 
744
600
  /* Deprecated plain-button path still used by some extensions: same
745
- treatment, mixed over its opaque resting fill. */
601
+ treatment over its opaque resting fill. */
746
602
  .jp-Toolbar button.jp-ToolbarButtonComponent {
747
603
  border-radius: 5px;
748
604
  transition: background-color 120ms ease;
@@ -756,13 +612,20 @@ body[data-jp-theme-light] .lm-cursor-backdrop {
756
612
  );
757
613
  }
758
614
 
615
+ /*
616
+ * Stock keeps a toolbar with no visible items as an 8px strip. The BoxLayout
617
+ * reserves the CSS min-height even for an undisplayed node, hence both.
618
+ */
619
+ .jp-MainAreaWidget > .jp-Toolbar.jp-Toolbar-micro {
620
+ display: none;
621
+ min-height: 0;
622
+ }
623
+
759
624
  /* -----------------------------------------------------------------------------
760
625
  | Controls
761
626
  |---------------------------------------------------------------------------- */
762
627
 
763
- /* Dialog/action buttons ship letter-spacing 0.8px — a Material convention
764
- that instantly dates the UI. Near-normal tracking, medium weight, and
765
- the hover ease stock buttons lack. */
628
+ /* Stock dialog buttons ship Material 0.8px letter-spacing. */
766
629
  button.jp-mod-styled {
767
630
  letter-spacing: 0.2px;
768
631
  font-weight: 500;
@@ -776,19 +639,16 @@ button.jp-ToolbarButtonComponent {
776
639
  transition: background-color 120ms ease;
777
640
  }
778
641
 
779
- /* Components that hardcode a radius and would not follow the token: */
642
+ /* Components that hardcode a radius and would not follow the token. */
780
643
 
781
- /* Toolbar dropdowns (kernel switcher, cell type) pin border-radius: 0. */
782
644
  .jp-HTMLSelect.jp-DefaultStyle select {
783
645
  border-radius: var(--jp-border-radius);
784
646
  }
785
647
 
786
- /* Flat text buttons (running panel shutdown etc.) hardcode 2px. */
787
648
  .jp-Button-flat {
788
649
  border-radius: var(--jp-border-radius);
789
650
  }
790
651
 
791
- /* Stock inputs snap between states instantly. */
792
652
  input.jp-mod-styled,
793
653
  select.jp-mod-styled,
794
654
  .jp-InputGroup input {
@@ -798,7 +658,6 @@ select.jp-mod-styled,
798
658
  background-color 120ms ease;
799
659
  }
800
660
 
801
- /* Stock switches animate at a floaty 0.4s; tighten. */
802
661
  .jp-switch-track {
803
662
  transition: background-color 150ms ease;
804
663
  }
@@ -812,15 +671,10 @@ select.jp-mod-styled,
812
671
  |---------------------------------------------------------------------------- */
813
672
 
814
673
  /*
815
- * Dropdown, context, and submenus: stock is square, hard-bordered
816
- * (border-color1), with a Material z6 shadow, full-bleed highlights, and a
817
- * mix-blend-mode separator that goes near-black on dark themes. Every
818
- * JupyterLab menu carries .jp-ThemedContainer (MenuSvg adds it), giving a
819
- * deterministic specificity bump over the stock .lm-Menu rules.
820
- *
821
- * The 5px side padding insets the item highlight macOS-style. Lumino
822
- * measures the menu node after attach and before positioning, so the
823
- * wider box is fully accounted for in its placement math.
674
+ * Every JupyterLab menu carries .jp-ThemedContainer (MenuSvg adds it) — a
675
+ * deterministic specificity bump over the stock .lm-Menu rules. Lumino
676
+ * measures the menu node after attach and before positioning, so the 5px
677
+ * side padding is fully accounted for in its placement math.
824
678
  */
825
679
  .lm-Menu.jp-ThemedContainer {
826
680
  padding: 4px 5px;
@@ -828,33 +682,25 @@ select.jp-mod-styled,
828
682
  border-color: color-mix(in srgb, var(--jp-border-color1) 55%, transparent);
829
683
  }
830
684
 
831
- /* Detach menubar dropdowns: stock pulls them up 2px to fuse with the bar.
832
- Lumino positions the menu with an inline transform; this CSS `top`
833
- offsets it. Lumino's max-height math does not know about the offset, so
834
- a dropdown tall enough to hit the viewport bottom extends 3px past it —
835
- only its bottom rounding is lost, and only on overfull menus. */
685
+ /* Detach dropdowns (stock pulls them up 2px to fuse with the bar). Lumino's
686
+ max-height math doesn't know about this offset, so an overfull menu runs
687
+ 3px past the viewport bottom — only its bottom rounding is lost. */
836
688
  .lm-Menu.lm-MenuBar-menu.jp-ThemedContainer {
837
689
  top: 3px;
838
690
  }
839
691
 
840
- /* The active-row highlight is painted on the row itself: table-row
841
- backgrounds paint uniformly across the row, whereas per-cell painting
842
- breaks — MenuSvg swaps the icon and submenu-caret cells for inline-block
843
- elements whose boxes do not span the row (the icon cell is 0px tall).
844
- The menu's 5px side padding keeps the highlight inset from the panel
845
- edge; rounding is forfeited because border-radius does not render on
846
- table rows. */
692
+ /* Painted on the row: per-cell painting breaks because MenuSvg swaps the
693
+ icon and caret cells for inline-block boxes that do not span the row.
694
+ border-radius does not render on table rows, so rounding is forfeited. */
847
695
  .lm-Menu.jp-ThemedContainer .lm-Menu-item.lm-mod-active {
848
696
  background: color-mix(in srgb, var(--jp-ui-font-color1) 8%, transparent);
849
697
  }
850
698
 
851
- /* Muted shortcut hints, like every modern menu. */
852
699
  .lm-Menu.jp-ThemedContainer .lm-Menu-itemShortcut {
853
700
  color: var(--jp-ui-font-color3);
854
701
  }
855
702
 
856
- /* Stock separators multiply a light grey (mix-blend-mode), which goes
857
- muddy on dark themes. Plain theme hairline instead. */
703
+ /* Stock separators multiply (mix-blend-mode) and go muddy on dark themes. */
858
704
  .lm-Menu.jp-ThemedContainer .lm-Menu-item[data-type='separator'] > div::after {
859
705
  border-top-color: var(--jp-border-color2);
860
706
  mix-blend-mode: normal;
@@ -864,8 +710,8 @@ select.jp-mod-styled,
864
710
  | Command palette
865
711
  |---------------------------------------------------------------------------- */
866
712
 
867
- /* The modal palette as a floating panel. The hairline edge is a shadow
868
- ring, not a border, so the CSS-positioned panel's size is unchanged. */
713
+ /* The edge is a shadow ring, not a border, so the CSS-positioned panel's
714
+ size is unchanged. */
869
715
  .jp-ModalCommandPalette.jp-ThemedContainer {
870
716
  border-radius: 10px;
871
717
  overflow: hidden;
@@ -875,14 +721,10 @@ select.jp-mod-styled,
875
721
  0 16px 48px -12px var(--jp-shadow-umbra-color);
876
722
  }
877
723
 
878
- /* Rounded search field (keeps stock's inset border + focus treatment). */
879
724
  .jp-ModalCommandPalette .lm-CommandPalette-wrapper {
880
725
  border-radius: 6px;
881
726
  }
882
727
 
883
- /* Result rows: stock already insets them 4px in the modal variant.
884
- (Section headers need no treatment: stock hides them entirely in the
885
- modal palette.) */
886
728
  .jp-ModalCommandPalette .lm-CommandPalette .lm-CommandPalette-item {
887
729
  border-radius: 6px;
888
730
  transition: background-color 120ms ease-out;
@@ -892,9 +734,6 @@ select.jp-mod-styled,
892
734
  | Dialogs
893
735
  |---------------------------------------------------------------------------- */
894
736
 
895
- /* Dialog card: top of the radius scale, hairline ring for edge definition
896
- on dark themes, soft themed elevation. The content node already clips
897
- children with overflow: hidden. */
898
737
  .jp-Dialog.jp-ThemedContainer .jp-Dialog-content {
899
738
  border-radius: 12px;
900
739
  box-shadow:
@@ -902,14 +741,11 @@ select.jp-mod-styled,
902
741
  var(--jp-elevation-z20);
903
742
  }
904
743
 
905
- /* Smaller + semibold beats big-and-thin (stock is size3 / weight 400). */
906
744
  .jp-Dialog.jp-ThemedContainer .jp-Dialog-header {
907
745
  font-size: var(--jp-ui-font-size2);
908
746
  font-weight: 600;
909
747
  }
910
748
 
911
- /* Frost the scrim slightly so the dialog pops without a darker tint.
912
- Progressive enhancement over the theme's --jp-dialog-background. */
913
749
  @supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
914
750
  .jp-Dialog.jp-ThemedContainer {
915
751
  -webkit-backdrop-filter: blur(3px);
@@ -921,10 +757,6 @@ select.jp-mod-styled,
921
757
  | Completer and tooltip
922
758
  |---------------------------------------------------------------------------- */
923
759
 
924
- /* Same popover recipe as menus, but NOT frosted: translucency over code
925
- hurts scan-reading of completions. The completer's JS sizing sets inline
926
- width/max-height; radius and border-color change nothing it measures,
927
- and overflow: hidden only clips paint (both children scroll internally). */
928
760
  .jp-Completer.jp-ThemedContainer {
929
761
  border-radius: 8px;
930
762
  overflow: hidden;
@@ -940,10 +772,6 @@ select.jp-mod-styled,
940
772
  | Document search overlay
941
773
  |---------------------------------------------------------------------------- */
942
774
 
943
- /* The find/replace overlay drops in as a hard-cornered flap with a
944
- full-strength bordered input. Round its one exposed corner, float it on
945
- the themed elevation ramp, and give the fields the app-wide soft-border
946
- + focus-ring treatment. */
947
775
  .jp-DocumentSearch-overlay {
948
776
  border-bottom-left-radius: 8px;
949
777
  border-color: var(--jp-border-color2);
@@ -977,10 +805,6 @@ select.jp-mod-styled,
977
805
  | Drag and drop
978
806
  |---------------------------------------------------------------------------- */
979
807
 
980
- /* Drop-zone overlay: stock hardcodes a Material-blue tint that ignores the
981
- active theme, with a dashed marquee border. Soft brand wash, solid
982
- hairline, rounded. The overlay is an absolutely positioned
983
- pointer-events:none node whose geometry Lumino sets inline. */
984
808
  .lm-DockPanel-overlay {
985
809
  background: color-mix(in srgb, var(--jp-brand-color1) 10%, transparent);
986
810
  border: var(--jp-border-width) solid
@@ -997,9 +821,6 @@ select.jp-mod-styled,
997
821
  border-width: var(--jp-border-width);
998
822
  }
999
823
 
1000
- /* Drag ghosts (cursor-following overlay nodes attached to body): one
1001
- rounded-card language instead of the stock brand top-border on tab
1002
- ghosts and hardcoded black shadows on cell ghosts. */
1003
824
  .lm-TabBar-tab.lm-mod-drag-image.lm-mod-drag-image {
1004
825
  border-color: var(--jp-border-color2);
1005
826
  border-radius: 6px;
@@ -1027,31 +848,24 @@ select.jp-mod-styled,
1027
848
  | Notebook cells and content
1028
849
  |---------------------------------------------------------------------------- */
1029
850
 
1030
- /* Rounded code-cell editor. Stock forces border-radius: 0; the element
1031
- already has overflow: hidden, so the radius clips the CodeMirror
1032
- background and active-line highlight cleanly. Console prompt cells share
1033
- the class. */
1034
851
  .jp-InputArea-editor {
1035
852
  border-radius: 6px;
1036
853
  }
1037
854
 
1038
- /* Rendered markdown cells carry a border when active; match. */
1039
855
  .jp-MarkdownOutput {
1040
856
  border-radius: 6px;
1041
857
  }
1042
858
 
1043
- /* The Property-Inspector active-cell preview uses the same surface. */
1044
859
  .jp-ActiveCellTool .jp-ActiveCellTool-CellContent {
1045
860
  border-radius: 6px;
1046
861
  }
1047
862
 
1048
- /* Command-mode focus ring joins the radius scale. */
1049
863
  .jp-Notebook.jp-mod-commandMode .jp-Cell.jp-mod-active:focus-visible {
1050
864
  border-radius: 6px;
1051
865
  }
1052
866
 
1053
- /* The 8px active-cell indicator bar becomes a full pill (radius = half the
1054
- --jp-cell-collapser-width) and animates quietly. Width/flex untouched. */
867
+ /* The 8px collapser becomes a full pill (radius = half
868
+ --jp-cell-collapser-width). */
1055
869
  .jp-Collapser {
1056
870
  border-radius: 4px;
1057
871
  transition:
@@ -1059,8 +873,6 @@ select.jp-mod-styled,
1059
873
  opacity 120ms ease;
1060
874
  }
1061
875
 
1062
- /* Calmer collapser hover: translucent brand instead of Material elevation
1063
- + opacity flicker. */
1064
876
  .jp-Notebook .jp-Cell .jp-Collapser:hover {
1065
877
  opacity: 1;
1066
878
  background: color-mix(in srgb, var(--jp-brand-color1) 55%, transparent);
@@ -1071,11 +883,9 @@ select.jp-mod-styled,
1071
883
  background: var(--jp-brand-color1);
1072
884
  }
1073
885
 
1074
- /* In[n]/Out[n] two steps smaller with tabular figures (no [9]->[10]
1075
- jitter). The line box is pinned to the height of one code line so the
1076
- smaller text stays optically aligned with the first code line; the
1077
- prompt column width is untouched. Markdown cells keep their own
1078
- higher-specificity font-size from stock. */
886
+ /* Prompts two steps smaller with tabular figures (no [9]->[10] jitter);
887
+ the line box is pinned to one code line so the smaller text stays
888
+ aligned with the first code line. */
1079
889
  .jp-InputPrompt,
1080
890
  .jp-OutputPrompt {
1081
891
  font-size: calc(var(--jp-code-font-size) - 2px);
@@ -1083,8 +893,6 @@ select.jp-mod-styled,
1083
893
  font-variant-numeric: tabular-nums;
1084
894
  }
1085
895
 
1086
- /* Output-collapse hover overlay: drop the harsh inset inverse hairline,
1087
- join the radius scale. */
1088
896
  .jp-OutputArea-promptOverlay {
1089
897
  border-radius: 6px;
1090
898
  }
@@ -1094,8 +902,6 @@ select.jp-mod-styled,
1094
902
  box-shadow: none;
1095
903
  }
1096
904
 
1097
- /* Markdown blockquote: hairline accent instead of the heavy 5px grey slab,
1098
- quoted text stepped down to the secondary content color. */
1099
905
  .jp-RenderedHTMLCommon blockquote {
1100
906
  color: var(--jp-content-font-color2);
1101
907
  border-left: 3px solid var(--jp-border-color1);
@@ -1105,11 +911,9 @@ select.jp-mod-styled,
1105
911
  | Terminal
1106
912
  |---------------------------------------------------------------------------- */
1107
913
 
1108
- /* The terminal widget paints no background of its own, so the 8px body
1109
- padding shows the dock panel surface as a mismatched frame. Match the
1110
- xterm theme: 'inherit' reads --jp-layout-color0 in JS, and the forced
1111
- modes mirror the #fff/#000 the xterm theme hardcodes (they key off the
1112
- terminal's own theme setting, not the app theme). */
914
+ /* The terminal paints no background of its own, so the 8px body padding
915
+ shows the dock surface. 'inherit' reads --jp-layout-color0 in JS; the
916
+ forced modes mirror the #fff/#000 the xterm theme hardcodes. */
1113
917
  .jp-Terminal[data-term-theme='inherit'] {
1114
918
  background: var(--jp-layout-color0);
1115
919
  }
@@ -1127,17 +931,15 @@ select.jp-mod-styled,
1127
931
  |---------------------------------------------------------------------------- */
1128
932
 
1129
933
  /*
1130
- * The signature: transient surfaces frost over the workspace, the way
1131
- * native macOS menus do. Translucent theme-derived background + backdrop
1132
- * blur, as progressive enhancement — without backdrop-filter support the
1133
- * stock opaque backgrounds remain. Chromium clips backdrop-filter to
1134
- * border-radius automatically. Deliberately excludes the completer
1135
- * (readability over code) and dialogs (content surfaces stay solid).
934
+ * The signature: transient surfaces frost over the workspace. Progressive
935
+ * enhancement — without backdrop-filter the stock opaque backgrounds
936
+ * remain. Chromium clips backdrop-filter to border-radius automatically.
937
+ * Deliberately excludes the completer (readability over code) and dialogs
938
+ * (content surfaces stay solid).
1136
939
  */
1137
940
  @supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
1138
- /* Context menus + menubar dropdowns. The `background` shorthand also
1139
- clears the menubar dropdown's scroll-hint gradients, which only appear
1140
- on menus taller than the viewport — acceptable loss. */
941
+ /* The `background` shorthand also clears the dropdown scroll-hint
942
+ gradients (menus taller than the viewport) — acceptable loss. */
1141
943
  .lm-Menu.jp-ThemedContainer,
1142
944
  .lm-MenuBar-menu.jp-ThemedContainer {
1143
945
  background: color-mix(in srgb, var(--jp-layout-color0) 72%, transparent);
@@ -1151,8 +953,6 @@ select.jp-mod-styled,
1151
953
  backdrop-filter: blur(24px) saturate(140%);
1152
954
  }
1153
955
 
1154
- /* Let the frost show through the palette's opaque inner layers (the
1155
- input field keeps its own --jp-input-active-background). */
1156
956
  .jp-ModalCommandPalette .lm-CommandPalette,
1157
957
  .jp-ModalCommandPalette .lm-CommandPalette-search,
1158
958
  .jp-ModalCommandPalette .lm-CommandPalette-content {