@jxsuite/studio 0.10.2 → 0.11.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 CHANGED
@@ -606,7 +606,15 @@ function stripEventHandlers(node) {
606
606
  for (const [ck, cv] of Object.entries(v))
607
607
  cases[ck] = stripEventHandlers(cv);
608
608
  out.cases = cases;
609
- } else if (k === "state" || k === "style" || k === "attributes" || k === "$media") {
609
+ } else if (k === "state" && typeof v === "object" && v !== null) {
610
+ const state = {};
611
+ for (const [sk, sv] of Object.entries(v)) {
612
+ if (sv && typeof sv === "object" && sv.timing === "server")
613
+ continue;
614
+ state[sk] = sv;
615
+ }
616
+ out.state = state;
617
+ } else if (k === "style" || k === "attributes" || k === "$media") {
610
618
  out[k] = v;
611
619
  } else {
612
620
  out[k] = v;
@@ -41294,6 +41302,7 @@ var view = {
41294
41302
  stylebookElToTag: new WeakMap,
41295
41303
  showAddBreakpointForm: false,
41296
41304
  addBreakpointPreview: "",
41305
+ layoutSelection: null,
41297
41306
  autosaveTimer: null
41298
41307
  };
41299
41308
  // data/elements-meta.json
@@ -172222,6 +172231,80 @@ function getEffectiveHead(docHead) {
172222
172231
  }
172223
172232
  return merged;
172224
172233
  }
