efficient-easel 0.101.1 → 0.103.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 (234) hide show
  1. package/README.md +51 -0
  2. package/dist/LinkPicker-W2Rtxetz.d.ts +111 -0
  3. package/dist/autosave/index.d.ts +6 -3
  4. package/dist/autosave/index.js +1 -1
  5. package/dist/chrome/index.d.ts +3 -2
  6. package/dist/chrome/index.js +1 -25
  7. package/dist/chunk-26OOWIJJ.js +1 -0
  8. package/dist/chunk-2LK54I4E.js +1 -0
  9. package/dist/chunk-3M3A3DN2.js +4 -0
  10. package/dist/chunk-3QVB4AG2.js +3 -0
  11. package/dist/chunk-3WSPDAK2.js +1 -0
  12. package/dist/chunk-4ES5JGGX.js +1 -0
  13. package/dist/chunk-4MXFKJUY.js +1 -0
  14. package/dist/chunk-57DJOKXT.js +1 -0
  15. package/dist/chunk-5MZ3RNQQ.js +13 -0
  16. package/dist/chunk-5ZBY24K7.js +1 -0
  17. package/dist/chunk-66ICOE3I.js +8 -0
  18. package/dist/chunk-6DJHRLCU.js +25 -0
  19. package/dist/chunk-6FY3PZS3.js +1 -0
  20. package/dist/chunk-6TZTKAB5.js +1 -0
  21. package/dist/chunk-6UJ3Y6FC.js +1 -0
  22. package/dist/chunk-6W7WLPZH.js +1 -0
  23. package/dist/chunk-7F52SZOI.js +2 -0
  24. package/dist/chunk-7MU3RJ6S.js +1 -0
  25. package/dist/chunk-A7ZJII7O.js +1 -0
  26. package/dist/chunk-AJBJ74ME.js +1 -0
  27. package/dist/chunk-AKFJK65Z.js +1 -0
  28. package/dist/chunk-AKZWUV5Z.js +1 -0
  29. package/dist/chunk-BDTITTMW.js +1 -0
  30. package/dist/chunk-BSPCSC45.js +1 -0
  31. package/dist/chunk-BXZ6WLHC.js +22 -0
  32. package/dist/chunk-DUVRZ456.js +1 -0
  33. package/dist/chunk-F6CCTEIX.js +1 -0
  34. package/dist/chunk-FGNR22NY.js +1 -0
  35. package/dist/chunk-FUDHI5I4.js +1 -0
  36. package/dist/chunk-GENAF3P6.js +1 -0
  37. package/dist/chunk-GOTN2KY4.js +2 -0
  38. package/dist/chunk-GXN65JMA.js +1 -0
  39. package/dist/chunk-GXQCZJOP.js +1 -0
  40. package/dist/chunk-GZO72N3Q.js +0 -0
  41. package/dist/chunk-HDKTR5TZ.js +62 -0
  42. package/dist/chunk-HMX55DYT.js +1 -0
  43. package/dist/chunk-HQ4VVRIC.js +1 -0
  44. package/dist/chunk-HWW4XJOH.js +1 -0
  45. package/dist/chunk-I54UCYOU.js +1 -0
  46. package/dist/chunk-IQ5TA7AM.js +1 -0
  47. package/dist/chunk-IWAPPEL4.js +6 -0
  48. package/dist/chunk-IYT6NN2J.js +1 -0
  49. package/dist/chunk-KCBEE2MC.js +2 -0
  50. package/dist/chunk-KDYIMJTZ.js +1 -0
  51. package/dist/chunk-KQMML6JM.js +4 -0
  52. package/dist/chunk-LG436UTD.js +1 -0
  53. package/dist/chunk-MSBF7IW3.js +2 -0
  54. package/dist/chunk-NBJ2YY6Y.js +4 -0
  55. package/dist/chunk-OM67AJQC.js +1 -0
  56. package/dist/chunk-OORDMLL4.js +5 -0
  57. package/dist/chunk-OYX47SL7.js +1 -0
  58. package/dist/chunk-P67FP7PG.js +9 -0
  59. package/dist/chunk-PWZOS45R.js +2 -0
  60. package/dist/chunk-Q2HPBMG5.js +1 -0
  61. package/dist/chunk-Q3SQBNJB.js +1 -0
  62. package/dist/chunk-R2HLPNQF.js +1 -0
  63. package/dist/chunk-R5L2E7JX.js +1 -0
  64. package/dist/chunk-R5ZVNJLJ.js +2 -0
  65. package/dist/chunk-RLBXE4EU.js +1 -0
  66. package/dist/chunk-RW4XBUUW.js +1 -0
  67. package/dist/chunk-SERF2FAU.js +1 -0
  68. package/dist/chunk-TTJ54QGG.js +18 -0
  69. package/dist/chunk-VV5ADNBR.js +1 -0
  70. package/dist/chunk-YJXEHK6I.js +2 -0
  71. package/dist/chunk-Z3KBLIEH.js +10 -0
  72. package/dist/chunk-ZE7I3PLX.js +1 -0
  73. package/dist/chunk-ZWK3CBRU.js +1 -0
  74. package/dist/chunk-ZZ7VLIHQ.js +1 -0
  75. package/dist/drag/index.d.ts +3 -41
  76. package/dist/drag/index.js +1 -18
  77. package/dist/easel/index.js +1 -9
  78. package/dist/{words-BMzV04b1.d.ts → engine-DBxp_v6B.d.ts} +1 -58
  79. package/dist/fields/index.d.ts +2 -109
  80. package/dist/fields/index.js +1 -22
  81. package/dist/gold/index.d.ts +4 -2
  82. package/dist/host-DJ8Gzsx7.d.ts +552 -0
  83. package/dist/menu/index.js +1 -1
  84. package/dist/node-ops/index.js +1 -1
  85. package/dist/panelWidths-D9hTLR25.d.ts +66 -0
  86. package/dist/screen/components/AddBlockRow.d.ts +14 -0
  87. package/dist/screen/components/AddBlockRow.js +1 -0
  88. package/dist/screen/components/AddChildRow.d.ts +39 -0
  89. package/dist/screen/components/AddChildRow.js +1 -0
  90. package/dist/screen/components/AddSidePanel.d.ts +54 -0
  91. package/dist/screen/components/AddSidePanel.js +1 -0
  92. package/dist/screen/components/MediaSidePanel.d.ts +47 -0
  93. package/dist/screen/components/MediaSidePanel.js +1 -0
  94. package/dist/screen/components/NodeContextMenu.d.ts +364 -0
  95. package/dist/screen/components/NodeContextMenu.js +1 -0
  96. package/dist/screen/components/PageEditGuardNotices.d.ts +5 -0
  97. package/dist/screen/components/PageEditGuardNotices.js +1 -0
  98. package/dist/screen/components/PanelToggleIcon.d.ts +14 -0
  99. package/dist/screen/components/PanelToggleIcon.js +1 -0
  100. package/dist/screen/components/PreviewDeviceContext.d.ts +28 -0
  101. package/dist/screen/components/PreviewDeviceContext.js +1 -0
  102. package/dist/screen/components/PreviewPartsContext.d.ts +33 -0
  103. package/dist/screen/components/PreviewPartsContext.js +1 -0
  104. package/dist/screen/components/ScreenChrome.d.ts +5 -0
  105. package/dist/screen/components/ScreenChrome.js +1 -0
  106. package/dist/screen/components/ScreenDocumentContext.d.ts +20 -0
  107. package/dist/screen/components/ScreenDocumentContext.js +1 -0
  108. package/dist/screen/components/ScreenMount.d.ts +76 -0
  109. package/dist/screen/components/ScreenMount.js +1 -0
  110. package/dist/screen/components/ScreenStoreProvider.d.ts +63 -0
  111. package/dist/screen/components/ScreenStoreProvider.js +1 -0
  112. package/dist/screen/components/SectionScreenShell.d.ts +5 -0
  113. package/dist/screen/components/SectionScreenShell.js +16 -0
  114. package/dist/screen/components/SidePanelHead.d.ts +81 -0
  115. package/dist/screen/components/SidePanelHead.js +1 -0
  116. package/dist/screen/components/SlotChildActionsContext.d.ts +41 -0
  117. package/dist/screen/components/SlotChildActionsContext.js +1 -0
  118. package/dist/screen/components/UiIcon.d.ts +52 -0
  119. package/dist/screen/components/UiIcon.js +1 -0
  120. package/dist/screen/components/panel-widths.d.ts +37 -0
  121. package/dist/screen/components/panel-widths.js +1 -0
  122. package/dist/screen/components/usePartBridge.d.ts +66 -0
  123. package/dist/screen/components/usePartBridge.js +1 -0
  124. package/dist/screen/index.d.ts +31 -0
  125. package/dist/screen/index.js +1 -0
  126. package/dist/screen/lib/admin-bridge.d.ts +105 -0
  127. package/dist/screen/lib/admin-bridge.js +1 -0
  128. package/dist/screen/lib/backend-error.d.ts +106 -0
  129. package/dist/screen/lib/backend-error.js +1 -0
  130. package/dist/screen/lib/chrome-theme.d.ts +21 -0
  131. package/dist/screen/lib/chrome-theme.js +1 -0
  132. package/dist/screen/lib/client-only.d.ts +24 -0
  133. package/dist/screen/lib/client-only.js +1 -0
  134. package/dist/screen/lib/content/view-tiers.d.ts +25 -0
  135. package/dist/screen/lib/content/view-tiers.js +1 -0
  136. package/dist/screen/lib/document-addressing.d.ts +20 -0
  137. package/dist/screen/lib/document-addressing.js +1 -0
  138. package/dist/screen/lib/document-contract.d.ts +237 -0
  139. package/dist/screen/lib/document-contract.js +1 -0
  140. package/dist/screen/lib/document-hooks.d.ts +71 -0
  141. package/dist/screen/lib/document-hooks.js +0 -0
  142. package/dist/screen/lib/document-switch.d.ts +74 -0
  143. package/dist/screen/lib/document-switch.js +1 -0
  144. package/dist/screen/lib/failure.d.ts +54 -0
  145. package/dist/screen/lib/failure.js +1 -0
  146. package/dist/screen/lib/host-chrome.d.ts +181 -0
  147. package/dist/screen/lib/host-chrome.js +1 -0
  148. package/dist/screen/lib/host-inbound.d.ts +20 -0
  149. package/dist/screen/lib/host-inbound.js +1 -0
  150. package/dist/screen/lib/host.d.ts +20 -0
  151. package/dist/screen/lib/host.js +1 -0
  152. package/dist/screen/lib/key-scope.d.ts +23 -0
  153. package/dist/screen/lib/key-scope.js +1 -0
  154. package/dist/screen/lib/links/link-filters.d.ts +41 -0
  155. package/dist/screen/lib/links/link-filters.js +0 -0
  156. package/dist/screen/lib/load-error.d.ts +29 -0
  157. package/dist/screen/lib/load-error.js +1 -0
  158. package/dist/screen/lib/media-panel.d.ts +94 -0
  159. package/dist/screen/lib/media-panel.js +1 -0
  160. package/dist/screen/lib/media-picker.d.ts +68 -0
  161. package/dist/screen/lib/media-picker.js +1 -0
  162. package/dist/screen/lib/page-lock.d.ts +5 -0
  163. package/dist/screen/lib/page-lock.js +1 -0
  164. package/dist/screen/lib/puck/add-target-types.d.ts +55 -0
  165. package/dist/screen/lib/puck/add-target-types.js +0 -0
  166. package/dist/screen/lib/puck/block-choice.d.ts +52 -0
  167. package/dist/screen/lib/puck/block-choice.js +1 -0
  168. package/dist/screen/lib/puck/block-types-in.d.ts +39 -0
  169. package/dist/screen/lib/puck/block-types-in.js +1 -0
  170. package/dist/screen/lib/puck/content-tree.d.ts +196 -0
  171. package/dist/screen/lib/puck/content-tree.js +1 -0
  172. package/dist/screen/lib/puck/device-fields.d.ts +128 -0
  173. package/dist/screen/lib/puck/device-fields.js +1 -0
  174. package/dist/screen/lib/puck/field-buckets.d.ts +22 -0
  175. package/dist/screen/lib/puck/field-buckets.js +1 -0
  176. package/dist/screen/lib/puck/field-markers.d.ts +205 -0
  177. package/dist/screen/lib/puck/field-markers.js +1 -0
  178. package/dist/screen/lib/puck/hidable.d.ts +44 -0
  179. package/dist/screen/lib/puck/hidable.js +1 -0
  180. package/dist/screen/lib/puck/palette-sections.d.ts +96 -0
  181. package/dist/screen/lib/puck/palette-sections.js +1 -0
  182. package/dist/screen/lib/puck/panel-fields.d.ts +47 -0
  183. package/dist/screen/lib/puck/panel-fields.js +1 -0
  184. package/dist/screen/lib/puck/panel-no-control-mark.d.ts +74 -0
  185. package/dist/screen/lib/puck/panel-no-control-mark.js +1 -0
  186. package/dist/screen/lib/puck/part-id.d.ts +23 -0
  187. package/dist/screen/lib/puck/part-id.js +1 -0
  188. package/dist/screen/lib/puck/preview-click.d.ts +49 -0
  189. package/dist/screen/lib/puck/preview-click.js +1 -0
  190. package/dist/screen/lib/puck/preview-dom.d.ts +8 -0
  191. package/dist/screen/lib/puck/preview-dom.js +1 -0
  192. package/dist/screen/lib/puck/preview-events.d.ts +25 -0
  193. package/dist/screen/lib/puck/preview-events.js +1 -0
  194. package/dist/screen/lib/puck/preview-selection-context.d.ts +72 -0
  195. package/dist/screen/lib/puck/preview-selection-context.js +1 -0
  196. package/dist/screen/lib/puck/section-doc.d.ts +20 -0
  197. package/dist/screen/lib/puck/section-doc.js +1 -0
  198. package/dist/screen/lib/puck/slot-child-name.d.ts +186 -0
  199. package/dist/screen/lib/puck/slot-child-name.js +1 -0
  200. package/dist/screen/lib/puck/slot-heal.d.ts +5 -0
  201. package/dist/screen/lib/puck/slot-heal.js +1 -0
  202. package/dist/screen/lib/puck/slot-section-spec.d.ts +96 -0
  203. package/dist/screen/lib/puck/slot-section-spec.js +0 -0
  204. package/dist/screen/lib/puck/style-clipboard.d.ts +78 -0
  205. package/dist/screen/lib/puck/style-clipboard.js +1 -0
  206. package/dist/screen/lib/puck/text-control-kinds.d.ts +71 -0
  207. package/dist/screen/lib/puck/text-control-kinds.js +1 -0
  208. package/dist/screen/lib/puck/tree-reveal.d.ts +62 -0
  209. package/dist/screen/lib/puck/tree-reveal.js +1 -0
  210. package/dist/screen/lib/puck/use-section-ops.d.ts +86 -0
  211. package/dist/screen/lib/puck/use-section-ops.js +1 -0
  212. package/dist/screen/lib/screen-parts.d.ts +748 -0
  213. package/dist/screen/lib/screen-parts.js +1 -0
  214. package/dist/screen/lib/section-template-types.d.ts +49 -0
  215. package/dist/screen/lib/section-template-types.js +0 -0
  216. package/dist/screen/lib/section-templates.d.ts +23 -0
  217. package/dist/screen/lib/section-templates.js +1 -0
  218. package/dist/screen/lib/session-context.d.ts +30 -0
  219. package/dist/screen/lib/session-context.js +1 -0
  220. package/dist/screen/lib/session.d.ts +255 -0
  221. package/dist/screen/lib/session.js +1 -0
  222. package/dist/screen/screen.css +1102 -0
  223. package/dist/screen/words.d.ts +42 -0
  224. package/dist/screen/words.js +1 -0
  225. package/dist/session-DSQFmIvx.d.ts +43 -0
  226. package/dist/strings/catalogue.d.ts +13 -4
  227. package/dist/strings/catalogue.js +1 -1
  228. package/dist/strings/index.d.ts +5 -2
  229. package/dist/strings/index.js +1 -1
  230. package/dist/style-clipboard/index.js +1 -1
  231. package/dist/{types-DGcCsxs8.d.ts → types-CqY85foL.d.ts} +3 -65
  232. package/dist/words-D_Lnw1Gr.d.ts +59 -0
  233. package/package.json +348 -2
  234. package/dist/chunk-IG3U5NWJ.js +0 -1
