efficient-easel 7.2.2 → 8.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 (81) hide show
  1. package/README.md +34 -3
  2. package/dist/autosave/index.d.ts +5 -5
  3. package/dist/autosave/index.js +1 -1
  4. package/dist/chrome/chrome.css +34 -0
  5. package/dist/chrome/index.d.ts +23 -4
  6. package/dist/chrome/index.js +1 -1
  7. package/dist/chunk-246ONJJH.js +58 -0
  8. package/dist/chunk-3NB2IEXA.js +1 -0
  9. package/dist/{chunk-QJITGBAT.js → chunk-3QK5R7RR.js} +3 -3
  10. package/dist/chunk-BHRC3ASL.js +1 -0
  11. package/dist/{chunk-MVQEEWTE.js → chunk-BRDCD4LK.js} +1 -1
  12. package/dist/{chunk-COCSEEXP.js → chunk-CVUMGA2T.js} +1 -1
  13. package/dist/{chunk-6TOYXESC.js → chunk-DPKWJTNX.js} +1 -1
  14. package/dist/chunk-HDUAODXJ.js +4 -0
  15. package/dist/{chunk-HS5DWUCH.js → chunk-JO6FBCVR.js} +1 -1
  16. package/dist/chunk-JTUUIVBZ.js +1 -0
  17. package/dist/{chunk-E4MAYJX5.js → chunk-NCQSBU3O.js} +1 -1
  18. package/dist/chunk-NDRZP6YR.js +1 -0
  19. package/dist/{chunk-6Z5VENIE.js → chunk-OGCROOTI.js} +1 -1
  20. package/dist/chunk-QVUVDBGA.js +23 -0
  21. package/dist/{chunk-LC62L4P2.js → chunk-R2G64ZNC.js} +1 -1
  22. package/dist/chunk-RKTF5XLP.js +1 -0
  23. package/dist/{chunk-JVTSUA2U.js → chunk-SQMUAXUS.js} +1 -1
  24. package/dist/chunk-THZ46DC5.js +2 -0
  25. package/dist/{chunk-PFNIVZPN.js → chunk-XTJCKV6Z.js} +1 -1
  26. package/dist/chunk-ZPXKNO5L.js +5 -0
  27. package/dist/{engine-DBxp_v6B.d.ts → engine-CvXpFE86.d.ts} +18 -0
  28. package/dist/{host-CiuzZJXj.d.ts → host-Ud6rLpph.d.ts} +6 -1
  29. package/dist/screen/components/AddBlockRow.js +1 -1
  30. package/dist/screen/components/AddSidePanel.js +1 -1
  31. package/dist/screen/components/MediaSidePanel.d.ts +2 -2
  32. package/dist/screen/components/MediaSidePanel.js +1 -1
  33. package/dist/screen/components/NodeContextMenu.d.ts +3 -3
  34. package/dist/screen/components/NodeContextMenu.js +1 -1
  35. package/dist/screen/components/PageEditGuardNotices.js +1 -1
  36. package/dist/screen/components/SaveControls.d.ts +85 -0
  37. package/dist/screen/components/SaveControls.js +1 -0
  38. package/dist/screen/components/ScreenChrome.js +1 -1
  39. package/dist/screen/components/ScreenDocumentContext.d.ts +2 -2
  40. package/dist/screen/components/ScreenDocumentContext.js +1 -1
  41. package/dist/screen/components/ScreenMount.d.ts +3 -3
  42. package/dist/screen/components/ScreenMount.js +1 -1
  43. package/dist/screen/components/ScreenStoreProvider.d.ts +3 -3
  44. package/dist/screen/components/SectionScreenShell.js +16 -16
  45. package/dist/screen/components/SidePanelHead.js +1 -1
  46. package/dist/screen/components/panel-widths.js +1 -1
  47. package/dist/screen/components/usePartBridge.d.ts +3 -3
  48. package/dist/screen/index.d.ts +4 -4
  49. package/dist/screen/index.js +1 -1
  50. package/dist/screen/lib/document-addressing.d.ts +2 -2
  51. package/dist/screen/lib/document-switch.d.ts +1 -1
  52. package/dist/screen/lib/host.d.ts +2 -2
  53. package/dist/screen/lib/key-scope.d.ts +16 -1
  54. package/dist/screen/lib/key-scope.js +1 -1
  55. package/dist/screen/lib/media-panel.d.ts +2 -2
  56. package/dist/screen/lib/media-picker.d.ts +2 -2
  57. package/dist/screen/lib/puck/device-fields.js +1 -1
  58. package/dist/screen/lib/puck/slot-child-name.js +1 -1
  59. package/dist/screen/lib/puck/style-clipboard.d.ts +3 -3
  60. package/dist/screen/lib/puck/style-clipboard.js +1 -1
  61. package/dist/screen/lib/save-status.d.ts +75 -0
  62. package/dist/screen/lib/save-status.js +1 -0
  63. package/dist/screen/lib/screen-parts.d.ts +63 -17
  64. package/dist/screen/screen.css +8 -0
  65. package/dist/screen/words.d.ts +62 -5
  66. package/dist/screen/words.js +1 -1
  67. package/dist/strings/catalogue.d.ts +3 -3
  68. package/dist/strings/catalogue.js +1 -1
  69. package/dist/strings/index.d.ts +3 -3
  70. package/dist/strings/index.js +1 -1
  71. package/dist/{types-Dt1CFR1S.d.ts → types-DGyDHiJV.d.ts} +13 -1
  72. package/dist/{words-CvFnwGSr.d.ts → words-pgIK0I6g.d.ts} +2 -2
  73. package/package.json +13 -3
  74. package/dist/chunk-5F3PKNT7.js +0 -1
  75. package/dist/chunk-64ZRPAWS.js +0 -2
  76. package/dist/chunk-BDTITTMW.js +0 -1
  77. package/dist/chunk-DOHYKMMH.js +0 -1
  78. package/dist/chunk-G24HQEX4.js +0 -62
  79. package/dist/chunk-LIH5SH6S.js +0 -5
  80. package/dist/chunk-TBF5CVPA.js +0 -1
  81. package/dist/chunk-UB4TLWVJ.js +0 -21
