efficient-easel 0.105.1 → 1.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 (184) hide show
  1. package/README.md +103 -29
  2. package/dist/{LinkPicker-W2Rtxetz.d.ts → LinkPicker-hPEr1MJx.d.ts} +6 -4
  3. package/dist/autosave/index.d.ts +5 -5
  4. package/dist/chrome/chrome.css +50 -273
  5. package/dist/chrome/index.d.ts +61 -56
  6. package/dist/chrome/index.js +1 -1
  7. package/dist/chunk-2GVCAIPX.js +1 -0
  8. package/dist/chunk-4GNPKHV4.js +64 -0
  9. package/dist/chunk-5545A3PC.js +4 -0
  10. package/dist/chunk-7SQF6LZL.js +1 -0
  11. package/dist/chunk-BXMXTO36.js +1 -0
  12. package/dist/{chunk-NYKIQJT2.js → chunk-CKEPQNSQ.js} +1 -1
  13. package/dist/chunk-DJMMTWFP.js +1 -0
  14. package/dist/{chunk-PQXIFBDY.js → chunk-E2O2MRZR.js} +1 -1
  15. package/dist/chunk-EA2HTX37.js +5 -0
  16. package/dist/{chunk-SARZN4M7.js → chunk-FEK3S6HN.js} +1 -1
  17. package/dist/chunk-FPAVNX3Y.js +6 -0
  18. package/dist/chunk-HMJS344F.js +1 -0
  19. package/dist/chunk-JLTZQ4US.js +1 -0
  20. package/dist/chunk-JMGPPXNQ.js +24 -0
  21. package/dist/chunk-K56YDHYQ.js +1 -0
  22. package/dist/chunk-LOMEH6DG.js +1 -0
  23. package/dist/{chunk-V4LF7D4F.js → chunk-MAEXP3KE.js} +1 -1
  24. package/dist/chunk-MJM6SFD3.js +3 -0
  25. package/dist/chunk-NLRW4BGG.js +8 -0
  26. package/dist/chunk-OJAJVH7S.js +5 -0
  27. package/dist/chunk-ONRYLR2D.js +2 -0
  28. package/dist/chunk-ORR3Q4WV.js +1 -0
  29. package/dist/chunk-OTEXGJDU.js +5 -0
  30. package/dist/chunk-P2VEMZH5.js +1 -0
  31. package/dist/chunk-PT6V53OO.js +1 -0
  32. package/dist/chunk-PYCLHOSA.js +9 -0
  33. package/dist/chunk-Q27BB5ZC.js +14 -0
  34. package/dist/chunk-QLD57GBB.js +6 -0
  35. package/dist/{chunk-NWIW7AWH.js → chunk-QMNML7XH.js} +1 -1
  36. package/dist/chunk-QR4DLZ3P.js +5 -0
  37. package/dist/chunk-TJ7YIRWQ.js +21 -0
  38. package/dist/{chunk-3P6AMTOS.js → chunk-VPFNZ7TB.js} +1 -1
  39. package/dist/chunk-W3XX2CNW.js +16 -0
  40. package/dist/chunk-X6DQWK2C.js +1 -0
  41. package/dist/chunk-XWR5YVA7.js +9 -0
  42. package/dist/chunk-YABL4EWX.js +7 -0
  43. package/dist/chunk-ZNNATBDC.js +1 -0
  44. package/dist/chunk-ZP4G3X44.js +4 -0
  45. package/dist/copy/copy.css +66 -177
  46. package/dist/copy/index.d.ts +0 -2
  47. package/dist/copy/index.js +31 -32
  48. package/dist/drag/drag.css +31 -11
  49. package/dist/drag/index.d.ts +10 -0
  50. package/dist/drag/index.js +1 -1
  51. package/dist/easel/index.d.ts +10 -1
  52. package/dist/easel/index.js +1 -1
  53. package/dist/fields/fields.css +35 -304
  54. package/dist/fields/index.d.ts +87 -95
  55. package/dist/fields/index.js +1 -1
  56. package/dist/gold/gold.css +3 -3
  57. package/dist/gold/index.d.ts +6 -5
  58. package/dist/gold/index.js +1 -1
  59. package/dist/{host-BQ_b9Qzk.d.ts → host-CiuzZJXj.d.ts} +11 -1
  60. package/dist/index.d.ts +3 -3
  61. package/dist/index.js +1 -1
  62. package/dist/menu/index.d.ts +49 -93
  63. package/dist/menu/index.js +1 -1
  64. package/dist/menu/menu.css +37 -246
  65. package/dist/node-ops/index.d.ts +1 -1
  66. package/dist/panel/index.d.ts +46 -72
  67. package/dist/panel/index.js +17 -18
  68. package/dist/panel/panel.css +143 -372
  69. package/dist/pick/index.d.ts +52 -33
  70. package/dist/pick/index.js +7 -7
  71. package/dist/pick/pick.css +19 -150
  72. package/dist/rail/index.d.ts +48 -90
  73. package/dist/rail/index.js +1 -1
  74. package/dist/rail/rail.css +21 -108
  75. package/dist/screen/components/AddBlockRow.d.ts +8 -2
  76. package/dist/screen/components/AddBlockRow.js +1 -1
  77. package/dist/screen/components/AddChildRow.d.ts +4 -3
  78. package/dist/screen/components/AddChildRow.js +1 -1
  79. package/dist/screen/components/AddSidePanel.js +1 -1
  80. package/dist/screen/components/MediaSidePanel.d.ts +2 -2
  81. package/dist/screen/components/MediaSidePanel.js +1 -1
  82. package/dist/screen/components/NodeContextMenu.d.ts +31 -9
  83. package/dist/screen/components/NodeContextMenu.js +1 -1
  84. package/dist/screen/components/PageEditGuardNotices.js +1 -1
  85. package/dist/screen/components/ScreenChrome.js +1 -1
  86. package/dist/screen/components/ScreenDocumentContext.d.ts +2 -2
  87. package/dist/screen/components/ScreenDocumentContext.js +1 -1
  88. package/dist/screen/components/ScreenMount.d.ts +8 -8
  89. package/dist/screen/components/ScreenMount.js +1 -1
  90. package/dist/screen/components/ScreenStoreProvider.d.ts +8 -8
  91. package/dist/screen/components/ScreenStoreProvider.js +1 -1
  92. package/dist/screen/components/SectionScreenShell.js +16 -16
  93. package/dist/screen/components/SidePanelHead.d.ts +4 -2
  94. package/dist/screen/components/SidePanelHead.js +1 -1
  95. package/dist/screen/components/UiIcon.d.ts +10 -26
  96. package/dist/screen/components/UiIcon.js +2 -1
  97. package/dist/screen/components/panel-widths.d.ts +15 -1
  98. package/dist/screen/components/panel-widths.js +1 -1
  99. package/dist/screen/components/usePartBridge.d.ts +8 -8
  100. package/dist/screen/components/usePartBridge.js +1 -1
  101. package/dist/screen/index.d.ts +9 -9
  102. package/dist/screen/index.js +1 -1
  103. package/dist/screen/lib/admin-bridge.d.ts +1 -1
  104. package/dist/screen/lib/admin-bridge.js +1 -1
  105. package/dist/screen/lib/chrome-theme.d.ts +20 -12
  106. package/dist/screen/lib/chrome-theme.js +1 -1
  107. package/dist/screen/lib/document-addressing.d.ts +2 -2
  108. package/dist/screen/lib/host-chrome.d.ts +1 -1
  109. package/dist/screen/lib/host.d.ts +2 -2
  110. package/dist/screen/lib/key-scope.d.ts +31 -2
  111. package/dist/screen/lib/key-scope.js +1 -1
  112. package/dist/screen/lib/links/link-filters.d.ts +1 -1
  113. package/dist/screen/lib/media-panel.d.ts +2 -2
  114. package/dist/screen/lib/media-picker.d.ts +2 -2
  115. package/dist/screen/lib/page-lock.d.ts +1 -1
  116. package/dist/screen/lib/puck/section-doc.d.ts +5 -1
  117. package/dist/screen/lib/puck/section-doc.js +1 -1
  118. package/dist/screen/lib/puck/style-clipboard.d.ts +8 -8
  119. package/dist/screen/lib/puck/use-section-ops.js +1 -1
  120. package/dist/screen/lib/screen-parts.d.ts +47 -10
  121. package/dist/screen/lib/screen-parts.js +1 -1
  122. package/dist/screen/lib/section-templates.d.ts +1 -1
  123. package/dist/screen/lib/session-context.d.ts +1 -1
  124. package/dist/screen/lib/session.d.ts +1 -1
  125. package/dist/screen/screen.css +54 -206
  126. package/dist/screen/words.d.ts +17 -1
  127. package/dist/screen/words.js +1 -1
  128. package/dist/shell/index.d.ts +134 -118
  129. package/dist/shell/index.js +1 -1
  130. package/dist/shell/shell.css +130 -88
  131. package/dist/strings/catalogue.d.ts +5 -5
  132. package/dist/strings/catalogue.js +1 -1
  133. package/dist/strings/index.d.ts +5 -5
  134. package/dist/strings/index.js +1 -1
  135. package/dist/style-clipboard/index.d.ts +1 -1
  136. package/dist/text-styles/index.d.ts +12 -3
  137. package/dist/text-styles/index.js +33 -38
  138. package/dist/text-styles/text-styles.css +39 -71
  139. package/dist/tree/index.d.ts +49 -44
  140. package/dist/tree/index.js +1 -1
  141. package/dist/tree/tree.css +31 -653
  142. package/dist/{types-DJDBtdB2.d.ts → types-BqGnUVX5.d.ts} +32 -32
  143. package/dist/types-BsyPh6EW.d.ts +99 -0
  144. package/dist/{types-DWS-s9z-.d.ts → types-CsgMwHHa.d.ts} +14 -11
  145. package/dist/{types-CqY85foL.d.ts → types-Dt1CFR1S.d.ts} +4 -2
  146. package/dist/{wordFit-D4S36PvB.d.ts → wordFit-7XpmhcaW.d.ts} +3 -5
  147. package/dist/words-Cl9xMUYY.d.ts +41 -0
  148. package/dist/{words-D_Lnw1Gr.d.ts → words-CvFnwGSr.d.ts} +1 -1
  149. package/package.json +5 -1
  150. package/dist/chunk-2UX75JDP.js +0 -1
  151. package/dist/chunk-3EDSDPIP.js +0 -1
  152. package/dist/chunk-3QVB4AG2.js +0 -3
  153. package/dist/chunk-3WSPDAK2.js +0 -1
  154. package/dist/chunk-53G47SWO.js +0 -1
  155. package/dist/chunk-5MZ3RNQQ.js +0 -13
  156. package/dist/chunk-5ZBBXZPV.js +0 -6
  157. package/dist/chunk-7FBDZTUD.js +0 -2
  158. package/dist/chunk-7V5WZ46F.js +0 -2
  159. package/dist/chunk-BXZ6WLHC.js +0 -22
  160. package/dist/chunk-BZ5ASXOL.js +0 -1
  161. package/dist/chunk-EOJNJCMJ.js +0 -16
  162. package/dist/chunk-EWVJSRRY.js +0 -6
  163. package/dist/chunk-FMGFZNPW.js +0 -1
  164. package/dist/chunk-H24N5TMZ.js +0 -11
  165. package/dist/chunk-HLEET6NV.js +0 -65
  166. package/dist/chunk-IE4GFYKO.js +0 -1
  167. package/dist/chunk-KTVH2ZRL.js +0 -15
  168. package/dist/chunk-N7VRF7PR.js +0 -5
  169. package/dist/chunk-OWBO4WKA.js +0 -0
  170. package/dist/chunk-P67FP7PG.js +0 -9
  171. package/dist/chunk-P6O363EE.js +0 -6
  172. package/dist/chunk-Q4N7C6CT.js +0 -10
  173. package/dist/chunk-QH6LCNOX.js +0 -8
  174. package/dist/chunk-RW4XBUUW.js +0 -1
  175. package/dist/chunk-TTJ54QGG.js +0 -18
  176. package/dist/chunk-VSHV6KJQ.js +0 -5
  177. package/dist/chunk-VSOP4GUM.js +0 -1
  178. package/dist/chunk-WZ7TGAAT.js +0 -3
  179. package/dist/chunk-YC4TB3CJ.js +0 -25
  180. package/dist/chunk-ZFDCDJNZ.js +0 -16
  181. package/dist/chunk-ZNS7727Y.js +0 -12
  182. package/dist/chunk-ZTTWFAAC.js +0 -1
  183. package/dist/types-Djdq6Xkd.d.ts +0 -138
  184. package/dist/words-DgHcY5qB.d.ts +0 -33
