@jxsuite/studio 5.0.0 → 5.2.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.
Files changed (132) hide show
  1. package/dist/chunks/{cf-account-picker-fyf63pmy.js → cf-account-picker-h4dab9bq.js} +10 -10
  2. package/dist/chunks/{cf-settings-71bv5zn9.js → cf-settings-adg74qsk.js} +4 -4
  3. package/dist/chunks/components-5y78e05d.js +20 -0
  4. package/dist/chunks/content-source-sgg1sv6n.js +46 -0
  5. package/dist/chunks/{convert-to-repeater-d0cgnb6d.js → convert-to-repeater-mf1cxgfn.js} +25 -25
  6. package/dist/chunks/entry-commands-w9qsxa6q.js +42 -0
  7. package/dist/chunks/{extension-sections-fy7q4fe9.js → extension-sections-c6zwzbre.js} +27 -27
  8. package/dist/chunks/file-ops-vrpq1jjk.js +47 -0
  9. package/dist/chunks/{files-ef8fgs3w.js → files-msaf95y6.js} +33 -32
  10. package/dist/chunks/{format-host-3c33nwr8.js → format-host-f64fnesp.js} +2 -2
  11. package/dist/chunks/{fs-events-13tj6sex.js → fs-events-3y6y0nrm.js} +6 -6
  12. package/dist/chunks/git-panel-bv5e22j0.js +50 -0
  13. package/dist/chunks/grid-view-1p6hsyjx.css +8406 -0
  14. package/dist/chunks/grid-view-paj67nr5.js +15322 -0
  15. package/dist/chunks/{iframe-host-jgesd924.js → iframe-host-dh5np8vk.js} +14 -14
  16. package/dist/chunks/{layers-1nq5evsh.js → layers-1vcfdbet.js} +7 -6
  17. package/dist/chunks/layers-panel-fksbdg4q.js +40 -0
  18. package/dist/chunks/{media-picker-2qbetq73.js → media-picker-p49nhqhs.js} +14 -14
  19. package/dist/chunks/menu-qht48vnc.js +15 -0
  20. package/dist/chunks/{monaco-buffer-bhy3hb6m.js → monaco-buffer-pykwbm92.js} +3 -3
  21. package/dist/chunks/{notify-628t0anh.js → notify-42gk8ha1.js} +2 -2
  22. package/dist/chunks/{parse-0zx14y15.js → parse-reg9eevt.js} +2 -2
  23. package/dist/chunks/publish-panel-vz23wwmg.js +27 -0
  24. package/dist/chunks/quick-search-e9rp74m8.js +46 -0
  25. package/dist/chunks/{references-n553f0e1.js → references-h69xp9zz.js} +4 -4
  26. package/dist/chunks/right-panel-j97t2yvy.js +45 -0
  27. package/dist/chunks/{studio-18avnhjp.js → studio-01jeck2y.js} +36 -30
  28. package/dist/chunks/{studio-9xxz1q69.js → studio-14d9tq4d.js} +9 -9
  29. package/dist/chunks/{studio-xsykpvsh.js → studio-15f3kxqe.js} +19 -19
  30. package/dist/chunks/studio-1tbjfqv4.js +146 -0
  31. package/dist/chunks/{studio-79y5sz51.js → studio-28vs5k2y.js} +2 -2
  32. package/dist/chunks/{studio-3hxkd92t.js → studio-2mdbbc76.js} +10 -10
  33. package/dist/chunks/{studio-7r42c6ca.js → studio-3ntvq6cg.js} +5 -5
  34. package/dist/chunks/{studio-8jn5yhyn.js → studio-4c041r8y.js} +3 -3
  35. package/dist/chunks/{studio-qahxvnan.js → studio-4r14yzyy.js} +4 -4
  36. package/dist/chunks/{studio-arfpe389.js → studio-4xmjcrg3.js} +6 -6
  37. package/dist/chunks/{studio-5523bpzt.js → studio-5nz00bhh.js} +3 -3
  38. package/dist/chunks/{studio-x3rty6tr.js → studio-5t7ena5z.js} +8 -8
  39. package/dist/chunks/{studio-5rt7sqa0.js → studio-66arbpc2.js} +13 -19
  40. package/dist/chunks/{studio-fabxk6r9.js → studio-68fydsrj.js} +15 -15
  41. package/dist/chunks/{studio-tb3ev01j.js → studio-9j6sfeba.js} +6 -6
  42. package/dist/chunks/{studio-akbww0j5.js → studio-a1pswps3.js} +38 -38
  43. package/dist/chunks/{studio-6xa21ej9.js → studio-c04nzbby.js} +2 -2
  44. package/dist/chunks/{studio-4m0haseg.js → studio-c07s5ckd.js} +4 -4
  45. package/dist/chunks/{studio-57mf66w2.js → studio-ctm7bhx5.js} +14 -14
  46. package/dist/chunks/{studio-p1dw8wfw.js → studio-d8z5bajd.js} +14 -10
  47. package/dist/chunks/{studio-vz68yn9e.js → studio-en82c639.js} +6 -6
  48. package/dist/chunks/{studio-rkstz940.js → studio-etvx9s2g.js} +21 -12
  49. package/dist/chunks/{studio-az3zd49t.js → studio-ez11dmdh.js} +127 -37
  50. package/dist/chunks/{studio-sgdc5pfc.js → studio-hdc2jt3z.js} +4 -4
  51. package/dist/chunks/{studio-s6z853aq.js → studio-hhskq2mr.js} +24 -23
  52. package/dist/chunks/{studio-6ewqv390.js → studio-m1p9b6c3.js} +5 -5
  53. package/dist/chunks/{studio-25hkdrkw.js → studio-mpzwze9x.js} +12 -12
  54. package/dist/chunks/{studio-8qtrpzr3.js → studio-ncn9e189.js} +7 -7
  55. package/dist/chunks/{studio-81390n6f.js → studio-nq5yf5mp.js} +1 -1
  56. package/dist/chunks/{studio-5jy81t3s.js → studio-p6pmwkvh.js} +229 -24
  57. package/dist/chunks/{studio-3gxv60tn.js → studio-qa7fzxan.js} +4 -4
  58. package/dist/chunks/{studio-7xptrg0j.js → studio-sar8g54p.js} +8 -8
  59. package/dist/chunks/studio-t171hxhe.js +23 -0
  60. package/dist/chunks/{studio-em9nw8eh.js → studio-t3adrr56.js} +20 -17
  61. package/dist/chunks/{studio-hhvs4sdg.js → studio-vn5hske5.js} +10 -4
  62. package/dist/chunks/{studio-pm6hgy7r.js → studio-vt0tj32j.js} +29 -42
  63. package/dist/chunks/{studio-d1ja2x9r.js → studio-wjpgxywa.js} +4 -4
  64. package/dist/chunks/{studio-q3x06vmj.js → studio-wnsyffg1.js} +2 -2
  65. package/dist/chunks/{studio-rpyah2ew.js → studio-x10fp4tp.js} +64 -24
  66. package/dist/chunks/{studio-26d7myd1.js → studio-x72j58vw.js} +4 -4
  67. package/dist/chunks/{studio-cpvb2ed1.js → studio-y4f9fdge.js} +8 -8
  68. package/dist/chunks/{studio-erdatzvp.js → studio-ympe0n7a.js} +35 -6
  69. package/dist/chunks/{studio-y9zedyjn.js → studio-z2smx5ce.js} +2 -2
  70. package/dist/chunks/studio-zjjde71a.js +148 -0
  71. package/dist/chunks/{workspace-wrew8zk4.js → workspace-bnw54cha.js} +18 -10
  72. package/dist/iframe-entry.js +102 -11
  73. package/dist/studio.css +1 -2
  74. package/dist/studio.js +1113 -16062
  75. package/package.json +11 -11
  76. package/src/canvas/canvas-utils.ts +29 -2
  77. package/src/commands/command-args.ts +37 -2
  78. package/src/commands/registry.ts +18 -8
  79. package/src/commands/run-reported.ts +120 -0
  80. package/src/editor/shortcuts.ts +11 -23
  81. package/src/files/components.ts +39 -0
  82. package/src/files/files.ts +41 -17
  83. package/src/grid/grid-lazy.ts +59 -0
  84. package/src/grid/grid-open.ts +20 -3
  85. package/src/grid/grid-panel.ts +43 -9
  86. package/src/i18n/i18n-commands.ts +10 -0
  87. package/src/media/media-open.ts +14 -2
  88. package/src/packages/pull-package-sync.ts +5 -1
  89. package/src/panels/ai-panel.ts +5 -2
  90. package/src/panels/block-action-bar.ts +7 -2
  91. package/src/panels/i18n-panel.ts +8 -15
  92. package/src/panels/jump-bar.ts +3 -2
  93. package/src/panels/pane-context.ts +5 -4
  94. package/src/panels/pane-grid.ts +100 -10
  95. package/src/panels/problems-panel.ts +6 -2
  96. package/src/panels/quick-search.ts +6 -12
  97. package/src/panels/settings-menu.ts +5 -15
  98. package/src/panels/tab-drop.ts +220 -0
  99. package/src/panels/tab-strip.ts +238 -33
  100. package/src/services/ai-command-tools.ts +78 -8
  101. package/src/services/ai-models.ts +13 -0
  102. package/src/services/ai-project-tools.ts +8 -2
  103. package/src/services/ai-system-prompt.ts +4 -8
  104. package/src/services/ai-tools.ts +8 -69
  105. package/src/services/document-assistant.ts +9 -6
  106. package/src/studio.ts +24 -8
  107. package/src/surfaces/commandbar.json +35 -24
  108. package/src/surfaces/commandbar.ts +6 -5
  109. package/src/surfaces/pane-grid.json +35 -3
  110. package/src/surfaces/pane-grid.ts +26 -4
  111. package/src/surfaces/statusbar.ts +2 -1
  112. package/src/surfaces/tab-strip.json +16 -39
  113. package/src/surfaces/tab-strip.ts +76 -12
  114. package/src/tabs/project-config.ts +45 -11
  115. package/src/ui/ai-credentials-form.ts +12 -1
  116. package/src/ui/layers.ts +4 -1
  117. package/src/workspace/pane-derive.ts +7 -5
  118. package/src/workspace/session.ts +3 -3
  119. package/src/workspace/workspace.ts +220 -43
  120. package/styles/shell-frame.css +8 -0
  121. package/styles/shell-frame.json +4 -0
  122. package/dist/chunks/components-2w1f35qs.js +0 -18
  123. package/dist/chunks/content-source-3wqeas45.js +0 -46
  124. package/dist/chunks/entry-commands-d6g50j7s.js +0 -42
  125. package/dist/chunks/file-ops-3btj6st0.js +0 -47
  126. package/dist/chunks/git-panel-4wp2rn9b.js +0 -49
  127. package/dist/chunks/layers-panel-ar2gh90g.js +0 -40
  128. package/dist/chunks/menu-rf7n72mf.js +0 -14
  129. package/dist/chunks/publish-panel-98f7sr3g.js +0 -27
  130. package/dist/chunks/quick-search-srzz83k2.js +0 -45
  131. package/dist/chunks/right-panel-rrgx2dn3.js +0 -45
  132. package/dist/chunks/studio-d055c37e.js +0 -62
