efficient-easel 18.2.0 → 19.0.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 (114) hide show
  1. package/README.md +26 -1
  2. package/dist/{CanvasDragLayer-dZCPbQCP.d.ts → CanvasDragLayer-ARfaivCu.d.ts} +21 -3
  3. package/dist/{host-epHo7r8P.d.ts → ScreenDocumentContext-D55vIrG3.d.ts} +208 -208
  4. package/dist/autosave/index.d.ts +4 -4
  5. package/dist/{canvas-typing-BsNigaCa.d.ts → canvas-typing-Be4FO4q7.d.ts} +5 -5
  6. package/dist/chrome/chrome.css +2 -18
  7. package/dist/chrome/index.d.ts +5 -39
  8. package/dist/chrome/index.js +1 -1
  9. package/dist/{chunk-C2RHV42O.js → chunk-23DYNW6S.js} +1 -1
  10. package/dist/chunk-324PHMLC.js +8 -0
  11. package/dist/{chunk-HGV3FWOB.js → chunk-5DPIGWUL.js} +1 -1
  12. package/dist/{chunk-YLQYEDUQ.js → chunk-6DNDTEF6.js} +1 -1
  13. package/dist/chunk-AJSDWWJW.js +1 -0
  14. package/dist/chunk-C56MPJBH.js +1 -0
  15. package/dist/{chunk-N5AN2RF2.js → chunk-CM732ENS.js} +1 -1
  16. package/dist/{chunk-QEAUF632.js → chunk-CPFDJMFD.js} +12 -12
  17. package/dist/{chunk-S4AWJX4Q.js → chunk-EZG3TGQ7.js} +1 -1
  18. package/dist/chunk-EZKUTVQP.js +62 -0
  19. package/dist/{chunk-XHHVMAGM.js → chunk-FGYJ5DJY.js} +1 -1
  20. package/dist/chunk-J4MHNAED.js +5 -0
  21. package/dist/{chunk-VEZPDGDQ.js → chunk-JBOSEHIX.js} +1 -1
  22. package/dist/chunk-JC34NH4G.js +1 -0
  23. package/dist/chunk-KRL3IUV3.js +1 -0
  24. package/dist/chunk-LNHT2KPX.js +2 -0
  25. package/dist/{chunk-SNB4LQMK.js → chunk-LUBJKUVV.js} +1 -1
  26. package/dist/chunk-M62P4IQK.js +2 -0
  27. package/dist/chunk-MS2U6MV5.js +1 -0
  28. package/dist/{chunk-7TOQCTHV.js → chunk-PY7OOQEZ.js} +3 -3
  29. package/dist/{chunk-KG7RJWOK.js → chunk-RYNBSKE7.js} +1 -1
  30. package/dist/{chunk-XDZHKYQX.js → chunk-SINAM2IT.js} +1 -1
  31. package/dist/{chunk-DXROGLB5.js → chunk-SP3TRDKA.js} +1 -1
  32. package/dist/{chunk-X52NFKUS.js → chunk-T5WDR5IE.js} +1 -1
  33. package/dist/chunk-WMQKV3DK.js +7 -0
  34. package/dist/chunk-Z2V3TTAR.js +18 -0
  35. package/dist/chunk-ZG6PVMC3.js +19 -0
  36. package/dist/copy/index.d.ts +7 -7
  37. package/dist/copy/index.js +29 -29
  38. package/dist/drag/drag.css +23 -0
  39. package/dist/drag/index.d.ts +1 -1
  40. package/dist/drag/index.js +1 -1
  41. package/dist/easel/index.d.ts +2 -2
  42. package/dist/easel/index.js +1 -1
  43. package/dist/fields/fields.css +3 -3
  44. package/dist/fields/index.d.ts +1 -1
  45. package/dist/panel/index.d.ts +17 -84
  46. package/dist/panel/index.js +13 -19
  47. package/dist/panel/panel.css +41 -137
  48. package/dist/{panelWidths-D9hTLR25.d.ts → panelWidths-DgQXiPXU.d.ts} +34 -6
  49. package/dist/screen/components/AddBlockRow.js +1 -1
  50. package/dist/screen/components/AddSidePanel.js +1 -1
  51. package/dist/screen/components/MediaPopup.d.ts +21 -0
  52. package/dist/screen/components/MediaPopup.js +1 -0
  53. package/dist/screen/components/NodeContextMenu.d.ts +4 -4
  54. package/dist/screen/components/NodeContextMenu.js +1 -1
  55. package/dist/screen/components/PageEditGuardNotices.js +1 -1
  56. package/dist/screen/components/SaveControls.d.ts +6 -6
  57. package/dist/screen/components/SaveControls.js +1 -1
  58. package/dist/screen/components/ScreenChrome.js +1 -1
  59. package/dist/screen/components/ScreenDocumentContext.d.ts +1 -1
  60. package/dist/screen/components/ScreenDocumentContext.js +1 -1
  61. package/dist/screen/components/ScreenMount.d.ts +8 -8
  62. package/dist/screen/components/ScreenMount.js +1 -1
  63. package/dist/screen/components/ScreenStoreProvider.d.ts +7 -7
  64. package/dist/screen/components/ScreenStoreProvider.js +1 -1
  65. package/dist/screen/components/SectionScreenShell.js +17 -16
  66. package/dist/screen/components/SidePanelHead.js +1 -1
  67. package/dist/screen/components/panel-widths.d.ts +7 -6
  68. package/dist/screen/components/panel-widths.js +1 -1
  69. package/dist/screen/components/usePartBridge.d.ts +7 -7
  70. package/dist/screen/components/usePartBridge.js +1 -1
  71. package/dist/screen/index.d.ts +5 -5
  72. package/dist/screen/index.js +1 -1
  73. package/dist/screen/lib/document-addressing.d.ts +1 -1
  74. package/dist/screen/lib/host-inbound.js +1 -1
  75. package/dist/screen/lib/host.d.ts +5 -5
  76. package/dist/screen/lib/key-scope.js +1 -1
  77. package/dist/screen/lib/media-panel.d.ts +74 -37
  78. package/dist/screen/lib/media-panel.js +1 -1
  79. package/dist/screen/lib/media-picker.d.ts +5 -5
  80. package/dist/screen/lib/media-picker.js +1 -1
  81. package/dist/screen/lib/puck/device-fields.js +1 -1
  82. package/dist/screen/lib/puck/style-clipboard.d.ts +7 -7
  83. package/dist/screen/lib/puck/style-clipboard.js +1 -1
  84. package/dist/screen/lib/puck/use-section-ops.js +1 -1
  85. package/dist/screen/lib/save-status.d.ts +2 -2
  86. package/dist/screen/lib/screen-parts.d.ts +52 -11
  87. package/dist/screen/lib/screen-parts.js +1 -1
  88. package/dist/screen/screen.css +5 -4
  89. package/dist/screen/words.d.ts +3 -0
  90. package/dist/screen/words.js +1 -1
  91. package/dist/strings/index.d.ts +6 -6
  92. package/dist/strings/index.js +2 -2
  93. package/dist/{types-DT8ywrFQ.d.ts → types-B3iSHX-w.d.ts} +2 -22
  94. package/dist/{words-zH1H0WFw.d.ts → words-BeX5eGq7.d.ts} +2 -2
  95. package/dist/words-BpTjCfqO.d.ts +89 -0
  96. package/dist/{words-DkWcK1rh.d.ts → words-Cm8PMYn0.d.ts} +1 -1
  97. package/dist/{words-BpiVrsW5.d.ts → words-DYu4iBrR.d.ts} +1 -21
  98. package/package.json +8 -8
  99. package/dist/chunk-2ZWA6ARJ.js +0 -8
  100. package/dist/chunk-5EZ5Z3K7.js +0 -7
  101. package/dist/chunk-B4JN227A.js +0 -1
  102. package/dist/chunk-GWIVPLOX.js +0 -23
  103. package/dist/chunk-LIRNQXAY.js +0 -1
  104. package/dist/chunk-LLDHIBYG.js +0 -18
  105. package/dist/chunk-OBIL7BZO.js +0 -4
  106. package/dist/chunk-R6WTQWAC.js +0 -2
  107. package/dist/chunk-SEVGZP36.js +0 -62
  108. package/dist/chunk-STWSCR25.js +0 -2
  109. package/dist/chunk-U277UX5I.js +0 -1
  110. package/dist/chunk-W6SDWCOL.js +0 -5
  111. package/dist/chunk-Z6PVRXVY.js +0 -1
  112. package/dist/screen/components/MediaSidePanel.d.ts +0 -49
  113. package/dist/screen/components/MediaSidePanel.js +0 -1
  114. package/dist/words-D-yhjdOg.d.ts +0 -183
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ComponentType, ReactNode } from 'react';
3
- import { H as HostPickedMedia, E as EaselHost } from '../../host-epHo7r8P.js';
3
+ import { H as HostPickedMedia, E as EaselHost } from '../../ScreenDocumentContext-D55vIrG3.js';
4
4
  import '../../blocks/index.js';