@@ -1,7 +1,7 @@
1
1
  import { StyleRow } from '../../../style-clipboard/index.js';
2
2
  import { ScreenStyleDocument, ScreenNode, ScreenStylePastePlan, ScreenStyleClipboard } from '../screen-parts.js';
3
3
  import { panelFieldsOf } from './panel-fields.js';
4
- import '../../../types-Djdq6Xkd.js';
4
+ import '../../../types-BsyPh6EW.js';
5
5
  import 'react';
6
6
  import '../../../words-CnnHb9jo.js';
7
7
  import '../../../blocks/index.js';
@@ -11,27 +11,27 @@ import '../../../types-41704JE4.js';
11
11
  import '../../../resolve-D68pb3Bx.js';
12
12
  import '../../../plan-DChbUXdS.js';
13
13
  import '../../../watch-BTYOJpQU.js';
14
- import '../../../types-CqY85foL.js';
15
- import '../../../types-DWS-s9z-.js';
16
- import '../../../wordFit-D4S36PvB.js';
14
+ import '../../../types-Dt1CFR1S.js';
15
+ import '../../../types-CsgMwHHa.js';
16
+ import '../../../wordFit-7XpmhcaW.js';
17
17
  import '../../../edit-lock/index.js';
18
18
  import '../../../panelWidths-D9hTLR25.js';
