efficient-easel 0.103.0 → 0.105.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/README.md +92 -7
  2. package/dist/CanvasDragLayer-zgYT1xwY.d.ts +168 -0
  3. package/dist/chrome/index.js +1 -1
  4. package/dist/chunk-3P6AMTOS.js +1 -0
  5. package/dist/chunk-4XQUWGIV.js +65 -0
  6. package/dist/{chunk-6UJ3Y6FC.js → chunk-53G47SWO.js} +1 -1
  7. package/dist/{chunk-IWAPPEL4.js → chunk-5ZBBXZPV.js} +1 -1
  8. package/dist/chunk-7FBDZTUD.js +2 -0
  9. package/dist/chunk-7V5WZ46F.js +2 -0
  10. package/dist/chunk-BVN33R76.js +1 -0
  11. package/dist/chunk-CLOS6SSX.js +1 -0
  12. package/dist/chunk-ERR437B5.js +1 -0
  13. package/dist/chunk-GMCZXMOV.js +1 -0
  14. package/dist/{chunk-OYX47SL7.js → chunk-HNKB2ZYR.js} +1 -1
  15. package/dist/{chunk-AKFJK65Z.js → chunk-IE4GFYKO.js} +1 -1
  16. package/dist/{chunk-KDYIMJTZ.js → chunk-KCOBHPN6.js} +1 -1
  17. package/dist/chunk-KG7RJWOK.js +1 -0
  18. package/dist/chunk-N7VRF7PR.js +5 -0
  19. package/dist/chunk-NYKIQJT2.js +4 -0
  20. package/dist/{chunk-6TZTKAB5.js → chunk-O7Q4DDJT.js} +1 -1
  21. package/dist/chunk-PA3PNTVV.js +1 -0
  22. package/dist/chunk-PLVEGYK6.js +1 -0
  23. package/dist/chunk-PQXIFBDY.js +1 -0
  24. package/dist/{chunk-66ICOE3I.js → chunk-QH6LCNOX.js} +1 -1
  25. package/dist/chunk-R6WTQWAC.js +2 -0
  26. package/dist/{chunk-Z3KBLIEH.js → chunk-RQHC4TD6.js} +3 -3
  27. package/dist/chunk-RSCMJIWS.js +1 -0
  28. package/dist/{chunk-7MU3RJ6S.js → chunk-S4AWJX4Q.js} +1 -1
  29. package/dist/{chunk-MSBF7IW3.js → chunk-SARZN4M7.js} +2 -2
  30. package/dist/chunk-SQTY6CJD.js +1 -0
  31. package/dist/chunk-TBF5CVPA.js +1 -0
  32. package/dist/chunk-THWO5YVZ.js +1 -0
  33. package/dist/chunk-TLZG2FCF.js +1 -0
  34. package/dist/chunk-U3JP4VGF.js +2 -0
  35. package/dist/{chunk-LG436UTD.js → chunk-V4LF7D4F.js} +1 -1
  36. package/dist/chunk-VSHV6KJQ.js +5 -0
  37. package/dist/{chunk-OM67AJQC.js → chunk-VSOP4GUM.js} +1 -1
  38. package/dist/{chunk-6DJHRLCU.js → chunk-YC4TB3CJ.js} +9 -9
  39. package/dist/{chunk-GXN65JMA.js → chunk-YN4KND5F.js} +1 -1
  40. package/dist/chunk-ZTTWFAAC.js +1 -0
  41. package/dist/drag/index.d.ts +4 -164
  42. package/dist/edit-lock/index.d.ts +55 -1
  43. package/dist/edit-lock/index.js +1 -1
  44. package/dist/{host-DJ8Gzsx7.d.ts → host-BQ_b9Qzk.d.ts} +27 -1
  45. package/dist/screen/components/AddBlockRow.js +1 -1
  46. package/dist/screen/components/AddSidePanel.js +1 -1
  47. package/dist/screen/components/MediaSidePanel.d.ts +3 -2
  48. package/dist/screen/components/MediaSidePanel.js +1 -1
  49. package/dist/screen/components/NodeContextMenu.d.ts +208 -5
  50. package/dist/screen/components/NodeContextMenu.js +1 -1
  51. package/dist/screen/components/PageEditGuardNotices.js +1 -1
  52. package/dist/screen/components/ScreenChrome.js +1 -1
  53. package/dist/screen/components/ScreenDocumentContext.d.ts +2 -1
  54. package/dist/screen/components/ScreenDocumentContext.js +1 -1
  55. package/dist/screen/components/ScreenMount.d.ts +14 -3
  56. package/dist/screen/components/ScreenMount.js +1 -1
  57. package/dist/screen/components/ScreenStoreProvider.d.ts +20 -5
  58. package/dist/screen/components/ScreenStoreProvider.js +1 -1
  59. package/dist/screen/components/SectionScreenShell.js +16 -16
  60. package/dist/screen/components/SidePanelHead.js +1 -1
  61. package/dist/screen/components/panel-widths.js +1 -1
  62. package/dist/screen/components/usePartBridge.d.ts +20 -5
  63. package/dist/screen/components/usePartBridge.js +1 -1
  64. package/dist/screen/index.d.ts +17 -6
  65. package/dist/screen/index.js +1 -1
  66. package/dist/screen/lib/admin-bridge.d.ts +2 -0
  67. package/dist/screen/lib/admin-bridge.js +1 -1
  68. package/dist/screen/lib/backend-error.d.ts +20 -5
  69. package/dist/screen/lib/backend-error.js +1 -1
  70. package/dist/screen/lib/document-addressing.d.ts +2 -1
  71. package/dist/screen/lib/document-switch.js +1 -1
  72. package/dist/screen/lib/failure.d.ts +6 -2
  73. package/dist/screen/lib/failure.js +1 -1
  74. package/dist/screen/lib/host-inbound.js +1 -1
  75. package/dist/screen/lib/host.d.ts +3 -2
  76. package/dist/screen/lib/host.js +1 -1
  77. package/dist/screen/lib/key-scope.js +1 -1
  78. package/dist/screen/lib/load-error.d.ts +9 -3
  79. package/dist/screen/lib/load-error.js +1 -1
  80. package/dist/screen/lib/media-panel.d.ts +81 -17
  81. package/dist/screen/lib/media-panel.js +1 -1
  82. package/dist/screen/lib/media-picker.d.ts +14 -2
  83. package/dist/screen/lib/media-picker.js +1 -1
  84. package/dist/screen/lib/page-lock.d.ts +45 -1
  85. package/dist/screen/lib/page-lock.js +1 -1
  86. package/dist/screen/lib/puck/content-tree.d.ts +27 -1
  87. package/dist/screen/lib/puck/content-tree.js +1 -1
  88. package/dist/screen/lib/puck/palette-sections.d.ts +7 -0
  89. package/dist/screen/lib/puck/palette-sections.js +1 -1
  90. package/dist/screen/lib/puck/section-doc.js +1 -1
  91. package/dist/screen/lib/puck/slot-child-name.d.ts +42 -3
  92. package/dist/screen/lib/puck/slot-child-name.js +1 -1
  93. package/dist/screen/lib/puck/style-clipboard.d.ts +53 -1
  94. package/dist/screen/lib/puck/style-clipboard.js +1 -1
  95. package/dist/screen/lib/puck/use-section-ops.d.ts +6 -0
  96. package/dist/screen/lib/puck/use-section-ops.js +1 -1
  97. package/dist/screen/lib/screen-parts.d.ts +619 -10
  98. package/dist/screen/lib/screen-parts.js +1 -1
  99. package/dist/screen/lib/section-templates.d.ts +25 -1
  100. package/dist/screen/lib/section-templates.js +1 -1
  101. package/dist/screen/lib/session-context.d.ts +5 -1
  102. package/dist/screen/lib/session-context.js +1 -1
  103. package/dist/screen/lib/session.d.ts +58 -5
  104. package/dist/screen/lib/session.js +1 -1
  105. package/dist/screen/screen.css +18 -0
  106. package/dist/screen/words.d.ts +96 -2
  107. package/dist/screen/words.js +1 -1
  108. package/dist/strings/catalogue.d.ts +4 -2
  109. package/dist/strings/catalogue.js +1 -1
  110. package/dist/strings/index.d.ts +1 -1
  111. package/dist/strings/index.js +1 -1
  112. package/dist/tree/index.d.ts +4 -142
  113. package/dist/types-DJDBtdB2.d.ts +143 -0
  114. package/package.json +1 -1
  115. package/dist/chunk-3M3A3DN2.js +0 -4
  116. package/dist/chunk-4MXFKJUY.js +0 -1
  117. package/dist/chunk-6FY3PZS3.js +0 -1
  118. package/dist/chunk-A7ZJII7O.js +0 -1
  119. package/dist/chunk-AJBJ74ME.js +0 -1
  120. package/dist/chunk-AKZWUV5Z.js +0 -1
  121. package/dist/chunk-F6CCTEIX.js +0 -1
  122. package/dist/chunk-FUDHI5I4.js +0 -1
  123. package/dist/chunk-GENAF3P6.js +0 -1
  124. package/dist/chunk-HDKTR5TZ.js +0 -62
  125. package/dist/chunk-HMX55DYT.js +0 -1
  126. package/dist/chunk-HWW4XJOH.js +0 -1
  127. package/dist/chunk-JUQ6YJCG.js +0 -1
  128. package/dist/chunk-NBJ2YY6Y.js +0 -4
  129. package/dist/chunk-OORDMLL4.js +0 -5
  130. package/dist/chunk-Q2HPBMG5.js +0 -1
  131. package/dist/chunk-Q3SQBNJB.js +0 -1
  132. package/dist/chunk-R5ZVNJLJ.js +0 -2
  133. package/dist/chunk-SERF2FAU.js +0 -1
  134. package/dist/chunk-VV5ADNBR.js +0 -1
  135. package/dist/chunk-YJXEHK6I.js +0 -2
  136. package/dist/chunk-ZWK3CBRU.js +0 -1
  137. package/dist/chunk-ZZ7VLIHQ.js +0 -1