172234
+ var layoutCache = new Map;
172235
+ function invalidateLayoutCache() {
172236
+ layoutCache.clear();
172237
+ }
172238
+ function getEffectiveLayoutPath(docLayout) {
172239
+ if (docLayout === false)
172240
+ return null;
172241
+ const defaultLayout = projectState?.projectConfig?.defaults?.layout;
172242
+ return docLayout || defaultLayout || null;
172243
+ }
172244
+ async function resolveLayoutDoc(layoutPath) {
172245
+ const normalized = layoutPath.replace(/^\.\//, "");
172246
+ if (layoutCache.has(normalized))
172247
+ return structuredClone(layoutCache.get(normalized));
172248
+ try {
172249
+ const platform3 = getPlatform();
172250
+ const content = await platform3.readFile(normalized);
172251
+ const doc = JSON.parse(content);
172252
+ layoutCache.set(normalized, doc);
172253
+ return structuredClone(doc);
172254
+ } catch {
172255
+ return null;
172256
+ }
172257
+ }
172258
+ function distributePageIntoLayout(layoutDoc, pageDoc) {
172259
+ const pageChildren = pageDoc.children ?? [];
172260
+ const children = typeof pageChildren === "string" ? [pageChildren] : pageChildren;
172261
+ const named = new Map;
172262
+ const defaults = [];
172263
+ for (const child of children) {
172264
+ if (child && typeof child === "object" && child.attributes?.slot) {
172265
+ const slotName = child.attributes.slot;
172266
+ if (!named.has(slotName))
172267
+ named.set(slotName, []);
172268
+ named.get(slotName).push(child);
172269
+ } else {
172270
+ defaults.push(child);
172271
+ }
172272
+ }
172273
+ fillSlots(layoutDoc, named, defaults);
172274
+ if (pageDoc.state)
172275
+ layoutDoc.state = { ...layoutDoc.state, ...pageDoc.state };
172276
+ if (pageDoc.$media)
172277
+ layoutDoc.$media = { ...layoutDoc.$media, ...pageDoc.$media };
172278
+ if (pageDoc.style)
172279
+ layoutDoc.style = { ...layoutDoc.style, ...pageDoc.style };
172280
+ if (pageDoc.attributes)
172281
+ layoutDoc.attributes = { ...layoutDoc.attributes, ...pageDoc.attributes };
172282
+ return layoutDoc;
172283
+ }
172284
+ function fillSlots(node, named, defaults) {
172285
+ if (!node || typeof node !== "object")
172286
+ return;
172287
+ if (!Array.isArray(node.children))
172288
+ return;
172289
+ const newChildren = [];
172290
+ for (const child of node.children) {
172291
+ if (child && typeof child === "object" && child.tagName === "slot") {
172292
+ const slotName = child.attributes?.name;
172293
+ if (slotName && named.has(slotName)) {
172294
+ newChildren.push(...named.get(slotName));
172295
+ named.delete(slotName);
172296
+ } else if (!slotName && defaults.length > 0) {
172297
+ newChildren.push(...defaults);
172298
+ } else if (child.children) {
172299
+ newChildren.push(...child.children);
172300
+ }
172301
+ } else {
172302
+ fillSlots(child, named, defaults);
172303
+ newChildren.push(child);
172304
+ }
172305
+ }
172306
+ node.children = newChildren;
172307
+ }
172225
172308
  async function updateSiteConfig(patch) {
172226
172309
  const platform3 = getPlatform();
172227
172310
  const config = { ...projectState.projectConfig, ...patch };
@@ -173514,6 +173597,10 @@ var SCHEMA_KEYWORDS = new Set([
173514
173597
  "required",
173515
173598
  "examples"
173516
173599
  ]);
173600
+ var _serverFnConfig = { skip: false };
173601
+ function setSkipServerFunctions(v) {
173602
+ _serverFnConfig.skip = v;
173603
+ }
173517
173604
  async function buildScope(doc, parentScope = {}, base = location.href) {
173518
173605
  const raw = {};
173519
173606
  for (const [key, val] of Object.entries(parentScope)) {
@@ -173577,9 +173664,11 @@ async function buildScope(doc, parentScope = {}, base = location.href) {
173577
173664
  state[key] = await resolvePrototype(def3, state, key, base);
173578
173665
  }
173579
173666
  }
173580
- for (const [key, def3] of Object.entries(defs)) {
173581
- if (def3 != null && typeof def3 === "object" && def3.timing === "server" && def3.$src && def3.$export && !def3.$prototype) {
173582
- state[key] = await resolveServerFunction(def3, state, key, base);
173667
+ if (!_serverFnConfig.skip) {
173668
+ for (const [key, def3] of Object.entries(defs)) {
173669
+ if (def3 != null && typeof def3 === "object" && def3.timing === "server" && def3.$src && def3.$export && !def3.$prototype) {
173670
+ state[key] = await resolveServerFunction(def3, state, key, base);
173671
+ }
173583
173672
  }
173584
173673
  }
173585
173674
  if (doc.$media) {
@@ -174607,13 +174696,71 @@ function distributeSlots(host2, slottedChildren) {
174607
174696
  // src/canvas/canvas-live-render.js
174608
174697
  init_components();
174609
174698
  var _ctx5 = null;
174699
+ var layoutElements = new WeakSet;
174700
+ function findPageContentPrefix(node, path = []) {
174701
+ if (!node || typeof node !== "object")
174702
+ return null;
174703
+ if (Array.isArray(node.children)) {
174704
+ for (let i = 0;i < node.children.length; i++) {
174705
+ const child = node.children[i];
174706
+ if (child && typeof child === "object" && !child.$__layout) {
174707
+ return [...path, "children"];
174708
+ }
174709
+ }
174710
+ for (let i = 0;i < node.children.length; i++) {
174711
+ const child = node.children[i];
174712
+ if (child && typeof child === "object" && child.$__layout) {
174713
+ const found = findPageContentPrefix(child, [...path, "children", i]);
174714
+ if (found)
174715
+ return found;
174716
+ }
174717
+ }
174718
+ }
174719
+ return null;
174720
+ }
174721
+ var activeLayoutPath = null;
174722
+ function markLayoutNodes(node) {
174723
+ if (!node || typeof node !== "object")
174724
+ return;
174725
+ node.$__layout = true;
174726
+ if (Array.isArray(node.children)) {
174727
+ for (const child of node.children)
174728
+ markLayoutNodes(child);
174729
+ }
174730
+ if (node.$elements) {
174731
+ for (const el of node.$elements)
174732
+ markLayoutNodes(el);
174733
+ }
174734
+ }
174610
174735
  function initCanvasLiveRender(ctx) {
174611
174736
  _ctx5 = ctx;
174612
174737
  }
174613
174738
  async function renderCanvasLive(gen, doc, canvasEl) {
174614
174739
  const S = _ctx5.getState();
174615
174740
  const canvasMode = _ctx5.getCanvasMode();
174616
- const renderDoc = canvasMode === "preview" ? structuredClone(doc) : prepareForEditMode(stripEventHandlers(doc));
174741
+ setSkipServerFunctions(canvasMode !== "preview");
174742
+ let renderDoc = canvasMode === "preview" ? structuredClone(doc) : prepareForEditMode(stripEventHandlers(doc));
174743
+ let layoutWrapped = false;
174744
+ activeLayoutPath = null;
174745
+ const isPage = S.documentPath && projectState?.isSiteProject && (S.documentPath.startsWith("pages/") || S.documentPath.startsWith("./pages/"));
174746
+ let pageContentPrefix = null;
174747
+ if (isPage) {
174748
+ const layoutPath = getEffectiveLayoutPath(doc.$layout);
174749
+ if (layoutPath) {
174750
+ const layoutDoc = await resolveLayoutDoc(layoutPath);
174751
+ if (layoutDoc) {
174752
+ if (gen !== view.renderGeneration)
174753
+ return null;
174754
+ activeLayoutPath = layoutPath.replace(/^\.\//, "");
174755
+ markLayoutNodes(layoutDoc);
174756
+ const pageForSlots = canvasMode === "preview" ? structuredClone(doc) : renderDoc;
174757
+ const merged = distributePageIntoLayout(layoutDoc, pageForSlots);
174758
+ renderDoc = canvasMode === "preview" ? merged : prepareForEditMode(stripEventHandlers(merged));
174759
+ layoutWrapped = true;
174760
+ pageContentPrefix = findPageContentPrefix(merged);
174761
+ }
174762
+ }
174763
+ }
174617
174764
  const mapParentPaths = new Set;
174618
174765
  if (canvasMode === "design" || canvasMode === "edit") {
174619
174766
  (function findMapParents(node, path) {
@@ -174757,17 +174904,34 @@ async function renderCanvasLive(gen, doc, canvasEl) {
174757
174904
  if (gen !== view.renderGeneration)
174758
174905
  return null;
174759
174906
  const el = renderNode(renderDoc, $defs, {
174760
- onNodeCreated(el2, path) {
174907
+ onNodeCreated(el2, path, def3) {
174908
+ if (layoutWrapped && def3?.$__layout) {
174909
+ layoutElements.add(el2);
174910
+ if (el2.setAttribute)
174911
+ el2.setAttribute("data-jx-layout", "");
174912
+ return;
174913
+ }
174761
174914
  let mappedPath = path;
174915
+ if (layoutWrapped && pageContentPrefix) {
174916
+ const pfx = pageContentPrefix;
174917
+ if (path.length >= pfx.length && pfx.every((seg, i) => path[i] === seg)) {
174918
+ mappedPath = ["children", ...path.slice(pfx.length)];
174919
+ }
174920
+ }
174762
174921
  if ((canvasMode === "design" || canvasMode === "edit") && mapParentPaths.size > 0) {
174763
- for (let i = 0;i < path.length - 1; i++) {
174764
- if (path[i] === "children" && path[i + 1] === 0) {
174765
- const parentKey = path.slice(0, i).join("/");
174922
+ for (let i = 0;i < mappedPath.length - 1; i++) {
174923
+ if (mappedPath[i] === "children" && mappedPath[i + 1] === 0) {
174924
+ const parentKey = mappedPath.slice(0, i).join("/");
174766
174925
  if (mapParentPaths.has(parentKey)) {
174767
- if (path.length === i + 2) {
174768
- mappedPath = path.slice(0, i + 1);
174769
- } else if (path.length >= i + 4 && path[i + 2] === "children" && path[i + 3] === 0) {
174770
- mappedPath = [...path.slice(0, i), "children", "map", ...path.slice(i + 4)];
174926
+ if (mappedPath.length === i + 2) {
174927
+ mappedPath = mappedPath.slice(0, i + 1);
174928
+ } else if (mappedPath.length >= i + 4 && mappedPath[i + 2] === "children" && mappedPath[i + 3] === 0) {
174929
+ mappedPath = [
174930
+ ...mappedPath.slice(0, i),
174931
+ "children",
174932
+ "map",
174933
+ ...mappedPath.slice(i + 4)
174934
+ ];
174771
174935
  }
174772
174936
  break;
174773
174937
  }
@@ -176083,12 +176247,35 @@ init_platform();
176083
176247
  init_store();
176084
176248
 
176085
176249
  // src/settings/schema-field-ui.js
176086
- var FIELD_TYPES = ["string", "number", "boolean", "array", "object", "date"];
176087
- function fieldCardTpl(fieldName, fieldSchema, isRequired, handlers) {
176088
- const type = fieldSchema.format === "date" ? "date" : fieldSchema.type || "string";
176250
+ var FIELD_TYPES = [
176251
+ "string",
176252
+ "number",
176253
+ "boolean",
176254
+ "array",
176255
+ "object",
176256
+ "date",
176257
+ "image",
176258
+ "gallery",
176259
+ "reference"
176260
+ ];
176261
+ function detectFieldType(schema) {
176262
+ if (schema.$ref)
176263
+ return "reference";
176264
+ if (schema.format === "image")
176265
+ return "image";
176266
+ if (schema.format === "date")
176267
+ return "date";
176268
+ if (schema.type === "array" && schema.items?.format === "image")
176269
+ return "gallery";
176270
+ return schema.type || "string";
176271
+ }
176272
+ function fieldCardTpl(fieldName, fieldSchema, isRequired, handlers, contentTypeNames = []) {
176273
+ const type = detectFieldType(fieldSchema);
176089
176274
  const isNested = type === "object";
176275
+ const isRef2 = type === "reference";
176090
176276
  const nestedProps = fieldSchema.properties || {};
176091
176277
  const nestedRequired = fieldSchema.required || [];
176278
+ const refTarget = fieldSchema.$ref ? fieldSchema.$ref.replace("#/contentTypes/", "") : "";
176092
176279
  return html`
176093
176280
  <div class="schema-field-card">
176094
176281
  <div class="schema-field-row">
@@ -176130,6 +176317,21 @@ function fieldCardTpl(fieldName, fieldSchema, isRequired, handlers) {
176130
176317
  <sp-icon-delete slot="icon"></sp-icon-delete>
176131
176318
  </sp-action-button>
176132
176319
  </div>
176320
+ ${isRef2 && contentTypeNames.length ? html`
176321
+ <div class="schema-field-ref-target">
176322
+ <sp-picker
176323
+ size="s"
176324
+ label="Target"
176325
+ value=${refTarget}
176326
+ @change=${(e) => {
176327
+ if (handlers.onChangeRefTarget)
176328
+ handlers.onChangeRefTarget(fieldName, e.target.value);
176329
+ }}
176330
+ >
176331
+ ${contentTypeNames.map((n2) => html`<sp-menu-item value=${n2}>${n2}</sp-menu-item>`)}
176332
+ </sp-picker>
176333
+ </div>
176334
+ ` : nothing}
176133
176335
  ${isNested ? html`
176134
176336
  <div class="schema-field-nested">
176135
176337
  ${Object.entries(nestedProps).map(([name, sub]) => nestedFieldCardTpl(fieldName, name, sub, nestedRequired.includes(name), handlers))}
@@ -176140,7 +176342,7 @@ function fieldCardTpl(fieldName, fieldSchema, isRequired, handlers) {
176140
176342
  `;
176141
176343
  }
176142
176344
  function nestedFieldCardTpl(parentName, childName, childSchema, isRequired, handlers) {
176143
- const type = childSchema.format === "date" ? "date" : childSchema.type || "string";
176345
+ const type = detectFieldType(childSchema);
176144
176346
  return html`
176145
176347
  <div class="schema-field-card schema-field-card--nested">
176146
176348
  <div class="schema-field-row">
@@ -176289,6 +176491,12 @@ function schemaForType(type) {
176289
176491
  return { type: "object", properties: {}, required: [] };
176290
176492
  case "date":
176291
176493
  return { type: "string", format: "date" };
176494
+ case "image":
176495
+ return { type: "string", format: "image" };
176496
+ case "gallery":
176497
+ return { type: "array", items: { type: "string", format: "image" } };
176498
+ case "reference":
176499
+ return { $ref: "#/contentTypes/" };
176292
176500
  default:
176293
176501
  return { type: "string" };
176294
176502
  }
@@ -176296,6 +176504,8 @@ function schemaForType(type) {
176296
176504
  function yamlDefault(type, format2) {
176297
176505
  if (format2 === "date")
176298
176506
  return new Date().toISOString().split("T")[0];
176507
+ if (format2 === "image")
176508
+ return '""';
176299
176509
  switch (type) {
176300
176510
  case "boolean":
176301
176511
  return "false";
@@ -176725,6 +176935,14 @@ function handleChangeType2(fieldName, newType, rerender) {
176725
176935
  rerender();
176726
176936
  saveProjectConfig2();
176727
176937
  }
176938
+ function handleChangeRefTarget(fieldName, target, rerender) {
176939
+ const schema = getSelectedSchema();
176940
+ if (!schema?.properties)
176941
+ return;
176942
+ schema.properties[fieldName] = { $ref: `#/contentTypes/${target}` };
176943
+ rerender();
176944
+ saveProjectConfig2();
176945
+ }
176728
176946
  function handleAddNestedField2(parentName, fieldState, rerender) {
176729
176947
  const schema = getSelectedSchema();
176730
176948
  const parent = schema?.properties?.[parentName];
@@ -176874,13 +177092,14 @@ function renderContentTypesEditor(container) {
176874
177092
  onToggleRequired: (n2) => handleToggleRequired2(n2, rerender),
176875
177093
  onRename: (oldN, newN) => handleRenameField2(oldN, newN, rerender),
176876
177094
  onChangeType: (n2, t) => handleChangeType2(n2, t, rerender),
177095
+ onChangeRefTarget: (n2, target) => handleChangeRefTarget(n2, target, rerender),
176877
177096
  onAddNestedField: (p, s) => handleAddNestedField2(p, s, rerender),
176878
177097
  onDeleteNested: (p, c) => handleDeleteNested2(p, c, rerender),
176879
177098
  onToggleNestedRequired: (p, c) => handleToggleNestedRequired2(p, c, rerender),
176880
177099
  onRenameNested: (p, o, n2) => handleRenameNested2(p, o, n2, rerender),
176881
177100
  onChangeNestedType: (p, c, t) => handleChangeNestedType2(p, c, t, rerender)
176882
177101
  };
176883
- const fieldCards = Object.entries(properties).map(([name, def3]) => fieldCardTpl(name, def3, required.includes(name), handlers));
177102
+ const fieldCards = Object.entries(properties).map(([name, def3]) => fieldCardTpl(name, def3, required.includes(name), handlers, contentTypeNames));
176884
177103
  editorTpl = html`
176885
177104
  <div class="settings-editor-panel">
176886
177105
  <div class="settings-editor-header">
@@ -177378,6 +177597,28 @@ function buildStylebookElement(entry, rootStyle, activeBreakpoints, parentTag =
177378
177597
  }
177379
177598
  }
177380
177599
  }
177600
+ if (activeBreakpoints) {
177601
+ const selector = compoundSelector || `& ${entry.tag}`;
177602
+ for (const [key, val] of Object.entries(rootStyle)) {
177603
+ if (!key.startsWith("@") || typeof val !== "object")
177604
+ continue;
177605
+ const mediaName = key.slice(1);
177606
+ if (mediaName === "--")
177607
+ continue;
177608
+ if (activeBreakpoints.has(mediaName)) {
177609
+ const mediaTagStyle = val[selector];
177610
+ if (mediaTagStyle && typeof mediaTagStyle === "object") {
177611
+ for (const [prop, v] of Object.entries(mediaTagStyle)) {
177612
+ if (typeof v === "string" || typeof v === "number") {
177613
+ try {
177614
+ el.style[prop] = v;
177615
+ } catch {}
177616
+ }
177617
+ }
177618
+ }
177619
+ }
177620
+ }
177621
+ }
177381
177622
  if (entry.children) {
177382
177623
  for (const child of entry.children) {
177383
177624
  el.appendChild(buildStylebookElement(child, rootStyle, activeBreakpoints, entry.tag));
@@ -177386,6 +177627,7 @@ function buildStylebookElement(entry, rootStyle, activeBreakpoints, parentTag =
177386
177627
  return el;
177387
177628
  }
177388
177629
  async function renderComponentPreview(comp) {
177630
+ setSkipServerFunctions(true);
177389
177631
  try {
177390
177632
  if (comp.source === "npm") {
177391
177633
  if (!customElements.get(comp.tagName)) {
@@ -177414,7 +177656,16 @@ async function renderComponentPreview(comp) {
177414
177656
  }
177415
177657
  function hasTagStyle(rootStyle, tag3) {
177416
177658
  const s = rootStyle[`& ${tag3}`];
177417
- return s && typeof s === "object" && Object.keys(s).length > 0;
177659
+ if (s && typeof s === "object" && Object.keys(s).length > 0)
177660
+ return true;
177661
+ const selector = `& ${tag3}`;
177662
+ for (const [key, val] of Object.entries(rootStyle)) {
177663
+ if (!key.startsWith("@") || typeof val !== "object")
177664
+ continue;
177665
+ if (val[selector])
177666
+ return true;
177667
+ }
177668
+ return false;
177418
177669
  }
177419
177670
  function renderStylebookElementsIntoCanvas(canvasEl, rootStyle, filter, customizedOnly, activeBreakpoints) {
177420
177671
  for (const [k, v] of Object.entries(rootStyle)) {
@@ -178205,11 +178456,13 @@ function applyDropInstruction(instruction, srcData, targetPath) {
178205
178456
  }
178206
178457
 
178207
178458
  // src/panels/canvas-dnd.js
178459
+ var _activeDropEl = null;
178208
178460
  function registerPanelDnD(panel) {
178209
178461
  const { canvas, dropLine } = panel;
178210
178462
  const allEls = canvas.querySelectorAll("*");
178211
178463
  const monitorCleanup = monitorForElements({
178212
- onDragStart() {
178464
+ onDragStart({ location: location2 }) {
178465
+ view.lastDragInput = location2.current.input;
178213
178466
  for (const el of canvas.querySelectorAll("*")) {
178214
178467
  el.style.pointerEvents = "auto";
178215
178468
  }
@@ -178220,6 +178473,8 @@ function registerPanelDnD(panel) {
178220
178473
  view.lastDragInput = location2.current.input;
178221
178474
  },
178222
178475
  onDrop() {
178476
+ _activeDropEl?.classList.remove("canvas-drop-target");
178477
+ _activeDropEl = null;
178223
178478
  for (const p of canvasPanels)
178224
178479
  p.dropLine.style.display = "none";
178225
178480
  view.lastDragInput = null;
@@ -178237,7 +178492,9 @@ function registerPanelDnD(panel) {
178237
178492
  if (!elPath)
178238
178493
  continue;
178239
178494
  const node = getNodeAtPath(S.document, elPath);
178240
- const isVoid = VOID_ELEMENTS.has((node?.tagName || "div").toLowerCase());
178495
+ const tag3 = (node?.tagName || "div").toLowerCase();
178496
+ const hasElementChildren = node?.children?.some((c) => c != null && typeof c === "object");
178497
+ const isLeaf2 = VOID_ELEMENTS.has(tag3) || !hasElementChildren;
178241
178498
  const cleanup = dropTargetForElements({
178242
178499
  element: el,
178243
178500
  canDrop({ source }) {
@@ -178247,75 +178504,101 @@ function registerPanelDnD(panel) {
178247
178504
  return true;
178248
178505
  },
178249
178506
  getData() {
178250
- return { path: elPath, _isVoid: isVoid };
178507
+ return { path: elPath, _isVoid: isLeaf2 };
178251
178508
  },
178252
- onDragEnter() {
178253
- showCanvasDropIndicator(el, elPath, isVoid, panel);
178254
- },
178255
- onDrag() {
178256
- showCanvasDropIndicator(el, elPath, isVoid, panel);
178509
+ onDragEnter({ location: location2 }) {
178510
+ view.lastDragInput = location2.current.input;
178511
+ if (_activeDropEl && _activeDropEl !== el) {
178512
+ _activeDropEl.classList.remove("canvas-drop-target");
178513
+ }
178514
+ _activeDropEl = el;
178515
+ showCanvasDropIndicator(el, elPath, isLeaf2, panel);
178257
178516
  },
178258
- onDragLeave() {
178259
- dropLine.style.display = "none";
178260
- el.classList.remove("canvas-drop-target");
178517
+ onDrag({ location: location2 }) {
178518
+ view.lastDragInput = location2.current.input;
178519
+ showCanvasDropIndicator(el, elPath, isLeaf2, panel);
178261
178520
  },
178521
+ onDragLeave() {},
178262
178522
  onDrop({ source }) {
178263
178523
  dropLine.style.display = "none";
178264
178524
  el.classList.remove("canvas-drop-target");
178265
- const instruction = getCanvasDropInstruction(el, elPath, isVoid);
178266
- if (!instruction)
178267
- return;
178268
- applyDropInstruction(instruction, source.data, elPath);
178525
+ _activeDropEl = null;
178526
+ const { instruction, targetPath } = getCanvasDropResult(el, elPath, isLeaf2);
178527
+ applyDropInstruction(instruction, source.data, targetPath);
178269
178528
  }
178270
178529
  });
178271
178530
  view.canvasDndCleanups.push(cleanup);
178272
178531
  }
178273
178532
  }
178274
- function getCanvasDropInstruction(el, elPath, isVoid) {
178275
- const rect = el.getBoundingClientRect();
178533
+ function getCanvasDropResult(el, elPath, isLeaf2) {
178276
178534
  if (!view.lastDragInput)
178277
- return null;
178535
+ return { instruction: { type: "make-child" }, referenceEl: el, targetPath: elPath };
178278
178536
  const y = view.lastDragInput.clientY;
178537
+ if (elPath.length === 0) {
178538
+ const children = Array.from(el.children);
178539
+ if (children.length === 0)
178540
+ return { instruction: { type: "make-child" }, referenceEl: el, targetPath: elPath };
178541
+ return nearestChildEdge(children, y, elPath);
178542
+ }
178543
+ const rect = el.getBoundingClientRect();
178279
178544
  const relY = (y - rect.top) / rect.height;
178280
- if (elPath.length === 0)
178281
- return { type: "make-child" };
178282
- if (isVoid)
178283
- return relY < 0.5 ? { type: "reorder-above" } : { type: "reorder-below" };
178545
+ if (isLeaf2) {
178546
+ const instruction = relY < 0.5 ? { type: "reorder-above" } : { type: "reorder-below" };
178547
+ return { instruction, referenceEl: el, targetPath: elPath };
178548
+ }
178284
178549
  if (relY < 0.25)
178285
- return { type: "reorder-above" };
178550
+ return { instruction: { type: "reorder-above" }, referenceEl: el, targetPath: elPath };
178286
178551
  if (relY > 0.75)
178287
- return { type: "reorder-below" };
178288
- return { type: "make-child" };
178552
+ return { instruction: { type: "reorder-below" }, referenceEl: el, targetPath: elPath };
178553
+ return { instruction: { type: "make-child" }, referenceEl: el, targetPath: elPath };
178289
178554
  }
178290
- function showCanvasDropIndicator(el, elPath, isVoid, panel) {
178291
- const instruction = getCanvasDropInstruction(el, elPath, isVoid);
178292
- const { dropLine, viewport } = panel;
178293
- if (!instruction) {
178294
- dropLine.style.display = "none";
178295
- return;
178555
+ function nearestChildEdge(children, cursorY, parentPath) {
178556
+ let closestDist = Infinity;
178557
+ let instruction = { type: "reorder-below" };
178558
+ let closestIdx = children.length - 1;
178559
+ for (let i = 0;i < children.length; i++) {
178560
+ const rect = children[i].getBoundingClientRect();
178561
+ const topDist = Math.abs(cursorY - rect.top);
178562
+ const bottomDist = Math.abs(cursorY - rect.bottom);
178563
+ if (topDist < closestDist) {
178564
+ closestDist = topDist;
178565
+ instruction = { type: "reorder-above" };
178566
+ closestIdx = i;
178567
+ }
178568
+ if (bottomDist < closestDist) {
178569
+ closestDist = bottomDist;
178570
+ instruction = { type: "reorder-below" };
178571
+ closestIdx = i;
178572
+ }
178296
178573
  }
178574
+ const childPath = [...parentPath, "children", closestIdx];
178575
+ return { instruction, referenceEl: children[closestIdx], targetPath: childPath };
178576
+ }
178577
+ function showCanvasDropIndicator(el, elPath, isLeaf2, panel) {
178578
+ const { instruction, referenceEl } = getCanvasDropResult(el, elPath, isLeaf2);
178579
+ const { dropLine, viewport } = panel;
178297
178580
  const scale = effectiveZoom();
178298
178581
  const wrapRect = viewport.getBoundingClientRect();
178299
- const elRect = el.getBoundingClientRect();
178300
- const left = (elRect.left - wrapRect.left + viewport.scrollLeft) / scale;
178301
- const width2 = elRect.width / scale;
178582
+ const refRect = referenceEl.getBoundingClientRect();
178583
+ const left = (refRect.left - wrapRect.left + viewport.scrollLeft) / scale;
178584
+ const width2 = refRect.width / scale;
178302
178585
  if (instruction.type === "make-child") {
178303
178586
  dropLine.style.display = "block";
178304
- dropLine.style.top = `${(elRect.top - wrapRect.top + viewport.scrollTop) / scale}px`;
178587
+ dropLine.style.top = `${(refRect.top - wrapRect.top + viewport.scrollTop) / scale}px`;
178305
178588
  dropLine.style.left = `${left}px`;
178306
178589
  dropLine.style.width = `${width2}px`;
178307
- dropLine.style.height = `${elRect.height / scale}px`;
178590
+ dropLine.style.height = `${refRect.height / scale}px`;
178308
178591
  dropLine.className = "canvas-drop-indicator inside";
178309
178592
  el.classList.add("canvas-drop-target");
178310
178593
  return;
178311
178594
  }
178312
178595
  el.classList.remove("canvas-drop-target");
178313
- const top = instruction.type === "reorder-above" ? (elRect.top - wrapRect.top + viewport.scrollTop) / scale : (elRect.bottom - wrapRect.top + viewport.scrollTop) / scale;
178596
+ const top = instruction.type === "reorder-above" ? (refRect.top - wrapRect.top + viewport.scrollTop) / scale : (refRect.bottom - wrapRect.top + viewport.scrollTop) / scale;
178314
178597
  dropLine.style.display = "block";
178315
178598
  dropLine.style.top = `${top}px`;
178316
178599
  dropLine.style.left = `${left}px`;
178317
178600
  dropLine.style.width = `${width2}px`;
178318
- dropLine.style.height = "2px";
178601
+ dropLine.style.height = "";
178319
178602
  dropLine.className = "canvas-drop-indicator line";
178320
178603
  }
178321
178604
 
@@ -178675,6 +178958,13 @@ function registerPanelEvents(panel) {
178675
178958
  const elements = withPanelPointerEvents(() => document.elementsFromPoint(e.clientX, e.clientY));
178676
178959
  for (const el of elements) {
178677
178960
  if (canvas.contains(el) && el !== canvas) {
178961
+ if (layoutElements.has(el)) {
178962
+ view.layoutSelection = { el, layoutPath: activeLayoutPath };
178963
+ update(selectNode(S, null));
178964
+ renderOnly("rightPanel");
178965
+ return;
178966
+ }
178967
+ view.layoutSelection = null;
178678
178968
  const originalPath = elToPath.get(el);
178679
178969
  if (originalPath) {
178680
178970
  let path = bubbleInlinePath(S.document, originalPath);
@@ -179058,11 +179348,13 @@ async function collectFiles(dir, platform3) {
179058
179348
  results.push(...sub);
179059
179349
  } else {
179060
179350
  const ext = extOf(entry.name);
179351
+ const category = categoryFor(entry.path, ext);
179352
+ const type = category === "Content" ? contentTypeFor(entry.path) || ext || "file" : ext || "file";
179061
179353
  results.push({
179062
179354
  name: entry.name,
179063
179355
  path: entry.path,
179064
- type: ext || "file",
179065
- category: categoryFor(entry.path, ext),
179356
+ type,
179357
+ category,
179066
179358
  ext
179067
179359
  });
179068
179360
  }
@@ -179070,6 +179362,21 @@ async function collectFiles(dir, platform3) {
179070
179362
  } catch {}
179071
179363
  return results;
179072
179364
  }
179365
+ function contentTypeFor(filePath) {
179366
+ const config = projectState?.projectConfig;
179367
+ if (!config?.contentTypes)
179368
+ return null;
179369
+ for (const [name, def3] of Object.entries(config.contentTypes)) {
179370
+ const d2 = def3;
179371
+ if (!d2.source)
179372
+ continue;
179373
+ const prefix = d2.source.replace(/^\.\//, "").split("/**")[0].split("/*")[0];
179374
+ if (filePath.startsWith(prefix + "/") || filePath === prefix) {
179375
+ return name.charAt(0).toUpperCase() + name.slice(1);
179376
+ }
179377
+ }
179378
+ return null;
179379
+ }
179073
179380
  async function loadFiles() {
179074
179381
  if (!projectState)
179075
179382
  return;
@@ -179273,7 +179580,7 @@ async function renderBrowse(container, ctx) {
179273
179580
  >
179274
179581
  <sp-table-cell class="browse-name-cell">${f.name}</sp-table-cell>
179275
179582
  <sp-table-cell>${f.category}</sp-table-cell>
179276
- <sp-table-cell>${f.ext || "—"}</sp-table-cell>
179583
+ <sp-table-cell>${f.type}</sp-table-cell>
179277
179584
  <sp-table-cell class="browse-path-cell">${f.path}</sp-table-cell>
179278
179585
  </sp-table-row>
179279
179586
  `)}
@@ -179501,8 +179808,12 @@ function render4() {
179501
179808
  const boxes = [];
179502
179809
  if (S.hover && !pathsEqual(S.hover, S.selection)) {
179503
179810
  const el = findCanvasElement(S.hover, p.canvas);
179504
- if (el)
179505
- boxes.push(overlayBoxDescriptor(el, "hover", p));
179811
+ if (el) {
179812
+ const desc = overlayBoxDescriptor(el, "hover", p);
179813
+ if (layoutElements.has(el))
179814
+ desc.isLayout = true;
179815
+ boxes.push(desc);
179816
+ }
179506
179817
  }
179507
179818
  if (S.selection && p === getActivePanel()) {
179508
179819
  const el = findCanvasElement(S.selection, p.canvas);
@@ -179510,6 +179821,8 @@ function render4() {
179510
179821
  const desc = overlayBoxDescriptor(el, "selection", p);
179511
179822
  if (view.componentInlineEdit || _ctx9.isEditing())
179512
179823
  desc.border = "none";
179824
+ if (layoutElements.has(el))
179825
+ desc.isLayout = true;
179513
179826
  boxes.push(desc);
179514
179827
  }
179515
179828
  }
@@ -179517,9 +179830,11 @@ function render4() {
179517
179830
  ${p.dropLine}
179518
179831
  ${boxes.map((b) => html`
179519
179832
  <div
179520
- class=${b.cls}
179833
+ class="${b.cls}${b.isLayout ? " overlay-layout" : ""}"
179521
179834
  style="top:${b.top};left:${b.left};width:${b.width};height:${b.height}${b.border ? `;border:${b.border}` : ""}"
179522
- ></div>
179835
+ >
179836
+ ${b.isLayout ? html`<span class="overlay-layout-badge">Layout</span>` : nothing}
179837
+ </div>
179523
179838
  `)}
179524
179839
  `, p.overlay);
179525
179840
  }
@@ -179665,10 +179980,11 @@ function renderCanvas() {
179665
179980
  canvasWrap.style.overflow = "hidden";
179666
179981
  resetZoomIndicator();
179667
179982
  }
179983
+ const { baseWidth: baseWidth2 } = parseMediaEntries(getEffectiveMedia(S.document.$media));
179668
179984
  const { tpl: panelTpl, panel } = canvasPanelTemplate(null, null, true);
179669
179985
  const editTpl = html`
179670
179986
  <div class="content-edit-canvas">
179671
- <div class="content-edit-column">${panelTpl}</div>
179987
+ <div class="content-edit-column" style="max-width:${baseWidth2}px">${panelTpl}</div>
179672
179988
  </div>
179673
179989
  `;
179674
179990
  render2(editTpl, canvasWrap);
@@ -204783,6 +205099,316 @@ __decorateClass53([
204783
205099
  property({ type: String })
204784
205100
  ], ActionBar2.prototype, "variant", 1);
204785
205101
 
205102
+ // ../../node_modules/@spectrum-web-components/toast/src/Toast.dev.js
205103
+ init_index_dev();
205104
+ init_decorators_dev();
205105
+ init_focus_visible_dev();
205106
+
205107
+ // ../../node_modules/@spectrum-web-components/icons-workflow/src/elements/IconInfo.js
205108
+ init_index_dev();
205109
+
205110
+ // ../../node_modules/@spectrum-web-components/icons-workflow/src/icons/Info.js
205111
+ var InfoIcon = ({ width: a5 = 24, height: t12 = 24, hidden: e17 = false, title: r8 = "Info" } = {}) => tag6`<svg
205112
+ xmlns="http://www.w3.org/2000/svg"
205113
+ height="${t12}"
205114
+ viewBox="0 0 36 36"
205115
+ width="${a5}"
205116
+ aria-hidden=${e17 ? "true" : "false"}
205117
+ role="img"
205118
+ fill="currentColor"
205119
+ aria-label="${r8}"
205120
+ >
205121
+ <path
205122
+ d="M18 2a16 16 0 1 0 16 16A16 16 0 0 0 18 2Zm-.3 4.3a2.718 2.718 0 0 1 2.864 2.824 2.664 2.664 0 0 1-2.864 2.863 2.705 2.705 0 0 1-2.864-2.864A2.717 2.717 0 0 1 17.7 6.3ZM22 27a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h1v-6h-1a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v9h1a1 1 0 0 1 1 1Z"
205123
+ />
205124
+ </svg>`;
205125
+
205126
+ // ../../node_modules/@spectrum-web-components/icons-workflow/src/icons-s2/InfoCircle.js
205127
+ var InfoCircleIcon = ({ width: r8 = 24, height: t12 = 24, hidden: e17 = false, title: l = "Info Circle" } = {}) => tag6`<svg
205128
+ xmlns="http://www.w3.org/2000/svg"
205129
+ width="${r8}"
205130
+ height="${t12}"
205131
+ viewBox="0 0 20 20"
205132
+ aria-hidden=${e17 ? "true" : "false"}
205133
+ role="img"
205134
+ fill="currentColor"
205135
+ aria-label="${l}"
205136
+ >
205137
+ <path
205138
+ d="m10,18.75c-4.8252,0-8.75-3.9248-8.75-8.75S5.1748,1.25,10,1.25s8.75,3.9248,8.75,8.75-3.9248,8.75-8.75,8.75Zm0-16c-3.99805,0-7.25,3.25195-7.25,7.25s3.25195,7.25,7.25,7.25,7.25-3.25195,7.25-7.25-3.25195-7.25-7.25-7.25Z"
205139
+ fill="currentColor"
205140
+ />
205141
+ <path
205142
+ d="m10.00064,5.26036c.23065-.00813.45538.07387.62661.22862.33033.36505.33033.92102,0,1.28607-.16935.15851-.39483.24308-.62664.23504-.23635.00948-.46589-.08035-.63302-.24775-.16207-.1679-.24916-.39432-.24137-.62755-.01238-.23497.06959-.46515.2277-.6394.17358-.16474.40786-.24988.64671-.23503Z"
205143
+ fill="currentColor"
205144
+ />
205145
+ <path
205146
+ d="m10,15.0625c-.41406,0-.75-.33594-.75-.75v-4.83496c0-.41406.33594-.75.75-.75s.75.33594.75.75v4.83496c0,.41406-.33594.75-.75.75Z"
205147
+ fill="currentColor"
205148
+ />
205149
+ </svg>`;
205150
+
205151
+ // ../../node_modules/@spectrum-web-components/icons-workflow/src/elements/IconInfo.js
205152
+ class IconInfo extends IconBase {
205153
+ render() {
205154
+ return setCustomTemplateLiteralTag2(html8), this.spectrumVersion === 1 ? InfoIcon({ hidden: !this.label, title: this.label }) : InfoCircleIcon({ hidden: !this.label, title: this.label });
205155
+ }
205156
+ }
205157
+
205158
+ // ../../node_modules/@spectrum-web-components/icons-workflow/icons/sp-icon-info.js
205159
+ defineElement2("sp-icon-info", IconInfo);
205160
+
205161
+ // ../../node_modules/@spectrum-web-components/icons-workflow/src/elements/IconCheckmarkCircle.js
205162
+ init_index_dev();
205163
+
205164
+ // ../../node_modules/@spectrum-web-components/icons-workflow/src/icons-s2/CheckmarkCircle.js
205165
+ var CheckmarkCircleIcon = ({ width: e17 = 24, height: l = 24, hidden: r8 = false, title: t12 = "Checkmark Circle" } = {}) => tag6`<svg
205166
+ xmlns="http://www.w3.org/2000/svg"
205167
+ width="${e17}"
205168
+ height="${l}"
205169
+ viewBox="0 0 20 20"
205170
+ aria-hidden=${r8 ? "true" : "false"}
205171
+ role="img"
205172
+ fill="currentColor"
205173
+ aria-label="${t12}"
205174
+ >
205175
+ <path
205176
+ d="M10,18.75c-4.8252,0-8.75-3.9248-8.75-8.75S5.1748,1.25,10,1.25s8.75,3.9248,8.75,8.75-3.9248,8.75-8.75,8.75ZM10,2.75c-3.99805,0-7.25,3.25195-7.25,7.25s3.25195,7.25,7.25,7.25,7.25-3.25195,7.25-7.25-3.25195-7.25-7.25-7.25Z"
205177
+ fill="currentColor"
205178
+ />
205179
+ <path
205180
+ d="M9.22266,13.5c-.21191,0-.41504-.08984-.55762-.24805l-2.51074-2.79199c-.27734-.30859-.25195-.78223.05566-1.05957s.78125-.25195,1.05957.05566l1.89355,2.10645,3.4873-4.75586c.24316-.33398.71094-.40918,1.04785-.16113.33398.24414.40625.71387.16113,1.04785l-4.03223,5.5c-.13281.18262-.3418.29492-.56738.30566-.01172.00098-.02441.00098-.03711.00098Z"
205181
+ fill="currentColor"
205182
+ />
205183
+ </svg>`;
205184
+
205185
+ // ../../node_modules/@spectrum-web-components/icons-workflow/src/icons/CheckmarkCircle.js
205186
+ var CheckmarkCircleIcon2 = ({ width: e17 = 24, height: a5 = 24, hidden: t12 = false, title: l = "Checkmark Circle" } = {}) => tag6`<svg
205187
+ xmlns="http://www.w3.org/2000/svg"
205188
+ width="${e17}"
205189
+ height="${a5}"
205190
+ viewBox="0 0 36 36"
205191
+ aria-hidden=${t12 ? "true" : "false"}
205192
+ role="img"
205193
+ fill="currentColor"
205194
+ aria-label="${l}"
205195
+ >
205196
+ <path
205197
+ d="M18 2a16 16 0 1 0 16 16A16 16 0 0 0 18 2Zm10.666 9.08L16.018 27.341a1.208 1.208 0 0 1-.875.461c-.024.002-.05.002-.073.002a1.2 1.2 0 0 1-.85-.351l-7.784-7.795a1.2 1.2 0 0 1 0-1.698l1.326-1.325a1.201 1.201 0 0 1 1.695 0l5.346 5.347L25.314 8.473A1.203 1.203 0 0 1 27 8.263l1.455 1.133a1.205 1.205 0 0 1 .211 1.684Z"
205198
+ />
205199
+ </svg>`;
205200
+
205201
+ // ../../node_modules/@spectrum-web-components/icons-workflow/src/elements/IconCheckmarkCircle.js
205202
+ class IconCheckmarkCircle extends IconBase {
205203
+ render() {
205204
+ return setCustomTemplateLiteralTag2(html8), this.spectrumVersion === 2 ? CheckmarkCircleIcon({ hidden: !this.label, title: this.label }) : CheckmarkCircleIcon2({ hidden: !this.label, title: this.label });
205205
+ }
205206
+ }
205207
+
205208
+ // ../../node_modules/@spectrum-web-components/icons-workflow/icons/sp-icon-checkmark-circle.js
205209
+ defineElement2("sp-icon-checkmark-circle", IconCheckmarkCircle);
205210
+
205211
+ // ../../node_modules/@spectrum-web-components/toast/src/toast.css.js
205212
+ init_index_dev();
205213
+ var o16 = css`
205214
+ :host{--spectrum-toast-font-weight:var(--spectrum-regular-font-weight);--spectrum-toast-font-size:var(--spectrum-font-size-100);--spectrum-toast-corner-radius:var(--spectrum-corner-radius-100);--spectrum-toast-block-size:var(--spectrum-toast-height);--spectrum-toast-max-inline-size:var(--spectrum-toast-maximum-width);--spectrum-toast-border-width:var(--spectrum-border-width-100);--spectrum-toast-line-height:var(--spectrum-line-height-100);--spectrum-toast-line-height-cjk:var(--spectrum-cjk-line-height-100);--spectrum-toast-spacing-icon-to-text:var(--spectrum-text-to-visual-100);--spectrum-toast-spacing-start-edge-to-text-and-icon:var(--spectrum-spacing-300);--spectrum-toast-spacing-text-and-action-button-to-divider:var(--spectrum-spacing-300);--spectrum-toast-spacing-top-edge-to-divider:var(--spectrum-spacing-100);--spectrum-toast-spacing-bottom-edge-to-divider:var(--spectrum-spacing-100);--spectrum-toast-spacing-top-edge-to-icon:var(--spectrum-toast-top-to-workflow-icon);--spectrum-toast-spacing-text-to-action-button-horizontal:var(--spectrum-spacing-300);--spectrum-toast-spacing-close-button:var(--spectrum-spacing-100);--spectrum-toast-spacing-block-start:var(--spectrum-spacing-100);--spectrum-toast-spacing-block-end:var(--spectrum-spacing-100);--spectrum-toast-spacing-top-edge-to-text:var(--spectrum-toast-top-to-text);--spectrum-toast-spacing-bottom-edge-to-text:var(--spectrum-toast-bottom-to-text);--spectrum-toast-negative-background-color-default:var(--spectrum-negative-background-color-default);--spectrum-toast-positive-background-color-default:var(--spectrum-positive-background-color-default);--spectrum-toast-informative-background-color-default:var(--spectrum-informative-background-color-default);--spectrum-toast-text-and-icon-color:var(--spectrum-white)}@media (forced-colors:active){:host{--highcontrast-toast-border-color:ButtonText;border:var(--mod-toast-border-width,var(--spectrum-toast-border-width))solid var(--highcontrast-toast-border-color,transparent)}}:host{-webkit-font-smoothing:antialiased;box-sizing:border-box;max-inline-size:var(--mod-toast-max-inline-size,var(--spectrum-toast-max-inline-size));min-block-size:var(--mod-toast-block-size,var(--spectrum-toast-block-size));font-size:var(--mod-toast-font-size,var(--spectrum-toast-font-size));font-weight:var(--mod-toast-font-weight,var(--spectrum-toast-font-weight));color:var(--mod-toast-background-color-default,var(--spectrum-toast-background-color-default));overflow-wrap:anywhere;background-color:var(--mod-toast-background-color-default,var(--spectrum-toast-background-color-default));border-radius:var(--mod-toast-corner-radius,var(--spectrum-toast-corner-radius));flex-direction:row;align-items:stretch;padding-inline-start:var(--mod-toast-spacing-start-edge-to-text-and-icon,var(--spectrum-toast-spacing-start-edge-to-text-and-icon));display:inline-flex}:host([variant=negative]){background-color:var(--mod-toast-negative-background-color-default,var(--spectrum-toast-negative-background-color-default))}:host([variant=negative]),:host([variant=negative]) .closeButton:focus-visible:not(:active){color:var(--mod-toast-negative-background-color-default,var(--spectrum-toast-negative-background-color-default))}:host([variant=info]){background-color:var(--mod-toast-informative-background-color-default,var(--spectrum-toast-informative-background-color-default))}:host([variant=info]),:host([variant=info]) .closeButton:focus-visible:not(:active){color:var(--mod-toast-informative-background-color-default,var(--spectrum-toast-informative-background-color-default))}:host([variant=positive]){background-color:var(--mod-toast-positive-background-color-default,var(--spectrum-toast-positive-background-color-default))}:host([variant=positive]),:host([variant=positive]) .closeButton:focus-visible:not(:active){color:var(--mod-toast-positive-background-color-default,var(--spectrum-toast-positive-background-color-default))}.type{flex-grow:0;flex-shrink:0;margin-block-start:var(--mod-toast-spacing-top-edge-to-icon,var(--spectrum-toast-spacing-top-edge-to-icon));margin-inline-start:0;margin-inline-end:var(--mod-toast-spacing-icon-to-text,var(--spectrum-toast-spacing-icon-to-text))}.content,.type{color:var(--mod-toast-text-and-icon-color,var(--spectrum-toast-text-and-icon-color))}.content{box-sizing:border-box;line-height:var(--mod-toast-line-height,var(--spectrum-toast-line-height));text-align:start;flex:auto;padding-block-start:calc(var(--mod-toast-spacing-top-edge-to-text,var(--spectrum-toast-spacing-top-edge-to-text)) - var(--mod-toast-spacing-block-start,var(--spectrum-toast-spacing-block-start)));padding-block-end:calc(var(--mod-toast-spacing-bottom-edge-to-text,var(--spectrum-toast-spacing-bottom-edge-to-text)) - var(--mod-toast-spacing-block-end,var(--spectrum-toast-spacing-block-end)));padding-inline-start:0;padding-inline-end:var(--mod-toast-spacing-text-to-action-button-horizontal,var(--spectrum-toast-spacing-text-to-action-button-horizontal));display:inline-block}.content:lang(ja),.content:lang(ko),.content:lang(zh){line-height:var(--mod-toast-line-height-cjk,var(--spectrum-toast-line-height-cjk))}.buttons{border-inline-start-color:var(--mod-toast-divider-color,var(--spectrum-toast-divider-color));flex:none;align-items:flex-start;margin-block-start:var(--mod-toast-spacing-top-edge-to-divider,var(--spectrum-toast-spacing-top-edge-to-divider));margin-block-end:var(--mod-toast-spacing-bottom-edge-to-divider,var(--spectrum-toast-spacing-bottom-edge-to-divider));padding-inline-end:var(--mod-toast-spacing-close-button,var(--spectrum-toast-spacing-close-button));display:flex}.buttons .spectrum-CloseButton{align-self:flex-start}.body{flex-wrap:wrap;flex:auto;align-self:center;align-items:center;padding-block-start:var(--mod-toast-spacing-block-start,var(--spectrum-toast-spacing-block-start));padding-block-end:var(--mod-toast-spacing-block-end,var(--spectrum-toast-spacing-block-end));display:flex}.body ::slotted([slot=action]){margin-inline-start:auto;margin-inline-end:var(--mod-toast-spacing-text-and-action-button-to-divider,var(--spectrum-toast-spacing-text-and-action-button-to-divider))}.body ::slotted([slot=action]:dir(rtl)){margin-inline-end:var(--mod-toast-spacing-text-and-action-button-to-divider,var(--spectrum-toast-spacing-text-and-action-button-to-divider))}.body+.buttons{border-inline-start-style:solid;border-inline-start-width:1px;padding-inline-start:var(--mod-toast-spacing-close-button,var(--spectrum-toast-spacing-close-button))}:host{--spectrum-toast-background-color-default:var(--system-toast-background-color-default);--spectrum-toast-divider-color:var(--system-toast-divider-color)}:host{--spectrum-overlay-animation-distance:var(--spectrum-spacing-100);--spectrum-overlay-animation-duration:var(--spectrum-animation-duration-100);visibility:hidden;pointer-events:none;opacity:0;transition:transform var(--spectrum-overlay-animation-duration)ease-in-out,opacity var(--spectrum-overlay-animation-duration)ease-in-out,visibility 0s linear var(--spectrum-overlay-animation-duration)}:host([open]){visibility:visible;pointer-events:auto;opacity:1;transition-delay:0s}:host([variant=error]),:host([variant=warning]){background-color:var(--highcontrast-toast-negative-background-color-default,var(--mod-toast-negative-background-color-default,var(--spectrum-toast-negative-background-color-default)))}:host([variant=negative]),:host([variant=negative]) .closeButton:focus-visible:not(:active),:host([variant=warning]),:host([variant=warning]) .closeButton:focus-visible:not(:active){color:var(--highcontrast-toast-negative-background-color-default,var(--mod-toast-negative-background-color-default,var(--spectrum-toast-negative-background-color-default)))}
205215
+ `;
205216
+ var toast_css_default = o16;
205217
+
205218
+ // ../../node_modules/@spectrum-web-components/toast/src/Toast.dev.js
205219
+ var __defProp55 = Object.defineProperty;
205220
+ var __getOwnPropDesc55 = Object.getOwnPropertyDescriptor;
205221
+ var __decorateClass54 = (decorators2, target, key, kind) => {
205222
+ var result = kind > 1 ? undefined : kind ? __getOwnPropDesc55(target, key) : target;
205223
+ for (var i6 = decorators2.length - 1, decorator;i6 >= 0; i6--)
205224
+ if (decorator = decorators2[i6])
205225
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
205226
+ if (kind && result)
205227
+ __defProp55(target, key, result);
205228
+ return result;
205229
+ };
205230
+ var toastVariants = [
205231
+ "negative",
205232
+ "positive",
205233
+ "info",
205234
+ "error",
205235
+ "warning"
205236
+ ];
205237
+
205238
+ class Toast extends FocusVisiblePolyfillMixin(SpectrumElement) {
205239
+ constructor() {
205240
+ super(...arguments);
205241
+ this.open = false;
205242
+ this._timeout = null;
205243
+ this._variant = "";
205244
+ this.countdownStart = 0;
205245
+ this.nextCount = -1;
205246
+ this.doCountdown = (time) => {
205247
+ if (!this.countdownStart) {
205248
+ this.countdownStart = performance.now();
205249
+ }
205250
+ if (time - this.countdownStart > this._timeout) {
205251
+ this.shouldClose();
205252
+ this.countdownStart = 0;
205253
+ } else {
205254
+ this.countdown();
205255
+ }
205256
+ };
205257
+ this.countdown = () => {
205258
+ cancelAnimationFrame(this.nextCount);
205259
+ this.nextCount = requestAnimationFrame(this.doCountdown);
205260
+ };
205261
+ this.holdCountdown = () => {
205262
+ this.stopCountdown();
205263
+ this.addEventListener("focusout", this.resumeCountdown);
205264
+ };
205265
+ this.resumeCountdown = () => {
205266
+ this.removeEventListener("focusout", this.holdCountdown);
205267
+ this.countdown();
205268
+ };
205269
+ }
205270
+ static get styles() {
205271
+ return [toast_css_default];
205272
+ }
205273
+ set timeout(timeout2) {
205274
+ const hasTimeout = timeout2 !== null && timeout2 > 0;
205275
+ const newTimeout = hasTimeout ? Math.max(6000, timeout2) : null;
205276
+ const oldValue = this.timeout;
205277
+ if (newTimeout && this.countdownStart) {
205278
+ this.countdownStart = performance.now();
205279
+ }
205280
+ this._timeout = newTimeout;
205281
+ this.requestUpdate("timeout", oldValue);
205282
+ }
205283
+ get timeout() {
205284
+ return this._timeout;
205285
+ }
205286
+ set variant(variant) {
205287
+ if (variant === this.variant) {
205288
+ return;
205289
+ }
205290
+ const oldValue = this.variant;
205291
+ if (toastVariants.includes(variant)) {
205292
+ this.setAttribute("variant", variant);
205293
+ this._variant = variant;
205294
+ } else {
205295
+ this.removeAttribute("variant");
205296
+ this._variant = "";
205297
+ }
205298
+ this.requestUpdate("variant", oldValue);
205299
+ }
205300
+ get variant() {
205301
+ return this._variant;
205302
+ }
205303
+ renderIcon(variant, iconLabel) {
205304
+ switch (variant) {
205305
+ case "info":
205306
+ return html8`
205307
+ <sp-icon-info
205308
+ label=${iconLabel || "Information"}
205309
+ class="type"
205310
+ ></sp-icon-info>
205311
+ `;
205312
+ case "negative":
205313
+ case "error":
205314
+ return html8`
205315
+ <sp-icon-alert
205316
+ label=${iconLabel || "Error"}
205317
+ class="type"
205318
+ ></sp-icon-alert>
205319
+ `;
205320
+ case "warning":
205321
+ return html8`
205322
+ <sp-icon-alert
205323
+ label=${iconLabel || "Warning"}
205324
+ class="type"
205325
+ ></sp-icon-alert>
205326
+ `;
205327
+ case "positive":
205328
+ return html8`
205329
+ <sp-icon-checkmark-circle
205330
+ label=${iconLabel || "Success"}
205331
+ class="type"
205332
+ ></sp-icon-checkmark-circle>
205333
+ `;
205334
+ default:
205335
+ return html8``;
205336
+ }
205337
+ }
205338
+ startCountdown() {
205339
+ this.countdown();
205340
+ this.addEventListener("focusin", this.holdCountdown);
205341
+ }
205342
+ stopCountdown() {
205343
+ cancelAnimationFrame(this.nextCount);
205344
+ this.countdownStart = 0;
205345
+ }
205346
+ shouldClose() {
205347
+ const applyDefault = this.dispatchEvent(new CustomEvent("close", {
205348
+ composed: true,
205349
+ bubbles: true,
205350
+ cancelable: true
205351
+ }));
205352
+ if (applyDefault) {
205353
+ this.close();
205354
+ }
205355
+ }
205356
+ close() {
205357
+ this.open = false;
205358
+ }
205359
+ render() {
205360
+ return html8`
205361
+ ${this.renderIcon(this.variant, this.iconLabel)}
205362
+ <div class="body" role="alert">
205363
+ <div class="content">
205364
+ <slot></slot>
205365
+ </div>
205366
+ <slot name="action"></slot>
205367
+ </div>
205368
+ <div class="buttons">
205369
+ <sp-close-button
205370
+ @click=${this.shouldClose}
205371
+ label="Close"
205372
+ static-color="white"
205373
+ ></sp-close-button>
205374
+ </div>
205375
+ `;
205376
+ }
205377
+ updated(changes) {
205378
+ super.updated(changes);
205379
+ if (changes.has("open")) {
205380
+ if (this.open) {
205381
+ if (this.timeout) {
205382
+ this.startCountdown();
205383
+ }
205384
+ } else {
205385
+ if (this.timeout) {
205386
+ this.stopCountdown();
205387
+ }
205388
+ }
205389
+ }
205390
+ if (changes.has("timeout")) {
205391
+ if (this.timeout !== null && this.open) {
205392
+ this.startCountdown();
205393
+ } else {
205394
+ this.stopCountdown();
205395
+ }
205396
+ }
205397
+ }
205398
+ }
205399
+ __decorateClass54([
205400
+ property({ type: Boolean, reflect: true })
205401
+ ], Toast.prototype, "open", 2);
205402
+ __decorateClass54([
205403
+ property({ type: Number })
205404
+ ], Toast.prototype, "timeout", 1);
205405
+ __decorateClass54([
205406
+ property({ type: String })
205407
+ ], Toast.prototype, "variant", 1);
205408
+ __decorateClass54([
205409
+ property({ type: String, attribute: "icon-label" })
205410
+ ], Toast.prototype, "iconLabel", 2);
205411
+
204786
205412
  // ../../node_modules/@lit-labs/virtualizer/events.js
204787
205413
  class RangeChangedEvent extends Event {
204788
205414
  constructor(range3) {
@@ -205618,21 +206244,21 @@ init_decorators_dev();
205618
206244
 
205619
206245
  // ../../node_modules/@spectrum-web-components/table/src/table-body.css.js
205620
206246
  init_index_dev();
205621
- var o16 = css`
206247
+ var o17 = css`
205622
206248
  :host{border-radius:var(--mod-table-border-radius,var(--spectrum-table-border-radius));border:none;display:table-row-group;position:relative}:host([drop-target]){--mod-table-border-color:transparent;outline-width:var(--mod-table-focus-indicator-thickness,var(--spectrum-table-focus-indicator-thickness));outline-style:solid;outline-color:var(--highcontrast-table-focus-indicator-color,var(--mod-table-drop-zone-outline-color,var(--spectrum-table-drop-zone-outline-color)))}:host{border-block:var(--mod-table-border-width,var(--spectrum-table-border-width))solid var(--highcontrast-table-border-color,var(--mod-table-border-color,var(--spectrum-table-border-color)));border-inline:var(--mod-table-outer-border-inline-width,var(--spectrum-table-outer-border-inline-width))solid var(--highcontrast-table-border-color,var(--mod-table-border-color,var(--spectrum-table-border-color)));border-radius:var(--mod-table-border-radius,var(--spectrum-table-border-radius));flex-grow:1;display:block;overflow:auto}:host(:not([tabindex])){overflow:visible}
205623
206249
  `;
205624
- var table_body_css_default = o16;
206250
+ var table_body_css_default = o17;
205625
206251
 
205626
206252
  // ../../node_modules/@spectrum-web-components/table/src/TableBody.dev.js
205627
- var __defProp55 = Object.defineProperty;
205628
- var __getOwnPropDesc55 = Object.getOwnPropertyDescriptor;
205629
- var __decorateClass54 = (decorators2, target, key, kind) => {
205630
- var result = kind > 1 ? undefined : kind ? __getOwnPropDesc55(target, key) : target;
206253
+ var __defProp56 = Object.defineProperty;
206254
+ var __getOwnPropDesc56 = Object.getOwnPropertyDescriptor;
206255
+ var __decorateClass55 = (decorators2, target, key, kind) => {
206256
+ var result = kind > 1 ? undefined : kind ? __getOwnPropDesc56(target, key) : target;
205631
206257
  for (var i6 = decorators2.length - 1, decorator;i6 >= 0; i6--)
205632
206258
  if (decorator = decorators2[i6])
205633
206259
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
205634
206260
  if (kind && result)
205635
- __defProp55(target, key, result);
206261
+ __defProp56(target, key, result);
205636
206262
  return result;
205637
206263
  };
205638
206264
 
@@ -205668,7 +206294,7 @@ class TableBody extends SpectrumElement {
205668
206294
  `;
205669
206295
  }
205670
206296
  }
205671
- __decorateClass54([
206297
+ __decorateClass55([
205672
206298
  property({ reflect: true })
205673
206299
  ], TableBody.prototype, "role", 2);
205674
206300
 
@@ -205689,15 +206315,15 @@ var t12 = css`
205689
206315
  var table_checkbox_cell_css_default = t12;
205690
206316
 
205691
206317
  // ../../node_modules/@spectrum-web-components/table/src/TableCheckboxCell.dev.js
205692
- var __defProp56 = Object.defineProperty;
205693
- var __getOwnPropDesc56 = Object.getOwnPropertyDescriptor;
205694
- var __decorateClass55 = (decorators2, target, key, kind) => {
205695
- var result = kind > 1 ? undefined : kind ? __getOwnPropDesc56(target, key) : target;
206318
+ var __defProp57 = Object.defineProperty;
206319
+ var __getOwnPropDesc57 = Object.getOwnPropertyDescriptor;
206320
+ var __decorateClass56 = (decorators2, target, key, kind) => {
206321
+ var result = kind > 1 ? undefined : kind ? __getOwnPropDesc57(target, key) : target;
205696
206322
  for (var i6 = decorators2.length - 1, decorator;i6 >= 0; i6--)
205697
206323
  if (decorator = decorators2[i6])
205698
206324
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
205699
206325
  if (kind && result)
205700
- __defProp56(target, key, result);
206326
+ __defProp57(target, key, result);
205701
206327
  return result;
205702
206328
  };
205703
206329
 
@@ -205752,31 +206378,31 @@ class TableCheckboxCell extends SpectrumElement {
205752
206378
  `;
205753
206379
  }
205754
206380
  }
205755
- __decorateClass55([
206381
+ __decorateClass56([
205756
206382
  property({ type: Boolean, reflect: true, attribute: "head-cell" })
205757
206383
  ], TableCheckboxCell.prototype, "headCell", 2);
205758
- __decorateClass55([
206384
+ __decorateClass56([
205759
206385
  property({ reflect: true })
205760
206386
  ], TableCheckboxCell.prototype, "role", 2);
205761
- __decorateClass55([
206387
+ __decorateClass56([
205762
206388
  query(".checkbox")
205763
206389
  ], TableCheckboxCell.prototype, "checkbox", 2);
205764
- __decorateClass55([
206390
+ __decorateClass56([
205765
206391
  property({ type: Boolean })
205766
206392
  ], TableCheckboxCell.prototype, "indeterminate", 2);
205767
- __decorateClass55([
206393
+ __decorateClass56([
205768
206394
  property({ type: Boolean })
205769
206395
  ], TableCheckboxCell.prototype, "checked", 2);
205770
- __decorateClass55([
206396
+ __decorateClass56([
205771
206397
  property({ type: Boolean })
205772
206398
  ], TableCheckboxCell.prototype, "disabled", 2);
205773
- __decorateClass55([
206399
+ __decorateClass56([
205774
206400
  property({ type: Boolean, reflect: true, attribute: "selects-single" })
205775
206401
  ], TableCheckboxCell.prototype, "selectsSingle", 2);
205776
- __decorateClass55([
206402
+ __decorateClass56([
205777
206403
  property({ type: Boolean, reflect: true })
205778
206404
  ], TableCheckboxCell.prototype, "emphasized", 2);
205779
- __decorateClass55([
206405
+ __decorateClass56([
205780
206406
  property({ type: String })
205781
206407
  ], TableCheckboxCell.prototype, "label", 2);
205782
206408
 
@@ -205794,15 +206420,15 @@ var e17 = css`
205794
206420
  var table_row_css_default = e17;
205795
206421
 
205796
206422
  // ../../node_modules/@spectrum-web-components/table/src/TableRow.dev.js
205797
- var __defProp57 = Object.defineProperty;
205798
- var __getOwnPropDesc57 = Object.getOwnPropertyDescriptor;
205799
- var __decorateClass56 = (decorators2, target, key, kind) => {
205800
- var result = kind > 1 ? undefined : kind ? __getOwnPropDesc57(target, key) : target;
206423
+ var __defProp58 = Object.defineProperty;
206424
+ var __getOwnPropDesc58 = Object.getOwnPropertyDescriptor;
206425
+ var __decorateClass57 = (decorators2, target, key, kind) => {
206426
+ var result = kind > 1 ? undefined : kind ? __getOwnPropDesc58(target, key) : target;
205801
206427
  for (var i6 = decorators2.length - 1, decorator;i6 >= 0; i6--)
205802
206428
  if (decorator = decorators2[i6])
205803
206429
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
205804
206430
  if (kind && result)
205805
- __defProp57(target, key, result);
206431
+ __defProp58(target, key, result);
205806
206432
  return result;
205807
206433
  };
205808
206434
 
@@ -205877,22 +206503,22 @@ class TableRow extends SpectrumElement {
205877
206503
  }
205878
206504
  }
205879
206505
  }
205880
- __decorateClass56([
206506
+ __decorateClass57([
205881
206507
  queryAssignedElements({
205882
206508
  selector: "sp-table-checkbox-cell",
205883
206509
  flatten: true
205884
206510
  })
205885
206511
  ], TableRow.prototype, "checkboxCells", 2);
205886
- __decorateClass56([
206512
+ __decorateClass57([
205887
206513
  property({ reflect: true })
205888
206514
  ], TableRow.prototype, "role", 2);
205889
- __decorateClass56([
206515
+ __decorateClass57([
205890
206516
  property({ type: Boolean })
205891
206517
  ], TableRow.prototype, "selectable", 2);
205892
- __decorateClass56([
206518
+ __decorateClass57([
205893
206519
  property({ type: Boolean, reflect: true })
205894
206520
  ], TableRow.prototype, "selected", 2);
205895
- __decorateClass56([
206521
+ __decorateClass57([
205896
206522
  property({ type: String })
205897
206523
  ], TableRow.prototype, "value", 2);
205898
206524
 
@@ -205907,15 +206533,15 @@ var e18 = css`
205907
206533
  var table_css_default = e18;
205908
206534
 
205909
206535
  // ../../node_modules/@spectrum-web-components/table/src/Table.dev.js
205910
- var __defProp58 = Object.defineProperty;
205911
- var __getOwnPropDesc58 = Object.getOwnPropertyDescriptor;
205912
- var __decorateClass57 = (decorators2, target, key, kind) => {
205913
- var result = kind > 1 ? undefined : kind ? __getOwnPropDesc58(target, key) : target;
206536
+ var __defProp59 = Object.defineProperty;
206537
+ var __getOwnPropDesc59 = Object.getOwnPropertyDescriptor;
206538
+ var __decorateClass58 = (decorators2, target, key, kind) => {
206539
+ var result = kind > 1 ? undefined : kind ? __getOwnPropDesc59(target, key) : target;
205914
206540
  for (var i6 = decorators2.length - 1, decorator;i6 >= 0; i6--)
205915
206541
  if (decorator = decorators2[i6])
205916
206542
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
205917
206543
  if (kind && result)
205918
- __defProp58(target, key, result);
206544
+ __defProp59(target, key, result);
205919
206545
  return result;
205920
206546
  };
205921
206547
  class Table2 extends SizedMixin(SpectrumElement, {
@@ -206276,37 +206902,37 @@ class Table2 extends SizedMixin(SpectrumElement, {
206276
206902
  super.disconnectedCallback();
206277
206903
  }
206278
206904
  }
206279
- __decorateClass57([
206905
+ __decorateClass58([
206280
206906
  property({ reflect: true })
206281
206907
  ], Table2.prototype, "role", 2);
206282
- __decorateClass57([
206908
+ __decorateClass58([
206283
206909
  property({ type: String, reflect: true })
206284
206910
  ], Table2.prototype, "selects", 2);
206285
- __decorateClass57([
206911
+ __decorateClass58([
206286
206912
  property({ type: Array })
206287
206913
  ], Table2.prototype, "selected", 2);
206288
- __decorateClass57([
206914
+ __decorateClass58([
206289
206915
  property({ type: String, attribute: "select-all-label" })
206290
206916
  ], Table2.prototype, "selectAllLabel", 2);
206291
- __decorateClass57([
206917
+ __decorateClass58([
206292
206918
  property({ type: Array })
206293
206919
  ], Table2.prototype, "items", 2);
206294
- __decorateClass57([
206920
+ __decorateClass58([
206295
206921
  property({ type: Object })
206296
206922
  ], Table2.prototype, "itemValue", 2);
206297
- __decorateClass57([
206923
+ __decorateClass58([
206298
206924
  property({ type: Object })
206299
206925
  ], Table2.prototype, "itemLabel", 2);
206300
- __decorateClass57([
206926
+ __decorateClass58([
206301
206927
  property({ type: Boolean, reflect: true })
206302
206928
  ], Table2.prototype, "scroller", 2);
206303
- __decorateClass57([
206929
+ __decorateClass58([
206304
206930
  property({ type: Boolean, reflect: true })
206305
206931
  ], Table2.prototype, "emphasized", 2);
206306
- __decorateClass57([
206932
+ __decorateClass58([
206307
206933
  property({ type: Boolean, reflect: true })
206308
206934
  ], Table2.prototype, "quiet", 2);
206309
- __decorateClass57([
206935
+ __decorateClass58([
206310
206936
  property({ type: String, reflect: true })
206311
206937
  ], Table2.prototype, "density", 2);
206312
206938
 
@@ -206322,15 +206948,15 @@ var t13 = css`
206322
206948
  var table_head_css_default = t13;
206323
206949
 
206324
206950
  // ../../node_modules/@spectrum-web-components/table/src/TableHead.dev.js
206325
- var __defProp59 = Object.defineProperty;
206326
- var __getOwnPropDesc59 = Object.getOwnPropertyDescriptor;
206327
- var __decorateClass58 = (decorators2, target, key, kind) => {
206328
- var result = kind > 1 ? undefined : kind ? __getOwnPropDesc59(target, key) : target;
206951
+ var __defProp60 = Object.defineProperty;
206952
+ var __getOwnPropDesc60 = Object.getOwnPropertyDescriptor;
206953
+ var __decorateClass59 = (decorators2, target, key, kind) => {
206954
+ var result = kind > 1 ? undefined : kind ? __getOwnPropDesc60(target, key) : target;
206329
206955
  for (var i6 = decorators2.length - 1, decorator;i6 >= 0; i6--)
206330
206956
  if (decorator = decorators2[i6])
206331
206957
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
206332
206958
  if (kind && result)
206333
- __defProp59(target, key, result);
206959
+ __defProp60(target, key, result);
206334
206960
  return result;
206335
206961
  };
206336
206962
 
@@ -206361,10 +206987,10 @@ class TableHead extends SpectrumElement {
206361
206987
  `;
206362
206988
  }
206363
206989
  }
206364
- __decorateClass58([
206990
+ __decorateClass59([
206365
206991
  property({ reflect: true })
206366
206992
  ], TableHead.prototype, "role", 2);
206367
- __decorateClass58([
206993
+ __decorateClass59([
206368
206994
  property({ type: Boolean, reflect: true })
206369
206995
  ], TableHead.prototype, "selected", 2);
206370
206996
 
@@ -206374,10 +207000,10 @@ init_decorators_dev();
206374
207000
 
206375
207001
  // ../../node_modules/@spectrum-web-components/icon/src/spectrum-icon-arrow.css.js
206376
207002
  init_index_dev();
206377
- var o17 = css`
207003
+ var o18 = css`
206378
207004
  .spectrum-UIIcon-ArrowRight75{--spectrum-icon-size:var(--spectrum-arrow-icon-size-75)}.spectrum-UIIcon-ArrowRight100{--spectrum-icon-size:var(--spectrum-arrow-icon-size-100)}.spectrum-UIIcon-ArrowRight200{--spectrum-icon-size:var(--spectrum-arrow-icon-size-200)}.spectrum-UIIcon-ArrowRight300{--spectrum-icon-size:var(--spectrum-arrow-icon-size-300)}.spectrum-UIIcon-ArrowRight400{--spectrum-icon-size:var(--spectrum-arrow-icon-size-400)}.spectrum-UIIcon-ArrowRight500{--spectrum-icon-size:var(--spectrum-arrow-icon-size-500)}.spectrum-UIIcon-ArrowRight600{--spectrum-icon-size:var(--spectrum-arrow-icon-size-600)}.spectrum-UIIcon-ArrowDown75{--spectrum-icon-size:var(--spectrum-arrow-icon-size-75);transform:rotate(90deg)}.spectrum-UIIcon-ArrowDown100{--spectrum-icon-size:var(--spectrum-arrow-icon-size-100);transform:rotate(90deg)}.spectrum-UIIcon-ArrowDown200{--spectrum-icon-size:var(--spectrum-arrow-icon-size-200);transform:rotate(90deg)}.spectrum-UIIcon-ArrowDown300{--spectrum-icon-size:var(--spectrum-arrow-icon-size-300);transform:rotate(90deg)}.spectrum-UIIcon-ArrowDown400{--spectrum-icon-size:var(--spectrum-arrow-icon-size-400);transform:rotate(90deg)}.spectrum-UIIcon-ArrowDown500{--spectrum-icon-size:var(--spectrum-arrow-icon-size-500);transform:rotate(90deg)}.spectrum-UIIcon-ArrowDown600{--spectrum-icon-size:var(--spectrum-arrow-icon-size-600);transform:rotate(90deg)}.spectrum-UIIcon-ArrowLeft75{--spectrum-icon-size:var(--spectrum-arrow-icon-size-75);transform:rotate(180deg)}.spectrum-UIIcon-ArrowLeft100{--spectrum-icon-size:var(--spectrum-arrow-icon-size-100);transform:rotate(180deg)}.spectrum-UIIcon-ArrowLeft200{--spectrum-icon-size:var(--spectrum-arrow-icon-size-200);transform:rotate(180deg)}.spectrum-UIIcon-ArrowLeft300{--spectrum-icon-size:var(--spectrum-arrow-icon-size-300);transform:rotate(180deg)}.spectrum-UIIcon-ArrowLeft400{--spectrum-icon-size:var(--spectrum-arrow-icon-size-400);transform:rotate(180deg)}.spectrum-UIIcon-ArrowLeft500{--spectrum-icon-size:var(--spectrum-arrow-icon-size-500);transform:rotate(180deg)}.spectrum-UIIcon-ArrowLeft600{--spectrum-icon-size:var(--spectrum-arrow-icon-size-600);transform:rotate(180deg)}.spectrum-UIIcon-ArrowUp75{--spectrum-icon-size:var(--spectrum-arrow-icon-size-75);transform:rotate(270deg)}.spectrum-UIIcon-ArrowUp100{--spectrum-icon-size:var(--spectrum-arrow-icon-size-100);transform:rotate(270deg)}.spectrum-UIIcon-ArrowUp200{--spectrum-icon-size:var(--spectrum-arrow-icon-size-200);transform:rotate(270deg)}.spectrum-UIIcon-ArrowUp300{--spectrum-icon-size:var(--spectrum-arrow-icon-size-300);transform:rotate(270deg)}.spectrum-UIIcon-ArrowUp400{--spectrum-icon-size:var(--spectrum-arrow-icon-size-400);transform:rotate(270deg)}.spectrum-UIIcon-ArrowUp500{--spectrum-icon-size:var(--spectrum-arrow-icon-size-500);transform:rotate(270deg)}.spectrum-UIIcon-ArrowUp600{--spectrum-icon-size:var(--spectrum-arrow-icon-size-600);transform:rotate(270deg)}
206379
207005
  `;
206380
- var spectrum_icon_arrow_css_default = o17;
207006
+ var spectrum_icon_arrow_css_default = o18;
206381
207007
 
206382
207008
  // ../../node_modules/@spectrum-web-components/icons-ui/src/elements/IconArrow100.js
206383
207009
  init_index_dev();
@@ -206432,15 +207058,15 @@ var t14 = css`
206432
207058
  var table_head_cell_css_default = t14;
206433
207059
 
206434
207060
  // ../../node_modules/@spectrum-web-components/table/src/TableHeadCell.dev.js
206435
- var __defProp60 = Object.defineProperty;
206436
- var __getOwnPropDesc60 = Object.getOwnPropertyDescriptor;
206437
- var __decorateClass59 = (decorators2, target, key, kind) => {
206438
- var result = kind > 1 ? undefined : kind ? __getOwnPropDesc60(target, key) : target;
207061
+ var __defProp61 = Object.defineProperty;
207062
+ var __getOwnPropDesc61 = Object.getOwnPropertyDescriptor;
207063
+ var __decorateClass60 = (decorators2, target, key, kind) => {
207064
+ var result = kind > 1 ? undefined : kind ? __getOwnPropDesc61(target, key) : target;
206439
207065
  for (var i6 = decorators2.length - 1, decorator;i6 >= 0; i6--)
206440
207066
  if (decorator = decorators2[i6])
206441
207067
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
206442
207068
  if (kind && result)
206443
- __defProp60(target, key, result);
207069
+ __defProp61(target, key, result);
206444
207070
  return result;
206445
207071
  };
206446
207072
  var ariaSortValue = (sortDirection) => {
@@ -206541,19 +207167,19 @@ class TableHeadCell extends SpectrumElement {
206541
207167
  super.update(changes);
206542
207168
  }
206543
207169
  }
206544
- __decorateClass59([
207170
+ __decorateClass60([
206545
207171
  property({ type: Boolean, reflect: true })
206546
207172
  ], TableHeadCell.prototype, "active", 2);
206547
- __decorateClass59([
207173
+ __decorateClass60([
206548
207174
  property({ reflect: true })
206549
207175
  ], TableHeadCell.prototype, "role", 2);
206550
- __decorateClass59([
207176
+ __decorateClass60([
206551
207177
  property({ type: Boolean, reflect: true })
206552
207178
  ], TableHeadCell.prototype, "sortable", 2);
206553
- __decorateClass59([
207179
+ __decorateClass60([
206554
207180
  property({ reflect: true, attribute: "sort-direction" })
206555
207181
  ], TableHeadCell.prototype, "sortDirection", 2);
206556
- __decorateClass59([
207182
+ __decorateClass60([
206557
207183
  property({ attribute: "sort-key" })
206558
207184
  ], TableHeadCell.prototype, "sortKey", 2);
206559
207185
 
@@ -206569,15 +207195,15 @@ var e19 = css`
206569
207195
  var table_cell_css_default = e19;
206570
207196
 
206571
207197
  // ../../node_modules/@spectrum-web-components/table/src/TableCell.dev.js
206572
- var __defProp61 = Object.defineProperty;
206573
- var __getOwnPropDesc61 = Object.getOwnPropertyDescriptor;
206574
- var __decorateClass60 = (decorators2, target, key, kind) => {
206575
- var result = kind > 1 ? undefined : kind ? __getOwnPropDesc61(target, key) : target;
207198
+ var __defProp62 = Object.defineProperty;
207199
+ var __getOwnPropDesc62 = Object.getOwnPropertyDescriptor;
207200
+ var __decorateClass61 = (decorators2, target, key, kind) => {
207201
+ var result = kind > 1 ? undefined : kind ? __getOwnPropDesc62(target, key) : target;
206576
207202
  for (var i6 = decorators2.length - 1, decorator;i6 >= 0; i6--)
206577
207203
  if (decorator = decorators2[i6])
206578
207204
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
206579
207205
  if (kind && result)
206580
- __defProp61(target, key, result);
207206
+ __defProp62(target, key, result);
206581
207207
  return result;
206582
207208
  };
206583
207209
 
@@ -206595,7 +207221,7 @@ class TableCell extends SpectrumElement {
206595
207221
  `;
206596
207222
  }
206597
207223
  }
206598
- __decorateClass60([
207224
+ __decorateClass61([
206599
207225
  property({ reflect: true })
206600
207226
  ], TableCell.prototype, "role", 2);
206601
207227
 
@@ -209797,12 +210423,12 @@ class JxValueSelector extends LitElement {
209797
210423
  return this;
209798
210424
  }
209799
210425
  get _isPicker() {
209800
- return !!this.value && this.options.some((o18) => !o18.divider && o18.value === this.value);
210426
+ return !!this.value && this.options.some((o19) => !o19.divider && o19.value === this.value);
209801
210427
  }
209802
210428
  get _selectedStyle() {
209803
210429
  if (!this._isPicker)
209804
210430
  return "";
209805
- const opt = this.options.find((o18) => !o18.divider && o18.value === this.value);
210431
+ const opt = this.options.find((o19) => !o19.divider && o19.value === this.value);
209806
210432
  return opt?.style || "";
209807
210433
  }
209808
210434
  _renderMenuItems() {
@@ -210142,6 +210768,7 @@ var components = [
210142
210768
  ["sp-accordion", Accordion],
210143
210769
  ["sp-accordion-item", AccordionItem],
210144
210770
  ["sp-action-bar", ActionBar2],
210771
+ ["sp-toast", Toast],
210145
210772
  ["sp-table", Table2],
210146
210773
  ["sp-table-head", TableHead],
210147
210774
  ["sp-table-head-cell", TableHeadCell],
@@ -213274,6 +213901,7 @@ function renderStylePanelTemplate(ctx) {
213274
213901
  // src/panels/properties-panel.js
213275
213902
  init_store();
213276
213903
  init_components();
213904
+ init_platform();
213277
213905
  // data/html-meta.json
213278
213906
  var html_meta_default = {
213279
213907
  $id: "html-meta",
@@ -213786,9 +214414,11 @@ function renderFrontmatterOnlyPanel() {
213786
214414
  if (fields.length === 0 && !schemaProps) {
213787
214415
  return html`<div class="empty-state">No frontmatter. Select an element to inspect.</div>`;
213788
214416
  }
214417
+ const pageT = renderPageSection(S.document || {});
213789
214418
  return html`
213790
214419
  <div class="style-sidebar">
213791
214420
  <sp-accordion allow-multiple size="s">
214421
+ ${pageT}
213792
214422
  <sp-accordion-item label=${col ? `Frontmatter (${col.name})` : "Frontmatter"} open>
213793
214423
  <div class="style-section-body">
213794
214424
  ${fields.map((f) => renderFmFieldRow(f.field, f.entry, f.value, requiredFields))}
@@ -213857,6 +214487,64 @@ function renderFmFieldRow(field, entry, value2, requiredFields) {
213857
214487
  `
213858
214488
  });
213859
214489
  }
214490
+ if (entry.format === "image") {
214491
+ return renderFieldRow({
214492
+ prop: field,
214493
+ label: displayLabel,
214494
+ hasValue: hasVal,
214495
+ onClear,
214496
+ widget: renderMediaPicker(field, value2, (v) => update(updateFrontmatter(getState(), field, v || undefined)))
214497
+ });
214498
+ }
214499
+ if (entry.type === "array" && entry.items?.format === "image") {
214500
+ const images = Array.isArray(value2) ? value2 : [];
214501
+ return renderFieldRow({
214502
+ prop: field,
214503
+ label: displayLabel,
214504
+ hasValue: hasVal,
214505
+ onClear,
214506
+ widget: html`
214507
+ <div class="gallery-picker">
214508
+ <div class="gallery-picker-strip">
214509
+ ${images.map((img, i6) => html`
214510
+ <div class="gallery-picker-item">
214511
+ <img src=${img} alt="" class="gallery-picker-thumb" />
214512
+ <sp-action-button
214513
+ size="xs"
214514
+ quiet
214515
+ title="Remove"
214516
+ @click=${() => {
214517
+ const next2 = images.filter((_, idx) => idx !== i6);
214518
+ update(updateFrontmatter(getState(), field, next2.length ? next2 : undefined));
214519
+ }}
214520
+ >
214521
+ <sp-icon-close slot="icon"></sp-icon-close>
214522
+ </sp-action-button>
214523
+ </div>
214524
+ `)}
214525
+ </div>
214526
+ ${renderMediaPicker(`${field}:add`, "", (v) => {
214527
+ if (!v)
214528
+ return;
214529
+ const next2 = [...images, v];
214530
+ update(updateFrontmatter(getState(), field, next2));
214531
+ })}
214532
+ </div>
214533
+ `
214534
+ });
214535
+ }
214536
+ if (entry.$ref) {
214537
+ const targetName = entry.$ref.replace("#/contentTypes/", "");
214538
+ const targetDef = projectState?.projectConfig?.contentTypes?.[targetName];
214539
+ const picker = renderReferencePicker(field, value2, targetName, targetDef, (v) => update(updateFrontmatter(getState(), field, v || undefined)));
214540
+ return renderFieldRow({
214541
+ prop: field,
214542
+ label: displayLabel,
214543
+ hasValue: hasVal,
214544
+ onClear,
214545
+ widget: picker
214546
+ });
214547
+ }
213860
214548
  if (entry.type === "number") {
213861
214549
  return renderFieldRow({
213862
214550
  prop: field,
@@ -213893,6 +214581,55 @@ function renderFmFieldRow(field, entry, value2, requiredFields) {
213893
214581
  `
213894
214582
  });
213895
214583
  }
214584
+ var refEntriesCache = new Map;
214585
+ function renderReferencePicker(field, value2, targetName, targetDef, onCommit) {
214586
+ if (!targetDef?.source) {
214587
+ return html`<sp-textfield
214588
+ size="s"
214589
+ placeholder="slug"
214590
+ .value=${live(value2 || "")}
214591
+ @input=${debouncedStyleCommit(`fm:${field}`, 400, (e20) => onCommit(e20.target.value))}
214592
+ ></sp-textfield>`;
214593
+ }
214594
+ const cacheKey = targetName;
214595
+ if (!refEntriesCache.has(cacheKey)) {
214596
+ loadRefEntries(targetName, targetDef);
214597
+ }
214598
+ const entries2 = refEntriesCache.get(cacheKey) || [];
214599
+ return html`
214600
+ <sp-picker
214601
+ size="s"
214602
+ label=${targetName}
214603
+ .value=${live(value2 || "")}
214604
+ @change=${(e20) => onCommit(e20.target.value || undefined)}
214605
+ >
214606
+ <sp-menu-item value="">— none —</sp-menu-item>
214607
+ ${entries2.map((ent) => html`<sp-menu-item value=${ent.slug}>${ent.title || ent.slug}</sp-menu-item>`)}
214608
+ </sp-picker>
214609
+ `;
214610
+ }
214611
+ async function loadRefEntries(targetName, targetDef) {
214612
+ const platform4 = getPlatform();
214613
+ const sourceDir = targetDef.source.replace(/^\.\//, "").split("/**")[0].split("/*")[0];
214614
+ try {
214615
+ const listing = await platform4.listDirectory(sourceDir);
214616
+ const entries2 = [];
214617
+ for (const item of listing) {
214618
+ if (item.type === "directory")
214619
+ continue;
214620
+ const slug = item.name.replace(/\.[^.]+$/, "");
214621
+ let title = slug;
214622
+ try {
214623
+ const content3 = await platform4.readFile(item.path);
214624
+ const match2 = content3.match(/^---[\s\S]*?title:\s*(.+?)[\r\n]/m);
214625
+ if (match2)
214626
+ title = match2[1].trim().replace(/^["']|["']$/g, "");
214627
+ } catch {}
214628
+ entries2.push({ slug, title });
214629
+ }
214630
+ refEntriesCache.set(targetName, entries2);
214631
+ } catch {}
214632
+ }
213896
214633
  function renderRepeaterFieldsTemplate(node2, path2, _mapSignals) {
213897
214634
  const S = getState();
213898
214635
  return html`
@@ -214059,7 +214796,7 @@ function renderComponentPropsFieldsTemplate(node2, path2, mapSignals, navigateTo
214059
214796
  .value=${String(staticVal)}
214060
214797
  size="s"
214061
214798
  placeholder="—"
214062
- .options=${options.map((o18) => ({ value: o18, label: camelToLabel(o18) }))}
214799
+ .options=${options.map((o19) => ({ value: o19, label: camelToLabel(o19) }))}
214063
214800
  @change=${(e20) => onChange(e20.detail?.value ?? e20.target.value)}
214064
214801
  ></jx-value-selector>`;
214065
214802
  } else {
@@ -214258,8 +214995,124 @@ function mediaBreakpointRowTemplate(name, query3) {
214258
214995
  </div>
214259
214996
  `;
214260
214997
  }
214998
+ var layoutEntries = null;
214999
+ async function loadLayoutEntries() {
215000
+ try {
215001
+ const platform4 = getPlatform();
215002
+ const listing = await platform4.listDirectory("layouts");
215003
+ layoutEntries = listing.filter((f) => f.type === "file" && f.name.endsWith(".json")).map((f) => ({
215004
+ name: f.name.replace(/\.json$/, ""),
215005
+ path: `./layouts/${f.name}`
215006
+ }));
215007
+ } catch {
215008
+ layoutEntries = [];
215009
+ }
215010
+ renderOnly("rightPanel");
215011
+ }
215012
+ function isPageDocument(documentPath) {
215013
+ if (!documentPath || !projectState?.isSiteProject)
215014
+ return false;
215015
+ return documentPath.startsWith("pages/") || documentPath.startsWith("./pages/");
215016
+ }
215017
+ function renderPageSection(node2) {
215018
+ const S = getState();
215019
+ if (!isPageDocument(S.documentPath))
215020
+ return nothing;
215021
+ if (layoutEntries === null) {
215022
+ loadLayoutEntries();
215023
+ return nothing;
215024
+ }
215025
+ const currentLayout = node2.$layout;
215026
+ const defaultLayout = projectState?.projectConfig?.defaults?.layout;
215027
+ const effectivePath = getEffectiveLayoutPath(currentLayout);
215028
+ const displayValue = currentLayout === false ? "__none__" : currentLayout ? currentLayout : "__default__";
215029
+ return html`
215030
+ <sp-accordion-item label="Page" open>
215031
+ <div class="style-section-body">
215032
+ <div class="style-row" data-prop="$layout">
215033
+ <div class="style-row-label">
215034
+ ${currentLayout !== undefined ? html`<span
215035
+ class="set-dot"
215036
+ title="Reset to default"
215037
+ @click=${(e20) => {
215038
+ e20.stopPropagation();
215039
+ update(updateProperty(getState(), [], "$layout", undefined));
215040
+ }}
215041
+ ></span>` : nothing}
215042
+ <sp-field-label size="s">Layout</sp-field-label>
215043
+ </div>
215044
+ <sp-picker
215045
+ size="s"
215046
+ value=${displayValue}
215047
+ @change=${(e20) => {
215048
+ const val = e20.target.value;
215049
+ if (val === "__default__") {
215050
+ update(updateProperty(getState(), [], "$layout", undefined));
215051
+ } else if (val === "__none__") {
215052
+ update(updateProperty(getState(), [], "$layout", false));
215053
+ } else {
215054
+ update(updateProperty(getState(), [], "$layout", val));
215055
+ }
215056
+ invalidateLayoutCache();
215057
+ }}
215058
+ >
215059
+ <sp-menu-item value="__default__"
215060
+ >Default${defaultLayout ? ` (${defaultLayout.replace(/^\.\/layouts\//, "").replace(/\.json$/, "")})` : ""}</sp-menu-item
215061
+ >
215062
+ <sp-menu-item value="__none__">None</sp-menu-item>
215063
+ <sp-menu-divider></sp-menu-divider>
215064
+ ${layoutEntries.map((l) => html`<sp-menu-item value=${l.path}>${l.name}</sp-menu-item>`)}
215065
+ </sp-picker>
215066
+ </div>
215067
+ ${effectivePath ? html`<div style="font-size:10px;color:var(--fg-dim);padding:2px 0;font-style:italic">
215068
+ Wraps page content via &lt;slot&gt; distribution
215069
+ </div>` : nothing}
215070
+ </div>
215071
+ </sp-accordion-item>
215072
+ `;
215073
+ }
215074
+ function renderLayoutSelectionPanel(ctx) {
215075
+ const { el, layoutPath } = view.layoutSelection;
215076
+ const tagName = el?.tagName?.toLowerCase() || "element";
215077
+ const className2 = el?.className || "";
215078
+ const displayPath = layoutPath || "layout";
215079
+ return html`
215080
+ <div class="style-sidebar">
215081
+ <sp-accordion allow-multiple size="s">
215082
+ <sp-accordion-item label="Layout Element" open>
215083
+ <div class="style-section-body">
215084
+ <div style="display:flex;align-items:center;gap:6px;margin-bottom:8px">
215085
+ <span
215086
+ style="font-size:9px;padding:2px 6px;background:var(--spectrum-purple-600);color:white;border-radius:3px;text-transform:uppercase;letter-spacing:0.5px"
215087
+ >Layout</span
215088
+ >
215089
+ <code style="font-size:12px;font-family:monospace">&lt;${tagName}&gt;</code>
215090
+ </div>
215091
+ ${className2 ? html`<div class="style-row">
215092
+ <div class="style-row-label">
215093
+ <sp-field-label size="s">Class</sp-field-label>
215094
+ </div>
215095
+ <span style="font-size:11px;color:var(--fg-dim);word-break:break-all"
215096
+ >${className2}</span
215097
+ >
215098
+ </div>` : nothing}
215099
+ <div style="font-size:10px;color:var(--fg-dim);padding:4px 0;font-style:italic">
215100
+ This element is part of the page layout. Edit it by opening the layout file.
215101
+ </div>
215102
+ <span class="kv-add" @click=${() => ctx.navigateToComponent(displayPath)}
215103
+ >Open Layout →</span
215104
+ >
215105
+ </div>
215106
+ </sp-accordion-item>
215107
+ </sp-accordion>
215108
+ </div>
215109
+ `;
215110
+ }
214261
215111
  function renderPropertiesPanelTemplate(ctx) {
214262
215112
  const S = getState();
215113
+ if (view.layoutSelection) {
215114
+ return renderLayoutSelectionPanel(ctx);
215115
+ }
214263
215116
  if (!S.selection) {
214264
215117
  if (S.mode === "content") {
214265
215118
  return renderFrontmatterOnlyPanel();
@@ -214638,14 +215491,15 @@ function renderPropertiesPanelTemplate(ctx) {
214638
215491
  </sp-accordion-item>
214639
215492
  `;
214640
215493
  })() : nothing;
215494
+ const pageT = isRoot ? renderPageSection(node2) : nothing;
214641
215495
  const tpl = html`
214642
215496
  <div class="style-sidebar">
214643
215497
  <sp-accordion allow-multiple size="s">
214644
- ${frontmatterT} ${isMapNode ? repeaterT : elemT} ${isMapNode ? nothing : observedAttrsT}
214645
- ${isMapNode ? nothing : switchT} ${isMapNode ? nothing : compPropsT}
214646
- ${isMapNode ? nothing : attrSectionTemplates} ${isMapNode ? nothing : customSectionT}
214647
- ${isMapNode ? nothing : mediaT} ${isMapNode ? nothing : cssPropsT}
214648
- ${isMapNode ? nothing : cssPartsT}
215498
+ ${pageT} ${frontmatterT} ${isMapNode ? repeaterT : elemT}
215499
+ ${isMapNode ? nothing : observedAttrsT} ${isMapNode ? nothing : switchT}
215500
+ ${isMapNode ? nothing : compPropsT} ${isMapNode ? nothing : attrSectionTemplates}
215501
+ ${isMapNode ? nothing : customSectionT} ${isMapNode ? nothing : mediaT}
215502
+ ${isMapNode ? nothing : cssPropsT} ${isMapNode ? nothing : cssPartsT}
214649
215503
  </sp-accordion>
214650
215504
  </div>
214651
215505
  `;
@@ -215719,5 +216573,5 @@ addUpdateMiddleware((state3) => {
215719
216573
  scheduleAutosave();
215720
216574
  });
215721
216575
 
215722
- //# debugId=2B1FE5B3505549D664756E2164756E21
216576
+ //# debugId=D2AFE14DF975CCFE64756E2164756E21
215723
216577
  //# sourceMappingURL=studio.js.map