5
5
  import '../../types-Cq53lL8d.js';
6
6
  import '../../data/index.js';
@@ -8,9 +8,12 @@ import '../../types-41704JE4.js';
8
8
  import '../../resolve-D68pb3Bx.js';
9
9
  import '../../plan-CZS902DV.js';
10
10
  import './document-contract.js';
11
+ import './document-switch.js';
12
+ import '../../engine-CvXpFE86.js';
13
+ import '../../edit-lock/index.js';
14
+ import './admin-bridge.js';
11
15
  import './session.js';
12
16
  import './backend-error.js';
13
- import '../../edit-lock/index.js';
14
17
  import './host-chrome.js';
15
18
  import './links/link-filters.js';
16
19
  import 'efficient-shell/ui';
@@ -18,42 +21,41 @@ import './document-hooks.js';
18
21
  import './section-template-types.js';
19
22
  import './puck/content-tree.js';
20
23
  import './shared-section-types.js';
21
- import './document-switch.js';
22
- import '../../engine-CvXpFE86.js';
23
- import './admin-bridge.js';
24
24
 
25
25
  /**
26
- * The editor's MEDIA PANEL — the host's media library, drawn in the editor's own
27
- * left panel beside Pages, Layers and Site styles.
26
+ * The editor's MEDIA POPUP — the host's media library, opened from the editor
27
+ * as one large popup (harness UI-20, owner decision Lewis 2026-10-23).
28
28
  *
29
29
  * The editor owns no media library and never will: the library is the host's
30
30
  * (the admin portal's Media Library, one component wherever it is shown). What
31
- * the editor owns is the PLACE it shows — a left-panel view its rail opens — and
32
- * the request that turns that view into a chooser for one field.
31
+ * the editor owns is WHEN it shows and for whom: the request that turns it into
32
+ * a chooser for one field, and the rail's browse. `components/MediaPopup`
33
+ * draws the host's component ONCE, at the screen's root, and the host draws it
34
+ * as its popup (the shell's `Dialog`). The names here still say "panel": the
35
+ * library sat in the editor's left panel until 2026-10-23, and the hosts import
36
+ * these names.
33
37
  *
34
- * It replaces a window. The rail button and every image field used to ask the
35
- * host to open a separate "Media library" picker window over the editor
36
- * (`storefront-editor:open-media-picker`), which floated beside the host's own
37
- * Media Library window under the same name, built from different code, and could
38
- * be sent behind the editor while the field that asked waited on it (harness
39
- * UI-20, UI-21). A host that supplies a panel gets this instead; a host that
40
- * does not keeps the message, so nothing it relies on changes underneath it.
38
+ * • BROWSING — the rail's Media opens it with no field (`browsing`): look,
39
+ * upload, tidy, drag a file onto the canvas. `onClose` ends it.
40
+ * • PICKING — a field calls `requestMediaPick` (lib/media-picker). With a
41
+ * popup here, that becomes a request to THIS provider's pick store: the
42
+ * popup opens for that field (`pick`), the host calls `onPick`, and the
43
+ * field gets the media. `onClose` settles it `null`. A field asking while
44
+ * the merchant browses turns the popup into its chooser, and its answer
45
+ * ends the browse with it.
41
46
  *
42
- * • BROWSING — the rail opens the "media" left view. The host's panel shows
43
- * the library to look through, upload to, tidy. `pick` is null.
44
- * • PICKING — a field calls `requestMediaPick` (lib/media-picker). With
45
- * a panel here, that becomes a request to THIS provider's pick store: the
46
- * chrome lays the panel over the left panel in pick mode, the host's panel
47
- * calls `onPick`, and the field gets the media. Leaving pick mode any other
48
- * way (the panel's Cancel, a rail button, closing the panel) settles it
49
- * `null`.
47
+ * It replaced a window, and then a panel. The rail button and every image
48
+ * field once asked the host to open a separate "Media library" window over the
49
+ * editor (`storefront-editor:open-media-picker`, harness UI-20, UI-21); a host
50
+ * that supplies no popup still gets that message, so nothing it relies on
51
+ * changes underneath it.
50
52
  *
51
53
  * ONE PENDING PICK PER PROVIDER (0.103.0). Until then the pending pick was
52
54
  * module state, one for the page — right while one editor is mounted, and
53
55
  * wrong the moment two are (the admin's website editor and campaign designer):
54
- * a field in one laid the other's panel over its own left panel too, and a
55
- * Cancel in either settled the other's field. Each provider now keeps its own
56
- * {@link MediaPickStore}; the chrome under it reads that one, and a field's
56
+ * a field in one opened the other's library too, and a Cancel in either
57
+ * settled the other's field. Each provider now keeps its own
58
+ * {@link MediaPickStore}; the screen under it reads that one, and a field's
57
59
  * request finds it by the HOST the field asks through (`requestMediaPick(host,
58
60
  * …)` — one host per mounted editor, lib/host), so no prop or context has to
59
61
  * reach the field's click handler. A request whose host no provider sits under
@@ -78,15 +80,36 @@ interface MediaPickRequest {
78
80
  */
79
81
  options?: Record<string, unknown>;
80
82
  }
81
- /** The props the host's panel component is drawn with. */
83
+ /** The props the host's popup component is drawn with. It is drawn always; it
84
+ * is OPEN while `pick` or `browsing` is set. */
82
85
  interface MediaPanelProps {
83
- /** The field choosing right now, or null while the merchant is browsing. */
86
+ /** The field choosing right now, or null. Wins over `browsing`. */
84
87
  pick: MediaPickRequest | null;
85
- /** Answer the field. Ignored while browsing. */
88
+ /** The rail opened the library with no field. */
89
+ browsing: boolean;
90
+ /** Answer the field. Ignored while only browsing. */
86
91
  onPick: (media: HostPickedMedia) => void;
92
+ /** Close it: the field (if any) gets no choice, and the browse ends. */
93
+ onClose: () => void;
87
94
  }
