@jxsuite/studio 0.0.1 → 0.5.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/dist/studio.js +47638 -33445
- package/dist/studio.js.map +449 -344
- package/package.json +44 -33
- package/src/browse/browse.js +414 -0
- package/src/editor/context-menu.js +48 -1
- package/src/editor/convert-to-component.js +208 -0
- package/src/editor/inline-edit.js +33 -6
- package/src/editor/shortcuts.js +6 -1
- package/src/files/components.js +4 -2
- package/src/files/file-ops.js +102 -54
- package/src/files/files.js +22 -8
- package/src/markdown/md-convert.js +309 -11
- package/src/panels/activity-bar.js +3 -0
- package/src/panels/head-panel.js +576 -0
- package/src/panels/overlays.js +125 -0
- package/src/panels/right-panel.js +104 -0
- package/src/panels/shared.js +41 -0
- package/src/panels/signals-panel.js +95 -94
- package/src/panels/toolbar.js +217 -0
- package/src/platforms/devserver.js +58 -16
- package/src/settings/collections-editor.js +428 -0
- package/src/settings/defs-editor.js +418 -0
- package/src/settings/schema-field-ui.js +329 -0
- package/src/state.js +99 -2
- package/src/store.js +77 -41
- package/src/studio.js +1523 -1375
- package/src/ui/button-group.js +91 -0
- package/src/ui/color-selector.js +299 -0
- package/src/ui/field-row.js +47 -0
- package/src/ui/media-picker.js +172 -0
- package/src/ui/panel-resize.js +96 -0
- package/src/ui/spectrum.js +36 -2
- package/src/ui/unit-selector.js +106 -0
- package/src/ui/{jx-styled-combobox.js → value-selector.js} +7 -7
- package/src/ui/widgets.js +106 -0
- package/src/utils/inherited-style.js +54 -0
- package/src/utils/studio-utils.js +32 -0
- package/src/view.js +45 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Right panel — orchestrates Properties / Events / Style tabs. The heavy sub-templates
|
|
3
|
+
* (propertiesSidebarTemplate, renderStylePanelTemplate) remain in studio.js and are passed via ctx
|
|
4
|
+
* to avoid moving ~2000 lines in one step.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { html, render as litRender, nothing } from "lit-html";
|
|
8
|
+
import { getState, updateUi, rightPanel } from "../store.js";
|
|
9
|
+
import { tabIcon } from "./activity-bar.js";
|
|
10
|
+
import { eventsSidebarTemplate } from "./events-panel.js";
|
|
11
|
+
import { isCustomElementDoc } from "./signals-panel.js";
|
|
12
|
+
import { ensureLitState } from "./shared.js";
|
|
13
|
+
|
|
14
|
+
/** @type {any} */
|
|
15
|
+
let _ctx = null;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Mount the right panel.
|
|
19
|
+
*
|
|
20
|
+
* @param {any} ctx — { propertiesSidebarTemplate, renderStylePanelTemplate, renderCanvas,
|
|
21
|
+
* updateForcedPseudoPreview }
|
|
22
|
+
*/
|
|
23
|
+
export function mount(ctx) {
|
|
24
|
+
_ctx = ctx;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function unmount() {
|
|
28
|
+
_ctx = null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function render() {
|
|
32
|
+
if (!_ctx) return;
|
|
33
|
+
try {
|
|
34
|
+
ensureLitState(rightPanel);
|
|
35
|
+
litRender(rightPanelTemplate(), rightPanel);
|
|
36
|
+
} catch (e) {
|
|
37
|
+
console.error("right-panel render error:", e);
|
|
38
|
+
try {
|
|
39
|
+
rightPanel.textContent = "";
|
|
40
|
+
// @ts-ignore
|
|
41
|
+
delete rightPanel["_$litPart$"];
|
|
42
|
+
litRender(rightPanelTemplate(), rightPanel);
|
|
43
|
+
} catch (e2) {
|
|
44
|
+
console.error("right-panel retry failed:", e2);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
_ctx.updateForcedPseudoPreview();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function rightPanelTemplate() {
|
|
51
|
+
const S = getState();
|
|
52
|
+
const tab = S.ui.rightTab;
|
|
53
|
+
|
|
54
|
+
const panelTabs = [
|
|
55
|
+
{ value: "properties", icon: "sp-icon-properties", label: "Properties" },
|
|
56
|
+
{ value: "events", icon: "sp-icon-event", label: "Events" },
|
|
57
|
+
{ value: "style", icon: "sp-icon-brush", label: "Style" },
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
const tabsT = html`
|
|
61
|
+
<div class="panel-tabs">
|
|
62
|
+
<sp-tabs
|
|
63
|
+
selected=${tab}
|
|
64
|
+
quiet
|
|
65
|
+
@change=${(/** @type {any} */ e) => {
|
|
66
|
+
const sel = e.target.selected;
|
|
67
|
+
if (sel && sel !== tab) {
|
|
68
|
+
updateUi("rightTab", sel);
|
|
69
|
+
}
|
|
70
|
+
}}
|
|
71
|
+
>
|
|
72
|
+
${panelTabs.map(
|
|
73
|
+
(t) => html`
|
|
74
|
+
<sp-tab value=${t.value} title=${t.label} aria-label=${t.label}>
|
|
75
|
+
${tabIcon(t.icon, "xs")}
|
|
76
|
+
</sp-tab>
|
|
77
|
+
`,
|
|
78
|
+
)}
|
|
79
|
+
</sp-tabs>
|
|
80
|
+
</div>
|
|
81
|
+
`;
|
|
82
|
+
|
|
83
|
+
/** @type {any} */
|
|
84
|
+
let bodyT = nothing;
|
|
85
|
+
if (tab === "properties") {
|
|
86
|
+
bodyT = _ctx.propertiesSidebarTemplate();
|
|
87
|
+
} else if (tab === "events") {
|
|
88
|
+
bodyT = eventsSidebarTemplate(S, {
|
|
89
|
+
isCustomElementDoc: () => isCustomElementDoc(S),
|
|
90
|
+
renderCanvas: _ctx.renderCanvas,
|
|
91
|
+
});
|
|
92
|
+
} else if (tab === "style") {
|
|
93
|
+
try {
|
|
94
|
+
bodyT = _ctx.renderStylePanelTemplate();
|
|
95
|
+
} catch (/** @type {any} */ e) {
|
|
96
|
+
console.error("[renderStylePanelTemplate]", e);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return html`
|
|
101
|
+
${tabsT}
|
|
102
|
+
<div class="panel-body">${bodyT}</div>
|
|
103
|
+
`;
|
|
104
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared panel utilities — portable helpers extracted from studio.js. These functions depend only
|
|
3
|
+
* on store.js / state.js exports (no circular deps).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Convert a $media key like "--tablet" to a friendly display name "Tablet". "--" returns "Base".
|
|
8
|
+
*
|
|
9
|
+
* @param {any} name
|
|
10
|
+
*/
|
|
11
|
+
export function mediaDisplayName(name) {
|
|
12
|
+
if (name === "--") return "Base";
|
|
13
|
+
return (
|
|
14
|
+
name
|
|
15
|
+
.replace(/^--/, "")
|
|
16
|
+
.replace(/-/g, " ")
|
|
17
|
+
.replace(/\b\w/g, (/** @type {any} */ c) => c.toUpperCase()) || name
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Ensure Lit's internal ChildPart markers are valid. If corrupted, clears the container so Lit
|
|
23
|
+
* rebuilds from scratch on the next render.
|
|
24
|
+
*
|
|
25
|
+
* @param {HTMLElement} container
|
|
26
|
+
*/
|
|
27
|
+
export function ensureLitState(container) {
|
|
28
|
+
// @ts-ignore — Lit stores a ChildPart on this private property
|
|
29
|
+
const part = container["_$litPart$"];
|
|
30
|
+
if (!part) return;
|
|
31
|
+
const start = part._$startNode;
|
|
32
|
+
const end = part._$endNode;
|
|
33
|
+
const startBad = start && start.parentNode !== container;
|
|
34
|
+
const endBad = end && end !== container && end.parentNode !== container;
|
|
35
|
+
if (startBad || endBad) {
|
|
36
|
+
console.warn("ensureLitState: clearing corrupted Lit state on", container.id || container);
|
|
37
|
+
container.textContent = "";
|
|
38
|
+
// @ts-ignore
|
|
39
|
+
delete container["_$litPart$"];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import { html, nothing } from "lit-html";
|
|
8
8
|
import { addDef, removeDef, updateDef, renameDef, update } from "../store.js";
|
|
9
|
+
import { renderFieldRow } from "../ui/field-row.js";
|
|
9
10
|
import { fetchPluginSchema, pluginSchemaCache } from "../services/code-services.js";
|
|
10
11
|
|
|
11
12
|
// ─── Module-local state ─────────────────────────────────────────────────────
|
|
@@ -180,11 +181,11 @@ export function signalFieldRow(
|
|
|
180
181
|
) {
|
|
181
182
|
/** @type {any} */
|
|
182
183
|
let debounce;
|
|
183
|
-
return
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
184
|
+
return renderFieldRow({
|
|
185
|
+
prop: label,
|
|
186
|
+
label,
|
|
187
|
+
hasValue: false,
|
|
188
|
+
widget: html`
|
|
188
189
|
<sp-textfield
|
|
189
190
|
size="s"
|
|
190
191
|
value=${value}
|
|
@@ -193,8 +194,8 @@ export function signalFieldRow(
|
|
|
193
194
|
debounce = setTimeout(() => onChange(e.target.value), 400);
|
|
194
195
|
}}
|
|
195
196
|
></sp-textfield>
|
|
196
|
-
|
|
197
|
-
|
|
197
|
+
`,
|
|
198
|
+
});
|
|
198
199
|
}
|
|
199
200
|
|
|
200
201
|
/** Normalize a parameter entry to a CEM object. */
|
|
@@ -206,9 +207,9 @@ export function normParam(/** @type {any} */ p) {
|
|
|
206
207
|
|
|
207
208
|
/**
|
|
208
209
|
* @param {any} S
|
|
209
|
-
* @param {
|
|
210
|
+
* @param {any} ctx
|
|
210
211
|
*/
|
|
211
|
-
export function renderSignalsTemplate(S,
|
|
212
|
+
export function renderSignalsTemplate(S, ctx) {
|
|
212
213
|
const defs = S.document.state || {};
|
|
213
214
|
const entries = Object.entries(defs);
|
|
214
215
|
|
|
@@ -242,7 +243,7 @@ export function renderSignalsTemplate(S, { renderLeftPanel, renderCanvas }) {
|
|
|
242
243
|
@sp-accordion-item-toggle=${() => {
|
|
243
244
|
if (collapsedCats.has(key)) collapsedCats.delete(key);
|
|
244
245
|
else collapsedCats.add(key);
|
|
245
|
-
renderLeftPanel();
|
|
246
|
+
ctx.renderLeftPanel();
|
|
246
247
|
}}
|
|
247
248
|
>
|
|
248
249
|
${items.map(([name, def]) => {
|
|
@@ -253,7 +254,7 @@ export function renderSignalsTemplate(S, { renderLeftPanel, renderCanvas }) {
|
|
|
253
254
|
class="signal-row${isExpanded ? " expanded" : ""}"
|
|
254
255
|
@click=${() => {
|
|
255
256
|
expandedSignal = isExpanded ? null : name;
|
|
256
|
-
renderLeftPanel();
|
|
257
|
+
ctx.renderLeftPanel();
|
|
257
258
|
}}
|
|
258
259
|
>
|
|
259
260
|
<span class="signal-badge ${defCategory(def)}">${defBadgeLabel(def)}</span>
|
|
@@ -273,7 +274,7 @@ export function renderSignalsTemplate(S, { renderLeftPanel, renderCanvas }) {
|
|
|
273
274
|
</div>
|
|
274
275
|
${isExpanded
|
|
275
276
|
? html`<div class="signal-editor">
|
|
276
|
-
${renderSignalEditorTemplate(S, name, def,
|
|
277
|
+
${renderSignalEditorTemplate(S, name, def, ctx)}
|
|
277
278
|
</div>`
|
|
278
279
|
: nothing}
|
|
279
280
|
`;
|
|
@@ -305,7 +306,7 @@ export function renderSignalsTemplate(S, { renderLeftPanel, renderCanvas }) {
|
|
|
305
306
|
}
|
|
306
307
|
update(addDef(S, n, structuredClone(template)));
|
|
307
308
|
expandedSignal = n;
|
|
308
|
-
renderLeftPanel();
|
|
309
|
+
ctx.renderLeftPanel();
|
|
309
310
|
}}
|
|
310
311
|
>
|
|
311
312
|
<sp-menu-item value="state">State Signal</sp-menu-item>
|
|
@@ -333,7 +334,7 @@ function renderSignalEditorTemplate(
|
|
|
333
334
|
/** @type {any} */ S,
|
|
334
335
|
/** @type {any} */ name,
|
|
335
336
|
/** @type {any} */ def,
|
|
336
|
-
/** @type {
|
|
337
|
+
/** @type {any} */ ctx,
|
|
337
338
|
) {
|
|
338
339
|
const cat = defCategory(def);
|
|
339
340
|
|
|
@@ -344,11 +345,11 @@ function renderSignalEditorTemplate(
|
|
|
344
345
|
/** @type {any} */ currentVal,
|
|
345
346
|
/** @type {any} */ onChange,
|
|
346
347
|
) => {
|
|
347
|
-
return
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
348
|
+
return renderFieldRow({
|
|
349
|
+
prop: label,
|
|
350
|
+
label,
|
|
351
|
+
hasValue: false,
|
|
352
|
+
widget: html`
|
|
352
353
|
<sp-picker
|
|
353
354
|
size="s"
|
|
354
355
|
value=${currentVal}
|
|
@@ -358,8 +359,8 @@ function renderSignalEditorTemplate(
|
|
|
358
359
|
(/** @type {any} */ opt) => html`<sp-menu-item value=${opt}>${opt}</sp-menu-item>`,
|
|
359
360
|
)}
|
|
360
361
|
</sp-picker>
|
|
361
|
-
|
|
362
|
-
|
|
362
|
+
`,
|
|
363
|
+
});
|
|
363
364
|
};
|
|
364
365
|
|
|
365
366
|
// Helper for textarea rows
|
|
@@ -371,11 +372,11 @@ function renderSignalEditorTemplate(
|
|
|
371
372
|
) => {
|
|
372
373
|
/** @type {any} */
|
|
373
374
|
let debounce;
|
|
374
|
-
return
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
375
|
+
return renderFieldRow({
|
|
376
|
+
prop: label,
|
|
377
|
+
label,
|
|
378
|
+
hasValue: false,
|
|
379
|
+
widget: html`
|
|
379
380
|
<textarea
|
|
380
381
|
class="field-input"
|
|
381
382
|
style="min-height:${opts.minHeight || "40px"};${opts.mono
|
|
@@ -387,8 +388,8 @@ function renderSignalEditorTemplate(
|
|
|
387
388
|
debounce = setTimeout(() => onChange(e.target.value), 500);
|
|
388
389
|
}}
|
|
389
390
|
></textarea>
|
|
390
|
-
|
|
391
|
-
|
|
391
|
+
`,
|
|
392
|
+
});
|
|
392
393
|
};
|
|
393
394
|
|
|
394
395
|
// Name field (common to all)
|
|
@@ -415,17 +416,19 @@ function renderSignalEditorTemplate(
|
|
|
415
416
|
${signalFieldRow("Attribute", def.attribute || "", (/** @type {any} */ v) =>
|
|
416
417
|
update(updateDef(S, name, { attribute: v || undefined })),
|
|
417
418
|
)}
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
419
|
+
${renderFieldRow({
|
|
420
|
+
prop: "reflects",
|
|
421
|
+
label: "Reflects",
|
|
422
|
+
hasValue: false,
|
|
423
|
+
widget: html`
|
|
424
|
+
<sp-checkbox
|
|
425
|
+
class="field-check"
|
|
426
|
+
?checked=${!!def.reflects}
|
|
427
|
+
@change=${(/** @type {any} */ e) =>
|
|
428
|
+
update(updateDef(S, name, { reflects: e.target.checked || undefined }))}
|
|
429
|
+
></sp-checkbox>
|
|
430
|
+
`,
|
|
431
|
+
})}
|
|
429
432
|
${signalFieldRow(
|
|
430
433
|
"Deprecated",
|
|
431
434
|
typeof def.deprecated === "string" ? def.deprecated : "",
|
|
@@ -464,38 +467,40 @@ function renderSignalEditorTemplate(
|
|
|
464
467
|
/** @type {any} */
|
|
465
468
|
let debounce;
|
|
466
469
|
fields = html`
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
470
|
+
${renderFieldRow({
|
|
471
|
+
prop: "expression",
|
|
472
|
+
label: "Expression",
|
|
473
|
+
hasValue: false,
|
|
474
|
+
widget: html`
|
|
475
|
+
<textarea
|
|
476
|
+
class="field-input"
|
|
477
|
+
style="min-height:40px"
|
|
478
|
+
.value=${def.$compute || ""}
|
|
479
|
+
@input=${(/** @type {any} */ e) => {
|
|
480
|
+
clearTimeout(debounce);
|
|
481
|
+
debounce = setTimeout(() => {
|
|
482
|
+
const expr = e.target.value;
|
|
483
|
+
const depMatches = expr.match(/\$[a-zA-Z_]\w*/g) || [];
|
|
484
|
+
const deps = [...new Set(depMatches)].map((d) => `#/state/${d}`);
|
|
485
|
+
update(updateDef(S, name, { $compute: expr, $deps: deps }));
|
|
486
|
+
}, 500);
|
|
487
|
+
}}
|
|
488
|
+
></textarea>
|
|
489
|
+
`,
|
|
490
|
+
})}
|
|
486
491
|
${def.$deps && def.$deps.length > 0
|
|
487
|
-
?
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
+
? renderFieldRow({
|
|
493
|
+
prop: "dependencies",
|
|
494
|
+
label: "Dependencies",
|
|
495
|
+
hasValue: false,
|
|
496
|
+
widget: html`
|
|
492
497
|
<span class="signal-hint" style="flex:1;max-width:none"
|
|
493
498
|
>${def.$deps
|
|
494
499
|
.map((/** @type {any} */ d) => d.replace("#/state/", ""))
|
|
495
500
|
.join(", ")}</span
|
|
496
501
|
>
|
|
497
|
-
|
|
498
|
-
|
|
502
|
+
`,
|
|
503
|
+
})
|
|
499
504
|
: nothing}
|
|
500
505
|
`;
|
|
501
506
|
} else if (cat === "data") {
|
|
@@ -514,7 +519,7 @@ function renderDataSourceFields(
|
|
|
514
519
|
/** @type {any} */ def,
|
|
515
520
|
/** @type {any} */ textareaRow,
|
|
516
521
|
/** @type {any} */ pickerRow,
|
|
517
|
-
/** @type {
|
|
522
|
+
/** @type {any} */ ctx,
|
|
518
523
|
) {
|
|
519
524
|
const proto = def.$prototype;
|
|
520
525
|
|
|
@@ -602,7 +607,7 @@ function renderFunctionFields(
|
|
|
602
607
|
/** @type {any} */ name,
|
|
603
608
|
/** @type {any} */ def,
|
|
604
609
|
/** @type {any} */ textareaRow,
|
|
605
|
-
/** @type {
|
|
610
|
+
/** @type {any} */ ctx,
|
|
606
611
|
) {
|
|
607
612
|
const srcFields = def.$src
|
|
608
613
|
? html`
|
|
@@ -629,7 +634,7 @@ function renderFunctionFields(
|
|
|
629
634
|
class="kv-add"
|
|
630
635
|
style="margin-top:4px"
|
|
631
636
|
@click=${() => {
|
|
632
|
-
|
|
637
|
+
ctx.updateSession({ ui: { editingFunction: { type: "def", defName: name } } });
|
|
633
638
|
ctx.renderCanvas();
|
|
634
639
|
}}
|
|
635
640
|
>
|
|
@@ -650,18 +655,18 @@ function renderParameterEditorTemplate(
|
|
|
650
655
|
/** @type {any} */ S,
|
|
651
656
|
/** @type {any} */ name,
|
|
652
657
|
/** @type {any} */ def,
|
|
653
|
-
/** @type {
|
|
658
|
+
/** @type {any} */ ctx,
|
|
654
659
|
) {
|
|
655
660
|
const params = (def.parameters || []).map(normParam);
|
|
656
661
|
const isAdvanced = advancedParamOpen.has(name);
|
|
657
662
|
|
|
658
663
|
if (!isAdvanced) {
|
|
659
664
|
// Basic mode: name chips
|
|
660
|
-
return
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
+
return renderFieldRow({
|
|
666
|
+
prop: "parameters",
|
|
667
|
+
label: "Parameters",
|
|
668
|
+
hasValue: false,
|
|
669
|
+
widget: html`
|
|
665
670
|
<div style="display:flex;flex-wrap:wrap;gap:4px;align-items:center">
|
|
666
671
|
${params.map(
|
|
667
672
|
(/** @type {any} */ p, /** @type {any} */ i) => html`
|
|
@@ -708,16 +713,16 @@ function renderParameterEditorTemplate(
|
|
|
708
713
|
}}
|
|
709
714
|
>▸ Advanced</span
|
|
710
715
|
>
|
|
711
|
-
|
|
712
|
-
|
|
716
|
+
`,
|
|
717
|
+
});
|
|
713
718
|
}
|
|
714
719
|
|
|
715
720
|
// Advanced mode: full rows
|
|
716
|
-
return
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
+
return renderFieldRow({
|
|
722
|
+
prop: "parameters",
|
|
723
|
+
label: "Parameters",
|
|
724
|
+
hasValue: false,
|
|
725
|
+
widget: html`
|
|
721
726
|
<div style="display:flex;flex-direction:column;gap:4px">
|
|
722
727
|
${params.map(
|
|
723
728
|
(/** @type {any} */ p, /** @type {any} */ i) => html`
|
|
@@ -796,8 +801,8 @@ function renderParameterEditorTemplate(
|
|
|
796
801
|
}}
|
|
797
802
|
>▾ Basic</span
|
|
798
803
|
>
|
|
799
|
-
|
|
800
|
-
|
|
804
|
+
`,
|
|
805
|
+
});
|
|
801
806
|
}
|
|
802
807
|
|
|
803
808
|
/** Render CEM emits editor for function state entries. */
|
|
@@ -1023,16 +1028,12 @@ export function renderSchemaFieldsTemplate(
|
|
|
1023
1028
|
></sp-textfield>`;
|
|
1024
1029
|
}
|
|
1025
1030
|
|
|
1026
|
-
return
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
</div>
|
|
1033
|
-
${control}
|
|
1034
|
-
</div>
|
|
1035
|
-
`;
|
|
1031
|
+
return renderFieldRow({
|
|
1032
|
+
prop: ps.name,
|
|
1033
|
+
label: labelText,
|
|
1034
|
+
hasValue: false,
|
|
1035
|
+
widget: control,
|
|
1036
|
+
});
|
|
1036
1037
|
});
|
|
1037
1038
|
}
|
|
1038
1039
|
|
|
@@ -1044,7 +1045,7 @@ export function renderExternalPrototypeEditorTemplate(
|
|
|
1044
1045
|
/** @type {any} */ S,
|
|
1045
1046
|
/** @type {any} */ name,
|
|
1046
1047
|
/** @type {any} */ def,
|
|
1047
|
-
/** @type {
|
|
1048
|
+
/** @type {any} */ ctx,
|
|
1048
1049
|
) {
|
|
1049
1050
|
// Schema-driven config fields (async with cache)
|
|
1050
1051
|
/** @type {any} */
|