@@ -1 +1 @@
1
- export{SELECTION_MODE,ScreenPartsProvider,sameInspectorMode,useScreenBlockLook,useScreenBlockRules,useScreenBridges,useScreenCanvasFrame,useScreenDevices,useScreenDocumentPass,useScreenInspectorPanel,useScreenLeftView,useScreenOwnerName,useScreenParts,useScreenPinned,useScreenSaveSwitch,useStandaloneScreenBridges}from"../../chunk-NBJ2YY6Y.js";import"../../chunk-P67FP7PG.js";import"../../chunk-AELNNAFM.js";import"../../chunk-BXZ6WLHC.js";import"../../chunk-EOJNJCMJ.js";import"../../chunk-ZFDCDJNZ.js";import"../../chunk-ZNS7727Y.js";import"../../chunk-3EDSDPIP.js";import"../../chunk-QTLAVDJE.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-KTVH2ZRL.js";import"../../chunk-D2BCHTQR.js";import"../../chunk-EWVJSRRY.js";import"../../chunk-P6O363EE.js";import"../../chunk-FPOKPNO4.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-BZ5ASXOL.js";import"../../chunk-67GNT6PF.js";import"../../chunk-ZNCEOSXO.js";import"../../chunk-L5KW4HG5.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
1
+ export{SELECTION_MODE,ScreenCanvasTargetProvider,ScreenPartsProvider,isPinnedFirst,isPinnedLast,isSlotMode,sameInspectorMode,screenSlotsOf,useScreenAdd,useScreenBlockLook,useScreenBlockRules,useScreenBridges,useScreenCanvasDrag,useScreenCanvasFrame,useScreenCanvasHead,useScreenCanvasTarget,useScreenDevices,useScreenDocumentLabel,useScreenDocumentPass,useScreenInspectorPanel,useScreenLeftView,useScreenNodeKeys,useScreenNotify,useScreenOwnerName,useScreenParts,useScreenPickFollowsSelection,useScreenPinned,useScreenSaveSwitch,useScreenStyleClipboard,useStandaloneScreenBridges}from"../../chunk-VSHV6KJQ.js";import"../../chunk-PLVEGYK6.js";import"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-P67FP7PG.js";import"../../chunk-AELNNAFM.js";import"../../chunk-BXZ6WLHC.js";import"../../chunk-EOJNJCMJ.js";import"../../chunk-ZFDCDJNZ.js";import"../../chunk-ZNS7727Y.js";import"../../chunk-3EDSDPIP.js";import"../../chunk-QTLAVDJE.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-KTVH2ZRL.js";import"../../chunk-D2BCHTQR.js";import"../../chunk-EWVJSRRY.js";import"../../chunk-P6O363EE.js";import"../../chunk-FPOKPNO4.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-BZ5ASXOL.js";import"../../chunk-67GNT6PF.js";import"../../chunk-ZNCEOSXO.js";import"../../chunk-L5KW4HG5.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
@@ -1,5 +1,20 @@
1
1
  import { SectionTemplateStore } from './section-template-types.js';
