efficient-easel 24.1.0 → 25.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 (149) hide show
  1. package/README.md +43 -2
  2. package/dist/{CanvasDragLayer-NZpaX6aq.d.ts → CanvasDragLayer-DXeQGrwJ.d.ts} +42 -3
  3. package/dist/canvas/index.d.ts +2 -139
  4. package/dist/canvas/index.js +1 -1
  5. package/dist/chrome/index.js +1 -1
  6. package/dist/{chunk-6NJHYXJM.js → chunk-3XECMGXX.js} +1 -1
  7. package/dist/chunk-4OMAA45Q.js +5 -0
  8. package/dist/{chunk-G67G63O5.js → chunk-4Y3TK65H.js} +1 -1
  9. package/dist/chunk-53ME3GAI.js +16 -0
  10. package/dist/{chunk-FRAIEWRC.js → chunk-62UGN7VM.js} +1 -1
  11. package/dist/{chunk-HNKB2ZYR.js → chunk-6ATIYLUL.js} +1 -1
  12. package/dist/{chunk-Y53EKN35.js → chunk-6EDVZBUO.js} +1 -1
  13. package/dist/chunk-7UFKEX72.js +1 -0
  14. package/dist/chunk-CEC5XLN4.js +1 -0
  15. package/dist/chunk-CWELHADJ.js +1 -0
  16. package/dist/chunk-DX3VILZ3.js +6 -0
  17. package/dist/chunk-ERB6FAZT.js +2 -0
  18. package/dist/{chunk-TGZCD6IP.js → chunk-EUFDQ4KL.js} +1 -1
  19. package/dist/chunk-FR7EEKFF.js +1 -0
  20. package/dist/{chunk-75C6WFNF.js → chunk-FYV6GZXP.js} +1 -1
  21. package/dist/chunk-GDO4QJ4G.js +1 -0
  22. package/dist/chunk-GEPSJJWW.js +1 -0
  23. package/dist/{chunk-GMCZXMOV.js → chunk-GR3XRILS.js} +1 -1
  24. package/dist/chunk-H6BER2EU.js +1 -0
  25. package/dist/chunk-JIP5JNRB.js +1 -0
  26. package/dist/{chunk-AGWKB77Q.js → chunk-K53PQAMP.js} +1 -1
  27. package/dist/{chunk-CLOS6SSX.js → chunk-KO47WAWR.js} +1 -1
  28. package/dist/chunk-KTV7ORWF.js +64 -0
  29. package/dist/chunk-LUG22U5L.js +1 -0
  30. package/dist/{chunk-DDH2DYQP.js → chunk-LUOY3A3Q.js} +1 -1
  31. package/dist/{chunk-OITNWE52.js → chunk-M4THI4OO.js} +1 -1
  32. package/dist/chunk-MBEUSPIN.js +18 -0
  33. package/dist/chunk-MIX7EGRG.js +2 -0
  34. package/dist/{chunk-2FYFAAAK.js → chunk-OXOUGEAT.js} +1 -1
  35. package/dist/chunk-PMRN5Z3T.js +1 -0
  36. package/dist/{chunk-55KKGABA.js → chunk-PVBDKBJB.js} +1 -1
  37. package/dist/{chunk-RPMSET77.js → chunk-QTHQPJWA.js} +1 -1
  38. package/dist/{chunk-ISS72IKO.js → chunk-QZJKWKGH.js} +1 -1
  39. package/dist/{chunk-IYHO4XQX.js → chunk-S6YOIRXQ.js} +1 -1
  40. package/dist/{chunk-5PXVT7JY.js → chunk-SBVIW3KJ.js} +1 -1
  41. package/dist/chunk-SC6E3UUS.js +13 -0
  42. package/dist/chunk-SSDKT4AY.js +9 -0
  43. package/dist/chunk-TOKMFZPB.js +1 -0
  44. package/dist/chunk-U3LTJSBU.js +20 -0
  45. package/dist/{chunk-WYTPBF3Q.js → chunk-VBEVZZTV.js} +11 -11
  46. package/dist/chunk-VIUES5R6.js +8 -0
  47. package/dist/{chunk-4ESG53BH.js → chunk-YFHKE54W.js} +1 -1
  48. package/dist/chunk-YYD257TD.js +1 -0
  49. package/dist/chunk-ZLOMH2PD.js +1 -0
  50. package/dist/{chunk-CE5SGCN2.js → chunk-ZYOQXBJF.js} +3 -3
  51. package/dist/copy/index.js +13 -13
  52. package/dist/copy-place-CQIemdtU.d.ts +25 -0
  53. package/dist/data/index.d.ts +4 -1
  54. package/dist/data/index.js +1 -1
  55. package/dist/dom-BpxMcHFP.d.ts +200 -0
  56. package/dist/drag/index.d.ts +2 -3
  57. package/dist/drag/index.js +1 -1
  58. package/dist/draw/index.d.ts +1 -1
  59. package/dist/draw/index.js +1 -1
  60. package/dist/easel/index.d.ts +67 -1
  61. package/dist/easel/index.js +1 -1
  62. package/dist/edit-lock/index.d.ts +0 -46
  63. package/dist/edit-lock/index.js +1 -1
  64. package/dist/fields/fields.css +6 -40
  65. package/dist/fields/index.d.ts +1 -6
  66. package/dist/fields/index.js +1 -1
  67. package/dist/node-ops/index.js +1 -1
  68. package/dist/page-copy/index.d.ts +110 -0
  69. package/dist/page-copy/index.js +5 -0
  70. package/dist/panel/index.d.ts +29 -34
  71. package/dist/panel/index.js +1 -1
  72. package/dist/panel/panel.css +0 -78
  73. package/dist/screen/components/AddBlockRow.js +1 -1
  74. package/dist/screen/components/AddSidePanel.d.ts +37 -57
  75. package/dist/screen/components/AddSidePanel.js +1 -1
  76. package/dist/screen/components/NodeContextMenu.d.ts +19 -11
  77. package/dist/screen/components/NodeContextMenu.js +1 -1
  78. package/dist/screen/components/PageEditGuardNotices.js +1 -1
  79. package/dist/screen/components/SaveControls.d.ts +10 -11
  80. package/dist/screen/components/SaveControls.js +1 -1
  81. package/dist/screen/components/ScreenChrome.js +1 -1
  82. package/dist/screen/components/ScreenDocumentContext.js +1 -1
  83. package/dist/screen/components/ScreenMount.d.ts +5 -6
  84. package/dist/screen/components/ScreenMount.js +1 -1
  85. package/dist/screen/components/ScreenStoreProvider.d.ts +8 -9
  86. package/dist/screen/components/ScreenStoreProvider.js +1 -1
  87. package/dist/screen/components/SectionScreenShell.js +17 -17
  88. package/dist/screen/components/SidePanelHead.js +1 -1
  89. package/dist/screen/components/panel-widths.js +1 -1
  90. package/dist/screen/components/usePartBridge.d.ts +10 -11
  91. package/dist/screen/components/usePartBridge.js +1 -1
  92. package/dist/screen/index.d.ts +9 -10
  93. package/dist/screen/index.js +1 -1
  94. package/dist/screen/lib/document/block-set-host.d.ts +55 -0
  95. package/dist/screen/lib/document/block-set-host.js +1 -0
  96. package/dist/screen/lib/document/block-types-in.js +1 -1
  97. package/dist/screen/lib/document/box-fields.d.ts +70 -3
  98. package/dist/screen/lib/document/box-fields.js +1 -9
  99. package/dist/screen/lib/document/device-fields.js +1 -1
  100. package/dist/screen/lib/document/palette-sections.d.ts +33 -97
  101. package/dist/screen/lib/document/palette-sections.js +1 -1
  102. package/dist/screen/lib/document/preview-dom.js +1 -1
  103. package/dist/screen/lib/document/section-doc.js +1 -1
  104. package/dist/screen/lib/document/style-clipboard.d.ts +10 -11
  105. package/dist/screen/lib/document/style-clipboard.js +1 -1
  106. package/dist/screen/lib/document/use-section-ops.js +1 -1
  107. package/dist/screen/lib/document-switch.js +1 -1
  108. package/dist/screen/lib/failure.js +1 -1
  109. package/dist/screen/lib/host-inbound.js +1 -1
  110. package/dist/screen/lib/key-scope.js +1 -1
  111. package/dist/screen/lib/media-picker.js +1 -1
  112. package/dist/screen/lib/page-lock.js +1 -1
  113. package/dist/screen/lib/screen-parts.d.ts +265 -13
  114. package/dist/screen/lib/screen-parts.js +1 -1
  115. package/dist/screen/screen.css +6 -0
  116. package/dist/screen/words.d.ts +9 -0
  117. package/dist/screen/words.js +1 -1
  118. package/dist/strings/index.d.ts +4 -1
  119. package/dist/strings/index.js +2 -2
  120. package/dist/style-clipboard/index.d.ts +0 -32
  121. package/dist/style-clipboard/index.js +1 -1
  122. package/dist/text-styles/index.d.ts +7 -6
  123. package/dist/text-styles/index.js +37 -36
  124. package/dist/text-styles/text-styles.css +5 -53
  125. package/dist/tree/index.d.ts +2 -2
  126. package/dist/{types-DBy3L69b.d.ts → types-CoUTWUwB.d.ts} +1 -1
  127. package/dist/words-Dl8Qja4K.d.ts +32 -0
  128. package/package.json +15 -3
  129. package/dist/chunk-3FIS2FRS.js +0 -1
  130. package/dist/chunk-7RSE6KKY.js +0 -1
  131. package/dist/chunk-AAAZ2CQR.js +0 -1
  132. package/dist/chunk-CMPFUJ26.js +0 -8
  133. package/dist/chunk-CZAAGBVL.js +0 -7
  134. package/dist/chunk-DSKNJXB4.js +0 -1
  135. package/dist/chunk-FJTCSQWK.js +0 -16
  136. package/dist/chunk-H4Z2V56N.js +0 -21
  137. package/dist/chunk-K7MMLCTT.js +0 -2
  138. package/dist/chunk-KRL3IUV3.js +0 -1
  139. package/dist/chunk-LF3FUSCQ.js +0 -1
  140. package/dist/chunk-LN43DP2A.js +0 -18
  141. package/dist/chunk-MRWVYSU5.js +0 -64
  142. package/dist/chunk-QORC32JO.js +0 -5
  143. package/dist/chunk-THWO5YVZ.js +0 -1
  144. package/dist/chunk-TOHOGVAE.js +0 -15
  145. package/dist/chunk-V7U33NF2.js +0 -1
  146. package/dist/chunk-VKPOH6MK.js +0 -1
  147. package/dist/chunk-YU3WHLGI.js +0 -1
  148. package/dist/repeat-D65bJS8d.d.ts +0 -49
  149. package/dist/session-EsjORLQ0.d.ts +0 -43