88
- /** The host's media library, as a component the editor draws in its panel. */
95
+ /** The host's media library, as the component the editor draws as its popup. */
89
96
  type MediaPanelComponent = ComponentType<MediaPanelProps>;
97
+ /** A file dragged out of the host's popup onto the canvas, as the shell's
98
+ * `readMediaFileDrag` reads it. */
99
+ interface MediaPlacedFile {
100
+ id: string;
101
+ url: string;
102
+ kind: "image" | "video";
103
+ name: string;
104
+ }
105
+ /**
106
+ * What a file dropped on the canvas becomes in this host, before the layer
107
+ * places it: the host's pick path, the same answer a pick of that file gives
108
+ * (a website takes a file another website holds by copying it in, as it always
109
+ * has; owner 2026-10-23, the files may be copied per website). Null: the file
110
+ * cannot be used here, and nothing is placed. Absent: the file as it came.
111
+ */
112
+ type MediaPlace = (file: MediaPlacedFile) => Promise<HostPickedMedia | null>;
90
113
  /**
91
114
  * One editor's pending pick (0.103.0): what its panel is choosing for, and who
92
115
  * waits on the answer. A {@link MediaPanelProvider} makes one for itself.
@@ -105,6 +128,12 @@ interface MediaPickStore {
105
128
  settle(requestId: string, media: HostPickedMedia | null): void;
106
129
  /** Leave pick mode without a choice, whatever is being chosen. */
107
130
  cancel(): void;
131
+ /** Whether the rail opened the library with no field. */
132
+ browsing(): boolean;
133
+ /** Open the library with no field (the rail's Media). */
134
+ browse(): void;
135
+ /** Close it: cancel the pick, end the browse. */
136
+ close(): void;
108
137
  subscribe(listener: () => void): () => void;
109
138
  }
110
139
  declare function createMediaPickStore(): MediaPickStore;
@@ -112,10 +141,15 @@ declare function createMediaPickStore(): MediaPickStore;
112
141
  * window: fields ask the host with `open-media-picker`. Sit it under the
113
142
  * editor's `EaselHostProvider`, as the website's frame does: that host is
114
143
  * how a field's request finds this provider among several. */