2
+ import { EaselSession } from './session.js';
2
3
  import './puck/content-tree.js';
4
+ import '../../blocks/index.js';
5
+ import 'react';
6
+ import '../../types-E3HrTPg2.js';
7
+ import '../../data/index.js';
8
+ import '../../types-41704JE4.js';
9
+ import '../../resolve-D68pb3Bx.js';
10
+ import '../../plan-DChbUXdS.js';
11
+ import './backend-error.js';
12
+ import '../../edit-lock/index.js';
13
+ import './host-chrome.js';
14
+ import './links/link-filters.js';
15
+ import '../../LinkPicker-W2Rtxetz.js';
16
+ import './document-contract.js';
17
+ import './document-hooks.js';
3
18
 
4
19
  /**
5
20
  * The section templates of the editor on this page — whichever store its
@@ -18,6 +33,15 @@ import './puck/content-tree.js';
18
33
  * website's sections into the other's.
19
34
  */
20
35
 
36
+ /** The section templates of the editor on this page (`currentEaselSession`). */
21
37
  declare const sectionTemplates: SectionTemplateStore;
38
+ /**
39
+ * The section templates of ONE editor's session (0.103.0): what the screen's
40
+ * own Add panel lists, so an editor mounted beside the page's (a session made
41
+ * with `claimsPage: false`) lists its own backend's templates, never the page
42
+ * editor's. For the page's own editor it is the same store as
43
+ * {@link sectionTemplates}.
44
+ */
45
+ declare function sectionTemplatesOf(session: EaselSession): SectionTemplateStore;
22
46
 
23
- export { sectionTemplates };
47
+ export { sectionTemplates, sectionTemplatesOf };
@@ -1 +1 @@
1
- export{sectionTemplates}from"../../chunk-4MXFKJUY.js";import"../../chunk-KDYIMJTZ.js";import"../../chunk-AJBJ74ME.js";
1
+ export{sectionTemplates,sectionTemplatesOf}from"../../chunk-BVN33R76.js";import"../../chunk-KCOBHPN6.js";import"../../chunk-RSCMJIWS.js";
@@ -7,6 +7,8 @@ import '../../data/index.js';
7
7
  import '../../types-41704JE4.js';
8
8
  import '../../resolve-D68pb3Bx.js';
9
9
  import '../../plan-DChbUXdS.js';
10
+ import './backend-error.js';
11
+ import '../../edit-lock/index.js';
10
12
  import './host-chrome.js';
11
13
  import './links/link-filters.js';
12
14
  import '../../LinkPicker-W2Rtxetz.js';
@@ -18,7 +20,9 @@ import './puck/content-tree.js';
18
20
  /**
19
21
  * Hand `session` to the editor below, and make it the page's current one for
20
22
  * as long as this is mounted (see `activateEaselSession` for why it happens in
21
- * render AND in an effect).
23
+ * render AND in an effect) — unless it was made not to claim the page
24
+ * (`claimsPage: false`, 0.103.0): an editor mounted beside the page's is
25
+ * handed its session here and nowhere else.
22
26
  */