@@ -1,103 +1,39 @@
1
- import { Config } from '../../../blocks/index.js';
1
+ import '../../../blocks/index.js';
2
+ export { P as PaletteLook, a as PalettePreset, b as PaletteSection, c as buildPaletteSections, d as categoryLabel, m as matchesQuery, p as paletteWithoutPinned, e as pinnedSection } from '../screen-parts.js';
2
3
  import 'react';
3
4
  import '../../../types-BljCVdzR.js';
4
5
  import '../../../data/index.js';
5
6
  import '../../../types-Dq180WRV.js';
6
7
  import '../../../resolve-Bz4mszpL.js';
7
8
  import '../../../plan-D0DgSLnY.js';
8
-
9
- /** One offerable section, with the category it is grouped under. */
10
- type PaletteSection = {
11
- type: string;
12
- cat: string;
13
- name: string;
14
- desc: string;
15
- /**
16
- * The heading of the category this section sits under, resolved once at build
17
- * time — SEARCHED, and already SHOWN as the nav row this card sits beneath.
18
- *
19
- * ⚠️ IT IS HERE BECAUSE THE NAV AND THE SEARCH DISAGREED. Seven of the
20
- * thirteen category names returned NOTHING when typed: "Blog & journal" reads
21
- * 5 in the nav, and "blog" found 0, because not one of Issue Header, Featured
22
- * Cover, Article Text, Recurring Columns or Latest Posts carries the word. Same
23
- * for shop, about, promotions, navigation, legal and layout. A merchant reads
24
- * the word off the screen, types it, and is told no section matches.
25
- *
26
- * Resolved HERE, not in `matchesQuery`, because the label needs the `config`
27
- * (`categoryLabel`) and the matcher is given only a section — passing config
28
- * into the matcher would make every caller carry it.
29
- */
30
- catLabel: string;
31
- /**
32
- * Another word this section is known by, searched but never shown.
33
- *
34
- * ⚠️ THIS EXISTS FOR ONE NODE AND ONE REASON. `Flex` is offered here as
35
- * "Blank section" and is called "Box" everywhere it is nested — so a merchant
36
- * who met it in a Layers row, or in last week's handoff, types "box" and must
37
- * still find it. Without this they would find NOTHING: the card is pinned out
38
- * of its group, so a search that misses it misses it completely.
39
- */
40
- alias?: string;
41
- };
42
- /**
43
- * What the layer says of its sections for the palette: the word for a type at
44
- * a level, a group's short heading where it has one, and the blurbs. The
45
- * screen's `blockLook` is one (lib/screen-parts); so is the website's own
46
- * (lib/document/add-palette).
47
- */
48
- interface PaletteLook {
49
- /** What a node of `type` is called at a level, given the label the config
50
- * holds for it. */
51
- labelAtLevel: (type: string, level: "section" | "block", base: string) => string;
52
- /** A group's short heading, by its key, where the layer has one; undefined,
53
- * and the config's own title is the heading. */
54
- categoryLabel: (id: string) => string | undefined;
55
- /** The one-line blurb for a section, by type. */
56
- descriptions: Record<string, string>;
57
- }
58
- /**
59
- * Flatten `config.categories` into an ordered section list.
60
- *
61
- * Grouping and order ARE the category order in the config — which is the
62
- * catalog's order — so this adds no opinion of its own. A component listed in a
63
- * category but absent from `components` is skipped: a stale catalog row cannot
64
- * render and certainly cannot insert, so offering it would be a card that fails
65
- * on click.
66
- *
67
- * Child-only blocks (HeroSlide / CollectionCard / ProductRef) and the four
68
- * generic primitives (Heading / Text / ImageBlock / ButtonBlock) sit in NO
69
- * category on purpose, so they never appear here — they are added from their
70
- * parent's slot instead. See the note above `categories:` in lib/document/config.tsx.
71
- *
72
- * A category the config marks `visible: false` is NOT offered (0.105.0, seam
73
- * E9): it is a registry's way of keeping blocks it has out of the picker — the
74
- * campaign designer's Product parts, its retired blocks, its Sections — and a
75
- * palette that listed them would offer things that may not be put on a page.
76
- * The old library's own palette read the flag the same way. No website category carries
77
- * it, so the website's palette is the list it was.
78
- */
79
- declare function buildPaletteSections(config: Config, look: PaletteLook): PaletteSection[];
80
- /** A category's display label — the layer's short one where there is one, else the config's title. */
81
- declare function categoryLabel(config: Config, id: string, shortLabel: (id: string) => string | undefined): string;
82
- /**
83
- * Does a section match a search query?
84
- *
85
- * The query is matched against the NAME, any ALIAS, the blurb, the component
86
- * TYPE and the CATEGORY HEADING — the type because a merchant who knows the
87
- * section by the word they saw in a handoff should still find it, the alias
88
- * because one node is called something else everywhere it is nested (see
89
- * `PaletteSection.alias`), and the category because it is PRINTED IN THE NAV
90
- * BESIDE THE RESULTS: seven of thirteen headings used to match nothing at all
91
- * (see `PaletteSection.catLabel`). A word a merchant can read off this screen
92
- * must find what it is labelling.
93
- *
94
- * `q` is expected already lower-cased and trimmed; an empty query matches
95
- * everything.
96
- */
97
- declare function matchesQuery(s: PaletteSection, q: string): boolean;
98
- /** The pinned section, or `null` if the layer pins none or the config does not offer it. */
99
- declare function pinnedSection(sections: PaletteSection[], pinned: string | null): PaletteSection | null;
100
- /** Every OTHER section — what the grouped grid below the pinned card draws. */
101
- declare function paletteWithoutPinned(sections: PaletteSection[], pinned: string | null): PaletteSection[];
102
-
103
- export { type PaletteLook, type PaletteSection, buildPaletteSections, categoryLabel, matchesQuery, paletteWithoutPinned, pinnedSection };
9
+ import '../../../CanvasDragLayer-DXeQGrwJ.js';
10
+ import '../../../watch-Unf6SfUf.js';
11
+ import '../../../words-SD4neL0n.js';
12
+ import '../section-template-types.js';
13
+ import './content-tree.js';
14
+ import '../shared-section-types.js';
15
+ import './block-choice.js';
16
+ import '../../../types-SrGNzYeO.js';
17
+ import '../../../types-Cy7rdmXt.js';
18
+ import '../../../wordFit-7XpmhcaW.js';
19
+ import '../../../edit-lock/index.js';
20
+ import '../../../panelWidths-DgQXiPXU.js';
21
+ import '../../../copy-place-CQIemdtU.js';
22
+ import '../../../types-BbOBWXMP.js';
23
+ import '../../../style-clipboard/index.js';
24
+ import '../../../words-CnnHb9jo.js';
25
+ import '../../../types-CoUTWUwB.js';
26
+ import 'efficient-shell/ui';
27
+ import '../../../words-Cl9xMUYY.js';
28
+ import '../../../ScreenDocumentContext-DPW_6gOC.js';
29
+ import '../document-contract.js';
30
+ import '../document-switch.js';
31
+ import '../../../engine-CvXpFE86.js';
32
+ import '../admin-bridge.js';
33
+ import '../session.js';
34
+ import '../backend-error.js';
35
+ import '../host-chrome.js';
36
+ import '../links/link-filters.js';
37
+ import '../document-hooks.js';
38
+ import './add-target-types.js';
39
+ import './slot-section-spec.js';
@@ -1 +1 @@
1
- export{buildPaletteSections,categoryLabel,matchesQuery,paletteWithoutPinned,pinnedSection}from"../../../chunk-VKPOH6MK.js";
1
+ export{buildPaletteSections,categoryLabel,matchesQuery,paletteWithoutPinned,pinnedSection}from"../../../chunk-GDO4QJ4G.js";
@@ -1 +1 @@
1
- export{gotoPreviewSlide,pinPreviewToBottom,pinPreviewToSection,previewFrame,scrollPreviewToSection,scrollPreviewToTop}from"../../../chunk-DDH2DYQP.js";import"../../../chunk-AJ2SUSET.js";import"../../../chunk-LF3FUSCQ.js";import"../../../chunk-MGVI67QV.js";
1
+ export{gotoPreviewSlide,pinPreviewToBottom,pinPreviewToSection,previewFrame,scrollPreviewToSection,scrollPreviewToTop}from"../../../chunk-LUOY3A3Q.js";import"../../../chunk-AJ2SUSET.js";import"../../../chunk-7UFKEX72.js";import"../../../chunk-MGVI67QV.js";
@@ -1 +1 @@
1
- export{cloneNodeWithFreshIds,docToNode,nodeToDoc}from"../../../chunk-OXZDSOZV.js";import"../../../chunk-TCAAOYQY.js";import"../../../chunk-TGZCD6IP.js";import"../../../chunk-KXM6YRG2.js";
1
+ export{cloneNodeWithFreshIds,docToNode,nodeToDoc}from"../../../chunk-OXZDSOZV.js";import"../../../chunk-TCAAOYQY.js";import"../../../chunk-EUFDQ4KL.js";import"../../../chunk-KXM6YRG2.js";
@@ -4,29 +4,28 @@ import { ScreenStyleDocument, ScreenNode, ScreenStylePastePlan, ScreenStyleClipb
4
4
  import { panelFieldsOf } from './panel-fields.js';
5
5
  import '../../../types-BbOBWXMP.js';
6
6
  import 'react';
7
+ import '../../../CanvasDragLayer-DXeQGrwJ.js';
8
+ import '../../../watch-Unf6SfUf.js';
9
+ import '../../../types-Dq180WRV.js';
10
+ import '../../../words-SD4neL0n.js';
11
+ import '../section-template-types.js';
12
+ import './content-tree.js';
13
+ import '../shared-section-types.js';
14
+ import './block-choice.js';
7
15
  import '../../../blocks/index.js';
8
16
  import '../../../types-BljCVdzR.js';
9
17
  import '../../../data/index.js';
10
- import '../../../types-Dq180WRV.js';
11
18
  import '../../../resolve-Bz4mszpL.js';
12
19
  import '../../../plan-D0DgSLnY.js';
13
- import '../../../watch-Unf6SfUf.js';
14
20
  import '../../../types-SrGNzYeO.js';
15
21
  import '../../../types-Cy7rdmXt.js';
16
22
  import '../../../wordFit-7XpmhcaW.js';
17
23
  import '../../../edit-lock/index.js';
18
24
  import '../../../panelWidths-DgQXiPXU.js';
19
- import '../../../CanvasDragLayer-NZpaX6aq.js';
20
- import '../../../session-EsjORLQ0.js';
21
- import '../../../words-SD4neL0n.js';
22
- import '../../../types-DBy3L69b.js';
25
+ import '../../../copy-place-CQIemdtU.js';
26
+ import '../../../types-CoUTWUwB.js';
23
27
  import 'efficient-shell/ui';
24
28
  import '../../../words-Cl9xMUYY.js';
25
- import '../../components/AddSidePanel.js';
26
- import '../section-template-types.js';
27
- import './content-tree.js';
28
- import '../shared-section-types.js';
29
- import './block-choice.js';
30
29
  import '../../../ScreenDocumentContext-DPW_6gOC.js';
31
30
  import '../document-contract.js';
32
31
  import '../document-switch.js';
@@ -1 +1 @@
1
- export{copyNodeStyle,nodeStyleRows,planNodePaste,shopFieldKind,siteStyleScope,styleClipboardOf}from"../../../chunk-DSKNJXB4.js";import"../../../chunk-5XL2RXFU.js";import"../../../chunk-2FYFAAAK.js";import"../../../chunk-22I55W37.js";import"../../../chunk-3QB2ZQXK.js";import"../../../chunk-V7U33NF2.js";import"../../../chunk-IYHO4XQX.js";import"../../../chunk-6WY6ZXJG.js";import"../../../chunk-ANPOR6EY.js";import"../../../chunk-BPXEFVSQ.js";import"../../../chunk-YCSZAP7T.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-BSPCSC45.js";
1
+ export{copyNodeStyle,nodeStyleRows,planNodePaste,shopFieldKind,siteStyleScope,styleClipboardOf}from"../../../chunk-H6BER2EU.js";import"../../../chunk-3QB2ZQXK.js";import"../../../chunk-5XL2RXFU.js";import"../../../chunk-OXOUGEAT.js";import"../../../chunk-22I55W37.js";import"../../../chunk-S6YOIRXQ.js";import"../../../chunk-CWELHADJ.js";import"../../../chunk-6WY6ZXJG.js";import"../../../chunk-ANPOR6EY.js";import"../../../chunk-BPXEFVSQ.js";import"../../../chunk-YCSZAP7T.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-EUFDQ4KL.js";import"../../../chunk-KXM6YRG2.js";import"../../../chunk-BSPCSC45.js";
@@ -1 +1 @@
1
- export{useSectionOps}from"../../../chunk-OITNWE52.js";import"../../../chunk-QORC32JO.js";import"../../../chunk-NCXYC7WI.js";import"../../../chunk-LX23TCTP.js";import"../../../chunk-TCAAOYQY.js";import"../../../chunk-FJTCSQWK.js";import"../../../chunk-TBY3DFKS.js";import"../../../chunk-H4Z2V56N.js";import"../../../chunk-BPXEFVSQ.js";import"../../../chunk-YCSZAP7T.js";import"../../../chunk-WHS6Y55E.js";import"../../../chunk-K56YDHYQ.js";import"../../../chunk-ZEH6QLBH.js";import"../../../chunk-AGWKB77Q.js";import"../../../chunk-FIVU2COQ.js";import"../../../chunk-RPMSET77.js";import"../../../chunk-FM6JO4WF.js";import"../../../chunk-KFV7N2DJ.js";import"../../../chunk-HZSZT3BE.js";import"../../../chunk-KRL3IUV3.js";import"../../../chunk-Y2T3JX7K.js";import"../../../chunk-KFWNGPW3.js";import"../../../chunk-JACEEVVF.js";import"../../../chunk-CZAAGBVL.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-6NJHYXJM.js";import"../../../chunk-P2VEMZH5.js";import"../../../chunk-YU3WHLGI.js";import"../../../chunk-LF3FUSCQ.js";import"../../../chunk-TGZCD6IP.js";import"../../../chunk-KXM6YRG2.js";
1
+ export{useSectionOps}from"../../../chunk-M4THI4OO.js";import"../../../chunk-4OMAA45Q.js";import"../../../chunk-NCXYC7WI.js";import"../../../chunk-LX23TCTP.js";import"../../../chunk-TCAAOYQY.js";import"../../../chunk-53ME3GAI.js";import"../../../chunk-LUG22U5L.js";import"../../../chunk-TBY3DFKS.js";import"../../../chunk-U3LTJSBU.js";import"../../../chunk-BPXEFVSQ.js";import"../../../chunk-YCSZAP7T.js";import"../../../chunk-ZEH6QLBH.js";import"../../../chunk-WHS6Y55E.js";import"../../../chunk-FM6JO4WF.js";import"../../../chunk-K56YDHYQ.js";import"../../../chunk-KFV7N2DJ.js";import"../../../chunk-K53PQAMP.js";import"../../../chunk-FIVU2COQ.js";import"../../../chunk-QTHQPJWA.js";import"../../../chunk-HZSZT3BE.js";import"../../../chunk-PMRN5Z3T.js";import"../../../chunk-Y2T3JX7K.js";import"../../../chunk-KFWNGPW3.js";import"../../../chunk-MIX7EGRG.js";import"../../../chunk-DX3VILZ3.js";import"../../../chunk-JACEEVVF.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-3XECMGXX.js";import"../../../chunk-P2VEMZH5.js";import"../../../chunk-EUFDQ4KL.js";import"../../../chunk-KXM6YRG2.js";import"../../../chunk-TOKMFZPB.js";import"../../../chunk-FR7EEKFF.js";import"../../../chunk-7UFKEX72.js";
@@ -1 +1 @@
1
- export{resetForDocumentSwitch,saveStatusForNewDocument,saveStatusOf}from"../../chunk-HNKB2ZYR.js";import"../../chunk-THWO5YVZ.js";import"../../chunk-RE4LP46F.js";
1
+ export{resetForDocumentSwitch,saveStatusForNewDocument,saveStatusOf}from"../../chunk-6ATIYLUL.js";import"../../chunk-YYD257TD.js";import"../../chunk-RE4LP46F.js";import"../../chunk-EUFDQ4KL.js";import"../../chunk-KXM6YRG2.js";
@@ -1 +1 @@
1
- export{PAGE_CONFLICT_CODE,isExpiredSession,readEaselFailure}from"../../chunk-CLOS6SSX.js";import"../../chunk-KCOBHPN6.js";import"../../chunk-THWO5YVZ.js";import"../../chunk-RE4LP46F.js";
1
+ export{PAGE_CONFLICT_CODE,isExpiredSession,readEaselFailure}from"../../chunk-KO47WAWR.js";import"../../chunk-KCOBHPN6.js";import"../../chunk-YYD257TD.js";import"../../chunk-RE4LP46F.js";import"../../chunk-EUFDQ4KL.js";import"../../chunk-KXM6YRG2.js";
@@ -1 +1 @@
1
- export{routeSharedHostMessage}from"../../chunk-ISS72IKO.js";import"../../chunk-3FIS2FRS.js";import"../../chunk-NCXYC7WI.js";import"../../chunk-LX23TCTP.js";
1
+ export{routeSharedHostMessage}from"../../chunk-QZJKWKGH.js";import"../../chunk-JIP5JNRB.js";import"../../chunk-NCXYC7WI.js";import"../../chunk-LX23TCTP.js";import"../../chunk-EUFDQ4KL.js";import"../../chunk-KXM6YRG2.js";
@@ -1 +1 @@
1
- export{editorRootFocus,isSaveShortcut,useEaselKeyTarget,useEaselSaveKey,useEaselUndoKeys}from"../../chunk-75C6WFNF.js";import"../../chunk-LX23TCTP.js";import"../../chunk-FJTCSQWK.js";import"../../chunk-TBY3DFKS.js";import"../../chunk-AGWKB77Q.js";import"../../chunk-RPMSET77.js";import"../../chunk-HZSZT3BE.js";import"../../chunk-KRL3IUV3.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-YU3WHLGI.js";import"../../chunk-LF3FUSCQ.js";import"../../chunk-TGZCD6IP.js";import"../../chunk-KXM6YRG2.js";
1
+ export{editorRootFocus,isSaveShortcut,useEaselKeyTarget,useEaselSaveKey,useEaselUndoKeys}from"../../chunk-FYV6GZXP.js";import"../../chunk-LX23TCTP.js";import"../../chunk-53ME3GAI.js";import"../../chunk-LUG22U5L.js";import"../../chunk-TBY3DFKS.js";import"../../chunk-K53PQAMP.js";import"../../chunk-QTHQPJWA.js";import"../../chunk-HZSZT3BE.js";import"../../chunk-PMRN5Z3T.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-EUFDQ4KL.js";import"../../chunk-KXM6YRG2.js";import"../../chunk-TOKMFZPB.js";import"../../chunk-FR7EEKFF.js";import"../../chunk-7UFKEX72.js";
@@ -1 +1 @@
1
- export{requestMediaPick,resolveMediaPick}from"../../chunk-3FIS2FRS.js";import"../../chunk-NCXYC7WI.js";import"../../chunk-LX23TCTP.js";
1
+ export{requestMediaPick,resolveMediaPick}from"../../chunk-JIP5JNRB.js";import"../../chunk-NCXYC7WI.js";import"../../chunk-LX23TCTP.js";import"../../chunk-EUFDQ4KL.js";import"../../chunk-KXM6YRG2.js";
@@ -1 +1 @@
1
- export{editLockOf,pageEditLock}from"../../chunk-GMCZXMOV.js";import"../../chunk-CLOS6SSX.js";import"../../chunk-KCOBHPN6.js";import"../../chunk-THWO5YVZ.js";import"../../chunk-RE4LP46F.js";
1
+ export{editLockOf,pageEditLock}from"../../chunk-GR3XRILS.js";import"../../chunk-KO47WAWR.js";import"../../chunk-KCOBHPN6.js";import"../../chunk-YYD257TD.js";import"../../chunk-RE4LP46F.js";import"../../chunk-EUFDQ4KL.js";import"../../chunk-KXM6YRG2.js";
@@ -1,41 +1,40 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode, MouseEvent, ComponentType } from 'react';
3
- import { Data } from '../../blocks/index.js';
3
+ import { M as MeasuredCanvas, C as CanvasDragModel, D as DragSession } from '../../CanvasDragLayer-DXeQGrwJ.js';
4
+ import { SectionTemplate } from './section-template-types.js';
5
+ import { SharedSectionUse, SharedSection } from './shared-section-types.js';
6
+ import { BlockChoice } from './document/block-choice.js';
7
+ import { Data, Config } from '../../blocks/index.js';
4
8
  import { C as CanvasTarget } from '../../watch-Unf6SfUf.js';
