@jxsuite/studio 5.1.0 → 5.3.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 (117) hide show
  1. package/dist/chunks/{cf-account-picker-qwkm9zrf.js → cf-account-picker-nwnwdm6p.js} +10 -10
  2. package/dist/chunks/{cf-settings-71bv5zn9.js → cf-settings-adg74qsk.js} +4 -4
  3. package/dist/chunks/{components-vj72gqtq.js → components-5y78e05d.js} +4 -4
  4. package/dist/chunks/content-source-4rzvmp0m.js +46 -0
  5. package/dist/chunks/{convert-to-repeater-n64h8znc.js → convert-to-repeater-jxsv62v7.js} +22 -22
  6. package/dist/chunks/entry-commands-1wnsqn5d.js +42 -0
  7. package/dist/chunks/{extension-sections-3hpcambp.js → extension-sections-2mrptyek.js} +27 -27
  8. package/dist/chunks/{file-ops-8yhd83xr.js → file-ops-knfqshrm.js} +22 -22
  9. package/dist/chunks/{files-hnxqxtsg.js → files-y6fr4he9.js} +32 -30
  10. package/dist/chunks/{format-host-779sfp2n.js → format-host-1k4qrcqd.js} +2 -2
  11. package/dist/chunks/{fs-events-b88z7g4h.js → fs-events-3y6y0nrm.js} +4 -4
  12. package/dist/chunks/{git-panel-xwj8fpab.js → git-panel-2rkrsjva.js} +23 -22
  13. package/dist/chunks/grid-view-1p6hsyjx.css +8406 -0
  14. package/dist/chunks/grid-view-a7b87n2c.js +15322 -0
  15. package/dist/chunks/{iframe-host-syr0f9sb.js → iframe-host-scpw01h8.js} +13 -13
  16. package/dist/chunks/{jx-validate-j0wxk72w.js → jx-validate-epp2z3s3.js} +2 -2
  17. package/dist/chunks/{layers-ff81wthn.js → layers-jnvdbqva.js} +5 -5
  18. package/dist/chunks/layers-panel-73gfkcga.js +41 -0
  19. package/dist/chunks/{listbox-6v2ac08j.js → listbox-b7jxnhq1.js} +19 -3
  20. package/dist/chunks/{media-picker-cqhhxhhe.js → media-picker-f66nav16.js} +13 -13
  21. package/dist/chunks/menu-1dfhry4s.js +15 -0
  22. package/dist/chunks/{monaco-buffer-bhy3hb6m.js → monaco-buffer-pykwbm92.js} +3 -3
  23. package/dist/chunks/{monaco-setup-8r62fj6y.js → monaco-setup-km6abc6q.js} +2 -2
  24. package/dist/chunks/{notify-628t0anh.js → notify-42gk8ha1.js} +2 -2
  25. package/dist/chunks/{parse-0zx14y15.js → parse-reg9eevt.js} +2 -2
  26. package/dist/chunks/publish-panel-z1zd2da1.js +27 -0
  27. package/dist/chunks/quick-search-zdv7h8ht.js +47 -0
  28. package/dist/chunks/{references-qvvxej7h.js → references-h69xp9zz.js} +2 -2
  29. package/dist/chunks/right-panel-889vbnm5.js +45 -0
  30. package/dist/chunks/{split-g7nm1rgb.js → split-4cz4b6ef.js} +14 -3
  31. package/dist/chunks/{studio-vfq8qpjt.js → studio-0j7r7s9g.js} +3 -3
  32. package/dist/chunks/{studio-b4s9eykd.js → studio-151w0xnh.js} +15 -15
  33. package/dist/chunks/studio-1tbjfqv4.js +146 -0
  34. package/dist/chunks/{studio-8scdew0e.js → studio-27q131j3.js} +4 -4
  35. package/dist/chunks/{studio-7r42c6ca.js → studio-3ntvq6cg.js} +5 -5
  36. package/dist/chunks/{studio-g3jevyjt.js → studio-4c041r8y.js} +2 -2
  37. package/dist/chunks/{studio-js8nv53n.js → studio-4f3psrk1.js} +14 -14
  38. package/dist/chunks/{studio-pxbgypmg.js → studio-50wfwy44.js} +17 -14
  39. package/dist/chunks/{studio-vw7mzp6z.js → studio-6gryj0sg.js} +5 -5
  40. package/dist/chunks/{studio-e1pgga3k.js → studio-6kvgrkrp.js} +7 -7
  41. package/dist/chunks/{studio-wqz6dggm.js → studio-7144epdr.js} +9 -9
  42. package/dist/chunks/{studio-b0k5tqgp.js → studio-7rrb1esn.js} +32 -28
  43. package/dist/chunks/{studio-38emantv.js → studio-a5h5j33a.js} +19 -5
  44. package/dist/chunks/{studio-3773086z.js → studio-a65w20ex.js} +4 -4
  45. package/dist/chunks/{studio-nzzpvzx9.js → studio-ab87phj1.js} +4 -4
  46. package/dist/chunks/{studio-r6nvacqs.js → studio-b66rsh78.js} +20 -20
  47. package/dist/chunks/{studio-jxp12rnj.js → studio-b7xacrwe.js} +6 -6
  48. package/dist/chunks/{studio-6xa21ej9.js → studio-c04nzbby.js} +2 -2
  49. package/dist/chunks/{studio-try13h8c.js → studio-c0qgc3tn.js} +18 -18
  50. package/dist/chunks/{studio-tqgryxwg.js → studio-cgprcdxn.js} +7 -7
  51. package/dist/chunks/{studio-kkqkcp3d.js → studio-d1n2bykn.js} +40 -13
  52. package/dist/chunks/{studio-p1dw8wfw.js → studio-d8z5bajd.js} +14 -10
  53. package/dist/chunks/{studio-3rz5md06.js → studio-dd1qqkry.js} +6 -6
  54. package/dist/chunks/{studio-1z1kcjv4.js → studio-drg8qj9k.js} +11 -11
  55. package/dist/chunks/{studio-kcgff4r0.js → studio-fgmfksz8.js} +2 -2
  56. package/dist/chunks/{studio-qk90fgqm.js → studio-fzjx96t2.js} +7 -7
  57. package/dist/chunks/{studio-a79k90n9.js → studio-g33v4fe9.js} +17 -16
  58. package/dist/chunks/{studio-k75n7vhp.js → studio-gk2twyh4.js} +74 -36
  59. package/dist/chunks/{studio-syg2tadj.js → studio-gtfq1dkz.js} +3 -3
  60. package/dist/chunks/{studio-1knfqgy7.js → studio-j0w60gft.js} +8 -8
  61. package/dist/chunks/{studio-aj37eer3.js → studio-jt27ta6x.js} +4 -4
  62. package/dist/chunks/{studio-gb13095a.js → studio-ke09tn9k.js} +59 -20
  63. package/dist/chunks/{studio-d0300636.js → studio-ks2zzth2.js} +17 -2
  64. package/dist/chunks/{studio-6ewqv390.js → studio-m1p9b6c3.js} +5 -5
  65. package/dist/chunks/{studio-qk4bfsq2.js → studio-msc1ee1m.js} +4 -4
  66. package/dist/chunks/{studio-93zafjcm.js → studio-nfx354t1.js} +10 -10
  67. package/dist/chunks/{studio-mhhyamxf.js → studio-nsgw7dbk.js} +6 -6
  68. package/dist/chunks/{studio-qhhm6hbt.js → studio-rtskkm43.js} +4 -4
  69. package/dist/chunks/studio-t171hxhe.js +23 -0
  70. package/dist/chunks/{studio-hhvs4sdg.js → studio-vn5hske5.js} +10 -4
  71. package/dist/chunks/{studio-q3x06vmj.js → studio-wnsyffg1.js} +2 -2
  72. package/dist/chunks/{studio-5wt9nvhd.js → studio-xajk70w0.js} +29 -42
  73. package/dist/chunks/{studio-7xnmgv66.js → studio-ye9drbk8.js} +45 -44
  74. package/dist/chunks/{studio-y9zedyjn.js → studio-z2smx5ce.js} +2 -2
  75. package/dist/chunks/{studio-sbjyc8bt.js → studio-ze46gzjh.js} +9 -9
  76. package/dist/chunks/{studio-zdn2g6dt.js → studio-zjjde71a.js} +2 -2
  77. package/dist/chunks/{workspace-t55jdjbx.js → workspace-np10mayv.js} +18 -10
  78. package/dist/iframe-entry.js +9 -5
  79. package/dist/studio.css +1 -2
  80. package/dist/studio.js +910 -15705
  81. package/package.json +10 -10
  82. package/src/files/files.ts +38 -15
  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/media/media-open.ts +14 -2
  87. package/src/panels/chat-panel.ts +40 -5
  88. package/src/panels/pane-context.ts +5 -4
  89. package/src/panels/pane-grid.ts +100 -10
  90. package/src/panels/tab-drop.ts +220 -0
  91. package/src/panels/tab-strip.ts +235 -30
  92. package/src/services/ai-models.ts +13 -0
  93. package/src/services/module-preloads.ts +67 -0
  94. package/src/studio.ts +16 -6
  95. package/src/surfaces/commandbar.json +26 -16
  96. package/src/surfaces/formula-palette.json +8 -7
  97. package/src/surfaces/formula-palette.ts +10 -6
  98. package/src/surfaces/palette.json +8 -7
  99. package/src/surfaces/pane-grid.json +35 -3
  100. package/src/surfaces/pane-grid.ts +26 -4
  101. package/src/surfaces/tab-strip.json +16 -39
  102. package/src/surfaces/tab-strip.ts +76 -12
  103. package/src/ui/ai-credentials-form.ts +12 -1
  104. package/src/ui/panel-resize.ts +3 -23
  105. package/src/ui/virtual-window.ts +57 -4
  106. package/src/workspace/pane-derive.ts +7 -5
  107. package/src/workspace/session.ts +3 -3
  108. package/src/workspace/workspace.ts +160 -43
  109. package/styles/shell-frame.css +8 -0
  110. package/styles/shell-frame.json +4 -0
  111. package/dist/chunks/content-source-5mex4x1h.js +0 -46
  112. package/dist/chunks/entry-commands-234hjnqw.js +0 -42
  113. package/dist/chunks/layers-panel-pnnghw12.js +0 -40
  114. package/dist/chunks/menu-9p2w46gj.js +0 -15
  115. package/dist/chunks/publish-panel-5zt840sy.js +0 -27
  116. package/dist/chunks/quick-search-3748564r.js +0 -45
  117. package/dist/chunks/right-panel-eccz92qt.js +0 -45