@@ -1 +1 @@
1
- import"../chunk-GZO72N3Q.js";export{DocumentScreen,ScreenMount}from"../chunk-QJITGBAT.js";import"../chunk-GXQCZJOP.js";export{ScreenStoreProvider}from"../chunk-BSZ54Q2T.js";import"../chunk-G24HQEX4.js";import"../chunk-26OOWIJJ.js";import"../chunk-MVQEEWTE.js";import"../chunk-FGNR22NY.js";import"../chunk-ZE7I3PLX.js";import"../chunk-2GVCAIPX.js";import"../chunk-6Z5VENIE.js";import"../chunk-7F52SZOI.js";import"../chunk-MQNBD6AB.js";import"../chunk-TBF5CVPA.js";import"../chunk-4ES5JGGX.js";import"../chunk-IQ5TA7AM.js";import"../chunk-DUVRZ456.js";import"../chunk-6W7WLPZH.js";import"../chunk-DOHYKMMH.js";import"../chunk-KCBEE2MC.js";import"../chunk-6TOYXESC.js";import"../chunk-2LBXIYF7.js";import"../chunk-2QUWI67X.js";import"../chunk-IYT6NN2J.js";import"../chunk-LC62L4P2.js";import"../chunk-E4MAYJX5.js";import"../chunk-BSPCSC45.js";import"../chunk-I54UCYOU.js";import"../chunk-GOTN2KY4.js";import"../chunk-R5L2E7JX.js";import"../chunk-64ZRPAWS.js";import"../chunk-S4AWJX4Q.js";import"../chunk-ERR437B5.js";import"../chunk-KG7RJWOK.js";import"../chunk-GMCZXMOV.js";export{NO_DOCUMENT_ADDRESSING}from"../chunk-RLBXE4EU.js";import"../chunk-HNKB2ZYR.js";import"../chunk-CLOS6SSX.js";import"../chunk-VPFNZ7TB.js";import"../chunk-LOMEH6DG.js";import"../chunk-V7U33NF2.js";import"../chunk-5545A3PC.js";import"../chunk-LIH5SH6S.js";import"../chunk-5ZBY24K7.js";import"../chunk-PA3PNTVV.js";import"../chunk-BVN33R76.js";import"../chunk-PFNIVZPN.js";import"../chunk-KQMML6JM.js";import"../chunk-KCOBHPN6.js";export{EaselSessionProvider,useEaselSession}from"../chunk-O7Q4DDJT.js";export{EFFICIENT_BACKEND,activateEaselSession,backendOf,createEaselSession,currentEaselSession,deactivateEaselSession,efficientClientOpen,isEfficientBackend,provideDefaultBackend,resetAmbientEaselSession,sessionRegistry,setSessionBridgedSite,setSessionDocumentSite}from"../chunk-RSCMJIWS.js";import"../chunk-HQ4VVRIC.js";import"../chunk-COCSEEXP.js";export{SELECTION_MODE,ScreenCanvasTargetProvider,ScreenPartsProvider,isPinnedFirst,isPinnedLast,isSlotMode,sameInspectorMode,screenSlotsOf,useScreenAdd,useScreenBlockLook,useScreenBlockRules,useScreenBridges,useScreenCanvasDrag,useScreenCanvasFrame,useScreenCanvasHead,useScreenCanvasTarget,useScreenDevices,useScreenDocumentLabel,useScreenDocumentPass,useScreenInspectorPanel,useScreenLeftView,useScreenNodeKeys,useScreenNotify,useScreenOwnerName,useScreenParts,useScreenPickFollowsSelection,useScreenPinned,useScreenSaveSwitch,useScreenStorageNamespace,useScreenStyleClipboard,useStandaloneScreenBridges}from"../chunk-E3PD66A3.js";import"../chunk-PLVEGYK6.js";import"../chunk-R6WTQWAC.js";export{DETACHED_EASEL_HOST,EaselHostContext,EaselHostProvider,createEaselHost,useEaselHost,useHostEscape}from"../chunk-U3JP4VGF.js";import"../chunk-6WY6ZXJG.js";import"../chunk-5F3PKNT7.js";import"../chunk-KYG35KKJ.js";import"../chunk-TBY3DFKS.js";import"../chunk-PEDDDWSG.js";import"../chunk-OZ72A6MY.js";import"../chunk-4JSBIW5H.js";import"../chunk-GZH4UVDH.js";import"../chunk-K56YDHYQ.js";import"../chunk-KFV7N2DJ.js";import"../chunk-YRLPFZW3.js";import"../chunk-BXMXTO36.js";import"../chunk-EA2HTX37.js";import"../chunk-OSPUG6S6.js";import"../chunk-WK3AFPXY.js";import"../chunk-SOZUYCQZ.js";import"../chunk-4VJATVVR.js";import"../chunk-BDTITTMW.js";import"../chunk-H6DDIBQ4.js";import"../chunk-UB4TLWVJ.js";import"../chunk-Y2G7CU6A.js";import"../chunk-THWO5YVZ.js";import"../chunk-RE4LP46F.js";import"../chunk-MJM6SFD3.js";import"../chunk-2OAZYSWJ.js";import"../chunk-WQASXLXS.js";import"../chunk-66LWADFP.js";import"../chunk-QLD57GBB.js";import"../chunk-FFYXVAAL.js";import"../chunk-546BBOPE.js";import"../chunk-MFIRYGHW.js";import"../chunk-SSORUDHE.js";import"../chunk-O2NLQBFX.js";import"../chunk-67GNT6PF.js";import"../chunk-AWJUYMX7.js";import"../chunk-P2VEMZH5.js";import"../chunk-KRXQM65X.js";import"../chunk-NKB3KVAB.js";
1
+ import"../chunk-GZO72N3Q.js";export{DocumentScreen,ScreenMount}from"../chunk-3QK5R7RR.js";import"../chunk-GXQCZJOP.js";export{ScreenStoreProvider}from"../chunk-BSZ54Q2T.js";import"../chunk-246ONJJH.js";import"../chunk-2GVCAIPX.js";import"../chunk-26OOWIJJ.js";import"../chunk-BRDCD4LK.js";import"../chunk-FGNR22NY.js";import"../chunk-ZE7I3PLX.js";import"../chunk-OGCROOTI.js";import"../chunk-7F52SZOI.js";import"../chunk-MQNBD6AB.js";import"../chunk-BHRC3ASL.js";import"../chunk-6W7WLPZH.js";import"../chunk-4ES5JGGX.js";import"../chunk-IQ5TA7AM.js";import"../chunk-DUVRZ456.js";import"../chunk-3NB2IEXA.js";import"../chunk-KCBEE2MC.js";import"../chunk-DPKWJTNX.js";import"../chunk-2LBXIYF7.js";import"../chunk-2QUWI67X.js";import"../chunk-IYT6NN2J.js";import"../chunk-R2G64ZNC.js";import"../chunk-NCQSBU3O.js";import"../chunk-BSPCSC45.js";import"../chunk-I54UCYOU.js";import"../chunk-GOTN2KY4.js";import"../chunk-R5L2E7JX.js";import"../chunk-HDUAODXJ.js";import"../chunk-RKTF5XLP.js";import"../chunk-THZ46DC5.js";import"../chunk-GMCZXMOV.js";import"../chunk-CLOS6SSX.js";import"../chunk-S4AWJX4Q.js";import"../chunk-ERR437B5.js";import"../chunk-KG7RJWOK.js";import"../chunk-VPFNZ7TB.js";import"../chunk-LOMEH6DG.js";export{NO_DOCUMENT_ADDRESSING}from"../chunk-RLBXE4EU.js";import"../chunk-HNKB2ZYR.js";import"../chunk-V7U33NF2.js";import"../chunk-5545A3PC.js";import"../chunk-ZPXKNO5L.js";import"../chunk-PA3PNTVV.js";import"../chunk-5ZBY24K7.js";import"../chunk-BVN33R76.js";import"../chunk-XTJCKV6Z.js";import"../chunk-KQMML6JM.js";import"../chunk-KCOBHPN6.js";export{EaselSessionProvider,useEaselSession}from"../chunk-O7Q4DDJT.js";export{EFFICIENT_BACKEND,activateEaselSession,backendOf,createEaselSession,currentEaselSession,deactivateEaselSession,efficientClientOpen,isEfficientBackend,provideDefaultBackend,resetAmbientEaselSession,sessionRegistry,setSessionBridgedSite,setSessionDocumentSite}from"../chunk-RSCMJIWS.js";import"../chunk-HQ4VVRIC.js";import"../chunk-CVUMGA2T.js";export{SELECTION_MODE,ScreenCanvasTargetProvider,ScreenPartsProvider,isPinnedFirst,isPinnedLast,isSlotMode,sameInspectorMode,screenSlotsOf,useScreenAdd,useScreenBlockLook,useScreenBlockRules,useScreenBridges,useScreenCanvasDrag,useScreenCanvasFrame,useScreenCanvasHead,useScreenCanvasTarget,useScreenDevices,useScreenDocumentLabel,useScreenDocumentPass,useScreenInspectorPanel,useScreenLeftView,useScreenNodeKeys,useScreenNotify,useScreenOwnerName,useScreenParts,useScreenPickFollowsSelection,useScreenPinned,useScreenSaveSwitch,useScreenStorageNamespace,useScreenStyleClipboard,useStandaloneScreenBridges}from"../chunk-E3PD66A3.js";import"../chunk-PLVEGYK6.js";import"../chunk-R6WTQWAC.js";export{DETACHED_EASEL_HOST,EaselHostContext,EaselHostProvider,createEaselHost,useEaselHost,useHostEscape}from"../chunk-U3JP4VGF.js";import"../chunk-6WY6ZXJG.js";import"../chunk-JTUUIVBZ.js";import"../chunk-KYG35KKJ.js";import"../chunk-TBY3DFKS.js";import"../chunk-PEDDDWSG.js";import"../chunk-OZ72A6MY.js";import"../chunk-4JSBIW5H.js";import"../chunk-GZH4UVDH.js";import"../chunk-K56YDHYQ.js";import"../chunk-KFV7N2DJ.js";import"../chunk-YRLPFZW3.js";import"../chunk-BXMXTO36.js";import"../chunk-EA2HTX37.js";import"../chunk-OSPUG6S6.js";import"../chunk-WK3AFPXY.js";import"../chunk-SOZUYCQZ.js";import"../chunk-4VJATVVR.js";import"../chunk-NDRZP6YR.js";import"../chunk-H6DDIBQ4.js";import"../chunk-QVUVDBGA.js";import"../chunk-Y2G7CU6A.js";import"../chunk-THWO5YVZ.js";import"../chunk-RE4LP46F.js";import"../chunk-MJM6SFD3.js";import"../chunk-2OAZYSWJ.js";import"../chunk-WQASXLXS.js";import"../chunk-66LWADFP.js";import"../chunk-QLD57GBB.js";import"../chunk-FFYXVAAL.js";import"../chunk-546BBOPE.js";import"../chunk-MFIRYGHW.js";import"../chunk-SSORUDHE.js";import"../chunk-O2NLQBFX.js";import"../chunk-67GNT6PF.js";import"../chunk-AWJUYMX7.js";import"../chunk-P2VEMZH5.js";import"../chunk-KRXQM65X.js";import"../chunk-NKB3KVAB.js";
@@ -1,4 +1,4 @@
1
- export { A as AnyDocumentAddressing, a as DocumentAddressing, N as NO_DOCUMENT_ADDRESSING } from '../../host-CiuzZJXj.js';
1
+ export { A as AnyDocumentAddressing, a as DocumentAddressing, N as NO_DOCUMENT_ADDRESSING } from '../../host-Ud6rLpph.js';
2
2
  import './document-contract.js';