@@ -0,0 +1,42 @@
1
+ /**
2
+ * The assembled screen's own words (`efficient-easel/strings`, group
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.
5
+ *
6
+ * They came with the screen from the website editor, written into the
7
+ * provider, the mount and the notice; a second host (the campaign designer)
8
+ * opens campaigns, not storefront pages, and says so in its own words. So the
9
+ * defaults are the website's English, word for word, and a host lays its own
10
+ * over them with `EaselStringsProvider`.
11
+ *
12
+ * A plain module with no import: the catalogue reads it, and the catalogue
13
+ * imports nothing (`tests/strings-leaf-safety.test.ts`). Anything with a value
14
+ * in it is a function.
15
+ *
16
+ * What a sentence for a MISSING document is can also depend on the target, and
17
+ * that is the layer's to say (`DocumentAddressing.describeMissing`): these are
18
+ * the words the screen says when the layer says none.
19
+ */
20
+ type ScreenWords = {
21
+ /** While the document is on its way, and while an entry may still bounce. */
22
+ loading: string;
23
+ /** Before the console's sign-in has reached an editor that needs it. */
24
+ waitingForAuthorization: string;
25
+ /** A website template's page that could not be opened. */
26
+ missingTemplatePage: string;
27
+ /** A website page that is not there, by the slug it was asked for. */
28
+ missingPage: (v: {
29
+ slug: string;
30
+ }) => string;
31
+ /** A host's own document (`{ kind: "document" }`) that is not there. */
32
+ missingDocument: string;
33
+ /** A load that failed: the plain lead-in, then what came back (`cause`). */
34
+ loadFailed: (v: {
35
+ cause: string;
36
+ }) => string;
37
+ /** What the document is called in the edit notice's sentences ("this page"). */
38
+ noun: string;
39
+ };
40
+ declare const DEFAULT_SCREEN_WORDS: ScreenWords;
41
+
42
+ export { DEFAULT_SCREEN_WORDS, type ScreenWords };
@@ -0,0 +1 @@
1
+ export{DEFAULT_SCREEN_WORDS}from"../chunk-ZWK3CBRU.js";
@@ -0,0 +1,43 @@
1
+ import { P as Place } from './types-41704JE4.js';
2
+
3
+ /**
4
+ * The one drag in flight, shared by every surface of an editor — the Layers
5
+ * tree, the canvas and the Add list (blueprint step 3.2).
6
+ *
7
+ * Native drag-and-drop does not let a drop target read what is being dragged
8
+ * until the drop itself (the data is sealed during `dragover`), and a tree that
9
+ * only knows about drags it started cannot take a block from the Add list. So
10
+ * the surface that starts a drag writes it here and every surface reads it: a
11
+ * block picked up on the canvas can land in the tree, a tile from the Add list
12
+ * on either.
13
+ *
14
+ * `from` is where the thing sits now — absent for something new (an Add tile),
15
+ * which is also why a new thing can never be a no-op drop.
16
+ */
17
+
18
+ type DragHeld<I> = {
19
+ /** The identity `keyOf` gave it — which row or box is the one being dragged. */
20
+ key: string;
21
+ item: I;
22
+ /** Where it sits now. Absent: it is new, from the Add list. */
23
+ from?: Place;
24
+ };
25
+ type DragSession<I> = {
26
+ /** The drag in flight, current at once (for event handlers). */
27
+ get: () => DragHeld<I> | null;
28
+ /** The drag as last TOLD to subscribers (for rendering — see below). */
29
+ shown: () => DragHeld<I> | null;
30
+ start: (held: DragHeld<I>) => void;
31
+ end: () => void;
32
+ subscribe: (listener: () => void) => () => void;
33
+ };
34
+ /**
35
+ * `get()` is current the moment a drag starts — the drop targets read it on
36
+ * their first `dragover`. SUBSCRIBERS hear about a start one tick later: the
37
+ * browser takes the drag picture when the `dragstart` handlers return, and a
38
+ * render in between (a row dimming, the handle hiding) would be in the picture.
39
+ * An end is told at once.
40
+ */
41
+ declare function createDragSession<I>(): DragSession<I>;
42
+
43
+ export { type DragSession as D, type DragHeld as a, createDragSession as c };
@@ -1,4 +1,4 @@
1
- import { S as SaveWords } from '../words-BMzV04b1.js';
1
+ import { S as SaveWords } from '../words-D_Lnw1Gr.js';
2
2
  import { N as NoticeWords, C as ChromeWords } from '../words-AHHfiaRY.js';
