efficient-easel 0.103.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 (105) hide show
  1. package/README.md +33 -6
  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-Z3KBLIEH.js → chunk-BBRY7KI4.js} +1 -1
  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-LG436UTD.js → chunk-LXEOVUAV.js} +1 -1
  17. package/dist/{chunk-66ICOE3I.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-6UJ3Y6FC.js → chunk-QCBWT2XE.js} +1 -1
  21. package/dist/{chunk-7MU3RJ6S.js → chunk-QDEZQ5A6.js} +1 -1
  22. package/dist/chunk-QOPY2LQM.js +1 -0
  23. package/dist/{chunk-AKFJK65Z.js → chunk-R2MUSGPS.js} +1 -1
  24. package/dist/chunk-RSCMJIWS.js +1 -0
  25. package/dist/{chunk-GXN65JMA.js → chunk-TTENU2HX.js} +1 -1
  26. package/dist/chunk-UB7JVPK4.js +1 -0
  27. package/dist/{chunk-MSBF7IW3.js → chunk-YODRYAZX.js} +2 -2
  28. package/dist/chunk-Z6BAZFSW.js +2 -0
  29. package/dist/chunk-ZOJEFIP4.js +1 -0
  30. package/dist/screen/components/AddBlockRow.js +1 -1
  31. package/dist/screen/components/AddSidePanel.js +1 -1
  32. package/dist/screen/components/MediaSidePanel.d.ts +2 -1
  33. package/dist/screen/components/MediaSidePanel.js +1 -1
  34. package/dist/screen/components/NodeContextMenu.d.ts +47 -2
  35. package/dist/screen/components/NodeContextMenu.js +1 -1
  36. package/dist/screen/components/PageEditGuardNotices.js +1 -1
  37. package/dist/screen/components/ScreenChrome.js +1 -1
  38. package/dist/screen/components/ScreenDocumentContext.d.ts +1 -0
  39. package/dist/screen/components/ScreenDocumentContext.js +1 -1
  40. package/dist/screen/components/ScreenMount.d.ts +4 -1
  41. package/dist/screen/components/ScreenMount.js +1 -1
  42. package/dist/screen/components/ScreenStoreProvider.d.ts +3 -0
  43. package/dist/screen/components/ScreenStoreProvider.js +1 -1
  44. package/dist/screen/components/SectionScreenShell.js +16 -16
  45. package/dist/screen/components/usePartBridge.d.ts +3 -0
  46. package/dist/screen/components/usePartBridge.js +1 -1
  47. package/dist/screen/index.d.ts +5 -2
  48. package/dist/screen/index.js +1 -1
  49. package/dist/screen/lib/admin-bridge.d.ts +2 -0
  50. package/dist/screen/lib/admin-bridge.js +1 -1
  51. package/dist/screen/lib/backend-error.d.ts +20 -5
  52. package/dist/screen/lib/backend-error.js +1 -1
  53. package/dist/screen/lib/document-addressing.d.ts +1 -0
  54. package/dist/screen/lib/failure.d.ts +6 -2
  55. package/dist/screen/lib/failure.js +1 -1
  56. package/dist/screen/lib/host-inbound.js +1 -1
  57. package/dist/screen/lib/host.d.ts +2 -1
  58. package/dist/screen/lib/load-error.d.ts +9 -3
  59. package/dist/screen/lib/load-error.js +1 -1
  60. package/dist/screen/lib/media-panel.d.ts +81 -17
  61. package/dist/screen/lib/media-panel.js +1 -1
  62. package/dist/screen/lib/media-picker.d.ts +13 -1
  63. package/dist/screen/lib/media-picker.js +1 -1
  64. package/dist/screen/lib/page-lock.d.ts +45 -1
  65. package/dist/screen/lib/page-lock.js +1 -1
  66. package/dist/screen/lib/puck/content-tree.d.ts +20 -1
  67. package/dist/screen/lib/puck/content-tree.js +1 -1
  68. package/dist/screen/lib/puck/section-doc.js +1 -1
  69. package/dist/screen/lib/puck/slot-child-name.d.ts +18 -3
  70. package/dist/screen/lib/puck/slot-child-name.js +1 -1
  71. package/dist/screen/lib/puck/use-section-ops.d.ts +6 -0
  72. package/dist/screen/lib/puck/use-section-ops.js +1 -1
  73. package/dist/screen/lib/screen-parts.d.ts +150 -4
  74. package/dist/screen/lib/screen-parts.js +1 -1
  75. package/dist/screen/lib/section-templates.d.ts +25 -1
  76. package/dist/screen/lib/section-templates.js +1 -1
  77. package/dist/screen/lib/session-context.d.ts +5 -1
  78. package/dist/screen/lib/session-context.js +1 -1
  79. package/dist/screen/lib/session.d.ts +58 -5
  80. package/dist/screen/lib/session.js +1 -1
  81. package/dist/screen/words.d.ts +24 -1
  82. package/dist/screen/words.js +1 -1
  83. package/dist/strings/catalogue.js +1 -1
  84. package/dist/strings/index.js +1 -1
  85. package/dist/tree/index.d.ts +4 -142
  86. package/dist/types-DJDBtdB2.d.ts +143 -0
  87. package/package.json +1 -1
  88. package/dist/chunk-3M3A3DN2.js +0 -4
  89. package/dist/chunk-4MXFKJUY.js +0 -1
  90. package/dist/chunk-6FY3PZS3.js +0 -1
  91. package/dist/chunk-A7ZJII7O.js +0 -1
  92. package/dist/chunk-AJBJ74ME.js +0 -1
  93. package/dist/chunk-AKZWUV5Z.js +0 -1
  94. package/dist/chunk-F6CCTEIX.js +0 -1
  95. package/dist/chunk-FUDHI5I4.js +0 -1
  96. package/dist/chunk-HDKTR5TZ.js +0 -62
  97. package/dist/chunk-HMX55DYT.js +0 -1
  98. package/dist/chunk-HWW4XJOH.js +0 -1
  99. package/dist/chunk-NBJ2YY6Y.js +0 -4
  100. package/dist/chunk-OORDMLL4.js +0 -5
  101. package/dist/chunk-Q3SQBNJB.js +0 -1
  102. package/dist/chunk-VV5ADNBR.js +0 -1
  103. package/dist/chunk-YJXEHK6I.js +0 -2
  104. package/dist/chunk-ZWK3CBRU.js +0 -1
  105. package/dist/chunk-ZZ7VLIHQ.js +0 -1
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ComponentType, ReactNode } from 'react';
3
- import { H as HostPickedMedia } from '../../host-DJ8Gzsx7.js';
3
+ import { H as HostPickedMedia, E as EaselHost } from '../../host-DJ8Gzsx7.js';
4
4
  import '../../blocks/index.js';