3
3
  import './session.js';
4
4
  import 'react';
@@ -9,7 +9,7 @@ import '../../types-41704JE4.js';
9
9
  import '../../resolve-D68pb3Bx.js';
10
10
  import '../../plan-xc48tt77.js';
11
11
  import './document-switch.js';
12
- import '../../engine-DBxp_v6B.js';
12
+ import '../../engine-CvXpFE86.js';
13
13
  import '../../edit-lock/index.js';
14
14
  import './admin-bridge.js';
15
15
  import './backend-error.js';
@@ -1,4 +1,4 @@
1
- import { A as AutosaveSnapshot } from '../../engine-DBxp_v6B.js';
1
+ import { A as AutosaveSnapshot } from '../../engine-CvXpFE86.js';
2
2
  import { EditAccess } from '../../edit-lock/index.js';
3
3
 
4
4
  /**
@@ -1,5 +1,5 @@
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-CiuzZJXj.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-Ud6rLpph.js';
3
3
  import '../../blocks/index.js';
4
4
  import '../../types-BbkxBdG9.js';
5
5
  import '../../data/index.js';
@@ -17,5 +17,5 @@ import './document-hooks.js';
17
17
  import './section-template-types.js';
18
18
  import './puck/content-tree.js';
19
19
  import './document-switch.js';
20
- import '../../engine-DBxp_v6B.js';
20
+ import '../../engine-CvXpFE86.js';
21
21
  import './admin-bridge.js';
@@ -48,5 +48,20 @@ declare function editorRootFocus(host: {
48
48
  }): {
49
49
  tabIndex?: number;
50
50
  };
51
+ /**
52
+ * ⌘S / Ctrl+S: "save now and stay" (harness PAT-1; 8.0.0). Not with ⌥ or ⇧,
53
+ * which mean other things in other apps.
54
+ */
55
+ declare function isSaveShortcut(e: KeyboardEvent): boolean;
56
+ /**
57
+ * ⌘S on the editor's keys (8.0.0): heard where its other page-wide keys are
58
+ * (`useEaselKeyTarget`: the page where the editor owns it, its root inside
59
+ * another app) and in the canvas frame, whose keys never leave its document.
60
+ * A field's ⌘S is the editor's too: there is no field-level save, and the
61
+ * browser's own "Save page as" is never what a person in the editor wants, so
62
+ * the press is always taken (`preventDefault`). `onSave` is read when the key
63
+ * is pressed, so a caller may hand a new one each render.
64
+ */
65
+ declare function useEaselSaveKey(rootRef: RefObject<HTMLElement | null>, canvas: CanvasTarget | null | undefined, onSave: () => void): void;
51
66
 
52
- export { editorRootFocus, useEaselKeyTarget, useEaselUndoKeys };
67
+ export { editorRootFocus, isSaveShortcut, useEaselKeyTarget, useEaselSaveKey, useEaselUndoKeys };
@@ -1 +1 @@
1
- export{editorRootFocus,useEaselKeyTarget,useEaselUndoKeys}from"../../chunk-DOHYKMMH.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-KYG35KKJ.js";import"../../chunk-TBY3DFKS.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-SOZUYCQZ.js";import"../../chunk-WQASXLXS.js";import"../../chunk-546BBOPE.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-AWJUYMX7.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
1
+ export{editorRootFocus,isSaveShortcut,useEaselKeyTarget,useEaselSaveKey,useEaselUndoKeys}from"../../chunk-3NB2IEXA.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-KYG35KKJ.js";import"../../chunk-TBY3DFKS.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-SOZUYCQZ.js";import"../../chunk-WQASXLXS.js";import"../../chunk-546BBOPE.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-AWJUYMX7.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ComponentType, ReactNode } from 'react';
3
- import { H as HostPickedMedia, E as EaselHost } from '../../host-CiuzZJXj.js';
3
+ import { H as HostPickedMedia, E as EaselHost } from '../../host-Ud6rLpph.js';
4
4
  import '../../blocks/index.js';
