efficient-easel 0.102.0 → 0.104.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 (116) hide show
  1. package/README.md +45 -4
  2. package/dist/chunk-4EUWOGZF.js +1 -0
  3. package/dist/chunk-5D2XAZKH.js +62 -0
  4. package/dist/chunk-7755VWRT.js +4 -0
  5. package/dist/chunk-7GVLSNFW.js +1 -0
  6. package/dist/chunk-A2LFBOUF.js +1 -0
  7. package/dist/chunk-BBRY7KI4.js +10 -0
  8. package/dist/chunk-BVN33R76.js +1 -0
  9. package/dist/chunk-D6324C3E.js +5 -0
  10. package/dist/chunk-ERR437B5.js +1 -0
  11. package/dist/chunk-HMWJB3HF.js +1 -0
  12. package/dist/{chunk-KDYIMJTZ.js → chunk-KCOBHPN6.js} +1 -1
  13. package/dist/chunk-KVNRNDUC.js +1 -0
  14. package/dist/chunk-LEGAPYPC.js +1 -0
  15. package/dist/chunk-LRTIMWZG.js +2 -0
  16. package/dist/chunk-LXEOVUAV.js +1 -0
  17. package/dist/{chunk-D7M6IRPJ.js → chunk-NEQIEYYO.js} +1 -1
  18. package/dist/{chunk-6TZTKAB5.js → chunk-O7Q4DDJT.js} +1 -1
  19. package/dist/chunk-PYNQRX56.js +4 -0
  20. package/dist/chunk-Q2HPBMG5.js +1 -0
  21. package/dist/chunk-QCBWT2XE.js +1 -0
  22. package/dist/{chunk-7MU3RJ6S.js → chunk-QDEZQ5A6.js} +1 -1
  23. package/dist/chunk-QOPY2LQM.js +1 -0
  24. package/dist/{chunk-AKFJK65Z.js → chunk-R2MUSGPS.js} +1 -1
  25. package/dist/chunk-RSCMJIWS.js +1 -0
  26. package/dist/{chunk-E7GGVILG.js → chunk-TTENU2HX.js} +1 -1
  27. package/dist/chunk-UB7JVPK4.js +1 -0
  28. package/dist/{chunk-VLSTGOVD.js → chunk-YODRYAZX.js} +2 -2
  29. package/dist/chunk-Z6BAZFSW.js +2 -0
  30. package/dist/chunk-ZOJEFIP4.js +1 -0
  31. package/dist/{host-B-byaQxg.d.ts → host-DJ8Gzsx7.d.ts} +93 -21
  32. package/dist/screen/components/AddBlockRow.js +1 -1
  33. package/dist/screen/components/AddSidePanel.js +1 -1
  34. package/dist/screen/components/MediaSidePanel.d.ts +3 -2
  35. package/dist/screen/components/MediaSidePanel.js +1 -1
  36. package/dist/screen/components/NodeContextMenu.d.ts +47 -2
  37. package/dist/screen/components/NodeContextMenu.js +1 -1
  38. package/dist/screen/components/PageEditGuardNotices.js +1 -1
  39. package/dist/screen/components/ScreenChrome.js +1 -1
  40. package/dist/screen/components/ScreenDocumentContext.d.ts +2 -1
  41. package/dist/screen/components/ScreenDocumentContext.js +1 -1
  42. package/dist/screen/components/ScreenMount.d.ts +9 -5
  43. package/dist/screen/components/ScreenMount.js +1 -1
  44. package/dist/screen/components/ScreenStoreProvider.d.ts +3 -0
  45. package/dist/screen/components/ScreenStoreProvider.js +1 -1
  46. package/dist/screen/components/SectionScreenShell.js +16 -16
  47. package/dist/screen/components/usePartBridge.d.ts +3 -0
  48. package/dist/screen/components/usePartBridge.js +1 -1
  49. package/dist/screen/index.d.ts +6 -3
  50. package/dist/screen/index.js +1 -1
  51. package/dist/screen/lib/admin-bridge.d.ts +2 -0
  52. package/dist/screen/lib/admin-bridge.js +1 -1
  53. package/dist/screen/lib/backend-error.d.ts +20 -5
  54. package/dist/screen/lib/backend-error.js +1 -1
  55. package/dist/screen/lib/document-addressing.d.ts +2 -1
  56. package/dist/screen/lib/document-contract.d.ts +7 -0
  57. package/dist/screen/lib/failure.d.ts +6 -2
  58. package/dist/screen/lib/failure.js +1 -1
  59. package/dist/screen/lib/host-inbound.js +1 -1
  60. package/dist/screen/lib/host.d.ts +3 -2
  61. package/dist/screen/lib/load-error.d.ts +9 -3
  62. package/dist/screen/lib/load-error.js +1 -1
  63. package/dist/screen/lib/media-panel.d.ts +81 -17
  64. package/dist/screen/lib/media-panel.js +1 -1
  65. package/dist/screen/lib/media-picker.d.ts +14 -2
  66. package/dist/screen/lib/media-picker.js +1 -1
  67. package/dist/screen/lib/page-lock.d.ts +45 -1
  68. package/dist/screen/lib/page-lock.js +1 -1
  69. package/dist/screen/lib/puck/content-tree.d.ts +20 -1
  70. package/dist/screen/lib/puck/content-tree.js +1 -1
  71. package/dist/screen/lib/puck/device-fields.d.ts +4 -2
  72. package/dist/screen/lib/puck/section-doc.js +1 -1
  73. package/dist/screen/lib/puck/slot-child-name.d.ts +18 -3
  74. package/dist/screen/lib/puck/slot-child-name.js +1 -1
  75. package/dist/screen/lib/puck/style-clipboard.js +1 -1
  76. package/dist/screen/lib/puck/use-section-ops.d.ts +6 -0
  77. package/dist/screen/lib/puck/use-section-ops.js +1 -1
  78. package/dist/screen/lib/screen-parts.d.ts +171 -4
  79. package/dist/screen/lib/screen-parts.js +1 -1
  80. package/dist/screen/lib/section-templates.d.ts +25 -1
  81. package/dist/screen/lib/section-templates.js +1 -1
  82. package/dist/screen/lib/session-context.d.ts +5 -1
  83. package/dist/screen/lib/session-context.js +1 -1
  84. package/dist/screen/lib/session.d.ts +58 -5
  85. package/dist/screen/lib/session.js +1 -1
  86. package/dist/screen/screen.css +14 -0
  87. package/dist/screen/words.d.ts +65 -0
  88. package/dist/screen/words.js +1 -0
  89. package/dist/strings/catalogue.d.ts +9 -2
  90. package/dist/strings/catalogue.js +1 -1
  91. package/dist/strings/index.d.ts +1 -0
  92. package/dist/strings/index.js +1 -1
  93. package/dist/tree/index.d.ts +4 -142
  94. package/dist/types-DJDBtdB2.d.ts +143 -0
  95. package/package.json +6 -1
  96. package/dist/chunk-3U4GP5VA.js +0 -10
  97. package/dist/chunk-5464H65G.js +0 -4
  98. package/dist/chunk-6FY3PZS3.js +0 -1
  99. package/dist/chunk-7RNTMJER.js +0 -5
  100. package/dist/chunk-A7ZJII7O.js +0 -1
  101. package/dist/chunk-AJBJ74ME.js +0 -1
  102. package/dist/chunk-AKZWUV5Z.js +0 -1
  103. package/dist/chunk-F2FPZIZV.js +0 -62
  104. package/dist/chunk-F6CCTEIX.js +0 -1
  105. package/dist/chunk-FT35FX7D.js +0 -2
  106. package/dist/chunk-FUDHI5I4.js +0 -1
  107. package/dist/chunk-HMX55DYT.js +0 -1
  108. package/dist/chunk-HWW4XJOH.js +0 -1
  109. package/dist/chunk-J4RAY75C.js +0 -1
  110. package/dist/chunk-PP44LCJM.js +0 -1
  111. package/dist/chunk-Q3SQBNJB.js +0 -1
  112. package/dist/chunk-TEZ6V6PA.js +0 -4
  113. package/dist/chunk-UH7TGWHR.js +0 -1
  114. package/dist/chunk-UVWVYMMZ.js +0 -1
  115. package/dist/chunk-VV5ADNBR.js +0 -1
  116. package/dist/chunk-ZZ7VLIHQ.js +0 -1