5
5
  import '../../types-E3HrTPg2.js';
6
6
  import '../../data/index.js';
@@ -9,6 +9,8 @@ import '../../resolve-D68pb3Bx.js';
9
9
  import '../../plan-DChbUXdS.js';
10
10
  import './document-contract.js';
11
11
  import './session.js';
12
+ import './backend-error.js';
13
+ import '../../edit-lock/index.js';
12
14
  import './host-chrome.js';
13
15
  import './links/link-filters.js';
14
16
  import '../../LinkPicker-W2Rtxetz.js';
@@ -17,7 +19,6 @@ import './section-template-types.js';
17
19
  import './puck/content-tree.js';
18
20
  import './document-switch.js';
19
21
  import '../../engine-DBxp_v6B.js';
20
- import '../../edit-lock/index.js';
21
22
  import './admin-bridge.js';
22
23
 
23
24
  /**
@@ -40,13 +41,23 @@ import './admin-bridge.js';
40
41
  * • BROWSING — the rail opens the "media" left view. The host's panel shows
41
42
  * the library to look through, upload to, tidy. `pick` is null.
42
43
  * • PICKING — a field calls `requestMediaPick` (lib/media-picker). With
43
- * a panel here, that becomes {@link requestPanelPick}: the chrome lays the
44
- * panel over the left panel in pick mode, the host's panel calls `onPick`,
45
- * and the field gets the media. Leaving pick mode any other way (the
46
- * panel's Cancel, a rail button, closing the panel) settles it `null`.
44
+ * a panel here, that becomes a request to THIS provider's pick store: the
45
+ * chrome lays the panel over the left panel in pick mode, the host's panel
46
+ * calls `onPick`, and the field gets the media. Leaving pick mode any other
47
+ * way (the panel's Cancel, a rail button, closing the panel) settles it
48
+ * `null`.
47
49
  *
48
- * Module state for the same reason as lib/media-picker: the fields that
49
- * ask are Puck custom fields, which no prop reaches.
50
+ * ONE PENDING PICK PER PROVIDER (0.103.0). Until then the pending pick was
51
+ * module state, one for the page — right while one editor is mounted, and
52
+ * wrong the moment two are (the admin's website editor and campaign designer):
53
+ * a field in one laid the other's panel over its own left panel too, and a
54
+ * Cancel in either settled the other's field. Each provider now keeps its own
55
+ * {@link MediaPickStore}; the chrome under it reads that one, and a field's
56
+ * request finds it by the HOST the field asks through (`requestMediaPick(host,
57
+ * …)` — one host per mounted editor, lib/host), so no prop or context has to
58
+ * reach the field's click handler. A request whose host no provider sits under
59
+ * goes to the provider mounted last, which is exactly what the module state
60
+ * answered, so one mounted editor behaves as it always did.
50
61
  */