115
- declare function MediaPanelProvider({ panel, children }: {
144
+ declare function MediaPanelProvider({ panel, place, children, }: {
116
145
  panel: MediaPanelComponent | null;
146
+ /** What a file dropped from the popup becomes in this host (`MediaPlace`). */
147
+ place?: MediaPlace | null;
117
148
  children: ReactNode;
118
149
  }): react.JSX.Element;
150
+ /** What a file dropped from the popup becomes in this editor's host, or null
151
+ * (the file as it came). */
152
+ declare function useMediaPlace(): MediaPlace | null;
119
153
  /** The host's panel for the editor this renders in, or null. */
120
154
  declare function useMediaPanel(): MediaPanelComponent | null;
121
155
  /**
@@ -139,14 +173,17 @@ declare function requestPanelPick(request: MediaPickRequest): Promise<HostPicked
139
173
  * stale id — an answer for a request already superseded — does nothing. */
140
174
  declare function settlePanelPick(requestId: string, media: HostPickedMedia | null): void;
141
175
  /** Leave the page's pick mode without a choice, whatever is being chosen.
142
- * Under a provider, `useCancelPanelPick` leaves that editor's. */
176
+ * Under a provider, `useCloseMediaPopup` closes that editor's. */
143
177
  declare function cancelPanelPick(): void;
144
178
  /** The field the panel is choosing for, or null while nothing is — in the
145
179
  * editor this renders in. */
146
180
  declare function usePanelPick(): MediaPickRequest | null;
147
- /** Leave THIS editor's pick mode without a choice (0.103.0): a stable
148
- * function, for the chrome's Escape, rail and panel-closed paths. */
149
- declare function useCancelPanelPick(): () => void;
181
+ /** Whether THIS editor's library is open with no field (the rail's browse). */
182
+ declare function useMediaBrowsing(): boolean;
183
+ /** Open THIS editor's library with no field: the rail's Media. A stable function. */
184
+ declare function useOpenMediaBrowse(): () => void;
185
+ /** Close THIS editor's library: the field gets no choice, the browse ends. */
186
+ declare function useCloseMediaPopup(): () => void;
150
187
  /**
151
188
  * A change of selection leaves pick mode (0.103.0, `ScreenParts
152
189
  * .pickFollowsSelection`): with `follows`, the field still waiting when
@@ -156,4 +193,4 @@ declare function useCancelPanelPick(): () => void;
156
193
  */
157
194
  declare function usePickFollowsSelection(follows: boolean, selection: unknown): void;
158
195
 
159
- export { type MediaPanelComponent, type MediaPanelProps, MediaPanelProvider, type MediaPickRequest, type MediaPickStore, cancelPanelPick, createMediaPickStore, hasMediaPanel, mediaPickStoreFor, requestPanelPick, settlePanelPick, useCancelPanelPick, useMediaPanel, usePanelPick, usePickFollowsSelection };
196
+ export { type MediaPanelComponent, type MediaPanelProps, MediaPanelProvider, type MediaPickRequest, type MediaPickStore, type MediaPlace, type MediaPlacedFile, cancelPanelPick, createMediaPickStore, hasMediaPanel, mediaPickStoreFor, requestPanelPick, settlePanelPick, useCloseMediaPopup, useMediaBrowsing, useMediaPanel, useMediaPlace, useOpenMediaBrowse, usePanelPick, usePickFollowsSelection };
@@ -1 +1 @@
1
- export{MediaPanelProvider,cancelPanelPick,createMediaPickStore,hasMediaPanel,mediaPickStoreFor,requestPanelPick,settlePanelPick,useCancelPanelPick,useMediaPanel,usePanelPick,usePickFollowsSelection}from"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";
1
+ export{MediaPanelProvider,cancelPanelPick,createMediaPickStore,hasMediaPanel,mediaPickStoreFor,requestPanelPick,settlePanelPick,useCloseMediaPopup,useMediaBrowsing,useMediaPanel,useMediaPlace,useOpenMediaBrowse,usePanelPick,usePickFollowsSelection}from"../../chunk-LNHT2KPX.js";import"../../chunk-U3JP4VGF.js";
@@ -1,4 +1,4 @@
1
- import { H as HostPickedMedia, E as EaselHost } from '../../host-epHo7r8P.js';
1
+ import { H as HostPickedMedia, E as EaselHost } from '../../ScreenDocumentContext-D55vIrG3.js';
2
2
  import 'react';
3
3
  import '../../blocks/index.js';
4
4
  import '../../types-Cq53lL8d.js';
@@ -7,9 +7,12 @@ import '../../types-41704JE4.js';
7
7
  import '../../resolve-D68pb3Bx.js';
8
8
  import '../../plan-CZS902DV.js';
9
9
  import './document-contract.js';
10
+ import './document-switch.js';
11
+ import '../../engine-CvXpFE86.js';
12
+ import '../../edit-lock/index.js';
13
+ import './admin-bridge.js';
10
14
  import './session.js';
11
15
  import './backend-error.js';
12
- import '../../edit-lock/index.js';
13
16
  import './host-chrome.js';
14
17
  import './links/link-filters.js';
15
18
  import 'efficient-shell/ui';
@@ -17,9 +20,6 @@ import './document-hooks.js';
17
20
  import './section-template-types.js';
18
21
  import './puck/content-tree.js';
19
22
  import './shared-section-types.js';
20
- import './document-switch.js';
21
- import '../../engine-CvXpFE86.js';
22
- import './admin-bridge.js';
23
23
 
24
24
  /**
25
25
  * Editor media-picker bridge — the one call every media slot makes to choose an
@@ -1 +1 @@
1
- export{requestMediaPick,resolveMediaPick}from"../../chunk-KG7RJWOK.js";import"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";
1
+ export{requestMediaPick,resolveMediaPick}from"../../chunk-RYNBSKE7.js";import"../../chunk-LNHT2KPX.js";import"../../chunk-U3JP4VGF.js";
@@ -1 +1 @@
1
- export{DEVICE_FIELD_MARKER,DEVICE_HIDDEN_ATTR,DEVICE_NOTE,deviceField,deviceMetaOf,deviceNote,shownTier,withoutDeviceGate}from"../../../chunk-XHHVMAGM.js";import"../../../chunk-7F52SZOI.js";import"../../../chunk-C2RHV42O.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-BSPCSC45.js";
1
+ export{DEVICE_FIELD_MARKER,DEVICE_HIDDEN_ATTR,DEVICE_NOTE,deviceField,deviceMetaOf,deviceNote,shownTier,withoutDeviceGate}from"../../../chunk-FGYJ5DJY.js";import"../../../chunk-7F52SZOI.js";import"../../../chunk-23DYNW6S.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-BSPCSC45.js";
@@ -11,12 +11,12 @@ import '../../../types-41704JE4.js';
11
11
  import '../../../resolve-D68pb3Bx.js';
12
12
  import '../../../plan-CZS902DV.js';
13
13
  import '../../../watch-BTYOJpQU.js';
14
- import '../../../types-DT8ywrFQ.js';
14
+ import '../../../types-B3iSHX-w.js';
15
15
  import '../../../types-Cy7rdmXt.js';
16
16
  import '../../../wordFit-7XpmhcaW.js';
17
17
  import '../../../edit-lock/index.js';
18
- import '../../../panelWidths-D9hTLR25.js';
19
- import '../../../CanvasDragLayer-dZCPbQCP.js';
18
+ import '../../../panelWidths-DgQXiPXU.js';
19
+ import '../../../CanvasDragLayer-ARfaivCu.js';
20
20
  import '../../../session-DSQFmIvx.js';
21
21
  import '../../../words-CvwYvkJm.js';
22
22
  import '../../../types-Bqq6ya0y.js';
@@ -27,16 +27,16 @@ import '../section-template-types.js';
27
27
  import './content-tree.js';
28
28
  import '../shared-section-types.js';
29
29
  import './block-choice.js';
30
- import '../../../host-epHo7r8P.js';
30
+ import '../../../ScreenDocumentContext-D55vIrG3.js';
31
31
  import '../document-contract.js';
32
+ import '../document-switch.js';
33
+ import '../../../engine-CvXpFE86.js';
34
+ import '../admin-bridge.js';
32
35
  import '../session.js';
33
36
  import '../backend-error.js';
34
37
  import '../host-chrome.js';
35
38
  import '../links/link-filters.js';
36
39
  import '../document-hooks.js';
37
- import '../document-switch.js';
38
- import '../../../engine-CvXpFE86.js';
39
- import '../admin-bridge.js';
40
40
  import './add-target-types.js';
41
41
  import './slot-section-spec.js';
42
42
 
@@ -1 +1 @@
1
- export{copyNodeStyle,nodeStyleRows,planNodePaste,shopFieldKind,siteStyleScope,styleClipboardOf}from"../../../chunk-VEZPDGDQ.js";import"../../../chunk-LER7RKTO.js";import"../../../chunk-XHHVMAGM.js";import"../../../chunk-7F52SZOI.js";import"../../../chunk-MQNBD6AB.js";import"../../../chunk-C2RHV42O.js";import"../../../chunk-V7U33NF2.js";import"../../../chunk-6WY6ZXJG.js";import"../../../chunk-DUVRZ456.js";import"../../../chunk-BPXEFVSQ.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-BSPCSC45.js";
1
+ export{copyNodeStyle,nodeStyleRows,planNodePaste,shopFieldKind,siteStyleScope,styleClipboardOf}from"../../../chunk-JBOSEHIX.js";import"../../../chunk-LER7RKTO.js";import"../../../chunk-FGYJ5DJY.js";import"../../../chunk-7F52SZOI.js";import"../../../chunk-MQNBD6AB.js";import"../../../chunk-V7U33NF2.js";import"../../../chunk-6WY6ZXJG.js";import"../../../chunk-23DYNW6S.js";import"../../../chunk-DUVRZ456.js";import"../../../chunk-BPXEFVSQ.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-BSPCSC45.js";
@@ -1 +1 @@
1
- export{useSectionOps}from"../../../chunk-SNB4LQMK.js";import"../../../chunk-W6SDWCOL.js";import"../../../chunk-R6WTQWAC.js";import"../../../chunk-U3JP4VGF.js";import"../../../chunk-PLVEGYK6.js";import"../../../chunk-QEAUF632.js";import"../../../chunk-TBY3DFKS.js";import"../../../chunk-5ZBV5RA6.js";import"../../../chunk-BPXEFVSQ.js";import"../../../chunk-A6Z4SD3I.js";import"../../../chunk-K56YDHYQ.js";import"../../../chunk-XWFH2NHZ.js";import"../../../chunk-YRLPFZW3.js";import"../../../chunk-X3TYRF5V.js";import"../../../chunk-BALFHI3G.js";import"../../../chunk-RC25EGHD.js";import"../../../chunk-KFV7N2DJ.js";import"../../../chunk-23VM4PMV.js";import"../../../chunk-B4JN227A.js";import"../../../chunk-2XMHLXMA.js";import"../../../chunk-G3GWAP5R.js";import"../../../chunk-WRFD4EXD.js";import"../../../chunk-36LVP5WD.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-67GNT6PF.js";import"../../../chunk-P2VEMZH5.js";import"../../../chunk-X4T6JT3M.js";import"../../../chunk-KRXQM65X.js";import"../../../chunk-NKB3KVAB.js";
1
+ export{useSectionOps}from"../../../chunk-LUBJKUVV.js";import"../../../chunk-J4MHNAED.js";import"../../../chunk-LNHT2KPX.js";import"../../../chunk-U3JP4VGF.js";import"../../../chunk-PLVEGYK6.js";import"../../../chunk-CPFDJMFD.js";import"../../../chunk-TBY3DFKS.js";import"../../../chunk-5ZBV5RA6.js";import"../../../chunk-BPXEFVSQ.js";import"../../../chunk-A6Z4SD3I.js";import"../../../chunk-K56YDHYQ.js";import"../../../chunk-XWFH2NHZ.js";import"../../../chunk-YRLPFZW3.js";import"../../../chunk-BALFHI3G.js";import"../../../chunk-X3TYRF5V.js";import"../../../chunk-RC25EGHD.js";import"../../../chunk-KFV7N2DJ.js";import"../../../chunk-23VM4PMV.js";import"../../../chunk-KRL3IUV3.js";import"../../../chunk-2XMHLXMA.js";import"../../../chunk-G3GWAP5R.js";import"../../../chunk-WRFD4EXD.js";import"../../../chunk-36LVP5WD.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-67GNT6PF.js";import"../../../chunk-P2VEMZH5.js";import"../../../chunk-X4T6JT3M.js";import"../../../chunk-KRXQM65X.js";import"../../../chunk-NKB3KVAB.js";
@@ -1,11 +1,11 @@
1
1
  import { A as AutosaveSnapshot } from '../../engine-CvXpFE86.js';
2
- import { a as SaveIconState } from '../../types-DT8ywrFQ.js';
2
+ import { a as SaveIconState } from '../../types-B3iSHX-w.js';
3
3
  import { ScreenSaveStatusWords } from '../words.js';
4
4
  import '../../types-Cy7rdmXt.js';
5
5
  import '../../wordFit-7XpmhcaW.js';
6
6
  import 'react';
7
7
  import '../../edit-lock/index.js';
8
- import '../../panelWidths-D9hTLR25.js';
8
+ import '../../panelWidths-DgQXiPXU.js';
9
9
 
10
10
  /**
11
11
  * WHAT THE SAVE IS DOING, AS ONE ANSWER (8.0.0, card [DESIGN] A Clearer Save
@@ -2,15 +2,15 @@ import * as react from 'react';
2
2
  import { ReactNode, MouseEvent, ComponentType } from 'react';
3
3
  import { Data } from '../../blocks/index.js';
4
4
  import { C as CanvasTarget } from '../../watch-BTYOJpQU.js';
5
- import { D as DeviceOption } from '../../types-DT8ywrFQ.js';
5
+ import { D as DeviceOption } from '../../types-B3iSHX-w.js';
6
6
  import { P as Place } from '../../types-41704JE4.js';
7
- import { M as MeasuredCanvas, C as CanvasDragModel } from '../../CanvasDragLayer-dZCPbQCP.js';
7
+ import { M as MeasuredCanvas, C as CanvasDragModel } from '../../CanvasDragLayer-ARfaivCu.js';
8
8
  import { E as EaselContextMenuItem } from '../../types-BsyPh6EW.js';
9
9
  import { E as EaselRailItem } from '../../types-Cy7rdmXt.js';
10
10
  import { StyleRow } from '../../style-clipboard/index.js';
11
11
  import { T as TreeRowMark } from '../../types-Bqq6ya0y.js';
12
12
  import { AddKey } from '../components/AddSidePanel.js';
13
- import { k as AnyScreenTarget } from '../../host-epHo7r8P.js';
13
+ import { k as AnyScreenTarget } from '../../ScreenDocumentContext-D55vIrG3.js';
14
14
  import { HostProduct } from './host-chrome.js';
15
15
  import { EaselSession } from './session.js';
16
16
  import { SharedSectionUse, SharedSection } from './shared-section-types.js';
@@ -21,7 +21,7 @@ import '../../data/index.js';
21
21
  import '../../resolve-D68pb3Bx.js';
22
22
  import '../../plan-CZS902DV.js';
23
23
  import '../../edit-lock/index.js';
24
- import '../../panelWidths-D9hTLR25.js';
24
+ import '../../panelWidths-DgQXiPXU.js';
25
25
  import '../../session-DSQFmIvx.js';
26
26
  import '../../words-CvwYvkJm.js';
27
27
  import '../../wordFit-7XpmhcaW.js';
@@ -34,8 +34,8 @@ import './document-contract.js';
34
34
  import './document-switch.js';
35
35
  import '../../engine-CvXpFE86.js';
36
36
  import './admin-bridge.js';
37
- import './backend-error.js';
38
37
  import './links/link-filters.js';
38
+ import './backend-error.js';
39
39
  import './document-hooks.js';
40
40
  import './puck/slot-section-spec.js';
41
41
 
@@ -496,10 +496,11 @@ interface ScreenBridges {
496
496
  * view kept from another document may be one this document does not have,
497
497
  * and the panel then shows the screen's Layers. The layer answers, because
498
498
  * some of the views are its own and which of them a document has is its to
499
- * know; the screen says whether its Media view is there to show
500
- * (`hasMedia`), so there is ONE fallback and not one on each side.
499
+ * know. The screen has no media view (the media library is a popup,
500
+ * harness UI-20): a stored "media" view resolves to Layers like any other
501
+ * view this document does not have.
501
502
  */
502
- resolveLeftView?: (view: string, hasMedia: boolean) => string;
503
+ resolveLeftView?: (view: string) => string;
503
504
  /**
504
505
  * A tool of the layer's own at the foot of the Layers tree, under the last
505
506
  * row: something that reads the whole document and is not a row of it.
@@ -947,6 +948,44 @@ interface ScreenDragItem {
947
948
  nodeId: string;
948
949
  slot: string;
949
950
  };
951
+ /** A file carried out of the host's media popup (`ScreenCanvasDrag.media`):
952
+ * `add` is what it becomes between things, and a drop on a thing that
953
+ * takes it puts it there instead. */
954
+ media?: true;
955
+ }
956
+ /** A file from the host's media library, dropped on the canvas (harness
957
+ * UI-20, 2026-10-23), as the host's pick path gave it back (`MediaPlace`):
958
+ * `url` is what draws. */
959
+ interface ScreenMediaFile {
960
+ id: string;
961
+ url: string;
962
+ kind: "image" | "video";
963
+ name: string;
964
+ }
965
+ /**
966
+ * A FILE FROM THE MEDIA POPUP, DROPPED ON THE CANVAS (`ScreenCanvasDrag.media`,
967
+ * harness UI-20, owner decision Lewis 2026-10-23). The drag is the screen's:
968
+ * it hears a file carried out of the host's popup, offers the places a new
969
+ * picture may go — the lines Add's tiles get — and outlines a thing the file
970
+ * may land ON. What a picture IS in this document is the layer's; what the
971
+ * file becomes in the host first is the host's (`MediaPanelProvider` `place`,
972
+ * its pick path: a website copies in a file another website holds).
973
+ */
974
+ interface ScreenMediaDrop {
975
+ /** What a file dropped BETWEEN things becomes: Add's entry for the layer's
976
+ * picture block, offered at exactly the places Add would offer it. */
977
+ adds: {
978
+ kind: "section" | "block";
979
+ type: string;
980
+ };
981
+ /** May a file land ON this node, its picture replaced by it? */
982
+ takes: (node: ScreenNode) => boolean;
983
+ /** The node's props with the file as its picture. */
984
+ replace: (node: ScreenNode, file: ScreenMediaFile) => Record<string, unknown>;
985
+ /** A new node of `adds` holding the file, for a drop between things, made
986
+ * with what the screen lends a rule that builds a node (its defaults, its
987
+ * ids). */
988
+ create: (file: ScreenMediaFile, maker: ScreenNodeMaker) => ScreenNode;
950
989
  }
951
990
  /**
952
991
  * What the screen tells a layer's canvas drag each time it asks
@@ -1014,6 +1053,9 @@ interface ScreenCanvasDrag {
1014
1053
  /** A handle CLICKED, not dragged: select what it names. Handed the screen's
1015
1054
  * own (`base`: the node, as a press on its row selects it). Absent: `base`. */
1016
1055
  pick?: (item: ScreenDragItem, base: (item: ScreenDragItem) => void, context: ScreenCanvasDragContext) => void;
1056
+ /** A file carried out of the host's media popup lands on the canvas
1057
+ * (`ScreenMediaDrop`). Absent: the canvas takes no such file. */
1058
+ media?: ScreenMediaDrop;
1017
1059
  }