@@ -1,5 +1,49 @@
1
1
  import { EditLock } from '../../edit-lock/index.js';
2
+ import { EaselSession } from './session.js';
3
+ import '../../blocks/index.js';
4
+ import 'react';
5
+ import '../../types-E3HrTPg2.js';
6
+ import '../../data/index.js';
7
+ import '../../types-41704JE4.js';
8
+ import '../../resolve-D68pb3Bx.js';
9
+ import '../../plan-DChbUXdS.js';
10
+ import './backend-error.js';
11
+ import './host-chrome.js';
12
+ import './links/link-filters.js';
13
+ import '../../LinkPicker-W2Rtxetz.js';
14
+ import './document-contract.js';
15
+ import './document-hooks.js';
16
+ import './section-template-types.js';
17
+ import './puck/content-tree.js';
18
+
19
+ /**
20
+ * The storefront editor's binding of the SHARED edit lock.
21
+ *
22
+ * The rules themselves — who may write the open document, what a failed claim /
23
+ * take-over / heartbeat means, how to read a refused save, and the claim driver
24
+ * that keeps a held write from being lost — live in `efficient-easel/edit-lock` and
25
+ * are imported straight from there by the code that needs them. This file used
26
+ * to be a 334-line copy of them; the campaign designer in efficient-admin-portal
27
+ * carried a second, drifted copy of the same rules. Card 11161 merged the two
28
+ * into the shared package, and this is all that is left here: the TWO facts that
29
+ * are genuinely this repo's.
30
+ *
31
+ * 1. what a failure looks like HERE (lib/failure: this repo's
32
+ * `ApiError`, or the editor backend's `WebsiteBackendError`), and
33
+ * 2. the `code` this backend puts in a refused-save body for a PAGE.
34
+ *
35
+ * Nothing else belongs in this file. A rule a second editor would also need goes
36
+ * in the shared module, or the copy starts growing back.
37
+ */
2
38
 
3
39
  declare const pageEditLock: EditLock;
40
+ /**
41
+ * The lock's rules for one editor's session (0.103.0): {@link pageEditLock}
42
+ * itself for a session that reads its host's errors as the page does — every
43
+ * session before 0.103.0, and the website's still — and, for a session that
44
+ * brought its own reading (`hostFailures`), the same rules reading a failure
45
+ * that session's way. Made once per session.
46
+ */
47
+ declare function editLockOf(session: EaselSession): EditLock;
4
48
 