51
62
  /** What a field asked the panel for. `file` is a file dropped straight on the
52
63
  * field: the host uploads it and picks it without waiting for a click. */
@@ -57,6 +68,14 @@ interface MediaPickRequest {
57
68
  /** The field's label, e.g. "Background image". */
58
69
  title: string;
59
70
  file?: File | null;
71
+ /**
72
+ * The field's own terms for its host's panel (0.103.0), handed to it
73
+ * untouched — the campaign designer's logo field asks for `{ bakeableOnly:
74
+ * true }`. The screen reads none of it. Absent when the field gave none;
75
+ * the window's `open-media-picker` message never carries it (its shape is
76
+ * the website's protocol).
77
+ */
78
+ options?: Record<string, unknown>;
60
79
  }
61
80
  /** The props the host's panel component is drawn with. */
62
81
  interface MediaPanelProps {
@@ -67,28 +86,73 @@ interface MediaPanelProps {
67
86
  }
68
87
  /** The host's media library, as a component the editor draws in its panel. */
69
88
  type MediaPanelComponent = ComponentType<MediaPanelProps>;
89
+ /**
90
+ * One editor's pending pick (0.103.0): what its panel is choosing for, and who
91
+ * waits on the answer. A {@link MediaPanelProvider} makes one for itself.
92
+ */
93
+ interface MediaPickStore {
94
+ /** The field the panel is choosing for, or null while nothing is. */
95
+ current(): MediaPickRequest | null;
96
+ /**
97
+ * Open pick mode for one field; resolves with the media chosen, or null. A
98
+ * second field asking before the first is answered takes the panel over,
99
+ * and the first resolves null — one panel answers one field.
100
+ */
101
+ request(request: MediaPickRequest): Promise<HostPickedMedia | null>;
102
+ /** Answer the field the panel is choosing for (`media` null: no choice). A
103
+ * stale id — an answer for a request already superseded — does nothing. */
104
+ settle(requestId: string, media: HostPickedMedia | null): void;
105
+ /** Leave pick mode without a choice, whatever is being chosen. */
106
+ cancel(): void;
107
+ subscribe(listener: () => void): () => void;
108
+ }
109
+ declare function createMediaPickStore(): MediaPickStore;
70
110
  /** Supply the host's panel to the editor below. `panel` null keeps the old
71
- * window: fields ask the host with `open-media-picker`. */
111
+ * window: fields ask the host with `open-media-picker`. Sit it under the
112
+ * editor's `EaselHostProvider`, as the website's frame does: that host is
113
+ * how a field's request finds this provider among several. */
72
114
  declare function MediaPanelProvider({ panel, children }: {
73
115
  panel: MediaPanelComponent | null;
74
116
  children: ReactNode;
75
117
  }): react.JSX.Element;
76
118
  /** The host's panel for the editor this renders in, or null. */
77
119
  declare function useMediaPanel(): MediaPanelComponent | null;
78
- /** Whether a field's request goes to the panel rather than to the host. */
120
+ /**
121
+ * The pick store a field's request through `host` goes to, or null when that
122
+ * editor has no panel and the host is asked with the window's message: the
123
+ * provider under that host (the last one, if two share it), else the page's
124
+ * provider, as the one module-wide store answered before 0.103.0.
125
+ */
126
+ declare function mediaPickStoreFor(host: EaselHost): MediaPickStore | null;
127
+ /** Whether a field's request goes to the panel rather than to the host — of
128
+ * the page's provider, the one mounted last. */
79
129
  declare function hasMediaPanel(): boolean;
80
130
  /**
81
- * Open the panel in pick mode for one field; resolves with the media chosen, or
82
- * null. A second field asking before the first is answered takes the panel over,
83
- * and the first resolves null — one panel answers one field.
131
+ * Open the page's panel (the provider mounted last) in pick mode for one
132
+ * field; resolves with the media chosen, or null. A field asks through
133
+ * `requestMediaPick`, which finds the panel of ITS editor instead.
84
134
  */
85
135
  declare function requestPanelPick(request: MediaPickRequest): Promise<HostPickedMedia | null>;
86
- /** Answer the field the panel is choosing for (`media` null: no choice). A
136
+ /** Answer the field a panel is choosing for (`media` null: no choice), in
137
+ * whichever editor asked: a request id names one field of one editor. A
87
138
  * stale id — an answer for a request already superseded — does nothing. */
88
139
  declare function settlePanelPick(requestId: string, media: HostPickedMedia | null): void;
89
- /** Leave pick mode without a choice, whatever is being chosen. */
140
+ /** Leave the page's pick mode without a choice, whatever is being chosen.
141
+ * Under a provider, `useCancelPanelPick` leaves that editor's. */
90
142
  declare function cancelPanelPick(): void;
91
- /** The field the panel is choosing for, or null while nothing is. */
143
+ /** The field the panel is choosing for, or null while nothing is — in the
144
+ * editor this renders in. */
92
145
  declare function usePanelPick(): MediaPickRequest | null;
146
+ /** Leave THIS editor's pick mode without a choice (0.103.0): a stable
147
+ * function, for the chrome's Escape, rail and panel-closed paths. */
148
+ declare function useCancelPanelPick(): () => void;
149
+ /**
150
+ * A change of selection leaves pick mode (0.103.0, `ScreenParts
151
+ * .pickFollowsSelection`): with `follows`, the field still waiting when
152
+ * `selection` moves is settled with null, as a Cancel would — the field that
153
+ * asked belongs to the block that is no longer selected. Without it, nothing:
154
+ * a pick outlives a selection, as it always has.
155
+ */
156
+ declare function usePickFollowsSelection(follows: boolean, selection: unknown): void;
93
157
 
94
- export { type MediaPanelComponent, type MediaPanelProps, MediaPanelProvider, type MediaPickRequest, cancelPanelPick, hasMediaPanel, requestPanelPick, settlePanelPick, useMediaPanel, usePanelPick };
158
+ export { type MediaPanelComponent, type MediaPanelProps, MediaPanelProvider, type MediaPickRequest, type MediaPickStore, cancelPanelPick, createMediaPickStore, hasMediaPanel, mediaPickStoreFor, requestPanelPick, settlePanelPick, useCancelPanelPick, useMediaPanel, usePanelPick, usePickFollowsSelection };
@@ -1 +1 @@
1
- export{MediaPanelProvider,cancelPanelPick,hasMediaPanel,requestPanelPick,settlePanelPick,useMediaPanel,usePanelPick}from"../../chunk-ZZ7VLIHQ.js";
1
+ export{MediaPanelProvider,cancelPanelPick,createMediaPickStore,hasMediaPanel,mediaPickStoreFor,requestPanelPick,settlePanelPick,useCancelPanelPick,useMediaPanel,usePanelPick,usePickFollowsSelection}from"../../chunk-Z6BAZFSW.js";import"../../chunk-R5ZVNJLJ.js";
@@ -8,6 +8,8 @@ import '../../resolve-D68pb3Bx.js';
8
8
  import '../../plan-DChbUXdS.js';
9
9
  import './document-contract.js';
10
10
  import './session.js';
11
+ import './backend-error.js';
12
+ import '../../edit-lock/index.js';
11
13
  import './host-chrome.js';
12
14
  import './links/link-filters.js';
13
15
  import '../../LinkPicker-W2Rtxetz.js';
@@ -16,7 +18,6 @@ import './section-template-types.js';
16
18
  import './puck/content-tree.js';
17
19
  import './document-switch.js';
18
20
  import '../../engine-DBxp_v6B.js';
19
- import '../../edit-lock/index.js';
20
21
  import './admin-bridge.js';
21
22
 
22
23
  /**
@@ -28,6 +29,10 @@ import './admin-bridge.js';
28
29
  * • A host that supplies a MEDIA PANEL (lib/media-panel — the admin
29
30
  * portal, from efficient-web 0.2.0) answers in the editor's own left panel:
30
31
  * the request opens that panel in pick mode, and nothing leaves the editor.
32
+ * The panel is the one of the editor the field asks through: `host` is
33
+ * that editor's (one per mounted editor), and the provider under it keeps
34
+ * its own pending pick (0.103.0), so two editors mounted in one page never
35
+ * answer each other's fields.
31
36
  * • Any other host is asked to open its picker window, over the
32
37
  * request/response protocol below. The picker UI lives in the host, so
33
38
  * this module owns the EDITOR half:
@@ -54,11 +59,18 @@ interface PickedMedia {
54
59
  * Choose media for a slot; resolves with the chosen media, or null if the user
55
60
  * cancelled (or there's no host to ask). `file` is a file dropped straight on
56
61
  * the slot — the host uploads it and picks it immediately.
62
+ *
63
+ * `options` (0.103.0) are the field's own terms for its host's PANEL, handed to
64
+ * it untouched on the request (`MediaPickRequest.options`) — the campaign
65
+ * designer's logo field asks for `{ bakeableOnly: true }`. The window's
66
+ * `open-media-picker` message carries none: its shape is the website's
67
+ * protocol, mirrored by the storefront.
57
68
  */
58
69
  declare function requestMediaPick(host: EaselHost, opts: {
59
70
  accept: string;
60
71
  title: string;
61
72
  file?: File | null;
73
+ options?: Record<string, unknown>;
62
74
  }): Promise<PickedMedia | null>;
63
75
  /** Settle a pending pick (called by the central message listener on the admin's
64
76
  * reply). Unknown ids — a stale reply, or a pick meant for another editor
@@ -1 +1 @@
1
- export{requestMediaPick,resolveMediaPick}from"../../chunk-6FY3PZS3.js";import"../../chunk-ZZ7VLIHQ.js";
1
+ export{requestMediaPick,resolveMediaPick}from"../../chunk-UB7JVPK4.js";import"../../chunk-Z6BAZFSW.js";import"../../chunk-R5ZVNJLJ.js";
@@ -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";
@@ -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";
@@ -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
@@ -450,6 +470,17 @@ interface ScreenBlockRules {
450
470
  * no host chose its blocks, every type is.
451
471
  */
452
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;
453
484
  }