19
19
  import '../../../CanvasDragLayer-zgYT1xwY.js';
20
20
  import '../../../session-DSQFmIvx.js';
21
21
  import '../../../words-BDignMl_.js';
22
- import '../../../types-DJDBtdB2.js';
23
- import '../../../words-DgHcY5qB.js';
22
+ import '../../../types-BqGnUVX5.js';
23
+ import '../../../words-Cl9xMUYY.js';
24
24
  import '../../components/AddSidePanel.js';
25
25
  import '../section-template-types.js';
26
26
  import './content-tree.js';
27
27
  import './block-choice.js';
28
- import '../../../host-BQ_b9Qzk.js';
28
+ import '../../../host-CiuzZJXj.js';
29
29
  import '../document-contract.js';
30
30
  import '../session.js';
31
31
  import '../backend-error.js';
32
32
  import '../host-chrome.js';
33
33
  import '../links/link-filters.js';
34
- import '../../../LinkPicker-W2Rtxetz.js';
34
+ import '../../../LinkPicker-hPEr1MJx.js';
35
35
  import '../document-hooks.js';
36
36
  import '../document-switch.js';
37
37
  import '../../../engine-DBxp_v6B.js';
@@ -1 +1 @@
1
- export{useSectionOps}from"../../../chunk-NWIW7AWH.js";import"../../../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
+ export{useSectionOps}from"../../../chunk-QMNML7XH.js";import"../../../chunk-OJAJVH7S.js";import"../../../chunk-PLVEGYK6.js";import"../../../chunk-R6WTQWAC.js";import"../../../chunk-U3JP4VGF.js";import"../../../chunk-PYCLHOSA.js";import"../../../chunk-AELNNAFM.js";import"../../../chunk-JMGPPXNQ.js";import"../../../chunk-NLRW4BGG.js";import"../../../chunk-XWR5YVA7.js";import"../../../chunk-Q27BB5ZC.js";import"../../../chunk-K56YDHYQ.js";import"../../../chunk-QTLAVDJE.js";import"../../../chunk-YRLPFZW3.js";import"../../../chunk-EA2HTX37.js";import"../../../chunk-D2BCHTQR.js";import"../../../chunk-7SQF6LZL.js";import"../../../chunk-QLD57GBB.js";import"../../../chunk-FPOKPNO4.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-67GNT6PF.js";import"../../../chunk-ZNCEOSXO.js";import"../../../chunk-P2VEMZH5.js";import"../../../chunk-L5KW4HG5.js";import"../../../chunk-KRXQM65X.js";import"../../../chunk-NKB3KVAB.js";
@@ -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-CqY85foL.js';
5
+ import { D as DeviceOption } from '../../types-Dt1CFR1S.js';
6
6
  import { P as Place } from '../../types-41704JE4.js';
7
7
  import { M as MeasuredCanvas, C as CanvasDragModel } from '../../CanvasDragLayer-zgYT1xwY.js';
8
- import { E as EaselContextMenuItem } from '../../types-Djdq6Xkd.js';
9
- import { a as EaselRailItem } from '../../types-DWS-s9z-.js';
8
+ import { E as EaselContextMenuItem } from '../../types-BsyPh6EW.js';
9
+ import { a as EaselRailItem } from '../../types-CsgMwHHa.js';
10
10
  import { StyleRow } from '../../style-clipboard/index.js';
11
- import { T as TreeRowMark } from '../../types-DJDBtdB2.js';
11
+ import { T as TreeRowMark } from '../../types-BqGnUVX5.js';
12
12
  import { AddKey } from '../components/AddSidePanel.js';
13
- import { k as AnyScreenTarget } from '../../host-BQ_b9Qzk.js';
13
+ import { k as AnyScreenTarget } from '../../host-CiuzZJXj.js';
14
14
  import { HostProduct } from './host-chrome.js';
15
15
  import { EaselSession } from './session.js';
16
16
  import { AddTarget } from './puck/add-target-types.js';
@@ -23,9 +23,9 @@ import '../../edit-lock/index.js';
23
23
  import '../../panelWidths-D9hTLR25.js';
24
24
  import '../../session-DSQFmIvx.js';
25
25
  import '../../words-BDignMl_.js';
26
- import '../../wordFit-D4S36PvB.js';
26
+ import '../../wordFit-7XpmhcaW.js';
27
27
  import '../../words-CnnHb9jo.js';
28
- import '../../words-DgHcY5qB.js';
28
+ import '../../words-Cl9xMUYY.js';
29
29
  import './section-template-types.js';