3
3
  import { C as CopyWords } from '../words-XH0TvZPg.js';
4
4
  import { D as DragWords } from '../words-BDignMl_.js';
@@ -7,13 +7,16 @@ import { F as FieldsWords } from '../words-D8kf071T.js';
7
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
+ import { ScreenWords } from '../screen/words.js';
10
11
  import { S as StyleClipboardWords } from '../words-CnnHb9jo.js';
11
12
  import { T as TextStylesWords } from '../words-CRYvAiHX.js';
12
13
  import { T as TreeWords } from '../words-DgHcY5qB.js';
13
- import '../types-DGcCsxs8.js';
14
+ import '../types-CqY85foL.js';
14
15
  import '../types-DWS-s9z-.js';
15
16
  import '../wordFit-D4S36PvB.js';
16
17
  import 'react';
18
+ import '../panelWidths-D9hTLR25.js';
19
+ import '../engine-DBxp_v6B.js';
17
20
  import '../markup/index.js';
18
21
  import '../buckets-CuLM47h9.js';
19
22
 
@@ -49,7 +52,10 @@ type RailWords = {
49
52
  * Every word and sentence this package itself draws or returns — visible text,
50
53
  * `aria-label`s, tooltips, placeholders — is an entry here, grouped by the
51
54
  * module that says it. What a HOST supplies (a block's name, a field's label, a
52
- * tile's caption, the document's noun) was never the engine's and is not here.
55
+ * tile's caption, the document's noun) was never the engine's and is not here —
56
+ * with one exception: the assembled screen (`efficient-easel/screen`) draws the
57
+ * edit notice itself, so the noun it says it with is a word of its own group,
58
+ * the website's "page" until a host says another.
53
59
  *