5
9
  import { D as DeviceOption } from '../../types-SrGNzYeO.js';
6
10
  import { P as Place } from '../../types-Dq180WRV.js';
7
- import { M as MeasuredCanvas, C as CanvasDragModel } from '../../CanvasDragLayer-NZpaX6aq.js';
11
+ import { R as RepeatCopy } from '../../copy-place-CQIemdtU.js';
8
12
  import { E as EaselContextMenuItem } from '../../types-BbOBWXMP.js';
9
13
  import { E as EaselRailItem } from '../../types-Cy7rdmXt.js';
10
14
  import { StyleRow } from '../../style-clipboard/index.js';
11
- import { T as TreeRowMark } from '../../types-DBy3L69b.js';
12
- import { AddKey } from '../components/AddSidePanel.js';
15
+ import { f as TreeRowMark } from '../../types-CoUTWUwB.js';
13
16
  import { q as AnyScreenTarget } from '../../ScreenDocumentContext-DPW_6gOC.js';
14
17
  import { HostProduct } from './host-chrome.js';
15
18
  import { EaselSession } from './session.js';
16
- import { SharedSectionUse, SharedSection } from './shared-section-types.js';
17
19
  import { AddTarget } from './document/add-target-types.js';
18
20
  import { SlotConfigView, SlotChild } from './document/content-tree.js';