30
30
  import './puck/block-choice.js';
31
31
  import './document-contract.js';
@@ -34,7 +34,7 @@ import '../../engine-DBxp_v6B.js';
34
34
  import './admin-bridge.js';
35
35
  import './backend-error.js';
36
36
  import './links/link-filters.js';
37
- import '../../LinkPicker-W2Rtxetz.js';
37
+ import '../../LinkPicker-hPEr1MJx.js';
38
38
  import './document-hooks.js';
39
39
  import './puck/slot-section-spec.js';
40
40
 
@@ -585,6 +585,19 @@ interface ScreenBlockRules {
585
585
  * the website's never has.
586
586
  */
587
587
  resolveOnInsert?: boolean;
588
+ /**
589
+ * CLEAN A COPY (0.106.0): handed every node the screen COPIES into the
590
+ * document — the menu's Duplicate and Paste, ⌘V (a cut block pasted back
591
+ * too), a saved section put in from Add — one node at a time, a copied
592
+ * section's blocks each as well, and it answers the node as the copy should
593
+ * hold it: what only the original may hold taken out. The campaign
594
+ * designer's image block releases the hosted picture it baked (`bakedId`):
595
+ * the next bake deletes the asset that id names, so two blocks holding one
596
+ * would destroy each other's picture. It must keep the node's id (the copy's
597
+ * own, already fresh) and its type. Absent: a copy is its original, prop for
598
+ * prop, but its ids, as before.
599
+ */
600
+ stripCopy?: (node: ScreenNode) => ScreenNode;
588
601
  }
589
602
  /**
590
603
  * ONE SLOT OF A NODE, as the screen draws it (`ScreenBlockRules.slotsOf`,
@@ -947,6 +960,16 @@ interface ScreenPinnedNodes {
947
960
  isFirst?: (node: ScreenNode) => boolean;
948
961
  /** …and the one pinned last (the Footer). Absent: a node of type `last`. */
949
962
  isLast?: (node: ScreenNode) => boolean;
963
+ /**
964
+ * May a block cross into and out of the node pinned LAST (0.106.0) — dragged
965
+ * in the Layers tree or on the canvas, or pasted? Absent or false, the
966
+ * website's Footer: its blocks reorder within their own slot and nothing
967
+ * from the page's sections lands in it, nor leaves it. True, the campaign
968
+ * designer's Footer, a section whose columns hold any block: its slots are
969
+ * lists like every other's, asked what they take (the slot's own list, the
970
+ * depth, never into itself). The node itself stays pinned either way.
971
+ */
972
+ lastIsOpen?: boolean;
950
973
  /**
951
974
  * How the Layers tree draws the node pinned first (0.103.0). `"panel"`: a
952
975
  * row of its own that opens the layer's panel for it (`panelOf`), drawn
@@ -1203,6 +1226,16 @@ interface ScreenParts {
1203
1226
  /** Where Add puts what it adds, and whether it is a picker of blocks first
1204
1227
  * (0.105.0; `ScreenAdd`). Absent: the screen's Add, as it always was. */
1205
1228
  add?: ScreenAdd;
1229
+ /**
1230
+ * WHERE A PERSON'S PANEL WIDTHS AND TREE FOLDS ARE KEPT (0.106.0): the
1231
+ * first part of the two `localStorage` keys, `<namespace>-panel-widths` and
1232
+ * `<namespace>-collapsed-sections`, so an editor beside the website's keeps
1233
+ * its own — the campaign designer's panels and folds are not the website
1234
+ * editor's. Read once, as the screen mounts. Absent (or empty): the website
1235
+ * editor's keys, `sf-editor-panel-widths` and
1236
+ * `sf-editor-collapsed-sections`, so a website's layout is what it was.
1237
+ */
1238
+ storageNamespace?: string;
1206
1239
  /** Copy style / Paste style's scope and a node's look, where they are the
1207
1240
  * layer's (0.105.0; `ScreenStyleClipboard`). Absent: the website's. */
1208
1241
  styleClipboard?: ScreenStyleClipboard;
@@ -1229,7 +1262,8 @@ interface ScreenParts {
1229
1262
  * rest; and the screen draws no toast of its own. The campaign designer
1230
1263
  * hands the admin portal's toast, so the designer's lines stand where every
1231
1264
  * other window's do. Called as each line is said, so it may change between
1232
- * renders. Absent: the screen's own toast (`.sf-toast`), as before.
1265
+ * renders. Absent: the shell's `toast` (efficient-shell/ui, harness UI-24;
1266
+ * up to 0.106.0 the screen drew a toast of its own, `.sf-toast`).
1233
1267
  */
1234
1268
  notify?: (message: string, tone: "info" | "error") => void;
1235
1269
  /**
@@ -1323,6 +1357,9 @@ declare function useScreenPickFollowsSelection(selection: unknown): void;
1323
1357
  /** Where Add puts what it adds (`add`). With no layer's, nothing: the
1324
1358
  * screen's own Add. */
1325
1359
  declare function useScreenAdd(): ScreenAdd;
1360
+ /** Where widths and folds are kept (`storageNamespace`), or undefined: the
1361
+ * website editor's keys. */
1362
+ declare function useScreenStorageNamespace(): string | undefined;
1326
1363
  /** The layer's style clipboard (`styleClipboard`), or null: the website's. */
1327
1364
  declare function useScreenStyleClipboard(): ScreenStyleClipboard | null;
1328
1365
  /** Whether ⌘C / ⌘X / ⌘V reach the selected block (`nodeKeys`). They do
@@ -1354,4 +1391,4 @@ declare function useScreenCanvasTarget(): CanvasTarget | null;
1354
1391
  * engine's plain rows for the selection. */
1355
1392
  declare function useScreenInspectorPanel(): ComponentType<ScreenInspectorPanelProps>;
1356
1393
 