54
60
  * - A plain word is a `string`.
55
61
  * - Anything with a value in it, or a count that can be one or many, is a
@@ -104,6 +110,9 @@ interface EaselStrings {
104
110
  canvas: CanvasWords;
105
111
  /** `efficient-easel/text-styles` — the Email styles / Site styles list (E6). */
106
112
  textStyles: TextStylesWords;
113
+ /** `efficient-easel/screen` — a document opening, one that will not, and the
114
+ * notice's word for the document. */
115
+ screen: ScreenWords;
107
116
  }
108
117
  /** Today's English, word for word. */
109
118
  declare const DEFAULT_EASEL_STRINGS: EaselStrings;
@@ -122,4 +131,4 @@ type DeepPartial<T> = T extends (...args: never[]) => unknown ? T : T extends ob
122
131
  */
123
132
  declare function mergeEaselStrings(defaults: EaselStrings, partial?: DeepPartial<EaselStrings> | null): EaselStrings;
124
133
 
125
- export { type CanvasWords, ChromeWords, CopyWords, DEFAULT_EASEL_STRINGS, type DeepPartial, DragWords, type EaselStrings, FieldsWords, LockWords, NodeMenuWords, NoticeWords, PanelWords, PickWords, type RailWords, SaveWords, StyleClipboardWords, TextStylesWords, TreeWords, mergeEaselStrings };
134
+ export { type CanvasWords, ChromeWords, CopyWords, DEFAULT_EASEL_STRINGS, type DeepPartial, DragWords, type EaselStrings, FieldsWords, LockWords, NodeMenuWords, NoticeWords, PanelWords, PickWords, type RailWords, SaveWords, ScreenWords, StyleClipboardWords, TextStylesWords, TreeWords, mergeEaselStrings };
@@ -1 +1 @@
1
- export{DEFAULT_EASEL_STRINGS,mergeEaselStrings}from"../chunk-IG3U5NWJ.js";import"../chunk-M6F6LS3H.js";import"../chunk-6WY6ZXJG.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-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";
@@ -10,15 +10,18 @@ export { LockWords } from '../edit-lock/index.js';
10
10
  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