1018
1060
  /** What a layer's head over the canvas is handed (`ScreenParts.CanvasHead`,
1019
1061
  * 0.105.0): the device the canvas is drawn as, so it can say what is the
@@ -1280,8 +1322,7 @@ interface ScreenStyleClipboard {
1280
1322
  interface ScreenParts {
1281
1323
  /**
1282
1324
  * The name a panel's head gives what is being edited — the website's name,
1283
- * a campaign's — as the hook the head calls. The media panel's context line
1284
- * reads it (components/MediaSidePanel), through `useScreenOwnerName`.
1325
+ * a campaign's — as the hook the head calls, through `useScreenOwnerName`.
1285
1326
  */
1286
1327
  useOwnerName?: () => string;
1287
1328
  /**
@@ -1519,4 +1560,4 @@ declare function useScreenCanvasTarget(): CanvasTarget | null;
1519
1560
  * engine's plain rows for the selection. */
1520
1561
  declare function useScreenInspectorPanel(): ComponentType<ScreenInspectorPanelProps>;
1521
1562
 
1522
- export { type NodeDefaults, SELECTION_MODE, type ScreenBlockLook, type ScreenBlockRules, type ScreenBridges, type ScreenCanvas, type ScreenCanvasDrag, type ScreenCanvasDragContext, type ScreenCanvasHeadProps, ScreenCanvasTargetProvider, type ScreenDevices, type ScreenDocumentOps, type ScreenDragItem, type ScreenInspector, type ScreenInspectorMode, type ScreenInspectorPanelProps, type ScreenLeftPanel, type ScreenLeftView, type ScreenLeftViewFrame, type ScreenLeftViewRules, type ScreenMainAction, type ScreenMenuItem, type ScreenMenuRows, type ScreenNewNode, type ScreenNode, type ScreenNodeActions, type ScreenNodeLevel, type ScreenNodeMaker, type ScreenPartMode, type ScreenParts, ScreenPartsProvider, type ScreenPinnedBand, type ScreenPinnedNodes, type ScreenRailItem, type ScreenSelector, type ScreenSharedSections, type ScreenSlot, type ScreenSlotAction, type ScreenSlotMode, type ScreenStyleClipboard, type ScreenStyleDocument, type ScreenStylePastePlan, type ScreenToastExtra, type ScreenTree, type ScreenTreeFolds, type ScreenTreeRows, isPinnedFirst, isPinnedLast, isSlotMode, sameInspectorMode, screenSlotsOf, useScreenBlockLook, useScreenBlockRules, useScreenBridges, useScreenCanvasDrag, useScreenCanvasFrame, useScreenCanvasHead, useScreenCanvasTarget, useScreenDevices, useScreenDocumentLabel, useScreenDocumentPass, useScreenInspectorPanel, useScreenLeftView, useScreenNodeKeys, useScreenNotify, useScreenOwnerName, useScreenParts, useScreenPickFollowsSelection, useScreenPinned, useScreenSaveSwitch, useScreenStorageNamespace, useScreenStyleClipboard, useStandaloneScreenBridges };
1563
+ export { type NodeDefaults, SELECTION_MODE, type ScreenBlockLook, type ScreenBlockRules, type ScreenBridges, type ScreenCanvas, type ScreenCanvasDrag, type ScreenCanvasDragContext, type ScreenCanvasHeadProps, ScreenCanvasTargetProvider, type ScreenDevices, type ScreenDocumentOps, type ScreenDragItem, type ScreenInspector, type ScreenInspectorMode, type ScreenInspectorPanelProps, type ScreenLeftPanel, type ScreenLeftView, type ScreenLeftViewFrame, type ScreenLeftViewRules, type ScreenMainAction, type ScreenMediaDrop, type ScreenMediaFile, type ScreenMenuItem, type ScreenMenuRows, type ScreenNewNode, type ScreenNode, type ScreenNodeActions, type ScreenNodeLevel, type ScreenNodeMaker, type ScreenPartMode, type ScreenParts, ScreenPartsProvider, type ScreenPinnedBand, type ScreenPinnedNodes, type ScreenRailItem, type ScreenSelector, type ScreenSharedSections, type ScreenSlot, type ScreenSlotAction, type ScreenSlotMode, type ScreenStyleClipboard, type ScreenStyleDocument, type ScreenStylePastePlan, type ScreenToastExtra, type ScreenTree, type ScreenTreeFolds, type ScreenTreeRows, isPinnedFirst, isPinnedLast, isSlotMode, sameInspectorMode, screenSlotsOf, useScreenBlockLook, useScreenBlockRules, useScreenBridges, useScreenCanvasDrag, useScreenCanvasFrame, useScreenCanvasHead, useScreenCanvasTarget, useScreenDevices, useScreenDocumentLabel, useScreenDocumentPass, useScreenInspectorPanel, useScreenLeftView, useScreenNodeKeys, useScreenNotify, useScreenOwnerName, useScreenParts, useScreenPickFollowsSelection, useScreenPinned, useScreenSaveSwitch, useScreenStorageNamespace, useScreenStyleClipboard, useStandaloneScreenBridges };
@@ -1 +1 @@
1
- export{SELECTION_MODE,ScreenCanvasTargetProvider,ScreenPartsProvider,isPinnedFirst,isPinnedLast,isSlotMode,sameInspectorMode,screenSlotsOf,useScreenBlockLook,useScreenBlockRules,useScreenBridges,useScreenCanvasDrag,useScreenCanvasFrame,useScreenCanvasHead,useScreenCanvasTarget,useScreenDevices,useScreenDocumentLabel,useScreenDocumentPass,useScreenInspectorPanel,useScreenLeftView,useScreenNodeKeys,useScreenNotify,useScreenOwnerName,useScreenParts,useScreenPickFollowsSelection,useScreenPinned,useScreenSaveSwitch,useScreenStorageNamespace,useScreenStyleClipboard,useStandaloneScreenBridges}from"../../chunk-W6SDWCOL.js";import"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-PLVEGYK6.js";import"../../chunk-QEAUF632.js";import"../../chunk-TBY3DFKS.js";import"../../chunk-5ZBV5RA6.js";import"../../chunk-BPXEFVSQ.js";import"../../chunk-A6Z4SD3I.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-XWFH2NHZ.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-X3TYRF5V.js";import"../../chunk-BALFHI3G.js";import"../../chunk-RC25EGHD.js";import"../../chunk-KFV7N2DJ.js";import"../../chunk-23VM4PMV.js";import"../../chunk-B4JN227A.js";import"../../chunk-2XMHLXMA.js";import"../../chunk-G3GWAP5R.js";import"../../chunk-WRFD4EXD.js";import"../../chunk-36LVP5WD.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-67GNT6PF.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-X4T6JT3M.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
1
+ export{SELECTION_MODE,ScreenCanvasTargetProvider,ScreenPartsProvider,isPinnedFirst,isPinnedLast,isSlotMode,sameInspectorMode,screenSlotsOf,useScreenBlockLook,useScreenBlockRules,useScreenBridges,useScreenCanvasDrag,useScreenCanvasFrame,useScreenCanvasHead,useScreenCanvasTarget,useScreenDevices,useScreenDocumentLabel,useScreenDocumentPass,useScreenInspectorPanel,useScreenLeftView,useScreenNodeKeys,useScreenNotify,useScreenOwnerName,useScreenParts,useScreenPickFollowsSelection,useScreenPinned,useScreenSaveSwitch,useScreenStorageNamespace,useScreenStyleClipboard,useStandaloneScreenBridges}from"../../chunk-J4MHNAED.js";import"../../chunk-LNHT2KPX.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-PLVEGYK6.js";import"../../chunk-CPFDJMFD.js";import"../../chunk-TBY3DFKS.js";import"../../chunk-5ZBV5RA6.js";import"../../chunk-BPXEFVSQ.js";import"../../chunk-A6Z4SD3I.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-XWFH2NHZ.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-BALFHI3G.js";import"../../chunk-X3TYRF5V.js";import"../../chunk-RC25EGHD.js";import"../../chunk-KFV7N2DJ.js";import"../../chunk-23VM4PMV.js";import"../../chunk-KRL3IUV3.js";import"../../chunk-2XMHLXMA.js";import"../../chunk-G3GWAP5R.js";import"../../chunk-WRFD4EXD.js";import"../../chunk-36LVP5WD.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-67GNT6PF.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-X4T6JT3M.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
@@ -678,10 +678,11 @@
678
678
  carrying its hairline up through the bar, the buttons spread across it (his
679
679
  option A, spread evenly), and the arrow under the open panel's icon — is editor-shell's