@@ -5,18 +5,18 @@ import {
5
5
  toRaw,
6
6
  pinClock,
7
7
  notify2
8
- } from "./studio-p1dw8wfw.js";
8
+ } from "./studio-d8z5bajd.js";
9
9
  import {
10
10
  getPlatform2
11
11
  } from "./studio-6nzaktvy.js";
12
12
  import {
13
13
  loadedMonaco
14
- } from "./studio-79y5sz51.js";
14
+ } from "./studio-28vs5k2y.js";
15
15
  import {
16
16
  projectState,
17
17
  setProjectState,
18
18
  requireProjectState
19
- } from "./studio-6ewqv390.js";
19
+ } from "./studio-m1p9b6c3.js";
20
20
  import {
21
21
  isWellFormedLocale,
22
22
  resolveI18n,
@@ -36,12 +36,12 @@ import {
36
36
  workspace2,
37
37
  focusPane2,
38
38
  setWorkspaceProject2
39
- } from "./studio-az3zd49t.js";
39
+ } from "./studio-ez11dmdh.js";
40
40
  import {
41
41
  SETTINGS,
42
42
  readStoredSetting,
43
43
  setSetting
44
- } from "./studio-y9zedyjn.js";
44
+ } from "./studio-z2smx5ce.js";
45
45
  import {
46
46
  errorMessage2
47
47
  } from "./studio-yxa81f45.js";
@@ -1305,9 +1305,7 @@ function liveConfig() {
1305
1305
  }
