@jupyterlab/settingeditor 4.0.0-beta.2 → 4.0.0-rc.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/lib/SettingsFormEditor.d.ts +1 -0
- package/lib/SettingsFormEditor.js +18 -4
- package/lib/SettingsFormEditor.js.map +1 -1
- package/package.json +28 -17
- package/src/SettingsFormEditor.tsx +45 -16
- package/style/base.css +84 -107
|
@@ -81,6 +81,7 @@ export class SettingsFormEditor extends React.Component {
|
|
|
81
81
|
handleChange() {
|
|
82
82
|
// Prevent unnecessary save when opening settings that haven't been modified.
|
|
83
83
|
if (!this.props.settings.isModified &&
|
|
84
|
+
this._formData &&
|
|
84
85
|
this.props.settings.isDefault(this._formData)) {
|
|
85
86
|
this.props.updateDirtyState(false);
|
|
86
87
|
return;
|
|
@@ -99,11 +100,12 @@ export class SettingsFormEditor extends React.Component {
|
|
|
99
100
|
}
|
|
100
101
|
render() {
|
|
101
102
|
const trans = this.props.translator.load('jupyterlab');
|
|
102
|
-
return (React.createElement(
|
|
103
|
+
return (React.createElement(React.Fragment, null,
|
|
103
104
|
React.createElement("div", { className: "jp-SettingsHeader" },
|
|
104
|
-
React.createElement("h2", { title: this.props.settings.schema.description }, this.props.settings.schema.title)
|
|
105
|
-
|
|
106
|
-
|
|
105
|
+
React.createElement("h2", { className: "jp-SettingsHeader-title", title: this.props.settings.schema.description }, this.props.settings.schema.title),
|
|
106
|
+
React.createElement("div", { className: "jp-SettingsHeader-buttonbar" }, this.state.isModified && (React.createElement(Button, { className: "jp-RestoreButton", onClick: this.reset }, trans.__('Restore to Defaults')))),
|
|
107
|
+
React.createElement("div", { className: "jp-SettingsHeader-description" }, this.props.settings.schema.description)),
|
|
108
|
+
React.createElement(FormComponent, { validator: validatorAjv8, schema: this.state.filteredSchema, formData: this._getFilteredFormData(this.state.filteredSchema), uiSchema: this.state.uiSchema, fields: this.props.renderers[this.props.settings.id], formContext: this.state.formContext, liveValidate: true, idPrefix: `jp-SettingsEditor-${this.props.settings.id}`, onChange: this._onChange, translator: this.props.translator })));
|
|
107
109
|
}
|
|
108
110
|
_setUiSchema(prevRenderers) {
|
|
109
111
|
var _a;
|
|
@@ -141,5 +143,17 @@ export class SettingsFormEditor extends React.Component {
|
|
|
141
143
|
this.setState({ filteredSchema });
|
|
142
144
|
}
|
|
143
145
|
}
|
|
146
|
+
_getFilteredFormData(filteredSchema) {
|
|
147
|
+
if (!(filteredSchema === null || filteredSchema === void 0 ? void 0 : filteredSchema.properties)) {
|
|
148
|
+
return this._formData;
|
|
149
|
+
}
|
|
150
|
+
const filteredFormData = JSONExt.deepCopy(this._formData);
|
|
151
|
+
for (const field in filteredFormData) {
|
|
152
|
+
if (!filteredSchema.properties[field]) {
|
|
153
|
+
delete filteredFormData[field];
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return filteredFormData;
|
|
157
|
+
}
|
|
144
158
|
}
|
|
145
159
|
//# sourceMappingURL=SettingsFormEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsFormEditor.js","sourceRoot":"","sources":["../src/SettingsFormEditor.tsx"],"names":[],"mappings":"AAAA;;;+EAG+E;AAE/E,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,
|
|
1
|
+
{"version":3,"file":"SettingsFormEditor.js","sourceRoot":"","sources":["../src/SettingsFormEditor.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jupyterlab/settingeditor",
|
|
3
|
-
"version": "4.0.0-
|
|
3
|
+
"version": "4.0.0-rc.0",
|
|
4
4
|
"description": "The JupyterLab default setting editor interface",
|
|
5
5
|
"homepage": "https://github.com/jupyterlab/jupyterlab",
|
|
6
6
|
"bugs": {
|
|
@@ -32,28 +32,33 @@
|
|
|
32
32
|
],
|
|
33
33
|
"scripts": {
|
|
34
34
|
"build": "tsc -b",
|
|
35
|
-
"
|
|
35
|
+
"build:test": "tsc --build tsconfig.test.json",
|
|
36
|
+
"clean": "rimraf lib tsconfig.tsbuildinfo",
|
|
36
37
|
"docs": "typedoc src",
|
|
38
|
+
"test": "jest",
|
|
39
|
+
"test:cov": "jest --collect-coverage",
|
|
40
|
+
"test:debug": "node --inspect-brk ../../node_modules/.bin/jest --runInBand",
|
|
41
|
+
"test:debug:watch": "node --inspect-brk ../../node_modules/.bin/jest --runInBand --watch",
|
|
37
42
|
"watch": "tsc -b --watch"
|
|
38
43
|
},
|
|
39
44
|
"dependencies": {
|
|
40
|
-
"@jupyterlab/application": "^4.0.0-
|
|
41
|
-
"@jupyterlab/apputils": "^4.0.0-
|
|
42
|
-
"@jupyterlab/codeeditor": "^4.0.0-
|
|
43
|
-
"@jupyterlab/inspector": "^4.0.0-
|
|
44
|
-
"@jupyterlab/rendermime": "^4.0.0-
|
|
45
|
-
"@jupyterlab/settingregistry": "^4.0.0-
|
|
46
|
-
"@jupyterlab/statedb": "^4.0.0-
|
|
47
|
-
"@jupyterlab/translation": "^4.0.0-
|
|
48
|
-
"@jupyterlab/ui-components": "^4.0.0-
|
|
45
|
+
"@jupyterlab/application": "^4.0.0-rc.0",
|
|
46
|
+
"@jupyterlab/apputils": "^4.0.0-rc.0",
|
|
47
|
+
"@jupyterlab/codeeditor": "^4.0.0-rc.0",
|
|
48
|
+
"@jupyterlab/inspector": "^4.0.0-rc.0",
|
|
49
|
+
"@jupyterlab/rendermime": "^4.0.0-rc.0",
|
|
50
|
+
"@jupyterlab/settingregistry": "^4.0.0-rc.0",
|
|
51
|
+
"@jupyterlab/statedb": "^4.0.0-rc.0",
|
|
52
|
+
"@jupyterlab/translation": "^4.0.0-rc.0",
|
|
53
|
+
"@jupyterlab/ui-components": "^4.0.0-rc.0",
|
|
49
54
|
"@lumino/algorithm": "^2.0.0",
|
|
50
|
-
"@lumino/commands": "^2.1.
|
|
51
|
-
"@lumino/coreutils": "^2.1.
|
|
52
|
-
"@lumino/disposable": "^2.1.
|
|
55
|
+
"@lumino/commands": "^2.1.1",
|
|
56
|
+
"@lumino/coreutils": "^2.1.1",
|
|
57
|
+
"@lumino/disposable": "^2.1.1",
|
|
53
58
|
"@lumino/messaging": "^2.0.0",
|
|
54
|
-
"@lumino/polling": "^2.1.
|
|
55
|
-
"@lumino/signaling": "^2.1.
|
|
56
|
-
"@lumino/widgets": "^2.1.
|
|
59
|
+
"@lumino/polling": "^2.1.1",
|
|
60
|
+
"@lumino/signaling": "^2.1.1",
|
|
61
|
+
"@lumino/widgets": "^2.1.1",
|
|
57
62
|
"@rjsf/core": "^5.1.0",
|
|
58
63
|
"@rjsf/utils": "^5.1.0",
|
|
59
64
|
"@rjsf/validator-ajv8": "^5.1.0",
|
|
@@ -61,8 +66,14 @@
|
|
|
61
66
|
"react": "^18.2.0"
|
|
62
67
|
},
|
|
63
68
|
"devDependencies": {
|
|
69
|
+
"@jupyterlab/testing": "^4.0.0-rc.0",
|
|
70
|
+
"@types/jest": "^29.2.0",
|
|
64
71
|
"@types/react": "^18.0.26",
|
|
72
|
+
"@types/react-test-renderer": "^18.0.0",
|
|
73
|
+
"jest": "^29.2.0",
|
|
74
|
+
"react-test-renderer": "^18.2.0",
|
|
65
75
|
"rimraf": "~3.0.0",
|
|
76
|
+
"ts-jest": "^29.1.0",
|
|
66
77
|
"typedoc": "~0.24.1",
|
|
67
78
|
"typescript": "~5.0.4"
|
|
68
79
|
},
|
|
@@ -9,7 +9,12 @@ import { showErrorMessage } from '@jupyterlab/apputils';
|
|
|
9
9
|
import { ISettingRegistry, Settings } from '@jupyterlab/settingregistry';
|
|
10
10
|
import { ITranslator } from '@jupyterlab/translation';
|
|
11
11
|
import { FormComponent } from '@jupyterlab/ui-components';
|
|
12
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
JSONExt,
|
|
14
|
+
PartialJSONObject,
|
|
15
|
+
ReadonlyJSONObject,
|
|
16
|
+
ReadonlyPartialJSONObject
|
|
17
|
+
} from '@lumino/coreutils';
|
|
13
18
|
import { Debouncer } from '@lumino/polling';
|
|
14
19
|
import { IChangeEvent } from '@rjsf/core';
|
|
15
20
|
import validatorAjv8 from '@rjsf/validator-ajv8';
|
|
@@ -105,7 +110,7 @@ export class SettingsFormEditor extends React.Component<
|
|
|
105
110
|
constructor(props: SettingsFormEditor.IProps) {
|
|
106
111
|
super(props);
|
|
107
112
|
const { settings } = props;
|
|
108
|
-
this._formData = settings.composite;
|
|
113
|
+
this._formData = settings.composite as ReadonlyJSONObject;
|
|
109
114
|
this.state = {
|
|
110
115
|
isModified: settings.isModified,
|
|
111
116
|
uiSchema: {},
|
|
@@ -149,6 +154,7 @@ export class SettingsFormEditor extends React.Component<
|
|
|
149
154
|
// Prevent unnecessary save when opening settings that haven't been modified.
|
|
150
155
|
if (
|
|
151
156
|
!this.props.settings.isModified &&
|
|
157
|
+
this._formData &&
|
|
152
158
|
this.props.settings.isDefault(this._formData)
|
|
153
159
|
) {
|
|
154
160
|
this.props.updateDirtyState(false);
|
|
@@ -177,7 +183,7 @@ export class SettingsFormEditor extends React.Component<
|
|
|
177
183
|
for (const field in this.props.settings.user) {
|
|
178
184
|
await this.props.settings.remove(field);
|
|
179
185
|
}
|
|
180
|
-
this._formData = this.props.settings.composite;
|
|
186
|
+
this._formData = this.props.settings.composite as ReadonlyJSONObject;
|
|
181
187
|
this.setState({ isModified: false });
|
|
182
188
|
};
|
|
183
189
|
|
|
@@ -185,23 +191,29 @@ export class SettingsFormEditor extends React.Component<
|
|
|
185
191
|
const trans = this.props.translator.load('jupyterlab');
|
|
186
192
|
|
|
187
193
|
return (
|
|
188
|
-
|
|
194
|
+
<>
|
|
189
195
|
<div className="jp-SettingsHeader">
|
|
190
|
-
<h2
|
|
196
|
+
<h2
|
|
197
|
+
className="jp-SettingsHeader-title"
|
|
198
|
+
title={this.props.settings.schema.description}
|
|
199
|
+
>
|
|
191
200
|
{this.props.settings.schema.title}
|
|
192
201
|
</h2>
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
202
|
+
<div className="jp-SettingsHeader-buttonbar">
|
|
203
|
+
{this.state.isModified && (
|
|
204
|
+
<Button className="jp-RestoreButton" onClick={this.reset}>
|
|
205
|
+
{trans.__('Restore to Defaults')}
|
|
206
|
+
</Button>
|
|
207
|
+
)}
|
|
208
|
+
</div>
|
|
209
|
+
<div className="jp-SettingsHeader-description">
|
|
210
|
+
{this.props.settings.schema.description}
|
|
211
|
+
</div>
|
|
200
212
|
</div>
|
|
201
213
|
<FormComponent
|
|
202
214
|
validator={validatorAjv8}
|
|
203
215
|
schema={this.state.filteredSchema as JSONSchema7}
|
|
204
|
-
formData={this.
|
|
216
|
+
formData={this._getFilteredFormData(this.state.filteredSchema)}
|
|
205
217
|
uiSchema={this.state.uiSchema}
|
|
206
218
|
fields={this.props.renderers[this.props.settings.id]}
|
|
207
219
|
formContext={this.state.formContext}
|
|
@@ -210,13 +222,13 @@ export class SettingsFormEditor extends React.Component<
|
|
|
210
222
|
onChange={this._onChange}
|
|
211
223
|
translator={this.props.translator}
|
|
212
224
|
/>
|
|
213
|
-
|
|
225
|
+
</>
|
|
214
226
|
);
|
|
215
227
|
}
|
|
216
228
|
|
|
217
229
|
private _onChange = (e: IChangeEvent<ReadonlyPartialJSONObject>): void => {
|
|
218
230
|
this.props.hasError(e.errors.length !== 0);
|
|
219
|
-
this._formData = e.formData;
|
|
231
|
+
this._formData = e.formData as ReadonlyJSONObject;
|
|
220
232
|
if (e.errors.length === 0) {
|
|
221
233
|
this.props.updateDirtyState(true);
|
|
222
234
|
void this._debouncer.invoke();
|
|
@@ -274,6 +286,23 @@ export class SettingsFormEditor extends React.Component<
|
|
|
274
286
|
}
|
|
275
287
|
}
|
|
276
288
|
|
|
289
|
+
private _getFilteredFormData(
|
|
290
|
+
filteredSchema?: ISettingRegistry.ISchema
|
|
291
|
+
): ReadonlyJSONObject {
|
|
292
|
+
if (!filteredSchema?.properties) {
|
|
293
|
+
return this._formData;
|
|
294
|
+
}
|
|
295
|
+
const filteredFormData = JSONExt.deepCopy(
|
|
296
|
+
this._formData as PartialJSONObject
|
|
297
|
+
);
|
|
298
|
+
for (const field in filteredFormData) {
|
|
299
|
+
if (!filteredSchema.properties[field]) {
|
|
300
|
+
delete filteredFormData[field];
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return filteredFormData as ReadonlyJSONObject;
|
|
304
|
+
}
|
|
305
|
+
|
|
277
306
|
private _debouncer: Debouncer<void, any>;
|
|
278
|
-
private _formData:
|
|
307
|
+
private _formData: ReadonlyJSONObject;
|
|
279
308
|
}
|
package/style/base.css
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
--jp-private-settingeditor-toolbar-height: 28px;
|
|
12
12
|
--jp-private-settingeditor-type-width: 75px;
|
|
13
13
|
--jp-private-settingeditor-modifier-indent: 5px;
|
|
14
|
+
--jp-private-settingeditor-header-spacing: 8px;
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
.jp-SettingsPanel,
|
|
@@ -41,6 +42,8 @@
|
|
|
41
42
|
background-color: var(--jp-border-color2);
|
|
42
43
|
}
|
|
43
44
|
|
|
45
|
+
/** Plugin list **/
|
|
46
|
+
|
|
44
47
|
.jp-PluginList {
|
|
45
48
|
min-width: 175px;
|
|
46
49
|
max-width: 275px;
|
|
@@ -101,18 +104,6 @@
|
|
|
101
104
|
background-color: var(--jp-error-color0);
|
|
102
105
|
}
|
|
103
106
|
|
|
104
|
-
.jp-SettingEditor-header {
|
|
105
|
-
font-size: var(--jp-content-font-size4);
|
|
106
|
-
font-weight: var(--jp-content-heading-font-weight);
|
|
107
|
-
color: var(--jp-ui-font-color0);
|
|
108
|
-
padding: 20px 0 10px 20px;
|
|
109
|
-
border-bottom: 1px solid var(--jp-border-color2);
|
|
110
|
-
position: sticky;
|
|
111
|
-
top: 0;
|
|
112
|
-
z-index: 999;
|
|
113
|
-
background-color: var(--jp-layout-color0);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
107
|
.jp-PluginList-icon {
|
|
117
108
|
display: flex;
|
|
118
109
|
height: 20px;
|
|
@@ -121,6 +112,52 @@
|
|
|
121
112
|
position: relative;
|
|
122
113
|
}
|
|
123
114
|
|
|
115
|
+
.jp-PluginList-wrapper > .jp-FilterBox {
|
|
116
|
+
margin: 8px 12px 0;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.jp-PluginList mark {
|
|
120
|
+
background-color: transparent;
|
|
121
|
+
font-weight: bold;
|
|
122
|
+
color: var(--jp-ui-font-color1);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.jp-PluginList-entry {
|
|
126
|
+
display: flex;
|
|
127
|
+
flex-direction: column;
|
|
128
|
+
border: 1px solid transparent;
|
|
129
|
+
background: transparent;
|
|
130
|
+
overflow: hidden;
|
|
131
|
+
padding: 4px 0 4px 4px;
|
|
132
|
+
white-space: nowrap;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.jp-PluginList-entry:hover {
|
|
136
|
+
background: var(--jp-layout-color1);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.jp-PluginList-entry li {
|
|
140
|
+
margin-left: 27px;
|
|
141
|
+
margin-top: 5px;
|
|
142
|
+
color: var(--jp-ui-font-color1);
|
|
143
|
+
overflow-x: hidden;
|
|
144
|
+
text-overflow: ellipsis;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.jp-PluginList-entry-label {
|
|
148
|
+
display: flex;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.jp-PluginList-entry-label-text {
|
|
152
|
+
text-overflow: ellipsis;
|
|
153
|
+
overflow-x: hidden;
|
|
154
|
+
white-space: nowrap;
|
|
155
|
+
color: var(--jp-ui-font-color1);
|
|
156
|
+
line-height: var(--jp-cell-collapser-min-height);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** Raw editor **/
|
|
160
|
+
|
|
124
161
|
.jp-SettingsRawEditor .jp-Toolbar {
|
|
125
162
|
color: var(--jp-ui-font-color0);
|
|
126
163
|
font-size: var(--jp-ui-font-size1);
|
|
@@ -156,6 +193,8 @@
|
|
|
156
193
|
height: 100%;
|
|
157
194
|
}
|
|
158
195
|
|
|
196
|
+
/** Panel **/
|
|
197
|
+
|
|
159
198
|
.jp-SettingsPanel .checkbox p {
|
|
160
199
|
font-size: var(--jp-content-font-size1);
|
|
161
200
|
}
|
|
@@ -171,122 +210,58 @@
|
|
|
171
210
|
margin-top: 5px;
|
|
172
211
|
}
|
|
173
212
|
|
|
174
|
-
.jp-SettingsPanel .jp-
|
|
175
|
-
position: absolute;
|
|
176
|
-
bottom: 0;
|
|
213
|
+
.jp-SettingsPanel .jp-SettingsEditor {
|
|
177
214
|
padding: 20px;
|
|
178
|
-
width: 100%;
|
|
179
|
-
background: var(--jp-border-color3);
|
|
180
215
|
}
|
|
181
216
|
|
|
182
|
-
.jp-SettingsPanel
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
border: none;
|
|
186
|
-
color: var(--jp-brand-color1);
|
|
187
|
-
font-size: var(--jp-ui-font-size1);
|
|
188
|
-
cursor: pointer;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
.jp-SettingsPanel .jp-SaveSettingsBanner button:hover {
|
|
192
|
-
color: var(--jp-brand-color0);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
.jp-SettingsPanel .jp-SettingsHeader h2 {
|
|
196
|
-
font-size: var(--jp-content-font-size3);
|
|
197
|
-
color: var(--jp-ui-font-color0);
|
|
198
|
-
font-weight: var(--jp-content-heading-font-weight);
|
|
199
|
-
padding-inline-start: 0.5em;
|
|
217
|
+
.jp-SettingsPanel {
|
|
218
|
+
overflow-y: auto;
|
|
219
|
+
height: 100%;
|
|
200
220
|
}
|
|
201
221
|
|
|
202
222
|
.jp-SettingsForm {
|
|
203
223
|
position: relative;
|
|
204
224
|
}
|
|
205
225
|
|
|
206
|
-
.jp-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
justify-content: space-between;
|
|
210
|
-
cursor: pointer;
|
|
211
|
-
border: 1px solid var(--jp-border-color2);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
.jp-PluginList .jp-FilterBox {
|
|
215
|
-
margin: 8px 12px 0;
|
|
226
|
+
.jp-SettingsForm > .rjsf > .form-group {
|
|
227
|
+
padding-top: 0;
|
|
228
|
+
margin-top: 0;
|
|
216
229
|
}
|
|
217
230
|
|
|
218
|
-
|
|
219
|
-
background-color: transparent;
|
|
220
|
-
font-weight: bold;
|
|
221
|
-
color: var(--jp-ui-font-color1);
|
|
222
|
-
}
|
|
231
|
+
/** Settings header **/
|
|
223
232
|
|
|
224
|
-
.jp-
|
|
225
|
-
display:
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
padding:
|
|
231
|
-
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
.jp-PluginList-entry:hover {
|
|
235
|
-
background: var(--jp-layout-color1);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
.jp-PluginList-entry li {
|
|
239
|
-
margin-left: 27px;
|
|
240
|
-
margin-top: 5px;
|
|
241
|
-
color: var(--jp-ui-font-color1);
|
|
242
|
-
overflow-x: hidden;
|
|
243
|
-
text-overflow: ellipsis;
|
|
233
|
+
.jp-SettingsHeader {
|
|
234
|
+
display: grid;
|
|
235
|
+
grid-template:
|
|
236
|
+
'title buttonbar'
|
|
237
|
+
'description buttonbar';
|
|
238
|
+
grid-template-columns: 1fr max-content;
|
|
239
|
+
padding: 0 var(--jp-private-settingeditor-header-spacing);
|
|
240
|
+
border-bottom: 1px solid var(--jp-border-color2);
|
|
244
241
|
}
|
|
245
242
|
|
|
246
|
-
.jp-
|
|
247
|
-
|
|
243
|
+
.jp-SettingsHeader-title {
|
|
244
|
+
font-size: var(--jp-content-font-size3);
|
|
245
|
+
color: var(--jp-ui-font-color0);
|
|
246
|
+
font-weight: 400;
|
|
247
|
+
grid-area: title;
|
|
248
|
+
padding: 0;
|
|
249
|
+
margin-top: calc(var(--jp-private-settingeditor-header-spacing) * 2);
|
|
250
|
+
margin-bottom: calc(var(--jp-private-settingeditor-header-spacing) / 2);
|
|
248
251
|
}
|
|
249
252
|
|
|
250
|
-
.jp-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
white-space: nowrap;
|
|
253
|
+
.jp-SettingsHeader-description {
|
|
254
|
+
grid-area: description;
|
|
255
|
+
padding-bottom: var(--jp-private-settingeditor-header-spacing);
|
|
254
256
|
color: var(--jp-ui-font-color1);
|
|
255
|
-
line-height: var(--jp-cell-collapser-min-height);
|
|
256
257
|
}
|
|
257
258
|
|
|
258
|
-
.jp-
|
|
259
|
-
|
|
260
|
-
|
|
259
|
+
.jp-SettingsHeader-buttonbar {
|
|
260
|
+
margin: auto var(--jp-private-settingeditor-header-spacing);
|
|
261
|
+
grid-row: span 2;
|
|
261
262
|
}
|
|
262
263
|
|
|
263
|
-
.jp-
|
|
264
|
-
padding: 20px;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
.jp-SettingsPanel .jp-SettingEditor-Switch .jp-switch {
|
|
268
|
-
position: absolute;
|
|
269
|
-
bottom: 0;
|
|
270
|
-
z-index: 999;
|
|
271
|
-
background-color: var(--jp-border-color3);
|
|
272
|
-
border: 1px solid var(--jp-border-color1);
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
.jp-SettingsPanel {
|
|
276
|
-
overflow-y: auto;
|
|
277
|
-
height: 100%;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
.jp-SettingsForm .jp-Buttonbar {
|
|
281
|
-
display: flex;
|
|
282
|
-
flex-direction: row;
|
|
283
|
-
justify-content: flex-end;
|
|
284
|
-
margin: 8px;
|
|
285
|
-
gap: 0.5em;
|
|
286
|
-
max-width: 800px;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
.jp-SettingsForm button.jp-RestoreButton {
|
|
264
|
+
.jp-SettingsHeader-buttonbar > .jp-RestoreButton {
|
|
290
265
|
background-color: var(--jp-warn-color-normal);
|
|
291
266
|
border: 0;
|
|
292
267
|
color: var(--jp-ui-inverse-font-color0);
|
|
@@ -296,6 +271,8 @@
|
|
|
296
271
|
overflow: auto;
|
|
297
272
|
}
|
|
298
273
|
|
|
274
|
+
/** Placeholder **/
|
|
275
|
+
|
|
299
276
|
.jp-SettingsEditor-placeholder {
|
|
300
277
|
text-align: center;
|
|
301
278
|
}
|