21
+ import '../../words-SD4neL0n.js';
19
22
  import '../../types-BljCVdzR.js';
20
23
  import '../../data/index.js';
21
24
  import '../../resolve-Bz4mszpL.js';
22
25
  import '../../plan-D0DgSLnY.js';
23
26
  import '../../edit-lock/index.js';
24
27
  import '../../panelWidths-DgQXiPXU.js';
25
- import '../../session-EsjORLQ0.js';
26
- import '../../words-SD4neL0n.js';
27
28
  import '../../wordFit-7XpmhcaW.js';
28
29
  import '../../words-CnnHb9jo.js';
29
30
  import 'efficient-shell/ui';
30
31
  import '../../words-Cl9xMUYY.js';
31
- import './section-template-types.js';
32
- import './document/block-choice.js';
33
32
  import './document-contract.js';
34
33
  import './document-switch.js';
35
34
  import '../../engine-CvXpFE86.js';
36
35
  import './admin-bridge.js';
37
- import './links/link-filters.js';
38
36
  import './backend-error.js';
37
+ import './links/link-filters.js';
39
38
  import './document-hooks.js';
40
39
  import './document/slot-section-spec.js';
41
40
 
@@ -552,6 +551,16 @@ interface ScreenBridges {
552
551
  * rows alone, as the menu has always drawn them.
553
552
  */
554
553
  menuRows?: (node: ScreenNode, zone: string, index: number) => ScreenMenuRows | null | undefined;
554
+ /**
555
+ * THE ROW'S OWN ACTIONS ON A DRAWN COPY (card copy typing, 2026-10-30). A
556
+ * card template is drawn once per row of its owner's data, each copy in a
557
+ * `data-sf-repeat` wrapper; the rows are the layer's, never the document's.
558
+ * Given, a right-click on a block in a copy offers, in the node's one menu,
559
+ * Add item after, Move item earlier, Move item later (the way a row cannot
560
+ * go greyed) and Delete item, and a press comes here with the copy's place.
561
+ * Withheld while nothing may be written. Absent: the menu is as before.
562
+ */
563
+ onCopyItem?: (request: CopyItemRequest) => void;
555
564
  /** The layer's own context, stood round the whole screen. What it is handed
556
565
  * is the screen; what it returns is rendered in the screen's place. */
557
566
  wrap?: (screen: ReactNode) => ReactNode;
@@ -581,6 +590,22 @@ interface ScreenSharedSections {
581
590
  * copy, this one included, and the layer takes that in. Optional. */
582
591
  removed?: (section: SharedSection) => void;
583
592
  }
593
+ /** What a press on a drawn copy's item row asks (`ScreenBridges.onCopyItem`). */
594
+ type CopyItemAction = "addAfter" | "moveEarlier" | "moveLater" | "delete";
595
+ /** The copy a row was pressed on, and what to do to its row. */
596
+ interface CopyItemRequest {
597
+ /** The block whose slot is drawn once per row. */
598
+ ownerId: string;
599
+ /** That slot (`template`). */
600
+ slot: string;
601
+ /** The row the copy is drawn for; 0 is the main copy. */
602
+ index: number;
603
+ /** The copy of an outer template this copy's owner is drawn in, when
604
+ * there is one (`RepeatCopy.outer`, `efficient-easel/easel`): the inner
605
+ * index alone names no row. */
606
+ outer?: RepeatCopy;
607
+ action: CopyItemAction;
608
+ }
584
609
  /** A layer's own rows in a node's menu, by the group of the menu each goes at
585
610
  * the end of (efficient-easel/node-ops `nodeMenuItems`' `extras`): `pick`
586
611
  * (Select layer), `make` (Duplicate … Paste), `change` (Rename, Hide …) and
@@ -613,6 +638,11 @@ interface ScreenNewNode {
613
638
  type: string;
614
639
  props: Record<string, unknown>;
615
640
  }
641
+ /** The node a `canAddTo` question is asked of: its id, and the document it is in. */
642
+ interface ScreenNodeAt {
643
+ id: string;
644
+ data: unknown;
645
+ }
616
646
  /**
617
647
  * The rules of particular blocks, asked by the screen and never stated in it:
618
648
  * the screen is handed nodes and is not told which blocks exist. Plain
@@ -660,8 +690,16 @@ interface ScreenBlockRules {
660
690
  * opened at, a drop into a slot. The answer is that slot's (the campaign
661
691
  * designer's Column 2 answers `col2`); a layer that keeps one slot per node
662
692
  * may ignore it, and the screen then offers that slot alone, as before.
693
+ *
694
+ * `at` (24.2.0) is the ONE node asked of, where the screen means one: its
695
+ * id and the document it is in (Add opened in it, its rows in the tree, a
696
+ * drop or an insert into it). Two nodes of one type may take different
697
+ * children — the campaign designer's Box takes any email block, a Box in a
698
+ * Banner only what the Banner's bake can draw. A layer whose nodes of one
699
+ * type all take the same may ignore it. Absent where the question is about
700
+ * a type, not a node (the Add panel's catalogue).
663
701
  */
664
- canAddTo: (nodeType: string, nestDepth?: number, slot?: string) => AddTarget | null;
702
+ canAddTo: (nodeType: string, nestDepth?: number, slot?: string, at?: ScreenNodeAt) => AddTarget | null;
665
703
  /**
666
704
  * THE SLOTS OF A NODE, IN ORDER, AS THE SCREEN DRAWS THEM (0.105.0). A slot
667
705
  * that is a `rung` is a row of its own in the Layers tree, with its children
@@ -862,10 +900,20 @@ interface ScreenBlockLook {
862
900
  size?: number;
863
901
  className?: string;
864
902
  }>;
865
- /** The cover picture of a section type, filling the Add panel's card. */
903
+ /** The cover picture of a section type, filling the Add panel's card — or
904
+ * of a preset row, asked with the preset's key (`presets`). */
866
905
  Thumbnail: ComponentType<{
867
906
  type: string;
868
907
  }>;
908
+ /**
909
+ * ADD ROWS THAT ARE PRESETS, NOT BLOCK TYPES (GG ruling 2026-10-30, owner
910
+ * item C36): each with its own key, label, group, blurb and cover, and an
911
+ * `insert` that builds the node it lays down, in one step. Searched,
912
+ * pressed after a ➕ and dragged like a section's row; it goes in the page's
913
+ * own list only. Absent: every row is a block type, as before
914
+ * (lib/document/palette-sections `PalettePreset`).
915
+ */
916
+ presets?: readonly PalettePreset[];
869
917
  /**
870
918
  * The products a row may be named after when its block holds only a
871
919
  * product's handle: null until they arrive, and for good when there are
@@ -923,6 +971,16 @@ interface ScreenBlockLook {
923
971
  * Absent: the screen's two, as it drew them.
924
972
  */
925
973
  rowActions?: (node: ScreenNode, zone: string, index: number) => ReactNode;
974
+ /**
975
+ * THE WORDS OF A BLOCK'S CANVAS TAB (Stats design B, Lewis 2026-10-29,
976
+ * canvas look Y): where a block's value comes from — "Designs shown" for a
977
+ * number filled from a live count — or null for a block that has no tab.
978
+ * Asked of the selected block and of the block under the pointer. The
979
+ * screen draws the tab the pinned bands wear (the shell's solid badge)
980
+ * above the block's top edge; a click on it selects the block. Absent: no
981
+ * block has a tab.
982
+ */
983
+ canvasTab?: (node: ScreenNode) => string | null;
926
984
  }