@@ -6,10 +6,10 @@ import {
6
6
  toRaw,
7
7
  computed,
8
8
  notify2
9
- } from "./studio-p1dw8wfw.js";
9
+ } from "./studio-d8z5bajd.js";
10
10
  import {
11
11
  commitTabBuffers2
12
- } from "./studio-q3x06vmj.js";
12
+ } from "./studio-wnsyffg1.js";
13
13
  import {
14
14
  getPlatform2
15
15
  } from "./studio-6nzaktvy.js";
@@ -17,12 +17,12 @@ import {
17
17
  formatByName2,
18
18
  formatForPath2,
19
19
  defaultContentFormat2
20
- } from "./studio-vw7mzp6z.js";
20
+ } from "./studio-6gryj0sg.js";
21
21
  import {
22
22
  getNestedStyle,
23
23
  ensureNestedStyle,
24
24
  isEventBinding
25
- } from "./studio-7r42c6ca.js";
25
+ } from "./studio-3ntvq6cg.js";
26
26
  import {
27
27
  getNodeAtPath2,
28
28
  normalizeArrayChildren,
@@ -31,7 +31,7 @@ import {
31
31
  pathsEqual,
32
32
  isAncestor,
33
33
  projectState
34
- } from "./studio-6ewqv390.js";
34
+ } from "./studio-m1p9b6c3.js";
35
35
  import {
36
36
  cloneValue2,
37
37
  childArray2,
@@ -2743,6 +2743,7 @@ function coerceArgs(commandId, schema, args) {
2743
2743
  var CLOSED_TAB_LIMIT = 20;
2744
2744
  var PRIMARY_PANE2 = "primary";
2745
2745
  var SECONDARY_PANE2 = "secondary";
2746
+ var MAX_PANES2 = 2;
2746
2747
  var workspace2 = reactive({
2747
2748
  activePaneId: PRIMARY_PANE2,
2748
2749
  clipboard: null,
@@ -2808,28 +2809,30 @@ function focusPane2(paneId) {
2808
2809
  function isPaneFocused2(paneId) {
2809
2810
  return workspace2.activePaneId === paneId;
2810
2811
  }
2811
- function splitRight() {
2812
- const source = activePane2();
2813
- const tabId = source.activeTabId;
2814
- const tab = tabId ? workspace2.tabs.get(tabId) : null;
2815
- if (!tabId || !tab) {
2812
+ function splitRight2(tabId) {
2813
+ const id = tabId ?? activePane2().activeTabId;
2814
+ const tab = id ? workspace2.tabs.get(id) : null;
2815
+ if (!id || !tab) {
2816
2816
  return null;
2817
2817
  }
2818
- const target = receivingPane2();
2819
- detachTab2(tabId);
2820
- insertIntoPane2(target, tabId);
2821
- target.activeTabId = tabId;
2818
+ const source = paneOfTab2(id);
2819
+ if (!source) {
2820
+ return null;
2821
+ }
2822
+ const target = receivingPane2(source.id);
2823
+ detachTab2(id);
2824
+ insertIntoPane2(target, id);
2825
+ target.activeTabId = id;
2822
2826
  workspace2.activePaneId = target.id;
2823
2827
  resetTabCycle();
2824
- promoteMru(tabId);
2828
+ promoteMru(id);
2825
2829
  return target;
2826
2830
  }
2827
- function sidePane2() {
2828
- const source = activePane2();
2829
- return workspace2.panes.find((pane) => pane.id !== source.id) ?? addPane(SECONDARY_PANE2);
2831
+ function paneBeside2(paneId) {
2832
+ return workspace2.panes.find((pane) => pane.id !== paneId) ?? addPane(SECONDARY_PANE2);
2830
2833
  }
2831
- function receivingPane2() {
2832
- const target = sidePane2();
2834
+ function receivingPane2(paneId) {
2835
+ const target = paneBeside2(paneId);
2833
2836
  if (target.derived) {
2834
2837
  target.derived = null;
2835
2838
  }
@@ -2851,7 +2854,7 @@ function addPane(paneId) {
2851
2854
  ];
2852
2855
  return paneById2(paneId);
2853
2856
  }
2854
- function closePane(paneId) {
2857
+ function closePane2(paneId) {
2855
2858
  if (workspace2.panes.length < 2) {
2856
2859
  return;
2857
2860
  }
@@ -2872,7 +2875,7 @@ function closePane(paneId) {
2872
2875
  workspace2.panes = workspace2.panes.filter((candidate) => candidate.id !== pane.id);
2873
2876
  resetTabCycle();
2874
2877
  }
2875
- function paneIsEmpty(pane) {
2878
+ function paneIsEmpty2(pane) {
2876
2879
  return pane.tabOrder.length === 0 && pane.derived === null;
2877
2880
  }
2878
2881
  function detachTab2(tabId) {
@@ -2885,12 +2888,12 @@ function detachTab2(tabId) {
2885
2888
  if (pane.activeTabId === tabId) {
2886
2889
  pane.activeTabId = pane.tabOrder.at(-1) ?? null;
2887
2890
  }
2888
- if (pane.id !== PRIMARY_PANE2 && paneIsEmpty(pane)) {
2891
+ if (pane.id !== PRIMARY_PANE2 && paneIsEmpty2(pane)) {
2889
2892
  emptied.push(pane.id);
2890
2893
  }
2891
2894
  }
2892
2895
  for (const paneId of emptied) {
2893
- closePane(paneId);
2896
+ closePane2(paneId);
2894
2897
  }
2895
2898
  }
2896
2899
  function insertIntoPane2(pane, tabId, index) {
@@ -3025,12 +3028,19 @@ function moveTab2(tabId, toIndex) {
3025
3028
  if (!tab || !pane) {
3026
3029
  return;
3027
3030
  }
3031
+ pane.tabOrder = reorderWithinPane(pane, tabId, toIndex);
3032
+ }
3033
+ function reorderWithinPane(pane, tabId, toIndex) {
3034
+ const tab = workspace2.tabs.get(tabId);
3035
+ if (!tab) {
3036
+ return pane.tabOrder;
3037
+ }
3028
3038
  const without = pane.tabOrder.filter((id) => id !== tabId);
3029
3039
  const boundary = without.filter((id) => workspace2.tabs.get(id)?.pinned === true).length;
3030
3040
  const lower = tab.pinned ? 0 : boundary;
3031
3041
  const upper = tab.pinned ? boundary : without.length;
3032
3042
  const at = Math.min(Math.max(toIndex, lower), upper);
3033
- pane.tabOrder = [...without.slice(0, at), tabId, ...without.slice(at)];
3043
+ return [...without.slice(0, at), tabId, ...without.slice(at)];
3034
3044
  }
3035
3045
  function closeTab2(tabId) {
3036
3046
  const tab = workspace2.tabs.get(tabId);
@@ -3045,8 +3055,8 @@ function closeTab2(tabId) {
3045
3055
  detachTab2(tabId);
3046
3056
  workspace2.mruOrder = workspace2.mruOrder.filter((id) => id !== tabId);
3047
3057
  resetTabCycle();
3048
- if (pane && paneIsEmpty(pane)) {
3049
- closePane(pane.id);
3058
+ if (pane && paneIsEmpty2(pane)) {
3059
+ closePane2(pane.id);
3050
3060
  }
3051
3061
  if (!wasActive) {
3052
3062
  return;
@@ -3128,16 +3138,19 @@ function replaceAllTabs2(newTabOpts) {
3128
3138
  function activateTab2(tabId, opts = {}) {
3129
3139
  setActiveTab(tabId, opts);
3130
3140
  }
3131
- function moveTabToPane2(tabId, paneId) {
3141
+ function moveTabToPane2(tabId, paneId, index) {
3132
3142
  const pane = paneById2(paneId);
3133
3143
  if (!pane || !workspace2.tabs.has(tabId)) {
3134
3144
  return null;
3135
3145
  }
3136
3146
  if (pane.tabOrder.includes(tabId)) {
3147
+ if (index !== undefined) {
3148
+ pane.tabOrder = reorderWithinPane(pane, tabId, index);
3149
+ }
3137
3150
  return pane;
3138
3151
  }
3139
3152
  detachTab2(tabId);
3140
- insertIntoPane2(pane, tabId);
3153
+ insertIntoPane2(pane, tabId, index);
3141
3154
  return pane;
3142
3155
  }
3143
3156
  function renameTab2(oldId, newId, newDocumentPath) {
@@ -3228,6 +3241,31 @@ function tabCommands(deps) {
3228
3241
  }
3229
3242
  }
3230
3243
  },
3244
+ {
3245
+ args: argsSchema({
3246
+ file: stringProperty('Project-relative path of the file to open in the other pane, e.g. "pages/about.json". ' + "It must exist.")
3247
+ }),
3248
+ id: "document.openToSide",
3249
+ title: "Open to the Side",
3250
+ category: "Document",
3251
+ level: "project",
3252
+ menus: ["context/file", "palette"],
3253
+ group: "1_file",
3254
+ when: (ctx) => ctx.project.open,
3255
+ requires: "an open project",
3256
+ undo: "none",
3257
+ run: async (_ctx, args) => {
3258
+ const file = stringArg("document.openToSide", args, "file");
3259
+ const target = receivingPane2(activePane2().id);
3260
+ await deps.openFile(file, { paneId: target.id });
3261
+ if (![...workspace2.tabs.values()].some((tab) => tab.documentPath === file)) {
3262
+ if (paneIsEmpty2(target) && target.id !== PRIMARY_PANE2) {
3263
+ closePane2(target.id);
3264
+ }
3265
+ throw new RangeError(`command "document.openToSide" argument "file": "${file}" could not be opened — it ` + `does not exist, or no editor claims its format. Problems has the reason.`);
3266
+ }
3267
+ }
3268
+ },
3231
3269
  {
3232
3270
  id: "document.reopenClosed",
3233
3271
  title: "Reopen Closed Document",
@@ -3319,7 +3357,7 @@ function paneCommands(deps) {
3319
3357
  requires: "an open document",
3320
3358
  undo: "none",
3321
3359
  run: () => {
3322
- splitRight();
3360
+ splitRight2();
3323
3361
  }
3324
3362
  },
3325
3363
  {
@@ -3343,7 +3381,7 @@ function paneCommands(deps) {
3343
3381
  if (held?.documentPath === path) {
3344
3382
  throw new RangeError(`command "pane.compareWith" argument "path": "${path}" is the document this pane is ` + `already showing — name a different one`);
3345
3383
  }
3346
- await deps.openFileInPane(receivingPane2().id, path);
3384
+ await deps.openFileInPane(receivingPane2(here.id).id, path);
3347
3385
  }
3348
3386
  },
3349
3387
  {
@@ -3394,14 +3432,14 @@ function runUnsplit() {
3394
3432
  const derived = workspace2.panes.find((pane) => pane.derived !== null);
3395
3433
  if (derived?.id === PRIMARY_PANE2) {
3396
3434
  derived.derived = null;
3397
- if (!paneIsEmpty(derived)) {
3435
+ if (!paneIsEmpty2(derived)) {
3398
3436
  return;
3399
3437
  }
3400
3438
  }
3401
- closePane(derived?.id ?? SECONDARY_PANE2);
3439
+ closePane2(derived?.id ?? SECONDARY_PANE2);
3402
3440
  }
3403
3441
 
3404
- export { LANGUAGE_TAG_PATTERN, canonicalizeLocale, isWellFormedLocale, localeDirection, localeLabel, resolveI18n, localeOfPath, servedLocaleOfPath, translationKeyOfPath, translationPathFor, EDITOR_KIND_LABELS, editorKindForMode, canvasViewForMode, inCanvas, hasSelection, hasElementSelection, emptyContext, makeContext, keyScopeStack, PROJECT_CONFIG_PATH, createTab, editorKindOf, editorKindsOf, modeForEditorKind, disposeTab, primarySelection, selectionAnchor, isSelected, cloneSelection, toggleSelected, rangeSelection, isSpliceablePath, structuralBatch, uniquePaths, unifyValues, setPatchConsumer, recordDocOp, transactDoc, transact, beginBatch, endBatch, isBatching, batchTab, setHistoryDelegate, canUndo, canRedo, undo, redo, mutateInsertNode, mutateRemoveNode, mutateDuplicateNode, mutateRemoveNodes, mutateDuplicateNodes, mutateWrapNode, mutateMoveNode, mutateUpdateProperty, mutateUpdateStyle, mutateUpdateAttribute, mutateUpdateMediaStyle, mutateUpdateNestedStyle, mutateUpdateMediaNestedStyle, mutateUpdateNestedStylePath, mutateUpdateMediaNestedStylePath, mutateReplaceStyle, mutateAddDef, mutateRemoveDef, mutateUpdateDef, mutateRenameDef, mutateUpdateProp, mutateAddSwitchCase, mutateRemoveSwitchCase, mutateRenameSwitchCase, mutateUpdateFrontmatter, collabState, isCollabPath, stringArg, optionalStringArg, boundedNumberArg, booleanArg, enumArg, pathArg, nullablePathArg, pathListArg, argsSchema, enumProperty, derivedEnumProperty, numberProperty, booleanProperty, pathProperty, pathListProperty, stringProperty, coerceArgs, LOCALE_PLACEHOLDER, collectionForDirectory, collectionForFile, camelToLabel, toCamelCase, kebabToLabel, propLabel, attrLabel, abbreviateValue, isMediaFormat, inferInputType, findContentTypeSchema, friendlyNameToVar, varDisplayName, parseCemType, jsonClone, configureCollabSerializer, configureCollabParser, configureCollabNotifier, collabSourceContext, collabReadOnly, collabSave, flushAllCollab, setCollabEnabled, isCollabEnabled, PRIMARY_PANE2, SECONDARY_PANE2, workspace2, activeTab2, activePane2, paneById2, paneOfTab2, focusPane2, isPaneFocused2, sidePane2, receivingPane2, detachTab2, insertIntoPane2, setWorkspaceProject2, isTabActive2, tabIsLive2, openTab2, promoteTab2, promoteDirtyPreviewTabs2, setTabPinned2, moveTab2, closeTab2, closeAllTabs2, replaceAllTabs2, activateTab2, moveTabToPane2, renameTab2, registerTabCommands2 };
3442
+ export { LANGUAGE_TAG_PATTERN, canonicalizeLocale, isWellFormedLocale, localeDirection, localeLabel, resolveI18n, localeOfPath, servedLocaleOfPath, translationKeyOfPath, translationPathFor, EDITOR_KIND_LABELS, editorKindForMode, canvasViewForMode, inCanvas, hasSelection, hasElementSelection, emptyContext, makeContext, keyScopeStack, PROJECT_CONFIG_PATH, createTab, editorKindOf, editorKindsOf, modeForEditorKind, disposeTab, primarySelection, selectionAnchor, isSelected, cloneSelection, toggleSelected, rangeSelection, isSpliceablePath, structuralBatch, uniquePaths, unifyValues, setPatchConsumer, recordDocOp, transactDoc, transact, beginBatch, endBatch, isBatching, batchTab, setHistoryDelegate, canUndo, canRedo, undo, redo, mutateInsertNode, mutateRemoveNode, mutateDuplicateNode, mutateRemoveNodes, mutateDuplicateNodes, mutateWrapNode, mutateMoveNode, mutateUpdateProperty, mutateUpdateStyle, mutateUpdateAttribute, mutateUpdateMediaStyle, mutateUpdateNestedStyle, mutateUpdateMediaNestedStyle, mutateUpdateNestedStylePath, mutateUpdateMediaNestedStylePath, mutateReplaceStyle, mutateAddDef, mutateRemoveDef, mutateUpdateDef, mutateRenameDef, mutateUpdateProp, mutateAddSwitchCase, mutateRemoveSwitchCase, mutateRenameSwitchCase, mutateUpdateFrontmatter, collabState, isCollabPath, stringArg, optionalStringArg, boundedNumberArg, booleanArg, enumArg, pathArg, nullablePathArg, pathListArg, argsSchema, enumProperty, derivedEnumProperty, numberProperty, booleanProperty, pathProperty, pathListProperty, stringProperty, coerceArgs, LOCALE_PLACEHOLDER, collectionForDirectory, collectionForFile, camelToLabel, toCamelCase, kebabToLabel, propLabel, attrLabel, abbreviateValue, isMediaFormat, inferInputType, findContentTypeSchema, friendlyNameToVar, varDisplayName, parseCemType, jsonClone, configureCollabSerializer, configureCollabParser, configureCollabNotifier, collabSourceContext, collabReadOnly, collabSave, flushAllCollab, setCollabEnabled, isCollabEnabled, PRIMARY_PANE2, SECONDARY_PANE2, MAX_PANES2, workspace2, activeTab2, activePane2, paneById2, paneOfTab2, focusPane2, isPaneFocused2, splitRight2, paneBeside2, receivingPane2, closePane2, paneIsEmpty2, detachTab2, insertIntoPane2, setWorkspaceProject2, isTabActive2, tabIsLive2, openTab2, promoteTab2, promoteDirtyPreviewTabs2, setTabPinned2, moveTab2, closeTab2, closeAllTabs2, replaceAllTabs2, activateTab2, moveTabToPane2, renameTab2, registerTabCommands2 };
3405
3443
 
3406
- //# debugId=835A5B58C44D6A6B64756E2164756E21
3407
- //# sourceMappingURL=studio-k75n7vhp.js.map
3444
+ //# debugId=CC161DFB5A8EC33464756E2164756E21
3445
+ //# sourceMappingURL=studio-gk2twyh4.js.map
@@ -3,13 +3,13 @@ import {
3
3
  } from "./studio-6nzaktvy.js";
4
4
  import {
5
5
  normalizeProjectPath
6
- } from "./studio-kkqkcp3d.js";
6
+ } from "./studio-d1n2bykn.js";
7
7
  import {
8
8
  extensionOf,
9
9
  mediaKind,
10
10
  baseName,
11
11
  dirName
12
- } from "./studio-jxp12rnj.js";
12
+ } from "./studio-b7xacrwe.js";
13
13
 
14
14
  // src/files/media-meta.ts
15
15
  var settled = new Map;
@@ -115,4 +115,4 @@ function mediaMetaSummary(meta) {
115
115
  export { peekMediaMeta, seedMediaMeta, loadMediaMeta, recordImageSize, invalidateMediaMeta, formatBytes, mediaMetaSummary };
116
116
 
117
117
  //# debugId=23AD97ADF0A22AE164756E2164756E21
118
- //# sourceMappingURL=studio-syg2tadj.js.map
118
+ //# sourceMappingURL=studio-gtfq1dkz.js.map
@@ -3,10 +3,10 @@ import {
3
3
  } from "./studio-6nzaktvy.js";
4
4
  import {
5
5
  projectState
6
- } from "./studio-6ewqv390.js";
6
+ } from "./studio-m1p9b6c3.js";
7
7
  import {
8
8
  reactive
9
- } from "./studio-p1dw8wfw.js";
9
+ } from "./studio-d8z5bajd.js";
10
10
  import {
11
11
  loadFormats2,
12
12
  formatByName2,
@@ -14,21 +14,21 @@ import {
14
14
  documentExtensions2,
15
15
  defaultContentFormat2,
16
16
  formatSerialize2
17
- } from "./studio-vw7mzp6z.js";
17
+ } from "./studio-6gryj0sg.js";
18
18
  import {
19
19
  workspace2
20
- } from "./studio-k75n7vhp.js";
20
+ } from "./studio-gk2twyh4.js";
21
21
  import {
22
22
  markLocalMutation2,
23
23
  isRecentLocal2
24
- } from "./studio-g3jevyjt.js";
24
+ } from "./studio-4c041r8y.js";
25
25
  import {
26
26
  makeGridTabId,
27
27
  columnsFromSchema,
28
28
  inferColumnsFromRows,
29
29
  getGridController,
30
30
  parseSourceForPath2
31
- } from "./studio-gb13095a.js";
31
+ } from "./studio-ke09tn9k.js";
32
32
  import {
33
33
  __preload
34
34
  } from "./studio-5te5tqng.js";
@@ -330,7 +330,7 @@ function buildEntryFileSource(opts) {
330
330
  await writeEntry(path, entry, patches);
331
331
  outcome(true);
332
332
  if (openTab) {
333
- const { reloadFileInTab } = await (__preload("hnxqxtsg"), import("./files-hnxqxtsg.js"));
333
+ const { reloadFileInTab } = await (__preload("y6fr4he9"), import("./files-y6fr4he9.js"));
334
334
  reloadFileInTab(path);
335
335
  }
336
336
  } catch (error) {
@@ -495,4 +495,4 @@ function createPagesSource2() {
495
495
  export { DRAFT_FIELD, DRAFT_MEANING, isDraftEntry, hasDraftAxis, setIncludeDrafts, collectionInfo2, collectionDirs2, listCollectionEntryIds2, reloadDraftAwareGrids2, createCollectionSource2, createPagesSource2 };
496
496
 
497
497
  //# debugId=9A9477683F06DFEB64756E2164756E21
498
- //# sourceMappingURL=studio-1knfqgy7.js.map
498
+ //# sourceMappingURL=studio-j0w60gft.js.map
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  ensureCaret
3
- } from "./studio-kkqkcp3d.js";
3
+ } from "./studio-d1n2bykn.js";
4
4
  import {
5
5
  registerSurface,
6
6
  mountSurface,
7
7
  getLayerSlot2,
8
8
  clearLayerSlot2
9
- } from "./studio-vfq8qpjt.js";
9
+ } from "./studio-0j7r7s9g.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-aj37eer3.js.map
422
+ //# sourceMappingURL=studio-jt27ta6x.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./studio-6nzaktvy.js";
5
5
  import {
6
6
  displayTagName
7
- } from "./studio-7r42c6ca.js";
7
+ } from "./studio-3ntvq6cg.js";
8
8
  import {
9
9
  errorMessage2
10
10
  } from "./studio-yxa81f45.js";
@@ -24,7 +24,7 @@ import {
24
24
  clearProblems2,
25
25
  problemFindings2,
26
26
  problemCount2
27
- } from "./studio-p1dw8wfw.js";
27
+ } from "./studio-d8z5bajd.js";
28
28
  import {
29
29
  loadFormats2,
30
30
  formatByName2,
@@ -34,7 +34,7 @@ import {
34
34
  formatParse2,
35
35
  formatSerialize2,
36
36
  splitFormatDocument2
37
- } from "./studio-vw7mzp6z.js";
37
+ } from "./studio-6gryj0sg.js";
38
38
  import {
39
39
  getNodeAtPath2,
40
40
  childList,
@@ -42,7 +42,7 @@ import {
42
42
  nodeLabel,
43
43
  projectState,
44
44
  statusbarEl
45
- } from "./studio-6ewqv390.js";
45
+ } from "./studio-m1p9b6c3.js";
46
46
  import {
47
47
  EDITOR_KIND_LABELS,
48
48
  primarySelection,
@@ -59,10 +59,10 @@ import {
59
59
  PRIMARY_PANE2,
60
60
  workspace2,
61
61
  activeTab2
62
- } from "./studio-k75n7vhp.js";
62
+ } from "./studio-gk2twyh4.js";
63
63
  import {
64
64
  isMediaFile
65
- } from "./studio-jxp12rnj.js";
65
+ } from "./studio-b7xacrwe.js";
66
66
  import {
67
67
  POPOVER_DEFAULT_MODE,
68
68
  findPopoverDefects,
@@ -70,38 +70,38 @@ import {
70
70
  POPOVER_TAGS,
71
71
  INVOKER_TAGS,
72
72
  activeRegistry
73
- } from "./studio-kkqkcp3d.js";
73
+ } from "./studio-d1n2bykn.js";
74
74
  import {
75
75
  paneRegion,
76
76
  registerSurface,
77
77
  mountSurface,
78
78
  runReported,
79
79
  showConfirmDialog2
80
- } from "./studio-vfq8qpjt.js";
80
+ } from "./studio-0j7r7s9g.js";
81
81
  import {
82
82
  openMenu2
83
- } from "./studio-aj37eer3.js";
83
+ } from "./studio-jt27ta6x.js";
84
84
  import {
85
85
  parseJsonDocument,
86
86
  serializeJson,
87
87
  shell
88
- } from "./studio-qk90fgqm.js";
88
+ } from "./studio-fzjx96t2.js";
89
89
  import {
90
90
  deployStatusItem
91
- } from "./studio-mhhyamxf.js";
91
+ } from "./studio-nsgw7dbk.js";
92
92
  import {
93
93
  tabOfPane,
94
94
  derivationOfPane,
95
95
  findDialogDefects,
96
96
  flushCanvasEdits2
97
- } from "./studio-1z1kcjv4.js";
97
+ } from "./studio-drg8qj9k.js";
98
98
  import {
99
99
  isRecentLocal2
100
- } from "./studio-g3jevyjt.js";
100
+ } from "./studio-4c041r8y.js";
101
101
  import {
102
102
  showProgressModal,
103
103
  loadMediaUsages
104
- } from "./studio-tqgryxwg.js";
104
+ } from "./studio-cgprcdxn.js";
105
105
  import {
106
106
  validateComponentSlots
107
107
  } from "./studio-q0a3yk4n.js";
@@ -386,7 +386,7 @@ function mountJumpBarSurface(host, region, actions) {
386
386
  var pane_grid_default = {
387
387
  $schema: "https://jxsuite.com/schema/v1",
388
388
  $id: "StudioPaneGrid",
389
- $description: "The pane grid (studio.md §18.1): one cell per pane, with a splitter before every cell but the first. Every box here is EMPTY by design — the four inside a cell are hosts other modules fill (`panels/tab-strip.ts` the strip, `panels/jump-bar.ts` the jump bar, `panels/pane-context.ts` the chrome layer, `canvas/canvas-render.ts` the stage), and the stage is an ISLAND in the §9.4 sense: the canvas host mounts a cross-origin `<iframe>` into it, so nothing this document draws may ever go inside it. What the document owns is the STRUCTURE and the STYLE — the cell's own two-row grid, the three row-2 children that share its lower cell, and the splitter — which is `styles/shell.css`'s `.pane*` block and `styles/canvas.css`'s `.pane-stage` rule, carried here and keyed on `part`. Two things are load-bearing and easy to undo. (1) **A row that moves reloads an iframe**, so the keyed `$map` is not an optimisation: `workspace.panes[0]` is always the primary and `MAX_PANES` is 2, the key is the pane id, and the runtime's forward-cursor pass therefore never moves a kept row — gaining or losing the side pane leaves the primary's node, and the frame inside it, untouched. (2) **The splitter must sit BETWEEN two cells and inside neither**, so each row is a `display: contents` wrapper holding its own leading splitter and its cell: the wrapper generates no box, so the splitter and the two cells are the grid items of `#pane-grid` in DOM order, and a pointer landing on the splitter is in no cell at all. Every selector below is a `>` chain from the root, because a pane's stage hosts other surface documents and a bare `[part=\"row\"]` descendant rule would reach into them.",
389
+ $description: "The pane grid (studio.md §18.1): one cell per pane, with a splitter before every cell but the first. Every box here is EMPTY by design — the FIVE inside a cell are hosts other modules fill (`panels/tab-strip.ts` the strip, `panels/jump-bar.ts` the jump bar, `panels/pane-context.ts` the chrome layer, `canvas/canvas-render.ts` the stage, `panels/pane-grid.ts` itself the right-edge drop zone), and the stage is an ISLAND in the §9.4 sense: the canvas host mounts a cross-origin `<iframe>` into it, so nothing this document draws may ever go inside it. What the document owns is the STRUCTURE and the STYLE — the cell's own two-row grid, the three row-2 children that share its lower cell, and the splitter — which is `styles/shell.css`'s `.pane*` block and `styles/canvas.css`'s `.pane-stage` rule, carried here and keyed on `part`. Two things are load-bearing and easy to undo. (1) **A row that moves reloads an iframe**, so the keyed `$map` is not an optimisation: `workspace.panes[0]` is always the primary and `MAX_PANES` is 2, the key is the pane id, and the runtime's forward-cursor pass therefore never moves a kept row — gaining or losing the side pane leaves the primary's node, and the frame inside it, untouched. (2) **The splitter must sit BETWEEN two cells and inside neither**, so each row is a `display: contents` wrapper holding its own leading splitter and its cell: the wrapper generates no box, so the splitter and the two cells are the grid items of `#pane-grid` in DOM order, and a pointer landing on the splitter is in no cell at all. Every selector below is a `>` chain from the root, because a pane's stage hosts other surface documents and a bare `[part=\"row\"]` descendant rule would reach into them.",
390
390
  tagName: "div",
391
391
  attributes: {
392
392
  part: "grid",
@@ -412,7 +412,7 @@ var pane_grid_default = {
412
412
  zIndex: "10"
413
413
  },
414
414
  '& > [part="row"] > [part="pane"]': {
415
- $description: 'ONE PANE, and one COLUMN, declared. Three children name `grid-row: 2` in order to share the lower cell, and auto-placement answers that by inventing an implicit column each: the jump bar, the chrome layer and the stage lined up side by side, the stage taking a third of the pane and pinning the document to the right edge. `grid-template-columns` is what makes "share the cell" mean it, and every row-2 child restates `grid-column: 1` so a future fourth one cannot re-open the same hole. No unit test can see this — happy-dom does no layout, so every rect is zero — which is why the screenshot lane is what caught it.',
415
+ $description: 'ONE PANE, and one COLUMN, declared. Four children name `grid-row: 2` in order to share the lower cell, and auto-placement answers that by inventing an implicit column each: the jump bar, the chrome layer, the stage and the drop zone lined up side by side, the stage taking a third of the pane and pinning the document to the right edge. `grid-template-columns` is what makes "share the cell" mean it, and every row-2 child restates `grid-column: 1` so a future fifth one cannot re-open the same hole. No unit test can see this — happy-dom does no layout, so every rect is zero — which is why the screenshot lane is what caught it.',
416
416
  display: "grid",
417
417
  gridTemplateColumns: "minmax(0, 1fr)",
418
418
  gridTemplateRows: "auto minmax(0, 1fr)",
@@ -467,11 +467,33 @@ var pane_grid_default = {
467
467
  display: "flex",
468
468
  gap: "var(--jx-space-6)",
469
469
  alignItems: "flex-start"
470
+ },
471
+ '& > [part="row"] > [part="pane"] > [part="drop-zone"]': {
472
+ $description: "The right-edge target that creates a second pane (§18.1). Sits ABOVE the stage (`z-index: 4` against the stage's own stacking, jump's 3, chrome's 2) so a drag reaches it before it reaches the cross-origin iframe underneath, which would otherwise swallow every drag event with no affordance to say so. `pointer-events: none` when unarmed — a mouse doing anything other than dragging a tab or a file must pass straight through to the stage — and `auto` only while `data-armed` is set, which `panels/pane-grid.ts`'s own arming monitor writes for the DURATION of a drag it recognises, never for a click.",
473
+ gridRow: "2",
474
+ gridColumn: "1",
475
+ position: "relative",
476
+ zIndex: "4",
477
+ minWidth: "0",
478
+ pointerEvents: "none"
479
+ },
480
+ '& > [part="row"] > [part="pane"] > [part="drop-zone"][data-armed]': {
481
+ pointerEvents: "auto"
482
+ },
483
+ '& > [part="row"] > [part="pane"] > [part="drop-zone"][data-over]::after': {
484
+ $description: "The right BAND, not the whole cell: the zone only ever ACCEPTS a drop in that band (`panels/pane-grid.ts`'s `edgeData`), so lighting the whole cell would promise a drop this element refuses everywhere else in it.",
485
+ content: '""',
486
+ position: "absolute",
487
+ insetBlock: "0",
488
+ insetInlineEnd: "0",
489
+ insetInlineStart: "50%",
490
+ background: "color-mix(in srgb, var(--accent) 14%, transparent)",
491
+ borderInlineStart: "2px solid var(--accent)"
470
492
  }
471
493
  },
472
494
  children: [
473
495
  {
474
- $description: "Keyed on the PANE ID, and that is the whole of §18.1 rule 1's structural half: the key is what makes the runtime MOVE a kept row rather than rebuild it, and re-parenting is not a move for an `<iframe>` — it reloads, dropping its `iframe-channel` connection, its shadow document and every `ready` panel with it. A row renders complete (its cell, its four hosts and its splitter) inside the row's own effect scope before it is inserted, so there is no frame in which a cell exists with no stage inside it.",
496
+ $description: "Keyed on the PANE ID, and that is the whole of §18.1 rule 1's structural half: the key is what makes the runtime MOVE a kept row rather than rebuild it, and re-parenting is not a move for an `<iframe>` — it reloads, dropping its `iframe-channel` connection, its shadow document and every `ready` panel with it. A row renders complete (its cell, its five hosts and its splitter) inside the row's own effect scope before it is inserted, so there is no frame in which a cell exists with no stage inside it.",
475
497
  $prototype: "Array",
476
498
  items: { $ref: "#/state/rows" },
477
499
  key: { $ref: "$map/item/id" },
@@ -563,6 +585,16 @@ var pane_grid_default = {
563
585
  part: "pane-stage",
564
586
  "data-jx-region": "${$map.item.region}"
565
587
  }
588
+ },
589
+ {
590
+ $description: "The right-edge drop target (§18.1). No `data-jx-region`: `pane.<id>` uniqueness names the stage, and a second element answering to it would be a silently widened crop the moment a shot cropped this pane.",
591
+ tagName: "div",
592
+ attributes: {
593
+ part: "drop-zone",
594
+ role: "none",
595
+ "data-armed": "${state.armed ? '' : null}",
596
+ "data-over": "${state.edgePane === $map.item.id ? '' : null}"
597
+ }
566
598
  }
567
599
  ]
568
600
  }
@@ -583,7 +615,8 @@ var CELL_PARTS = new Map([
583
615
  ["strip", "strip"],
584
616
  ["jump", "jump"],
585
617
  ["chrome", "chrome"],
586
- ["pane-stage", "stage"]
618
+ ["pane-stage", "stage"],
619
+ ["drop-zone", "dropZone"]
587
620
  ]);
588
621
  function partOf(def) {
589
622
  const part = typeof def === "string" ? undefined : def.attributes?.["part"];
@@ -596,6 +629,8 @@ function paneOf(state) {
596
629
  function mountPaneGridSurface(host, rows, split, actions) {
597
630
  host.replaceChildren();
598
631
  const scope = reactive({
632
+ armed: false,
633
+ edgePane: "",
599
634
  move: actions.move,
600
635
  paneSplit: split.value,
601
636
  rows,
@@ -628,6 +663,10 @@ function mountPaneGridSurface(host, rows, split, actions) {
628
663
  mounted = null;
629
664
  host.replaceChildren();
630
665
  },
666
+ drag(state) {
667
+ scope.armed = state.armed;
668
+ scope.edgePane = state.edgePane;
669
+ },
631
670
  ready,
632
671
  update(next, value) {
633
672
  scope.rows = next;
@@ -2802,5 +2841,5 @@ async function renamePromptMessage2(path, verb = "rename") {
2802
2841
 
2803
2842
  export { cellValuesEqual, makeGridTabId, parseGridTabId, gridTabLabel, columnsFromSchema, inferColumnsFromRows, coerceCellInput, cellToText, ROW_KEY_FIELD, getGridController, createGridController, PANE_SELECTOR, STAGE_SELECTOR, mountPaneGridSurface, attachJumpBarHost, mountJumpBar, projectSessions, renderStatusbar, mountStatusbar, registerPopoverCommands, serializeDocument, notePreviewOverlayEdit, armPreviewOverlay, disarmPreviewOverlay, flushPreviewOverlay, mediaTypeEssence, parseSourceForPath2, parseCollabSource2, setDocumentSavedListener2, saveFile2, exportFile2, confirmFileDelete2, renamePromptMessage2 };
2804
2843
 
2805
- //# debugId=4552E6F8EAA3D63064756E2164756E21
2806
- //# sourceMappingURL=studio-gb13095a.js.map
2844
+ //# debugId=DBDB9C97E212B0A564756E2164756E21
2845
+ //# sourceMappingURL=studio-ke09tn9k.js.map
@@ -3579,6 +3579,20 @@ var schema_default = {
3579
3579
  }
3580
3580
  ]
3581
3581
  },
3582
+ oninstallresult: {
3583
+ description: 'Event handler for the "installresult" event.',
3584
+ oneOf: [
3585
+ {
3586
+ $ref: "#/$defs/RefObject"
3587
+ },
3588
+ {
3589
+ $ref: "#/$defs/ExpressionEntry"
3590
+ },
3591
+ {
3592
+ $ref: "#/$defs/FunctionDef"
3593
+ }
3594
+ ]
3595
+ },
3582
3596
  oninvalid: {
3583
3597
  description: 'Event handler for the "invalid" event.',
3584
3598
  oneOf: [
@@ -27923,6 +27937,7 @@ var schema_default = {
27923
27937
  "img",
27924
27938
  "input",
27925
27939
  "ins",
27940
+ "install",
27926
27941
  "kbd",
27927
27942
  "label",
27928
27943
  "legend",
@@ -29351,5 +29366,5 @@ var project_schema_default = {
29351
29366
 
29352
29367
  export { schema_default, project_schema_default };
29353
29368
 
29354
- //# debugId=E8EEF42BD8F1B5B664756E2164756E21
29355
- //# sourceMappingURL=studio-d0300636.js.map
29369
+ //# debugId=31FF1A1BF06B525764756E2164756E21
29370
+ //# sourceMappingURL=studio-ks2zzth2.js.map
@@ -1,8 +1,8 @@
1
1
  import {
2
- isRef2,
2
+ isRef,
3
3
  isEventBinding,
4
4
  displayTagName
5
- } from "./studio-7r42c6ca.js";
5
+ } from "./studio-3ntvq6cg.js";
6
6
 
7
7
  // src/ui/timing.ts
8
8
  var INPUT_DEBOUNCE = 400;
@@ -142,7 +142,7 @@ function nodeLabel(node) {
142
142
  }
143
143
  if (node.$prototype === "Array") {
144
144
  const { items } = node;
145
- const ref = (isRef2(items) ? items.$ref : undefined) || "items";
145
+ const ref = (isRef(items) ? items.$ref : undefined) || "items";
146
146
  return `Repeater → ${ref}`;
147
147
  }
148
148
  if (node.$title) {
@@ -351,5 +351,5 @@ function updateCanvas(tab, patch) {
351
351
 
352
352
  export { INPUT_DEBOUNCE, LIVE_PREVIEW, POLL_GIT, getNodeAtPath2, childList, normalizeArrayChildren, parentElementPath, childIndex, pathKey, pathsEqual, isAncestor, flattenTree, nodeLabel, projectState, setProjectState, requireProjectState, stripEventHandlers, activityBar, leftPanel, rightPanel, toolbarEl, statusbarEl, initShellRefs, VOID_ELEMENTS, COMMON_SELECTORS, isNestedSelector, debouncedStyleCommit, cancelStyleDebounce, rendersInFlight, registerRenderer, render3, renderOnly, updateSession, updateUi, updateCanvas };
353
353
 
354
- //# debugId=4E217858397A673D64756E2164756E21
355
- //# sourceMappingURL=studio-6ewqv390.js.map
354
+ //# debugId=9800A80DF4A0581E64756E2164756E21
355
+ //# sourceMappingURL=studio-m1p9b6c3.js.map
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  reactive,
6
6
  notify2
7
- } from "./studio-p1dw8wfw.js";
7
+ } from "./studio-d8z5bajd.js";
8
8
  import {
9
9
  REGION_ATTR,
10
10
  overlayRegion,
@@ -12,11 +12,11 @@ import {
12
12
  mountSurface,
13
13
  whenReady,
14
14
  layerHost2
15
- } from "./studio-vfq8qpjt.js";
15
+ } from "./studio-0j7r7s9g.js";
16
16
  import {
17
17
  showModal,
18
18
  close2
19
- } from "./studio-kkqkcp3d.js";
19
+ } from "./studio-d1n2bykn.js";
20
20
  // src/surfaces/github-auth.json
21
21
  var github_auth_default = {
22
22
  $schema: "https://jxsuite.com/schema/v1",
@@ -359,4 +359,4 @@ async function authenticateGithub() {
359
359
  export { githubTokenStored, githubTokenLocation, clearGithubToken, authenticateGithub };
360
360
 
361
361
  //# debugId=6031989CF8E575E564756E2164756E21
362
- //# sourceMappingURL=studio-qk4bfsq2.js.map
362
+ //# sourceMappingURL=studio-msc1ee1m.js.map