680
680
  `.es-cluster--rail` (efficient-easel/chrome.css), lifted from this sheet with its
681
- `flex: none` and its clip-path triangle (redesign 2a). ⚠️ `MIN_PANEL_W` 220 is
682
- still load-bearing on it: six 34px buttons fill 204 exactly, and a SEVENTH
683
- rail button does not fit at 220. `scripts/test-editor-rail-in-topbar.ts`
684
- holds that arithmetic. */
681
+ `flex: none` and its clip-path triangle (redesign 2a). ⚠️ The LEFT panel's
682
+ floor (`MIN_PANEL_W_BY_SIDE.left`, 240 since ruling A4g; it was the shared
683
+ 220) is still load-bearing on it: six 34px buttons fill 204, and a SEVENTH
684
+ (238) only just fits at 240. `scripts/test-editor-rail-in-topbar.ts` (in
685
+ efficient-web-builder) holds that arithmetic. */
685
686
  /* The rail's "+" (`.sf-rail-plus`) went in 11.0.0: Add opens from the Layers
686
687
  head's "+" and a canvas ➕ (owner ruling A1, amended 2026-10-14). */
687
688
 
@@ -296,6 +296,9 @@ type ScreenWords = {
296
296
  /** The cell over an EMPTY slot on the canvas, after its "+" (0.106.0): the
297
297
  * campaign designer's "Add a block". */
298
298
  canvasAddBlock: string;
299
+ /** What a picture from the media popup does when it is held over an image
300
+ * on the canvas (harness UI-20, 2026-10-23). */
301
+ canvasReplaceImage: string;
299
302
  /** The rail's button to the media library (0.106.0). Owner ruling R21
300
303
  * (Victor Mau, 2026-10-09): the campaign designer's rail reads Add,
301
304
  * Layers, Email styles, Media. The panel's own head keeps its word
@@ -1 +1 @@
1
- export{DEFAULT_SCREEN_ADD_WORDS,DEFAULT_SCREEN_SAVE_STATUS_WORDS,DEFAULT_SCREEN_SHARED_WORDS,DEFAULT_SCREEN_WORDS}from"../chunk-C2RHV42O.js";
1
+ export{DEFAULT_SCREEN_ADD_WORDS,DEFAULT_SCREEN_SAVE_STATUS_WORDS,DEFAULT_SCREEN_SHARED_WORDS,DEFAULT_SCREEN_WORDS}from"../chunk-23DYNW6S.js";
@@ -1,11 +1,11 @@
1
- import { a as SaveWords } from '../words-DkWcK1rh.js';
2
- import { N as NoticeWords, C as ChromeWords } from '../words-BpiVrsW5.js';
3
- import { C as CopyWords } from '../words-D-yhjdOg.js';
1
+ import { a as SaveWords } from '../words-Cm8PMYn0.js';
2
+ import { N as NoticeWords, C as ChromeWords } from '../words-DYu4iBrR.js';
3
+ import { C as CopyWords } from '../words-BpTjCfqO.js';
4
4
  import { D as DragWords } from '../words-CvwYvkJm.js';
5
5
  import { LockWords } from '../edit-lock/index.js';
6
6
  import { F as FieldsWords } from '../words-vhnV8sM7.js';
7
7
  import { N as NodeMenuWords } from '../words-DMG4dYq2.js';
8
- import { P as PanelWords } from '../words-zH1H0WFw.js';
8
+ import { P as PanelWords } from '../words-BeX5eGq7.js';
9
9
  import { P as PickWords } from '../words-DWvCJXwR.js';
10
10
  import { ScreenWords } from '../screen/words.js';
11
11
  export { ScreenAddWords, ScreenSharedWords } from '../screen/words.js';
@@ -14,10 +14,10 @@ import { T as TextStylesWords } from '../words-gIDCeRv3.js';
14
14
  import { T as TreeWords } from '../words-Cl9xMUYY.js';
15
15
  import * as react from 'react';
16
16
  import { ReactNode } from 'react';
17
- import '../types-DT8ywrFQ.js';
17
+ import '../types-B3iSHX-w.js';
18
18
  import '../types-Cy7rdmXt.js';
19
19
  import '../wordFit-7XpmhcaW.js';
20
- import '../panelWidths-D9hTLR25.js';
20
+ import '../panelWidths-DgQXiPXU.js';
21
21
  import '../engine-CvXpFE86.js';
22
22
  import 'efficient-shell/markup';
23
23
  import '../buckets-Tj-nkBpg.js';
@@ -1,2 +1,2 @@
1
- import{DEFAULT_SCREEN_WORDS as r}from"../chunk-C2RHV42O.js";import{DEFAULT_STYLE_CLIPBOARD_WORDS as o}from"../chunk-6WY6ZXJG.js";import{DEFAULT_TEXT_STYLES_WORDS as n}from"../chunk-OGH6CC3E.js";import{DEFAULT_PICK_WORDS as t}from"../chunk-OFBZOI6W.js";import{DEFAULT_CANVAS_WORDS as c}from"../chunk-TBY3DFKS.js";import{DEFAULT_TREE_WORDS as e}from"../chunk-K56YDHYQ.js";import{DEFAULT_NODE_MENU_WORDS as m}from"../chunk-WK3AFPXY.js";import{DEFAULT_PANEL_WORDS as i}from"../chunk-KFV7N2DJ.js";import{DEFAULT_SAVE_WORDS as s}from"../chunk-H6DDIBQ4.js";import{DEFAULT_CHROME_WORDS as u,DEFAULT_NOTICE_WORDS as f}from"../chunk-Z6PVRXVY.js";import{DEFAULT_RAIL_WORDS as p}from"../chunk-2OAZYSWJ.js";import{DEFAULT_LOCK_WORDS as l}from"../chunk-RE4LP46F.js";import{DEFAULT_COPY_WORDS as h}from"../chunk-B4JN227A.js";import{DEFAULT_FIELDS_WORDS as j}from"../chunk-WRFD4EXD.js";import{stringsContext as k}from"../chunk-MFIRYGHW.js";import{DEFAULT_DRAG_WORDS as a}from"../chunk-KAML3KQH.js";import{useContext as Y,useMemo as y}from"react";import{jsx as D}from"react/jsx-runtime";var F={notice:f,lock:l,save:s,chrome:u,rail:p,tree:e,panel:i,fields:j,pick:t,drag:a,menu:m,styleClipboard:o,copy:h,canvas:c,textStyles:n,screen:r},d=r=>"object"==typeof r&&null!==r;function v(r,o){const n={};for(const t of Object.keys(r)){const c=r[t],e=o[t];null==e?n[t]=c:d(c)?n[t]=d(e)?v(c,e):c:n[t]=typeof e==typeof c?e:c}return n}function H(r,o){return o?v(r,o):r}function K({value:r,locale:o,children:n}){const t=k(),c=Y(t),e=c?.strings??F,m=o??c?.locale??"en",i=y(()=>({strings:H(e,r),locale:m}),[e,r,m]);/* @__PURE__ */
2
- return D(t.Provider,{value:i,children:n})}function O(){return Y(k())?.strings??F}function W(){return Y(k())?.locale??"en"}export{F as DEFAULT_EASEL_STRINGS,K as EaselStringsProvider,H as mergeEaselStrings,W as useEaselLocale,O as useEaselStrings};
1
+ import{DEFAULT_STYLE_CLIPBOARD_WORDS as r}from"../chunk-6WY6ZXJG.js";import{DEFAULT_SCREEN_WORDS as o}from"../chunk-23DYNW6S.js";import{DEFAULT_TEXT_STYLES_WORDS as n}from"../chunk-OGH6CC3E.js";import{DEFAULT_PICK_WORDS as t}from"../chunk-OFBZOI6W.js";import{DEFAULT_CANVAS_WORDS as c}from"../chunk-TBY3DFKS.js";import{DEFAULT_TREE_WORDS as e}from"../chunk-K56YDHYQ.js";import{DEFAULT_NODE_MENU_WORDS as m}from"../chunk-WK3AFPXY.js";import{DEFAULT_PANEL_WORDS as i}from"../chunk-KFV7N2DJ.js";import{DEFAULT_SAVE_WORDS as s}from"../chunk-H6DDIBQ4.js";import{DEFAULT_CHROME_WORDS as u,DEFAULT_NOTICE_WORDS as f}from"../chunk-AJSDWWJW.js";import{DEFAULT_RAIL_WORDS as p}from"../chunk-2OAZYSWJ.js";import{DEFAULT_LOCK_WORDS as l}from"../chunk-RE4LP46F.js";import{DEFAULT_COPY_WORDS as h}from"../chunk-KRL3IUV3.js";import{DEFAULT_FIELDS_WORDS as j}from"../chunk-WRFD4EXD.js";import{stringsContext as k}from"../chunk-MFIRYGHW.js";import{DEFAULT_DRAG_WORDS as a}from"../chunk-KAML3KQH.js";import{useContext as W,useMemo as D}from"react";import{jsx as Y}from"react/jsx-runtime";var y={notice:f,lock:l,save:s,chrome:u,rail:p,tree:e,panel:i,fields:j,pick:t,drag:a,menu:m,styleClipboard:r,copy:h,canvas:c,textStyles:n,screen:o},F=r=>"object"==typeof r&&null!==r;function K(r,o){const n={};for(const t of Object.keys(r)){const c=r[t],e=o[t];null==e?n[t]=c:F(c)?n[t]=F(e)?K(c,e):c:n[t]=typeof e==typeof c?e:c}return n}function d(r,o){return o?K(r,o):r}function v({value:r,locale:o,children:n}){const t=k(),c=W(t),e=c?.strings??y,m=o??c?.locale??"en",i=D(()=>({strings:d(e,r),locale:m}),[e,r,m]);/* @__PURE__ */
2
+ return Y(t.Provider,{value:i,children:n})}function H(){return W(k())?.strings??y}function J(){return W(k())?.locale??"en"}export{y as DEFAULT_EASEL_STRINGS,v as EaselStringsProvider,d as mergeEaselStrings,J as useEaselLocale,H as useEaselStrings};
@@ -1,7 +1,7 @@
1
1
  import { E as EaselRailItem } from './types-Cy7rdmXt.js';