5
- export { pageEditLock };
49
+ export { editLockOf, pageEditLock };
@@ -1 +1 @@
1
- export{pageEditLock}from"../../chunk-AKZWUV5Z.js";import"../../chunk-HMX55DYT.js";import"../../chunk-KDYIMJTZ.js";import"../../chunk-JUQ6YJCG.js";import"../../chunk-RE4LP46F.js";
1
+ export{editLockOf,pageEditLock}from"../../chunk-ZOJEFIP4.js";import"../../chunk-4EUWOGZF.js";import"../../chunk-KCOBHPN6.js";import"../../chunk-JUQ6YJCG.js";import"../../chunk-RE4LP46F.js";
@@ -27,6 +27,25 @@ type SlotConfigView = {
27
27
  * not know has no slots — and cannot render either, so there is nothing to walk.
28
28
  */
29
29
  declare function slotFieldsOf(config: SlotConfigView, type: string): string[];
30
+ /**
31
+ * What a component type's config ALLOWS of the two actions that make another
32
+ * node or take one away (0.103.0): its `permissions.duplicate` and
33
+ * `permissions.delete`, each true unless the config says false — the reading
34
+ * Puck gave a config that carried none. The campaign designer's Product keeps
35
+ * its Price line this way (`{ delete: false, duplicate: false }`).
36
+ *
37
+ * The screen's tree rows, its menu and the inspector head it hands this to
38
+ * (`ScreenInspectorPanelProps.nodeActions`) all ask HERE, so the three cannot
39
+ * come to disagree about one block. Only the config's own, never the
40
+ * easel-wide permissions the edit lock sets: a document somebody else holds is
41
+ * refused at the writes, as it always was, and draws the rows it drew.
42
+ *
43
+ * A type the config does not know allows both, as one with no `permissions`.
44
+ */
45
+ declare function blockNodeActions(config: SlotConfigView, type: string): {
46
+ duplicate: boolean;
47
+ delete: boolean;
48
+ };
30
49
  /**
31
50
  * A slot child, addressed the way the Layers tree selects it: the node, the
32
51
  * compound zone key "<parentId>:<slotName>" Puck's ops take, and its index in
@@ -193,4 +212,4 @@ declare function missingPinnedTypes(live: ReadonlyArray<{
193
212
  type?: string;
194
213
  }>): string[];
195
214
 
196
- export { FOOTER_TYPE, HEADER_TYPE, type NodeLocation, ROOT_ZONE, type SlotChild, type SlotConfigView, TREE_MAX_DEPTH, type TreeItem, childSlotsOf, locateNode, missingPinnedTypes, nestsInTree, newNodeId, pinnedDuplicateIds, pinnedDuplicateIndices, slotFieldsOf };
215
+ export { FOOTER_TYPE, HEADER_TYPE, type NodeLocation, ROOT_ZONE, type SlotChild, type SlotConfigView, TREE_MAX_DEPTH, type TreeItem, blockNodeActions, childSlotsOf, locateNode, missingPinnedTypes, nestsInTree, newNodeId, pinnedDuplicateIds, pinnedDuplicateIndices, slotFieldsOf };
@@ -1 +1 @@
1
- export{FOOTER_TYPE,HEADER_TYPE,ROOT_ZONE,TREE_MAX_DEPTH,childSlotsOf,locateNode,missingPinnedTypes,nestsInTree,newNodeId,pinnedDuplicateIds,pinnedDuplicateIndices,slotFieldsOf}from"../../../chunk-FUDHI5I4.js";
1
+ export{FOOTER_TYPE,HEADER_TYPE,ROOT_ZONE,TREE_MAX_DEPTH,blockNodeActions,childSlotsOf,locateNode,missingPinnedTypes,nestsInTree,newNodeId,pinnedDuplicateIds,pinnedDuplicateIndices,slotFieldsOf}from"../../../chunk-7GVLSNFW.js";
@@ -38,7 +38,7 @@ import '../content/view-tiers.js';
38
38
  * WHY THE HIDDEN FIELD LEAVES NO GAP. Puck wraps every top-level field in its
39
39
  * own padded `_PuckFields-field_` box before it calls `render`, so a field that
40
40
  * renders nothing would still cost ~37px of empty panel. The gate instead paints
41
- * a zero-size marker and `components/storefront-editor.css` collapses the
41
+ * a zero-size marker and this package's `screen.css` collapses the
42
42
  * wrapper that contains one — the same "reach the wrapper Puck owns" trick the
43
43
  * fold reflow in `controls.tsx` already relies on, expressed as one CSS rule
44
44
  * instead of a second DOM pass (so it cannot race the fold's).
@@ -64,7 +64,9 @@ declare function shownTier(device: PreviewDevice): DeviceTier;
64
64
  */
65
65
  declare const DEVICE_NOTE: Readonly<Record<PreviewDevice, string | null>>;
66
66
  /** The attribute the stylesheet looks for to collapse a gated-off field's Puck
67
- * wrapper. Declared here, matched once in `components/storefront-editor.css`. */
67
+ * wrapper. Declared here, matched once in this package's `screen.css`, which
68
+ * every host that mounts the screen loads (it sat in the website's sheet until
69
+ * 0.103.0, so a second host's hidden rows kept their space). */
68
70
  declare const DEVICE_HIDDEN_ATTR = "data-sf-device-hidden";
69
71
  /** A house control's render, seen from outside: the builders in `controls.tsx`
70
72
  * each type their own props, so the gate takes the widest shape that can be
@@ -1 +1 @@
1
- export{cloneNodeWithFreshIds,docToNode,nodeToDoc}from"../../../chunk-AKFJK65Z.js";import"../../../chunk-FUDHI5I4.js";
1
+ export{cloneNodeWithFreshIds,docToNode,nodeToDoc}from"../../../chunk-R2MUSGPS.js";import"../../../chunk-7GVLSNFW.js";
@@ -126,7 +126,19 @@ declare function slotChildName(child: SlotChild, wheelName?: (code: string) => s
126
126
  * needs at least one character between a pair, so a name that is non-empty
127
127
  * cannot strip to nothing and be renamed into its component's label.
128
128
  */
129
- declare function slotChildRowName(child: SlotChild, compLabel: (type: string) => string, plainText: (copy: string) => string, wheelName?: (code: string) => string | undefined): string;
129
+ declare function slotChildRowName<N extends SlotChild>(child: N, compLabel: (type: string) => string, plainText: (copy: string) => string, wheelName?: (code: string) => string | undefined, rowName?: RowNameRule<N>): string;
130
+ /**
131
+ * THE LAYER'S LAST WORD (0.103.0) — `ScreenBlockLook.rowName`
132
+ * (lib/screen-parts), the rung a layer may stand above the whole precedence:
133
+ * handed the node, the level it is named at and what the rule here answered,
134
+ * it answers the row's name. The campaign designer names its rows by its own
135
+ * labels, and needs none of the website's rungs.
136
+ *
137
+ * An argument and not a rung written here, for the reason the grammar and the
138
+ * catalog are: this module has no layer. Absent, the rule here is the name, as
139
+ * it was before the member existed.
140
+ */
141
+ type RowNameRule<N extends SlotChild = SlotChild> = (node: N, level: "section" | "block", fallback: string) => string;
130
142
  /**
131
143
  * WHICH PROP A RENAME WRITES — the write side of the rule above, and here for
132
144
  * the reason the read side is: naming a slot child has ONE home (card 66194).
@@ -180,7 +192,10 @@ declare function slotChildRenameProp(fields: Record<string, unknown> | undefined
180
192
  *
181
193
  * `fallback` is the caller's type-level label (`sectionLabel(type)`), which is
182
194
  * what every published page reads today and what an unnamed node keeps reading.
195
+ *
196
+ * `rowName` is the layer's last word ({@link RowNameRule}), asked at the
197
+ * SECTION level with what this rung answered.
183
198
  */
184
- declare function rootRowName(node: SlotChild, fallback: string): string;
199
+ declare function rootRowName<N extends SlotChild>(node: N, fallback: string, rowName?: RowNameRule<N>): string;
185
200
 
186
- export { type SlotChild, rootRowName, slotChildName, slotChildRenameProp, slotChildRowName };
201
+ export { type RowNameRule, type SlotChild, rootRowName, slotChildName, slotChildRenameProp, slotChildRowName };
@@ -1 +1 @@
1
- export{rootRowName,slotChildName,slotChildRenameProp,slotChildRowName}from"../../../chunk-HWW4XJOH.js";import"../../../chunk-DUVRZ456.js";import"../../../chunk-6W7WLPZH.js";
1
+ export{rootRowName,slotChildName,slotChildRenameProp,slotChildRowName}from"../../../chunk-QOPY2LQM.js";import"../../../chunk-DUVRZ456.js";import"../../../chunk-6W7WLPZH.js";
@@ -1 +1 @@
1
- export{copyNodeStyle,nodeStyleRows,planNodePaste,shopFieldKind,siteStyleScope}from"../../../chunk-PP44LCJM.js";import"../../../chunk-PWZOS45R.js";import"../../../chunk-7F52SZOI.js";import"../../../chunk-R2HLPNQF.js";import"../../../chunk-ZE7I3PLX.js";import"../../../chunk-DUVRZ456.js";import"../../../chunk-BSPCSC45.js";import"../../../chunk-57DJOKXT.js";import"../../../chunk-6WY6ZXJG.js";import"../../../chunk-L5KW4HG5.js";
1
+ export{copyNodeStyle,nodeStyleRows,planNodePaste,shopFieldKind,siteStyleScope}from"../../../chunk-Q2HPBMG5.js";import"../../../chunk-ZE7I3PLX.js";import"../../../chunk-PWZOS45R.js";import"../../../chunk-7F52SZOI.js";import"../../../chunk-R2HLPNQF.js";import"../../../chunk-DUVRZ456.js";import"../../../chunk-BSPCSC45.js";import"../../../chunk-57DJOKXT.js";import"../../../chunk-6WY6ZXJG.js";import"../../../chunk-L5KW4HG5.js";
@@ -80,6 +80,12 @@ type SectionOpsOptions = {
80
80
  * un-fix that card.
81
81
  */
82
82
  readOnly?: boolean;
83
+ /**
84
+ * Resolve each node an op puts in (`easel.resolveNode`, trigger `"insert"`).
85
+ * Default: the layer's rule (`ScreenBlockRules.resolveOnInsert`), else
86
+ * false — no op resolves anything, as before 0.103.0.
87
+ */
88
+ resolveOnInsert?: boolean;
83
89
  };
84
90
  declare function useSectionOps(options?: SectionOpsOptions): SectionOps;
85
91
 
@@ -1 +1 @@
1
- export{useSectionOps}from"../../../chunk-VV5ADNBR.js";import"../../../chunk-FUDHI5I4.js";import"../../../chunk-P67FP7PG.js";import"../../../chunk-AELNNAFM.js";import"../../../chunk-YRLPFZW3.js";import"../../../chunk-D2BCHTQR.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-ZNCEOSXO.js";import"../../../chunk-KRXQM65X.js";import"../../../chunk-NKB3KVAB.js";
1
+ export{useSectionOps}from"../../../chunk-A2LFBOUF.js";import"../../../chunk-7GVLSNFW.js";import"../../../chunk-7755VWRT.js";import"../../../chunk-Z6BAZFSW.js";import"../../../chunk-R5ZVNJLJ.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";
@@ -3,6 +3,7 @@ import { ReactNode, MouseEvent, ComponentType } from 'react';
3
3
  import { Data } from '../../blocks/index.js';
4
4
  import { D as DeviceOption } from '../../types-CqY85foL.js';
5
5
  import { a as EaselRailItem } from '../../types-DWS-s9z-.js';
6
+ import { T as TreeRowMark } from '../../types-DJDBtdB2.js';
6
7
  import { HostProduct } from './host-chrome.js';
7
8
  import { EaselSession } from './session.js';
8
9
  import { AddTarget } from './puck/add-target-types.js';
@@ -14,8 +15,10 @@ import '../../plan-DChbUXdS.js';
14
15
  import '../../edit-lock/index.js';
15
16
  import '../../panelWidths-D9hTLR25.js';
16
17
  import '../../wordFit-D4S36PvB.js';
18
+ import '../../words-DgHcY5qB.js';
17
19
  import './links/link-filters.js';
18
20
  import '../../LinkPicker-W2Rtxetz.js';
21
+ import './backend-error.js';
19
22
  import './document-contract.js';
20
23
  import './document-hooks.js';
21
24
  import './section-template-types.js';
@@ -143,6 +146,23 @@ interface ScreenInspectorPanelProps {
143
146
  /** Hide the panel: the last button of its head. Omitted by a screen whose
144
147
  * inspector is always in view. */
145
148
  onHidePanel?: () => void;
149
+ /**
150
+ * Which of the head's two node actions the selected node's BLOCK allows
151
+ * (0.103.0): its config's `permissions.duplicate` and `permissions.delete`,
152
+ * each true unless the config says false — the answer the screen's own tree
153
+ * rows and menu honour, handed on so the head the layer draws honours it
154
+ * too, hiding or greying a refused one. With nothing selected both are true.
155
+ * Handed by the page screen; a layer that never reads it draws its head as
156
+ * it did.
157
+ */
158
+ nodeActions?: ScreenNodeActions;
159
+ }
160
+ /** What a block's config allows of the two actions that make another node or
161
+ * take one away (`ComponentConfig.permissions`): `false` only where the config
162
+ * says so (lib/puck/content-tree `blockNodeActions`). */
163
+ interface ScreenNodeActions {
164
+ duplicate: boolean;
165
+ delete: boolean;
146
166
  }
147
167
  /**
148
168
  * The document and its tree of rows, as far as a layer needs them to wire and
@@ -305,6 +325,15 @@ interface ScreenBridges {
305
325
  /** …and `barTrail` stands between Refresh and the main button: a way out to
306
326
  * where the document is read. */
307
327
  barTrail?: () => ReactNode;
328
+ /**
329
+ * …and `barMain` IS the main button, in its place at the end of the cluster
330
+ * (0.103.0): the layer's own way to finish with the document — the campaign
331
+ * designer's Done — where the screen draws Publish (a document that
332
+ * publishes) or Save. What comes back is placed as it is, nothing round it,
333
+ * and returning nothing leaves the place empty. Absent, the screen draws its
334
+ * own button, as it always has.
335
+ */
336
+ barMain?: () => ReactNode;
308
337
  /**
309
338
  * The layer's own buttons in the rail. The screen draws the rail as Add, its
310
339
  * own Layers and the host's Media library; a layer has two places in it.
@@ -441,6 +470,17 @@ interface ScreenBlockRules {
441
470
  * no host chose its blocks, every type is.
442
471
  */
443
472
  blockIsOffered: (type: string, session?: EaselSession) => boolean;
473
+ /**
474
+ * Is a new block RESOLVED as it goes in (0.103.0)? With true, every insert
475
+ * the screen makes — a section, a block into a slot, a saved template, a
476
+ * seeded slot child — is followed by `easel.resolveNode(id, { trigger:
477
+ * 'insert' })`, as the campaign designer's own inserts are: the block's
478
+ * `resolveData` runs the moment it arrives (seeding its children, stamping a
479
+ * default), in the insert's own undo step, not at its first edit or the next
480
+ * time the document opens. Absent, false: an insert runs no resolver, as
481
+ * the website's never has.
482
+ */
483
+ resolveOnInsert?: boolean;
444
484
  }
445
485
  /** The tier a node is NAMED at: a node at the top of the document is a section,
446
486
  * a node inside another is a block. */
@@ -507,6 +547,41 @@ interface ScreenBlockLook {
507
547
  * the screen read the products itself, so its effect keeps its place.
508
548
  */
509
549
  useProducts: () => readonly HostProduct[] | null;
550
+ /**
551
+ * THE LAYER'S LAST WORD ON WHAT A LAYERS ROW SAYS (0.103.0): handed a node,
552
+ * the level it is named at and `fallback` — what the screen's own naming
553
+ * rule answered (lib/puck/slot-child-name: a name the node carries, else its
554
+ * type's label; a pinned row's word) — it answers the row's name. Asked of
555
+ * every node row the page screen's Layers tree draws, and of the menu's
556
+ * Select layer flyout, a block's canvas handle and a section's own list of
557
+ * its children in the inspector, which say the same words. The campaign
558
+ * designer's rows read its own labels ("Section 2", "Header"). Absent: the
559
+ * screen's rule, as it named every row.
560
+ */
561
+ rowName?: (node: ScreenNode, level: ScreenNodeLevel, fallback: string) => string;
562
+ /**
563
+ * The quieter words a node row draws after its name (`TreeRow`'s
564
+ * `preview`): a node's own first words, so a tree of rows all called
565
+ * "Section" can be told apart by eye. The layer chooses and shortens them;
566
+ * nothing (null, undefined, "") draws nothing. Absent: no row has any.
567
+ */
568
+ rowPreview?: (node: ScreenNode) => string | null | undefined;
569
+ /**
570
+ * The small marks a node row draws right after its name (`TreeRow`'s
571
+ * `marks`): a state the row only SHOWS, such as "Shown on phones only".
572
+ * Absent, or nothing handed back: no marks.
573
+ */
574
+ rowMarks?: (node: ScreenNode) => ReadonlyArray<TreeRowMark> | null | undefined;
575
+ /**
576
+ * The layer's own buttons on a node row, by the node and where it sits:
577
+ * `TreeRowAction`s (efficient-easel/tree), placed between the screen's trash
578
+ * and its eye — the campaign designer's phone switch. Asked of every node
579
+ * row, a locked one and a pinned one too, so the layer decides; what comes
580
+ * back is placed as it is, and nothing draws nothing. A button that writes
581
+ * renders a component of the layer's that reaches the document itself.
582
+ * Absent: the screen's two, as it drew them.
583
+ */
584
+ rowActions?: (node: ScreenNode, zone: string, index: number) => ReactNode;
510
585
  }
511
586
  /**
512
587
  * THE DEVICES the canvas can be looked at on. That the top bar has a switch,
@@ -557,9 +632,15 @@ interface ScreenDevices {
557
632
  * selected and where a pinned node's row is pressed, and shows what it is
558
633
  * handed.
559
634
  *
560
- * The same object for the life of a mount, its three functions plain functions
561
- * of what they are passed: the screen reads it anywhere, inside the callbacks
562
- * and effects it does not rebuild for it.
635
+ * And HOW THE LAYERS TREE FRAMES THEM (0.103.0): which node is pinned where it
636
+ * is not one type (`isFirst`, `isLast` — the campaign designer's Header and
637
+ * Footer are both sections, told apart by a prop), how the first one's row is
638
+ * drawn (`firstRow`) and what the band of sections between them looks like
639
+ * (`band`). Each is optional, and its default is the tree the website has.
640
+ *
641
+ * The same object for the life of a mount, its functions plain functions of
642
+ * what they are passed: the screen reads it anywhere, inside the callbacks and
643
+ * effects it does not rebuild for it.
563
644
  */
564
645
  interface ScreenPinnedNodes {
565
646
  /** The type of the node pinned FIRST: the band starts after it. Null when
@@ -567,6 +648,32 @@ interface ScreenPinnedNodes {
567
648
  first: string | null;
568
649
  /** The type of the node pinned LAST: the band ends at it. */
569
650
  last: string | null;
651
+ /**
652
+ * Is this top-level node the one pinned first (0.103.0)? Where every node
653
+ * of the pinned type is not pinned — the campaign designer's Header is an
654
+ * `EmailSection` with `_region: "header"`, beside body sections of the same
655
+ * type — the layer says which. The page screen asks it wherever it tested
656
+ * a node against `first`: the band, the tree, the canvas handles, the menu.
657
+ * (The section screen, which holds one node, still asks the type.) The
658
+ * first node that answers yes is the one. Absent: a node of type `first`.
659
+ */
660
+ isFirst?: (node: ScreenNode) => boolean;
661
+ /** …and the one pinned last (the Footer). Absent: a node of type `last`. */
662
+ isLast?: (node: ScreenNode) => boolean;
663
+ /**
664
+ * How the Layers tree draws the node pinned first (0.103.0). `"panel"`: a
665
+ * row of its own that opens the layer's panel for it (`panelOf`), drawn
666
+ * whether or not the document holds the node, and none of its children —
667
+ * the website's Header, whose settings are a panel. `"node"`: the node
668
+ * itself, selected by its row and folding open into its children, exactly
669
+ * as the node pinned last is drawn — the campaign designer's Header, a
670
+ * section with blocks in it. Absent: `"panel"`.
671
+ */
672
+ firstRow?: "panel" | "node";
673
+ /** What the band of sections between the two pins looks like in the tree
674
+ * (0.103.0). Absent: a group label in the screen's words, the sections at
675
+ * the tree's own depth, and no row after them. */
676
+ band?: ScreenPinnedBand;
570
677
  /** The type of the group of sections pinned first, ahead of everything. */
571
678
  firstGroup: string | null;
572
679
  /** …and of the one pinned last. */
@@ -584,6 +691,31 @@ interface ScreenPinnedNodes {
584
691
  */
585
692
  panelOf: (type: string | null | undefined) => ScreenInspectorMode | null;
586
693
  }
694
+ /**
695
+ * THE BAND, AS THE LAYERS TREE FRAMES IT (`ScreenPinnedNodes.band`, 0.103.0):
696
+ * the sections between the two pins. Where the band starts and ends is the
697
+ * screen's arithmetic either way; this is only how it is drawn.
698
+ */
699
+ interface ScreenPinnedBand {
700
+ /** What the band is called. Absent: the screen's words, `screen.pageSections`
701
+ * ("Template · Home page") on a document with the edit guard and
702
+ * `screen.templateSections` ("Template · Template") on one without. */
703
+ label?: string;
704
+ /** The band is a ROW that folds, its sections under it — the campaign
705
+ * designer's Body. Absent or false: a group label over the sections, which
706
+ * sit at the tree's own depth. */
707
+ foldable?: boolean;
708
+ /** The band ends with an "Add section" row (`screen.addSection`) that opens
709
+ * Add at the end of the band, where the band's last "+" does. Hidden while
710
+ * the document is read-only, as every "+" is. Absent or false: the band ends
711
+ * at its last gap. */
712
+ addAtEnd?: boolean;
713
+ }
714
+ /** Is `node` the one the layer pins FIRST — its own test (`isFirst`), else a
715
+ * node of the `first` type, the test the screen has always made. */
716
+ declare function isPinnedFirst(pinned: ScreenPinnedNodes, node: ScreenNode): boolean;
717
+ /** …and LAST (`isLast`, else a node of the `last` type). */
718
+ declare function isPinnedLast(pinned: ScreenPinnedNodes, node: ScreenNode): boolean;
587
719
  /**
588
720
  * THE VIEW THE LEFT PANEL IS ON, from one mount to the next. That the panel
589
721
  * has views, that one of them is current and that the choice is kept is the
@@ -613,6 +745,13 @@ interface ScreenParts {
613
745
  * reads it (components/MediaSidePanel), through `useScreenOwnerName`.
614
746
  */
615
747
  useOwnerName?: () => string;
748
+ /**
749
+ * The Layers head's context line — what the open document is, under the
750
+ * word "Layers" — as the hook the head calls (0.103.0). The campaign
751
+ * designer's names the campaign and its variant. Absent: the document's
752
+ * address, `/${slug}`, as the website's head has always said it.
753
+ */
754
+ useDocumentLabel?: () => string;
616
755
  /**
617
756
  * The layer's wiring between the inspector and what the layer draws in the
618
757
  * canvas, as ONE hook the screen calls where it used to hold that wiring: a
@@ -662,6 +801,24 @@ interface ScreenParts {
662
801
  * sections, and which are edited in a panel of the layer's. Data and three
663
802
  * plain functions, and handed here for the reason the rules are. */
664
803
  pinned?: ScreenPinnedNodes;
804
+ /**
805
+ * Is the save pill also the autosave's on / off switch (0.103.0)? The screen
806
+ * draws the pill as a button that pauses the autosave and resumes it; a
807
+ * layer whose editor always saves (the campaign designer) says false, and the
808
+ * pill is the same words and the same dot with nothing to press. "Retry now"
809
+ * stays beside a failed save either way. Absent, true: the switch, as the
810
+ * website has it.
811
+ */
812
+ saveSwitch?: boolean;
813
+ /**
814
+ * Does a field's media pick give way to a change of selection (0.103.0)? A
815
+ * field of the selected block asks the host's panel to choose (lib/
816
+ * media-panel); with true, selecting another block, or none, while it waits
817
+ * leaves pick mode and settles the field with null, as Cancel would — the
818
+ * campaign designer's picker belongs to the block it was opened for. Absent,
819
+ * false: a pick outlives a change of selection, as the website's does.
820
+ */
821
+ pickFollowsSelection?: boolean;
665
822
  /**
666
823
  * THE CANVAS the screen frames: the engine's, as the layer dresses it — the
667
824
  * layer's own sheet and theme in the frame, its own say over the outline
@@ -695,6 +852,9 @@ declare function useScreenParts(): ScreenParts;
695
852
  /** The layer's bridges, run in the screen. With no layer, nothing runs. */
696
853
  /** The name a panel's head gives what is being edited (`useOwnerName`). */
697
854
  declare function useScreenOwnerName(): string;
855
+ /** The Layers head's context line (`useDocumentLabel`), or null with no
856
+ * layer's, and the screen says the document's address. */
857
+ declare function useScreenDocumentLabel(): string | null;
698
858
  declare function useScreenBridges(inspector: ScreenInspector, tree: ScreenTree, canvas: ScreenCanvas, left: ScreenLeftPanel): ScreenBridges;
699
859
  /** The layer's bridges for the screen that holds one node by itself. With no
700
860
  * layer, nothing runs. */
@@ -717,6 +877,13 @@ declare function useScreenLeftView(): ScreenLeftViewRules;
717
877
  /** Which node types the layer pins in the top-level list, and which are its
718
878
  * groups of sections. With no layer, none. */
719
879
  declare function useScreenPinned(): ScreenPinnedNodes;
880
+ /** Whether the save pill is the autosave's switch. With no layer, it is, as
881
+ * the screen has always drawn it. */
882
+ declare function useScreenSaveSwitch(): boolean;
883
+ /** Leave a field's pick when `selection` changes, if the layer says a pick
884
+ * follows the selection (`pickFollowsSelection`). With no layer, a pick
885
+ * outlives a change of selection, as it always has. */
886
+ declare function useScreenPickFollowsSelection(selection: unknown): void;
720
887
  /** The canvas the layer dresses for the screen to frame. With no layer, the
721
888
  * engine's plain one. */
722
889
  declare function useScreenCanvasFrame(): ComponentType;
@@ -724,4 +891,4 @@ declare function useScreenCanvasFrame(): ComponentType;
724
891
  * engine's plain rows for the selection. */
725
892
  declare function useScreenInspectorPanel(): ComponentType<ScreenInspectorPanelProps>;
726
893
 
727
- export { type NodeDefaults, SELECTION_MODE, type ScreenBlockLook, type ScreenBlockRules, type ScreenBridges, type ScreenCanvas, type ScreenDevices, type ScreenDocumentOps, type ScreenInspector, type ScreenInspectorMode, type ScreenInspectorPanelProps, type ScreenLeftPanel, type ScreenLeftView, type ScreenLeftViewFrame, type ScreenLeftViewRules, type ScreenNewNode, type ScreenNode, type ScreenNodeLevel, type ScreenNodeMaker, type ScreenPartMode, type ScreenParts, ScreenPartsProvider, type ScreenPinnedNodes, type ScreenRailItem, type ScreenTree, type ScreenTreeFolds, type ScreenTreeRows, sameInspectorMode, useScreenBlockLook, useScreenBlockRules, useScreenBridges, useScreenCanvasFrame, useScreenDevices, useScreenDocumentPass, useScreenInspectorPanel, useScreenLeftView, useScreenOwnerName, useScreenParts, useScreenPinned, useStandaloneScreenBridges };
894
+ export { type NodeDefaults, SELECTION_MODE, type ScreenBlockLook, type ScreenBlockRules, type ScreenBridges, type ScreenCanvas, type ScreenDevices, type ScreenDocumentOps, type ScreenInspector, type ScreenInspectorMode, type ScreenInspectorPanelProps, type ScreenLeftPanel, type ScreenLeftView, type ScreenLeftViewFrame, type ScreenLeftViewRules, type ScreenNewNode, type ScreenNode, type ScreenNodeActions, type ScreenNodeLevel, type ScreenNodeMaker, type ScreenPartMode, type ScreenParts, ScreenPartsProvider, type ScreenPinnedBand, type ScreenPinnedNodes, type ScreenRailItem, type ScreenTree, type ScreenTreeFolds, type ScreenTreeRows, isPinnedFirst, isPinnedLast, sameInspectorMode, useScreenBlockLook, useScreenBlockRules, useScreenBridges, useScreenCanvasFrame, useScreenDevices, useScreenDocumentLabel, useScreenDocumentPass, useScreenInspectorPanel, useScreenLeftView, useScreenOwnerName, useScreenParts, useScreenPickFollowsSelection, useScreenPinned, useScreenSaveSwitch, useStandaloneScreenBridges };
@@ -1 +1 @@
1
- export{SELECTION_MODE,ScreenPartsProvider,sameInspectorMode,useScreenBlockLook,useScreenBlockRules,useScreenBridges,useScreenCanvasFrame,useScreenDevices,useScreenDocumentPass,useScreenInspectorPanel,useScreenLeftView,useScreenOwnerName,useScreenParts,useScreenPinned,useStandaloneScreenBridges}from"../../chunk-5464H65G.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,ScreenPartsProvider,isPinnedFirst,isPinnedLast,sameInspectorMode,useScreenBlockLook,useScreenBlockRules,useScreenBridges,useScreenCanvasFrame,useScreenDevices,useScreenDocumentLabel,useScreenDocumentPass,useScreenInspectorPanel,useScreenLeftView,useScreenOwnerName,useScreenParts,useScreenPickFollowsSelection,useScreenPinned,useScreenSaveSwitch,useStandaloneScreenBridges}from"../../chunk-7755VWRT.js";import"../../chunk-Z6BAZFSW.js";import"../../chunk-R5ZVNJLJ.js";import"../../chunk-P67FP7PG.js";import"../../chunk-AELNNAFM.js";import"../../chunk-BXZ6WLHC.js";import"../../chunk-EOJNJCMJ.js";import"../../chunk-ZFDCDJNZ.js";import"../../chunk-ZNS7727Y.js";import"../../chunk-3EDSDPIP.js";import"../../chunk-QTLAVDJE.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-KTVH2ZRL.js";import"../../chunk-D2BCHTQR.js";import"../../chunk-EWVJSRRY.js";import"../../chunk-P6O363EE.js";import"../../chunk-FPOKPNO4.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-BZ5ASXOL.js";import"../../chunk-67GNT6PF.js";import"../../chunk-ZNCEOSXO.js";import"../../chunk-L5KW4HG5.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
@@ -1,5 +1,20 @@
1
1
  import { SectionTemplateStore } from './section-template-types.js';
2
+ import { EaselSession } from './session.js';
2
3
  import './puck/content-tree.js';
4
+ import '../../blocks/index.js';
5
+ import 'react';
6
+ import '../../types-E3HrTPg2.js';
7
+ import '../../data/index.js';
8
+ import '../../types-41704JE4.js';
9
+ import '../../resolve-D68pb3Bx.js';
10
+ import '../../plan-DChbUXdS.js';
11
+ import './backend-error.js';
12
+ import '../../edit-lock/index.js';
13
+ import './host-chrome.js';
14
+ import './links/link-filters.js';
15
+ import '../../LinkPicker-W2Rtxetz.js';
16
+ import './document-contract.js';
17
+ import './document-hooks.js';
3
18
 
4
19
  /**
5
20
  * The section templates of the editor on this page — whichever store its
@@ -18,6 +33,15 @@ import './puck/content-tree.js';
18
33
  * website's sections into the other's.
19
34
  */
20
35
 
36
+ /** The section templates of the editor on this page (`currentEaselSession`). */
21
37
  declare const sectionTemplates: SectionTemplateStore;
38
+ /**
39
+ * The section templates of ONE editor's session (0.103.0): what the screen's
40
+ * own Add panel lists, so an editor mounted beside the page's (a session made
41
+ * with `claimsPage: false`) lists its own backend's templates, never the page
42
+ * editor's. For the page's own editor it is the same store as
43
+ * {@link sectionTemplates}.
44
+ */
45
+ declare function sectionTemplatesOf(session: EaselSession): SectionTemplateStore;
22
46
 
23
- export { sectionTemplates };
47
+ export { sectionTemplates, sectionTemplatesOf };
@@ -1 +1 @@
1
- export{sectionTemplates}from"../../chunk-J4RAY75C.js";import"../../chunk-AJBJ74ME.js";import"../../chunk-KDYIMJTZ.js";
1
+ export{sectionTemplates,sectionTemplatesOf}from"../../chunk-BVN33R76.js";import"../../chunk-KCOBHPN6.js";import"../../chunk-RSCMJIWS.js";
@@ -7,6 +7,8 @@ import '../../data/index.js';
7
7
  import '../../types-41704JE4.js';
8
8
  import '../../resolve-D68pb3Bx.js';
9
9
  import '../../plan-DChbUXdS.js';
10
+ import './backend-error.js';
11
+ import '../../edit-lock/index.js';
10
12
  import './host-chrome.js';
11
13
  import './links/link-filters.js';
12
14
  import '../../LinkPicker-W2Rtxetz.js';
@@ -18,7 +20,9 @@ import './puck/content-tree.js';
18
20
  /**
19
21
  * Hand `session` to the editor below, and make it the page's current one for
20
22
  * as long as this is mounted (see `activateEaselSession` for why it happens in
21
- * render AND in an effect).
23
+ * render AND in an effect) — unless it was made not to claim the page
24
+ * (`claimsPage: false`, 0.103.0): an editor mounted beside the page's is
25
+ * handed its session here and nowhere else.
22
26
  */
23
27
  declare function EaselSessionProvider({ session, children }: {
24
28
  session: EaselSession;
@@ -1 +1 @@
1
- export{EaselSessionProvider,useEaselSession}from"../../chunk-6TZTKAB5.js";import"../../chunk-AJBJ74ME.js";
1
+ export{EaselSessionProvider,useEaselSession}from"../../chunk-O7Q4DDJT.js";import"../../chunk-RSCMJIWS.js";