23
27
  declare function EaselSessionProvider({ session, children }: {
24
28
  session: EaselSession;
@@ -1 +1 @@
1
- export{EaselSessionProvider,useEaselSession}from"../../chunk-6TZTKAB5.js";import"../../chunk-AJBJ74ME.js";
1
+ export{EaselSessionProvider,useEaselSession}from"../../chunk-O7Q4DDJT.js";import"../../chunk-RSCMJIWS.js";
@@ -1,4 +1,5 @@
1
1
  import { Config } from '../../blocks/index.js';
2
+ import { HostFailures } from './backend-error.js';
2
3
  import { EaselChrome } from './host-chrome.js';
3
4
  import { WebsiteEditLock } from './document-contract.js';
4
5
  import { EaselDocumentHooks } from './document-hooks.js';
@@ -9,6 +10,7 @@ import '../../data/index.js';
9
10
  import '../../types-41704JE4.js';
10
11
  import '../../resolve-D68pb3Bx.js';
11
12
  import '../../plan-DChbUXdS.js';
13
+ import '../../edit-lock/index.js';
12
14
  import './links/link-filters.js';
13
15
  import '../../LinkPicker-W2Rtxetz.js';
14
16
  import './puck/content-tree.js';
@@ -38,6 +40,17 @@ import './puck/content-tree.js';
38
40
  * editor's last writes — the autosave's flush on unmount, the lock's release —
39
41
  * on its own backend and token while the next editor is already mounting.
40
42
  *
43
+ * AN EDITOR BESIDE IT (0.103.0). The admin portal mounts the campaign designer
44
+ * in one window while the website editor is open in another, in one page. The
45
+ * designer's session is made with `claimsPage: false`: it never becomes "the
46
+ * editor on this page", so the website's loaders and HTTP client go on reading
47
+ * the website's session (its token, its site, its backend), and the designer
48
+ * reads its own only through its provider and what it is handed to. What used
49
+ * to be one per page and is a host's own — the backend a session falls back on,
50
+ * how a host's client errors read — a session may carry for itself
51
+ * (`defaultBackend`, `hostFailures`), so the second host never has to replace
52
+ * the first host's page-wide registration to bring its own.
53
+ *
41
54
  * WHERE NO EDITOR IS MOUNTED — the shop's own pages, a dev harness, a guard —
42
55
  * there is the AMBIENT session: the EFFICIENT client, no token until somebody
43
56
  * sets one. That is exactly what the old singletons were.
@@ -141,6 +154,28 @@ interface EaselSession {
141
154
  * blocks — or null when it does nothing. Read once, with the backend.
142
155
  */
143
156
  readonly documentHooks: EaselDocumentHooks | null;
157
+ /**
158
+ * Whether this session is THE EDITOR ON THIS PAGE while it is mounted
159
+ * (0.103.0): the one {@link currentEaselSession} answers, which code outside
160
+ * the editor's React tree reads — a host's loaders, its HTTP client — and
161
+ * the holder of what the page has one of (the tab's block clipboard,
162
+ * components/NodeContextMenu). True, as every session was before.
163
+ *
164
+ * False for an editor mounted BESIDE the page's (the campaign designer in
165
+ * the admin, beside the website editor): mounting it leaves the page's
166
+ * current session as it was, it is read only through its provider
167
+ * (`useEaselSession`) and what it is handed to, and it keeps a block
168
+ * clipboard of its own registry's.
169
+ */
170
+ readonly claimsPage: boolean;
171
+ /**
172
+ * How the host's own client errors read, for this session's editor alone
173
+ * (lib/backend-error `HostFailures`, 0.103.0) — or null, and it reads them
174
+ * as the page's host said (`provideHostFailures`), as before. A host
175
+ * mounted beside another brings its own here rather than replacing the
176
+ * page's: the two are told apart by whose editor a failure happened in.
177
+ */
178
+ readonly hostFailures: HostFailures | null;
144
179
  /** The console's sign-in: the admin JWT and the legacy brand scope. */
145
180
  readonly auth: {
146
181
  token: string | null;
@@ -172,13 +207,16 @@ type DefaultBackend = (session: EaselSession) => SessionBackend;
172
207
  * A registration rather than an import, because the direction matters: the
173
208
  * editor is the builder's and a host's client is the host's (doc/adr/0002).
174
209
  * It is one default for the app, not a choice per editor — an embedder that
175
- * wants another backend for one editor passes `backend`, as before.
210
+ * wants another backend for one editor passes `backend`, as before, or a
211
+ * default of that session's own (`createEaselSession({ defaultBackend })`,
212
+ * 0.103.0), which this one never replaces and is never replaced by.
176
213
  */
177
214
  declare function provideDefaultBackend(make: DefaultBackend): void;
178
215
  /**
179
216
  * The backend one editor session talks to: the embedder's own when it supplied
180
- * one, else the host's default — one client per session, built the first time
181
- * it is asked for and bound to THAT session's token and website.
217
+ * one, else the session's own default when it was made with one, else the
218
+ * host's page-wide default — one client per session, built the first time it
219
+ * is asked for and bound to THAT session's token and website.
182
220
  *
183
221
  * Throws when there is neither: an editor with no backend can load and save
184
222
  * nothing, and falling back to "no pages" would look like an empty website.
@@ -200,18 +238,33 @@ declare function createEaselSession(options?: {
200
238
  registry?: Config | null;
201
239
  chrome?: EaselChrome | null;
202
240
  documentHooks?: EaselDocumentHooks | null;
241
+ /** Is this the editor on this page while it is mounted? Default true; see
242
+ * {@link EaselSession.claimsPage}. */
243
+ claimsPage?: boolean;
244
+ /** What makes this session's backend when `backend` is not given, in
245
+ * place of the page's (`provideDefaultBackend`), bound to this session.
246
+ * Default: the page's. A backend it makes waits for the console's token
247
+ * only when it is the EFFICIENT client (`EFFICIENT_BACKEND`). */
248
+ defaultBackend?: DefaultBackend | null;
249
+ /** How this session's host client errors read; default the page's. See
250
+ * {@link EaselSession.hostFailures}. */
251
+ hostFailures?: HostFailures | null;
203
252
  }): EaselSession;
204
253
  /** Record the website a session's open document belongs to. */
205
254
  declare function setSessionDocumentSite(session: EaselSession, siteId: string | null | undefined): void;
206
255
  /** Record the website the host bridged in with an auth grant. */
207
256
  declare function setSessionBridgedSite(session: EaselSession, siteId: string | null | undefined): void;
208
- /** The session of the editor mounted on this page — the ambient one when none is. */
257
+ /** The session of the editor mounted on this page — the ambient one when none is.
258
+ * Never a session made with `claimsPage: false`, mounted or not. */
209
259
  declare function currentEaselSession(): EaselSession;
210
260
  /**
211
261
  * Make `session` the page's current one. IDEMPOTENT, and called from two places
212
262
  * on purpose: while the editor RENDERS (so a child's effect — which runs before
213
263
  * its parent's — already reads the right session) and from the editor's own
214
264
  * effect (which is what survives React StrictMode's mount, unmount, mount).
265
+ *
266
+ * A session that does not claim the page (`claimsPage: false`) is left out,
267
+ * whoever asks: the editor beside the page's never takes its place.
215
268
  */
216
269
  declare function activateEaselSession(session: EaselSession): void;
217
270
  /**
@@ -252,4 +305,4 @@ declare function efficientClientOpen(): boolean;
252
305
  /** Start the ambient session again from nothing (tests; a guard between cases). */
253
306
  declare function resetAmbientEaselSession(): void;
254
307
 
255
- export { EFFICIENT_BACKEND, type EaselSession, type SessionBackend, type SessionBlocks, activateEaselSession, backendOf, createEaselSession, currentEaselSession, deactivateEaselSession, efficientClientOpen, isEfficientBackend, provideDefaultBackend, resetAmbientEaselSession, sessionRegistry, setSessionBridgedSite, setSessionDocumentSite };
308
+ export { type DefaultBackend, EFFICIENT_BACKEND, type EaselSession, type SessionBackend, type SessionBlocks, activateEaselSession, backendOf, createEaselSession, currentEaselSession, deactivateEaselSession, efficientClientOpen, isEfficientBackend, provideDefaultBackend, resetAmbientEaselSession, sessionRegistry, setSessionBridgedSite, setSessionDocumentSite };
@@ -1 +1 @@
1
- export{EFFICIENT_BACKEND,activateEaselSession,backendOf,createEaselSession,currentEaselSession,deactivateEaselSession,efficientClientOpen,isEfficientBackend,provideDefaultBackend,resetAmbientEaselSession,sessionRegistry,setSessionBridgedSite,setSessionDocumentSite}from"../../chunk-AJBJ74ME.js";
1
+ export{EFFICIENT_BACKEND,activateEaselSession,backendOf,createEaselSession,currentEaselSession,deactivateEaselSession,efficientClientOpen,isEfficientBackend,provideDefaultBackend,resetAmbientEaselSession,sessionRegistry,setSessionBridgedSite,setSessionDocumentSite}from"../../chunk-RSCMJIWS.js";
@@ -634,6 +634,24 @@
634
634
  padding: 0;
635
635
  }