1357
- export { type NodeDefaults, SELECTION_MODE, type ScreenAdd, 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 ScreenMenuRows, type ScreenNewNode, type ScreenNode, type ScreenNodeActions, type ScreenNodeLevel, type ScreenNodeMaker, type ScreenPartMode, type ScreenParts, ScreenPartsProvider, type ScreenPinnedBand, type ScreenPinnedNodes, type ScreenRailItem, type ScreenSelection, type ScreenSelector, type ScreenSlot, type ScreenSlotAction, type ScreenSlotMode, type ScreenStyleClipboard, type ScreenStyleDocument, type ScreenStylePastePlan, type ScreenTree, type ScreenTreeFolds, type ScreenTreeRows, 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 };
1394
+ export { type NodeDefaults, SELECTION_MODE, type ScreenAdd, 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 ScreenMenuRows, type ScreenNewNode, type ScreenNode, type ScreenNodeActions, type ScreenNodeLevel, type ScreenNodeMaker, type ScreenPartMode, type ScreenParts, ScreenPartsProvider, type ScreenPinnedBand, type ScreenPinnedNodes, type ScreenRailItem, type ScreenSelection, type ScreenSelector, type ScreenSlot, type ScreenSlotAction, type ScreenSlotMode, type ScreenStyleClipboard, type ScreenStyleDocument, type ScreenStylePastePlan, type ScreenTree, type ScreenTreeFolds, type ScreenTreeRows, 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, useScreenStorageNamespace, useScreenStyleClipboard, useStandaloneScreenBridges };
@@ -1 +1 @@
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
+ 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,useScreenStorageNamespace,useScreenStyleClipboard,useStandaloneScreenBridges}from"../../chunk-OJAJVH7S.js";import"../../chunk-PLVEGYK6.js";import"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-PYCLHOSA.js";import"../../chunk-AELNNAFM.js";import"../../chunk-JMGPPXNQ.js";import"../../chunk-NLRW4BGG.js";import"../../chunk-XWR5YVA7.js";import"../../chunk-Q27BB5ZC.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-QTLAVDJE.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-EA2HTX37.js";import"../../chunk-D2BCHTQR.js";import"../../chunk-7SQF6LZL.js";import"../../chunk-QLD57GBB.js";import"../../chunk-FPOKPNO4.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-67GNT6PF.js";import"../../chunk-ZNCEOSXO.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-L5KW4HG5.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
@@ -12,7 +12,7 @@ import './backend-error.js';
12
12
  import '../../edit-lock/index.js';
13
13
  import './host-chrome.js';
14
14
  import './links/link-filters.js';
15
- import '../../LinkPicker-W2Rtxetz.js';
15
+ import '../../LinkPicker-hPEr1MJx.js';
16
16
  import './document-contract.js';
17
17
  import './document-hooks.js';
18
18
 
@@ -11,7 +11,7 @@ import './backend-error.js';
11
11
  import '../../edit-lock/index.js';
12
12
  import './host-chrome.js';
13
13
  import './links/link-filters.js';
14
- import '../../LinkPicker-W2Rtxetz.js';
14
+ import '../../LinkPicker-hPEr1MJx.js';
15
15
  import './document-contract.js';
16
16
  import './document-hooks.js';
17
17
  import './section-template-types.js';
@@ -12,7 +12,7 @@ import '../../resolve-D68pb3Bx.js';
12
12
  import '../../plan-DChbUXdS.js';
13
13
  import '../../edit-lock/index.js';
14
14
  import './links/link-filters.js';
15
- import '../../LinkPicker-W2Rtxetz.js';
15
+ import '../../LinkPicker-hPEr1MJx.js';
16
16
  import './puck/content-tree.js';
17
17
 
18
18
  /**
@@ -15,13 +15,19 @@
15
15
  * draws to a rule in them.
16
16
  * The `sf-` names are kept: the hosts' sheets and their guards address them.
17
17
  *
18
+ * The `--sf-*` aliases below stay (hosts read them), but they resolve through
19
+ * `--es-*` to efficient-shell's tokens since UI-24 (efficient-harness#117):
20
+ * a host that loads the shell's CSS first gets the shell's theme, dark
21
+ * included, in every `--sf-*` name too. `--sf-frame-bg` is the canvas's
22
+ * paper — output, not chrome — and stays the page's white.
23
+ *
18
24
  * Load it after the other easel sheets and before a host's own sheet, which is
19
25
  * where these rules sat in the builder's; that order is the one the cascade
20
26
  * was measured in.
21
27
  */
22
28
 
23
29
  .sf-editor {
24
- /* ── Accent (efficient-shell blue) ───────────────────────────────────── */
30
+ /* ── Accent (efficient-shell's) ──────────────────────────────────────── */
25
31
  --sf-accent: var(--es-accent);
26
32
  --sf-accent-tint: var(--es-accent-tint);
27
33
  --sf-accent-tint-strong: var(--es-accent-tint-strong);
@@ -30,7 +36,7 @@
30
36
  --sf-accent-shadow: var(--es-accent-shadow);
31
37
  --sf-on-accent: var(--es-on-accent);
32
38
 
33
- /* ── Surfaces (cool gray ramp) ──────────────────────────────────────── */
39
+ /* ── Surfaces (shell ramp) ──────────────────────────────────────────── */
34
40
  --sf-app-bg: var(--es-app-bg);
35
41
  --sf-preview-bg: var(--es-preview-bg);
36
42
  --sf-panel: var(--es-panel);
@@ -70,7 +76,7 @@
70
76
  --sf-scrollbar: var(--es-scrollbar);
71
77
  --sf-scrollbar-hover: var(--es-scrollbar-hover);
72
78
 
73
- /* ── Danger / warning / success (shell red / amber / green) ─────────── */
79
+ /* ── Danger / warning / success (shell status tiers) ───────────────── */
74
80
  --sf-danger: var(--es-danger);
75
81
  --sf-danger-strong: var(--es-danger-strong);
76
82
  --sf-danger-tint: var(--es-danger-tint);
@@ -206,6 +212,14 @@
206
212
  box-sizing: border-box;
207
213
  }
208
214
 
215
+ /* The root takes focus without a tab stop inside another app's page (0.106.0,
216
+ lib/key-scope `editorRootFocus`), so a click on its ground keeps its keys in
217
+ hearing. It is never a place a person tabs to, so it draws no ring of its own:
218
+ the ring belongs to the control focus lands on. */
219
+ .sf-editor[tabindex="-1"]:focus {
220
+ outline: none;
221
+ }
222
+
209
223
  /* Scrollbars inside the editor panels */