- export { S as SaveWords } from '../words-BMzV04b1.js';
13
+ export { S as SaveWords } from '../words-D_Lnw1Gr.js';
14
+ export { ScreenWords } from '../screen/words.js';
14
15
  export { S as StyleClipboardWords } from '../words-CnnHb9jo.js';
15
16
  export { T as TextStylesWords } from '../words-CRYvAiHX.js';
16
17
  export { T as TreeWords } from '../words-DgHcY5qB.js';
17
18
  import '../markup/index.js';
18
19
  import '../buckets-CuLM47h9.js';
19
- import '../types-DGcCsxs8.js';
20
+ import '../types-CqY85foL.js';
20
21
  import '../types-DWS-s9z-.js';
21
22
  import '../wordFit-D4S36PvB.js';
23
+ import '../panelWidths-D9hTLR25.js';
24
+ import '../engine-DBxp_v6B.js';
22
25
 
23
26
  interface EaselStringsProviderProps {
24
27
  /**
@@ -1,2 +1,2 @@
1
- import{DEFAULT_EASEL_STRINGS as r,mergeEaselStrings as n}from"../chunk-IG3U5NWJ.js";export{DEFAULT_EASEL_STRINGS,mergeEaselStrings}from"../chunk-IG3U5NWJ.js";import"../chunk-M6F6LS3H.js";import"../chunk-6WY6ZXJG.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-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__ */
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 +1 @@
1
- import{DEFAULT_STYLE_CLIPBOARD_WORDS as t}from"../chunk-6WY6ZXJG.js";import{CopyStyleIcon as e,PasteStyleIcon as n}from"../chunk-L5KW4HG5.js";import{jsx as o}from"react/jsx-runtime";var r="__styleKind";function u(t,e){return t[r]=e,t}function c(t,e){return`${t}:${e.map(t=>String(t)).sort().join("|")}`}function i(t){if(!t)return null;const e=t.indexOf(":");if(e<0)return null;const n=t.slice(0,e);return s.has(n)?{control:n,values:t.slice(e+1).split("|")}:null}var s=/* @__PURE__ */new Set(["choice","select","radio"]);function l(t){if(!t||"object"!=typeof t)return null;const e=t;return"string"==typeof e[r]?e[r]:"text"===e.type||"textarea"===e.type||"number"===e.type?e.type:"select"!==e.type&&"radio"!==e.type||!Array.isArray(e.options)?null:c(e.type,e.options.map(t=>t?.value))}function a(t){return null!=t&&""!==t}function p(t,e){let n=t;for(const t of e){if(!n||"object"!=typeof n)return;n=n[t]}return n}function f(t){return void 0===t?t:JSON.parse(JSON.stringify(t))}function d(t,e,n){const[o,...r]=e,u={...t};if(0===r.length)return void 0===n?delete u[o]:u[o]=n,u;const c=u[o],i=d(c&&"object"==typeof c?c:{},r,n);return 0===Object.keys(i).length?delete u[o]:u[o]=i,u}var y=t=>t.join("."),h="editor-shell:style-clipboard",g=null,m=!1,v=/* @__PURE__ */new Set;function S(){try{return"undefined"==typeof sessionStorage?null:sessionStorage}catch{return null}}function b(){if(!m){m=!0;try{const t=S()?.getItem(h);t&&(g=JSON.parse(t))}catch{g=null}}}function k(t){b(),g={scope:t.scope,sourceType:t.type,sourceLabel:t.label,rows:t.rows.map(e=>{const n=p(t.props,e.path);return{path:[...e.path],kind:e.kind,counted:!1!==e.counted,value:a(n)?f(n):void 0}})};try{S()?.setItem(h,JSON.stringify(g))}catch{}return v.forEach(t=>t()),g}function N(t){return b(),g&&g.scope===t?g:null}function j(t){return v.add(t),()=>{v.delete(t)}}function C(){g=null,m=!0;try{S()?.removeItem(h)}catch{}v.forEach(t=>t())}function w(t,e,n){if(t.kind===e.kind)return null!==e.kind||n;const o=i(t.kind),r=i(e.kind);return!(!o||!r||o.control!==r.control)&&(!a(t.value)||r.values.includes(String(t.value)))}function K(t,e){const n=t.sourceType===e.type,o=new Map(t.rows.map(t=>[y(t.path),t]));let r=e.props,u=0,c=!1;for(const t of e.rows){const e=o.get(y(t.path));if(!e)continue;if(!w(e,t,n))continue;const i=p(r,t.path),s=void 0===e.value?void 0:f(e.value);JSON.stringify(a(i)?i:void 0)!==JSON.stringify(s)&&(r=d(r,t.path,s),c=!0),!1!==t.counted&&(u+=1)}return{props:r,pasted:u,changed:c}}function O(e,n,o,r=t){return 0===e.pasted?r.nothing({source:n,target:o}):r.pasted({count:e.pasted,source:n})}var E="⌥⌘C",J="⌥⌘V";function T(r){const u=r.words??t,c=[];return r.canCopy&&c.push({label:u.copy,icon:/* @__PURE__ */o(e,{}),shortcut:"⌥⌘C",onClick:r.onCopy}),r.held&&c.push({label:u.paste({source:r.held.sourceLabel}),icon:/* @__PURE__ */o(n,{}),shortcut:"⌥⌘V",onClick:r.onPaste}),c}function x(t){if(!t.altKey||t.shiftKey||!t.metaKey&&!t.ctrlKey)return null;const e=t.target;return e&&(e.isContentEditable||"INPUT"===e.tagName||"TEXTAREA"===e.tagName||"SELECT"===e.tagName)?null:"KeyC"===t.code?"copy":"KeyV"===t.code?"paste":null}export{E as COPY_STYLE_SHORTCUT,J as PASTE_STYLE_SHORTCUT,r as STYLE_KIND,c as choiceKind,C as clearStyle,k as copyStyle,l as fieldKind,N as heldStyle,O as pasteMessage,K as planPaste,T as styleMenuItems,x as styleShortcut,j as subscribeStyle,u as withStyleKind};
1
+ export{COPY_STYLE_SHORTCUT,PASTE_STYLE_SHORTCUT,STYLE_KIND,choiceKind,clearStyle,copyStyle,fieldKind,heldStyle,pasteMessage,planPaste,styleMenuItems,styleShortcut,subscribeStyle,withStyleKind}from"../chunk-57DJOKXT.js";import"../chunk-6WY6ZXJG.js";import"../chunk-L5KW4HG5.js";
@@ -1,69 +1,7 @@
1
1
  import { a as EaselRailItem } from './types-DWS-s9z-.js';
2
- import { CSSProperties, ReactNode, Ref } from 'react';
2
+ import { ReactNode, Ref, CSSProperties } from 'react';
3
3
  import { EditAccess, SaveConflict } from './edit-lock/index.js';
4
-
5
- /**
6
- * The side-panel widths every editor opens on and drags between (px).
7
- *
8
- * Lifted from `efficient-storefront/components/panel-widths.ts`, where the website
9
- * editor measured them:
10
- *
11
- * RIGHT is 320, not 308 (card 8810). At 308 the settings tab strip was left
12
- * 269px once the inspector's 14px sides and its 11px scrollbar were off it —
13
- * one pixel under the 270 the strip's widest tier needs, so the tab words
14
- * turned into glyphs at the width every merchant opens on.
15
- *
16
- * MIN_PANEL_W is load-bearing on the top bar: six 34px rail buttons are 204px,
17
- * and at 220 the rail column spreads them with nothing to spare.
18
- *
19
- * The campaign designer opened at 288 / 288 with a 520 ceiling until the
20
- * 2026-09-17 redesign. One set of numbers now, here.
21
- */
22
- declare const DEFAULT_PANEL_W: {
23
- readonly left: 288;
24
- readonly right: 320;
25
- };
26
- declare const MIN_PANEL_W = 220;
27
- declare const MAX_PANEL_W = 560;
28
- /** Which side panel a width belongs to. */
29
- type PanelSide = 'left' | 'right';
30
- type PanelWidths = {
31
- left: number;
32
- right: number;
33
- };
34
- /** Clamp a width into the panel band and round to a whole pixel. */
35
- declare function clampPanelWidth(width: number): number;
36
- /**
37
- * The inline style that carries the widths, as `--es-left-w` / `--es-right-w`.
38
- *
39
- * ⚠️ PUT IT ON THE EDITOR ROOT, the nearest ancestor of EVERYTHING that reads
40
- * it. The website editor learned this on 2026-09-04: the vars sat on the panel
41
- * row, the top bar is that row's SIBLING, and the rail column read a width with
42
- * no declaration in scope — which is not an error, it silently falls back to
43
- * `auto` and the column shrinks to its buttons. (Since 2026-10-06 chrome.css
44
- * falls back to `DEFAULT_PANEL_W` instead: the column keeps its width and
45
- * simply stops following the grip.)
46
- *
47
- * ⚠️ A SERVER RENDERS THIS AS A `style=""` ATTRIBUTE, and a
48
- * Content-Security-Policy without `'unsafe-inline'` for styles refuses those.
49
- * A client render is not affected: React writes a `style` prop through the
50
- * CSSOM. A server-rendered editor under such a policy uses
51
- * {@link setPanelWidthVars} instead.
52
- */
53
- declare function panelWidthVars(widths: PanelWidths): CSSProperties;
54
- /**
55
- * The same two variables, written onto the editor root through the CSSOM
56
- * (second host, 2026-10-06) — so the server's HTML carries no `style` attribute for a strict
57
- * Content-Security-Policy to refuse:
58
- *
59
- * <div className="es-editor" ref={(el) => { if (el) setPanelWidthVars(el, widths); }}>
60
- *
61
- * A ref runs on the client only, before the browser paints, and again on each
62
- * render — so it follows the widths as a grip is dragged. Until it runs (the
63
- * server's HTML, before hydration) chrome.css draws the panels at
64
- * `DEFAULT_PANEL_W`. Touches nothing but the element it is handed.
65
- */
66
- declare function setPanelWidthVars(el: HTMLElement, widths: PanelWidths): void;
4
+ import { P as PanelSide } from './panelWidths-D9hTLR25.js';
67
5
 
68
6
  type TopBarProps = {
69
7
  children?: ReactNode;
@@ -268,4 +206,4 @@ type EditNoticeProps = {
268
206
  onReload: () => void;
269
207
  };
270
208
 
271
- export { type DeviceSwitchProps as D, type EaselIconButtonProps as E, type InspectorHeadProps as I, type MediaPanelHeadProps as M, type PanelResizeHandleProps as P, type RailWordsShown as R, type SaveTone as S, type TopBarProps as T, type TopBarClusterProps as a, type TopBarRailProps as b, type SaveStateProps as c, type SaveStateToggleProps as d, type InspectorIconButtonProps as e, type InspectorUpLevelProps as f, type MediaPickKind as g, type EditNoticeProps as h, DEFAULT_PANEL_W as i, type DeviceOption as j, MAX_PANEL_W as k, MIN_PANEL_W as l, type PanelSide as m, type PanelWidths as n, clampPanelWidth as o, panelWidthVars as p, setPanelWidthVars as s };
209
+ export type { DeviceOption as D, EaselIconButtonProps as E, InspectorHeadProps as I, MediaPanelHeadProps as M, PanelResizeHandleProps as P, RailWordsShown as R, SaveTone as S, TopBarProps as T, TopBarClusterProps as a, TopBarRailProps as b, DeviceSwitchProps as c, SaveStateProps as d, SaveStateToggleProps as e, InspectorIconButtonProps as f, InspectorUpLevelProps as g, MediaPickKind as h, EditNoticeProps as i };
@@ -0,0 +1,59 @@
1
+ import { S as SaveTone } from './types-CqY85foL.js';
2
+ import { A as AutosaveSnapshot } from './engine-DBxp_v6B.js';
3
+
4
+ /**
5
+ * What the save pill says, for both editors — ONE copy.
6
+ *
7
+ * There were three: the campaign designer's `saveStatusLabel`
8
+ * (efficient-admin-portal `src/components/email/autosaveStatus.ts`), the
9
+ * website editor's `autosaveStatusLabel` (efficient-storefront
10
+ * `lib/editor/autosave-status.ts`, which said of the first "a MIRRORED copy …
11
+ * whether that pair should collapse into `efficient-easel` is called out
12
+ * rather than decided here") and the website chrome's own words for its
13
+ * autosave switch. This decides it.
14
+ *
15
+ * The rule they all kept, and keep here (card 66103): **the pill speaks only
16
+ * when it has something to say.** A save that lands is silence — the dot goes
17
+ * green, no word. An edit younger than five seconds is silence too: with a
18
+ * one-second save it is about to land, and saying "unsaved" at every keystroke
19
+ * would blink the bar once a second. What is left is worth a word each:
20
+ *
21
+ * - the work has been off the server for five seconds — "Unsaved changes";
22
+ * - a save failed and is being retried — "Save failed" (with "Retry now");
23
+ * - the operator paused autosave — "Auto-save off", and whether that is
24
+ * holding anything;
25
+ * - a save was refused — "Auto-save stopped", which must never read as a
26
+ * switch somebody flicked themselves.
27
+ *
28
+ * The tones are `efficient-easel/chrome`'s `SaveState` tones, so the result
29
+ * goes straight onto the pill: `<SaveState {...saveIndicator(state)} />`.
30
+ */
31
+
32
+ type SaveIndicator = {
33
+ tone: SaveTone;
34
+ label: string;
35
+ };
36
+ /**
37
+ * The pill's five things to say (`efficient-easel/strings`, 0.95.0). Kept in
38
+ * autosave's own folder, with no import: autosave may reach nothing else
39
+ * (`tests/autosave-leaf-safety.test.ts`).
40
+ */
41
+ type SaveWords = {
42
+ /** A save was refused: nothing will be written. */
43
+ stopped: string;
44
+ /** The operator paused autosave, and an edit is waiting. */
45
+ pausedUnsaved: string;
46
+ /** The operator paused autosave. */
47
+ paused: string;
48
+ /** A save failed and is being retried. */
49
+ failed: string;
50
+ /** The work has been off the server for five seconds. */
51
+ unsaved: string;
52
+ };
53
+ /**
54
+ * `words` is the host's language (`useEaselStrings().save`); left out, the
55
+ * pill speaks English as it always has.
56
+ */
57
+ declare function saveIndicator(state: AutosaveSnapshot, words?: SaveWords): SaveIndicator;
58
+
59
+ export { type SaveWords as S, type SaveIndicator as a, saveIndicator as s };