636
636
 
637
+ /* A layer's HEAD OVER THE CANVAS (ScreenParts.CanvasHead, 0.105.0): the
638
+ campaign designer's Subject line and its dark mail app's bar, above the
639
+ email the way an inbox shows them. The well stacks the head over the device
640
+ sizer — the sizer still centred across it, as in a row — and the chrome
641
+ fits the frame to the height the head leaves (ScreenChrome `paneHeight`).
642
+ The head spans the well and is never scaled; what it draws in it is the
643
+ layer's. Only a well with a head wears the marker, so the website's well
644
+ keeps its row. */
645
+ .sf-center[data-sf-canvas-head] {
646
+ flex-direction: column;
647
+ justify-content: flex-start;
648
+ }
649
+ .sf-canvas-head {
650
+ flex: none;
651
+ align-self: stretch;
652
+ min-width: 0;
653
+ }
654
+
637
655
  /* ── Center: device-framed preview (wraps Puck.Preview) ──────────────── */
638
656
  .sf-frame {
639
657
  width: 100%;
@@ -1,7 +1,11 @@
1
1
  /**
2
2
  * The assembled screen's own words (`efficient-easel/strings`, group
3
3
  * `screen`): what it says while a document opens, what it says when one will
4
- * not, and the word it calls the document in the edit notice.
4
+ * not, the word it calls the document in the edit notice, and the words of
5
+ * the Layers tree's frame round the document's nodes (0.103.0): its first
6
+ * row, the pinned groups, the band of sections and the band's "+". And
7
+ * (0.105.0) the Add panel's words (`add`), the main button's, and what the
8
+ * block keys say when a block is copied or will not paste.
5
9
  *
6
10
  * They came with the screen from the website editor, written into the
7
11
  * provider, the mount and the notice; a second host (the campaign designer)
@@ -17,6 +21,57 @@
17
21
  * that is the layer's to say (`DocumentAddressing.describeMissing`): these are
18
22
  * the words the screen says when the layer says none.
19
23
  */
24
+ /**
25
+ * THE ADD PANEL'S WORDS (0.105.0, seam E9): its head, its groups, the line
26
+ * under its search and where the next thing goes. They were written into
27
+ * components/AddSidePanel and the chrome's `addAtLabel` in a website's words
28
+ * ("Drag onto the page", "Adding at the end of the page"); the campaign
29
+ * designer adds blocks to an email. The defaults are those words, word for
30
+ * word.
31
+ */
32
+ type ScreenAddWords = {
33
+ /** The panel head's title. */
34
+ title: string;
35
+ /** …its context line where only a place's blocks are offered… */
36
+ contextBlocks: string;
37
+ /** …and everywhere else. */
38
+ contextAll: string;
39
+ /** The head's way out, back to the view underneath, and what it does. */
40
+ done: string;
41
+ doneDescription: string;
42
+ /** The group of the section offered first (`blockLook.firstSection`). */
43
+ startBlank: string;
44
+ /** The group of the saved sections. */
45
+ templates: string;
46
+ /** The first heading over a container's blocks, naming it. */
47
+ inside: (v: {
48
+ name: string;
49
+ }) => string;
50
+ /** A tile's title, naming what it adds. */
51
+ tile: (v: {
52
+ name: string;
53
+ }) => string;
54
+ /** The line under the search where only a place's blocks are offered… */
55
+ hintBlocks: string;
56
+ /** …and everywhere else. */
57
+ hint: string;
58
+ /** The search box's name where only blocks are offered, and elsewhere. */
59
+ searchBlocks: string;
60
+ searchSections: string;
61
+ /** Where the next thing goes: into a container… */
62
+ addingTo: (v: {
63
+ name: string;
64
+ }) => string;
65
+ /** …before a section… */
66
+ addingBefore: (v: {
67
+ name: string;
68
+ }) => string;
69
+ /** …after the last one… */
70
+ addingAtEnd: string;
71
+ /** …and anywhere the screen cannot name. */
72
+ addingHere: string;
73
+ };
74
+ declare const DEFAULT_SCREEN_ADD_WORDS: ScreenAddWords;
20
75
  type ScreenWords = {
21
76
  /** While the document is on its way, and while an entry may still bounce. */
22
77
  loading: string;
@@ -36,7 +91,46 @@ type ScreenWords = {
36
91
  }) => string;
37
92
  /** What the document is called in the edit notice's sentences ("this page"). */
38
93
  noun: string;
94
+ /** The Layers tree's first row: the document's own settings, with nothing
95
+ * selected. */
96
+ pageSettings: string;
97
+ /** The group label over the node pinned first, and the name of its row
98
+ * where the layer names it none. */
99
+ header: string;
100
+ /** …and over the node pinned last. */
101
+ footer: string;
102
+ /** The label over the band of sections on a document with the edit guard
103
+ * (a website's page), where the layer gives the band none of its own. */
104
+ pageSections: string;
105
+ /** …and on a document without it (a website's template). */
106
+ templateSections: string;
107
+ /** The row that ends a band which offers one (`band.addAtEnd`). */
108
+ addSection: string;
109
+ /** The "+" in the gap above a section, named by the section it lands before. */
110
+ addSectionBefore: (v: {
111
+ name: string;
112
+ }) => string;
113
+ /** …and in a gap with no section after it. */
114
+ addSectionHere: string;
115
+ /**
116
+ * The top bar's main button (0.105.0). Owner ruling R3 (Victor Mau,
117
+ * 2026-10-09): BOTH editors' main button says Done. It still publishes a
118
+ * document that publishes and saves one that does not; only its word is
119
+ * one, where it said "Publish" or "Save".
120
+ */
121
+ done: string;
122
+ /** ⌘C on the selected block (0.105.0): the one of the block keys with
123
+ * nothing to see on the page, so it says so. */
124
+ copied: (v: {
125
+ name: string;
126
+ }) => string;
127
+ /** ⌘V where the held block has nowhere to go (0.105.0). */
128
+ pasteRefused: (v: {
129
+ name: string;
130
+ }) => string;
131
+ /** The Add panel's words (0.105.0). */
132
+ add: ScreenAddWords;
39
133
  };