210
224
  .sf-scroll::-webkit-scrollbar {
211
225
  width: 11px;
@@ -214,7 +228,7 @@
214
228
 
215
229
  .sf-scroll::-webkit-scrollbar-thumb {
216
230
  background: var(--sf-scrollbar);
217
- border-radius: 8px;
231
+ border-radius: var(--radius-lg);
218
232
  border: 3px solid transparent;
219
233
  background-clip: content-box;
220
234
  }
@@ -269,9 +283,9 @@
269
283
  /* THE SIDE PANELS AND THEIR GRIPS ARE editor-shell's (efficient-easel/chrome.css):
270
284
  `.es-sidepanel` — flush, a hairline on the SEAM side only (card 66161: draw the
271
285
  seams, leave the outer edges alone), the size-container context every
272
- `@container` rule in this sheet asks (card 66212) — and `.es-resizer`, pinned
273
- over each seam from `--es-left-w` / `--es-right-w`, with the drag's
274
- `body.es-col-resizing`. Lifted from this sheet (redesign 2a). The panels keep
286
+ `@container` rule in this sheet asks (card 66212) — and `.es-resizer` (the
287
+ shell's `ResizeHandle` since 1.0.0), pinned over each seam from
288
+ `--es-left-w` / `--es-right-w`. Lifted from this sheet (redesign 2a). The panels keep
275
289
  `.sf-panel` / `.sf-panel--left|right` as well, which is what this sheet's own
276
290
  descendant rules (`.sf-panel--right .sf-insp-body`, …) hang on. */
277
291
  .sf-panel-head {
@@ -373,7 +387,7 @@
373
387
  .sf-chip {
374
388
  width: 18px;
375
389
  height: 18px;
376
- border-radius: 5px;
390
+ border-radius: var(--radius-md);
377
391
  display: flex;
378
392
  align-items: center;
379
393
  justify-content: center;
@@ -426,21 +440,28 @@
426
440
  padding: 6px 9px;
427
441
  border: none;
428
442
  background: transparent;
429
- border-radius: 8px;
443
+ border-radius: var(--radius-lg);
430
444
  cursor: pointer;
431
445
  color: var(--sf-accent);
432
446
  font-size: 12px;
433
447
  font-weight: 500;
434
448
  }
435
449
 
436
- .sf-add-card:hover {
450
+ .sf-add-card:hover:not([aria-disabled='true']) {
437
451
  background: var(--sf-accent-tint);
438
452
  }
439
453
 
454
+ /* Off with a reason (`aria-disabled`, so the keyboard reaches it and hears
455
+ why): the shell's own disabled fade, which only `:disabled` would draw. */
456
+ .sf-add-card[aria-disabled='true'] {
457
+ opacity: 0.6;
458
+ cursor: not-allowed;
459
+ }
460
+
440
461
  .sf-add-card .sf-plus {
441
462
  width: 18px;
442
463
  height: 18px;
443
- border-radius: 5px;
464
+ border-radius: var(--radius-md);
444
465
  display: flex;
445
466
  align-items: center;
446
467
  justify-content: center;
@@ -449,81 +470,10 @@
449
470
  background: var(--sf-accent-tint);
450
471
  }
451
472
 
452
- /* ── Footer "Add block" menu — heterogeneous block-type picker ──────────── */
453
- .sf-blockmenu {
454
- display: flex;
455
- flex-direction: column;
456
- gap: 1px;
457
- margin: 2px 0 4px;
458
- padding: 4px;
459
- border: 1px solid var(--sf-line);
460
- border-radius: 8px;
461
- background: var(--sf-panel);
462
- box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
463
- }
464
-
465
- /* ── Footer "Add block" menu — heterogeneous block-type picker ──────────── */
466
- .sf-blockmenu-item {
467
- display: flex;
468
- align-items: center;
469
- gap: 8px;
470
- width: 100%;
471
- padding: 7px 9px;
472
- border: none;
473
- background: transparent;
474
- border-radius: 6px;
475
- cursor: pointer;
476
- color: var(--sf-text, var(--sf-text));
477
- font-size: 12.5px;
478
- text-align: left;
479
- }
480
-
481
- /* ── Footer "Add block" menu — heterogeneous block-type picker ──────────── */
482
- .sf-blockmenu-item:hover {
483
- background: var(--sf-accent-tint);
484
- color: var(--sf-accent);
485
- }
486
-
487
- /* ── Footer "Add block" menu — heterogeneous block-type picker ──────────── */
488
- /* A group heading inside that menu — drawn only where a choice list carries
489
- groups (a Box's does; the Footer's and the Slide box's do not, and render
490
- exactly as before).
491
-
492
- ⚠️ THE SAME TYPE AS `.sf-addgroup-title` BELOW, and deliberately not a second
493
- look: that is the heading the Add-section panel puts over every one of its
494
- categories, and this menu is the OTHER door a merchant adds something
495
- through. One grammar for "these belong together" (rule zero). It is not the
496
- same CLASS because the two live in different boxes — a 4px-padded floating
497
- menu and a 20px panel column — so only the spacing differs, and it differs
498
- because the container does.
499
-
500
- `role="presentation"` on the row: it is a label, not a menuitem, and a
501
- keyboard user arrowing through the menu must not land on it. */
502
- .sf-menugroup-head {
503
- display: flex;
504
- align-items: baseline;
505
- gap: 8px;
506
- padding: 9px 9px 5px;
507
- }
508
-
509
- /* ── Footer "Add block" menu — heterogeneous block-type picker ──────────── */
510
- /* No top padding on the first heading — the menu's own 4px inset already sets
511
- it in, and a second inset would leave the first group sitting lower than the
512
- rows it names. */
513
- .sf-menugroup-head:first-child {
514
- padding-top: 4px;
515
- }
516
-
517
- /* ── Footer "Add block" menu — heterogeneous block-type picker ──────────── */
518
- .sf-menugroup-title {
519
- font-size: 11px;
520
- font-weight: 700;
521
- letter-spacing: 0.07em;
522
- text-transform: uppercase;
523
- color: var(--sf-muted);
524
- }
525
-
526
- /* ── Footer "Add block" menu — heterogeneous block-type picker ──────────── */
473
+ /* ── Footer "Add block" menu — the shell's DropdownMenu (easel issue 199, step 4) ────── */
474
+ /* The menu, its rows and its group headings are efficient-shell's; the row
475
+ that opens it is the add card (`.sf-add-card`, the trigger's own look). What
476
+ stays is a heading's count, quieter than its word. */
527
477
  .sf-menugroup-count {
528
478
  font-size: 11px;
529
479
  color: var(--sf-field-placeholder);
@@ -555,7 +505,7 @@
555
505
  the engine itself since efficient-easel 0.80.1: a scene drawn to fill it
556
506
  painted over the whole panel before. */
557
507
  .sf-addside .es-add-tile-cover {
558
- border: 1px solid #edeff4;
508
+ border: 1px solid var(--sf-line);
559
509
  }
560
510
 
561
511
  /* ── Footer "Add block" menu — heterogeneous block-type picker ──────────── */
@@ -576,42 +526,6 @@
576
526
  overflow: hidden;
577
527
  }
578
528
 
579
- /* Toast — transient confirmation (e.g. after adding a section) */
580
- .sf-toast {
581
- position: absolute;
582
- left: 50%;
583
- bottom: 34px;
584
- transform: translateX(-50%);
585
- z-index: 60;
586
- display: flex;
587
- align-items: center;
588
- gap: 10px;
589
- padding: 11px 17px;
590
- border-radius: 11px;
591
- background: var(--sf-toast-bg);
592
- color: #fff;
593
- font-size: 13px;
594
- box-shadow: 0 12px 30px rgba(15, 23, 42, 0.3);
595
- }
596
-
597
- .sf-toast-check {
598
- display: inline-flex;
599
- align-items: center;
600
- justify-content: center;
601
- width: 18px;
602
- height: 18px;
603
- border-radius: 50%;
604
- background: var(--sf-accent);
605
- color: #fff;
606
- font-size: 11px;
607
- flex: none;
608
- }
609
-
610
- /* Error variant — same dark pill, red mark instead of the green check. */
611
- .sf-toast--error .sf-toast-check {
612
- background: var(--sf-danger);
613
- }
614
-
615
529
  /* ── Center: device-framed preview (wraps Puck.Preview) ──────────────── */
616
530
  .sf-center {
617
531
  flex: 1;
@@ -766,6 +680,19 @@
766
680
  pointer-events: none;
767
681
  }
768
682
 
683
+ /* A band CUT TO THE ROOM between two blocks (0.106.0): where the gap two
684
+ sections leave is narrower than the pill, the chrome sizes the band to it
685
+ (ScreenChrome `previewGapAt`), and the band clips the pill at rest — so the
686
+ pill, hidden but still taking the pointer, never lies over a block. Hovered,
687
+ it is drawn whole. */
688
+ .sf-preview-gap--tight {
689
+ overflow: hidden;
690
+ }
691
+
692
+ .sf-preview-gap--tight:hover {
693
+ overflow: visible;
694
+ }
695
+
769
696
  /* ── Canvas "Add section" seams (overlay between preview sections) ──────────
770
697
  Absolutely positioned over .sf-preview-host (the iframe's box), one band per
771
698
  seam between top-level sections, placed at the boundary Y measured from the
@@ -805,7 +732,7 @@
805
732
  padding: 4px;
806
733
  border-radius: 999px;
807
734
  background: var(--sf-toast-bg);
808
- color: #fff;
735
+ color: var(--sf-on-accent);
809
736
  font-family: var(--sf-font);
810
737
  font-size: 12px;
811
738
  font-weight: 500;
@@ -844,7 +771,7 @@
844
771
  height: 18px;
845
772
  border-radius: 50%;
846
773
  background: var(--sf-accent);
847
- color: #fff;
774
+ color: var(--sf-on-accent);
848
775
  font-size: 13px;
849
776
  line-height: 1;
850
777
  flex: none;
@@ -900,64 +827,6 @@
900
827
  color: var(--sf-danger);
901
828
  }
902
829
 
903
- /* ── The icon rail: the shared editor-shell EaselRail (`.es-rail`) ───────────
904
- The rail markup + base styles live in the `efficient-easel` package (imported via
905
- `efficient-easel/rail.css`); the storefront no longer hand-rolls `.sf-rail`.
906
- editor-shell ships its own defaults, so we remap the themeable `--es-rail-*`
907
- custom properties onto the storefront's own `--sf-*` tokens, which is what
908
- keeps the shared rail reading as this editor's chrome rather than as the
909
- package's. (One mode only — the editor is deliberately light-only; see the
910
- note at the top of this file.)
911
- Scoped `.sf-editor .es-rail` (specificity 0,2,0) so it always beats rail.css's
912
- base `.es-rail` (0,1,0) whatever order the two stylesheets load in.
913
-
914
- THREE TOKENS ARE DELIBERATELY NOT REMAPPED HERE, and each absence is load-
915
- bearing since card 66198 laid the rail into the top bar as a row:
916
-
917
- --es-rail-w only the COLUMN reads it (`.es-rail { width:
918
- var(--es-rail-w) }`); the row is `width: auto` and sizes
919
- to its buttons, so a remap would be config nothing reads.
920
- --es-rail-bg the row variant re-points these to transparent / none / 0
921
- --es-rail-shadow ON PURPOSE: the bar already has its own surface, and a
922
- --es-rail-radius second white card floating inside it is the bug. This
923
- rule ties with `.es-rail.es-rail-row` on specificity
924
- (0,2,0 both), so setting them here would silently WIN
925
- and put that card back. The rail's surface is the bar's.
926
-
927
- Everything left below is colour the row variant does not touch. */
928
- .sf-editor .es-rail {
929
- --es-rail-fg: var(--sf-muted);
930
- --es-rail-hover-bg: var(--sf-hover);
931
- --es-rail-hover-fg: var(--sf-text);
932
- --es-rail-accent: var(--sf-accent);
933
- --es-rail-accent-tint: var(--sf-accent-tint);
934
- }
935
-
936
- /* ── The icon rail: the shared editor-shell EaselRail (`.es-rail`) ───────────
937
- The rail markup + base styles live in the `efficient-easel` package (imported via
938
- `efficient-easel/rail.css`); the storefront no longer hand-rolls `.sf-rail`.
939
- editor-shell ships its own defaults, so we remap the themeable `--es-rail-*`
940
- custom properties onto the storefront's own `--sf-*` tokens, which is what
941
- keeps the shared rail reading as this editor's chrome rather than as the
942
- package's. (One mode only — the editor is deliberately light-only; see the
943
- note at the top of this file.)
944
- Scoped `.sf-editor .es-rail` (specificity 0,2,0) so it always beats rail.css's
945
- base `.es-rail` (0,1,0) whatever order the two stylesheets load in.
946
-
947
- THREE TOKENS ARE DELIBERATELY NOT REMAPPED HERE, and each absence is load-
948
- bearing since card 66198 laid the rail into the top bar as a row:
949
-
950
- --es-rail-w only the COLUMN reads it (`.es-rail { width:
951
- var(--es-rail-w) }`); the row is `width: auto` and sizes
952
- to its buttons, so a remap would be config nothing reads.
953
- --es-rail-bg the row variant re-points these to transparent / none / 0
954
- --es-rail-shadow ON PURPOSE: the bar already has its own surface, and a
955
- --es-rail-radius second white card floating inside it is the bug. This
956
- rule ties with `.es-rail.es-rail-row` on specificity
957
- (0,2,0 both), so setting them here would silently WIN
958
- and put that card back. The rail's surface is the bar's.
959
-
960
- Everything left below is colour the row variant does not touch. */
961
830
  /* THE RAIL COLUMN (owner, 2026-09-04: "the top control panel and the panel
962
831
  below it" must read as one) — the cluster exactly the left panel's width,
963
832
  carrying its hairline up through the bar, the buttons spread across it (his
@@ -1029,7 +898,7 @@
1029
898
  .sf-device-scope {
1030
899
  margin: 8px 0 2px;
1031
900
  padding: 7px 10px;
1032
- border-radius: 7px;
901
+ border-radius: var(--radius-md);
1033
902
  background: var(--sf-chip-bg);
1034
903
  font-size: 11.5px;
1035
904
  line-height: 1.35;
@@ -1078,8 +947,7 @@
1078
947
  Every side panel's head is efficient-easel's `InspectorHead`; these two
1079
948
  are the pieces the website editor adds to it. The hairline parts a panel's
1080
949
  own tools from the hide button that ends every head, and a mode's way out
1081
- is a word ("Done", "Cancel") on the engine's ghost button, drawn to the
1082
- 28px of the head's icon buttons so the row keeps one height. */
950
+ is a word ("Done", "Cancel") on the shell's small Button. */
1083
951
  .sf-head-divider {
1084
952
  width: 1px;
1085
953
  height: 16px;
@@ -1088,26 +956,6 @@
1088
956
  flex: none;
1089
957
  }
1090
958
 
1091
- /* ── Side panel heads (components/SidePanelHead) ─────────────────────────
1092
- Every side panel's head is efficient-easel's `InspectorHead`; these two
1093
- are the pieces the website editor adds to it. The hairline parts a panel's
1094
- own tools from the hide button that ends every head, and a mode's way out
1095
- is a word ("Done", "Cancel") on the engine's ghost button, drawn to the
1096
- 28px of the head's icon buttons so the row keeps one height. */
1097
- .es-btn-ghost.sf-head-textbtn {
1098
- height: 28px;
1099
- padding: 0 10px;
1100
- font-size: 12.5px;
1101
- border-radius: 7px;
1102
- white-space: nowrap;
1103
- }
1104
-
1105
- /* ── Side panel heads (components/SidePanelHead) ─────────────────────────
1106
- Every side panel's head is efficient-easel's `InspectorHead`; these two
1107
- are the pieces the website editor adds to it. The hairline parts a panel's
1108
- own tools from the hide button that ends every head, and a mode's way out
1109
- is a word ("Done", "Cancel") on the engine's ghost button, drawn to the
1110
- 28px of the head's icon buttons so the row keeps one height. */
1111
959
  /* A hidden side panel's strip (components/SidePanelHead `PanelShowStrip`):
1112
960
  one Show panel button where the panel was. It IS a side panel — the
1113
961
  engine's `.es-sidepanel--left|right` gives it the panels' ground and the
@@ -5,7 +5,9 @@
5
5
  * the Layers tree's frame round the document's nodes (0.103.0): its first
6
6
  * row, the pinned groups, the band of sections and the band's "+". And
7
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.
8
+ * block keys say when a block is copied or will not paste. And (0.106.0) the
9
+ * canvas's empty-slot cell, the rail's Media button, and the left panel's
10
+ * accessible name and its grip's.
9
11
  *
10
12
  * They came with the screen from the website editor, written into the
11
13
  * provider, the mount and the notice; a second host (the campaign designer)
@@ -130,6 +132,20 @@ type ScreenWords = {
130
132
  }) => string;
131
133
  /** The Add panel's words (0.105.0). */
132
134
  add: ScreenAddWords;
135
+ /** The cell over an EMPTY slot on the canvas, after its "+" (0.106.0): the
136
+ * campaign designer's "Add a block". */
137
+ canvasAddBlock: string;
138
+ /** The rail's button to the media library (0.106.0). Owner ruling R21
139
+ * (Victor Mau, 2026-10-09): the campaign designer's rail reads Add,
140
+ * Layers, Email styles, Media. The panel's own head keeps its word
141
+ * (`EaselStrings.chrome.mediaLibrary`). */
142
+ railMedia: string;
143
+ /** The left panel's accessible name (0.106.0): the panel is a labelled
144
+ * `<aside>`, whichever view it shows. */
145
+ leftPanel: string;
146
+ /** The left panel's resize grip's accessible name (0.106.0). It said
147
+ * "Resize Sections panel", from when the tree was the panel's one view. */
148
+ resizeLeftPanel: string;
133
149
  };
134
150
  declare const DEFAULT_SCREEN_WORDS: ScreenWords;
135
151
 
@@ -1 +1 @@
1
- export{DEFAULT_SCREEN_ADD_WORDS,DEFAULT_SCREEN_WORDS}from"../chunk-PQXIFBDY.js";
1
+ export{DEFAULT_SCREEN_ADD_WORDS,DEFAULT_SCREEN_WORDS}from"../chunk-E2O2MRZR.js";