5
5
  import '../../types-BbkxBdG9.js';
6
6
  import '../../data/index.js';
@@ -18,7 +18,7 @@ import './document-hooks.js';
18
18
  import './section-template-types.js';
19
19
  import './puck/content-tree.js';
20
20
  import './document-switch.js';
21
- import '../../engine-DBxp_v6B.js';
21
+ import '../../engine-CvXpFE86.js';
22
22
  import './admin-bridge.js';
23
23
 
24
24
  /**
@@ -1,4 +1,4 @@
1
- import { E as EaselHost } from '../../host-CiuzZJXj.js';
1
+ import { E as EaselHost } from '../../host-Ud6rLpph.js';
2
2
  import 'react';
3
3
  import '../../blocks/index.js';
4
4
  import '../../types-BbkxBdG9.js';
@@ -17,7 +17,7 @@ import './document-hooks.js';
17
17
  import './section-template-types.js';
18
18
  import './puck/content-tree.js';
19
19
  import './document-switch.js';
20
- import '../../engine-DBxp_v6B.js';
20
+ import '../../engine-CvXpFE86.js';
21
21
  import './admin-bridge.js';
22
22
 
23
23
  /**
@@ -1 +1 @@
1
- export{DEVICE_FIELD_MARKER,DEVICE_HIDDEN_ATTR,DEVICE_NOTE,deviceField,deviceMetaOf,deviceNote,shownTier,withoutDeviceGate}from"../../../chunk-6Z5VENIE.js";import"../../../chunk-7F52SZOI.js";import"../../../chunk-BSPCSC45.js";import"../../../chunk-5F3PKNT7.js";import"../../../chunk-MFIRYGHW.js";
1
+ export{DEVICE_FIELD_MARKER,DEVICE_HIDDEN_ATTR,DEVICE_NOTE,deviceField,deviceMetaOf,deviceNote,shownTier,withoutDeviceGate}from"../../../chunk-OGCROOTI.js";import"../../../chunk-7F52SZOI.js";import"../../../chunk-BSPCSC45.js";import"../../../chunk-JTUUIVBZ.js";import"../../../chunk-MFIRYGHW.js";
@@ -1 +1 @@
1
- export{rootRowName,sectionRenameProp,slotChildName,slotChildRenameProp,slotChildRowName}from"../../../chunk-TBF5CVPA.js";import"../../../chunk-DUVRZ456.js";import"../../../chunk-6W7WLPZH.js";
1
+ export{rootRowName,sectionRenameProp,slotChildName,slotChildRenameProp,slotChildRowName}from"../../../chunk-BHRC3ASL.js";import"../../../chunk-6W7WLPZH.js";import"../../../chunk-DUVRZ456.js";
@@ -11,7 +11,7 @@ import '../../../types-41704JE4.js';
11
11
  import '../../../resolve-D68pb3Bx.js';
12
12
  import '../../../plan-xc48tt77.js';
13
13
  import '../../../watch-BTYOJpQU.js';
14
- import '../../../types-Dt1CFR1S.js';
14
+ import '../../../types-DGyDHiJV.js';
15
15
  import '../../../types-CsgMwHHa.js';
16
16
  import '../../../wordFit-7XpmhcaW.js';
17
17
  import '../../../edit-lock/index.js';
@@ -25,7 +25,7 @@ import '../../components/AddSidePanel.js';
25
25
  import '../section-template-types.js';
26
26
  import './content-tree.js';
27
27
  import './block-choice.js';
28
- import '../../../host-CiuzZJXj.js';
28
+ import '../../../host-Ud6rLpph.js';
29
29
  import '../document-contract.js';
30
30
  import '../session.js';
31
31
  import '../backend-error.js';
@@ -34,7 +34,7 @@ import '../links/link-filters.js';
34
34
  import 'efficient-shell/ui';
35
35
  import '../document-hooks.js';
36
36
  import '../document-switch.js';
37
- import '../../../engine-DBxp_v6B.js';
37
+ import '../../../engine-CvXpFE86.js';
38
38
  import '../admin-bridge.js';
39
39
  import './add-target-types.js';
40
40
  import './slot-section-spec.js';
@@ -1 +1 @@
1
- export{copyNodeStyle,nodeStyleRows,planNodePaste,shopFieldKind,siteStyleScope,styleClipboardOf}from"../../../chunk-MVQEEWTE.js";import"../../../chunk-ZE7I3PLX.js";import"../../../chunk-6Z5VENIE.js";import"../../../chunk-7F52SZOI.js";import"../../../chunk-MQNBD6AB.js";import"../../../chunk-DUVRZ456.js";import"../../../chunk-BSPCSC45.js";import"../../../chunk-V7U33NF2.js";import"../../../chunk-6WY6ZXJG.js";import"../../../chunk-5F3PKNT7.js";import"../../../chunk-MFIRYGHW.js";
1
+ export{copyNodeStyle,nodeStyleRows,planNodePaste,shopFieldKind,siteStyleScope,styleClipboardOf}from"../../../chunk-BRDCD4LK.js";import"../../../chunk-ZE7I3PLX.js";import"../../../chunk-OGCROOTI.js";import"../../../chunk-7F52SZOI.js";import"../../../chunk-MQNBD6AB.js";import"../../../chunk-DUVRZ456.js";import"../../../chunk-BSPCSC45.js";import"../../../chunk-V7U33NF2.js";import"../../../chunk-6WY6ZXJG.js";import"../../../chunk-JTUUIVBZ.js";import"../../../chunk-MFIRYGHW.js";
@@ -0,0 +1,75 @@
1
+ import { A as AutosaveSnapshot } from '../../engine-CvXpFE86.js';
2
+ import { a as SaveIconState } from '../../types-DGyDHiJV.js';
3
+ import { ScreenSaveStatusWords } from '../words.js';
4
+ import '../../types-CsgMwHHa.js';
5
+ import '../../wordFit-7XpmhcaW.js';
6
+ import 'react';
7
+ import '../../edit-lock/index.js';
8
+ import '../../panelWidths-D9hTLR25.js';
9
+
10
+ /**
11
+ * WHAT THE SAVE IS DOING, AS ONE ANSWER (8.0.0, card [DESIGN] A Clearer Save
12
+ * In Both Editors, build plan E1).
13
+ *
14
+ * The B3 bar says the save in three places — the save icon (a glyph and its
15
+ * Tooltip), the save menu's status row, and the main button, which is off
16
+ * while the save stops it — and all three read THIS, so they never disagree.
17
+ * One rule for both editors (Lewis, 2026-10-15: the website editor and the
18
+ * email designer are one editor); a layer differs only by the suffix it hands
19
+ * the status row (`ScreenMainAction.status`).
20
+ *
21
+ * Which state, first match wins:
22
+ *
23
+ * locked the document is frozen (its reason), somebody else holds it
24
+ * (the notice's sentence), or a save was refused (the notice below);
25
+ * paused the operator turned auto-save off — their choice outranks a
26
+ * failure, as `saveIndicator`'s precedence has it;
27
+ * offline the browser says so, or the last save could not reach the server;
28
+ * failed a save failed and the backoff will try again;
29
+ * saving / the edit has been off the server for FIVE SECONDS (the autosave's
30
+ * pending `unsaved`): a write is out, or none yet;
31
+ * saved everything else — typing included, because an edit younger
32
+ * than five seconds changes nothing (the 5-second rule), so the
33
+ * icon never flickers while somebody types.
34
+ */
35
+ interface SaveStatusInput {
36
+ state: AutosaveSnapshot;
37
+ /** Now, by the same clock as the snapshot's `savedAt` and `retryAt`. */
38
+ now: number;
39
+ /** The browser is offline, or the last failed save could not reach the server. */
40
+ offline: boolean;
41
+ /** Why the document may never be written (frozen), or null. */
42
+ readOnlyReason: string | null;
43
+ /** The notice's sentence while somebody else holds the document
44
+ * ("Jane Doe is editing this page"), or null. */
45
+ editing: string | null;
46
+ /** A save was refused (`saveConflict`). */
47
+ conflict: boolean;
48
+ /** "Not saving — see the notice below" (`screen.bar.notSaving`). */
49
+ notSaving: string;
50
+ }
51
+ interface SaveStatus {
52
+ state: SaveIconState;
53
+ /** The state in words: the icon's Tooltip and name. */
54
+ label: string;
55
+ /** The menu's status row: the words, and the layer's suffix after " · "
56
+ * while the save is calm (saved, saving); trouble is said alone. */
57
+ line: (suffix: string | null | undefined) => string;
58
+ /** Why the main button is off, when it is the save (or the lock) that stops
59
+ * it; null when nothing does. */
60
+ blocked: string | null;
61
+ /** "Save now" says "Retry now": a save failed, or the editor is offline. */
62
+ retry: boolean;
63
+ }
64
+ declare function describeSave(input: SaveStatusInput, words: ScreenSaveStatusWords): SaveStatus;
65
+ /**
66
+ * Now, by the wall clock, moving once a second while `ticking` — so "Saved 2
67
+ * seconds ago" and "trying again in 15 s" stay true while they are on screen.
68
+ * Only the small part that says them re-renders; still otherwise.
69
+ */
70
+ declare function useNow(ticking: boolean): number;
71
+ /** Whether the browser says it is offline, kept current by its `online` and
72
+ * `offline` events. False where there is no browser. */
73
+ declare function useBrowserOffline(): boolean;
74
+
75
+ export { type SaveStatus, type SaveStatusInput, describeSave, useBrowserOffline, useNow };
@@ -0,0 +1 @@
1
+ export{describeSave,useBrowserOffline,useNow}from"../../chunk-RKTF5XLP.js";
@@ -2,7 +2,7 @@ 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-Dt1CFR1S.js';
5
+ import { D as DeviceOption } from '../../types-DGyDHiJV.js';
6
6
  import { P as Place } from '../../types-41704JE4.js';