40
134
  declare const DEFAULT_SCREEN_WORDS: ScreenWords;
41
135
 
42
- export { DEFAULT_SCREEN_WORDS, type ScreenWords };
136
+ export { DEFAULT_SCREEN_ADD_WORDS, DEFAULT_SCREEN_WORDS, type ScreenAddWords, type ScreenWords };
@@ -1 +1 @@
1
- export{DEFAULT_SCREEN_WORDS}from"../chunk-ZWK3CBRU.js";
1
+ export{DEFAULT_SCREEN_ADD_WORDS,DEFAULT_SCREEN_WORDS}from"../chunk-PQXIFBDY.js";
@@ -8,6 +8,7 @@ import { N as NodeMenuWords } from '../words-DMG4dYq2.js';
8
8
  import { P as PanelWords } from '../words-BGrHZAJJ.js';
9
9
  import { P as PickWords } from '../words-is_Vy6hn.js';
10
10
  import { ScreenWords } from '../screen/words.js';
11
+ export { ScreenAddWords } from '../screen/words.js';
11
12
  import { S as StyleClipboardWords } from '../words-CnnHb9jo.js';
12
13
  import { T as TextStylesWords } from '../words-CRYvAiHX.js';
13
14
  import { T as TreeWords } from '../words-DgHcY5qB.js';
@@ -110,8 +111,9 @@ interface EaselStrings {
110
111
  canvas: CanvasWords;
111
112
  /** `efficient-easel/text-styles` — the Email styles / Site styles list (E6). */
112
113
  textStyles: TextStylesWords;
113
- /** `efficient-easel/screen` — a document opening, one that will not, and the
114
- * notice's word for the document. */
114
+ /** `efficient-easel/screen` — a document opening, one that will not, the
115
+ * notice's word for the document, the Layers tree's frame, the Add panel,
116
+ * the main button and the block keys. */
115
117
  screen: ScreenWords;
116
118
  }
117
119
  /** Today's English, word for word. */
@@ -1 +1 @@
1
- export{DEFAULT_EASEL_STRINGS,mergeEaselStrings}from"../chunk-6UJ3Y6FC.js";import"../chunk-M6F6LS3H.js";import"../chunk-6WY6ZXJG.js";import"../chunk-ZWK3CBRU.js";import"../chunk-AELNNAFM.js";import"../chunk-3EDSDPIP.js";import"../chunk-QTLAVDJE.js";import"../chunk-WK3AFPXY.js";import"../chunk-H6DDIBQ4.js";import"../chunk-ZJEBF4NB.js";import"../chunk-RE4LP46F.js";import"../chunk-2OAZYSWJ.js";import"../chunk-UH7IGZKF.js";import"../chunk-ZAOM6PFH.js";import"../chunk-FPOKPNO4.js";import"../chunk-546BBOPE.js";import"../chunk-O2NLQBFX.js";
1
+ export{DEFAULT_EASEL_STRINGS,mergeEaselStrings}from"../chunk-53G47SWO.js";import"../chunk-M6F6LS3H.js";import"../chunk-6WY6ZXJG.js";import"../chunk-PQXIFBDY.js";import"../chunk-AELNNAFM.js";import"../chunk-3EDSDPIP.js";import"../chunk-QTLAVDJE.js";import"../chunk-WK3AFPXY.js";import"../chunk-H6DDIBQ4.js";import"../chunk-ZJEBF4NB.js";import"../chunk-RE4LP46F.js";import"../chunk-2OAZYSWJ.js";import"../chunk-UH7IGZKF.js";import"../chunk-ZAOM6PFH.js";import"../chunk-FPOKPNO4.js";import"../chunk-546BBOPE.js";import"../chunk-O2NLQBFX.js";
@@ -11,7 +11,7 @@ export { N as NodeMenuWords } from '../words-DMG4dYq2.js';
11
11
  export { P as PanelWords } from '../words-BGrHZAJJ.js';
12
12
  export { P as PickWords } from '../words-is_Vy6hn.js';
13
13
  export { S as SaveWords } from '../words-D_Lnw1Gr.js';
14
- export { ScreenWords } from '../screen/words.js';
14
+ export { ScreenAddWords, ScreenWords } from '../screen/words.js';
15
15
  export { S as StyleClipboardWords } from '../words-CnnHb9jo.js';