2
2
  import { ReactNode, Ref, CSSProperties } from 'react';
3
3
  import { EditAccess, SaveConflict } from './edit-lock/index.js';
4
- import { P as PanelSide } from './panelWidths-D9hTLR25.js';
4
+ import { P as PanelSide } from './panelWidths-DgQXiPXU.js';
5
5
 
6
6
  type TopBarProps = {
7
7
  children?: ReactNode;
@@ -110,26 +110,6 @@ type InspectorHeadProps = {
110
110
  /** `InspectorIconButton`s, right-aligned. Omit when the thing has no actions. */
111
111
  actions?: ReactNode;
112
112
  };
113
- /** What a field can hold, as `MediaPanelHead` says it (`ChromeWords.mediaKinds`). */
114
- type MediaPickKind = 'image' | 'video' | 'svg';
115
- type MediaPanelHeadProps = {
116
- /** The line under "Media library": which website or campaign the panel is
117
- * open in. Also the line under "Choose …" when the field has no name. */
118
- context: ReactNode;
119
- /** The field choosing right now, or null while browsing. `field` is the
120
- * host's label for it ("Background image"). */
121
- pick: {
122
- kind: MediaPickKind;
123
- field?: string;
124
- } | null;
125
- /** Leave choosing: the field keeps what it had. */
126
- onCancel: () => void;
127
- /** Hide the panel. Omitted where the panel cannot be hidden, and then no
128
- * Hide button is drawn. */
129
- onHide?: () => void;
130
- /** Which side panel the head is on; picks the Hide glyph and its name. */
131
- side?: 'left' | 'right';
132
- };
133
113
  type InspectorUpLevelProps = {
134
114
  /** What the level above is called — the section, the column, the group. The link's words. */
135
115
  name: string;
@@ -220,4 +200,4 @@ type SaveIconProps = {
220
200
  label: string;
221
201
  };
222
202
 
223
- 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, SaveIconState as a, TopBarClusterProps as b, TopBarRailProps as c, DeviceSwitchProps as d, SaveStateProps as e, SaveStateToggleProps as f, SaveIconProps as g, SaveIconTone as h, InspectorIconButtonProps as i, InspectorUpLevelProps as j, MediaPickKind as k, EditNoticeProps as l };
203
+ export type { DeviceOption as D, EaselIconButtonProps as E, InspectorHeadProps as I, PanelResizeHandleProps as P, RailWordsShown as R, SaveTone as S, TopBarProps as T, SaveIconState as a, TopBarClusterProps as b, TopBarRailProps as c, DeviceSwitchProps as d, SaveStateProps as e, SaveStateToggleProps as f, SaveIconProps as g, SaveIconTone as h, InspectorIconButtonProps as i, InspectorUpLevelProps as j, EditNoticeProps as k };
@@ -10,8 +10,8 @@ import { S as SettingsBucket, D as DesignGroup } from './buckets-Tj-nkBpg.js';
10
10
  * group's key (`DESIGN_GROUPS`) is the same: `designGroups` is its word.
11
11
  *
12
12
  * The panel is hook-free, so nothing here is read from the strings provider:
13
- * `SettingsTabs` takes its name as `ariaLabel` and each tab's word as the
14
- * item's `label`, and `Inspector` (which has hooks) passes both.
13
+ * `Inspector` (which has hooks) reads them and hands the shell's `Tabs` the
14
+ * strip's name and each tab's word.
15
15
  * `SettingsDefaultReset` takes `words`, and a host passes the four from
16
16
  * `useWords('panel', …)`.
17
17
  */