7
7
  import { M as MeasuredCanvas, C as CanvasDragModel } from '../../CanvasDragLayer-CLb7j-CZ.js';
8
8
  import { E as EaselContextMenuItem } from '../../types-BsyPh6EW.js';
@@ -10,7 +10,7 @@ import { a as EaselRailItem } from '../../types-CsgMwHHa.js';
10
10
  import { StyleRow } from '../../style-clipboard/index.js';
11
11
  import { T as TreeRowMark } from '../../types-BLRK6_JO.js';
12
12
  import { AddKey } from '../components/AddSidePanel.js';
13
- import { k as AnyScreenTarget } from '../../host-CiuzZJXj.js';
13
+ import { k as AnyScreenTarget } from '../../host-Ud6rLpph.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';
@@ -30,7 +30,7 @@ import './section-template-types.js';
30
30
  import './puck/block-choice.js';
31
31
  import './document-contract.js';
32
32
  import './document-switch.js';
33
- import '../../engine-DBxp_v6B.js';
33
+ import '../../engine-CvXpFE86.js';
34
34
  import './admin-bridge.js';
35
35
  import './backend-error.js';
36
36
  import './links/link-filters.js';
@@ -355,6 +355,39 @@ interface ScreenTreeFolds extends ScreenTreeRows {
355
355
  isCollapsed: (id: string) => boolean;
356
356
  toggleCollapse: (id: string) => void;
357
357
  }
358
+ /**
359
+ * A layer's main action, as data (`ScreenBridges.mainAction`, 8.0.0). The
360
+ * screen draws it; the layer draws nothing. Words are the layer's, already in
361
+ * its language.
362
+ */
363
+ interface ScreenMainAction {
364
+ /** The main half's word: "Publish", "Save and close". */
365
+ label: string;
366
+ /** Its Tooltip while it can be pressed ("Saves your changes and goes back to
367
+ * the campaign. Nothing is sent."). */
368
+ tooltip?: string;
369
+ /** What a press does. */
370
+ onPress: () => void;
371
+ /**
372
+ * The quiet form, while there is nothing for the action to do: the main
373
+ * half becomes secondary, with a check glyph, these words, and off with
374
+ * `reason` ("Published" / "Everything is live"). The chevron still opens.
375
+ * Absent or null: never quiet.
376
+ */
377
+ quiet?: {
378
+ label: string;
379
+ reason: string;
380
+ } | null;
381
+ /** A reason of the layer's own to turn the main half off, besides the
382
+ * screen's (a lock, a refused save, offline, a failed save). */
383
+ disabledReason?: string | null;
384
+ /** What the menu's status row says after the save ("Saved 2 seconds ago ·
385
+ * Changes not live yet"): "Changes not live yet", "Everything is live",
386
+ * "Never published", "Draft, nothing is sent". */
387
+ status?: string | null;
388
+ /** The action is running: the main half shows the shell's spinner. */
389
+ busy?: boolean;
390
+ }
358
391
  /** What a layer's bridges give back for the screen to place. */
359
392
  interface ScreenBridges {
360
393
  /** A row under the Add panel's tiles, for something that is not a block.
@@ -385,15 +418,17 @@ interface ScreenBridges {
385
418
  sectionPressed?: (node: ScreenNode | undefined) => void;
386
419
  /**
387
420
  * The layer's own controls in the top bar's right cluster. The screen draws
388
- * that cluster as the save state, Refresh and the main button; a layer has
389
- * two places in it. `barLead` stands FIRST among the actions, between the
390
- * save state and Refresh: something done with the whole document that only
391
- * the layer has. What comes back is placed as it is, and a layer with
392
- * nothing to offer just now returns nothing.
421
+ * that cluster as the save icon and the main button (8.0.0; it was the save
422
+ * pill, Refresh and the main button); a layer has two places in it.
423
+ * `barLead` stands FIRST among the actions, right after the save icon:
424
+ * something done with the whole document that only the layer has. What
425
+ * comes back is placed as it is, and a layer with nothing to offer just now
426
+ * returns nothing.
393
427
  */
394
428
  barLead?: () => ReactNode;
395
- /** …and `barTrail` stands between Refresh and the main button: a way out to
396
- * where the document is read. */
429
+ /** …and `barTrail` stands just before the main button: a way out to where
430
+ * the document is read (the website's Preview, the email designer's "Send
431
+ * a test email"). */
397
432
  barTrail?: () => ReactNode;
398
433
  /**
399
434
  * …and `barMain` IS the main button, in its place at the end of the cluster
@@ -404,6 +439,18 @@ interface ScreenBridges {
404
439
  * own button, as it always has.
405
440
  */
406
441
  barMain?: () => ReactNode;
442
+ /**
443
+ * THE MAIN ACTION, AS DATA (8.0.0, card [DESIGN] A Clearer Save In Both
444
+ * Editors): what the layer's main button says and does, for the screen to
445
+ * draw as the shell's `SplitButton` with the save menu on its chevron. The
446
+ * website's is Publish (quiet as "Published" while everything is live); the
447
+ * email designer's is Save and close. The screen turns the main half off,
448
+ * with the reason, while the document is locked, frozen, refused, offline or
449
+ * holding a failed save; the chevron always opens. Handed back each render,
450
+ * so it follows the layer's state. Wins over `barMain`; with neither, the
451
+ * screen's own Done (`screen.done`) stands in the same split button.
452
+ */
453
+ mainAction?: ScreenMainAction | null;
407
454
  /**
408
455
  * The layer's own buttons in the rail. The screen draws the rail as Add, its
409
456
  * own Layers and the host's Media library; a layer has two places in it.
@@ -1230,12 +1277,11 @@ interface ScreenParts {
1230
1277
  * plain functions, and handed here for the reason the rules are. */
1231
1278
  pinned?: ScreenPinnedNodes;
1232
1279
  /**
1233
- * Is the save pill also the autosave's on / off switch (0.103.0)? The screen
1234
- * draws the pill as a button that pauses the autosave and resumes it; a
1235
- * layer whose editor always saves (the campaign designer) says false, and the
1236
- * pill is the same words and the same dot with nothing to press. "Retry now"
1237
- * stays beside a failed save either way. Absent, true: the switch, as the
1238
- * website has it.
1280
+ * May the operator pause the autosave (0.103.0)? Since 8.0.0 the switch is
1281
+ * the save menu's Auto-save check box (the main button's ▾), where it was
1282
+ * the save pill; a layer whose editor always saves says false, and the menu
1283
+ * offers Save now alone. "Retry now" stays after a failed save either way.
1284
+ * Absent, true: the switch, as both editors have it.
1239
1285
  */
1240
1286
  saveSwitch?: boolean;
1241
1287
  /**
@@ -1415,4 +1461,4 @@ declare function useScreenCanvasTarget(): CanvasTarget | null;
1415
1461
  * engine's plain rows for the selection. */
1416
1462
  declare function useScreenInspectorPanel(): ComponentType<ScreenInspectorPanelProps>;
1417
1463
 
1418
- export { type NodeDefaults, SELECTION_MODE, type ScreenAdd, type ScreenBlockLook, type ScreenBlockRules, type ScreenBridges, type ScreenCanvas, type ScreenCanvasDrag, type ScreenCanvasDragContext, type ScreenCanvasHeadProps, ScreenCanvasTargetProvider, type ScreenDevices, type ScreenDocumentOps, type ScreenDragItem, type ScreenInspector, type ScreenInspectorMode, type ScreenInspectorPanelProps, type ScreenLeftPanel, type ScreenLeftView, type ScreenLeftViewFrame, type ScreenLeftViewRules, type ScreenMenuRows, type ScreenNewNode, type ScreenNode, type ScreenNodeActions, type ScreenNodeLevel, type ScreenNodeMaker, type ScreenPartMode, type ScreenParts, ScreenPartsProvider, type ScreenPinnedBand, type ScreenPinnedNodes, type ScreenRailItem, type ScreenSelection, type ScreenSelector, type ScreenSlot, type ScreenSlotAction, type ScreenSlotMode, type ScreenStyleClipboard, type ScreenStyleDocument, type ScreenStylePastePlan, type ScreenToastExtra, type ScreenTree, type ScreenTreeFolds, type ScreenTreeRows, isPinnedFirst, isPinnedLast, isSlotMode, sameInspectorMode, screenSlotsOf, useScreenAdd, useScreenBlockLook, useScreenBlockRules, useScreenBridges, useScreenCanvasDrag, useScreenCanvasFrame, useScreenCanvasHead, useScreenCanvasTarget, useScreenDevices, useScreenDocumentLabel, useScreenDocumentPass, useScreenInspectorPanel, useScreenLeftView, useScreenNodeKeys, useScreenNotify, useScreenOwnerName, useScreenParts, useScreenPickFollowsSelection, useScreenPinned, useScreenSaveSwitch, useScreenStorageNamespace, useScreenStyleClipboard, useStandaloneScreenBridges };
1464
+ export { type NodeDefaults, SELECTION_MODE, type ScreenAdd, type ScreenBlockLook, type ScreenBlockRules, type ScreenBridges, type ScreenCanvas, type ScreenCanvasDrag, type ScreenCanvasDragContext, type ScreenCanvasHeadProps, ScreenCanvasTargetProvider, type ScreenDevices, type ScreenDocumentOps, type ScreenDragItem, type ScreenInspector, type ScreenInspectorMode, type ScreenInspectorPanelProps, type ScreenLeftPanel, type ScreenLeftView, type ScreenLeftViewFrame, type ScreenLeftViewRules, type 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 ScreenSelection, 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, useScreenAdd, useScreenBlockLook, useScreenBlockRules, useScreenBridges, useScreenCanvasDrag, useScreenCanvasFrame, useScreenCanvasHead, useScreenCanvasTarget, useScreenDevices, useScreenDocumentLabel, useScreenDocumentPass, useScreenInspectorPanel, useScreenLeftView, useScreenNodeKeys, useScreenNotify, useScreenOwnerName, useScreenParts, useScreenPickFollowsSelection, useScreenPinned, useScreenSaveSwitch, useScreenStorageNamespace, useScreenStyleClipboard, useStandaloneScreenBridges };
@@ -812,3 +812,11 @@
812
812
  align-items: center;
813
813
  padding-top: 12px;
814
814
  }