16
16
  export { T as TextStylesWords } from '../words-CRYvAiHX.js';
17
17
  export { T as TreeWords } from '../words-DgHcY5qB.js';
@@ -1,2 +1,2 @@
1
- import{DEFAULT_EASEL_STRINGS as r,mergeEaselStrings as n}from"../chunk-6UJ3Y6FC.js";export{DEFAULT_EASEL_STRINGS,mergeEaselStrings}from"../chunk-6UJ3Y6FC.js";import"../chunk-M6F6LS3H.js";import"../chunk-6WY6ZXJG.js";import"../chunk-ZWK3CBRU.js";import"../chunk-AELNNAFM.js";import"../chunk-3EDSDPIP.js";import"../chunk-QTLAVDJE.js";import"../chunk-WK3AFPXY.js";import"../chunk-H6DDIBQ4.js";import"../chunk-ZJEBF4NB.js";import"../chunk-RE4LP46F.js";import"../chunk-2OAZYSWJ.js";import"../chunk-UH7IGZKF.js";import"../chunk-ZAOM6PFH.js";import"../chunk-FPOKPNO4.js";import"../chunk-546BBOPE.js";import{stringsContext as o}from"../chunk-MFIRYGHW.js";import"../chunk-O2NLQBFX.js";import{useContext as t,useMemo as c}from"react";import{jsx as i}from"react/jsx-runtime";function s({value:s,locale:u,children:m}){const e=o(),p=t(e),h=p?.strings??r,j=u??p?.locale??"en",k=c(()=>({strings:n(h,s),locale:j}),[h,s,j]);/* @__PURE__ */
1
+ import{DEFAULT_EASEL_STRINGS as r,mergeEaselStrings as n}from"../chunk-53G47SWO.js";export{DEFAULT_EASEL_STRINGS,mergeEaselStrings}from"../chunk-53G47SWO.js";import"../chunk-M6F6LS3H.js";import"../chunk-6WY6ZXJG.js";import"../chunk-PQXIFBDY.js";import"../chunk-AELNNAFM.js";import"../chunk-3EDSDPIP.js";import"../chunk-QTLAVDJE.js";import"../chunk-WK3AFPXY.js";import"../chunk-H6DDIBQ4.js";import"../chunk-ZJEBF4NB.js";import"../chunk-RE4LP46F.js";import"../chunk-2OAZYSWJ.js";import"../chunk-UH7IGZKF.js";import"../chunk-ZAOM6PFH.js";import"../chunk-FPOKPNO4.js";import"../chunk-546BBOPE.js";import{stringsContext as o}from"../chunk-MFIRYGHW.js";import"../chunk-O2NLQBFX.js";import{useContext as t,useMemo as c}from"react";import{jsx as i}from"react/jsx-runtime";function s({value:s,locale:u,children:m}){const e=o(),p=t(e),h=p?.strings??r,j=u??p?.locale??"en",k=c(()=>({strings:n(h,s),locale:j}),[h,s,j]);/* @__PURE__ */
2
2
  return i(e.Provider,{value:k,children:m})}function u(){return t(o())?.strings??r}function m(){return t(o())?.locale??"en"}export{s as EaselStringsProvider,m as useEaselLocale,u as useEaselStrings};
@@ -1,145 +1,7 @@
1
1
  import * as react from 'react';
2
- import { ReactNode, HTMLAttributes, ButtonHTMLAttributes } from 'react';
3
- import { T as TreeWords } from '../words-DgHcY5qB.js';
4
-
5
- type LayersTreeProps = {
6
- /** Extra classes — a host's scroll-bar class, for instance. */
7
- className?: string;
8
- children?: ReactNode;
9
- /** Attributes for the tree's root — `efficient-easel/drag`'s `rootProps()`. */
10
- rootProps?: HTMLAttributes<HTMLDivElement>;
11
- };
12
- type TreeGroupLabelProps = {
13
- children: ReactNode;
14
- };
15
- type SubtreeProps = {
16
- children?: ReactNode;
17
- };
18
- type TreeRowFold = {
19
- /** Whether the row's subtree is showing. */
20
- open: boolean;
21
- /** What folds, in lower case — "section", "column". The caret reads "Collapse section". */
22
- label: string;
23
- onToggle: () => void;
24
- };
25
- type TreeRowProps = {
26
- /** A 13px glyph for the row's type. */
27
- icon: ReactNode;
28
- /** The row's name — the type's label, or a name the person gave it. */
29
- name: ReactNode;
30
- /**
31
- * The thing's own first words, drawn quieter after the name — "Text BACK IN
32
- * STOCK NOW". NEW in 0.42.0: a tree of fifteen rows called "Section" cannot be
33
- * searched by eye. The host decides the words and shortens them.
34
- */
35
- preview?: ReactNode;
36
- selected?: boolean;
37
- /** Hidden from the page: the name is struck through and the eye stays showing. */
38
- hidden?: boolean;
39
- /**
40
- * The row can be picked up — whole, by `efficient-easel/drag` (0.74.0). It says
41
- * so four ways: a faint ⋮ at its left on hover, the grab cursor, a hint after
42
- * 0.7 s ("Drag to move · ⌥↑ ⌥↓"), and the row lifted with a shadow while it
43
- * moves. A draggable row draws no `handle`: the row IS the handle.
44
- */
45
- draggable?: boolean;
46
- /** The hint a draggable row shows after 0.7 s. Default `words.dragHint`: "Drag to move · ⌥↑ ⌥↓". */
47
- dragHint?: string;
48
- /** This row is being dragged. */
49
- dragging?: boolean;
50
- /** Where a drop would land relative to this row, while a drag is over it. */
51
- drop?: 'before' | 'after' | 'into';
52
- /** Present when the row folds; the row leads with its caret. Absent: the caret column is held open. */
53
- fold?: TreeRowFold;
54
- /**
55
- * Props for the drag handle button (the host's drag-and-drop wiring). Absent:
56
- * no handle. The handle is the ONLY drag source, so it is hidden with opacity
57
- * and never made unreachable.
58
- *
59
- * @deprecated since 0.74.0 — a row driven by `efficient-easel/drag` is picked
60
- * up whole (`draggable`), and a draggable row draws no handle. Kept until both
61
- * editors have moved (blueprint 3.3 / 3.4).
62
- */
63
- handle?: ButtonHTMLAttributes<HTMLButtonElement>;
64
- /** `TreeRowAction`s — laid over the END of the name, shown on hover and focus. */
65
- actions?: ReactNode;
66
- /** Stands in for the name — a rename box. It must not move the row by a pixel. */
67
- nameSlot?: ReactNode;
68
- /**
69
- * Selects the row. Present: the name box becomes a real <button> — Enter and
70
- * Space select from the keyboard — and a selected row says `aria-current`.
71
- * Absent: the row selects through `rowProps.onClick`, as 0.42.0 did.
72
- */
73
- onSelect?: () => void;
74
- /** Named state glyphs drawn right after the name — "Hidden on phones". */
75
- marks?: ReadonlyArray<TreeRowMark>;
76
- /** A count or position pill after the name — "1 of 2". */
77
- badge?: ReactNode;
78
- /** A non-interactive mark at the row's end — the Lock on a pinned section. */
79
- trailing?: {
80
- label: string;
81
- icon: ReactNode;
82
- };
83
- /** Drawn inside the row after everything else: overlays such as a drop line. */
84
- children?: ReactNode;
85
- /** Attributes for the row itself: onClick, drag-over handlers, data-*. */
86
- rowProps?: HTMLAttributes<HTMLDivElement> & Record<`data-${string}`, string | number | undefined>;
87
- /**
88
- * The row's own words — the drag hint and the caret's — in the host's
89
- * language: `useEaselStrings().tree` (0.95.0). Left out, English. `dragHint`
90
- * above still wins for its one line.
91
- */
92
- words?: TreeWords;
93
- };
94
- type TreeRowMark = {
95
- key: string;
96
- /** Tooltip and accessible name — the mark is a picture of a state. */
97
- label: string;
98
- icon: ReactNode;
99
- };
100
- type TreeRowActionProps = {
101
- /**
102
- * `delete` is the red trash; `eye` shows or hides; `plain` is any other action
103
- * (a phone toggle, "Duplicate column") in the neutral colour.
104
- */
105
- kind: 'delete' | 'eye' | 'plain';
106
- /** For a toggle: whether it is on. Adds aria-pressed and keeps it visible at rest. */
107
- pressed?: boolean;
108
- disabled?: boolean;
109
- /** Tooltip and accessible name — "Delete Text", "Show Section". */
110
- label: string;
111
- onClick: () => void;
112
- children: ReactNode;
113
- };
114
- type TreeEmptySlotProps = {
115
- /** A drag is over the slot and may land in it: it lights up and says "Drop here". */
116
- drop?: boolean;
117
- /** Present: the box is a button that adds here (it opens the Add panel at this place). */
118
- onAdd?: () => void;
119
- /**
120
- * What the box says at rest. Default `words.addBlock` ("Add a block") with
121
- * `onAdd`, `words.emptySlot` ("No blocks yet") without.
122
- */
123
- label?: string;
124
- /**
125
- * The drag handlers — `efficient-easel/drag`'s
126
- * `seam({ place: { ...list, index: 0 } }).seamProps`: an empty list has one
127
- * place, its start.
128
- */
129
- seamProps?: HTMLAttributes<HTMLDivElement>;
130
- /** The box's own words in the host's language: `useEaselStrings().tree`. Left out, English. */
131
- words?: TreeWords;
132
- };
133
- type TreeSeamProps = {
134
- /** A drag is over this gap and may land in it: draw the drop line. */
135
- drop?: boolean;
136
- /** Present: the gap offers a "+" that adds here (it opens the Add panel at this place). */
137
- onAdd?: () => void;
138
- /** The "+"'s accessible name and tooltip — "Add block here". Required with `onAdd`. */
139
- label?: string;
140
- /** The drag handlers — `efficient-easel/drag`'s `seam(…).seamProps`. */
141
- seamProps?: HTMLAttributes<HTMLDivElement>;
142
- };
2
+ import { L as LayersTreeProps, S as SubtreeProps, a as TreeGroupLabelProps, b as TreeEmptySlotProps, c as TreeRowProps, d as TreeRowActionProps, e as TreeSeamProps } from '../types-DJDBtdB2.js';
3
+ export { f as TreeRowFold, T as TreeRowMark } from '../types-DJDBtdB2.js';
4
+ export { T as TreeWords } from '../words-DgHcY5qB.js';
143
5
 
144
6
  /**
145
7
  * The Layers tree's container. It declares the TREE's own rhythm — 10px above a
@@ -211,4 +73,4 @@ declare function TreeSeam({ drop, onAdd, label, seamProps }: TreeSeamProps): rea
211
73
  */
212
74
  declare function TreeEmptySlot({ drop, onAdd, label, seamProps, words }: TreeEmptySlotProps): react.JSX.Element;
213
75
 
214
- export { LayersTree, type LayersTreeProps, Subtree, type SubtreeProps, TREE_DRAG_HINT, TreeEmptySlot, type TreeEmptySlotProps, TreeGroupLabel, type TreeGroupLabelProps, TreeRow, TreeRowAction, type TreeRowActionProps, type TreeRowFold, type TreeRowMark, type TreeRowProps, TreeSeam, type TreeSeamProps, TreeWords };
76
+ export { LayersTree, LayersTreeProps, Subtree, SubtreeProps, TREE_DRAG_HINT, TreeEmptySlot, TreeEmptySlotProps, TreeGroupLabel, TreeGroupLabelProps, TreeRow, TreeRowAction, TreeRowActionProps, TreeRowProps, TreeSeam, TreeSeamProps };