454
485
  /** The tier a node is NAMED at: a node at the top of the document is a section,
455
486
  * a node inside another is a block. */
@@ -516,6 +547,41 @@ interface ScreenBlockLook {
516
547
  * the screen read the products itself, so its effect keeps its place.
517
548
  */
518
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;
519
585
  }
520
586
  /**
521
587
  * THE DEVICES the canvas can be looked at on. That the top bar has a switch,
@@ -566,9 +632,15 @@ interface ScreenDevices {
566
632
  * selected and where a pinned node's row is pressed, and shows what it is
567
633
  * handed.
568
634
  *
569
- * The same object for the life of a mount, its three functions plain functions
570
- * of what they are passed: the screen reads it anywhere, inside the callbacks
571
- * 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.
572
644
  */
573
645
  interface ScreenPinnedNodes {
574
646
  /** The type of the node pinned FIRST: the band starts after it. Null when
@@ -576,6 +648,32 @@ interface ScreenPinnedNodes {
576
648
  first: string | null;
577
649
  /** The type of the node pinned LAST: the band ends at it. */
578
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;
579
677
  /** The type of the group of sections pinned first, ahead of everything. */
580
678
  firstGroup: string | null;
581
679
  /** …and of the one pinned last. */
@@ -593,6 +691,31 @@ interface ScreenPinnedNodes {
593
691
  */
594
692
  panelOf: (type: string | null | undefined) => ScreenInspectorMode | null;
595
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;
596
719
  /**
597
720
  * THE VIEW THE LEFT PANEL IS ON, from one mount to the next. That the panel
598
721
  * has views, that one of them is current and that the choice is kept is the
@@ -622,6 +745,13 @@ interface ScreenParts {
622
745
  * reads it (components/MediaSidePanel), through `useScreenOwnerName`.
623
746
  */
624
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;
625
755
  /**
626
756
  * The layer's wiring between the inspector and what the layer draws in the
627
757
  * canvas, as ONE hook the screen calls where it used to hold that wiring: a
@@ -680,6 +810,15 @@ interface ScreenParts {
680
810
  * website has it.
681
811
  */
682
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;
683
822
  /**
684
823
  * THE CANVAS the screen frames: the engine's, as the layer dresses it — the
685
824
  * layer's own sheet and theme in the frame, its own say over the outline
@@ -713,6 +852,9 @@ declare function useScreenParts(): ScreenParts;
713
852
  /** The layer's bridges, run in the screen. With no layer, nothing runs. */
714
853
  /** The name a panel's head gives what is being edited (`useOwnerName`). */
715
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;
716
858
  declare function useScreenBridges(inspector: ScreenInspector, tree: ScreenTree, canvas: ScreenCanvas, left: ScreenLeftPanel): ScreenBridges;
717
859
  /** The layer's bridges for the screen that holds one node by itself. With no
718
860
  * layer, nothing runs. */
@@ -738,6 +880,10 @@ declare function useScreenPinned(): ScreenPinnedNodes;
738
880
  /** Whether the save pill is the autosave's switch. With no layer, it is, as
739
881
  * the screen has always drawn it. */
740
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;
741
887
  /** The canvas the layer dresses for the screen to frame. With no layer, the
742
888
  * engine's plain one. */
743
889
  declare function useScreenCanvasFrame(): ComponentType;
@@ -745,4 +891,4 @@ declare function useScreenCanvasFrame(): ComponentType;
745
891
  * engine's plain rows for the selection. */
746
892
  declare function useScreenInspectorPanel(): ComponentType<ScreenInspectorPanelProps>;
747
893
 
748
- 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, useScreenSaveSwitch, 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,useScreenSaveSwitch,useStandaloneScreenBridges}from"../../chunk-NBJ2YY6Y.js";import"../../chunk-P67FP7PG.js";import"../../chunk-AELNNAFM.js";import"../../chunk-BXZ6WLHC.js";import"../../chunk-EOJNJCMJ.js";import"../../chunk-ZFDCDJNZ.js";import"../../chunk-ZNS7727Y.js";import"../../chunk-3EDSDPIP.js";import"../../chunk-QTLAVDJE.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-KTVH2ZRL.js";import"../../chunk-D2BCHTQR.js";import"../../chunk-EWVJSRRY.js";import"../../chunk-P6O363EE.js";import"../../chunk-FPOKPNO4.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-BZ5ASXOL.js";import"../../chunk-67GNT6PF.js";import"../../chunk-ZNCEOSXO.js";import"../../chunk-L5KW4HG5.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
1
+ export{SELECTION_MODE,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";