815
+
816
+ /* The save menu's "Save now ⌘S" row (8.0.0): the word and the shell's Kbd
817
+ badge on one line, apart. Layout only; both are the shell's to draw. */
818
+ .es-savemenu-row {
819
+ display: inline-flex;
820
+ align-items: center;
821
+ gap: 12px;
822
+ }
@@ -107,19 +107,74 @@ type ScreenLeaveWords = {
107
107
  type ScreenBarWords = {
108
108
  undo: string;
109
109
  redo: string;
110
- /** The button that reloads the canvas alone, and its tooltip. */
110
+ /** The icon button that reloads the canvas alone (its accessible name), and
111
+ * its tooltip (8.0.0: "Reload the preview", where it was the word button
112
+ * "Refresh"). */
111
113
  refresh: string;
112
114
  refreshTip: string;
113
- /** The pill while nothing may be saved and the notice under the bar says why. */
115
+ /** The save icon's words while a save was refused and the notice under the
116
+ * bar says why. */
114
117
  notSaving: string;
115
- /** Beside a failed save, which retries by itself: try now. */
118
+ /** The save menu's "Save now" after a failed save or while offline: try now. */
116
119
  retry: string;
117
- /** The pill's switch: its tooltip while autosave is paused, and while it runs. */
120
+ /** @deprecated Not drawn since 8.0.0: the pill's switch left the bar for
121
+ * the save menu's Auto-save check box (`autoSave`). Kept so a host that
122
+ * still says it compiles. */
118
123
  autoSaveOff: string;
124
+ /** @deprecated Not drawn since 8.0.0 (see `autoSaveOff`). */
119
125
  autoSaveOn: string;
120
126
  /** The rail's accessible name: the left panel's views. */
121
127
  views: string;
128
+ /** The main button's chevron, and the menu it opens (8.0.0). */
129
+ saveOptions: string;
130
+ /** The menu's check box: ticked while the autosave runs (8.0.0). */
131
+ autoSave: string;
132
+ /** The menu's "write what is held, now" — also ⌘S (8.0.0). */
133
+ saveNow: string;
122
134
  };
135
+ /**
136
+ * WHAT THE SAVE SAYS (8.0.0, card [DESIGN] A Clearer Save In Both Editors):
137
+ * the save icon's tooltip and the first part of the save menu's status row,
138
+ * one sentence per state, the same in both editors; and why the main button is
139
+ * off when it is the save that stops it. No count anywhere: nothing counts
140
+ * held changes.
141
+ */
142
+ type ScreenSaveStatusWords = {
143
+ /** Saved, with the time since the last save landed, in whole seconds. */
144
+ savedAgo: (v: {
145
+ seconds: number;
146
+ }) => string;
147
+ /** Saved, with no save landed yet: an untouched document. */
148
+ saved: string;
149
+ /** A write is out for an edit five seconds old. */
150
+ saving: string;
151
+ /** An edit five seconds old, with no write out yet. */
152
+ pending: string;
153
+ /** A save failed; the next try is in `seconds`… */
154
+ failedIn: (v: {
155
+ seconds: number;
156
+ }) => string;
157
+ /** …or at a time the screen does not know. */
158
+ failedSoon: string;
159
+ /** The browser is offline, or the server could not be reached. */
160
+ offline: string;
161
+ /** Auto-save is paused and an edit is held… */
162
+ pausedHeld: string;
163
+ /** …and with nothing held. */
164
+ paused: string;
165
+ /** Somebody else holds the document; `editing` is the notice's sentence
166
+ * ("Jane Doe is editing this page"). */
167
+ locked: (v: {
168
+ editing: string;
169
+ }) => string;
170
+ /** The main button is off: offline… */
171
+ blockedOffline: string;
172
+ /** …a save failed and its edit is still held… */
173
+ blockedFailed: string;
174
+ /** …a save was refused. */
175
+ blockedConflict: string;
176
+ };
177
+ declare const DEFAULT_SCREEN_SAVE_STATUS_WORDS: ScreenSaveStatusWords;
123
178
  /**
124
179
  * THE RIGHT-CLICK MENU'S OWN ROWS BESIDES A NODE'S (3.1.0): the page's (Undo,
125
180
  * Redo, Add section, Collapse all layers), a text box's Select all, the line a
@@ -215,6 +270,8 @@ type ScreenWords = {
215
270
  leave: ScreenLeaveWords;
216
271
  /** The top bar's own words. */
217
272
  bar: ScreenBarWords;
273
+ /** What the save says: the save icon and the save menu's status row (8.0.0). */
274
+ saveStatus: ScreenSaveStatusWords;
218
275
  /** The right-click menu's rows besides a node's. */
219
276
  menu: ScreenMenuWords;
220
277
  /** The Layers tree: the rail's item and the panel's title. */
@@ -283,4 +340,4 @@ type ScreenWords = {
283
340
  };
284
341
  declare const DEFAULT_SCREEN_WORDS: ScreenWords;
285
342
 
286
- export { DEFAULT_SCREEN_ADD_WORDS, DEFAULT_SCREEN_WORDS, type ScreenAddWords, type ScreenBarWords, type ScreenLeaveWords, type ScreenMenuWords, type ScreenWords };
343
+ export { DEFAULT_SCREEN_ADD_WORDS, DEFAULT_SCREEN_SAVE_STATUS_WORDS, DEFAULT_SCREEN_WORDS, type ScreenAddWords, type ScreenBarWords, type ScreenLeaveWords, type ScreenMenuWords, type ScreenSaveStatusWords, type ScreenWords };
@@ -1 +1 @@
1
- export{DEFAULT_SCREEN_ADD_WORDS,DEFAULT_SCREEN_WORDS}from"../chunk-5F3PKNT7.js";
1
+ export{DEFAULT_SCREEN_ADD_WORDS,DEFAULT_SCREEN_SAVE_STATUS_WORDS,DEFAULT_SCREEN_WORDS}from"../chunk-JTUUIVBZ.js";
@@ -1,4 +1,4 @@
1
- import { S as SaveWords } from '../words-CvFnwGSr.js';
1
+ import { S as SaveWords } from '../words-pgIK0I6g.js';
2
2
  import { N as NoticeWords, C as ChromeWords } from '../words-C1U_dLBh.js';
3
3
  import { C as CopyWords } from '../words-BAnsDT16.js';
4
4
  import { D as DragWords } from '../words-BDignMl_.js';
@@ -12,12 +12,12 @@ export { ScreenAddWords } from '../screen/words.js';
12
12
  import { S as StyleClipboardWords } from '../words-CnnHb9jo.js';
13
13
  import { T as TextStylesWords } from '../words-CRYvAiHX.js';
14
14
  import { T as TreeWords } from '../words-Cl9xMUYY.js';
15
- import '../types-Dt1CFR1S.js';
15
+ import '../types-DGyDHiJV.js';
16
16
  import '../types-CsgMwHHa.js';
17
17
  import '../wordFit-7XpmhcaW.js';
18
18
  import 'react';
19
19
  import '../panelWidths-D9hTLR25.js';
20
- import '../engine-DBxp_v6B.js';
20
+ import '../engine-CvXpFE86.js';
21
21
  import '../markup/index.js';
22
22
  import '../buckets-Tj-nkBpg.js';
23
23
 
@@ -1 +1 @@
1
- export{DEFAULT_EASEL_STRINGS,mergeEaselStrings}from"../chunk-JVTSUA2U.js";import"../chunk-M6F6LS3H.js";import"../chunk-ZAOM6PFH.js";import"../chunk-6WY6ZXJG.js";import"../chunk-5F3PKNT7.js";import"../chunk-TBY3DFKS.js";import"../chunk-K56YDHYQ.js";import"../chunk-KFV7N2DJ.js";import"../chunk-WK3AFPXY.js";import"../chunk-H6DDIBQ4.js";import"../chunk-Y2G7CU6A.js";import"../chunk-RE4LP46F.js";import"../chunk-2OAZYSWJ.js";import"../chunk-AUT242JK.js";import"../chunk-FFYXVAAL.js";import"../chunk-546BBOPE.js";import"../chunk-O2NLQBFX.js";
1
+ export{DEFAULT_EASEL_STRINGS,mergeEaselStrings}from"../chunk-SQMUAXUS.js";import"../chunk-M6F6LS3H.js";import"../chunk-ZAOM6PFH.js";import"../chunk-6WY6ZXJG.js";import"../chunk-JTUUIVBZ.js";import"../chunk-TBY3DFKS.js";import"../chunk-K56YDHYQ.js";import"../chunk-KFV7N2DJ.js";import"../chunk-WK3AFPXY.js";import"../chunk-H6DDIBQ4.js";import"../chunk-Y2G7CU6A.js";import"../chunk-RE4LP46F.js";import"../chunk-2OAZYSWJ.js";import"../chunk-AUT242JK.js";import"../chunk-FFYXVAAL.js";import"../chunk-546BBOPE.js";import"../chunk-O2NLQBFX.js";
@@ -10,18 +10,18 @@ export { LockWords } from '../edit-lock/index.js';
10
10
  export { N as NodeMenuWords } from '../words-DMG4dYq2.js';
11
11
  export { P as PanelWords } from '../words-zH1H0WFw.js';
12
12
  export { P as PickWords } from '../words-is_Vy6hn.js';
13
- export { S as SaveWords } from '../words-CvFnwGSr.js';
13
+ export { S as SaveWords } from '../words-pgIK0I6g.js';
14
14
  export { ScreenAddWords, ScreenWords } from '../screen/words.js';
15
15
  export { S as StyleClipboardWords } from '../words-CnnHb9jo.js';
16
16
  export { T as TextStylesWords } from '../words-CRYvAiHX.js';
17
17
  export { T as TreeWords } from '../words-Cl9xMUYY.js';
18
18
  import '../markup/index.js';
19
19
  import '../buckets-Tj-nkBpg.js';
20
- import '../types-Dt1CFR1S.js';
20
+ import '../types-DGyDHiJV.js';
21
21
  import '../types-CsgMwHHa.js';
22
22
  import '../wordFit-7XpmhcaW.js';
23
23
  import '../panelWidths-D9hTLR25.js';
24
- import '../engine-DBxp_v6B.js';
24
+ import '../engine-CvXpFE86.js';
25
25
 
26
26
  interface EaselStringsProviderProps {
27
27
  /**
@@ -1,2 +1,2 @@
1
- import{DEFAULT_EASEL_STRINGS as r,mergeEaselStrings as n}from"../chunk-JVTSUA2U.js";export{DEFAULT_EASEL_STRINGS,mergeEaselStrings}from"../chunk-JVTSUA2U.js";import"../chunk-M6F6LS3H.js";import"../chunk-ZAOM6PFH.js";import"../chunk-6WY6ZXJG.js";import"../chunk-5F3PKNT7.js";import"../chunk-TBY3DFKS.js";import"../chunk-K56YDHYQ.js";import"../chunk-KFV7N2DJ.js";import"../chunk-WK3AFPXY.js";import"../chunk-H6DDIBQ4.js";import"../chunk-Y2G7CU6A.js";import"../chunk-RE4LP46F.js";import"../chunk-2OAZYSWJ.js";import"../chunk-AUT242JK.js";import"../chunk-FFYXVAAL.js";import"../chunk-546BBOPE.js";import{stringsContext as o}from"../chunk-MFIRYGHW.js";import"../chunk-O2NLQBFX.js";import{useContext as t,useMemo as c}from"react";import{jsx as i}from"react/jsx-runtime";function s({value:s,locale:u,children:m}){const e=o(),p=t(e),h=p?.strings??r,j=u??p?.locale??"en",k=c(()=>({strings:n(h,s),locale:j}),[h,s,j]);/* @__PURE__ */
1
+ import{DEFAULT_EASEL_STRINGS as r,mergeEaselStrings as n}from"../chunk-SQMUAXUS.js";export{DEFAULT_EASEL_STRINGS,mergeEaselStrings}from"../chunk-SQMUAXUS.js";import"../chunk-M6F6LS3H.js";import"../chunk-ZAOM6PFH.js";import"../chunk-6WY6ZXJG.js";import"../chunk-JTUUIVBZ.js";import"../chunk-TBY3DFKS.js";import"../chunk-K56YDHYQ.js";import"../chunk-KFV7N2DJ.js";import"../chunk-WK3AFPXY.js";import"../chunk-H6DDIBQ4.js";import"../chunk-Y2G7CU6A.js";import"../chunk-RE4LP46F.js";import"../chunk-2OAZYSWJ.js";import"../chunk-AUT242JK.js";import"../chunk-FFYXVAAL.js";import"../chunk-546BBOPE.js";import{stringsContext as o}from"../chunk-MFIRYGHW.js";import"../chunk-O2NLQBFX.js";import{useContext as t,useMemo as c}from"react";import{jsx as i}from"react/jsx-runtime";function s({value:s,locale:u,children:m}){const e=o(),p=t(e),h=p?.strings??r,j=u??p?.locale??"en",k=c(()=>({strings:n(h,s),locale:j}),[h,s,j]);/* @__PURE__ */
2
2
  return i(e.Provider,{value:k,children:m})}function u(){return t(o())?.strings??r}function m(){return t(o())?.locale??"en"}export{s as EaselStringsProvider,m as useEaselLocale,u as useEaselStrings};
@@ -23,6 +23,9 @@ type TopBarClusterProps = {
23
23
  type EaselIconButtonProps = {
24
24
  /** Tooltip AND accessible name. An icon-only button has no other. */
25
25
  label: string;
26
+ /** The tooltip, where it says more than the name ("Reload the preview
27
+ * (keeps your place)", 8.0.0). Absent: the tooltip is `label`. */
28
+ tip?: ReactNode;
26
29
  onClick?: () => void;
27
30
  disabled?: boolean;
28
31
  /**
@@ -207,5 +210,14 @@ type EditNoticeProps = {
207
210
  /** Throw this screen away and load what is saved — the only action that discards work. */
208
211
  onReload: () => void;
209
212
  };
213
+ /** The seven states of the save icon (8.0.0). */
214
+ type SaveIconState = 'saved' | 'saving' | 'pending' | 'failed' | 'offline' | 'paused' | 'locked';
215
+ /** The tone a save state is drawn in: the chrome's tokens, never a colour. */
216
+ type SaveIconTone = 'muted' | 'danger' | 'warning';
217
+ type SaveIconProps = {
218
+ state: SaveIconState;
219
+ /** The state in words: the Tooltip, and the icon's accessible name. */
220
+ label: string;
221
+ };
210
222
 
211
- export type { DeviceOption as D, EaselIconButtonProps as E, InspectorHeadProps as I, MediaPanelHeadProps as M, PanelResizeHandleProps as P, RailWordsShown as R, SaveTone as S, TopBarProps as T, TopBarClusterProps as a, TopBarRailProps as b, DeviceSwitchProps as c, SaveStateProps as d, SaveStateToggleProps as e, InspectorIconButtonProps as f, InspectorUpLevelProps as g, MediaPickKind as h, EditNoticeProps as i };
223
+ export type { DeviceOption as D, EaselIconButtonProps as E, InspectorHeadProps as I, MediaPanelHeadProps as M, PanelResizeHandleProps as P, RailWordsShown as R, SaveTone as S, TopBarProps as T, SaveIconState as a, TopBarClusterProps as b, TopBarRailProps as c, DeviceSwitchProps as d, SaveStateProps as e, SaveStateToggleProps as f, SaveIconProps as g, SaveIconTone as h, InspectorIconButtonProps as i, InspectorUpLevelProps as j, MediaPickKind as k, EditNoticeProps as l };
@@ -1,5 +1,5 @@
1
- import { S as SaveTone } from './types-Dt1CFR1S.js';
2
- import { A as AutosaveSnapshot } from './engine-DBxp_v6B.js';
1
+ import { S as SaveTone } from './types-DGyDHiJV.js';
2
+ import { A as AutosaveSnapshot } from './engine-CvXpFE86.js';
3
3
 
4
4
  /**
5
5
  * What the save pill says, for both editors — ONE copy.