@juo/blocks 1.17.0 → 1.18.1

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.
@@ -394,6 +394,13 @@ function createEditorBridge() {
394
394
  return;
395
395
  }
396
396
  if (clickedBlockId && clickedBlockId === selectedBlockId.value) {
397
+ if (!isEditorUI) {
398
+ const message = createSelectBlockMessage(
399
+ { blockId: clickedBlockId },
400
+ clickedBlockId
401
+ );
402
+ messageHandlers.forEach((handler) => handler(message));
403
+ }
397
404
  return;
398
405
  }
399
406
  if (isNewSelection) {
@@ -619,6 +626,7 @@ function createEditorBridge() {
619
626
  upsertThemeState,
620
627
  requestTranslationOverrides,
621
628
  requestGlobalStyles,
629
+ getSelectedBlockId: () => selectedBlockId.value,
622
630
  preserveScrollAcrossReflow,
623
631
  destroy
624
632
  };
package/dist/core.js CHANGED
@@ -4,7 +4,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
4
4
  import { f as createContext, g as d, h as w, j as registerBlock, E, u, k as getDefinedBlocks, l as createBlockInstance, m as defineBlock, s as subscribeContext, G as GRID_V1_ENGINE_ID, n as clampRect, p as applyFillExpansion, q as compactItems, t as findFreeRect, D as DEFAULT_GRID } from "./css-runtime-DTiXcYSs.js";
5
5
  import { B, v, x, y, z, L, P, S, c, T, A, d as d2, b, F, H, I, J, K, N, O, Q, R, U, V, W, X, Y, Z, i, _, a, $, a0, o, a1, a2, a3, e, a4, r, a5, a6, a7, w as w2 } from "./css-runtime-DTiXcYSs.js";
6
6
  import { reportBlockWarning, reportBlockError } from "./observability.js";
7
- import { a as createEditorBridge, D as createSelectBlockMessage } from "./bridge-xiKEzCGR.js";
7
+ import { a as createEditorBridge, D as createSelectBlockMessage } from "./bridge-4Eq-G73Z.js";
8
8
  import { p } from "./project-gridstack-C2cSYRMx.js";
9
9
  import { clearLayoutModeAdapter, getLayoutModeAdapter, registerLayoutModeAdapter } from "./layout-mode-adapter-BBd4JRQd.js";
10
10
  const SUPPORTED_UI_LANGUAGES = [
@@ -433,8 +433,12 @@ function createLoginService(init) {
433
433
  function storeTokens(data) {
434
434
  const { access_token, refresh_token, expires_in } = data;
435
435
  accessToken.value = access_token;
436
- refreshToken.value = refresh_token;
437
- expires.value = new Date(Date.now() + expires_in);
436
+ if (typeof refresh_token === "string" && refresh_token !== "") {
437
+ refreshToken.value = refresh_token;
438
+ }
439
+ const lifetime = Number.isFinite(expires_in) ? expires_in : 300;
440
+ const margin = Math.min(60, lifetime / 2);
441
+ expires.value = new Date(Date.now() + (lifetime - margin) * 1e3);
438
442
  }
439
443
  async function getToken() {
440
444
  if (refreshToken.value == null) return null;
@@ -61,6 +61,13 @@ export interface EditorBridge {
61
61
  upsertThemeState: (surface: ThemeSurface, id: string, blocks: Block[]) => void;
62
62
  requestTranslationOverrides: (locale: string) => Promise<TranslationOverride[]>;
63
63
  requestGlobalStyles: () => Promise<GlobalStyles>;
64
+ /**
65
+ * The block id the parent most recently selected (via SELECT_BLOCK or an
66
+ * in-iframe click), or null. Wrappers that mount after the broadcast use
67
+ * this to initialise their active state instead of waiting for the next
68
+ * selection change.
69
+ */
70
+ getSelectedBlockId: () => string | null;
64
71
  /**
65
72
  * Preserve the iframe scroll position across a re-render that transiently
66
73
  * collapses content height (e.g. toggling layout mode). Capture is synchronous,
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/editor/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EAGd,MAAM,YAAY,CAAC;AAapB,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAGtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,MAAM,WAAW,UAAU,CACzB,MAAM,GAAG,OAAO,EAChB,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAElC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,QAAQ,CAAC;CACnB;AAED,MAAM,MAAM,kBAAkB,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,QAAQ,CAAC,SAAS;IAC1E,KAAK,EAAE,MAAM,CAAC,CAAC;CAChB,GACG,CAAC,GACD,KAAK,CAAC;AAEV,MAAM,MAAM,oBAAoB,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,QAAQ,CAAC,SAAS;IAC5E,OAAO,EAAE,MAAM,CAAC,CAAC;CAClB,GACG,CAAC,GACD,KAAK,CAAC;AAEV,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,WAAW,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAC9C,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,KAAK;QACxD,WAAW,EAAE,MAAM,IAAI,CAAC;KACzB,CAAC;IACF,mBAAmB,CAAC,QAAQ,GAAG,OAAO,EACpC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,CACR,MAAM,EAAE,UAAU,CAChB,kBAAkB,CAAC,QAAQ,CAAC,EAC5B,oBAAoB,CAAC,QAAQ,CAAC,CAC/B,GAAG,IAAI,KACL,IAAI,GACR;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IAC/B,iBAAiB,EAAE,CACjB,OAAO,EAAE,YAAY,EACrB,EAAE,EAAE,MAAM,KACP,OAAO,CAAC;QAAE,MAAM,EAAE,KAAK,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACzC,gBAAgB,EAAE,CAChB,OAAO,EAAE,YAAY,EACrB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,KAAK,EAAE,KACZ,IAAI,CAAC;IACV,2BAA2B,EAAE,CAC3B,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACpC,mBAAmB,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;IACjD;;;;;;OAMG;IACH,0BAA0B,EAAE,MAAM,IAAI,CAAC;IACvC;;;OAGG;IACH,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAID;;;GAGG;AACH,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAErD;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CA8gBjD"}
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/editor/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EAGd,MAAM,YAAY,CAAC;AAapB,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAGtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,MAAM,WAAW,UAAU,CACzB,MAAM,GAAG,OAAO,EAChB,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAElC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,QAAQ,CAAC;CACnB;AAED,MAAM,MAAM,kBAAkB,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,QAAQ,CAAC,SAAS;IAC1E,KAAK,EAAE,MAAM,CAAC,CAAC;CAChB,GACG,CAAC,GACD,KAAK,CAAC;AAEV,MAAM,MAAM,oBAAoB,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,QAAQ,CAAC,SAAS;IAC5E,OAAO,EAAE,MAAM,CAAC,CAAC;CAClB,GACG,CAAC,GACD,KAAK,CAAC;AAEV,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,WAAW,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAC9C,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,KAAK;QACxD,WAAW,EAAE,MAAM,IAAI,CAAC;KACzB,CAAC;IACF,mBAAmB,CAAC,QAAQ,GAAG,OAAO,EACpC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,CACR,MAAM,EAAE,UAAU,CAChB,kBAAkB,CAAC,QAAQ,CAAC,EAC5B,oBAAoB,CAAC,QAAQ,CAAC,CAC/B,GAAG,IAAI,KACL,IAAI,GACR;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IAC/B,iBAAiB,EAAE,CACjB,OAAO,EAAE,YAAY,EACrB,EAAE,EAAE,MAAM,KACP,OAAO,CAAC;QAAE,MAAM,EAAE,KAAK,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACzC,gBAAgB,EAAE,CAChB,OAAO,EAAE,YAAY,EACrB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,KAAK,EAAE,KACZ,IAAI,CAAC;IACV,2BAA2B,EAAE,CAC3B,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACpC,mBAAmB,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;IACjD;;;;;OAKG;IACH,kBAAkB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACxC;;;;;;OAMG;IACH,0BAA0B,EAAE,MAAM,IAAI,CAAC;IACvC;;;OAGG;IACH,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAID;;;GAGG;AACH,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAErD;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CAmiBjD"}
@@ -39,6 +39,15 @@ export declare class BlockWrapper extends HTMLElement {
39
39
  private openMenu;
40
40
  private closeMenu;
41
41
  setBlock(block: BlockInstance): void;
42
+ /**
43
+ * SELECT_BLOCK is broadcast once per selection change, so a wrapper that
44
+ * mounts afterwards (overlay content renders asynchronously) would never
45
+ * hear it and stay inactive — leaving its slotted content with
46
+ * pointer-events: none and every juo-text unclickable. Seed the active
47
+ * state from the bridge's cached selection instead of waiting for the
48
+ * next change.
49
+ */
50
+ private syncActiveStateFromBridge;
42
51
  private updateActiveState;
43
52
  /**
44
53
  * Traverses up the DOM tree to find the parent element, crossing shadow root boundaries
@@ -158,6 +167,8 @@ export declare class LayoutBlockWrapper extends HTMLElement {
158
167
  /** Assign each bar its width from the block-type-seeded sequence. */
159
168
  private applyBarWidths;
160
169
  setBlock(block: BlockInstance): void;
170
+ /** See BlockWrapper.syncActiveStateFromBridge. */
171
+ private syncActiveStateFromBridge;
161
172
  }
162
173
  declare global {
163
174
  interface HTMLElementTagNameMap {
@@ -1 +1 @@
1
- {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/editor/components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AA+jB9C,qBAAa,YAAa,SAAQ,WAAW;IAC3C,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,uBAAuB,CAA0C;IACzE,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,OAAO,CAA4B;IAE3C,MAAM,KAAK,kBAAkB,aAE5B;;IASD,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,aAAa;IA8GrB,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,cAAc;IAgCtB,OAAO,CAAC,uBAAuB;IAO/B,iBAAiB;IAuCjB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAuBnC,OAAO,CAAC,kBAAkB,CAA4B;IAEtD,OAAO,CAAC,gBAAgB,CAUtB;IAEF,OAAO,CAAC,gBAAgB,CAKtB;IAEF,oBAAoB;IAUpB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,SAAS;IAWjB,QAAQ,CAAC,KAAK,EAAE,aAAa;IAS7B,OAAO,CAAC,iBAAiB;IAazB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,iBAAiB;CAmD1B;AAMD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,0BAA0B,EAAE,YAAY,CAAC;KAC1C;CACF;AAoUD,qBAAa,kBAAmB,SAAQ,WAAW;IACjD,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,sBAAsB,CAA+B;IAC7D,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,sBAAsB,CAA4B;IAE1D,MAAM,KAAK,kBAAkB,aAE5B;IAED,wBAAwB,CAAC,IAAI,EAAE,MAAM;IAQrC,OAAO,CAAC,aAAa,CAAK;IAE1B,OAAO,CAAC,yBAAyB,CAU/B;;IAaF,OAAO,CAAC,aAAa;IAyDrB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAgEpB,OAAO,CAAC,gBAAgB;IAexB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,eAAe,CAKrB;IAEF,+EAA+E;IAC/E,OAAO,CAAC,cAAc;IAYtB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IA4BzB,mEAAmE;IACnE,OAAO,CAAC,gBAAgB;IAMxB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAgBvB,iBAAiB;IAsCjB,oBAAoB;IAapB,OAAO,CAAC,gBAAgB,CActB;IAEF,OAAO,CAAC,gBAAgB,CAMtB;IAEF;;;;OAIG;IACH,OAAO,CAAC,eAAe,CAmBrB;IAEF,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,yBAAyB,CAU/B;IAEF,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,iBAAiB;IAuBzB;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAM;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAM;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAK;IAE9C;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAEzC;IAEF;;;;;;;;OAQG;IACH,OAAO,CAAC,sBAAsB;IAgC9B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAS3B,qEAAqE;IACrE,OAAO,CAAC,cAAc;IAWtB,QAAQ,CAAC,KAAK,EAAE,aAAa;CAS9B;AAMD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iCAAiC,EAAE,kBAAkB,CAAC;KACvD;CACF"}
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/editor/components.ts"],"names":[],"mappings":"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"}
package/dist/editor.js CHANGED
@@ -3,10 +3,10 @@ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { en
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
4
  import { serializeBlocks, createBlockInstanceFromObject, setActiveSurfaceContext, indexOverrides, canvasMode, getActiveSurfaceContext, emitLayoutCommand, DEFAULT_GLOBAL_STYLES, effect, setLayoutCommandEmitter, setLayoutCommandDispatcher, onRegisterBlock, getDefinedBlocks, clearAllSurfaceContexts } from "@juo/blocks";
5
5
  import { canvasMode as canvasMode2 } from "@juo/blocks";
6
- import { L as LAYOUT_BLOCK_WRAPPER_TAG, a as createEditorBridge, b as createOpenAddBlockMenuMessage, d as createRemoveBlockMessage, i as isBlockWrapperTag, r as resolveOutlineTarget, e as getBlockLabel, f as createLayoutCommandMessage, h as createRegisterBlocksMessage, j as createRegisterRoutesMessage } from "./bridge-xiKEzCGR.js";
7
- import { k, l, m, c, n, o, p, q, s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J, K, g, M, N } from "./bridge-xiKEzCGR.js";
8
- import { s as setCanvasMode, e as enterLayout } from "./morph-n4LMxOYo.js";
9
- import { r } from "./morph-n4LMxOYo.js";
6
+ import { L as LAYOUT_BLOCK_WRAPPER_TAG, a as createEditorBridge, b as createOpenAddBlockMenuMessage, d as createRemoveBlockMessage, i as isBlockWrapperTag, r as resolveOutlineTarget, e as getBlockLabel, f as createLayoutCommandMessage, h as createRegisterBlocksMessage, j as createRegisterRoutesMessage } from "./bridge-4Eq-G73Z.js";
7
+ import { k, l, m, c, n, o, p, q, s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J, K, g, M, N } from "./bridge-4Eq-G73Z.js";
8
+ import { s as setCanvasMode, e as enterLayout } from "./morph-DHn3ol8M.js";
9
+ import { r } from "./morph-DHn3ol8M.js";
10
10
  function createEditorHandler(options) {
11
11
  const { themeState, onBlockSelection } = options;
12
12
  const blockSurfaceIndex = /* @__PURE__ */ new Map();
@@ -1052,6 +1052,7 @@ class BlockWrapper extends HTMLElement {
1052
1052
  }
1053
1053
  this.addEventListener("mouseenter", this.handleHoverEnter);
1054
1054
  this.addEventListener("mouseleave", this.handleHoverLeave);
1055
+ this.syncActiveStateFromBridge();
1055
1056
  }
1056
1057
  /**
1057
1058
  * Resolve the slotted block's first painted descendant — the
@@ -1119,6 +1120,21 @@ class BlockWrapper extends HTMLElement {
1119
1120
  if (this.nameElement) {
1120
1121
  this.nameElement.textContent = block.definition.displayName ?? block.definition.name;
1121
1122
  }
1123
+ this.syncActiveStateFromBridge();
1124
+ }
1125
+ /**
1126
+ * SELECT_BLOCK is broadcast once per selection change, so a wrapper that
1127
+ * mounts afterwards (overlay content renders asynchronously) would never
1128
+ * hear it and stay inactive — leaving its slotted content with
1129
+ * pointer-events: none and every juo-text unclickable. Seed the active
1130
+ * state from the bridge's cached selection instead of waiting for the
1131
+ * next change.
1132
+ */
1133
+ syncActiveStateFromBridge() {
1134
+ if (!this.block) return;
1135
+ if (this.editorBridge.getSelectedBlockId() === this.block.id) {
1136
+ this.updateActiveState(true);
1137
+ }
1122
1138
  }
1123
1139
  updateActiveState(isActive) {
1124
1140
  if (isActive) {
@@ -1778,6 +1794,7 @@ const _LayoutBlockWrapper = class _LayoutBlockWrapper extends HTMLElement {
1778
1794
  }
1779
1795
  this.addEventListener("mouseenter", this.handleHoverEnter);
1780
1796
  this.addEventListener("mouseleave", this.handleHoverLeave);
1797
+ this.syncActiveStateFromBridge();
1781
1798
  if (typeof ResizeObserver !== "undefined" && this.skeletonLines) {
1782
1799
  this.skeletonResizeObserver = new ResizeObserver(
1783
1800
  this.scheduleSkeletonRecompute
@@ -1825,6 +1842,10 @@ const _LayoutBlockWrapper = class _LayoutBlockWrapper extends HTMLElement {
1825
1842
  if (this.hasAttribute("data-juo-grid-cell")) return;
1826
1843
  const target = this.paintTarget();
1827
1844
  if (!target) return;
1845
+ if (this.selectionOutlineTarget && this.selectionOutlineTarget !== target) {
1846
+ this.selectionOutlineTarget.style.outline = "";
1847
+ this.selectionOutlineTarget.style.outlineOffset = "";
1848
+ }
1828
1849
  this.selectionOutlineTarget = target;
1829
1850
  target.style.outline = "2px solid #060606";
1830
1851
  target.style.outlineOffset = "0";
@@ -1900,6 +1921,14 @@ const _LayoutBlockWrapper = class _LayoutBlockWrapper extends HTMLElement {
1900
1921
  this.skeletonTitle.textContent = getBlockLabel(block);
1901
1922
  }
1902
1923
  this.applyBarWidths();
1924
+ this.syncActiveStateFromBridge();
1925
+ }
1926
+ /** See BlockWrapper.syncActiveStateFromBridge. */
1927
+ syncActiveStateFromBridge() {
1928
+ if (!this.block) return;
1929
+ if (this.editorBridge.getSelectedBlockId() === this.block.id) {
1930
+ this.updateActiveState(true);
1931
+ }
1903
1932
  }
1904
1933
  };
1905
1934
  /**
@@ -1,5 +1,5 @@
1
1
  import { canvasMode, effect } from "@juo/blocks";
2
- import { g as getEditorBridge, c as createLayoutingModeChangedMessage, W as WRAPPER_SELECTOR } from "./bridge-xiKEzCGR.js";
2
+ import { g as getEditorBridge, c as createLayoutingModeChangedMessage, W as WRAPPER_SELECTOR } from "./bridge-4Eq-G73Z.js";
3
3
  import { LAYOUT_INTERACTION_START, LAYOUT_INTERACTION_END, LAYOUT_POP_CLASS } from "./layout-mode-adapter-BBd4JRQd.js";
4
4
  function setCanvasMode(enabled) {
5
5
  var _a;
package/dist/preact.js CHANGED
@@ -7,7 +7,7 @@ import { g as getSignalValue, s as setSignalValue, w as wrapContext, c as create
7
7
  import { t } from "./block-dVP4Rqgz.js";
8
8
  import { createContext, h, render } from "preact";
9
9
  import { g as getInstrumentation } from "./index-JSv6UH_o.js";
10
- import { a as createEditorBridge } from "./bridge-xiKEzCGR.js";
10
+ import { a as createEditorBridge } from "./bridge-4Eq-G73Z.js";
11
11
  function toState(signal) {
12
12
  const [value, setValue] = useState(() => getSignalValue(signal));
13
13
  const disposeRef = useRef(null);
package/dist/react.js CHANGED
@@ -7,7 +7,7 @@ import { g as getSignalValue, s as setSignalValue, w as wrapContext, c as create
7
7
  import { t } from "./block-dVP4Rqgz.js";
8
8
  import { createRoot } from "react-dom/client";
9
9
  import { g as getInstrumentation } from "./index-JSv6UH_o.js";
10
- import { a as createEditorBridge } from "./bridge-xiKEzCGR.js";
10
+ import { a as createEditorBridge } from "./bridge-4Eq-G73Z.js";
11
11
  function toState(signal) {
12
12
  const subscribe = (callback) => {
13
13
  const dispose = effect(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"loginService.d.ts","sourceRoot":"","sources":["../../../src/services/login/loginService.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAKxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAI9C,oBAAY,yBAAyB;IACnC,OAAO,YAAY;IACnB,aAAa,eAAe;IAC5B,YAAY,mBAAmB;IAC/B,OAAO,aAAa;IACpB,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,EAAE,yBAAyB,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAG5B,MAAM,EAAE,yBAAyB,EACjC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAMjC;AAED,UAAU,aAAa;IACrB,IAAI,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IACtE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB;AA0BD,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,KAAK;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,yBAAyB,CAAC;CACpC,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,cAAc,CAAC;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,WAAW,EAAE,cAAc,CAAC;IAC5B,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;;;;;;;;;;;;;;;;EAmBA;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,wBAAwB;;;;;;;;;;;;;;;;EA+MhE"}
1
+ {"version":3,"file":"loginService.d.ts","sourceRoot":"","sources":["../../../src/services/login/loginService.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAKxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAI9C,oBAAY,yBAAyB;IACnC,OAAO,YAAY;IACnB,aAAa,eAAe;IAC5B,YAAY,mBAAmB;IAC/B,OAAO,aAAa;IACpB,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,EAAE,yBAAyB,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAG5B,MAAM,EAAE,yBAAyB,EACjC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAMjC;AAED,UAAU,aAAa;IACrB,IAAI,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IACtE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB;AA0BD,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,KAAK;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,yBAAyB,CAAC;CACpC,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,cAAc,CAAC;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,WAAW,EAAE,cAAc,CAAC;IAC5B,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;;;;;;;;;;;;;;;;EAmBA;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,wBAAwB;;;;;;;;;;;;;;;;EAsNhE"}
@@ -8,9 +8,14 @@
8
8
  * machine-readable code — so hosts discriminate on status. The backend's own
9
9
  * refusal codes collapse accordingly: `invalid_items` and
10
10
  * `shipping_method_unavailable` both arrive as 400, and `disabled`,
11
- * `product_not_allowed` and `subscription_ineligible` all arrive as 403. Telling
12
- * those apart would need the backend to send a code first, the way discounts send
11
+ * `product_not_allowed` and `subscription_ineligible` all as 403. Telling those
12
+ * apart would need the backend to send a code first, the way discounts send
13
13
  * `DISCOUNT_CODE_REJECTED`.
14
+ *
15
+ * `outstanding_balance` is the exception, and it is why granularity matters
16
+ * here: it gets its own status (402) precisely so a host can tell the customer
17
+ * to settle up rather than showing them the "not available" copy every other
18
+ * 403 earns. Any future refusal a customer can act on should do the same.
14
19
  */
15
20
  /**
16
21
  * Reading the instant-order catalog. An adapter that does not implement instant
@@ -47,6 +52,15 @@ export type PlaceInstantOrderError =
47
52
  kind: "INVALID_REQUEST";
48
53
  message?: string;
49
54
  }
55
+ /**
56
+ * 402 — the customer has an unpaid or overdue order on their account. Split
57
+ * out of `REFUSED` because it is the only refusal the customer can act on:
58
+ * settle the outstanding order and the purchase becomes available again.
59
+ */
60
+ | {
61
+ kind: "OUTSTANDING_BALANCE";
62
+ message?: string;
63
+ }
50
64
  /**
51
65
  * 403 — the shop has the feature off, the product is not on the allowlist, or
52
66
  * the subscription cannot carry an instant order.
@@ -1 +1 @@
1
- {"version":3,"file":"instantOrderErrors.d.ts","sourceRoot":"","sources":["../../../src/services/subscription/instantOrderErrors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;GAKG;AACH,MAAM,MAAM,yBAAyB,GACjC;IAAE,IAAI,EAAE,wBAAwB,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C,MAAM,MAAM,sBAAsB;AAChC,iEAAiE;AAC/D;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE;AACzB,4EAA4E;GAC1E;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE;AACjD,wEAAwE;GACtE;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE;AAC5C,2EAA2E;GACzE;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE;AAC/C;;;GAGG;GACD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,wBAAwB,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC"}
1
+ {"version":3,"file":"instantOrderErrors.d.ts","sourceRoot":"","sources":["../../../src/services/subscription/instantOrderErrors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;GAKG;AACH,MAAM,MAAM,yBAAyB,GACjC;IAAE,IAAI,EAAE,wBAAwB,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C,MAAM,MAAM,sBAAsB;AAChC,iEAAiE;AAC/D;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE;AACzB,4EAA4E;GAC1E;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE;AACjD,wEAAwE;GACtE;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE;AAC5C,2EAA2E;GACzE;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE;AAC/C;;;;GAIG;GACD;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE;AACnD;;;GAGG;GACD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,wBAAwB,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC"}
package/dist/vue.js CHANGED
@@ -2,7 +2,7 @@ import { customRef, toValue, watchEffect, defineComponent, ref, getCurrentInstan
2
2
  import { g as getInstrumentation } from "./index-JSv6UH_o.js";
3
3
  import { effect, signal, injectContext, provideContext, TranslationContext, createCeRenderer, attachEmptyTracking } from "@juo/blocks";
4
4
  import { hasRenderedContent } from "@juo/blocks";
5
- import { v as createRegisterBlockTranslationKeysMessage, a as createEditorBridge } from "./bridge-xiKEzCGR.js";
5
+ import { v as createRegisterBlockTranslationKeysMessage, a as createEditorBridge } from "./bridge-4Eq-G73Z.js";
6
6
  const signalsMap = /* @__PURE__ */ new WeakMap();
7
7
  function toSignal(ref2) {
8
8
  if (!signalsMap.has(ref2)) {
@@ -5,8 +5,8 @@ import { i as injectContext, T as TranslationContext, C as ContextRoot } from ".
5
5
  import { V as ViewLayoutController, E as ExtensionRoot, B as Block } from "./ExtensionRoot-DfpvN94s.js";
6
6
  import { canvasMode, getActiveSurfaceContext, emitLayoutSetRects, effect } from "@juo/blocks";
7
7
  import { getLayoutModeAdapter } from "./layout-mode-adapter-BBd4JRQd.js";
8
- import { a as createEditorBridge, m as createFocusInlineTextMessage, J as createUpdateBlockTranslationMessage } from "./bridge-xiKEzCGR.js";
9
- import { i as initMorphController } from "./morph-n4LMxOYo.js";
8
+ import { a as createEditorBridge, m as createFocusInlineTextMessage, J as createUpdateBlockTranslationMessage } from "./bridge-4Eq-G73Z.js";
9
+ import { i as initMorphController } from "./morph-DHn3ol8M.js";
10
10
  class EditorLayoutController {
11
11
  constructor() {
12
12
  __publicField(this, "currentAdapter", null);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@juo/blocks",
3
3
  "private": false,
4
- "version": "1.17.0",
4
+ "version": "1.18.1",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist"