efficient-easel 16.0.0 → 17.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 (127) hide show
  1. package/README.md +23 -64
  2. package/dist/autosave/index.d.ts +4 -4
  3. package/dist/blocks/index.d.ts +2 -2
  4. package/dist/chrome/index.d.ts +3 -3
  5. package/dist/chrome/index.js +1 -1
  6. package/dist/{chunk-UVQR7W6I.js → chunk-3ERZNZ5S.js} +1 -1
  7. package/dist/{chunk-3Z2MVLCD.js → chunk-4ES5JGGX.js} +1 -1
  8. package/dist/{chunk-2H3W5OLQ.js → chunk-4UBYPRAS.js} +1 -1
  9. package/dist/chunk-7TOQCTHV.js +4 -0
  10. package/dist/chunk-BU2YSTLJ.js +14 -0
  11. package/dist/{chunk-VVPZMWJE.js → chunk-EL4F3IN7.js} +1 -1
  12. package/dist/chunk-EXCIHRAE.js +4 -0
  13. package/dist/{chunk-NBDMTIU2.js → chunk-FJL3MYPA.js} +2 -2
  14. package/dist/{chunk-IE55HNMA.js → chunk-GWIVPLOX.js} +11 -11
  15. package/dist/chunk-INIPQLPR.js +1 -0
  16. package/dist/{chunk-HM7S7H5H.js → chunk-JSH3XKEF.js} +1 -1
  17. package/dist/chunk-M2Z775ZC.js +1 -0
  18. package/dist/chunk-MI54XTWD.js +5 -0
  19. package/dist/chunk-MTNBJPXX.js +2 -0
  20. package/dist/{chunk-N2BVA6TS.js → chunk-NFLO4I2N.js} +1 -1
  21. package/dist/{chunk-P3XVBLZ6.js → chunk-OLRLHE5K.js} +4 -4
  22. package/dist/chunk-SHS6WCLL.js +1 -0
  23. package/dist/{chunk-PQRYAW2G.js → chunk-SPQOPWCL.js} +3 -3
  24. package/dist/{chunk-TZIIRGVY.js → chunk-U277UX5I.js} +1 -1
  25. package/dist/{chunk-63ZDVAVE.js → chunk-V63ERBLW.js} +1 -1
  26. package/dist/chunk-WR3EVON3.js +57 -0
  27. package/dist/{chunk-62VPYC7F.js → chunk-XDZHKYQX.js} +1 -1
  28. package/dist/chunk-XLUVTPKK.js +1 -0
  29. package/dist/{chunk-KFPCMMRK.js → chunk-Z72CYM3L.js} +1 -1
  30. package/dist/copy/index.js +23 -11
  31. package/dist/draw/client.js +1 -1
  32. package/dist/draw/index.js +1 -1
  33. package/dist/easel/index.d.ts +35 -6
  34. package/dist/easel/index.js +1 -1
  35. package/dist/fields/index.js +1 -1
  36. package/dist/gold/gold.css +1 -1
  37. package/dist/{host-DGmdCaNL.d.ts → host-Cxbhp0zg.d.ts} +0 -4
  38. package/dist/icons/index.d.ts +0 -2
  39. package/dist/node-ops/index.d.ts +2 -2
  40. package/dist/node-ops/index.js +1 -1
  41. package/dist/{plan-CGREINRO.d.ts → plan-2BLk7pWs.d.ts} +19 -1
  42. package/dist/rail/index.d.ts +2 -2
  43. package/dist/screen/components/AddBlockRow.js +1 -1
  44. package/dist/screen/components/AddSidePanel.js +1 -1
  45. package/dist/screen/components/MediaSidePanel.d.ts +3 -3
  46. package/dist/screen/components/MediaSidePanel.js +1 -1
  47. package/dist/screen/components/NodeContextMenu.d.ts +6 -6
  48. package/dist/screen/components/NodeContextMenu.js +1 -1
  49. package/dist/screen/components/PageEditGuardNotices.js +1 -1
  50. package/dist/screen/components/SaveControls.d.ts +7 -5
  51. package/dist/screen/components/SaveControls.js +1 -1
  52. package/dist/screen/components/ScreenChrome.js +1 -1
  53. package/dist/screen/components/ScreenDocumentContext.d.ts +3 -3
  54. package/dist/screen/components/ScreenDocumentContext.js +1 -1
  55. package/dist/screen/components/ScreenMount.d.ts +5 -5
  56. package/dist/screen/components/ScreenMount.js +1 -1
  57. package/dist/screen/components/ScreenStoreProvider.d.ts +5 -5
  58. package/dist/screen/components/ScreenStoreProvider.js +1 -1
  59. package/dist/screen/components/SectionScreenShell.js +15 -15
  60. package/dist/screen/components/SidePanelHead.js +1 -1
  61. package/dist/screen/components/panel-widths.js +1 -1
  62. package/dist/screen/components/usePartBridge.d.ts +5 -5
  63. package/dist/screen/components/usePartBridge.js +1 -1
  64. package/dist/screen/index.d.ts +6 -6
  65. package/dist/screen/index.js +1 -1
  66. package/dist/screen/lib/admin-bridge.d.ts +2 -2
  67. package/dist/screen/lib/document-addressing.d.ts +3 -3
  68. package/dist/screen/lib/document-hooks.d.ts +2 -2
  69. package/dist/screen/lib/host-chrome.d.ts +0 -10
  70. package/dist/screen/lib/host.d.ts +3 -3
  71. package/dist/screen/lib/key-scope.js +1 -1
  72. package/dist/screen/lib/media-panel.d.ts +3 -3
  73. package/dist/screen/lib/media-picker.d.ts +3 -3
  74. package/dist/screen/lib/page-lock.d.ts +2 -2
  75. package/dist/screen/lib/puck/block-choice.d.ts +13 -1
  76. package/dist/screen/lib/puck/block-choice.js +1 -1
  77. package/dist/screen/lib/puck/device-fields.js +1 -1
  78. package/dist/screen/lib/puck/palette-sections.d.ts +2 -2
  79. package/dist/screen/lib/puck/preview-dom.js +1 -1
  80. package/dist/screen/lib/puck/section-doc.d.ts +2 -2
  81. package/dist/screen/lib/puck/style-clipboard.d.ts +5 -5
  82. package/dist/screen/lib/puck/style-clipboard.js +1 -1
  83. package/dist/screen/lib/puck/use-section-ops.d.ts +2 -2
  84. package/dist/screen/lib/puck/use-section-ops.js +1 -1
  85. package/dist/screen/lib/save-status.d.ts +2 -2
  86. package/dist/screen/lib/screen-parts.d.ts +26 -28
  87. package/dist/screen/lib/screen-parts.js +1 -1
  88. package/dist/screen/lib/section-templates.d.ts +2 -2
  89. package/dist/screen/lib/session-context.d.ts +2 -2
  90. package/dist/screen/lib/session.d.ts +2 -2
  91. package/dist/screen/words.d.ts +0 -2
  92. package/dist/screen/words.js +1 -1
  93. package/dist/shell/shell.css +6 -1
  94. package/dist/strings/index.d.ts +134 -20
  95. package/dist/strings/index.js +2 -2
  96. package/dist/text-styles/index.js +20 -20
  97. package/dist/{types-CsgMwHHa.d.ts → types-Cy7rdmXt.d.ts} +1 -1
  98. package/dist/{types-DGyDHiJV.d.ts → types-DT8ywrFQ.d.ts} +1 -1
  99. package/dist/{types-NQozKWEz.d.ts → types-kR_4wYBw.d.ts} +1 -1
  100. package/dist/{useNodeOps-BHRkUFfG.d.ts → useNodeOps-B0XZ8Bl8.d.ts} +1 -1
  101. package/dist/{words-pgIK0I6g.d.ts → words-DkWcK1rh.d.ts} +2 -2
  102. package/package.json +2 -41
  103. package/dist/chunk-ECM5F6JJ.js +0 -1
  104. package/dist/chunk-GGC72GS4.js +0 -1
  105. package/dist/chunk-H4UMY7QF.js +0 -13
  106. package/dist/chunk-HMXIAMCU.js +0 -1
  107. package/dist/chunk-HQ4VVRIC.js +0 -1
  108. package/dist/chunk-JD5HXBEX.js +0 -1
  109. package/dist/chunk-N2B32EZB.js +0 -5
  110. package/dist/chunk-OK7OH2ZN.js +0 -4
  111. package/dist/chunk-RQBIFINA.js +0 -57
  112. package/dist/chunk-RSKHAHPJ.js +0 -4
  113. package/dist/chunk-SMM3ST7A.js +0 -13
  114. package/dist/chunk-XT6DOSHO.js +0 -1
  115. package/dist/chunk-ZZ64CEC2.js +0 -2
  116. package/dist/gold/index.d.ts +0 -283
  117. package/dist/gold/index.js +0 -1
  118. package/dist/icons/meanings.d.ts +0 -1
  119. package/dist/icons/meanings.js +0 -1
  120. package/dist/index.d.ts +0 -6
  121. package/dist/index.js +0 -1
  122. package/dist/markup/index.d.ts +0 -1
  123. package/dist/markup/index.js +0 -1
  124. package/dist/shell/index.d.ts +0 -195
  125. package/dist/shell/index.js +0 -1
  126. package/dist/strings/catalogue.d.ts +0 -139
  127. package/dist/strings/catalogue.js +0 -1
@@ -1,13 +1,13 @@
1
- export { A as AnyDocumentAddressing, a as DocumentAddressing, N as NO_DOCUMENT_ADDRESSING } from '../../host-DGmdCaNL.js';
1
+ export { A as AnyDocumentAddressing, a as DocumentAddressing, N as NO_DOCUMENT_ADDRESSING } from '../../host-Cxbhp0zg.js';
2
2
  import './document-contract.js';
3
3
  import './session.js';
4
4
  import 'react';
5
5
  import '../../blocks/index.js';
6
- import '../../types-NQozKWEz.js';
6
+ import '../../types-kR_4wYBw.js';
7
7
  import '../../data/index.js';
8
8
  import '../../types-41704JE4.js';
9
9
  import '../../resolve-D68pb3Bx.js';
10
- import '../../plan-CGREINRO.js';
10
+ import '../../plan-2BLk7pWs.js';
11
11
  import './document-switch.js';
12
12
  import '../../engine-CvXpFE86.js';
13
13
  import '../../edit-lock/index.js';
@@ -1,11 +1,11 @@
1
1
  import { Data } from '../../blocks/index.js';
2
2
  import { EaselCapabilities } from './document-contract.js';
3
3
  import 'react';
4
- import '../../types-NQozKWEz.js';
4
+ import '../../types-kR_4wYBw.js';
5
5
  import '../../data/index.js';
6
6
  import '../../types-41704JE4.js';
7
7
  import '../../resolve-D68pb3Bx.js';
8
- import '../../plan-CGREINRO.js';
8
+ import '../../plan-2BLk7pWs.js';
9
9
 
10
10
  /**
11
11
  * WHAT A HOST DOES TO A DOCUMENT AS IT OPENS AND AS IT IS STORED.
@@ -109,19 +109,9 @@ interface EaselChrome {
109
109
  * header the settings of the host's pinned header, opened by selecting
110
110
  * the header in the canvas or its row in the tree. Without it the
111
111
  * inspector has no such panel.
112
- *
113
- * …and one the host adds to a panel of the editor's:
114
- *
115
- * chromePage drawn under the page settings of the page that STORES the
116
- * site's chrome (its footer page), on a document with a website
117
- * behind it. The storefront's is "Switch to Box header", which
118
- * builds the header group there from the shop's header row. It
119
- * takes no props: it reads the open document like any other part
120
- * of the editor (`useScreenDocument`, `useEasel`).
121
112
  */
122
113
  panels?: {
123
114
  header?: ComponentType<HostPanelProps>;
124
- chromePage?: ComponentType;
125
115
  };
126
116
  /**
127
117
  * A group of the host's own rows in the Pages panel, under the host's own
@@ -1,11 +1,11 @@
1
1
  import 'react';
2
- export { D as DETACHED_EASEL_HOST, E as EaselHost, b as EaselHostAddress, c as EaselHostContext, d as EaselHostProvider, e as EaselMessageType, f as EaselToHostMessage, H as HostPickedMedia, g as HostToEaselMessage, I as InboundHostMessage, S as SectionScreenTarget, h as SendToHost, i as createEaselHost, u as useEaselHost, j as useHostEscape } from '../../host-DGmdCaNL.js';
2
+ export { D as DETACHED_EASEL_HOST, E as EaselHost, b as EaselHostAddress, c as EaselHostContext, d as EaselHostProvider, e as EaselMessageType, f as EaselToHostMessage, H as HostPickedMedia, g as HostToEaselMessage, I as InboundHostMessage, S as SectionScreenTarget, h as SendToHost, i as createEaselHost, u as useEaselHost, j as useHostEscape } from '../../host-Cxbhp0zg.js';
3
3
  import '../../blocks/index.js';
4
- import '../../types-NQozKWEz.js';
4
+ import '../../types-kR_4wYBw.js';
5
5
  import '../../data/index.js';
6
6
  import '../../types-41704JE4.js';
7
7
  import '../../resolve-D68pb3Bx.js';
8
- import '../../plan-CGREINRO.js';
8
+ import '../../plan-2BLk7pWs.js';
9
9
  import './document-contract.js';
10
10
  import './session.js';
11
11
  import './backend-error.js';
@@ -1 +1 @@
1
- export{editorRootFocus,isSaveShortcut,useEaselKeyTarget,useEaselSaveKey,useEaselUndoKeys}from"../../chunk-HM7S7H5H.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-SMM3ST7A.js";import"../../chunk-TBY3DFKS.js";import"../../chunk-ECM5F6JJ.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-23VM4PMV.js";import"../../chunk-B4JN227A.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-X4T6JT3M.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
1
+ export{editorRootFocus,isSaveShortcut,useEaselKeyTarget,useEaselSaveKey,useEaselUndoKeys}from"../../chunk-JSH3XKEF.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-BU2YSTLJ.js";import"../../chunk-TBY3DFKS.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-SHS6WCLL.js";import"../../chunk-23VM4PMV.js";import"../../chunk-B4JN227A.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-X4T6JT3M.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
@@ -1,12 +1,12 @@
1
1
  import * as react from 'react';
2
2
  import { ComponentType, ReactNode } from 'react';
3
- import { H as HostPickedMedia, E as EaselHost } from '../../host-DGmdCaNL.js';
3
+ import { H as HostPickedMedia, E as EaselHost } from '../../host-Cxbhp0zg.js';
4
4
  import '../../blocks/index.js';
5
- import '../../types-NQozKWEz.js';
5
+ import '../../types-kR_4wYBw.js';
6
6
  import '../../data/index.js';
7
7
  import '../../types-41704JE4.js';
8
8
  import '../../resolve-D68pb3Bx.js';
9
- import '../../plan-CGREINRO.js';
9
+ import '../../plan-2BLk7pWs.js';
10
10
  import './document-contract.js';
11
11
  import './session.js';
12
12
  import './backend-error.js';
@@ -1,11 +1,11 @@
1
- import { E as EaselHost } from '../../host-DGmdCaNL.js';
1
+ import { E as EaselHost } from '../../host-Cxbhp0zg.js';
2
2
  import 'react';
3
3
  import '../../blocks/index.js';
4
- import '../../types-NQozKWEz.js';
4
+ import '../../types-kR_4wYBw.js';
5
5
  import '../../data/index.js';
6
6
  import '../../types-41704JE4.js';
7
7
  import '../../resolve-D68pb3Bx.js';
8
- import '../../plan-CGREINRO.js';
8
+ import '../../plan-2BLk7pWs.js';
9
9
  import './document-contract.js';
10
10
  import './session.js';
11
11
  import './backend-error.js';
@@ -2,11 +2,11 @@ import { EditLock } from '../../edit-lock/index.js';
2
2
  import { EaselSession } from './session.js';
3
3
  import '../../blocks/index.js';
4
4
  import 'react';
5
- import '../../types-NQozKWEz.js';
5
+ import '../../types-kR_4wYBw.js';
6
6
  import '../../data/index.js';
7
7
  import '../../types-41704JE4.js';
8
8
  import '../../resolve-D68pb3Bx.js';
9
- import '../../plan-CGREINRO.js';
9
+ import '../../plan-2BLk7pWs.js';
10
10
  import './backend-error.js';
11
11
  import './host-chrome.js';
12
12
  import './links/link-filters.js';
@@ -15,7 +15,19 @@ type BlockChoice = {
15
15
  type: string;
16
16
  label: string;
17
17
  group?: string;
18
+ /**
19
+ * RETIRED: Add does not offer it, and a node of it already in a slot still
20
+ * belongs there (card [MERGE] One Text Block And Click Through Parts). The
21
+ * website's Heading and Eyebrow blocks: the Text block took their job, so
22
+ * nobody starts a new one, and every stored one still draws, edits, moves
23
+ * and pastes. Read through {@link offeredChoices} wherever a list is shown
24
+ * to ADD from; the whole list is still the slot's answer to "does this slot
25
+ * take it?", so a move or a paste reads it unfiltered.
26
+ */
27
+ retired?: boolean;
18
28
  };
29
+ /** The choices Add offers: every one that is not {@link BlockChoice.retired}, in order. */
30
+ declare function offeredChoices<C extends BlockChoice>(choices: readonly C[]): C[];
19
31
  /**
20
32
  * One run of consecutive choices sharing a `group` — what a menu draws under one
21
33
  * heading.
@@ -49,4 +61,4 @@ type BlockChoiceRun = {
49
61
  };
50
62
  declare function blockRuns(choices: BlockChoice[]): BlockChoiceRun[];
51
63
 
52
- export { type BlockChoice, type BlockChoiceRun, blockRuns };
64
+ export { type BlockChoice, type BlockChoiceRun, blockRuns, offeredChoices };
@@ -1 +1 @@
1
- export{blockRuns}from"../../../chunk-HQ4VVRIC.js";
1
+ export{blockRuns,offeredChoices}from"../../../chunk-M2Z775ZC.js";
@@ -1 +1 @@
1
- export{DEVICE_FIELD_MARKER,DEVICE_HIDDEN_ATTR,DEVICE_NOTE,deviceField,deviceMetaOf,deviceNote,shownTier,withoutDeviceGate}from"../../../chunk-NBDMTIU2.js";import"../../../chunk-7F52SZOI.js";import"../../../chunk-VVPZMWJE.js";import"../../../chunk-BSPCSC45.js";import"../../../chunk-MFIRYGHW.js";
1
+ export{DEVICE_FIELD_MARKER,DEVICE_HIDDEN_ATTR,DEVICE_NOTE,deviceField,deviceMetaOf,deviceNote,shownTier,withoutDeviceGate}from"../../../chunk-FJL3MYPA.js";import"../../../chunk-7F52SZOI.js";import"../../../chunk-EL4F3IN7.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-BSPCSC45.js";
@@ -1,10 +1,10 @@
1
1
  import { Config } from '../../../blocks/index.js';
2
2
  import 'react';
3
- import '../../../types-NQozKWEz.js';
3
+ import '../../../types-kR_4wYBw.js';
4
4
  import '../../../data/index.js';
5
5
  import '../../../types-41704JE4.js';
6
6
  import '../../../resolve-D68pb3Bx.js';
7
- import '../../../plan-CGREINRO.js';
7
+ import '../../../plan-2BLk7pWs.js';
8
8
 
9
9
  /** One offerable section, with the category it is grouped under. */
