@b10cks/client 1.11.0 → 1.12.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/index.mjs CHANGED
@@ -261,16 +261,17 @@ function f(e) {
261
261
  }
262
262
  //#endregion
263
263
  //#region src/preview-bridge.ts
264
- var p = /* @__PURE__ */ new Set([
265
- "CONTENT_UPDATE",
266
- "CONTENT_PATCH",
267
- "SELECT_UPDATE",
268
- "HOVER_UPDATE",
269
- "FIELD_UPDATE",
270
- "FIELD_SELECT"
271
- ]), m = "B10CKS_BRIDGE_READY", h = class e {
264
+ var p = (e) => typeof e == "object" && !!e && !Array.isArray(e), m = (e) => Array.isArray(e) && e.every((e) => typeof e == "string" || typeof e == "number" && Number.isInteger(e) && e >= 0), h = (e) => e.selectedItem === null || typeof e.selectedItem == "string", g = {
265
+ CONTENT_UPDATE: (e) => p(e.content),
266
+ CONTENT_PATCH: (e) => m(e.path) && "value" in e && (e.itemId === void 0 || typeof e.itemId == "string"),
267
+ SELECT_UPDATE: h,
268
+ HOVER_UPDATE: h,
269
+ BLOCK_LABELS: (e) => p(e.labels) && Object.values(e.labels).every((e) => typeof e == "string"),
270
+ HIDDEN_BLOCKS: (e) => Array.isArray(e.ids) && e.ids.every((e) => typeof e == "string")
271
+ }, _ = (e) => typeof e == "string" && Object.hasOwn(g, e), ee = "B10CKS_BRIDGE_READY", te = 2, ne = class e {
272
272
  static instance;
273
273
  listeners = {};
274
+ received = {};
274
275
  initialized = !1;
275
276
  allowedOrigins = null;
276
277
  parentOrigin = null;
@@ -284,12 +285,15 @@ var p = /* @__PURE__ */ new Set([
284
285
  e.allowedOrigins && !this.allowedOrigins && (this.allowedOrigins = e.allowedOrigins, this.parentOrigin && !this.allowedOrigins.includes(this.parentOrigin) && (this.parentOrigin = null));
285
286
  return;
286
287
  }
287
- this.allowedOrigins = e.allowedOrigins ?? null, window.addEventListener("message", this.handleMessage), this.initialized = !0, window.parent.postMessage({ type: m }, "*");
288
+ this.allowedOrigins = e.allowedOrigins ?? null, window.addEventListener("message", this.handleMessage), this.initialized = !0, window.parent.postMessage({
289
+ type: ee,
290
+ payload: { protocol: 2 }
291
+ }, "*");
288
292
  }
289
293
  }
290
294
  destroy() {
291
295
  this.initialized && typeof window < "u" && window.removeEventListener("message", this.handleMessage), this.initialized = !1, this.parentOrigin = null;
292
- for (let e of Object.keys(this.listeners)) this.listeners[e]?.clear();
296
+ for (let e of Object.keys(this.listeners)) this.listeners[e]?.clear(), delete this.received[e];
293
297
  }
294
298
  isInPreviewMode() {
295
299
  return typeof window < "u" && window.self !== window.top;
@@ -301,6 +305,9 @@ var p = /* @__PURE__ */ new Set([
301
305
  n.delete(t);
302
306
  };
303
307
  }
308
+ latest(e) {
309
+ return this.received[e];
310
+ }
304
311
  selectItem(e) {
305
312
  this.post("SELECT_UPDATE", { selectedItem: e });
306
313
  }
@@ -324,6 +331,19 @@ var p = /* @__PURE__ */ new Set([
324
331
  value: n
325
332
  });
326
333
  }
334
+ blockAction(e, t) {
335
+ this.post("BLOCK_ACTION", {
336
+ itemId: e,
337
+ action: t
338
+ });
339
+ }
340
+ moveBlock(e, t, n) {
341
+ this.post("BLOCK_MOVE", {
342
+ itemId: e,
343
+ targetId: t,
344
+ position: n
345
+ });
346
+ }
327
347
  post(e, t) {
328
348
  this.isInPreviewMode() && window.parent.postMessage({
329
349
  type: e,
@@ -333,87 +353,495 @@ var p = /* @__PURE__ */ new Set([
333
353
  handleMessage = (e) => {
334
354
  if (!this.isOriginTrusted(e.origin) || !e.data || typeof e.data != "object") return;
335
355
  let { type: t, payload: n } = e.data;
336
- !t || !p.has(t) || !n || (!this.parentOrigin && e.origin && e.origin !== "null" && (this.parentOrigin = e.origin), this.notify(t, n));
356
+ _(t) && p(n) && g[t](n) && (!this.parentOrigin && e.origin && e.origin !== "null" && (this.parentOrigin = e.origin), this.notify(t, n));
337
357
  };
338
358
  isOriginTrusted(e) {
339
359
  return this.parentOrigin ? e === this.parentOrigin : !this.allowedOrigins || this.allowedOrigins.includes(e);
340
360
  }
341
361
  notify(e, t) {
362
+ this.received[e] = t;
342
363
  let n = this.listeners[e];
343
364
  if (n) for (let e of n) e(t);
344
365
  }
345
- }, g = h.getInstance(), _ = "b10cks-preview-style", v = "--b10cks-scroll-offset";
346
- function y() {
347
- if (typeof document > "u" || document.getElementById(_)) return;
366
+ }, v = ne.getInstance(), y = "rgb(59, 130, 246)", re = 2, ie = `
367
+ :host { all: initial; position: fixed; inset: 0; pointer-events: none; z-index: 2147483647; }
368
+ [hidden] { display: none !important; }
369
+ .box {
370
+ position: fixed; top: 0; left: 0; box-sizing: border-box;
371
+ border: ${re}px solid ${y}; border-radius: 2px;
372
+ }
373
+ .box.hover { border-style: dashed; border-color: rgba(59, 130, 246, 0.6); }
374
+ .label {
375
+ position: absolute; left: 6px; bottom: 100%; margin-bottom: ${re}px;
376
+ display: flex; align-items: center; padding: 0 6px; border-radius: 3px 3px 0 0; white-space: nowrap;
377
+ font: 500 11px/16px system-ui, -apple-system, sans-serif;
378
+ color: #fff; background: ${y};
379
+ }
380
+ .label:empty, .name:empty, .crumbs:empty { display: none; }
381
+ .box.hover .label { background: rgba(59, 130, 246, 0.8); }
382
+ .box[data-inside] .label { bottom: auto; top: 0; margin: 0; border-radius: 0 0 3px 3px; }
383
+ .bar { pointer-events: auto; line-height: 20px; padding-right: 2px; user-select: none; -webkit-user-select: none; }
384
+ .crumbs { display: flex; align-items: center; }
385
+ .crumb { all: unset; cursor: pointer; opacity: 0.75; max-width: 12em; overflow: hidden; text-overflow: ellipsis; border-radius: 2px; }
386
+ .crumb:hover { opacity: 1; text-decoration: underline; }
387
+ .sep, .more { opacity: 0.6; padding: 0 4px; }
388
+ .name { max-width: 16em; overflow: hidden; text-overflow: ellipsis; }
389
+ .tools { display: flex; margin-left: 6px; padding-left: 2px; border-left: 1px solid rgba(255, 255, 255, 0.35); }
390
+ .tool {
391
+ all: unset; box-sizing: border-box; display: grid; place-items: center;
392
+ width: 20px; height: 20px; border-radius: 2px; cursor: pointer;
393
+ }
394
+ .tool:hover:not(:disabled) { background: rgba(255, 255, 255, 0.2); }
395
+ .tool[aria-pressed='true'] { background: rgba(255, 255, 255, 0.3); }
396
+ .tool:disabled { opacity: 0.4; cursor: default; }
397
+ .tool svg { width: 14px; height: 14px; }
398
+ .handle { cursor: grab; touch-action: none; }
399
+ :host([data-dragging]) .handle { cursor: grabbing; }
400
+ .crumb:focus-visible, .tool:focus-visible { outline: 2px solid #fff; outline-offset: -2px; }
401
+ .indicator {
402
+ position: fixed; top: 0; left: 0; border-radius: 2px;
403
+ background: ${y}; box-shadow: 0 0 0 1px #fff;
404
+ }
405
+ `, ae = [
406
+ {
407
+ action: "move-up",
408
+ label: "Move up",
409
+ icon: "<path d=\"M12 19V5M6 11l6-6 6 6\"/>"
410
+ },
411
+ {
412
+ action: "move-down",
413
+ label: "Move down",
414
+ icon: "<path d=\"M12 5v14M6 13l6 6 6-6\"/>"
415
+ },
416
+ {
417
+ action: "insert-before",
418
+ label: "Add block before",
419
+ icon: "<path d=\"M4 4h16M12 9v10M7 14h10\"/>"
420
+ },
421
+ {
422
+ action: "insert-after",
423
+ label: "Add block after",
424
+ icon: "<path d=\"M4 20h16M12 5v10M7 10h10\"/>"
425
+ },
426
+ {
427
+ action: "duplicate",
428
+ label: "Duplicate",
429
+ icon: "<rect x=\"8\" y=\"8\" width=\"12\" height=\"12\" rx=\"2\"/><path d=\"M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2\"/>"
430
+ },
431
+ {
432
+ action: "delete",
433
+ label: "Delete",
434
+ icon: "<path d=\"M4 7h16M10 11v6M14 11v6M6 7l1 13h10l1-13M9 7V4h6v3\"/>"
435
+ }
436
+ ], oe = "<path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>", se = "<path d=\"M10.7 5.1A10.4 10.4 0 0 1 12 5c6.5 0 10 7 10 7a17 17 0 0 1-1.7 2.6M6.6 6.6A17 17 0 0 0 2 12s3.5 7 10 7a9.7 9.7 0 0 0 5.4-1.6M9.9 9.9a3 3 0 0 0 4.2 4.2M2 2l20 20\"/>", ce = "<g fill=\"currentColor\" stroke=\"none\"><circle cx=\"9\" cy=\"6\" r=\"1.5\"/><circle cx=\"15\" cy=\"6\" r=\"1.5\"/><circle cx=\"9\" cy=\"12\" r=\"1.5\"/><circle cx=\"15\" cy=\"12\" r=\"1.5\"/><circle cx=\"9\" cy=\"18\" r=\"1.5\"/><circle cx=\"15\" cy=\"18\" r=\"1.5\"/></g>", le = "Alt/Option-click to use links and buttons on the page";
437
+ function ue(e) {
438
+ let t = document.createElement("div");
439
+ t.id = "b10cks-overlay";
440
+ let n = t.attachShadow({ mode: "open" }), r = document.createElement("style");
441
+ r.textContent = ie, n.appendChild(r);
442
+ let i = b("div", "box hover");
443
+ i.hidden = !0;
444
+ let a = b("div", "label name");
445
+ i.appendChild(a);
446
+ let o = b("div", "box selected");
447
+ o.hidden = !0;
448
+ let s = b("div", "label bar"), c = b("span", "crumbs"), l = b("span", "name");
449
+ l.title = le;
450
+ let u = b("div", "tools");
451
+ u.setAttribute("role", "toolbar"), u.setAttribute("aria-label", "Block actions");
452
+ let d = b("div", "tool handle");
453
+ d.title = "Drag to move", d.setAttribute("aria-hidden", "true"), d.innerHTML = x(ce), d.addEventListener("pointerdown", (t) => e.onDragStart(t, d)), u.appendChild(d);
454
+ let f = /* @__PURE__ */ new Map();
455
+ for (let t of ae) {
456
+ let n = b("button", "tool");
457
+ n.type = "button", n.title = t.label, n.setAttribute("aria-label", t.label), n.innerHTML = x(t.icon), n.addEventListener("click", () => e.onAction(t.action)), f.set(t.action, n), u.appendChild(n);
458
+ }
459
+ let p = !1, m = b("button", "tool");
460
+ m.type = "button", m.addEventListener("click", () => e.onAction(p ? "show" : "hide"));
461
+ let h = (e) => {
462
+ p = e;
463
+ let t = p ? "Show" : "Hide";
464
+ m.title = t, m.setAttribute("aria-label", t), m.setAttribute("aria-pressed", String(p)), m.innerHTML = x(p ? se : oe);
465
+ };
466
+ h(!1), u.insertBefore(m, f.get("delete") ?? null), s.append(c, l, u), o.appendChild(s);
467
+ let g = b("div", "indicator");
468
+ g.hidden = !0, n.append(i, o, g), document.body.appendChild(t);
469
+ let _ = "";
470
+ return {
471
+ host: t,
472
+ selected: {
473
+ box: o,
474
+ label: s,
475
+ name: l
476
+ },
477
+ hover: {
478
+ box: i,
479
+ label: a,
480
+ name: a
481
+ },
482
+ indicator: g,
483
+ renderBar(t) {
484
+ if (s.hidden = !t || !t.label && t.crumbs.length === 0 && !t.actions, !t) return;
485
+ let n = t.crumbs.map((e) => `${e.id}\u0000${e.label}`).join("");
486
+ n !== _ && (_ = n, c.replaceChildren(...de(t.crumbs, e.onSelect))), l.textContent = t.label, u.hidden = !t.actions, pe(f.get("move-up"), !t.actions?.canMoveUp), pe(f.get("move-down"), !t.actions?.canMoveDown);
487
+ let r = t.actions?.hidden ?? null;
488
+ m.hidden = r === null, r !== null && r !== p && h(r);
489
+ },
490
+ setDragging(e) {
491
+ t.toggleAttribute("data-dragging", e);
492
+ }
493
+ };
494
+ }
495
+ function de(e, t) {
496
+ let n = [], r = e.slice(0, -3);
497
+ if (r.length > 0) {
498
+ let e = b("span", "more");
499
+ e.textContent = "…", e.title = r.map((e) => e.label).join(" › "), n.push(e, fe());
500
+ }
501
+ for (let r of e.slice(-3)) {
502
+ let e = b("button", "crumb");
503
+ e.type = "button", e.textContent = r.label, e.title = `Select ${r.label}`, e.addEventListener("click", () => t(r.id)), n.push(e, fe());
504
+ }
505
+ return n;
506
+ }
507
+ function fe() {
508
+ let e = b("span", "sep");
509
+ return e.textContent = "›", e.setAttribute("aria-hidden", "true"), e;
510
+ }
511
+ function pe(e, t) {
512
+ e && (e.disabled = t);
513
+ }
514
+ function b(e, t) {
515
+ let n = document.createElement(e);
516
+ return n.className = t, n;
517
+ }
518
+ function x(e) {
519
+ return `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${e}</svg>`;
520
+ }
521
+ //#endregion
522
+ //#region src/preview-overlay.ts
523
+ var S = {
524
+ selected: "b10cks-selected",
525
+ hover: "b10cks-hover"
526
+ }, C = "b10cks-hidden", w = 2, me = 24, T = 3, E = /* @__PURE__ */ new Map(), D = {
527
+ selected: null,
528
+ hover: null
529
+ }, O = null, k = null, A = null, j = null, M = null, N = !1, P = !1, F = !1, I = null;
530
+ function he(e, t) {
531
+ return E.set(e, t), t.kind === "block" && e.classList.toggle(C, Ie(t.id) === !0), k ||= ge(), t.kind === "block" && t.id === O && G(), () => {
532
+ if (E.get(e) === t) {
533
+ E.delete(e), t.kind === "block" && e.classList.remove(C);
534
+ for (let t of ["selected", "hover"]) D[t] === e && (D[t] = null, e.classList.remove(S[t]));
535
+ E.size === 0 ? (k?.(), k = null) : G();
536
+ }
537
+ };
538
+ }
539
+ function ge() {
540
+ O = v.latest("SELECT_UPDATE")?.selectedItem ?? O, O && G();
541
+ let e = v.on("SELECT_UPDATE", ({ selectedItem: e }) => {
542
+ O = e || null;
543
+ let t = D.selected && E.get(D.selected);
544
+ (t?.kind !== "field" || e && e !== t.id) && K("selected", B(O));
545
+ }), t = v.on("HOVER_UPDATE", ({ selectedItem: e }) => {
546
+ K("hover", B(e || null));
547
+ }), n = v.on("BLOCK_LABELS", q), r = v.on("HIDDEN_BLOCKS", ({ ids: e }) => {
548
+ let t = new Set(e);
549
+ for (let [e, n] of E) n.kind === "block" && e.classList.toggle(C, t.has(n.id));
550
+ q();
551
+ }), i = {
552
+ capture: !0,
553
+ passive: !0
554
+ };
555
+ return window.addEventListener("click", L, !0), window.addEventListener("auxclick", L, !0), window.addEventListener("keydown", _e, !0), document.addEventListener("pointerover", xe, !0), document.addEventListener("pointerout", Se, !0), window.addEventListener("scroll", J, i), window.addEventListener("resize", J), j = typeof ResizeObserver > "u" ? null : new ResizeObserver(J), M = typeof MutationObserver > "u" ? null : new MutationObserver(q), () => {
556
+ W(), e(), t(), n(), r(), window.removeEventListener("click", L, !0), window.removeEventListener("auxclick", L, !0), window.removeEventListener("keydown", _e, !0), document.removeEventListener("pointerover", xe, !0), document.removeEventListener("pointerout", Se, !0), window.removeEventListener("scroll", J, i), window.removeEventListener("resize", J), j?.disconnect(), j = null, M?.disconnect(), M = null, D.selected = null, D.hover = null, A?.host.remove(), A = null;
557
+ };
558
+ }
559
+ function L(e) {
560
+ if (e.altKey) return;
561
+ let t = Ce(e);
562
+ t && (R(e), e.type === "click" && z(t, e));
563
+ }
564
+ function _e(e) {
565
+ if (I) {
566
+ e.key === "Escape" && (R(e), W());
567
+ return;
568
+ }
569
+ let t = D.selected;
570
+ if (!t?.isConnected || e.defaultPrevented || ve(e) || e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) return;
571
+ let n = null;
572
+ e.key === "Escape" ? n = H(t)[0] ?? null : e.key === "ArrowUp" ? n = U(t, -1) : e.key === "ArrowDown" && (n = U(t, 1)), n && (R(e), z(n));
573
+ }
574
+ function ve(e) {
575
+ let t = e.composedPath()[0];
576
+ return t instanceof HTMLElement && (t.isContentEditable || t.matches("input, textarea, select"));
577
+ }
578
+ function R(e) {
579
+ e.preventDefault(), e.stopImmediatePropagation();
580
+ }
581
+ function z(e, t) {
582
+ let n = E.get(e);
583
+ n && (n.activate(t), n.kind === "block" && (O = n.id), K("selected", e));
584
+ }
585
+ function ye(e) {
586
+ let t = B(e);
587
+ t && z(t);
588
+ }
589
+ function be(e) {
590
+ let t = D.selected && E.get(D.selected);
591
+ t?.kind === "block" && v.blockAction(t.id, e);
592
+ }
593
+ function xe(e) {
594
+ K("hover", Ce(e));
595
+ }
596
+ function Se(e) {
597
+ e.relatedTarget || K("hover", null);
598
+ }
599
+ function Ce(e) {
600
+ for (let t of e.composedPath()) if (t instanceof HTMLElement && E.has(t)) return t;
601
+ return null;
602
+ }
603
+ function B(e) {
604
+ if (!e) return null;
605
+ let t = null;
606
+ for (let [n, r] of E) r.kind === "block" && r.id === e && n.isConnected && (!t || t.contains(n)) && (t = n);
607
+ return t;
608
+ }
609
+ function V(e) {
610
+ if (e.parentElement) return e.parentElement;
611
+ let t = e.parentNode;
612
+ return t instanceof ShadowRoot ? t.host : null;
613
+ }
614
+ function H(e) {
615
+ let t = [], n = E.get(e), r = n?.kind === "block" ? n.id : null;
616
+ for (let n = V(e); n; n = V(n)) {
617
+ if (!(n instanceof HTMLElement)) continue;
618
+ let e = E.get(n);
619
+ e?.kind === "block" && e.id !== r && (t.push(n), r = e.id);
620
+ }
621
+ return t;
622
+ }
623
+ function we(e) {
624
+ let t = H(e)[0];
625
+ return (t && E.get(t)?.id) ?? null;
626
+ }
627
+ function U(e, t) {
628
+ let n = E.get(e);
629
+ if (n?.kind !== "block") return null;
630
+ let r = we(e), i = t === 1 ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING, a = null;
631
+ for (let [t, o] of E) o.kind === "block" && o.id !== n.id && t.isConnected && e.compareDocumentPosition(t) & i && (!a || t.compareDocumentPosition(a) & i) && we(t) === r && (a = t);
632
+ return a && B(E.get(a)?.id ?? null);
633
+ }
634
+ function Te(e) {
635
+ let t = E.get(e);
636
+ if (!t) return null;
637
+ let n = H(e).reverse().flatMap((e) => {
638
+ let t = E.get(e);
639
+ return t ? [{
640
+ id: t.id,
641
+ label: Y(t) || "Block"
642
+ }] : [];
643
+ });
644
+ return {
645
+ label: Y(t),
646
+ crumbs: n,
647
+ actions: t.kind === "block" && Fe() ? {
648
+ canMoveUp: !!U(e, -1),
649
+ canMoveDown: !!U(e, 1),
650
+ hidden: Ie(t.id)
651
+ } : null
652
+ };
653
+ }
654
+ function Ee(e, t) {
655
+ let n = D.selected, r = n && E.get(n);
656
+ n && r?.kind === "block" && e.button === 0 && (e.preventDefault(), e.isTrusted && t.setPointerCapture(e.pointerId), I = {
657
+ id: r.id,
658
+ el: n,
659
+ drop: null
660
+ }, A?.setDragging(!0), window.addEventListener("pointermove", De, !0), window.addEventListener("pointerup", Oe, !0), window.addEventListener("pointercancel", W, !0));
661
+ }
662
+ function De(e) {
663
+ I && (I.drop = ke(I, e.clientX, e.clientY), K("hover", I.drop?.el ?? null), J());
664
+ }
665
+ function Oe(e) {
666
+ let t = I, n = t && ke(t, e.clientX, e.clientY);
667
+ W(), t && n && v.moveBlock(t.id, n.id, n.position);
668
+ }
669
+ function W() {
670
+ I && (I = null, window.removeEventListener("pointermove", De, !0), window.removeEventListener("pointerup", Oe, !0), window.removeEventListener("pointercancel", W, !0), A?.setDragging(!1), K("hover", null), J());
671
+ }
672
+ function ke(e, t, n) {
673
+ let r = document.elementsFromPoint(t, n).find((e) => e !== A?.host), i = null;
674
+ for (let t = r ?? null; t; t = V(t)) {
675
+ if (!(t instanceof HTMLElement)) continue;
676
+ let n = E.get(t);
677
+ if (n?.kind === "block") {
678
+ if (n.id === e.id) return null;
679
+ i ??= t;
680
+ }
681
+ }
682
+ let a = i && E.get(i);
683
+ if (!i || !a || i.contains(e.el)) return null;
684
+ let o = i.getBoundingClientRect(), s = e.drop?.el === i ? e.drop.horizontal : Ae(i, o), c = s ? t < o.left + o.width / 2 : n < o.top + o.height / 2;
685
+ return {
686
+ el: i,
687
+ id: a.id,
688
+ position: c ? "before" : "after",
689
+ horizontal: s
690
+ };
691
+ }
692
+ function Ae(e, t) {
693
+ let n = U(e, 1) ?? U(e, -1);
694
+ if (!n) return !1;
695
+ let r = n.getBoundingClientRect();
696
+ return r.top < t.bottom && r.bottom > t.top;
697
+ }
698
+ function G() {
699
+ P || (P = !0, queueMicrotask(() => {
700
+ P = !1;
701
+ let e = D.selected;
702
+ e?.isConnected && E.get(e)?.kind === "field" || K("selected", B(O));
703
+ }));
704
+ }
705
+ function K(e, t) {
706
+ let n = D[e];
707
+ n !== t && (D[e] = t, n && (n.classList.remove(S[e]), je(n, e, !1)), t && (t.classList.add(S[e]), je(t, e, !0), e === "selected" && E.get(t)?.scrollOnSelect && t.scrollIntoView?.({
708
+ block: "nearest",
709
+ behavior: "smooth"
710
+ })), j && (j.disconnect(), j.observe(document.documentElement), D.selected && j.observe(D.selected), D.hover && j.observe(D.hover)), e === "selected" && (M?.disconnect(), t && M?.observe(document.body, {
711
+ childList: !0,
712
+ subtree: !0
713
+ }), F = !0), J());
714
+ }
715
+ function je(e, t, n) {
716
+ let r = E.get(e);
717
+ t === "selected" ? r?.onSelectChange?.(n) : r?.onHoverChange?.(n);
718
+ }
719
+ function q() {
720
+ F = !0, J();
721
+ }
722
+ function J() {
723
+ N || (N = !0, requestAnimationFrame(() => {
724
+ N = !1, Me();
725
+ }));
726
+ }
727
+ function Me() {
728
+ if (!k) return;
729
+ let { selected: e } = D, t = D.hover === e ? null : D.hover;
730
+ if (!A && !e && !t) return;
731
+ A ??= ue({
732
+ onAction: be,
733
+ onSelect: ye,
734
+ onDragStart: Ee
735
+ }), F && (F = !1, A.renderBar(e?.isConnected ? Te(e) : null));
736
+ let n = Y(t ? E.get(t) : void 0);
737
+ A.hover.name.textContent !== n && (A.hover.name.textContent = n), Ne(A.selected, e), Ne(A.hover, t), Pe(A.indicator, I?.drop ?? null);
738
+ }
739
+ function Ne(e, t) {
740
+ if (!t?.isConnected) {
741
+ e.box.hidden = !0;
742
+ return;
743
+ }
744
+ let { box: n, label: r } = e, i = t.getBoundingClientRect(), a = r.offsetWidth, o = r.offsetHeight, s = document.documentElement.clientWidth;
745
+ n.hidden = !1, n.style.transform = `translate(${i.left - w}px, ${i.top - w}px)`, n.style.width = `${i.width + 4}px`, n.style.height = `${i.height + 4}px`;
746
+ let c = i.top < me;
747
+ n.toggleAttribute("data-inside", c);
748
+ let l = Math.min(w - i.top, i.height + 4 - o);
749
+ r.style.top = c ? `${Math.max(0, l)}px` : "";
750
+ let u = i.left - w + 8, d = u + a - s;
751
+ r.style.marginLeft = d > 0 ? `${-Math.min(d, u)}px` : "";
752
+ }
753
+ function Pe(e, t) {
754
+ if (!t?.el.isConnected) {
755
+ e.hidden = !0;
756
+ return;
757
+ }
758
+ let n = t.el.getBoundingClientRect(), r = t.position === "before", { style: i } = e;
759
+ if (e.hidden = !1, t.horizontal) i.transform = `translate(${(r ? n.left : n.right) - T / 2}px, ${n.top}px)`, i.width = `${T}px`, i.height = `${n.height}px`;
760
+ else {
761
+ let e = r ? n.top : n.bottom;
762
+ i.transform = `translate(${n.left}px, ${e - T / 2}px)`, i.width = `${n.width}px`, i.height = `${T}px`;
763
+ }
764
+ }
765
+ function Fe() {
766
+ return v.latest("BLOCK_LABELS") !== void 0;
767
+ }
768
+ function Ie(e) {
769
+ return v.latest("HIDDEN_BLOCKS")?.ids.includes(e) ?? null;
770
+ }
771
+ function Y(e) {
772
+ let t = e?.label;
773
+ return t ? (e.kind === "block" ? v.latest("BLOCK_LABELS")?.labels[t] : void 0) ?? Le(t) : "";
774
+ }
775
+ function Le(e) {
776
+ if (!e) return "";
777
+ if (!/^[a-z][a-z0-9]*([_-][a-z0-9]+)*$/.test(e)) return e;
778
+ let t = e.replace(/[_-]+/g, " ");
779
+ return t.charAt(0).toUpperCase() + t.slice(1);
780
+ }
781
+ //#endregion
782
+ //#region src/editable.ts
783
+ var Re = "b10cks-preview-style", ze = "--b10cks-scroll-offset";
784
+ function X() {
785
+ if (typeof document > "u" || document.getElementById(Re)) return;
348
786
  let e = document.createElement("style");
349
- e.id = _, e.textContent = `
350
- .b10cks-preview { scroll-margin-top: var(${v}, 0px); }
351
- .b10cks-hover,
352
- .b10cks-preview:hover {
353
- outline: 2px dashed rgba(59, 130, 246, 0.5);
354
- outline-offset: 2px;
355
- }
356
- .b10cks-selected {
357
- outline: 2px solid rgb(59, 130, 246) !important;
358
- outline-offset: 2px;
359
- }
787
+ e.id = Re, e.textContent = `
788
+ .b10cks-preview { scroll-margin-top: var(${ze}, 0px); }
789
+ .b10cks-preview.b10cks-hidden { opacity: 0.4 !important; }
360
790
  `, document.head.appendChild(e);
361
791
  }
362
- function b(e) {
792
+ function Be(e) {
363
793
  if (typeof document > "u") return;
364
794
  let t = typeof e == "number" ? `${e}px` : e;
365
- document.documentElement.style.setProperty(v, t);
795
+ document.documentElement.style.setProperty(ze, t);
366
796
  }
367
- function x(e, t) {
368
- if (!g.isInPreviewMode() || !t.id) return () => {};
369
- y();
370
- let { id: n, onSelectChange: r, onHoverChange: i, scrollOnSelect: a = !0 } = t;
797
+ function Ve(e, t) {
798
+ if (!v.isInPreviewMode() || !t.id) return () => {};
799
+ X();
800
+ let { id: n, label: r, onSelectChange: i, onHoverChange: a, scrollOnSelect: o = !0 } = t;
371
801
  e.classList.add("b10cks-preview");
372
- let o = (e) => {
373
- e.preventDefault(), e.stopPropagation(), g.selectItem(n);
374
- }, s = ({ selectedItem: t }) => {
375
- let i = t === n;
376
- e.classList.toggle("b10cks-selected", i), i && a && C(e), r?.(i);
377
- }, c = ({ selectedItem: t }) => {
378
- let r = t === n;
379
- e.classList.toggle("b10cks-hover", r), i?.(r);
380
- };
381
- e.addEventListener("click", o);
382
- let l = g.on("SELECT_UPDATE", s), u = g.on("HOVER_UPDATE", c);
802
+ let s = he(e, {
803
+ id: n,
804
+ kind: "block",
805
+ label: r,
806
+ scrollOnSelect: o,
807
+ onSelectChange: i,
808
+ onHoverChange: a,
809
+ activate: () => v.selectItem(n)
810
+ });
383
811
  return () => {
384
- e.removeEventListener("click", o), l(), u(), e.classList.remove("b10cks-preview", "b10cks-selected", "b10cks-hover");
812
+ s(), e.classList.remove("b10cks-preview", "b10cks-selected", "b10cks-hover");
385
813
  };
386
814
  }
387
- function S(e, t) {
388
- if (!g.isInPreviewMode() || !t.id) return () => {};
389
- let { id: n, field: r, path: i, mode: a = "inline" } = t;
815
+ function He(e, t) {
816
+ if (!v.isInPreviewMode() || !t.id) return () => {};
817
+ let { id: n, field: r, path: i, mode: a = "inline", label: o } = t;
390
818
  if (a === "select") {
391
- y(), e.classList.add("b10cks-preview");
392
- let t = (e) => {
393
- e.preventDefault(), e.stopPropagation(), i ? g.selectField(n, i) : g.selectItem(n);
394
- };
395
- return e.addEventListener("click", t), () => {
396
- e.removeEventListener("click", t), e.classList.remove("b10cks-preview");
819
+ X(), e.classList.add("b10cks-preview");
820
+ let t = he(e, {
821
+ id: n,
822
+ kind: "field",
823
+ label: o ?? Ue(i) ?? r,
824
+ activate: () => i ? v.selectField(n, i) : v.selectItem(n)
825
+ });
826
+ return () => {
827
+ t(), e.classList.remove("b10cks-preview", "b10cks-selected", "b10cks-hover");
397
828
  };
398
829
  }
399
830
  e.setAttribute("contenteditable", "true");
400
- let o = (e) => {
831
+ let s = (e) => {
401
832
  let t = e.target.innerText;
402
- i ? g.updateFieldAt(n, i, t) : g.updateField(n, r ?? "", t);
833
+ i ? v.updateFieldAt(n, i, t) : v.updateField(n, r ?? "", t);
403
834
  };
404
- return e.addEventListener("input", o), () => {
405
- e.removeEventListener("input", o), e.removeAttribute("contenteditable");
835
+ return e.addEventListener("input", s), () => {
836
+ e.removeEventListener("input", s), e.removeAttribute("contenteditable");
406
837
  };
407
838
  }
408
- function C(e) {
409
- typeof e.scrollIntoView == "function" && e.scrollIntoView({
410
- block: "nearest",
411
- behavior: "smooth"
412
- });
839
+ function Ue(e) {
840
+ return e?.findLast((e) => typeof e == "string");
413
841
  }
414
842
  //#endregion
415
843
  //#region src/preview-store.ts
416
- function w(e, t) {
844
+ function We(e, t) {
417
845
  let n = e;
418
846
  for (let e of t) {
419
847
  if (typeof n != "object" || !n) return;
@@ -421,18 +849,18 @@ function w(e, t) {
421
849
  }
422
850
  return n;
423
851
  }
424
- function T(e, t, n) {
852
+ function Z(e, t, n) {
425
853
  if (t.length === 0) return n;
426
854
  let [r, ...i] = t;
427
855
  if (r === void 0) return n;
428
856
  if (typeof r == "number") {
429
857
  let t = Array.isArray(e) ? e.slice() : [];
430
- return t[r] = T(t[r], i, n), t;
858
+ return t[r] = Z(t[r], i, n), t;
431
859
  }
432
860
  let a = e && typeof e == "object" && !Array.isArray(e) ? { ...e } : {};
433
- return a[r] = T(a[r], i, n), a;
861
+ return a[r] = Z(a[r], i, n), a;
434
862
  }
435
- function E(e, t) {
863
+ function Q(e, t) {
436
864
  let n = (e, r) => {
437
865
  if (Array.isArray(e)) {
438
866
  for (let t = 0; t < e.length; t++) {
@@ -455,16 +883,16 @@ function E(e, t) {
455
883
  };
456
884
  return n(e, []);
457
885
  }
458
- function D(e, t) {
886
+ function Ge(e, t) {
459
887
  if (!t || typeof t != "object") return e;
460
888
  let n = typeof t.id == "string" ? t.id : void 0;
461
889
  if (!n || !e || typeof e != "object") return t;
462
890
  let r = e, i = typeof r.id == "string" ? r.id : void 0;
463
891
  if (i === n) return t;
464
- let a = E(e, n);
465
- return a ? T(e, a, t) : !i && r.block !== void 0 && r.block === t.block ? t : e;
892
+ let a = Q(e, n);
893
+ return a ? Z(e, a, t) : !i && r.block !== void 0 && r.block === t.block ? t : e;
466
894
  }
467
- var O = class {
895
+ var Ke = class {
468
896
  content;
469
897
  listeners = /* @__PURE__ */ new Set();
470
898
  constructor(e) {
@@ -478,21 +906,27 @@ var O = class {
478
906
  this.content = e, this.emit();
479
907
  }
480
908
  applyContentUpdate(e) {
481
- let t = D(this.content, e);
909
+ let t = Ge(this.content, e);
482
910
  t !== this.content && (this.content = t, this.emit());
483
911
  }
484
- patch(e, t) {
485
- this.content = T(this.content, e, t), this.emit();
912
+ patch(e, t, n) {
913
+ let r = [];
914
+ if (n && this.content?.id !== n) {
915
+ let e = Q(this.content, n);
916
+ if (!e) return;
917
+ r = e;
918
+ }
919
+ this.content = Z(this.content, [...r, ...e], t), this.emit();
486
920
  }
487
921
  emit() {
488
922
  for (let e of this.listeners) e();
489
923
  }
490
924
  };
491
- function k(e) {
492
- let t = g.on("CONTENT_UPDATE", ({ content: t }) => {
925
+ function qe(e) {
926
+ let t = v.on("CONTENT_UPDATE", ({ content: t }) => {
493
927
  e.applyContentUpdate(t);
494
- }), n = g.on("CONTENT_PATCH", ({ path: t, value: n }) => {
495
- e.patch(t, n);
928
+ }), n = v.on("CONTENT_PATCH", ({ itemId: t, path: n, value: r }) => {
929
+ e.patch(n, r, t);
496
930
  });
497
931
  return () => {
498
932
  t(), n();
@@ -500,17 +934,17 @@ function k(e) {
500
934
  }
501
935
  //#endregion
502
936
  //#region src/sitemap.ts
503
- function A(e) {
937
+ function Je(e) {
504
938
  return (e ?? "").trim().replace(/^\/+|\/+$/g, "");
505
939
  }
506
- function j(e, t) {
507
- let n = A(e), r = A(t);
940
+ function Ye(e, t) {
941
+ let n = Je(e), r = Je(t);
508
942
  if (!r) return n && n !== "home" ? `/${n}` : "/";
509
943
  if (!n || n === "home") return `/${r}`;
510
944
  let i = `${r}/`;
511
945
  return n === r || n.startsWith(i) ? `/${n}` : `/${r}/${n}`;
512
946
  }
513
- function M(e, t) {
947
+ function Xe(e, t) {
514
948
  if (!t) return null;
515
949
  try {
516
950
  return new URL(e, t).toString();
@@ -518,51 +952,51 @@ function M(e, t) {
518
952
  return null;
519
953
  }
520
954
  }
521
- function N(e) {
955
+ function Ze(e) {
522
956
  return e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
523
957
  }
524
- function P(e, t, n) {
958
+ function Qe(e, t, n) {
525
959
  let { localePrefix: r = "auto", defaultLocale: i } = t;
526
- return r === "always" || r === "auto" && n || r === "except-default" && e.language_iso !== i ? j(e.full_slug, e.language_iso) : j(e.full_slug, null);
960
+ return r === "always" || r === "auto" && n || r === "except-default" && e.language_iso !== i ? Ye(e.full_slug, e.language_iso) : Ye(e.full_slug, null);
527
961
  }
528
- function F(e) {
962
+ function $e(e) {
529
963
  let t = /* @__PURE__ */ new Set();
530
964
  for (let n of e) if (n.language_iso && t.add(n.language_iso), t.size > 1) return !0;
531
965
  return !1;
532
966
  }
533
- function I(e, t = {}) {
534
- let { siteUrl: n, locale: r } = t, i = /* @__PURE__ */ new Set(), a = F(e);
967
+ function et(e, t = {}) {
968
+ let { siteUrl: n, locale: r } = t, i = /* @__PURE__ */ new Set(), a = $e(e);
535
969
  return e.filter((e) => {
536
970
  if (r && e.language_iso !== r) return !1;
537
971
  let o = e.meta?.robots?.toLowerCase();
538
972
  if (o?.includes("noindex") || o?.includes("none")) return !1;
539
- let s = P(e, t, a), c = n ? M(s, n) ?? s : s;
540
- return i.has(c) ? !1 : (i.add(c), !0);
973
+ let s = Qe(e, t, a), c = n ? Xe(s, n) ?? s : s;
974
+ return !i.has(c) && (i.add(c), !0);
541
975
  });
542
976
  }
543
- function L(e, t, n = {}) {
544
- let r = F(e);
977
+ function tt(e, t, n = {}) {
978
+ let r = $e(e);
545
979
  return [
546
980
  "<?xml version=\"1.0\" encoding=\"UTF-8\"?>",
547
981
  "<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">",
548
982
  e.map((e) => {
549
- let i = P(e, n, r), a = t ? M(i, t) : i;
983
+ let i = Qe(e, n, r), a = t ? Xe(i, t) : i;
550
984
  if (!a) return "";
551
- let o = [" <url>", ` <loc>${N(a)}</loc>`];
552
- return e.published_at && o.push(` <lastmod>${N(e.published_at)}</lastmod>`), o.push(" </url>"), o.join("\n");
985
+ let o = [" <url>", ` <loc>${Ze(a)}</loc>`];
986
+ return e.published_at && o.push(` <lastmod>${Ze(e.published_at)}</lastmod>`), o.push(" </url>"), o.join("\n");
553
987
  }).filter(Boolean).join("\n"),
554
988
  "</urlset>"
555
989
  ].join("\n");
556
990
  }
557
- function R(e, t) {
991
+ function nt(e, t) {
558
992
  return [
559
993
  "<?xml version=\"1.0\" encoding=\"UTF-8\"?>",
560
994
  "<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">",
561
995
  e.map((e) => {
562
- let n = t ? M(e, t) : e;
996
+ let n = t ? Xe(e, t) : e;
563
997
  return n ? [
564
998
  " <sitemap>",
565
- ` <loc>${N(n)}</loc>`,
999
+ ` <loc>${Ze(n)}</loc>`,
566
1000
  " </sitemap>"
567
1001
  ].join("\n") : "";
568
1002
  }).filter(Boolean).join("\n"),
@@ -571,14 +1005,14 @@ function R(e, t) {
571
1005
  }
572
1006
  //#endregion
573
1007
  //#region src/types.ts
574
- var z = /* @__PURE__ */ t({}), B = class extends Error {
1008
+ var rt = /* @__PURE__ */ t({}), $ = class extends Error {
575
1009
  status;
576
1010
  endpoint;
577
1011
  body;
578
1012
  constructor(e, t, n, r) {
579
1013
  super(e), this.status = t, this.endpoint = n, this.body = r, this.name = "ApiError";
580
1014
  }
581
- }, V = (e) => e === 429 || e >= 500 && e <= 599, H = (e) => new Promise((t) => setTimeout(t, e)), U = class {
1015
+ }, it = (e) => e === 429 || e >= 500 && e <= 599, at = (e) => new Promise((t) => setTimeout(t, e)), ot = class {
582
1016
  baseUrl;
583
1017
  token;
584
1018
  vid;
@@ -630,7 +1064,7 @@ var z = /* @__PURE__ */ t({}), B = class extends Error {
630
1064
  signal: n.signal
631
1065
  });
632
1066
  } catch (t) {
633
- throw t instanceof Error && t.name === "AbortError" ? new B(`Request timed out after ${this.timeoutMs}ms`, 0, e) : t;
1067
+ throw t instanceof Error && t.name === "AbortError" ? new $(`Request timed out after ${this.timeoutMs}ms`, 0, e) : t;
634
1068
  } finally {
635
1069
  clearTimeout(r);
636
1070
  }
@@ -641,8 +1075,8 @@ var z = /* @__PURE__ */ t({}), B = class extends Error {
641
1075
  let n = await this.fetchWithTimeout(e);
642
1076
  return await this.parseResponse(n, t);
643
1077
  } catch (e) {
644
- if (n = e, !(r < this.retries && (!(e instanceof B) || e.status === 0 || V(e.status)))) throw e;
645
- await H(200 * 2 ** r);
1078
+ if (n = e, !(r < this.retries && (!(e instanceof $) || e.status === 0 || it(e.status)))) throw e;
1079
+ await at(200 * 2 ** r);
646
1080
  }
647
1081
  throw n;
648
1082
  }
@@ -677,7 +1111,7 @@ var z = /* @__PURE__ */ t({}), B = class extends Error {
677
1111
  if (this.isFetchResponse(e)) {
678
1112
  if (!e.ok) {
679
1113
  let n = await this.readErrorBody(e);
680
- throw new B(`Request to "${t}" failed with status ${e.status}`, e.status, t, n);
1114
+ throw new $(`Request to "${t}" failed with status ${e.status}`, e.status, t, n);
681
1115
  }
682
1116
  return await e.json();
683
1117
  }
@@ -744,6 +1178,6 @@ var z = /* @__PURE__ */ t({}), B = class extends Error {
744
1178
  }
745
1179
  };
746
1180
  //#endregion
747
- export { U as ApiClient, B as ApiError, d as B10cksDataApi, h as PreviewBridge, O as PreviewStore, x as attachEditable, S as attachEditableField, k as bindPreviewStore, o as blockAnchorAttrs, r as breadcrumbJsonLd, j as buildLocalizedPath, f as createB10cksDataApi, y as ensurePreviewStyles, I as filterSitemapEntries, E as findPathById, w as getAtPath, D as mergeContentUpdate, A as normalizePathSegment, g as previewBridge, R as renderSitemapIndex, L as renderSitemapXml, a as resolveB10cksLink, c as serializeFilter, T as setAtPath, b as setPreviewScrollOffset, i as toRootBlock, z as types };
1181
+ export { ot as ApiClient, $ as ApiError, d as B10cksDataApi, te as BRIDGE_PROTOCOL, ne as PreviewBridge, Ke as PreviewStore, Ve as attachEditable, He as attachEditableField, qe as bindPreviewStore, o as blockAnchorAttrs, r as breadcrumbJsonLd, Ye as buildLocalizedPath, f as createB10cksDataApi, X as ensurePreviewStyles, et as filterSitemapEntries, Q as findPathById, We as getAtPath, Ge as mergeContentUpdate, Je as normalizePathSegment, v as previewBridge, nt as renderSitemapIndex, tt as renderSitemapXml, a as resolveB10cksLink, c as serializeFilter, Z as setAtPath, Be as setPreviewScrollOffset, i as toRootBlock, rt as types };
748
1182
 
749
1183
  //# sourceMappingURL=index.mjs.map