927
985
  /**
928
986
  * THE DEVICES the canvas can be looked at on. That the top bar has a switch,
@@ -1599,4 +1657,198 @@ declare function useScreenCanvasTarget(): CanvasTarget | null;
1599
1657
  * engine's plain rows for the selection. */
1600
1658
  declare function useScreenInspectorPanel(): ComponentType<ScreenInspectorPanelProps>;
1601
1659
 
1602
- export { type NodeDefaults, SELECTION_MODE, type ScreenBlockLook, type ScreenBlockRules, type ScreenBridges, type ScreenCanvas, type ScreenCanvasDrag, type ScreenCanvasDragContext, type ScreenCanvasHeadProps, ScreenCanvasTargetProvider, type ScreenDevices, type ScreenDocumentOps, type ScreenDragItem, type ScreenInspector, type ScreenInspectorMode, type ScreenInspectorPanelProps, type ScreenLeftPanel, type ScreenLeftView, type ScreenLeftViewFrame, type ScreenLeftViewRules, type ScreenMainAction, type ScreenMediaDrop, type ScreenMediaFile, type ScreenMenuItem, type ScreenMenuRows, type ScreenNewNode, type ScreenNode, type ScreenNodeActions, type ScreenNodeLevel, type ScreenNodeMaker, type ScreenPartMode, type ScreenParts, ScreenPartsProvider, type ScreenPinnedBand, type ScreenPinnedNodes, type ScreenRailItem, type ScreenSelector, type ScreenSharedSections, type ScreenSlot, type ScreenSlotAction, type ScreenSlotMode, type ScreenStyleClipboard, type ScreenStyleDocument, type ScreenStylePastePlan, type ScreenToastExtra, type ScreenTree, type ScreenTreeFolds, type ScreenTreeRows, isPinnedFirst, isPinnedLast, isSelectionMode, isSlotMode, sameInspectorMode, screenSlotsOf, shownChildSlotsOf, shownSlotFieldsOf, useScreenBlockLook, useScreenBlockRules, useScreenBridges, useScreenCanvasDrag, useScreenCanvasFrame, useScreenCanvasHead, useScreenCanvasTarget, useScreenDevices, useScreenDocumentLabel, useScreenDocumentPass, useScreenInspectorPanel, useScreenLeftView, useScreenNodeKeys, useScreenNotify, useScreenOwnerName, useScreenParts, useScreenPickFollowsSelection, useScreenPinned, useScreenSaveSwitch, useScreenStorageNamespace, useScreenStyleClipboard, useStandaloneScreenBridges };
1660
+ /**
1661
+ * A PALETTE ROW THAT IS A PRESET, NOT A BLOCK TYPE (GG ruling 2026-10-30,
1662
+ * owner item C36). The website's Contact / Locations section is offered as TWO
1663
+ * rows, "City pictures" and "City maps": each lays down its own arrangement of
1664
+ * ordinary blocks, and there is no block type behind either. So a row may be a
1665
+ * preset — its own key, label, group, blurb and cover — and pressing it lays
1666
+ * down what `insert` builds, in ONE insert, so one Undo takes it back (the way
1667
+ * a splittable section's press already lands: `newSectionNode`).
1668
+ *
1669
+ * The layer hands these in (`PaletteLook.presets`); the screen states none.
1670
+ * What the arrangement IS stays where the layer keeps arrangements (the
1671
+ * website: `SECTION_PRESETS`); this says only where the row sits and what it
1672
+ * is called.
1673
+ */
1674
+ interface PalettePreset {
1675
+ /** The row's own key, unique among presets. It names NO block type: a
1676
+ * preset whose key is a registered type is not offered (a type row and a
1677
+ * preset row would be one key with two meanings). The cover is the layer's
1678
+ * `Thumbnail`, asked with this key. */
1679
+ key: string;
1680
+ /** What the row is called. Also what the toast says when it is added. */
1681
+ label: string;
1682
+ /** The key of the category (`config.categories`) it is grouped under. A
1683
+ * category the config does not have, or does not offer, offers no preset. */
1684
+ cat: string;
1685
+ /** The block type in that category the row follows; absent, or not in the
1686
+ * category, and the row closes its group. */
1687
+ after?: string;
1688
+ /** The one-line blurb, shown and searched. */
1689
+ desc?: string;
1690
+ /** More words it is found by, searched but never shown. */
1691
+ alias?: string;
1692
+ /** The node it lays down — one node, slot children inline, every id fresh
1693
+ * from `make.newNodeId` — or null, and nothing is added. Lent the same
1694
+ * four things `newSectionNode` is. */
1695
+ insert: (make: ScreenNodeMaker) => ScreenNewNode | null;
1696
+ }
1697
+ /** One offerable section, with the category it is grouped under. */
1698
+ type PaletteSection = {
1699
+ /** The block type — or, on a preset row, the preset's key (`preset`). */
1700
+ type: string;
1701
+ cat: string;
1702
+ name: string;
1703
+ desc: string;
1704
+ /**
1705
+ * The heading of the category this section sits under, resolved once at build
1706
+ * time — SEARCHED, and already SHOWN as the nav row this card sits beneath.
1707
+ *
1708
+ * ⚠️ IT IS HERE BECAUSE THE NAV AND THE SEARCH DISAGREED. Seven of the
1709
+ * thirteen category names returned NOTHING when typed: "Blog & journal" reads
1710
+ * 5 in the nav, and "blog" found 0, because not one of Issue Header, Featured
1711
+ * Cover, Article Text, Recurring Columns or Latest Posts carries the word. Same
1712
+ * for shop, about, promotions, navigation, legal and layout. A merchant reads
1713
+ * the word off the screen, types it, and is told no section matches.
1714
+ *
1715
+ * Resolved HERE, not in `matchesQuery`, because the label needs the `config`
1716
+ * (`categoryLabel`) and the matcher is given only a section — passing config
1717
+ * into the matcher would make every caller carry it.
1718
+ */
1719
+ catLabel: string;
1720
+ /**
1721
+ * Another word this section is known by, searched but never shown.
1722
+ *
1723
+ * ⚠️ THIS EXISTS FOR ONE NODE AND ONE REASON. `Flex` is offered here as
1724
+ * "Blank section" and is called "Box" everywhere it is nested — so a merchant
1725
+ * who met it in a Layers row, or in last week's handoff, types "box" and must
1726
+ * still find it. Without this they would find NOTHING: the card is pinned out
1727
+ * of its group, so a search that misses it misses it completely.
1728
+ */
1729
+ alias?: string;
1730
+ /** Set on a PRESET row only: the preset it lays down. Absent on every
1731
+ * type row, so a type row is the row it always was. */
1732
+ preset?: PalettePreset;
1733
+ };
1734
+ /**
1735
+ * What the layer says of its sections for the palette: the word for a type at
1736
+ * a level, a group's short heading where it has one, and the blurbs. The
1737
+ * screen's `blockLook` is one (lib/screen-parts); so is the website's own
1738
+ * (lib/document/add-palette).
1739
+ */
1740
+ interface PaletteLook {
1741
+ /** What a node of `type` is called at a level, given the label the config
1742
+ * holds for it. */
1743
+ labelAtLevel: (type: string, level: "section" | "block", base: string) => string;
1744
+ /** A group's short heading, by its key, where the layer has one; undefined,
1745
+ * and the config's own title is the heading. */
1746
+ categoryLabel: (id: string) => string | undefined;
1747
+ /** The one-line blurb for a section, by type. */
1748
+ descriptions: Record<string, string>;
1749
+ /** Rows that are presets, not block types (`PalettePreset`). Absent: every
1750
+ * row is a type, as before. */
1751
+ presets?: readonly PalettePreset[];
1752
+ }
1753
+ /**
1754
+ * Flatten `config.categories` into an ordered section list.
1755
+ *
1756
+ * Grouping and order ARE the category order in the config — which is the
1757
+ * catalog's order — so this adds no opinion of its own. A component listed in a
1758
+ * category but absent from `components` is skipped: a stale catalog row cannot
1759
+ * render and certainly cannot insert, so offering it would be a card that fails
1760
+ * on click.
1761
+ *
1762
+ * Child-only blocks (HeroSlide / CollectionCard / ProductRef) and the four
1763
+ * generic primitives (Heading / Text / ImageBlock / ButtonBlock) sit in NO
1764
+ * category on purpose, so they never appear here — they are added from their
1765
+ * parent's slot instead. See the note above `categories:` in lib/document/config.tsx.
1766
+ *
1767
+ * A category the config marks `visible: false` is NOT offered (0.105.0, seam
1768
+ * E9): it is a registry's way of keeping blocks it has out of the picker — the
1769
+ * campaign designer's Product parts, its retired blocks, its Sections — and a
1770
+ * palette that listed them would offer things that may not be put on a page.
1771
+ * The old library's own palette read the flag the same way. No website category carries
1772
+ * it, so the website's palette is the list it was.
1773
+ */
1774
+ declare function buildPaletteSections(config: Config, look: PaletteLook): PaletteSection[];
1775
+ /** A category's display label — the layer's short one where there is one, else the config's title. */
1776
+ declare function categoryLabel(config: Config, id: string, shortLabel: (id: string) => string | undefined): string;
1777
+ /**
1778
+ * Does a section match a search query?
1779
+ *
1780
+ * The query is matched against the NAME, any ALIAS, the blurb, the component
1781
+ * TYPE and the CATEGORY HEADING — the type because a merchant who knows the
1782
+ * section by the word they saw in a handoff should still find it, the alias
1783
+ * because one node is called something else everywhere it is nested (see
1784
+ * `PaletteSection.alias`), and the category because it is PRINTED IN THE NAV
1785
+ * BESIDE THE RESULTS: seven of thirteen headings used to match nothing at all
1786
+ * (see `PaletteSection.catLabel`). A word a merchant can read off this screen
1787
+ * must find what it is labelling.
1788
+ *
1789
+ * `q` is expected already lower-cased and trimmed; an empty query matches
1790
+ * everything.
1791
+ */
1792
+ declare function matchesQuery(s: PaletteSection, q: string): boolean;
1793
+ /** The pinned section, or `null` if the layer pins none or the config does not offer it. */
1794
+ declare function pinnedSection(sections: PaletteSection[], pinned: string | null): PaletteSection | null;
1795
+ /** Every OTHER section — what the grouped grid below the pinned card draws. */
1796
+ declare function paletteWithoutPinned(sections: PaletteSection[], pinned: string | null): PaletteSection[];
1797
+
1798
+ /** What a tile adds, parsed back out of its key. */
1799
+ type AddKey = {
1800
+ kind: "section";
1801
+ type: string;
1802
+ } | {
1803
+ kind: "template";
1804
+ template: SectionTemplate;
1805
+ } | {
1806
+ kind: "shared";
1807
+ section: SharedSection;
1808
+ }
1809
+ /** A row that is a preset, not a block type (the layer's `presets`): what
1810
+ * it lays down is its `insert`'s. */
1811
+ | {
1812
+ kind: "preset";
1813
+ preset: PalettePreset;
1814
+ } | {
1815
+ kind: "block";
1816
+ type: string;
1817
+ };
1818
+ declare const sectionKey: (type: string) => string;
1819
+ declare const blockKey: (type: string) => string;
1820
+ declare const templateKey: (id: string) => string;
1821
+ declare const sharedKey: (id: string) => string;
1822
+ declare const presetKey: (key: string) => string;
1823
+ type AddSidePanelProps<I> = {
1824
+ /** Where the next thing goes, when the panel was opened at a place. */
1825
+ at?: {
1826
+ label: string;
1827
+ onClear: () => void;
1828
+ };
1829
+ /** At a place in a list of blocks: the blocks that list takes. They are in
1830
+ * the one list whatever the catalogue holds, so a place can always be
1831
+ * filled from it. */
1832
+ placeBlocks?: readonly BlockChoice[];
1833
+ /** At a place: may what a tile names go there? Null when it may, else why
1834
+ * not, in the panel's words — the tile is then dimmed and says so. Absent
1835
+ * (no place): every tile is offered, to drag. */
1836
+ canTake?: (key: AddKey) => string | null;
1837
+ /** At a place: put what a pressed tile names there. Absent (no place): a
1838
+ * press adds nothing, and a tile is only dragged. */
1839
+ onPick?: (key: AddKey) => void;
1840
+ /** The drag item for what a tile names — a drag in the editor's session. */
1841
+ itemFor: (key: AddKey) => I;
1842
+ session: DragSession<I>;
1843
+ /** A row under the tiles for something that is not a block, drawn by the
1844
+ * layer that owns it (the website: the Live chat bubble). */
1845
+ siteWide?: ReactNode;
1846
+ /** Leave Add — back to the view underneath (the head's "Done"). */
1847
+ onClose: () => void;
1848
+ /** Hide the left panel (the head's last button, as on every panel). */
1849
+ onHide?: () => void;
1850
+ readOnly?: boolean;
1851
+ };
1852
+ declare function AddSidePanel<I>({ at, placeBlocks, canTake, onPick, itemFor, session, siteWide, onClose, onHide, readOnly, }: AddSidePanelProps<I>): react.JSX.Element;
1853
+
1854
+ export { type AddKey as A, type CopyItemAction, type CopyItemRequest, type NodeDefaults, type PaletteLook as P, SELECTION_MODE, type ScreenBlockLook, type ScreenBlockRules, type ScreenBridges, type ScreenCanvas, type ScreenCanvasDrag, type ScreenCanvasDragContext, type ScreenCanvasHeadProps, ScreenCanvasTargetProvider, type ScreenDevices, type ScreenDocumentOps, type ScreenDragItem, type ScreenInspector, type ScreenInspectorMode, type ScreenInspectorPanelProps, type ScreenLeftPanel, type ScreenLeftView, type ScreenLeftViewFrame, type ScreenLeftViewRules, type ScreenMainAction, type ScreenMediaDrop, type ScreenMediaFile, type ScreenMenuItem, type ScreenMenuRows, type ScreenNewNode, type ScreenNode, type ScreenNodeActions, type ScreenNodeAt, type ScreenNodeLevel, type ScreenNodeMaker, type ScreenPartMode, type ScreenParts, ScreenPartsProvider, type ScreenPinnedBand, type ScreenPinnedNodes, type ScreenRailItem, type ScreenSelector, type ScreenSharedSections, type ScreenSlot, type ScreenSlotAction, type ScreenSlotMode, type ScreenStyleClipboard, type ScreenStyleDocument, type ScreenStylePastePlan, type ScreenToastExtra, type ScreenTree, type ScreenTreeFolds, type ScreenTreeRows, type PalettePreset as a, type PaletteSection as b, buildPaletteSections as c, categoryLabel as d, pinnedSection as e, type AddSidePanelProps as f, blockKey as g, AddSidePanel as h, presetKey as i, isPinnedFirst, isPinnedLast, isSelectionMode, isSlotMode, sharedKey as j, matchesQuery as m, paletteWithoutPinned as p, sectionKey as s, sameInspectorMode, screenSlotsOf, shownChildSlotsOf, shownSlotFieldsOf, templateKey as t, 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,isSelectionMode,isSlotMode,sameInspectorMode,screenSlotsOf,shownChildSlotsOf,shownSlotFieldsOf,useScreenBlockLook,useScreenBlockRules,useScreenBridges,useScreenCanvasDrag,useScreenCanvasFrame,useScreenCanvasHead,useScreenCanvasTarget,useScreenDevices,useScreenDocumentLabel,useScreenDocumentPass,useScreenInspectorPanel,useScreenLeftView,useScreenNodeKeys,useScreenNotify,useScreenOwnerName,useScreenParts,useScreenPickFollowsSelection,useScreenPinned,useScreenSaveSwitch,useScreenStorageNamespace,useScreenStyleClipboard,useStandaloneScreenBridges}from"../../chunk-QORC32JO.js";import"../../chunk-NCXYC7WI.js";import"../../chunk-LX23TCTP.js";import"../../chunk-TCAAOYQY.js";import"../../chunk-FJTCSQWK.js";import"../../chunk-TBY3DFKS.js";import"../../chunk-H4Z2V56N.js";import"../../chunk-BPXEFVSQ.js";import"../../chunk-YCSZAP7T.js";import"../../chunk-WHS6Y55E.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-ZEH6QLBH.js";import"../../chunk-AGWKB77Q.js";import"../../chunk-FIVU2COQ.js";import"../../chunk-RPMSET77.js";import"../../chunk-FM6JO4WF.js";import"../../chunk-KFV7N2DJ.js";import"../../chunk-HZSZT3BE.js";import"../../chunk-KRL3IUV3.js";import"../../chunk-Y2T3JX7K.js";import"../../chunk-KFWNGPW3.js";import"../../chunk-JACEEVVF.js";import"../../chunk-CZAAGBVL.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-6NJHYXJM.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-YU3WHLGI.js";import"../../chunk-LF3FUSCQ.js";import"../../chunk-TGZCD6IP.js";import"../../chunk-KXM6YRG2.js";
1
+ export{SELECTION_MODE,ScreenCanvasTargetProvider,ScreenPartsProvider,isPinnedFirst,isPinnedLast,isSelectionMode,isSlotMode,sameInspectorMode,screenSlotsOf,shownChildSlotsOf,shownSlotFieldsOf,useScreenBlockLook,useScreenBlockRules,useScreenBridges,useScreenCanvasDrag,useScreenCanvasFrame,useScreenCanvasHead,useScreenCanvasTarget,useScreenDevices,useScreenDocumentLabel,useScreenDocumentPass,useScreenInspectorPanel,useScreenLeftView,useScreenNodeKeys,useScreenNotify,useScreenOwnerName,useScreenParts,useScreenPickFollowsSelection,useScreenPinned,useScreenSaveSwitch,useScreenStorageNamespace,useScreenStyleClipboard,useStandaloneScreenBridges}from"../../chunk-4OMAA45Q.js";import"../../chunk-NCXYC7WI.js";import"../../chunk-LX23TCTP.js";import"../../chunk-TCAAOYQY.js";import"../../chunk-53ME3GAI.js";import"../../chunk-LUG22U5L.js";import"../../chunk-TBY3DFKS.js";import"../../chunk-U3LTJSBU.js";import"../../chunk-BPXEFVSQ.js";import"../../chunk-YCSZAP7T.js";import"../../chunk-ZEH6QLBH.js";import"../../chunk-WHS6Y55E.js";import"../../chunk-FM6JO4WF.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-KFV7N2DJ.js";import"../../chunk-K53PQAMP.js";import"../../chunk-FIVU2COQ.js";import"../../chunk-QTHQPJWA.js";import"../../chunk-HZSZT3BE.js";import"../../chunk-PMRN5Z3T.js";import"../../chunk-Y2T3JX7K.js";import"../../chunk-KFWNGPW3.js";import"../../chunk-MIX7EGRG.js";import"../../chunk-DX3VILZ3.js";import"../../chunk-JACEEVVF.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-3XECMGXX.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-EUFDQ4KL.js";import"../../chunk-KXM6YRG2.js";import"../../chunk-TOKMFZPB.js";import"../../chunk-FR7EEKFF.js";import"../../chunk-7UFKEX72.js";
@@ -831,6 +831,12 @@
831
831
  pointer-events: auto;
832
832
  cursor: pointer;
833
833
  }
834
+ /* A block's own tab (`blockLook.canvasTab`, Stats design B, Lewis
835
+ 2026-10-29): it rides above the block's top edge, lifted by its own
836
+ height, so it never covers the number it names. */
837
+ .es-band-tab.is-above {
838
+ transform: translateY(-100%);
839
+ }
834
840
  /* A SHARED node's tab (Shared section design v4, Lewis 2026-10-21): the
835
841
  shell's `shared` mark before the name, inside the badge's line. */
836
842
  .es-band-tab-mark {