10
10
  type PaletteSection = {
@@ -1 +1 @@
1
- export{gotoPreviewSlide,pinPreviewToBottom,pinPreviewToSection,previewFrame,scrollPreviewToSection,scrollPreviewToTop}from"../../../chunk-3Z2MVLCD.js";import"../../../chunk-R5L2E7JX.js";import"../../../chunk-IQ5TA7AM.js";
1
+ export{gotoPreviewSlide,pinPreviewToBottom,pinPreviewToSection,previewFrame,scrollPreviewToSection,scrollPreviewToTop}from"../../../chunk-4ES5JGGX.js";import"../../../chunk-IQ5TA7AM.js";import"../../../chunk-R5L2E7JX.js";
@@ -1,11 +1,11 @@
1
1
  import { Data } from '../../../blocks/index.js';
2
2
  import { TreeItem } from './content-tree.js';
3
3
  import 'react';
4
- import '../../../types-NQozKWEz.js';
4
+ import '../../../types-kR_4wYBw.js';
5
5
  import '../../../data/index.js';
6
6
  import '../../../types-41704JE4.js';
7
7
  import '../../../resolve-D68pb3Bx.js';
8
- import '../../../plan-CGREINRO.js';
8
+ import '../../../plan-2BLk7pWs.js';
9
9
 
10
10
  declare function nodeToDoc(node: TreeItem): Data;
11
11
  declare function docToNode(data: Data): TreeItem | null;
@@ -5,14 +5,14 @@ import { panelFieldsOf } from './panel-fields.js';
5
5
  import '../../../types-BsyPh6EW.js';
6
6
  import 'react';
7
7
  import '../../../blocks/index.js';
8
- import '../../../types-NQozKWEz.js';
8
+ import '../../../types-kR_4wYBw.js';
9
9
  import '../../../data/index.js';
10
10
  import '../../../types-41704JE4.js';
11
11
  import '../../../resolve-D68pb3Bx.js';
12
- import '../../../plan-CGREINRO.js';
12
+ import '../../../plan-2BLk7pWs.js';
13
13
  import '../../../watch-BTYOJpQU.js';
14
- import '../../../types-DGyDHiJV.js';
15
- import '../../../types-CsgMwHHa.js';
14
+ import '../../../types-DT8ywrFQ.js';
15
+ import '../../../types-Cy7rdmXt.js';
16
16
  import '../../../wordFit-7XpmhcaW.js';
17
17
  import '../../../edit-lock/index.js';
18
18
  import '../../../panelWidths-D9hTLR25.js';
@@ -26,7 +26,7 @@ import '../../components/AddSidePanel.js';
26
26
  import '../section-template-types.js';
27
27
  import './content-tree.js';
28
28
  import './block-choice.js';
29
- import '../../../host-DGmdCaNL.js';
29
+ import '../../../host-Cxbhp0zg.js';
30
30
  import '../document-contract.js';
31
31
  import '../session.js';
32
32
  import '../backend-error.js';
@@ -1 +1 @@
1
- export{copyNodeStyle,nodeStyleRows,planNodePaste,shopFieldKind,siteStyleScope,styleClipboardOf}from"../../../chunk-XT6DOSHO.js";import"../../../chunk-NBDMTIU2.js";import"../../../chunk-MQNBD6AB.js";import"../../../chunk-LER7RKTO.js";import"../../../chunk-7F52SZOI.js";import"../../../chunk-VVPZMWJE.js";import"../../../chunk-V7U33NF2.js";import"../../../chunk-6WY6ZXJG.js";import"../../../chunk-BSPCSC45.js";import"../../../chunk-DUVRZ456.js";import"../../../chunk-BPXEFVSQ.js";import"../../../chunk-MFIRYGHW.js";
1
+ export{copyNodeStyle,nodeStyleRows,planNodePaste,shopFieldKind,siteStyleScope,styleClipboardOf}from"../../../chunk-XLUVTPKK.js";import"../../../chunk-LER7RKTO.js";import"../../../chunk-FJL3MYPA.js";import"../../../chunk-7F52SZOI.js";import"../../../chunk-MQNBD6AB.js";import"../../../chunk-EL4F3IN7.js";import"../../../chunk-V7U33NF2.js";import"../../../chunk-6WY6ZXJG.js";import"../../../chunk-DUVRZ456.js";import"../../../chunk-BPXEFVSQ.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-BSPCSC45.js";
@@ -1,9 +1,9 @@
1
- import { N as NodeSelection } from '../../../plan-CGREINRO.js';
1
+ import { N as NodeSelection } from '../../../plan-2BLk7pWs.js';
2
2
  import { Data } from '../../../blocks/index.js';
3
3
  import { TreeItem } from './content-tree.js';
4
4
  import '../../../types-41704JE4.js';
5
5
  import 'react';
6
- import '../../../types-NQozKWEz.js';
6
+ import '../../../types-kR_4wYBw.js';
7
7
  import '../../../data/index.js';
8
8
  import '../../../resolve-D68pb3Bx.js';
9
9
 
@@ -1 +1 @@
1
- export{useSectionOps}from"../../../chunk-N2BVA6TS.js";import"../../../chunk-PQRYAW2G.js";import"../../../chunk-R6WTQWAC.js";import"../../../chunk-U3JP4VGF.js";import"../../../chunk-PLVEGYK6.js";import"../../../chunk-SMM3ST7A.js";import"../../../chunk-TBY3DFKS.js";import"../../../chunk-ECM5F6JJ.js";import"../../../chunk-N3LYD2LK.js";import"../../../chunk-BPXEFVSQ.js";import"../../../chunk-XWFH2NHZ.js";import"../../../chunk-4JSBIW5H.js";import"../../../chunk-K56YDHYQ.js";import"../../../chunk-BALFHI3G.js";import"../../../chunk-RC25EGHD.js";import"../../../chunk-KFV7N2DJ.js";import"../../../chunk-YRLPFZW3.js";import"../../../chunk-23VM4PMV.js";import"../../../chunk-B4JN227A.js";import"../../../chunk-2XMHLXMA.js";import"../../../chunk-G3GWAP5R.js";import"../../../chunk-WRFD4EXD.js";import"../../../chunk-36LVP5WD.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-67GNT6PF.js";import"../../../chunk-P2VEMZH5.js";import"../../../chunk-X4T6JT3M.js";import"../../../chunk-KRXQM65X.js";import"../../../chunk-NKB3KVAB.js";
1
+ export{useSectionOps}from"../../../chunk-NFLO4I2N.js";import"../../../chunk-SPQOPWCL.js";import"../../../chunk-R6WTQWAC.js";import"../../../chunk-U3JP4VGF.js";import"../../../chunk-PLVEGYK6.js";import"../../../chunk-BU2YSTLJ.js";import"../../../chunk-TBY3DFKS.js";import"../../../chunk-N3LYD2LK.js";import"../../../chunk-BPXEFVSQ.js";import"../../../chunk-4JSBIW5H.js";import"../../../chunk-K56YDHYQ.js";import"../../../chunk-XWFH2NHZ.js";import"../../../chunk-YRLPFZW3.js";import"../../../chunk-BALFHI3G.js";import"../../../chunk-SHS6WCLL.js";import"../../../chunk-RC25EGHD.js";import"../../../chunk-KFV7N2DJ.js";import"../../../chunk-23VM4PMV.js";import"../../../chunk-B4JN227A.js";import"../../../chunk-2XMHLXMA.js";import"../../../chunk-G3GWAP5R.js";import"../../../chunk-WRFD4EXD.js";import"../../../chunk-36LVP5WD.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-67GNT6PF.js";import"../../../chunk-P2VEMZH5.js";import"../../../chunk-X4T6JT3M.js";import"../../../chunk-KRXQM65X.js";import"../../../chunk-NKB3KVAB.js";
@@ -1,7 +1,7 @@
1
1
  import { A as AutosaveSnapshot } from '../../engine-CvXpFE86.js';
2
- import { a as SaveIconState } from '../../types-DGyDHiJV.js';
2
+ import { a as SaveIconState } from '../../types-DT8ywrFQ.js';
3
3
  import { ScreenSaveStatusWords } from '../words.js';
4
- import '../../types-CsgMwHHa.js';
4
+ import '../../types-Cy7rdmXt.js';
5
5
  import '../../wordFit-7XpmhcaW.js';
6
6
  import 'react';
7
7
  import '../../edit-lock/index.js';
@@ -2,23 +2,23 @@ import * as react from 'react';
2
2
  import { ReactNode, MouseEvent, ComponentType } from 'react';
3
3
  import { Data } from '../../blocks/index.js';
4
4
  import { C as CanvasTarget } from '../../watch-BTYOJpQU.js';
5
- import { D as DeviceOption } from '../../types-DGyDHiJV.js';
5
+ import { D as DeviceOption } from '../../types-DT8ywrFQ.js';
6
6
  import { P as Place } from '../../types-41704JE4.js';
7
7
  import { M as MeasuredCanvas, C as CanvasDragModel } from '../../CanvasDragLayer-dZCPbQCP.js';
8
8
  import { E as EaselContextMenuItem } from '../../types-BsyPh6EW.js';
9
- import { a as EaselRailItem } from '../../types-CsgMwHHa.js';
9
+ import { E as EaselRailItem } from '../../types-Cy7rdmXt.js';
10
10
  import { StyleRow } from '../../style-clipboard/index.js';
11
11
  import { T as TreeRowMark } from '../../types-D8P9q-BG.js';
12
12
  import { AddKey } from '../components/AddSidePanel.js';
13
- import { k as AnyScreenTarget } from '../../host-DGmdCaNL.js';
13
+ import { k as AnyScreenTarget } from '../../host-Cxbhp0zg.js';
14
14
  import { HostProduct } from './host-chrome.js';
15
15
  import { EaselSession } from './session.js';
16
16
  import { AddTarget } from './puck/add-target-types.js';
17
17
  import { SlotConfigView } from './puck/content-tree.js';
18
- import '../../types-NQozKWEz.js';
18
+ import '../../types-kR_4wYBw.js';
19
19
  import '../../data/index.js';
20
20
  import '../../resolve-D68pb3Bx.js';
21
- import '../../plan-CGREINRO.js';
21
+ import '../../plan-2BLk7pWs.js';
22
22
  import '../../edit-lock/index.js';
23
23
  import '../../panelWidths-D9hTLR25.js';
24
24
  import '../../session-DSQFmIvx.js';
@@ -394,9 +394,29 @@ interface ScreenMainAction {
394
394
  * empty: no list.
395
395
  */
396
396
  goingLive?: readonly string[];
397
+ /**
398
+ * The layer's own rows of the ▾ menu ("Version history"): drawn last, under
399
+ * Save now and one divider, as the shell's menu items. A press closes the
400
+ * menu, then runs `onSelect`. Absent or empty: the menu is as before, with
401
+ * no divider of their own.
402
+ */
403
+ menuItems?: readonly ScreenMenuItem[];
397
404
  /** The action is running: the main half shows the shell's spinner. */
398
405
  busy?: boolean;
399
406
  }
407
+ /** One of the layer's rows in the ▾ menu ({@link ScreenMainAction.menuItems}). */
408
+ interface ScreenMenuItem {
409
+ /** Unique among the layer's rows. */
410
+ key: string;
411
+ /** The row's words, in the layer's language ("Version history"). */
412
+ label: string;
413
+ /** The shell glyph before the words. */
414
+ icon?: ReactNode;
415
+ /** What a press does, after the menu has closed. */
416
+ onSelect: () => void;
417
+ /** Turns the row off. */
418
+ disabled?: boolean;
419
+ }
400
420
  /** What a layer's bridges give back for the screen to place. */
401
421
  interface ScreenBridges {
402
422
  /** A row under the Add panel's tiles, for something that is not a block.
@@ -498,28 +518,6 @@ interface ScreenBridges {
498
518
  * from that part's own panel. A layer with nowhere to keep them hands none,
499
519
  * and the panel draws no door. */
500
520
  openStyles?: () => void;
501
- /**
502
- * The open document is the one that STORES what the layer pins: the node
503
- * every other document shows pinned and does not hold (the website's: the
504
- * page that keeps the site's one footer). It is edited there in place, so
505
- * the screen draws that document's tree without the rows an ordinary one has
506
- * round its own sections, and without the row that leads to it. Absent, the
507
- * document is an ordinary one.
508
- */
509
- pinnedSource?: boolean;
510
- /** …and the way to edit what is pinned from a document that only shows it:
511
- * what a press on its row in the tree does. Where it leads is the layer's
512
- * (the website opens its footer's editor over the page). */
513
- editPinnedSource?: () => void;
514
- /**
515
- * The layer's own way to bring the canvas to a node the screen has selected,
516
- * for a document where the screen's plain scroll does not hold: one the
517
- * layer draws something above, which reflows and takes the scroll back (the
518
- * website's footer, edited under the page it was opened from). Handed back
519
- * only for such a document, and the screen then calls it in place of its
520
- * scroll; absent, the screen scrolls.
521
- */
522
- holdCanvasOn?: (id: string) => void;
523
521
  /**
524
522
  * THE LAYER'S OWN ROWS IN A NODE'S RIGHT-CLICK MENU (0.105.0), by the group
525
523
  * each joins (`ScreenMenuRows`): the campaign designer's "Check this image
@@ -1453,4 +1451,4 @@ declare function useScreenCanvasTarget(): CanvasTarget | null;
1453
1451
  * engine's plain rows for the selection. */
1454
1452
  declare function useScreenInspectorPanel(): ComponentType<ScreenInspectorPanelProps>;
1455
1453
 
1456
- 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 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 ScreenSlot, type ScreenSlotAction, type ScreenSlotMode, type ScreenStyleClipboard, type ScreenStyleDocument, type ScreenStylePastePlan, type ScreenToastExtra, type ScreenTree, type ScreenTreeFolds, type ScreenTreeRows, isPinnedFirst, isPinnedLast, isSlotMode, sameInspectorMode, screenSlotsOf, useScreenBlockLook, useScreenBlockRules, useScreenBridges, useScreenCanvasDrag, useScreenCanvasFrame, useScreenCanvasHead, useScreenCanvasTarget, useScreenDevices, useScreenDocumentLabel, useScreenDocumentPass, useScreenInspectorPanel, useScreenLeftView, useScreenNodeKeys, useScreenNotify, useScreenOwnerName, useScreenParts, useScreenPickFollowsSelection, useScreenPinned, useScreenSaveSwitch, useScreenStorageNamespace, useScreenStyleClipboard, useStandaloneScreenBridges };
1454
+ export { type NodeDefaults, SELECTION_MODE, type ScreenBlockLook, type ScreenBlockRules, type ScreenBridges, type ScreenCanvas, type ScreenCanvasDrag, type ScreenCanvasDragContext, type ScreenCanvasHeadProps, ScreenCanvasTargetProvider, type ScreenDevices, type ScreenDocumentOps, type ScreenDragItem, type ScreenInspector, type ScreenInspectorMode, type ScreenInspectorPanelProps, type ScreenLeftPanel, type ScreenLeftView, type ScreenLeftViewFrame, type ScreenLeftViewRules, type ScreenMainAction, type ScreenMenuItem, type ScreenMenuRows, type ScreenNewNode, type ScreenNode, type ScreenNodeActions, type ScreenNodeLevel, type ScreenNodeMaker, type ScreenPartMode, type ScreenParts, ScreenPartsProvider, type ScreenPinnedBand, type ScreenPinnedNodes, type ScreenRailItem, type ScreenSelector, type ScreenSlot, type ScreenSlotAction, type ScreenSlotMode, type ScreenStyleClipboard, type ScreenStyleDocument, type ScreenStylePastePlan, type ScreenToastExtra, type ScreenTree, type ScreenTreeFolds, type ScreenTreeRows, isPinnedFirst, isPinnedLast, isSlotMode, sameInspectorMode, screenSlotsOf, useScreenBlockLook, useScreenBlockRules, useScreenBridges, useScreenCanvasDrag, useScreenCanvasFrame, useScreenCanvasHead, useScreenCanvasTarget, useScreenDevices, useScreenDocumentLabel, useScreenDocumentPass, useScreenInspectorPanel, useScreenLeftView, useScreenNodeKeys, useScreenNotify, useScreenOwnerName, useScreenParts, useScreenPickFollowsSelection, useScreenPinned, useScreenSaveSwitch, useScreenStorageNamespace, useScreenStyleClipboard, useStandaloneScreenBridges };
@@ -1 +1 @@
1
- export{SELECTION_MODE,ScreenCanvasTargetProvider,ScreenPartsProvider,isPinnedFirst,isPinnedLast,isSlotMode,sameInspectorMode,screenSlotsOf,useScreenBlockLook,useScreenBlockRules,useScreenBridges,useScreenCanvasDrag,useScreenCanvasFrame,useScreenCanvasHead,useScreenCanvasTarget,useScreenDevices,useScreenDocumentLabel,useScreenDocumentPass,useScreenInspectorPanel,useScreenLeftView,useScreenNodeKeys,useScreenNotify,useScreenOwnerName,useScreenParts,useScreenPickFollowsSelection,useScreenPinned,useScreenSaveSwitch,useScreenStorageNamespace,useScreenStyleClipboard,useStandaloneScreenBridges}from"../../chunk-PQRYAW2G.js";import"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-PLVEGYK6.js";import"../../chunk-SMM3ST7A.js";import"../../chunk-TBY3DFKS.js";import"../../chunk-ECM5F6JJ.js";import"../../chunk-N3LYD2LK.js";import"../../chunk-BPXEFVSQ.js";import"../../chunk-XWFH2NHZ.js";import"../../chunk-4JSBIW5H.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-BALFHI3G.js";import"../../chunk-RC25EGHD.js";import"../../chunk-KFV7N2DJ.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-23VM4PMV.js";import"../../chunk-B4JN227A.js";import"../../chunk-2XMHLXMA.js";import"../../chunk-G3GWAP5R.js";import"../../chunk-WRFD4EXD.js";import"../../chunk-36LVP5WD.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-67GNT6PF.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-X4T6JT3M.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
1
+ export{SELECTION_MODE,ScreenCanvasTargetProvider,ScreenPartsProvider,isPinnedFirst,isPinnedLast,isSlotMode,sameInspectorMode,screenSlotsOf,useScreenBlockLook,useScreenBlockRules,useScreenBridges,useScreenCanvasDrag,useScreenCanvasFrame,useScreenCanvasHead,useScreenCanvasTarget,useScreenDevices,useScreenDocumentLabel,useScreenDocumentPass,useScreenInspectorPanel,useScreenLeftView,useScreenNodeKeys,useScreenNotify,useScreenOwnerName,useScreenParts,useScreenPickFollowsSelection,useScreenPinned,useScreenSaveSwitch,useScreenStorageNamespace,useScreenStyleClipboard,useStandaloneScreenBridges}from"../../chunk-SPQOPWCL.js";import"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-PLVEGYK6.js";import"../../chunk-BU2YSTLJ.js";import"../../chunk-TBY3DFKS.js";import"../../chunk-N3LYD2LK.js";import"../../chunk-BPXEFVSQ.js";import"../../chunk-4JSBIW5H.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-XWFH2NHZ.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-BALFHI3G.js";import"../../chunk-SHS6WCLL.js";import"../../chunk-RC25EGHD.js";import"../../chunk-KFV7N2DJ.js";import"../../chunk-23VM4PMV.js";import"../../chunk-B4JN227A.js";import"../../chunk-2XMHLXMA.js";import"../../chunk-G3GWAP5R.js";import"../../chunk-WRFD4EXD.js";import"../../chunk-36LVP5WD.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-67GNT6PF.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-X4T6JT3M.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
@@ -3,11 +3,11 @@ import { EaselSession } from './session.js';
3
3
  import './puck/content-tree.js';
4
4
  import '../../blocks/index.js';
5
5
  import 'react';
6
- import '../../types-NQozKWEz.js';
6
+ import '../../types-kR_4wYBw.js';
7
7
  import '../../data/index.js';
8
8
  import '../../types-41704JE4.js';
9
9
  import '../../resolve-D68pb3Bx.js';
10
- import '../../plan-CGREINRO.js';
10
+ import '../../plan-2BLk7pWs.js';
11
11
  import './backend-error.js';
12
12
  import '../../edit-lock/index.js';
13
13
  import './host-chrome.js';
@@ -2,11 +2,11 @@ import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
  import { EaselSession } from './session.js';
4
4
  import '../../blocks/index.js';
5
- import '../../types-NQozKWEz.js';
5
+ import '../../types-kR_4wYBw.js';
6
6
  import '../../data/index.js';
7
7
  import '../../types-41704JE4.js';
8
8
  import '../../resolve-D68pb3Bx.js';
9
- import '../../plan-CGREINRO.js';
9
+ import '../../plan-2BLk7pWs.js';
10
10
  import './backend-error.js';
11
11
  import '../../edit-lock/index.js';
12
12
  import './host-chrome.js';
@@ -5,11 +5,11 @@ import { WebsiteEditLock } from './document-contract.js';
5
5
  import { EaselDocumentHooks } from './document-hooks.js';
6
6
  import { SectionTemplateStore } from './section-template-types.js';
7
7
  import 'react';
8
- import '../../types-NQozKWEz.js';
8
+ import '../../types-kR_4wYBw.js';
9
9
  import '../../data/index.js';
10
10
  import '../../types-41704JE4.js';
11
11
  import '../../resolve-D68pb3Bx.js';
12
- import '../../plan-CGREINRO.js';
12
+ import '../../plan-2BLk7pWs.js';
13
13
  import '../../edit-lock/index.js';
14
14
  import './links/link-filters.js';
15
15
  import 'efficient-shell/ui';
@@ -274,8 +274,6 @@ type ScreenWords = {
274
274
  collapseAll: string;
275
275
  /** …its tooltip while the page has nothing to fold, and the button is off. */
276
276
  nothingToFold: string;
277
- /** The pinned Footer's row where the page has no footer of its own: its tooltip. */
278
- editFooter: string;
279
277
  /** The box a row's name is typed in: its accessible name. */
280
278
  rename: string;
281
279
  /** A row's trash and eye, naming the row. */
@@ -1 +1 @@
1
- export{DEFAULT_SCREEN_ADD_WORDS,DEFAULT_SCREEN_SAVE_STATUS_WORDS,DEFAULT_SCREEN_WORDS}from"../chunk-VVPZMWJE.js";
1
+ export{DEFAULT_SCREEN_ADD_WORDS,DEFAULT_SCREEN_SAVE_STATUS_WORDS,DEFAULT_SCREEN_WORDS}from"../chunk-EL4F3IN7.js";
@@ -60,7 +60,12 @@
60
60
  */
61
61
 
62
62
  .es-editor {
63
- /* — accent: the shell's (custom accent, else the themed primary fill) — */
63
+ /* — accent: the shell's (custom accent, else the themed primary fill) —
64
+ SHELL GAP (#199): the shell has no token yet for an accent wash
65
+ (tint, tint-strong), an accent hairline (line), accent words (text), an
66
+ accent shadow, or ink on a solid fill (on-accent: its nearest is the status
67
+ tier's `--status-on-solid`). Each is MIXED from shell tokens until the
68
+ shell has one; none is a value of our own. */
64
69
  --es-accent: var(--accent-600, var(--submit-bg));
65
70
  --es-accent-tint: color-mix(in srgb, var(--es-accent) 10%, var(--surface));
66
71
  --es-accent-tint-strong: color-mix(in srgb, var(--es-accent) 18%, var(--surface));
@@ -1,27 +1,141 @@
1
- import { DeepPartial, EaselStrings } from './catalogue.js';
2
- export { CanvasWords, DEFAULT_EASEL_STRINGS, RailWords, mergeEaselStrings } from './catalogue.js';
1
+ import { a as SaveWords } from '../words-DkWcK1rh.js';
2
+ import { N as NoticeWords, C as ChromeWords } from '../words-BpiVrsW5.js';
3
+ import { C as CopyWords } from '../words-D-yhjdOg.js';
4
+ import { D as DragWords } from '../words-CvwYvkJm.js';
5
+ import { LockWords } from '../edit-lock/index.js';
6
+ import { F as FieldsWords } from '../words-vhnV8sM7.js';
7
+ import { N as NodeMenuWords } from '../words-DMG4dYq2.js';
8
+ import { P as PanelWords } from '../words-zH1H0WFw.js';
9
+ import { P as PickWords } from '../words-DWvCJXwR.js';
10
+ import { ScreenWords } from '../screen/words.js';
11
+ export { ScreenAddWords } from '../screen/words.js';
12
+ import { S as StyleClipboardWords } from '../words-CnnHb9jo.js';
13
+ import { T as TextStylesWords } from '../words-gIDCeRv3.js';
14
+ import { T as TreeWords } from '../words-Cl9xMUYY.js';
3
15
  import * as react from 'react';
4
16
  import { ReactNode } from 'react';
5
- export { C as ChromeWords, N as NoticeWords } from '../words-BpiVrsW5.js';
6
- export { C as CopyWords } from '../words-D-yhjdOg.js';
7
- export { D as DragWords } from '../words-CvwYvkJm.js';
8
- export { F as FieldsWords } from '../words-vhnV8sM7.js';
9
- export { LockWords } from '../edit-lock/index.js';
10
- export { N as NodeMenuWords } from '../words-DMG4dYq2.js';
11
- export { P as PanelWords } from '../words-zH1H0WFw.js';
12
- export { P as PickWords } from '../words-DWvCJXwR.js';
13
- export { S as SaveWords } from '../words-pgIK0I6g.js';
14
- export { ScreenAddWords, ScreenWords } from '../screen/words.js';
15
- export { S as StyleClipboardWords } from '../words-CnnHb9jo.js';
16
- export { T as TextStylesWords } from '../words-gIDCeRv3.js';
17
- export { T as TreeWords } from '../words-Cl9xMUYY.js';
18
- import 'efficient-shell/markup';
19
- import '../buckets-Tj-nkBpg.js';
20
- import '../types-DGyDHiJV.js';
21
- import '../types-CsgMwHHa.js';
17
+ import '../types-DT8ywrFQ.js';
18
+ import '../types-Cy7rdmXt.js';
22
19
  import '../wordFit-7XpmhcaW.js';
23
20
  import '../panelWidths-D9hTLR25.js';
24
21
  import '../engine-CvXpFE86.js';
22
+ import 'efficient-shell/markup';
23
+ import '../buckets-Tj-nkBpg.js';
24
+
25
+ /**
26
+ * The easel canvas's own words (`efficient-easel/strings`, 0.95.0): what the
27
+ * frame is called when the host does not name it (`title`), and the name of
28
+ * the bar of text tools that floats above words typed on the canvas.
29
+ *
30
+ * A plain module with no import.
31
+ */
32
+ type CanvasWords = {
33
+ /** The canvas frame's accessible name. */
34
+ frame: string;
35
+ /** The floating bar of text tools over the words being typed (its group's name). */
36
+ textTools: string;
37
+ };
38
+
39
+ /**
40
+ * The rail's own words. There is one: what the toolbar is called when the host
41
+ * does not name it (`ariaLabel`). Every other word on the rail is an item's
42
+ * `label`, and those are the host's.
43
+ *
44
+ * A plain module with no import, so the rail stays the leaf it is
45
+ * (`tests/rail-leaf-safety.test.tsx`). It is NOT exported from `./index`: the
46
+ * rail's runtime exports are pinned (`tests/rail-public-shape.test.tsx`), and a
47
+ * host reads these through `efficient-easel/strings`.
48
+ */
49
+ type RailWords = {
50
+ /** The toolbar's accessible name. */
51
+ label: string;
52
+ };
53
+
54
+ /**
55
+ * THE ENGINE'S OWN WORDS, as one catalogue a host can translate (0.95.0).
56
+ *
57
+ * Every word and sentence this package itself draws or returns — visible text,
58
+ * `aria-label`s, tooltips, placeholders — is an entry here, grouped by the
59
+ * module that says it. What a HOST supplies (a block's name, a field's label, a
60
+ * tile's caption, the document's noun) was never the engine's and is not here —
61
+ * with one exception: the assembled screen (`efficient-easel/screen`) draws the
62
+ * edit notice itself, so the noun it says it with is a word of its own group,
63
+ * the website's "page" until a host says another.
64
+ *
65
+ * - A plain word is a `string`.
66
+ * - Anything with a value in it, or a count that can be one or many, is a
67
+ * function: the host puts the value where its language wants it and does
68
+ * its own plural.
69
+ *
70
+ * ── Where the English lives ───────────────────────────────────────────────
71
+ * In each module's own `words.ts`, NOT here. A leaf may only import its own
72
+ * lane (`tests/*-leaf-safety`), and several are held to a bundle that never
73
+ * spells a browser global — while one sentence below does ("another tab or
74
+ * window"). So a module owns its group and its defaults, and this file only
75
+ * puts the groups side by side. `DEFAULT_EASEL_STRINGS.pick` IS the pickers'
76
+ * own default object, not a copy of it.
77
+ *
78
+ * ── Framework-free ────────────────────────────────────────────────────────
79
+ * No React, no browser global, nothing run at import but object literals
80
+ * (`tests/strings-leaf-safety.test.ts`), so `efficient-easel/strings`, which
81
+ * re-exports it beside the provider, creates nothing at import. A host's
82
+ * server-side test reads `DEFAULT_EASEL_STRINGS` from there. The provider and
83
+ * the hooks are in ./provider.
84
+ */
85
+
86
+ /** Every word the engine says, by the module that says it. */
87
+ interface EaselStrings {
88
+ /** `efficient-easel/chrome` — `EditNotice`: who holds the document, a refused save. */
89
+ notice: NoticeWords;
90
+ /** `efficient-easel/edit-lock` — "2 minutes ago", "Someone else". */
91
+ lock: LockWords;
92
+ /** `efficient-easel/autosave` — the save pill. */
93
+ save: SaveWords;
94
+ /** `efficient-easel/chrome` — the device switch, "up one level", the panel grip. */
95
+ chrome: ChromeWords;
96
+ /** `efficient-easel/rail` — the toolbar's name. */
97
+ rail: RailWords;
98
+ /** `efficient-easel/tree` — the drag hint and the caret. */
99
+ tree: TreeWords;
100
+ /** `efficient-easel/panel` — the tab strip's name and each tab's word. */
101
+ panel: PanelWords;
102
+ /** `efficient-easel/fields` — the number box, the dropdown, the list field. */
103
+ fields: FieldsWords;
104
+ /** `efficient-easel/pick` — the colour row and the image box. */
105
+ pick: PickWords;
106
+ /** `efficient-easel/drag` — the Add panel and the canvas layer. */
107
+ drag: DragWords;
108
+ /** `efficient-easel/node-ops` — the right-click rows. */
109
+ menu: NodeMenuWords;
110
+ /** `efficient-easel/style-clipboard` — Copy style, Paste style and what a paste says. */
111
+ styleClipboard: StyleClipboardWords;
112
+ /** `efficient-easel/copy` — the formatting bar, alignment, the link window, each mark. */
113
+ copy: CopyWords;
114
+ /** `efficient-easel/easel` — the canvas frame's name. */
115
+ canvas: CanvasWords;
116
+ /** `efficient-easel/text-styles` — the Email styles / Site styles list (E6). */
117
+ textStyles: TextStylesWords;
118
+ /** `efficient-easel/screen` — a document opening, one that will not, the
119
+ * notice's word for the document, the Layers tree's frame, the Add panel,
120
+ * the main button and the block keys. */
121
+ screen: ScreenWords;
122
+ }
123
+ /** Today's English, word for word. */
124
+ declare const DEFAULT_EASEL_STRINGS: EaselStrings;
125
+ /**
126
+ * A catalogue with any part left out. A function entry is taken whole or not
127
+ * at all: it has no "part" to leave out.
128
+ */
129
+ type DeepPartial<T> = T extends (...args: never[]) => unknown ? T : T extends object ? {
130
+ [K in keyof T]?: DeepPartial<T[K]>;
131
+ } : T;
132
+ /**
133
+ * `defaults` with every entry `partial` gives laid over it. Whatever `partial`
134
+ * leaves out (or gives as `undefined` / `null`) keeps the default, so a host
135
+ * that has translated half the catalogue shows the other half in English
136
+ * rather than as nothing. Neither argument is changed.
137
+ */
138
+ declare function mergeEaselStrings(defaults: EaselStrings, partial?: DeepPartial<EaselStrings> | null): EaselStrings;
25
139
 
26
140
  interface EaselStringsProviderProps {
27
141
  /**
@@ -58,4 +172,4 @@ declare function useEaselStrings(): EaselStrings;
58
172
  /** The nearest provider's locale, or `'en'`. */
59
173
  declare function useEaselLocale(): string;
60
174
 
61
- export { DeepPartial, EaselStrings, EaselStringsProvider, type EaselStringsProviderProps, useEaselLocale, useEaselStrings };
175
+ export { type CanvasWords, ChromeWords, CopyWords, DEFAULT_EASEL_STRINGS, type DeepPartial, DragWords, type EaselStrings, EaselStringsProvider, type EaselStringsProviderProps, FieldsWords, LockWords, NodeMenuWords, NoticeWords, PanelWords, PickWords, type RailWords, SaveWords, ScreenWords, StyleClipboardWords, TextStylesWords, TreeWords, mergeEaselStrings, useEaselLocale, useEaselStrings };