1306
1306
  function replaceContents(target, source) {
1307
1307
  for (const key of Object.keys(target)) {
1308
- if (!Object.hasOwn(source, key)) {
1309
- delete target[key];
1310
- }
1308
+ delete target[key];
1311
1309
  }
1312
1310
  Object.assign(target, source);
1313
1311
  }
@@ -1347,7 +1345,7 @@ function extensionsKey(config) {
1347
1345
  return JSON.stringify(config.extensions ?? null);
1348
1346
  }
1349
1347
  async function refreshExtensionSurfaces() {
1350
- const { loadFormats, refreshExtensionUi, refreshFormats } = await (__preload("3c33nwr8"), import("./format-host-3c33nwr8.js"));
1348
+ const { loadFormats, refreshExtensionUi, refreshFormats } = await (__preload("f64fnesp"), import("./format-host-f64fnesp.js"));
1351
1349
  refreshFormats();
1352
1350
  loadFormats();
1353
1351
  refreshExtensionUi(getPlatform2());
@@ -1399,7 +1397,7 @@ async function commitProjectConfig(patch) {
1399
1397
  }
1400
1398
  return { ok: true };
1401
1399
  }
1402
- async function adoptProjectConfig(config) {
1400
+ async function adoptProjectConfig(config, text) {
1403
1401
  if (!requireProjectState()) {
1404
1402
  setWorkspaceProject2(workspace2.projectRoot, config);
1405
1403
  return;
@@ -1408,6 +1406,8 @@ async function adoptProjectConfig(config) {
1408
1406
  transactDoc(tab, (t) => replaceContents(t.doc.document, config), { skipHistory: true });
1409
1407
  tab.doc.dirty = false;
1410
1408
  await seedCommitted();
1409
+ _layout = deriveJsonLayout(text);
1410
+ tab.doc.layout = _layout;
1411
1411
  _committed = serializeProjectConfig(config);
1412
1412
  }
1413
1413
 
@@ -1582,5 +1582,5 @@ async function updateSiteConfig(patch) {
1582
1582
 
1583
1583
  export { parseJsonDocument, serializeJson, serializeProjectConfig, lendProjectConfigLayout, commitProjectConfig, adoptProjectConfig, getEffectiveMedia, getEffectiveStyle, getEffectiveImports, getEffectiveElements, getEffectiveHead, getEffectiveLocales, invalidateLayoutCache, getEffectiveLayoutPath, resolveLayoutDoc, distributePageIntoLayout, updateSiteConfig, restoreSession, requireNavigatorPanelId, DEFAULT_INSPECTOR_TAB, isInspectorTabId, BOTTOM_TAB_IDS, DEFAULT_BOTTOM_TAB, isBottomTabId, CHROME_THEMES, DOCK_IDS, DOCK_DEFAULT_SIZES, DEFAULT_PANE_SPLIT, PANE_SPLIT_MIN, PANE_SPLIT_MAX, setPaneSplit, shell, persistDocks, persistedSession, markSessionRestored, flushSession, monacoTheme, registerShellSurface, mountShell, setDockCollapsed, setDockSize, setActivityTab, setBottomTab, setChromeTheme, toggleActivityTab, setLayoutSelection, resetProjectShell, registerShellViewCommands };
1584
1584
 
1585
- //# debugId=698A9C0448752CE964756E2164756E21
1586
- //# sourceMappingURL=studio-25hkdrkw.js.map
1585
+ //# debugId=41F1C61D2E957DBB64756E2164756E21
1586
+ //# sourceMappingURL=studio-mpzwze9x.js.map
@@ -4,17 +4,17 @@ import {
4
4
  import {
5
5
  debouncedStyleCommit,
6
6
  renderOnly
7
- } from "./studio-6ewqv390.js";
7
+ } from "./studio-m1p9b6c3.js";
8
8
  import {
9
9
  REGION_ATTR,
10
10
  overlayRegion,
11
11
  registerSurface,
12
12
  mountSurface,
13
13
  layerHost2
14
- } from "./studio-erdatzvp.js";
14
+ } from "./studio-ympe0n7a.js";
15
15
  import {
16
16
  reactive
17
- } from "./studio-p1dw8wfw.js";
17
+ } from "./studio-d8z5bajd.js";
18
18
  import {
19
19
  IMAGE_EXTENSIONS,
20
20
  MEDIA_EXTENSIONS,
@@ -23,17 +23,17 @@ import {
23
23
  uploadAssets,
24
24
  mediaSiteUrl,
25
25
  previewFileSrc
26
- } from "./studio-vz68yn9e.js";
26
+ } from "./studio-en82c639.js";
27
27
  import {
28
28
  peekMediaMeta,
29
29
  seedMediaMeta,
30
30
  recordImageSize,
31
31
  invalidateMediaMeta,
32
32
  mediaMetaSummary
33
- } from "./studio-5523bpzt.js";
33
+ } from "./studio-5nz00bhh.js";
34
34
  import {
35
35
  previewAssetSrc
36
- } from "./studio-4m0haseg.js";
36
+ } from "./studio-c07s5ckd.js";
37
37
  import {
38
38
  rectOf
39
39
  } from "./studio-rs76k67r.js";
@@ -836,4 +836,4 @@ function unmountMediaPicker2(host) {
836
836
  export { openPopoverSurface, invalidateMediaCache2, showMediaPickerPopover2, uploadAndAssign2, pickAndUpload2, mountMediaPicker2, unmountMediaPicker2 };
837
837
 
838
838
  //# debugId=9A676D8FC549E4AE64756E2164756E21
839
- //# sourceMappingURL=studio-8qtrpzr3.js.map
839
+ //# sourceMappingURL=studio-ncn9e189.js.map
@@ -116,4 +116,4 @@ function usageFiles2(result) {
116
116
  export { usagesSupported2, peekUsages2, loadUsages2, retryUsages2, invalidateUsages2, usageHeadline2, usageWarning2, usageFiles2 };
117
117
 
118
118
  //# debugId=4EF5BE6F2F2180F464756E2164756E21
119
- //# sourceMappingURL=studio-81390n6f.js.map
119
+ //# sourceMappingURL=studio-nq5yf5mp.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isJsonObject,
3
- isRef2,
3
+ isRef,
4
4
  isFunctionDef,
5
5
  isExpressionDef,
6
6
  isNamedFormulaDef,
@@ -15,7 +15,7 @@ import {
15
15
  paramNames,
16
16
  isTagExpression,
17
17
  isPrivateStateKey
18
- } from "./studio-7r42c6ca.js";
18
+ } from "./studio-3ntvq6cg.js";
19
19
  import {
20
20
  effectScope,
21
21
  onScopeDispose,
@@ -27,11 +27,11 @@ import {
27
27
  shallowReactive,
28
28
  isReactive,
29
29
  toRaw,
30
- isRef,
30
+ isRef2,
31
31
  ref,
32
32
  shallowRef,
33
33
  computed
34
- } from "./studio-p1dw8wfw.js";
34
+ } from "./studio-d8z5bajd.js";
35
35
  import {
36
36
  __export
37
37
  } from "./studio-5te5tqng.js";
@@ -1063,7 +1063,7 @@ function buildStyleRules(style, options = {}) {
1063
1063
  resolveValue
1064
1064
  } = options;
1065
1065
  const rules = [];
1066
- const isBlock = (value) => value !== null && typeof value === "object" && !Array.isArray(value) && !isRef2(value);
1066
+ const isBlock = (value) => value !== null && typeof value === "object" && !Array.isArray(value) && !isRef(value);
1067
1067
  const blocksOf = (key, value) => {
1068
1068
  if (isBlock(value)) {
1069
1069
  return [value];
@@ -1077,7 +1077,7 @@ function buildStyleRules(style, options = {}) {
1077
1077
  if (value === undefined || value === null) {
1078
1078
  return null;
1079
1079
  }
1080
- if (isRef2(value)) {
1080
+ if (isRef(value)) {
1081
1081
  return reactive ? resolveValue?.(property, value, target) ?? null : null;
1082
1082
  }
1083
1083
  if (typeof value === "object") {
@@ -2369,7 +2369,7 @@ function boundPropKey(key, val, state) {
2369
2369
  return null;
2370
2370
  }
2371
2371
  const stored = toRaw(state)[sub];
2372
- if (isRef(stored) || typeof stored === "function") {
2372
+ if (isRef2(stored) || typeof stored === "function") {
2373
2373
  return null;
2374
2374
  }
2375
2375
  if (typeof stored === "object" && stored !== null) {
@@ -3174,6 +3174,7 @@ function renderMappedArrayInto(parentEl, arrayDef, state, options) {
3174
3174
  parentEl.append(anchor);
3175
3175
  const { items: itemsSrc, map: mapDef, filter: filterRef, sort: sortRef, key: keyRef } = arrayDef;
3176
3176
  const keyPointer = isRefObj(keyRef) ? keyRef.$ref : null;
3177
+ const instancePath = _instancePath;
3177
3178
  let warned = false;
3178
3179
  const warnOnce = (message) => {
3179
3180
  if (!warned) {
@@ -3261,7 +3262,7 @@ function renderMappedArrayInto(parentEl, arrayDef, state, options) {
3261
3262
  }
3262
3263
  pauseTracking();
3263
3264
  try {
3264
- reconcile(list, keys);
3265
+ underInstancePath(reexpand(instancePath), () => reconcile(list, keys));
3265
3266
  } finally {
3266
3267
  resetTracking();
3267
3268
  }
@@ -3325,6 +3326,7 @@ function resolveTagName(tagName, scope) {
3325
3326
  function renderSwitch(def, state, options) {
3326
3327
  const path = options?._path ?? [];
3327
3328
  const container = document.createElement(resolveTagName(def.tagName, state));
3329
+ const instancePath = _instancePath;
3328
3330
  if (options?.onNodeCreated) {
3329
3331
  options.onNodeCreated(container, path, def, state);
3330
3332
  }
@@ -3372,13 +3374,13 @@ function renderSwitch(def, state, options) {
3372
3374
  return;
3373
3375
  }
3374
3376
  container.replaceChildren();
3375
- scope.run(() => container.append(renderNode(doc, childScope, childOpts)));
3377
+ underInstancePath(reexpand(instancePath), () => scope.run(() => container.append(renderNode(doc, childScope, childOpts))));
3376
3378
  }).catch((error) => console.error("Jx $switch: failed to load external case", caseDef.$ref, error));
3377
3379
  return;
3378
3380
  }
3379
3381
  pauseTracking();
3380
3382
  try {
3381
- scope.run(() => container.append(renderNode(caseDef, state, childOpts)));
3383
+ underInstancePath(reexpand(instancePath), () => scope.run(() => container.append(renderNode(caseDef, state, childOpts))));
3382
3384
  } finally {
3383
3385
  resetTracking();
3384
3386
  }
@@ -3916,7 +3918,7 @@ function resolveRef(refPath, state) {
3916
3918
  return readPath(state, refPath) ?? null;
3917
3919
  }
3918
3920
  function isRefObj(v) {
3919
- return isRef2(v);
3921
+ return isRef(v);
3920
3922
  }
3921
3923
  function getPath2(obj, path) {
3922
3924
  return readPath(obj, path);
@@ -4067,6 +4069,65 @@ function injectHead(entries, _base) {
4067
4069
  document.head.append(el);
4068
4070
  }
4069
4071
  }
4072
+ var MAX_COMPONENT_NESTING = 32;
4073
+ var ROOT_INSTANCE_PATH = { expansion: 0, frames: [] };
4074
+ var _instancePath = ROOT_INSTANCE_PATH;
4075
+ function underInstancePath(path, fn) {
4076
+ const was = _instancePath;
4077
+ _instancePath = path;
4078
+ try {
4079
+ return fn();
4080
+ } finally {
4081
+ _instancePath = was;
4082
+ }
4083
+ }
4084
+ function reexpand(path) {
4085
+ return { expansion: path.frames.length, frames: path.frames };
4086
+ }
4087
+ function samePropValue(a, b) {
4088
+ if (Object.is(a, b)) {
4089
+ return true;
4090
+ }
4091
+ if (!isPlainData(a) || !isPlainData(b)) {
4092
+ return false;
4093
+ }
4094
+ try {
4095
+ return JSON.stringify(a) === JSON.stringify(b);
4096
+ } catch {
4097
+ return false;
4098
+ }
4099
+ }
4100
+ function isPlainData(value) {
4101
+ if (typeof value !== "object" || value === null) {
4102
+ return false;
4103
+ }
4104
+ const raw = toRaw(value);
4105
+ if (Array.isArray(raw)) {
4106
+ return true;
4107
+ }
4108
+ const proto = Object.getPrototypeOf(raw);
4109
+ return proto === Object.prototype || proto === null;
4110
+ }
4111
+ function sameFrame(a, b) {
4112
+ if (a.tag !== b.tag) {
4113
+ return false;
4114
+ }
4115
+ const keys = Object.keys(a.props);
4116
+ if (keys.length !== Object.keys(b.props).length) {
4117
+ return false;
4118
+ }
4119
+ return keys.every((key) => Object.hasOwn(b.props, key) && samePropValue(a.props[key], b.props[key]));
4120
+ }
4121
+ function extendInstancePath(path, frame) {
4122
+ const chain = [...path.frames.map((f) => f.tag), frame.tag].join(" → ");
4123
+ if (path.frames.slice(path.expansion).some((f) => sameFrame(f, frame))) {
4124
+ throw new Error(`Component <${frame.tag}> renders itself: ${chain}. A component cannot appear inside its own ` + `definition with the same props — the expansion would never end.`);
4125
+ }
4126
+ if (path.frames.length >= MAX_COMPONENT_NESTING) {
4127
+ throw new Error(`Component nesting exceeds ${MAX_COMPONENT_NESTING} levels: ${chain}. A component that renders itself with changing props needs a case that stops.`);
4128
+ }
4129
+ return { expansion: path.expansion, frames: [...path.frames, frame] };
4130
+ }
4070
4131
  var _definedSources = new Set;
4071
4132
  async function defineElement(source, baseUrl) {
4072
4133
  let base = baseUrl;
@@ -4109,6 +4170,8 @@ async function defineElement(source, baseUrl) {
4109
4170
  return;
4110
4171
  }
4111
4172
  this._jxInitialized = true;
4173
+ const enclosingPath = _instancePath;
4174
+ const supplied = {};
4112
4175
  const live = _elementDefs.get(tagName) ?? { base: initialBase, doc: initialDef };
4113
4176
  const def = live.doc;
4114
4177
  const defBase = live.base;
@@ -4116,6 +4179,7 @@ async function defineElement(source, baseUrl) {
4116
4179
  for (const attr of observedAttrs) {
4117
4180
  if (this.hasAttribute(attr)) {
4118
4181
  absorbAttribute(state, attr, this.getAttribute(attr));
4182
+ supplied[attr] = this.getAttribute(attr);
4119
4183
  }
4120
4184
  }
4121
4185
  const propsAttr = this.dataset.jxProps;
@@ -4128,6 +4192,7 @@ async function defineElement(source, baseUrl) {
4128
4192
  }
4129
4193
  if (key in (def.state ?? {})) {
4130
4194
  state[key] = val;
4195
+ supplied[key] = val;
4131
4196
  }
4132
4197
  }
4133
4198
  } catch {}
@@ -4142,6 +4207,7 @@ async function defineElement(source, baseUrl) {
4142
4207
  }
4143
4208
  if (key in (def.state ?? {})) {
4144
4209
  state[key] = this.getAttribute(name);
4210
+ supplied[key] = this.getAttribute(name);
4145
4211
  this.removeAttribute(name);
4146
4212
  }
4147
4213
  }
@@ -4151,8 +4217,26 @@ async function defineElement(source, baseUrl) {
4151
4217
  }
4152
4218
  if (key in this && this[key] !== undefined && instanceSupplies(this, key)) {
4153
4219
  state[key] = this[key];
4220
+ supplied[key] = this[key];
4154
4221
  }
4155
4222
  }
4223
+ let ownPath;
4224
+ try {
4225
+ ownPath = extendInstancePath(enclosingPath, { props: supplied, tag: tagName });
4226
+ } catch (error) {
4227
+ this.replaceChildren();
4228
+ if (!this.isConnected) {
4229
+ return;
4230
+ }
4231
+ console.error(`Jx: <${tagName}> was not rendered:`, error);
4232
+ this.dispatchEvent(new ErrorEvent("jx-error", {
4233
+ bubbles: true,
4234
+ composed: true,
4235
+ error,
4236
+ message: error instanceof Error ? error.message : String(error)
4237
+ }));
4238
+ return;
4239
+ }
4156
4240
  for (const key of Object.keys(def.state ?? {})) {
4157
4241
  if (isPrivateStateKey(key)) {
4158
4242
  continue;
@@ -4182,9 +4266,11 @@ async function defineElement(source, baseUrl) {
4182
4266
  const wasInside = _canvasInsideStampedHost;
4183
4267
  _canvasInsideStampedHost ||= this.dataset.jxPath !== undefined;
4184
4268
  try {
4185
- for (const childDef of children) {
4186
- this.append(renderNode(childDef, state));
4187
- }
4269
+ underInstancePath(ownPath, () => {
4270
+ for (const childDef of children) {
4271
+ this.append(renderNode(childDef, state));
4272
+ }
4273
+ });
4188
4274
  } finally {
4189
4275
  _canvasInsideStampedHost = wasInside;
4190
4276
  }
@@ -5518,9 +5604,15 @@ var jx_action_button_default = {
5518
5604
  color: "var(--jx-accent-fg)"
5519
5605
  },
5520
5606
  '&[data-size="sm"] > [part="control"]': {
5607
+ $description: "The small action button is the kit's most packed control — Studio's toolbars, block action bar and inspector rows declare it some four hundred times — and it draws 4px under the kit's control height, which is the WCAG 2.2 SC 2.5.8 floor (ui.md §4.3). The `::before` is the hit area, jx-tab's close-button technique: an empty pseudo-element that reaches 2px past the drawn box on every side, so the region that accepts the pointer is exactly `--jx-control-h` square while the picture stays 20px. The inset is -3px and not -2px because an absolutely positioned box is offset from its containing block's PADDING edge, and this control draws a 1px border: the border width comes first, then half of the 4px the box is under (jx-tab's close button is borderless, so -4px was exact there). The control is already `position: relative` for the badge, so the pseudo-element needs nothing more. A 4px gap (jx-toolbar's) lets two extended neighbours abut; a compact jx-action-group packs its members touching, and its sheet zeroes the extension on that axis, because an extension over a neighbour's box would take the neighbour's clicks, and the criterion gives an overlapped strip to the target on top rather than to both; a default group's 2px gap leaves every member but the last at 22px on that axis, which ui.md §11 names as a non-claim. Held by target-size.test.ts and the conformance gate, both of which read the border and subtract it.",
5521
5608
  minWidth: "calc(var(--jx-control-h) - 4px)",
5522
5609
  minHeight: "calc(var(--jx-control-h) - 4px)",
5523
- padding: "0 var(--jx-space-1)"
5610
+ padding: "0 var(--jx-space-1)",
5611
+ "::before": {
5612
+ content: '""',
5613
+ position: "absolute",
5614
+ inset: "-3px"
5615
+ }
5524
5616
  },
5525
5617
  '&[data-size="lg"] > [part="control"]': {
5526
5618
  minWidth: "calc(var(--jx-control-h) + 8px)",
@@ -5819,6 +5911,14 @@ var jx_action_group_default = {
5819
5911
  },
5820
5912
  '&[data-compact] > jx-action-button > [part="control"]:focus-visible': {
5821
5913
  zIndex: "1"
5914
+ },
5915
+ '&[data-compact] > jx-action-button[data-size="sm"] > [part="control"]::before': {
5916
+ $description: "A small action button carries a `::before` that extends its hit area 2px past its drawn box on every side (an inset of -3px: the button's 1px border, then half the 4px it is under, because an absolutely positioned box is offset from the padding edge), so that a 20px picture accepts the pointer over the kit's 24px control height (WCAG 2.2 SC 2.5.8, ui.md §4.3). In a compact group the boxes TOUCH on the packed axis — no gap, and each border drawn over the last — so an extension there could reach nothing but the neighbour's own box, and the later sibling paints above the earlier one: the last 2px of every button but the last would activate the button after it. The criterion gives an overlapped area to the target on TOP, so the extension would buy the earlier button nothing and cost it a stolen strip. The default 2px gap is the other case: two extensions overlap by 2px there, the later member keeps the strip, and every small member but the last counts 22px on the packed axis, which is under the floor and which ui.md §11 names beside this one. The packed axis is therefore zeroed here — `0` is the padding edge, 1px inside the drawn border, and the button's own box accepts the pointer over that pixel — and the cross axis keeps its 2px past the drawn box, which reaches only the gap around the group: a compact group's small members are 24px tall and as wide as they draw, which ui.md §11 records as the one thing the technique cannot reach. The vertical variant swaps the axes, and its inline value is the button's own -3px for the same reason.",
5917
+ insetInline: "0"
5918
+ },
5919
+ '&[data-compact][data-orientation="vertical"] > jx-action-button[data-size="sm"] > [part="control"]::before': {
5920
+ insetInline: "-3px",
5921
+ insetBlock: "0"
5822
5922
  }
5823
5923
  },
5824
5924
  children: [
@@ -6127,9 +6227,16 @@ var jx_button_default = {
6127
6227
  }
6128
6228
  },
6129
6229
  '&[data-size="sm"] > [part="control"]': {
6230
+ $description: "A small button draws 4px under the kit's control height, and the control height is the WCAG 2.2 SC 2.5.8 floor (ui.md §4.3), so the drawn box alone would be a 20px pointer target at the default density. The `::before` is the hit area: an empty pseudo-element that reaches 2px past the drawn box on every side, so what accepts the pointer is exactly `--jx-control-h` square while the picture stays small — jx-tab's close button's technique, and the criterion measures the region that accepts the pointer, not the paint. The inset is -3px and not -2px because an absolutely positioned box is offset from its containing block's PADDING edge, and this control draws a 1px border: the border width comes first, then half of the 4px the box is under. jx-tab's close button is borderless, which is why -4px was exact there, and why the number did not carry over unchanged. In a jx-toolbar (a 4px gap) two extended neighbours abut and neither loses a pixel; jx-action-group's own sheet zeroes the packed axis in a compact group, where the boxes touch and an extension could only steal a strip of the neighbour. Held by target-size.test.ts and the conformance gate, both of which read the border and subtract it.",
6231
+ position: "relative",
6130
6232
  minHeight: "calc(var(--jx-control-h) - 4px)",
6131
6233
  padding: "0 var(--jx-space-3)",
6132
- fontSize: "var(--jx-text-sm)"
6234
+ fontSize: "var(--jx-text-sm)",
6235
+ "::before": {
6236
+ content: '""',
6237
+ position: "absolute",
6238
+ inset: "-3px"
6239
+ }
6133
6240
  },
6134
6241
  '&[data-size="lg"] > [part="control"]': {
6135
6242
  minHeight: "calc(var(--jx-control-h) + 8px)",
@@ -6395,9 +6502,16 @@ var jx_checkbox_default = {
6395
6502
  color: "var(--jx-fg-dim)"
6396
6503
  },
6397
6504
  '&[data-size="sm"] > [part="control"]': {
6505
+ $description: "The control is the `<label>` wrapping the input, and the label is the pointer target: a click anywhere on it toggles the box. At `sm` it draws 4px under the kit's control height, the WCAG 2.2 SC 2.5.8 floor (ui.md §4.3), so the `::before` extends the hit area 2px beyond the box on every side — jx-tab's close-button technique, the same shape jx-button carries — and the region that accepts the pointer is `--jx-control-h` tall while the row stays 20px. -2px is exact here where jx-button needs -3px: an absolutely positioned box is offset from the PADDING edge, and the label draws no border, so its padding edge is its drawn edge. The label needs `position: relative` here for the pseudo-element to measure against; the input inside is 14px and needs nothing of its own, because the label around it is the target. Held by target-size.test.ts and the conformance gate.",
6506
+ position: "relative",
6398
6507
  minHeight: "calc(var(--jx-control-h) - 4px)",
6399
6508
  fontSize: "var(--jx-text-sm)",
6400
- lineHeight: "var(--jx-leading-sm)"
6509
+ lineHeight: "var(--jx-leading-sm)",
6510
+ "::before": {
6511
+ content: '""',
6512
+ position: "absolute",
6513
+ inset: "-2px"
6514
+ }
6401
6515
  },
6402
6516
  '&[data-size="sm"] [part="input"]': {
6403
6517
  width: "calc(var(--jx-icon-size) - 2px)",
@@ -8484,7 +8598,7 @@ var jx_menu_item_default = {
8484
8598
  type: "string",
8485
8599
  default: "",
8486
8600
  attribute: "requires",
8487
- description: "The one-sentence reason a disabled row cannot act, printed as its tooltip."
8601
+ description: "The one-sentence reason a DISABLED row cannot act, drawn as the row's native title while it is disabled and nowhere at all while it is not. The title is the whole contract here, and deliberately not the tooltip hybrid jx-button, jx-action-button and jx-switch ship: a disabled row can open no tip, so the hybrid collapses to its disabled half, and an ENABLED row never carries a requires — every Studio projection fills it from the registry's disabledReason, which is undefined for a command that can run, and a reason on a row that can act is a contradiction rather than a hint. Studio's menu surface also prints the same sentence as the row's visible description (`Needs …`), so a keyboard reader hears it without the title."
8488
8602
  },
8489
8603
  checked: {
8490
8604
  type: "string",
@@ -9261,6 +9375,8 @@ var jx_combobox_default = {
9261
9375
  fontSize: "var(--jx-text-lg)"
9262
9376
  },
9263
9377
  '& [part="toggle"]': {
9378
+ $description: "The toggle sits inside the field's border, so it draws 2px under the field's height: 22px in a 24px field, 18px in an `sm` one. The `::before` is its hit area (WCAG 2.2 SC 2.5.8, ui.md §4.3), the same shape as jx-textfield's clear button: an empty pseudo-element inset by half the difference between the drawn box and the kit's control height, -1px on a default field and -3px on a small one, so the region that accepts the pointer is `--jx-control-h` square at every size while the caret and its box stay where they were; on a large field the inset is positive and the pseudo-element is an invisible box inside a button already over the floor. `position: relative` is what the pseudo-element measures against, and it is new here: the toggle is a flex item of the field, not an absolutely placed one. The rotation the open state applies turns the pseudo-element with the button, which a square does not mind.",
9379
+ position: "relative",
9264
9380
  display: "inline-flex",
9265
9381
  alignItems: "center",
9266
9382
  justifyContent: "center",
@@ -9278,6 +9394,11 @@ var jx_combobox_default = {
9278
9394
  cursor: "pointer",
9279
9395
  outline: "none",
9280
9396
  transition: "rotate var(--jx-dur-1) var(--jx-ease-out)",
9397
+ "::before": {
9398
+ content: '""',
9399
+ position: "absolute",
9400
+ inset: "calc((var(--jx-combobox-h) - 2px - var(--jx-control-h)) / 2)"
9401
+ },
9281
9402
  ":hover": {
9282
9403
  color: "var(--jx-fg)"
9283
9404
  },
@@ -11936,6 +12057,11 @@ var jx_switch_default = {
11936
12057
  "name",
11937
12058
  "size"
11938
12059
  ],
12060
+ $elements: [
12061
+ {
12062
+ $ref: "./jx-tooltip.json"
12063
+ }
12064
+ ],
11939
12065
  state: {
11940
12066
  checked: {
11941
12067
  type: "boolean",
@@ -11947,13 +12073,13 @@ var jx_switch_default = {
11947
12073
  type: "boolean",
11948
12074
  default: false,
11949
12075
  attribute: "disabled",
11950
- description: "Cannot be flipped or focused. Disabled, never absent."
12076
+ description: "Cannot be flipped or focused. Disabled, never absent, and the hint moves from the tip to the row's title while it is: a disabled control cannot open a tip, and why the setting cannot be changed is exactly what the reader hovers to find out."
11951
12077
  },
11952
12078
  hint: {
11953
12079
  type: "string",
11954
12080
  default: "",
11955
12081
  attribute: "hint",
11956
- description: "The tooltip on the row: why the setting is off, or what turning it on does. Empty removes the title rather than writing a blank one."
12082
+ description: "The tooltip on the row: what turning the setting on does, or why it cannot be changed. The same hybrid jx-button and jx-action-button ship. While the switch is ENABLED it is drawn as a jx-tooltip child of this element — shown on keyboard focus at once and on hover after the tip's delay, hoverable and dismissible with Escape (SC 1.4.13) — and the control names it in aria-describedby, so it is a description beside the name and never the name itself. While the switch is DISABLED it is the native title of the wrapping label instead, because a disabled control receives no focus and no pointer event and could never open a tip, while the platform still shows a title on hover. Never both at once; empty draws neither. ONE difference from the buttons, and it is the platform's rather than the kit's: the tip is wired by `for` alone and the row declares NO `interestfor`. Interest invokers are supported on `a`, `area` and `button` only — never on a label or an input — so the attribute here would show nothing on Chrome 152 while telling the tooltip sidecar the platform had the pair, which is the one combination that draws no tip on any engine. The sidecar binds the label on every engine instead, and that is what the switch pays for a tooltip: six listeners on the row and two on the tip, always, where a button pays them only where the platform lacks the attribute."
11957
12083
  },
11958
12084
  label: {
11959
12085
  type: "string",
@@ -11990,6 +12116,47 @@ var jx_switch_default = {
11990
12116
  default: "",
11991
12117
  description: `Forwarded to the inner control as its tabindex, which is what makes a roving caret possible: the focusable node is the input inside, not the host and not the label that wraps it, so a jx-toolbar moving focus writes this rather than reaching into a child's internals. It is a PROPERTY ONLY (el.tabindex = "0") and deliberately not an observed attribute: written as an attribute it would land on the host as well, and a host carrying tabindex is itself focusable, so the one control would become two tab stops.`
11992
12118
  },
12119
+ uid: {
12120
+ type: "string",
12121
+ default: "",
12122
+ description: "This row's own id stem, minted on mount by the tooltip sidecar. The label's id, the tip's id and the two attributes that wire one to the other are all built from it, so a consumer writes none of them and two hinted switches on one panel cannot collide. Empty until the mount microtask, which is why every binding that reads it guards on it."
12123
+ },
12124
+ hasTip: {
12125
+ $expression: {
12126
+ operator: "&&",
12127
+ target: {
12128
+ operator: "!",
12129
+ target: {
12130
+ operator: "!",
12131
+ target: {
12132
+ $ref: "#/state/hint"
12133
+ }
12134
+ }
12135
+ },
12136
+ value: {
12137
+ operator: "&&",
12138
+ target: {
12139
+ operator: "!",
12140
+ target: {
12141
+ $ref: "#/state/disabled"
12142
+ }
12143
+ },
12144
+ value: {
12145
+ operator: "!==",
12146
+ target: {
12147
+ $ref: "#/state/uid"
12148
+ },
12149
+ value: ""
12150
+ }
12151
+ }
12152
+ }
12153
+ },
12154
+ onMount: {
12155
+ $prototype: "Function",
12156
+ $src: "jx-ui:/behaviors/tooltip.ts",
12157
+ $export: "mintHintId",
12158
+ description: "Mints the id stem the hint's tooltip is wired by. A document cannot: the closed operator set has no counter and no identity."
12159
+ },
11993
12160
  onChange: {
11994
12161
  $prototype: "Function",
11995
12162
  body: [
@@ -12102,6 +12269,9 @@ var jx_switch_default = {
12102
12269
  '& [part="label"]:empty': {
12103
12270
  display: "none"
12104
12271
  },
12272
+ '& > [part="tooltip"]': {
12273
+ display: "contents"
12274
+ },
12105
12275
  "@(forced-colors: active)": {
12106
12276
  '& [part="input"]': {
12107
12277
  forcedColorAdjust: "none",
@@ -12132,7 +12302,8 @@ var jx_switch_default = {
12132
12302
  tagName: "label",
12133
12303
  attributes: {
12134
12304
  part: "control",
12135
- title: "${state.hint || null}"
12305
+ id: "${state.uid || null}",
12306
+ title: "${state.disabled && state.hint ? state.hint : null}"
12136
12307
  },
12137
12308
  children: [
12138
12309
  {
@@ -12143,7 +12314,7 @@ var jx_switch_default = {
12143
12314
  role: "switch",
12144
12315
  "aria-label": "${state.label || null}",
12145
12316
  "aria-labelledby": "${state.labelledby || null}",
12146
- "aria-describedby": "${state.describedby || null}",
12317
+ "aria-describedby": "${[state.hasTip ? state.uid + '-tip' : null, state.describedby || null].filter(Boolean).join(' ') || null}",
12147
12318
  tabindex: "${state.tabindex || null}",
12148
12319
  name: "${state.name || null}",
12149
12320
  disabled: {
@@ -12172,6 +12343,34 @@ var jx_switch_default = {
12172
12343
  ]
12173
12344
  }
12174
12345
  ]
12346
+ },
12347
+ {
12348
+ tagName: "span",
12349
+ attributes: {
12350
+ part: "tooltip"
12351
+ },
12352
+ $switch: {
12353
+ $ref: "#/state/hasTip"
12354
+ },
12355
+ cases: {
12356
+ true: {
12357
+ tagName: "jx-tooltip",
12358
+ attributes: {
12359
+ part: "tip",
12360
+ id: "${state.uid}-tip",
12361
+ for: "${state.uid}"
12362
+ },
12363
+ children: [
12364
+ {
12365
+ tagName: "span",
12366
+ attributes: {
12367
+ part: "tip-text"
12368
+ },
12369
+ textContent: "${state.hint}"
12370
+ }
12371
+ ]
12372
+ }
12373
+ }
12175
12374
  }
12176
12375
  ]
12177
12376
  };
@@ -13106,9 +13305,15 @@ var jx_textfield_default = {
13106
13305
  fontSize: "var(--jx-text-lg)"
13107
13306
  },
13108
13307
  '& [part="clear"]': {
13308
+ $description: "The clear button sits inside the field's border, so it draws 2px under the field's height: 22px in a 24px field, and 18px in an `sm` one. The `::before` is its hit area (WCAG 2.2 SC 2.5.8, ui.md §4.3): an empty pseudo-element inset by half the difference between the drawn box and the kit's control height, which is -1px on a default field and -3px on a small one, so the region that accepts the pointer is `--jx-control-h` square at every size while the glyph and its hover box stay where they were. On a large field the difference is positive and the pseudo-element is an invisible box INSIDE a button that is already over the floor, which changes nothing. jx-tab's close button is the technique; the button is absolutely positioned already, so it is its own containing block. The extension lies over the input it clears, which was true of the drawn button too, and 2px past the field's edge at `sm`, where a neighbour at the kit's 4px gap extends 2px back and the two abut.",
13109
13309
  position: "absolute",
13110
13310
  insetBlockStart: "1px",
13111
13311
  insetInlineEnd: "1px",
13312
+ "::before": {
13313
+ content: '""',
13314
+ position: "absolute",
13315
+ inset: "calc((var(--jx-textfield-h) - 2px - var(--jx-control-h)) / 2)"
13316
+ },
13112
13317
  display: "inline-flex",
13113
13318
  alignItems: "center",
13114
13319
  justifyContent: "center",
@@ -17459,5 +17664,5 @@ function registerUi(options = {}) {
17459
17664
 
17460
17665
  export { isKeyframesAtRule, pureSchemeOf, intlHelpersClause, PURE_METHOD_OPS, BLESSED_OPERATORS, BLESSED_GLOBALS, isMutating, evaluateExpression, assetUrlFor, PUBLIC_DIR, BUILD_LANES, splitRefSuffix, isNonRelativeRef, normalizeProjectPath, dirOfPath, joinProjectPath, projectPathForRef, encodeProjectPath, mount3, preloadDocument, setSkipServerFunctions, runScoped, setCanvasAssetResolver, buildScope, renderNode, redefineElement, defineElement, openAt, close, showModal, close2, ensureCaret, focusItem, splitModifiersOf, selectValue, POPOVER_DEFAULT_MODE, attrs, literalAttr, tagOf, labelOf, isPopover, idOf, walk, popoverIdsIn, documentHasPopover, scalar, findPopoverDefects, popoverDisplayRepair, POPOVER_TAGS, INVOKER_TAGS, KIT_BASE, registerUi, setActiveRegistry, activeRegistry };
17461
17666
 
17462
- //# debugId=19EBDEF551FE80A064756E2164756E21
17463
- //# sourceMappingURL=studio-5jy81t3s.js.map
17667
+ //# debugId=9467D68A831CC3FC64756E2164756E21
17668
+ //# sourceMappingURL=studio-p6pmwkvh.js.map
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  ensureCaret
3
- } from "./studio-5jy81t3s.js";
3
+ } from "./studio-p6pmwkvh.js";
4
4
  import {
5
5
  registerSurface,
6
6
  mountSurface,
7
7
  getLayerSlot2,
8
8
  clearLayerSlot2
9
- } from "./studio-erdatzvp.js";
9
+ } from "./studio-ympe0n7a.js";
10
10
  import {
11
11
  reactive
12
- } from "./studio-p1dw8wfw.js";
12
+ } from "./studio-d8z5bajd.js";
13
13
  import {
14
14
  rectOf
15
15
  } from "./studio-rs76k67r.js";
@@ -419,4 +419,4 @@ function restoreFocus(opener) {
419
419
  export { openMenu2 };
420
420
 
421
421
  //# debugId=AF40C481EA74291464756E2164756E21
422
- //# sourceMappingURL=studio-3gxv60tn.js.map
422
+ //# sourceMappingURL=studio-qa7fzxan.js.map