efficient-easel 3.7.0 → 5.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 (80) hide show
  1. package/README.md +13 -0
  2. package/dist/buckets-Tj-nkBpg.d.ts +28 -0
  3. package/dist/chrome/chrome.css +30 -2
  4. package/dist/chrome/index.js +1 -1
  5. package/dist/chunk-37DMJPHL.js +14 -0
  6. package/dist/chunk-3GX7XBAF.js +5 -0
  7. package/dist/chunk-3ZJSLHHI.js +8 -0
  8. package/dist/chunk-4JSBIW5H.js +9 -0
  9. package/dist/{chunk-42TMLDSQ.js → chunk-6TOYXESC.js} +1 -1
  10. package/dist/chunk-BXQBCW3P.js +1 -0
  11. package/dist/{chunk-CRG625FM.js → chunk-C7ERK4DF.js} +3 -3
  12. package/dist/chunk-CRWFB7MU.js +21 -0
  13. package/dist/{chunk-RKSKUGWC.js → chunk-ETDRAF3O.js} +65 -65
  14. package/dist/{chunk-LZ6EGT4Y.js → chunk-G5JILVHG.js} +1 -1
  15. package/dist/{chunk-2I7MAA2U.js → chunk-HQWQLDCB.js} +1 -1
  16. package/dist/{chunk-XBNOEQMR.js → chunk-I7ER3P4U.js} +1 -1
  17. package/dist/chunk-KFV7N2DJ.js +1 -0
  18. package/dist/{chunk-SCPCXNTB.js → chunk-KJ2RODGT.js} +1 -1
  19. package/dist/chunk-KSTX646X.js +5 -0
  20. package/dist/chunk-MQNBD6AB.js +1 -0
  21. package/dist/{chunk-5SOSVTVI.js → chunk-PFNIVZPN.js} +1 -1
  22. package/dist/{chunk-6N64PNWF.js → chunk-RQWJOPRB.js} +1 -1
  23. package/dist/{chunk-GTDLBUOC.js → chunk-UB4TLWVJ.js} +6 -6
  24. package/dist/{chunk-MUZNA23W.js → chunk-UQ6CD3K2.js} +1 -1
  25. package/dist/{chunk-WSNVBUPL.js → chunk-Y324X4U4.js} +1 -1
  26. package/dist/drag/drag.css +5 -56
  27. package/dist/drag/index.js +1 -1
  28. package/dist/easel/index.d.ts +2 -2
  29. package/dist/fields/fields.css +4 -0
  30. package/dist/fields/index.d.ts +103 -51
  31. package/dist/fields/index.js +1 -1
  32. package/dist/panel/index.d.ts +8 -2
  33. package/dist/panel/index.js +19 -12
  34. package/dist/panel/panel.css +19 -0
  35. package/dist/screen/components/AddBlockRow.js +1 -1
  36. package/dist/screen/components/AddSidePanel.js +1 -1
  37. package/dist/screen/components/MediaSidePanel.js +1 -1
  38. package/dist/screen/components/NodeContextMenu.d.ts +1 -1
  39. package/dist/screen/components/PageEditGuardNotices.js +1 -1
  40. package/dist/screen/components/ScreenChrome.js +1 -1
  41. package/dist/screen/components/ScreenMount.d.ts +1 -1
  42. package/dist/screen/components/ScreenMount.js +1 -1
  43. package/dist/screen/components/ScreenStoreProvider.d.ts +1 -1
  44. package/dist/screen/components/ScreenStoreProvider.js +1 -1
  45. package/dist/screen/components/SectionScreenShell.js +15 -15
  46. package/dist/screen/components/SidePanelHead.js +1 -1
  47. package/dist/screen/components/panel-widths.js +1 -1
  48. package/dist/screen/components/usePartBridge.d.ts +1 -1
  49. package/dist/screen/components/usePartBridge.js +1 -1
  50. package/dist/screen/index.d.ts +1 -1
  51. package/dist/screen/index.js +1 -1
  52. package/dist/screen/lib/puck/field-buckets.d.ts +20 -6
  53. package/dist/screen/lib/puck/field-buckets.js +1 -1
  54. package/dist/screen/lib/puck/style-clipboard.d.ts +15 -6
  55. package/dist/screen/lib/puck/style-clipboard.js +1 -1
  56. package/dist/screen/lib/puck/use-section-ops.js +1 -1
  57. package/dist/screen/lib/screen-parts.d.ts +1 -1
  58. package/dist/screen/lib/screen-parts.js +1 -1
  59. package/dist/screen/screen.css +9 -42
  60. package/dist/strings/catalogue.d.ts +2 -2
  61. package/dist/strings/catalogue.js +1 -1
  62. package/dist/strings/index.d.ts +2 -2
  63. package/dist/strings/index.js +1 -1
  64. package/dist/tree/index.d.ts +8 -4
  65. package/dist/tree/index.js +1 -1
  66. package/dist/tree/tree.css +6 -3
  67. package/dist/{types-BqGnUVX5.d.ts → types-BLRK6_JO.d.ts} +7 -0
  68. package/dist/{types-CWxUxPGO.d.ts → types-OUl0mK1k.d.ts} +5 -2
  69. package/dist/{words-BGrHZAJJ.d.ts → words-zH1H0WFw.d.ts} +8 -3
  70. package/package.json +3 -3
  71. package/dist/buckets-CuLM47h9.d.ts +0 -13
  72. package/dist/chunk-2GLQRNYT.js +0 -16
  73. package/dist/chunk-7P6IFCR4.js +0 -1
  74. package/dist/chunk-CRPJGCSO.js +0 -20
  75. package/dist/chunk-LUSM3QTY.js +0 -5
  76. package/dist/chunk-QTLAVDJE.js +0 -1
  77. package/dist/chunk-R2HLPNQF.js +0 -1
  78. package/dist/chunk-UFY6RNMT.js +0 -9
  79. package/dist/chunk-YIKMVF24.js +0 -5
  80. package/dist/chunk-YNOZ5NXW.js +0 -14
@@ -18,7 +18,7 @@ import '../../words-BDignMl_.js';
18
18
  import '../../types-BsyPh6EW.js';
19
19
  import '../../style-clipboard/index.js';
20
20
  import '../../words-CnnHb9jo.js';
21
- import '../../types-BqGnUVX5.js';
21
+ import '../../types-BLRK6_JO.js';
22
22
  import '../../words-Cl9xMUYY.js';
23
23
  import './AddSidePanel.js';
24
24
  import '../lib/section-template-types.js';
@@ -1 +1 @@
1
- export{usePartBridge}from"../../chunk-6N64PNWF.js";import"../../chunk-XBNOEQMR.js";import"../../chunk-IYT6NN2J.js";import"../../chunk-I54UCYOU.js";import"../../chunk-GOTN2KY4.js";import"../../chunk-R5L2E7JX.js";import"../../chunk-YIKMVF24.js";import"../../chunk-PLVEGYK6.js";import"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-XW4AV5N4.js";import"../../chunk-AELNNAFM.js";import"../../chunk-CRPJGCSO.js";import"../../chunk-OZ72A6MY.js";import"../../chunk-UFY6RNMT.js";import"../../chunk-YNOZ5NXW.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-QTLAVDJE.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-EA2HTX37.js";import"../../chunk-UK2FQOUT.js";import"../../chunk-66LWADFP.js";import"../../chunk-QLD57GBB.js";import"../../chunk-FFYXVAAL.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-67GNT6PF.js";import"../../chunk-ZNCEOSXO.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
1
+ export{usePartBridge}from"../../chunk-RQWJOPRB.js";import"../../chunk-I7ER3P4U.js";import"../../chunk-IYT6NN2J.js";import"../../chunk-I54UCYOU.js";import"../../chunk-GOTN2KY4.js";import"../../chunk-R5L2E7JX.js";import"../../chunk-KSTX646X.js";import"../../chunk-PLVEGYK6.js";import"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-XW4AV5N4.js";import"../../chunk-AELNNAFM.js";import"../../chunk-CRWFB7MU.js";import"../../chunk-OZ72A6MY.js";import"../../chunk-4JSBIW5H.js";import"../../chunk-3ZJSLHHI.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-KFV7N2DJ.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-EA2HTX37.js";import"../../chunk-UK2FQOUT.js";import"../../chunk-66LWADFP.js";import"../../chunk-QLD57GBB.js";import"../../chunk-FFYXVAAL.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-67GNT6PF.js";import"../../chunk-ZNCEOSXO.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
@@ -24,7 +24,7 @@ import '../words-BDignMl_.js';
24
24
  import '../types-BsyPh6EW.js';
25
25
  import '../style-clipboard/index.js';
26
26
  import '../words-CnnHb9jo.js';
27
- import '../types-BqGnUVX5.js';
27
+ import '../types-BLRK6_JO.js';
28
28
  import '../words-Cl9xMUYY.js';
29
29
  import './components/AddSidePanel.js';
30
30
  import './lib/section-template-types.js';
@@ -1 +1 @@
1
- import"../chunk-GZO72N3Q.js";export{DocumentScreen,ScreenMount}from"../chunk-CRG625FM.js";import"../chunk-GXQCZJOP.js";export{ScreenStoreProvider}from"../chunk-LZ6EGT4Y.js";import"../chunk-RKSKUGWC.js";import"../chunk-26OOWIJJ.js";import"../chunk-7P6IFCR4.js";import"../chunk-FGNR22NY.js";import"../chunk-ZE7I3PLX.js";import"../chunk-2GVCAIPX.js";import"../chunk-PAM3NLFL.js";import"../chunk-7F52SZOI.js";import"../chunk-R2HLPNQF.js";import"../chunk-TBF5CVPA.js";import"../chunk-4ES5JGGX.js";import"../chunk-IQ5TA7AM.js";import"../chunk-DUVRZ456.js";import"../chunk-6W7WLPZH.js";import"../chunk-VZGLBEAE.js";import"../chunk-KCBEE2MC.js";import"../chunk-42TMLDSQ.js";import"../chunk-6N64PNWF.js";import"../chunk-XBNOEQMR.js";import"../chunk-IYT6NN2J.js";import"../chunk-MTRFMGBO.js";import"../chunk-2I7MAA2U.js";import"../chunk-BSPCSC45.js";import"../chunk-I54UCYOU.js";import"../chunk-GOTN2KY4.js";import"../chunk-R5L2E7JX.js";import"../chunk-WZMU646D.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-LUSM3QTY.js";import"../chunk-5ZBY24K7.js";import"../chunk-PA3PNTVV.js";import"../chunk-BVN33R76.js";import"../chunk-5SOSVTVI.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-SCPCXNTB.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-YIKMVF24.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-MCHMF32I.js";import"../chunk-XW4AV5N4.js";import"../chunk-AELNNAFM.js";import"../chunk-CRPJGCSO.js";import"../chunk-OZ72A6MY.js";import"../chunk-UFY6RNMT.js";import"../chunk-YNOZ5NXW.js";import"../chunk-K56YDHYQ.js";import"../chunk-QTLAVDJE.js";import"../chunk-YRLPFZW3.js";import"../chunk-BXMXTO36.js";import"../chunk-EA2HTX37.js";import"../chunk-OSPUG6S6.js";import"../chunk-WK3AFPXY.js";import"../chunk-UK2FQOUT.js";import"../chunk-4VJATVVR.js";import"../chunk-BDTITTMW.js";import"../chunk-H6DDIBQ4.js";import"../chunk-GTDLBUOC.js";import"../chunk-Y2G7CU6A.js";import"../chunk-THWO5YVZ.js";import"../chunk-RE4LP46F.js";import"../chunk-MJM6SFD3.js";import"../chunk-2OAZYSWJ.js";import"../chunk-66LWADFP.js";import"../chunk-QLD57GBB.js";import"../chunk-FFYXVAAL.js";import"../chunk-MFIRYGHW.js";import"../chunk-2GLQRNYT.js";import"../chunk-O2NLQBFX.js";import"../chunk-67GNT6PF.js";import"../chunk-PAELDYYS.js";import"../chunk-ZNCEOSXO.js";import"../chunk-P2VEMZH5.js";import"../chunk-KRXQM65X.js";import"../chunk-NKB3KVAB.js";
1
+ import"../chunk-GZO72N3Q.js";export{DocumentScreen,ScreenMount}from"../chunk-C7ERK4DF.js";import"../chunk-GXQCZJOP.js";export{ScreenStoreProvider}from"../chunk-G5JILVHG.js";import"../chunk-ETDRAF3O.js";import"../chunk-26OOWIJJ.js";import"../chunk-BXQBCW3P.js";import"../chunk-FGNR22NY.js";import"../chunk-ZE7I3PLX.js";import"../chunk-2GVCAIPX.js";import"../chunk-PAM3NLFL.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-VZGLBEAE.js";import"../chunk-KCBEE2MC.js";import"../chunk-6TOYXESC.js";import"../chunk-RQWJOPRB.js";import"../chunk-I7ER3P4U.js";import"../chunk-IYT6NN2J.js";import"../chunk-MTRFMGBO.js";import"../chunk-HQWQLDCB.js";import"../chunk-BSPCSC45.js";import"../chunk-I54UCYOU.js";import"../chunk-GOTN2KY4.js";import"../chunk-R5L2E7JX.js";import"../chunk-WZMU646D.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-3GX7XBAF.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-KJ2RODGT.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-KSTX646X.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-MCHMF32I.js";import"../chunk-XW4AV5N4.js";import"../chunk-AELNNAFM.js";import"../chunk-CRWFB7MU.js";import"../chunk-OZ72A6MY.js";import"../chunk-4JSBIW5H.js";import"../chunk-3ZJSLHHI.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-UK2FQOUT.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-66LWADFP.js";import"../chunk-QLD57GBB.js";import"../chunk-FFYXVAAL.js";import"../chunk-MFIRYGHW.js";import"../chunk-37DMJPHL.js";import"../chunk-O2NLQBFX.js";import"../chunk-67GNT6PF.js";import"../chunk-PAELDYYS.js";import"../chunk-ZNCEOSXO.js";import"../chunk-P2VEMZH5.js";import"../chunk-KRXQM65X.js";import"../chunk-NKB3KVAB.js";
@@ -1,12 +1,14 @@
1
- import { S as SettingsBucket } from '../../../buckets-CuLM47h9.js';
1
+ import { S as SettingsBucket, D as DesignGroup } from '../../../buckets-Tj-nkBpg.js';
2
2
 
3
3
  /**
4
- * lib/puck/field-buckets.ts — the four settings buckets a section's fields are
5
- * sorted into, and the field key each bucket's header is emitted under.
4
+ * lib/puck/field-buckets.ts — the two settings buckets a section's fields are
5
+ * sorted into (Design, Animation: owner 2026-10-08, final 2026-10-10), the
6
+ * field key each bucket's header is emitted under, and the field key of each
7
+ * Design group's heading.
6
8
  *
7
9
  * Moved out of lib/puck/field-groups (which re-exports both) so the editor's
8
- * screen can read a bucket header's key — the style clipboard copies a look by
9
- * the buckets it sits in — without importing the field builders that sort a
10
+ * screen can read a header's key — the style clipboard copies a look by the
11
+ * groups it sits in — without importing the field builders that sort a
10
12
  * section's fields (doc/adr/0004). The reasoning behind the buckets themselves
11
13
  * stays in field-groups, beside the pass that applies them.
12
14
  */
@@ -18,5 +20,17 @@ type Bucket = SettingsBucket;
18
20
  * already carry level-1 headers use (`_sText`, `_sImage`, `_sSetup`, …).
19
21
  */
20
22
  declare const BUCKET_KEY: Record<Bucket, string>;
23
+ /**
24
+ * The field key of each Design group's heading, inside the Design bucket. The
25
+ * HOST emits them, in `DESIGN_GROUPS` order, one for each group it has; a row
26
+ * belongs to the heading above it. `_dContent` is a marker that draws no
27
+ * heading (the Content part has none), and the rows before the first group
28
+ * heading of Design are Content too. `_d*` for Design's own headings, apart
29
+ * from the `_s*` bucket headers and the `_g*` group headers a section draws.
30
+ * Only these six keys are group headings: `_dDevice` (the device note,
31
+ * ./device-fields) shares the prefix and is not one, so never read a group off
32
+ * the prefix.
33
+ */
34
+ declare const DESIGN_GROUP_KEY: Record<DesignGroup, string>;
21
35
 
22
- export { BUCKET_KEY, type Bucket };
36
+ export { BUCKET_KEY, type Bucket, DESIGN_GROUP_KEY };
@@ -1 +1 @@
1
- export{BUCKET_KEY}from"../../../chunk-R2HLPNQF.js";
1
+ export{BUCKET_KEY,DESIGN_GROUP_KEY}from"../../../chunk-MQNBD6AB.js";
@@ -19,7 +19,7 @@ import '../../../panelWidths-D9hTLR25.js';
19
19
  import '../../../CanvasDragLayer-DVJGgA-g.js';
20
20
  import '../../../session-DSQFmIvx.js';
21
21
  import '../../../words-BDignMl_.js';
22
- import '../../../types-BqGnUVX5.js';
22
+ import '../../../types-BLRK6_JO.js';
23
23
  import '../../../words-Cl9xMUYY.js';
24
24
  import '../../components/AddSidePanel.js';
25
25
  import '../section-template-types.js';
@@ -52,12 +52,21 @@ import './slot-section-spec.js';
52
52
  * 2. WHAT KIND each row is — {@link shopFieldKind}.
53
53
  *
54
54
  * ── WHICH ROWS ──────────────────────────────────────────────────────────────
55
- * Owner's rule 3: the Style and Layout tabs, never Content. The panel after
56
- * `assignSectionGroups` is a flat list in which each bucket header
57
- * (`BUCKET_KEY`) opens its run — the same reading the tab strip hides rows by —
58
- * so a row belongs to the header above it. Animation is not copied.
55
+ * Owner's rule 3 was "the Style and Layout tabs, never Content". Since 4.0.0
56
+ * the panel has two tabs, Design and Animation (owner, final 2026-10-10), and
57
+ * what was the Content tab sits at the top of Design — so the rule is read off
58
+ * the Design GROUPS instead of the tabs: the rows under Size, Design, Layout or
59
+ * Position are a look and are copied. Never the Content group (its
60
+ * `_dContent` marker, and every row of Design before the first group heading),
61
+ * never Anchor, never Animation.
59
62
  *
60
- * Left out even on those tabs (the list GG approved on 2026-09-19):
63
+ * The panel after `assignSectionGroups` is a flat list in which each bucket
64
+ * header (`BUCKET_KEY`) opens its run — the same reading the tab strip hides
65
+ * rows by — and inside Design each group heading (`DESIGN_GROUP_KEY`) opens
66
+ * its own; a row belongs to the headers above it. A group heading counts only
67
+ * inside Design.
68
+ *
69
+ * Left out even in those groups (the list GG approved on 2026-09-19):
61
70
  * · every picture (`__media`) — Media folded into Style on 2026-09-14, and a
62
71
  * picture is Content;
63
72
  * · words and links (`__text`, `__link`);
@@ -1 +1 @@
1
- export{copyNodeStyle,nodeStyleRows,planNodePaste,shopFieldKind,siteStyleScope,styleClipboardOf}from"../../../chunk-7P6IFCR4.js";import"../../../chunk-ZE7I3PLX.js";import"../../../chunk-PAM3NLFL.js";import"../../../chunk-7F52SZOI.js";import"../../../chunk-R2HLPNQF.js";import"../../../chunk-DUVRZ456.js";import"../../../chunk-BSPCSC45.js";import"../../../chunk-V7U33NF2.js";import"../../../chunk-6WY6ZXJG.js";import"../../../chunk-MCHMF32I.js";import"../../../chunk-MFIRYGHW.js";
1
+ export{copyNodeStyle,nodeStyleRows,planNodePaste,shopFieldKind,siteStyleScope,styleClipboardOf}from"../../../chunk-BXQBCW3P.js";import"../../../chunk-ZE7I3PLX.js";import"../../../chunk-PAM3NLFL.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-MCHMF32I.js";import"../../../chunk-MFIRYGHW.js";
@@ -1 +1 @@
1
- export{useSectionOps}from"../../../chunk-XBNOEQMR.js";import"../../../chunk-YIKMVF24.js";import"../../../chunk-PLVEGYK6.js";import"../../../chunk-R6WTQWAC.js";import"../../../chunk-U3JP4VGF.js";import"../../../chunk-XW4AV5N4.js";import"../../../chunk-AELNNAFM.js";import"../../../chunk-CRPJGCSO.js";import"../../../chunk-OZ72A6MY.js";import"../../../chunk-UFY6RNMT.js";import"../../../chunk-YNOZ5NXW.js";import"../../../chunk-K56YDHYQ.js";import"../../../chunk-QTLAVDJE.js";import"../../../chunk-YRLPFZW3.js";import"../../../chunk-EA2HTX37.js";import"../../../chunk-UK2FQOUT.js";import"../../../chunk-66LWADFP.js";import"../../../chunk-QLD57GBB.js";import"../../../chunk-FFYXVAAL.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-67GNT6PF.js";import"../../../chunk-ZNCEOSXO.js";import"../../../chunk-P2VEMZH5.js";import"../../../chunk-KRXQM65X.js";import"../../../chunk-NKB3KVAB.js";
1
+ export{useSectionOps}from"../../../chunk-I7ER3P4U.js";import"../../../chunk-KSTX646X.js";import"../../../chunk-PLVEGYK6.js";import"../../../chunk-R6WTQWAC.js";import"../../../chunk-U3JP4VGF.js";import"../../../chunk-XW4AV5N4.js";import"../../../chunk-AELNNAFM.js";import"../../../chunk-CRWFB7MU.js";import"../../../chunk-OZ72A6MY.js";import"../../../chunk-4JSBIW5H.js";import"../../../chunk-3ZJSLHHI.js";import"../../../chunk-K56YDHYQ.js";import"../../../chunk-KFV7N2DJ.js";import"../../../chunk-YRLPFZW3.js";import"../../../chunk-EA2HTX37.js";import"../../../chunk-UK2FQOUT.js";import"../../../chunk-66LWADFP.js";import"../../../chunk-QLD57GBB.js";import"../../../chunk-FFYXVAAL.js";import"../../../chunk-MFIRYGHW.js";import"../../../chunk-67GNT6PF.js";import"../../../chunk-ZNCEOSXO.js";import"../../../chunk-P2VEMZH5.js";import"../../../chunk-KRXQM65X.js";import"../../../chunk-NKB3KVAB.js";
@@ -8,7 +8,7 @@ import { M as MeasuredCanvas, C as CanvasDragModel } from '../../CanvasDragLayer
8
8
  import { E as EaselContextMenuItem } from '../../types-BsyPh6EW.js';
9
9
  import { a as EaselRailItem } from '../../types-CsgMwHHa.js';
10
10
  import { StyleRow } from '../../style-clipboard/index.js';
11
- import { T as TreeRowMark } from '../../types-BqGnUVX5.js';
11
+ import { T as TreeRowMark } from '../../types-BLRK6_JO.js';
12
12
  import { AddKey } from '../components/AddSidePanel.js';
13
13
  import { k as AnyScreenTarget } from '../../host-CiuzZJXj.js';
14
14
  import { HostProduct } from './host-chrome.js';
@@ -1 +1 @@
1
- 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-YIKMVF24.js";import"../../chunk-PLVEGYK6.js";import"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-XW4AV5N4.js";import"../../chunk-AELNNAFM.js";import"../../chunk-CRPJGCSO.js";import"../../chunk-OZ72A6MY.js";import"../../chunk-UFY6RNMT.js";import"../../chunk-YNOZ5NXW.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-QTLAVDJE.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-EA2HTX37.js";import"../../chunk-UK2FQOUT.js";import"../../chunk-66LWADFP.js";import"../../chunk-QLD57GBB.js";import"../../chunk-FFYXVAAL.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-67GNT6PF.js";import"../../chunk-ZNCEOSXO.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
1
+ 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-KSTX646X.js";import"../../chunk-PLVEGYK6.js";import"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-XW4AV5N4.js";import"../../chunk-AELNNAFM.js";import"../../chunk-CRWFB7MU.js";import"../../chunk-OZ72A6MY.js";import"../../chunk-4JSBIW5H.js";import"../../chunk-3ZJSLHHI.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-KFV7N2DJ.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-EA2HTX37.js";import"../../chunk-UK2FQOUT.js";import"../../chunk-66LWADFP.js";import"../../chunk-QLD57GBB.js";import"../../chunk-FFYXVAAL.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-67GNT6PF.js";import"../../chunk-ZNCEOSXO.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
@@ -337,51 +337,18 @@
337
337
  box-shadow: inset 2px 0 0 var(--sf-accent);
338
338
  }
339
339
 
340
- /* ── Left panel: section tree (wraps Puck.Outline) ────────────────────── */
340
+ /* ── Left panel: section tree ─────────────────────────────────────────────
341
+ The Layers tree is the left panel's scroll box (`lib/puck/tree-reveal`
342
+ scrolls it to the selected row). Nothing more: its ONE inset, 12 a side, is
343
+ `.es-tree`'s (`efficient-easel/tree.css`). This rule used to pad the same
344
+ element a second time (8 / 11 / 10 over `.es-tree`'s 8 / 12 / 12) and to
345
+ re-declare `--es-rhythm-group` 10 and `--es-rhythm-between` 6 for rows that
346
+ stopped reading them when they became the shell's `TreeRow` — their gaps
347
+ are the shell tree's, 4 (Lewis on the Pages panel, 2026-10-13: "packed too
348
+ tight"). */
341
349
  .sf-tree {
342
350
  flex: 1;
343
351
  overflow-y: auto;
344
- /* THE TWO SIDES PAY FOR DIFFERENT THINGS, and they always did.
345
- LEFT 8 — the inset a rounded row needs. The reason WAS "a rounded bar
346
- cannot bleed to a panel edge"; the bars are gone (One Ladder, 2026-09-04)
347
- and the reason survives them unchanged, because every row in the tree is
348
- still a rounded control and an inset control is simply a control.
349
- RIGHT 11 — this element also carries `.sf-scroll`, and
350
- `.sf-scroll::-webkit-scrollbar` is `width: 11px` of REAL, space-taking
351
- gutter, not an overlay. This tree scrolls on almost every page. What used
352
- to live at the row's right end was the caret; it is the count pill now,
353
- and a count sitting under a scrollbar thumb is the same defect wearing a
354
- different glyph.
355
- Everything inside still starts on the same 11px text column, which is what
356
- keeps the words aligned down the panel. */
357
- padding: 0 11px 10px 8px;
358
-
359
- /* ── THE TREE'S RHYTHM — the shell's names, the tree's own density ─────────
360
- `efficient-easel` 0.19.0 stopped hiding its spacing inside literals and gave
361
- each rhythm a name (card 66228, `efficient-easel/panel.css`). The tree reads
362
- those names. It does NOT read the panel's VALUES and does not compute them:
363
-
364
- · Copying 28/7 in would be a second source of truth for numbers the shell
365
- is already the source of — the one rule that sits above a green suite.
366
- · A scale FACTOR off them would be a lie. Lewis picked the tree's two
367
- numbers by eye on 2026-08-31 (`mockups/layers-panel-v9-left-only-and-drag.html`
368
- and `editor-add-and-context-v1.html`): 10 between bars, 6 between rows.
369
- Against the panel that is 10/36 = 0.28 and 6/28 = 0.21 — TWO factors,
370
- not one, so there is no single number to scale by. `panel.css` already
371
- refuses this shape for the same reason, in its own words: 28 was
372
- measured, it is not "10 plus 18".
373
-
374
- So what is shared is the VOCABULARY and the RULE, not the values: `-group`
375
- means "a heading, from what is above it" in both panels and `-between`
376
- means "one row, from the next" in both, each stated once at its own
377
- density. A tree at the panel's 28px a row would scroll forever.
378
-
379
- Declared HERE rather than on `.sf-editor` deliberately — the settings panel
380
- is a sibling reading the same names from the shell, and an override at the
381
- editor root would re-rhythm IT too. `scripts/test-tree-rhythm-tokens.ts` is
382
- the gate. */
383
- --es-rhythm-group: 10px;
384
- --es-rhythm-between: 6px;
385
352
  }
386
353
 
387
354
  .sf-chip {
@@ -5,7 +5,7 @@ import { D as DragWords } from '../words-BDignMl_.js';
5
5
  import { LockWords } from '../edit-lock/index.js';
6
6
  import { F as FieldsWords } from '../words-vhnV8sM7.js';
7
7
  import { N as NodeMenuWords } from '../words-DMG4dYq2.js';
8
- import { P as PanelWords } from '../words-BGrHZAJJ.js';
8
+ import { P as PanelWords } from '../words-zH1H0WFw.js';
9
9
  import { P as PickWords } from '../words-is_Vy6hn.js';
10
10
  import { ScreenWords } from '../screen/words.js';
11
11
  export { ScreenAddWords } from '../screen/words.js';
@@ -19,7 +19,7 @@ import 'react';
19
19
  import '../panelWidths-D9hTLR25.js';
20
20
  import '../engine-DBxp_v6B.js';
21
21
  import '../markup/index.js';
22
- import '../buckets-CuLM47h9.js';
22
+ import '../buckets-Tj-nkBpg.js';
23
23
 
24
24
  /**
25
25
  * The easel canvas's own words (`efficient-easel/strings`, 0.95.0). There is
@@ -1 +1 @@
1
- export{DEFAULT_EASEL_STRINGS,mergeEaselStrings}from"../chunk-WSNVBUPL.js";import"../chunk-M6F6LS3H.js";import"../chunk-ZAOM6PFH.js";import"../chunk-6WY6ZXJG.js";import"../chunk-MCHMF32I.js";import"../chunk-AELNNAFM.js";import"../chunk-K56YDHYQ.js";import"../chunk-QTLAVDJE.js";import"../chunk-WK3AFPXY.js";import"../chunk-H6DDIBQ4.js";import"../chunk-Y2G7CU6A.js";import"../chunk-RE4LP46F.js";import"../chunk-2OAZYSWJ.js";import"../chunk-JZDEIRH4.js";import"../chunk-FFYXVAAL.js";import"../chunk-546BBOPE.js";import"../chunk-O2NLQBFX.js";
1
+ export{DEFAULT_EASEL_STRINGS,mergeEaselStrings}from"../chunk-Y324X4U4.js";import"../chunk-M6F6LS3H.js";import"../chunk-ZAOM6PFH.js";import"../chunk-6WY6ZXJG.js";import"../chunk-MCHMF32I.js";import"../chunk-AELNNAFM.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-JZDEIRH4.js";import"../chunk-FFYXVAAL.js";import"../chunk-546BBOPE.js";import"../chunk-O2NLQBFX.js";
@@ -8,7 +8,7 @@ export { D as DragWords } from '../words-BDignMl_.js';
8
8
  export { F as FieldsWords } from '../words-vhnV8sM7.js';
9
9
  export { LockWords } from '../edit-lock/index.js';
10
10
  export { N as NodeMenuWords } from '../words-DMG4dYq2.js';
11
- export { P as PanelWords } from '../words-BGrHZAJJ.js';
11
+ export { P as PanelWords } from '../words-zH1H0WFw.js';
12
12
  export { P as PickWords } from '../words-is_Vy6hn.js';
13
13
  export { S as SaveWords } from '../words-CvFnwGSr.js';
14
14
  export { ScreenAddWords, ScreenWords } from '../screen/words.js';
@@ -16,7 +16,7 @@ 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
- import '../buckets-CuLM47h9.js';
19
+ import '../buckets-Tj-nkBpg.js';
20
20
  import '../types-Dt1CFR1S.js';
21
21
  import '../types-CsgMwHHa.js';
22
22
  import '../wordFit-7XpmhcaW.js';
@@ -1,2 +1,2 @@
1
- import{DEFAULT_EASEL_STRINGS as r,mergeEaselStrings as n}from"../chunk-WSNVBUPL.js";export{DEFAULT_EASEL_STRINGS,mergeEaselStrings}from"../chunk-WSNVBUPL.js";import"../chunk-M6F6LS3H.js";import"../chunk-ZAOM6PFH.js";import"../chunk-6WY6ZXJG.js";import"../chunk-MCHMF32I.js";import"../chunk-AELNNAFM.js";import"../chunk-K56YDHYQ.js";import"../chunk-QTLAVDJE.js";import"../chunk-WK3AFPXY.js";import"../chunk-H6DDIBQ4.js";import"../chunk-Y2G7CU6A.js";import"../chunk-RE4LP46F.js";import"../chunk-2OAZYSWJ.js";import"../chunk-JZDEIRH4.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-Y324X4U4.js";export{DEFAULT_EASEL_STRINGS,mergeEaselStrings}from"../chunk-Y324X4U4.js";import"../chunk-M6F6LS3H.js";import"../chunk-ZAOM6PFH.js";import"../chunk-6WY6ZXJG.js";import"../chunk-MCHMF32I.js";import"../chunk-AELNNAFM.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-JZDEIRH4.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};
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
- import { L as LayersTreeProps, S as SubtreeProps, a as TreeGroupLabelProps, b as TreeEmptySlotProps, c as TreeRowProps, d as TreeRowActionProps, e as TreeSeamProps } from '../types-BqGnUVX5.js';
3
- export { f as TreeRowFold, T as TreeRowMark } from '../types-BqGnUVX5.js';
2
+ import { L as LayersTreeProps, S as SubtreeProps, a as TreeGroupLabelProps, b as TreeEmptySlotProps, c as TreeRowProps, d as TreeRowActionProps, e as TreeSeamProps } from '../types-BLRK6_JO.js';
3
+ export { f as TreeRowFold, T as TreeRowMark } from '../types-BLRK6_JO.js';
4
4
  export { T as TreeWords } from '../words-Cl9xMUYY.js';
5
5
 
6
6
  /**
@@ -9,8 +9,12 @@ export { T as TreeWords } from '../words-Cl9xMUYY.js';
9
9
  * `screen/lib/puck/tree-reveal` scrolls, and the scroll box `tree.css` keeps.
10
10
  */
11
11
  declare function LayersTree({ className, children, rootProps, ariaLabel, words }: LayersTreeProps): react.JSX.Element;
12
- /** A quiet uppercase label over a run of rows — the shell's `TreeGroupLabel`. */
13
- declare function TreeGroupLabel({ children }: TreeGroupLabelProps): react.JSX.Element;
12
+ /**
13
+ * A quiet uppercase label over a run of rows — the shell's `TreeGroupLabel`,
14
+ * with its count and its fold (efficient-shell, "TreeGroupLabel takes a count
15
+ * and folds"): the Pages panel's headings and the Layers panel's are one.
16
+ */
17
+ declare function TreeGroupLabel({ children, count, expanded, onToggle }: TreeGroupLabelProps): react.JSX.Element;
14
18
  /**
15
19
  * The rows one level down: the shell's `TreeGroup` (`role="group"`, the indent
16
20
  * and the hairline — the only thing in the tree that says depth), and one more
@@ -1 +1 @@
1
- export{LayersTree,Subtree,TREE_DRAG_HINT,TreeEmptySlot,TreeGroupLabel,TreeRow,TreeRowAction,TreeSeam}from"../chunk-UFY6RNMT.js";import"../chunk-K56YDHYQ.js";
1
+ export{LayersTree,Subtree,TREE_DRAG_HINT,TreeEmptySlot,TreeGroupLabel,TreeRow,TreeRowAction,TreeSeam}from"../chunk-4JSBIW5H.js";import"../chunk-K56YDHYQ.js";
@@ -22,9 +22,12 @@
22
22
  .es-tree {
23
23
  flex: 1;
24
24
  overflow-y: auto;
25
- /* LEFT 8 — the inset a rounded row needs. RIGHT 12 — the room a real,
26
- space-taking scrollbar takes, so nothing at a row's end sits under the thumb. */
27
- padding: 0 12px 12px 8px;
25
+ /* ONE INSET, 12 A SIDE — the editor panel's search field's (Lewis on the
26
+ Pages panel, 2026-10-13: "packed too tight"). It was 8 left and 12 right,
27
+ and the screen's `.sf-tree` said 8 and 11 over the top of it on the same
28
+ element; a row's fill ran nearly to the panel's edge. A scrollbar, when
29
+ the tree scrolls, takes its own room outside this padding. */
30
+ padding: 0 var(--es-space-12) var(--es-space-12);
28
31
  /* The row actions lie over the end of the name on a scrim of the row's own
29
32
  tone over the PANEL's ground (efficient-shell 4.166.0). The shell assumes
30
33
  `--surface`; the tree sits on easel's panel, so it says which. */
@@ -14,6 +14,13 @@ type LayersTreeProps = {
14
14
  };
15
15
  type TreeGroupLabelProps = {
16
16
  children: ReactNode;
17
+ /** How many rows it heads, in the shell's count pill at its end — "MAIN PAGES 3". */
18
+ count?: ReactNode;
19
+ /** Present when the heading folds the rows under it: whether they show. The
20
+ * heading is then the shell's button, with `aria-expanded` and the row's caret. */
21
+ expanded?: boolean;
22
+ /** Fold or unfold. The rows under it are the host's to render or leave out. */
23
+ onToggle?: () => void;
17
24
  };
18
25
  type SubtreeProps = {
19
26
  children?: ReactNode;
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- import { S as SettingsBucket } from './buckets-CuLM47h9.js';
2
+ import { S as SettingsBucket } from './buckets-Tj-nkBpg.js';
3
3
 
4
4
  /** What every control shares: an id for its label, a name for screen readers, and a read-only switch. */
5
5
  interface ControlBase {
@@ -158,8 +158,11 @@ interface FieldMeta {
158
158
  label?: string;
159
159
  /** The tab this field opens; inherited by the fields after it (see above). */
160
160
  bucket?: SettingsBucket;
161
- /** Only says where a bucket starts. Draws nothing. */
161
+ /** Only says where a bucket (or, with `fold`, a band) starts. Draws nothing. */
162
162
  marker?: boolean;
163
+ /** On a marker: the title of the folding band that starts here (see above);
164
+ * `false`: the band above ends here and the rows after it stand alone. */
165
+ fold?: string | false;
163
166
  visible?: boolean;
164
167
  /** Drawn before the label. */
165
168
  icon?: ReactNode;
@@ -1,12 +1,13 @@
1
- import { S as SettingsBucket } from './buckets-CuLM47h9.js';
1
+ import { S as SettingsBucket, D as DesignGroup } from './buckets-Tj-nkBpg.js';
2
2
 
3
3
  /**
4
4
  * The settings panel's own words (`efficient-easel/strings`, 0.95.0): what
5
5
  * the tab strip is called, what each tab SAYS, and the Default / Reset part.
6
6
  *
7
- * A bucket's key (`'Content'`, `'Style'`, …) is an identifier — fields name
7
+ * A bucket's key (`'Design'`, `'Animation'`) is an identifier — fields name
8
8
  * their tab with it and `SETTINGS_BUCKETS` orders them — so it never changes
9
- * with the language. `buckets` is the word drawn for each key.
9
+ * with the language. `buckets` is the word drawn for each key. A Design
10
+ * group's key (`DESIGN_GROUPS`) is the same: `designGroups` is its word.
10
11
  *
11
12
  * The panel is hook-free, so nothing here is read from the strings provider:
12
13
  * `SettingsTabs` takes its name as `ariaLabel` and each tab's word as the
@@ -20,6 +21,10 @@ type PanelWords = {
20
21
  settings: string;
21
22
  /** The word each tab shows, by its key. */
22
23
  buckets: Record<SettingsBucket, string>;
24
+ /** The word each Design group's heading says, by its key (4.0.0). The
25
+ * host draws the headings; Content's draws none, and still has a word for
26
+ * a host that names it elsewhere. */
27
+ designGroups: Record<DesignGroup, string>;
23
28
  /** @deprecated Not drawn since option E (2026-10-07): an unchanged setting
24
29
  * shows nothing. Kept so a host's catalogue still type-checks. */
25
30
  followsDefault: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efficient-easel",
3
- "version": "3.7.0",
3
+ "version": "5.0.0",
4
4
  "description": "Efficient Easel: the EFFICIENT editors' shared engine and chrome: the saved document as pure functions, the published renderer, and the editor frame, panels, Layers tree, text grammar and type-in-place box. Published as editor-shell up to 0.66.0 and as efficient-editor up to 0.95.0.",
5
5
  "license": "UNLICENSED",
6
6
  "author": "Efficient Pty Ltd",
@@ -517,7 +517,7 @@
517
517
  "dist"
518
518
  ],
519
519
  "peerDependencies": {
520
- "efficient-shell": "^5.6.0 || ^6.4.0 || ^7.7.0",
520
+ "efficient-shell": "^7.21.0",
521
521
  "react": ">=18",
522
522
  "react-dom": ">=18"
523
523
  },
@@ -527,7 +527,7 @@
527
527
  "@types/node": "^22.0.0",
528
528
  "@types/react": "^18.2.0",
529
529
  "@types/react-dom": "^18.2.0",
530
- "efficient-shell": "^7.7.0",
530
+ "efficient-shell": "^7.21.0",
531
531
  "esbuild": "^0.27.0",
532
532
  "jsdom": "^26.1.0",
533
533
  "react": "^18.2.0",
@@ -1,13 +0,0 @@
1
- /**
2
- * The settings tab words, in the owner's order (2026-09-11): Content, Style,
3
- * Layout, Animation. A panel shows only the tabs that hold a setting — an empty
4
- * tab is hidden, never drawn (same day).
5
- *
6
- * The website editor wrote this list in `efficient-storefront/lib/puck/field-groups.ts`
7
- * (`BUCKETS`). From 0.43.0 it lives here, so the campaign editor spells its panel
8
- * the same four words in the same order instead of keeping a second list.
9
- */
10
- declare const SETTINGS_BUCKETS: readonly ["Content", "Style", "Layout", "Animation"];
11
- type SettingsBucket = (typeof SETTINGS_BUCKETS)[number];
12
-
13
- export { type SettingsBucket as S, SETTINGS_BUCKETS as a };
@@ -1,16 +0,0 @@
1
- import{DEFAULT_DRAG_WORDS as e}from"./chunk-O2NLQBFX.js";import{dropEffectFor as t,scrollBoxOf as n,frameScrollBox as l,startAutoScroll as r,isNoOpDrop as a}from"./chunk-67GNT6PF.js";import{useCanvasLayout as o,useCanvasEvent as s}from"./chunk-PAELDYYS.js";import{framePointToHost as i,elementScale as c,frameRectToLayer as d,clientPointToLayer as u}from"./chunk-ZNCEOSXO.js";import{withTip as h}from"./chunk-P2VEMZH5.js";import{parseZoneKey as f}from"./chunk-KRXQM65X.js";import{useRef as p,useEffect as m,useState as g,useCallback as b,useMemo as y,useSyncExternalStore as v,useId as x,useLayoutEffect as k}from"react";import{Tooltip as w}from"efficient-shell/ui";import{jsxs as N,jsx as A}from"react/jsx-runtime";import{CloseIcon as D,SearchIcon as z}from"efficient-shell/icons/efficient";var T=(e,t,n)=>t>=e.left&&t<=e.left+e.width&&n>=e.top&&n<=e.top+e.height,C=e=>e.width*e.height;function S(e,t,n){return e.map((e,t)=>({s:e,at:t})).filter(({s:e})=>T(e.box,t,n)).sort((e,t)=>C(t.s.box)-C(e.s.box)||e.at-t.at).map(({s:e})=>e)}function E(e,t,n){return S(e,t,n).at(-1)??null}function $(e,t,n){const l="x"===e.axis?t:n;let r=0;for(const t of e.children){l>("x"===e.axis?t.left+t.width/2:t.top+t.height/2)&&(r+=1)}return r}function L(e,t){const n=e.children;if("x"===e.axis){const l=n[t-1],r=n[t],a=l&&r?(l.left+l.width+r.left)/2:l?l.left+l.width:r?r.left:e.box.left,o=r??l??e.box;return{left:a-1,top:o.top,width:2,height:o.height}}const l=n[t-1],r=n[t],a=l&&r?(l.top+l.height+r.top)/2:l?l.top+l.height:r?r.top:e.box.top;return{left:e.box.left,top:a-1,width:e.box.width,height:2}}function j(e,t,n,l,r=()=>!1,a=()=>!0){const o=e.filter(e=>T(e.box,t,n)).sort((e,t)=>C(e.box)-C(t.box));for(const e of o){const o=$(e,t,n),s={...e.list,index:o};if(r(s))return null;if(l(s))return{zone:e,to:s,line:L(e,o)};if(!a(s))return null}return null}function M(e,t=e.key){const n=[];for(let l=1;l<e.children.length;l++){const r=e.children[l-1],a=e.children[l],o=r.top+r.height;n.push({key:`${t}:${l}`,place:{...e.list,index:l},box:{left:e.box.left,top:o,width:e.box.width,height:Math.max(a.top-o,0)}})}return n}var B={nodes:[],zones:[]},O="data-puck-dropzone",K="data-puck-component";function X(e,t){if(e.length>=2){const[t,n]=e;return Math.abs(n.top-t.top)<Math.min(t.height,n.height)/2&&n.left>t.left?"x":"y"}const n=t.ownerDocument.defaultView?.getComputedStyle(t);return n&&n.display.includes("flex")&&n.flexDirection.startsWith("row")?"x":"y"}function q(e,t){const{frame:n,document:l}=e,r=e=>d(n,function(e){const t=e.getBoundingClientRect();return{left:t.left,top:t.top,width:t.width,height:t.height}}(e),t),a=[],o=[];for(const e of l.querySelectorAll(`[${O}]`)){const t=e.getAttribute(O)??"";let n;try{n=f(t)}catch{continue}const l=[...e.querySelectorAll(`[${K}]`)].filter(t=>t.parentElement?.closest(`[${O}]`)===e),s=l.map(r);o.push({key:t,list:n,box:r(e),axis:X(s,e),children:s}),l.forEach((e,t)=>{const l=e.getAttribute(K);l&&a.push({id:l,place:{...n,index:t},box:s[t]})})}return{nodes:a,zones:o}}var P="data-es-empty-cell",Y="data-puck-dropzone",Z=140;var F=e=>({left:e.left,top:e.top,width:e.width,height:e.height});function R(d){const{canvas:h,session:f,readOnly:x,words:D=e.canvas}=d,z=p(d);m(()=>{z.current=d});const T=p(null),C=o(h),[E,$]=g(0),L=b(()=>$(e=>e+1),[]),[M,O]=g(B);m(()=>{const e=T.current;h&&e&&O((z.current.measure??q)(h,e))},[h,C,d.revision,E]);const K=d.model,X=y(()=>K(M),[K,M]),Z=v(f.subscribe,f.shown,f.shown),R=d.choose,Q=(e,t)=>{const n=S(X.sources,e,t);return 0===n.length?null:R?R(n):n[n.length-1]},[V,G]=g(null),[H,I]=g(null),W=p(null),J=()=>{W.current&&clearTimeout(W.current),W.current=null},U=()=>{J(),W.current=setTimeout(()=>{f.get()||G(null)},140)};m(()=>J,[]);const _=p(null);s(h,"mousemove",e=>{const t=T.current;if(!h||!t)return;const n=i(h.frame,e.clientX,e.clientY,t),l=c(t),r={x:n.x/l,y:n.y/l};if(_.current=r,z.current.readOnly||f.get())return;J();const a=Q(r.x,r.y);G(e=>e?.key===a?.key&&e?.box===a?.box?e:a)}),s(h,"mouseout",e=>{e.relatedTarget||(_.current=null,U())}),s(h,"mouseover",e=>{e.relatedTarget||L()});const ee=p(null),te=b(()=>{ee.current?.(),ee.current=null,I(null)},[]);m(()=>f.subscribe(()=>{f.get()?L():te()}),[f,te,L]),m(()=>te,[te]),("undefined"==typeof document?m:k)(()=>{if(f.get())return;const e=_.current;G(t=>x?null:e?Q(e.x,e.y):t?X.sources.find(e=>e.key===t.key)??null:null)},[X,Z,f,x,R]);const ne=e=>{const t=f.get(),n=T.current;if(!t||!n)return null;const l=u(n,e.clientX,e.clientY);_.current=l;const r=j(X.zones,l.x,l.y,e=>z.current.canDrop(t.item,e),e=>!!t.from&&a(t.from,e),e=>z.current.fallThrough?.(t.item,e,t.from)??!0);return r?{h:t,t:r}:null},le={onDragEnter:e=>{if(ee.current)return;const t=n(e.currentTarget.parentElement?.parentElement??null),a=h?l(h.document):null,o=[];t&&o.push(r(t)),a&&h&&o.push(r(a,h.frame)),ee.current=o.length?()=>o.forEach(e=>e()):null},onDragOver:e=>{const n=ne(e);if(!n)return void I(null);e.preventDefault(),e.dataTransfer.dropEffect=t(e.dataTransfer.effectAllowed);const l={zoneKey:n.t.zone.key,line:n.t.line,axis:n.t.zone.axis};I(e=>e&&e.zoneKey===l.zoneKey&&e.line.left===l.line.left&&e.line.top===l.line.top?e:l)},onDragLeave:e=>{const t=e.relatedTarget;t&&e.currentTarget.contains(t)||(_.current=null,I(null))},onDrop:e=>{const t=ne(e);t&&(e.preventDefault(),f.end(),te(),z.current.onDrop(t.h.item,t.t.to))}},re={draggable:!x&&!!V,onMouseEnter:J,onMouseLeave:()=>!f.get()&&U(),onDragStart:e=>{if(V&&!x){f.start({key:V.key,item:V.item,from:V.from}),e.dataTransfer.effectAllowed="move";try{e.dataTransfer.setData("text/plain",V.key)}catch{}}else e.preventDefault()},onDragEnd:()=>{f.end(),te()},onClick:()=>{V&&!x&&z.current.onPick?.(V.item)}},{seams:ae=[]}=X,oe=X.zones.filter(e=>0===e.children.length),se=d.onZoneAdd&&!x?oe:[],ie=se.map(e=>e.key).join("\n");return m(()=>{const e=h?.document;if(!e)return;const t=new Set(ie?ie.split("\n"):[]);for(const n of e.querySelectorAll(`[${Y}]`))n.toggleAttribute(P,t.has(n.getAttribute(Y)??""));return()=>{for(const t of e.querySelectorAll(`[${P}]`))t.removeAttribute(P)}},[h,ie,M,C,E]),/* @__PURE__ */N("div",{ref:T,className:"es-canvas-layer",children:[Z||!d.onSeamAdd||x?null:ae.map(e=>/* @__PURE__ */A("div",{className:"es-canvas-seam",style:{left:e.box.left,top:e.box.top+e.box.height/2-8,width:e.box.width,height:16},children:/* @__PURE__ */A("button",{type:"button",className:"es-canvas-seam-add",onClick:()=>d.onSeamAdd?.(e.place),children:D.addButton({label:d.seamLabel??D.addSection})})},e.key)),se.length?se.map(e=>/* @__PURE__ */A("button",{type:"button",className:H?.zoneKey===e.key?"es-canvas-empty is-over":"es-canvas-empty",style:F(e.box),onClick:()=>d.onZoneAdd?.({...e.list,index:0}),children:/* @__PURE__ */A("span",{className:"es-canvas-empty-add",children:D.addButton({label:d.zoneAddLabel??D.addBlock})})},e.key)):null,Z?/* @__PURE__ */A("div",{className:"es-canvas-catch",...le}):null,H&&!oe.some(e=>e.key===H.zoneKey)?/* @__PURE__ */A("div",{className:`es-canvas-line is-${H.axis}`,style:F(H.line)}):null,
2
- /* @__PURE__ */A("div",{className:"es-canvas-handle-spot",style:V?{"--es-handle-x":`${V.box.left+2}px`,"--es-handle-y":`${Math.max(V.box.top-11,0)}px`}:void 0,children:/* @__PURE__ */A(w,{className:"es-canvas-handle-tip",side:"top",content:!V||x||Z?null:V.title??D.handle({label:V.label}),children:/* @__PURE__ */N("div",{className:["es-canvas-handle",V&&!x?"is-shown":"",Z?"is-dragging":""].filter(Boolean).join(" "),...re,children:[
3
- /* @__PURE__ */A("span",{className:"es-canvas-grip","aria-hidden":"true",children:"⋮⋮"}),V?.label]})})})]})}var Q=e=>e.tiles.length>0&&e.tiles.every(e=>null!=e.cover);function V({groups:t,session:n,itemFor:l,onInsert:r,at:a,hint:o,searchLabel:s,readOnly:i,words:c=e.add}){const d=o??c.hint,u=s??c.search,[f,p]=g(""),m=x(),b=f.trim().toLowerCase(),y=function(e){const t=/* @__PURE__ */new Map;return e.map(e=>{const n=e.key??e.title,l=t.get(n)??0;return t.set(n,l+1),0===l?n:`${n}\0${l}`})}(t),v=t.map((e,t)=>({...e,key:y[t],tiles:b?e.tiles.filter(e=>((e,t)=>e.label.toLowerCase().includes(t)||(e.keywords??[]).some(e=>e.toLowerCase().includes(t)))(e,b)):e.tiles})).filter(e=>e.tiles.length>0),k=(e,t)=>r=>{if(t)r.preventDefault();else{n.start({key:`new:${e}`,item:l(e)}),r.dataTransfer.effectAllowed="copy";try{r.dataTransfer.setData("text/plain",e)}catch{}}};/* @__PURE__ */
4
- return N("div",{className:"es-add",children:[a?/* @__PURE__ */N("div",{className:"es-add-at",role:"status",children:[
5
- /* @__PURE__ */A("span",{children:a.label}),h(c.stop,/* @__PURE__ */A("button",{type:"button",className:"es-add-at-clear","aria-label":c.stop,onClick:a.onClear,children:/* @__PURE__ */A(D,{size:12,"aria-hidden":"true"})}))]}):null,
6
- /* @__PURE__ */A("p",{className:"es-add-hint",children:d}),
7
- /* @__PURE__ */N("div",{className:"es-add-search",children:[
8
- /* @__PURE__ */A(z,{size:16,"aria-hidden":"true"}),
9
- /* @__PURE__ */A("input",{id:m,type:"search","aria-label":u,placeholder:c.searchPlaceholder({label:u}),value:f,onChange:e=>p(e.target.value)}),f?/* @__PURE__ */A("button",{type:"button",className:"es-add-search-clear","aria-label":c.clearSearch,onClick:()=>p(""),children:/* @__PURE__ */A(D,{size:12,"aria-hidden":"true"})}):null]}),0===v.length?/* @__PURE__ */N("div",{className:"es-add-empty",role:"status",children:[
10
- /* @__PURE__ */A("div",{className:"es-add-empty-title",children:c.nothing({query:f.trim()})}),
11
- /* @__PURE__ */A("div",{className:"es-add-empty-sub",children:c.tryAnother})]}):v.map(e=>/* @__PURE__ */N("section",{className:"es-add-group","aria-label":e.title,children:[
12
- /* @__PURE__ */N("div",{className:"es-add-group-head",children:[
13
- /* @__PURE__ */A("span",{className:"es-add-group-title",children:e.title}),
14
- /* @__PURE__ */A("span",{className:"es-add-group-count",children:e.tiles.length})]}),
15
- /* @__PURE__ */A("div",{className:Q(e)?"es-add-grid is-cards":"es-add-grid",children:e.tiles.map(e=>{const t=Boolean(i||e.disabled),l=i?void 0:e.disabled?e.disabledReason:e.title??c.tile({label:e.label});return h(l,/* @__PURE__ */N("button",{type:"button",className:null!=e.cover?"es-add-tile has-cover":"es-add-tile",draggable:!t,"aria-disabled":t||void 0,"aria-label":c.tile({label:e.label}),onDragStart:k(e.type,t),onDragEnd:()=>n.end(),onClick:()=>!t&&r(e.type),children:[null!=e.cover?/* @__PURE__ */A("span",{className:"es-add-tile-cover","aria-hidden":"true",children:e.cover}):e.icon?/* @__PURE__ */A("span",{className:"es-add-tile-glyph","aria-hidden":"true",children:e.icon}):null,
16
- /* @__PURE__ */A("span",{className:"es-add-tile-label",children:e.label})]},e.type))})})]},e.key))]})}export{V as AddPanel,R as CanvasDragLayer,B as EMPTY_MEASURE,Z as HANDLE_GRACE_MS,j as canvasTarget,T as contains,$ as gapInZone,L as gapLine,q as measureCanvas,E as pickSource,M as seamsBetween,S as sourcesAt};
@@ -1 +0,0 @@
1
- import{panelFieldsOf as t}from"./chunk-ZE7I3PLX.js";import{withoutDeviceGate as o,deviceMetaOf as n}from"./chunk-PAM3NLFL.js";import{BUCKET_KEY as r}from"./chunk-R2HLPNQF.js";import{ANCHOR_FIELD_KEYS as e,foldMetaOf as s,MEDIA_FIELD_MARKER as c,TEXT_FIELD_MARKER as p,LINK_FIELD_MARKER as i}from"./chunk-DUVRZ456.js";import{STYLE_KIND as u,fieldKind as f,copyStyle as a,heldStyle as l,planPaste as m,pasteMessage as y}from"./chunk-V7U33NF2.js";var h=/* @__PURE__ */new Set([r.Style,r.Layout]),j=new Set(Object.values(r)),w=new Set(e),b=/* @__PURE__ */new Set(["focal","imageFocal"]),k=[c,p,i];function L(t){return`site:${t??""}`}function S(t){if(!t||"object"!=typeof t)return null;const n=t,r=o(t)??t,e=n[u]??r[u];if("string"==typeof e)return e;const s=n.options??r.options;if(Array.isArray(s)){return`choice:${s.map(t=>String(t?.value)).sort().join("|")}`}return f(r)}function g(t){const n=t,r=o(t);return k.some(t=>t in n||r&&t in r)}function v(o,r){const e=t(o,r)??{},c=[];let p=!1;for(const[t,o]of Object.entries(e))j.has(t)?p=h.has(t):p&&o&&"object"==typeof o&&!t.startsWith("_")&&(s(o)||w.has(t)||b.has(t)||g(o)||"slot"!==o.type&&c.push({path:[t],kind:S(o),counted:"mobile"!==n(o)?.tier}));return c}function F(t,o,n,r,e){a({scope:n,type:r.type,label:e,rows:t(o,r),props:r.props})}function d(t,o,n,r,e,s){const c=l(n);if(!c)return null;const p=m(c,{type:r.type,rows:t(o,r),props:r.props});return{...p,message:y(p,c.sourceLabel,e,s)}}function A(t,o,n,r){F(v,t,o,n,r)}function N(t,o,n,r,e){return d(v,t,o,n,r,e)}var P={scope:t=>L(t.siteId),rows:(t,o)=>v(t,o),copy:(t,o,n,r)=>A(r,t,o,n),plan:(t,o,n,r)=>N(r,t,o,n)};function I(t,o){if(!t&&!o)return P;const n=t?.rows,r=n?(t,o)=>n(t,o):v;return{scope:t?.scope??P.scope,rows:(t,o)=>r(t,o),copy:t?.copy??((t,o,n,e)=>F(r,e,t,o,n)),plan:t?.plan??((t,n,e,s)=>d(r,s,t,n,e,o))}}export{A as copyNodeStyle,v as nodeStyleRows,N as planNodePaste,S as shopFieldKind,L as siteStyleScope,I as styleClipboardOf};
@@ -1,20 +0,0 @@
1
- import{FieldSelect as e}from"./chunk-OZ72A6MY.js";import{TreeSeam as n}from"./chunk-UFY6RNMT.js";import{SettingsField as t,SETTINGS_BUCKETS as l,SettingsTabs as a,SettingsGroup as r}from"./chunk-YNOZ5NXW.js";import{DEFAULT_TREE_WORDS as i}from"./chunk-K56YDHYQ.js";import{DEFAULT_PANEL_WORDS as o}from"./chunk-QTLAVDJE.js";import{EaselMenuItems as s}from"./chunk-EA2HTX37.js";import{FieldNumber as c}from"./chunk-66LWADFP.js";import{SettingsSegmented as d}from"./chunk-QLD57GBB.js";import{DEFAULT_FIELDS_WORDS as u}from"./chunk-FFYXVAAL.js";import{useWords as m}from"./chunk-MFIRYGHW.js";import{useTreeDrag as p,gapToMoveIndex as h}from"./chunk-67GNT6PF.js";import{withTip as b}from"./chunk-P2VEMZH5.js";import{Textarea as f,Input as g,SortableList as v,ListRow as y,ContextMenu as x,tabPanelId as k,tabButtonId as w}from"efficient-shell/ui";export{LinkPicker}from"efficient-shell/ui";import{useRef as N,useState as O,useLayoutEffect as C,useId as j}from"react";import{jsx as D,jsxs as I}from"react/jsx-runtime";import{ChevronIcon as $,LockIcon as S,MoveUpIcon as P,MoveDownIcon as L,DuplicateIcon as F,TrashIcon as M}from"efficient-shell/icons/efficient";function T({id:e,value:n,onChange:t,placeholder:l,multiline:a=!1,rows:r=3,readOnly:i=!1,ariaLabel:o,ariaLabelledBy:s}){const c=n??"";return a?/* @__PURE__ */D(f,{id:e,size:"sm",className:"es-fin",value:c,rows:r,placeholder:l,readOnly:i,"aria-label":o,"aria-labelledby":s,onChange:e=>t(e.target.value)}):/* @__PURE__ */D(g,{id:e,size:"sm",className:"es-fin",type:"text",value:c,placeholder:l,readOnly:i,"aria-label":o,"aria-labelledby":s,onChange:e=>t(e.target.value)})}function A(e,n,t){const l=e.slice();return l.splice(Math.max(0,Math.min(n,l.length)),0,t),l}function E(e,n,t){const l=e.slice(),[a]=l.splice(n,1);return l.splice(Math.max(0,Math.min(t,l.length)),0,a),l}function R(e,n){return e.filter((e,t)=>t!==n)}function z(e){return null===e||"object"!=typeof e?e:JSON.parse(JSON.stringify(e))}var Y='input, textarea, select, button, [contenteditable]:not([contenteditable="false"]), [tabindex]',H={parentId:"list",slot:"items"};function B({label:e,icon:t,noun:l,items:a,onChange:r,newItem:o,summary:c,itemName:d,thumb:f,min:g=0,max:k,readOnly:w=!1,open:j,onOpen:T,renderItem:B,renderRow:K,canRemove:V,lockedReason:X,fixed:G=!1,removeOnRow:J=!0,canDuplicate:Q,above:W,head:Z=!0}){const q=m("fields",u).list,U=m("tree",i),_=l??q.item,ee=!w&&!G&&("number"!=typeof k||a.length<k),ne=a.length<=g,te=e=>!!V&&!V(a[e],e),le=e=>!w&&!G&&J&&!ne&&!te(e),ae=e=>ee&&(!Q||Q(a[e],e)),re=(e,n)=>d?d(e,n):q.itemName({noun:_,n:n+1}),ie=N([]),oe=N(null),[se,ce]=O(null),de=N(null),[ue,me]=O(null),[pe,he]=O("");C(()=>{const e=oe.current;if(!e)return;oe.current=null;const n=ie.current[e.index]?.querySelectorAll(Y)[e.nth]??ie.current[e.index];if(n?.focus(),n&&null!==e.start&&"setSelectionRange"in n)try{n.setSelectionRange(e.start,e.end)}catch{}});const be=(e,n)=>{if(n<0||n>=a.length||n===e)return;const t=ie.current[e],l=t?.ownerDocument.activeElement;if(t&&l&&t.contains(l)){const e=[...t.querySelectorAll(Y)].indexOf(l),a=l;oe.current={index:n,nth:e,start:"number"==typeof a.selectionStart?a.selectionStart:null,end:"number"==typeof a.selectionEnd?a.selectionEnd:null}}r(E(a,e,n));const i=function(e,n,t){return null===e?null:e===n?t:n<e&&t>=e?e-1:n>e&&t<=e?e+1:e}(j,e,n);i!==j&&T(i),he(q.moved({n:n+1,total:a.length}))},fe=e=>{ee&&(r(A(a,e,o())),K?(oe.current={index:e,nth:0,start:null,end:null},null!==j&&j>=e&&T(j+1)):T(e))},ge=e=>{le(e)&&(r(R(a,e)),j===e?T(null):null!==j&&j>e&&T(j-1))},ve=p({keyOf:e=>String(e),canDrop:(e,n)=>n.parentId===H.parentId&&n.slot===H.slot,onDrop:(e,n)=>{const t=h({...H,index:e},n);t!==e&&be(e,t)},onStep:(e,n)=>be(e,e+n),canStep:(e,n)=>e+n>=0&&e+n<a.length,readOnly:w}),ye=e=>{const n=[];return e>0&&n.push({label:q.moveUp,icon:/* @__PURE__ */D(P,{size:14}),shortcut:"⌥↑",onClick:()=>be(e,e-1)}),e<a.length-1&&n.push({label:q.moveDown,icon:/* @__PURE__ */D(L,{size:14}),shortcut:"⌥↓",onClick:()=>be(e,e+1)}),ae(e)&&n.push({label:q.duplicate,icon:/* @__PURE__ */D(F,{size:14}),onClick:()=>(e=>{ae(e)&&(r(A(a,e+1,z(a[e]))),null!==j&&j>e&&T(j+1))})(e)}),le(e)&&n.push({label:q.delete,icon:/* @__PURE__ */D(M,{size:14}),danger:!0,onClick:()=>ge(e)}),n},xe=(e,n,t,l)=>{w||0===ye(e).length||me({index:e,x:n,y:t,owner:l})},ke=e=>n=>{const t=a.slice();t[e]=n,r(t)};/* @__PURE__ */
2
- return I("div",{className:"es-list",children:[Z?/* @__PURE__ */I("div",{className:"es-list-head",children:[
3
- /* @__PURE__ */I("span",{className:"es-list-label",children:[t?/* @__PURE__ */D("span",{className:"es-field-icon","aria-hidden":"true",children:t}):null,e]}),
4
- /* @__PURE__ */D("span",{className:"es-list-count",children:a.length})]}):null,W?/* @__PURE__ */D("div",{className:"es-list-above",children:W}):null,a.length?/* @__PURE__ */I(v,{"aria-label":e,spacing:"comfortable",className:"es-list-rows",rootProps:ve.rootProps(),children:[a.map((e,t)=>{const l=ve.row({item:t,place:{...H,index:t}}),a=l.draggable&&se!==t,r=!K&&j===t,i=!w&&!G&&J&&te(t),o=["es-list-row",K?"is-inline":"is-item",r?"is-open":"",a?"is-draggable":"",l.dragging?"is-dragging":"",l.drop?`is-drop-${l.drop}`:""].filter(Boolean).join(" ");return[t>0?/* @__PURE__ */D(n,{...ve.seam({place:{...H,index:t}}),onAdd:ee?()=>fe(t):void 0,label:q.addHere({noun:_})},`seam-${t}`):null,
5
- /* @__PURE__ */D(y,{className:o,flat:!!K,active:r,draggable:l.draggable,dragHint:U.dragHint,dragging:l.dragging,drop:"before"===l.drop||"after"===l.drop?l.drop:void 0,onMove:l.draggable?e=>be(t,"up"===e?t-1:t+1):void 0,rowRef:e=>{ie.current[t]=e},rowProps:{...l.rowProps,draggable:a||void 0,onPointerDown:e=>{const n=e.target.closest?.('input, textarea, select, [contenteditable]:not([contenteditable="false"])'),a=!!n&&n===n.ownerDocument.activeElement;e.currentTarget.draggable=l.draggable&&!a,de.current=n&&!a?n:null,ce(a?t:null)},onDragStart:e=>{const n=de.current;de.current=null,n&&n.ownerDocument.activeElement===n&&n.blur(),l.rowProps.onDragStart?.(e)},onContextMenu:e=>{w||(e.preventDefault(),e.stopPropagation(),xe(t,e.clientX,e.clientY,e.currentTarget))},onKeyDown:e=>{if("ContextMenu"===e.key||e.shiftKey&&"F10"===e.key){e.preventDefault();const n=e.currentTarget.ownerDocument,l=e=>e.preventDefault();n.addEventListener("contextmenu",l,{capture:!0,once:!0}),n.defaultView?.setTimeout(()=>n.removeEventListener("contextmenu",l,{capture:!0}),500);const a=e.currentTarget.getBoundingClientRect();return void xe(t,a.left+24,a.bottom,e.currentTarget)}l.rowProps.onKeyDown?.(e)}},actions:w||G||!J?void 0:i?b(X?X(e,t):q.locked,/* @__PURE__ */D("span",{className:"es-list-lock",role:"img","aria-label":X?X(e,t):q.locked,children:/* @__PURE__ */D(S,{size:13})})):b(q.deleteItem({noun:_}),/* @__PURE__ */D("button",{type:"button",className:"es-list-x","aria-label":q.deleteItem({noun:_}),disabled:!le(t),onClick:()=>ge(t),children:"×"})),below:r?/* @__PURE__ */D("div",{className:"es-list-item",children:B(e,t,ke(t))}):void 0,children:K?/* @__PURE__ */D("div",{className:"es-list-row-main",children:K(e,t,ke(t))}):/* @__PURE__ */I("button",{type:"button",className:"es-list-open","aria-expanded":r,onClick:()=>T(r?null:t),children:[f?/* @__PURE__ */D("span",{className:"es-list-thumb","aria-hidden":"true",children:f(e,t)}):null,
6
- /* @__PURE__ */D("span",{className:"es-list-row-name",children:re(e,t)}),/* @__PURE__ */D("span",c?{className:"es-list-row-summary",children:c(e,t)}:{className:"es-list-row-summary"}),
7
- /* @__PURE__ */D($,{size:14,className:"es-list-chev","aria-hidden":"true"})]})},t)]}),
8
- /* @__PURE__ */D(n,{...ve.seam({place:{...H,index:a.length}})})]}):null,w||G?null:/* @__PURE__ */D("button",{type:"button",className:"es-list-add",disabled:!ee,onClick:()=>fe(a.length),children:q.add({noun:_})}),
9
- /* @__PURE__ */D("span",{className:"es-list-said","aria-live":"polite",children:pe}),ue&&ue.index<a.length?
10
- /* @__PURE__ */D(x,{at:{x:ue.x,y:ue.y},owner:ue.owner,onClose:()=>me(null),children:/* @__PURE__ */D(s,{items:ye(ue.index),onClose:()=>me(null)})}):null]})}var K=(e,n)=>"string"==typeof e.label&&e.label?e.label:n;function V({field:e,name:n,id:t,value:l,onChange:a,readOnly:i,context:o,renderers:s}){const[c,d]=O(!0),u=l&&"object"==typeof l?l:{};/* @__PURE__ */
11
- return D(r,{id:`${t}-group`,title:K(e,n),open:c,onToggle:d,children:Object.entries(e.objectFields).map(([e,l])=>/* @__PURE__ */D(G,{field:l,name:`${n}.${e}`,id:`${t}-${e}`,value:u[e],onChange:n=>a({...u,[e]:n}),readOnly:i,context:o,renderers:s},e))})}function X({field:e,name:n,id:t,value:l,onChange:a,readOnly:r,context:i,renderers:o,openItem:s,onOpenItem:c}){const[d,u]=O(null),m=c?s??null:d,p=c??u,h=Array.isArray(l)?l:[],b=e.getItemSummary;/* @__PURE__ */
12
- return D(B,{label:K(e,n),icon:e.icon,noun:"string"==typeof e.noun?e.noun:void 0,items:h,onChange:a,newItem:()=>z({...e.defaultItemProps??{}}),summary:b?(e,n)=>b(e,n):void 0,min:e.min,max:e.max,readOnly:r,open:m,onOpen:p,renderItem:(l,a,s)=>Object.entries(e.arrayFields).map(([e,c])=>/* @__PURE__ */D(G,{field:c,name:`${n}[${a}].${e}`,id:`${t}-${a}-${e}`,value:l?.[e],onChange:n=>s({...l,[e]:n}),readOnly:r,context:i,renderers:o},e))})}function G(n){const{field:l,name:a,id:r,value:i,onChange:o,readOnly:s,context:u,renderers:m}=n;if(!l||l.marker||!1===l.visible)return null;const p=m?.[l.type];if(p)return p({field:l,name:a,id:r,value:i,onChange:o,readOnly:s});switch(l.type){case"custom":{const e={...u,field:l,name:a,id:r,value:i,onChange:o,readOnly:s};return l.render(e)}case"text":case"textarea":/* @__PURE__ */
13
- return D(t,{label:K(l,a),htmlFor:r,icon:l.icon,hint:l.hint,children:/* @__PURE__ */D(T,{id:r,value:"string"==typeof i?i:null==i?"":String(i),onChange:o,placeholder:l.placeholder,multiline:"textarea"===l.type,readOnly:s})});case"number":/* @__PURE__ */
14
- return D(t,{label:K(l,a),htmlFor:r,icon:l.icon,hint:l.hint,children:/* @__PURE__ */D(c,{id:r,value:"number"==typeof i?i:void 0,onChange:o,min:l.min,max:l.max,step:l.step,placeholder:l.placeholder,readOnly:s})});case"select":{const n=`${r}-label`;/* @__PURE__ */
15
- return D(t,{label:K(l,a),labelId:n,htmlFor:r,icon:l.icon,hint:l.hint,children:/* @__PURE__ */D(e,{id:r,value:i,options:l.options,onChange:o,readOnly:s,ariaLabelledBy:n})})}case"radio":/* @__PURE__ */
16
- return D(t,{label:K(l,a),icon:l.icon,hint:l.hint,children:/* @__PURE__ */D(d,{ariaLabel:K(l,a),value:i,options:l.options.map(e=>({id:e.value,label:e.label,icon:e.icon,disabled:e.disabled||s})),onChange:e=>{s||o(e)}})});case"object":/* @__PURE__ */
17
- return D(V,{...n,field:l});case"array":/* @__PURE__ */
18
- return D(X,{...n,field:l});case"slot":return null}}var J=e=>l.includes(e);function Q(e){let n=l[0];const t=[],a=/* @__PURE__ */new Set;for(const[l,r]of Object.entries(e))r&&(J(r.bucket)&&(n=r.bucket),r.marker||!1===r.visible||(t.push({name:l,field:r,bucket:n}),"slot"!==r.type&&a.add(n)));return{rows:t,buckets:l.filter(e=>a.has(e))}}function W(e){return new Map(Q(e).rows.map(e=>[e.name,e.bucket]))}function Z({fields:e,values:n,onChange:t,readOnly:l=!1,context:r,tab:i,onTab:s,tabs:c=!0,tabIcons:d,renderers:u,idPrefix:p,ariaLabel:h,children:b}){const f=m("panel",o),g=j(),v=p??`es-insp${g.replace(/:/g,"")}`,y=Q(e),[x,N]=O(void 0),C=i??x,$=C&&y.buckets.includes(C)?C:y.buckets[0],[S,P]=O(null),L=S&&S.panel===v&&y.rows.some(e=>e.name===S.name)?S:null,F=c&&y.buckets.length>1,M=F&&$?k(v,$):`${v}-rows`;/* @__PURE__ */
19
- return I("div",{className:"es-insp",children:[F?/* @__PURE__ */D("div",{className:"es-insp-tabs",children:/* @__PURE__ */D(a,{ariaLabel:h??f.settings,activeId:$,onSelect:e=>{const n=e;void 0===i&&N(n),s?.(n)},items:y.buckets.map(e=>({id:e,label:f.buckets[e],icon:d?.[e]})),idPrefix:v})}):null,
20
- /* @__PURE__ */I("div",{className:"es-insp-rows",id:M,role:F?"tabpanel":void 0,"aria-labelledby":F&&$?w(v,$):void 0,children:[y.rows.map(({name:e,field:a,bucket:i})=>/* @__PURE__ */D("div",{className:"es-insp-row","data-field":e,"data-bucket":i,hidden:!(!F||i===$)||void 0,children:/* @__PURE__ */D(G,{field:a,name:e,id:`${v}-${e}`,value:n[e],onChange:n=>t(e,n),readOnly:l,context:r,renderers:u,openItem:L&&L.name===e?L.index:null,onOpenItem:n=>P(null===n?null:{panel:v,name:e,index:n})})},e)),b]})]})}export{T as FieldText,Z as Inspector,G as InspectorField,B as ListField,W as bucketsOf,z as copyItem,A as insertAt,K as labelOf,E as moveTo,Q as planFields,R as removeAt};
@@ -1,5 +0,0 @@
1
- import{blockTypesIn as e}from"./chunk-5ZBY24K7.js";import{buildPaletteSections as t,pinnedSection as o,paletteWithoutPinned as n,categoryLabel as i}from"./chunk-PA3PNTVV.js";import{sectionTemplatesOf as s}from"./chunk-BVN33R76.js";import{SidePanelHead as r,PanelModeExit as c}from"./chunk-5SOSVTVI.js";import{useEaselSession as l}from"./chunk-O7Q4DDJT.js";import{blockRuns as a}from"./chunk-HQ4VVRIC.js";import{useScreenBlockLook as p,useScreenBlockRules as m}from"./chunk-YIKMVF24.js";import{DEFAULT_SCREEN_WORDS as d}from"./chunk-MCHMF32I.js";import{useEasel as f}from"./chunk-XW4AV5N4.js";import{useWords as u}from"./chunk-MFIRYGHW.js";import{AddPanel as k}from"./chunk-2GLQRNYT.js";import{DEFAULT_DRAG_WORDS as h}from"./chunk-O2NLQBFX.js";import{useState as y,useEffect as b,useMemo as j}from"react";import{AddIcon as g}from"efficient-shell/icons/efficient";import{jsx as $,jsxs as O,Fragment as V}from"react/jsx-runtime";var B=e=>`section:${e}`,I=e=>`block:${e}`,v=e=>`template:${e}`;function N({blocks:N,blocksOnly:x,at:F,onAdd:L,itemFor:A,session:H,siteWide:T,onClose:C,onHide:M,readOnly:Q}){const R=f(e=>e.config),S=p(),{labelAtLevel:Y,categoryLabel:w,firstSection:D,Icon:W,Thumbnail:z}=S,{blockIsOffered:G}=m(),K=u("screen",d).add,P=u("drag",h).add,X=l(),[E,J]=y([]);b(()=>{let t=!1;const o=e=>G(e,X);return s(X).list().then(n=>{if(t)return;const i=R.components;J(n.filter(t=>t.node?.type&&i[t.node.type]&&e(t.node).every(o)))}).catch(()=>{}),()=>{t=!0}},[R,X]);const Z=j(()=>t(R,S),[R]),q=e=>({type:B(e.type),label:e.name,cover:/* @__PURE__ */$(z,{type:e.type}),title:e.desc?`${e.name} — ${e.desc}`:K.tile({name:e.name}),keywords:[e.alias??"",e.desc,e.type,e.catLabel].filter(Boolean)}),U=j(()=>{const e=[];if(N&&N.choices.length>0&&a(N.choices).forEach((t,o)=>{e.push({key:`blocks:${o}`,title:0===o?`${K.inside({name:N.parentName})}${t.group?` · ${t.group}`:""}`:t.group??"",tiles:t.items.map(e=>({type:I(e.type),label:e.label,icon:/* @__PURE__ */$(W,{type:e.type,size:18}),title:K.tile({name:e.label})}))})}),x)return e;const t=o(Z,D);t&&e.push({key:"start",title:K.startBlank,tiles:[q(t)]}),E.length>0&&e.push({key:"templates",title:K.templates,tiles:E.map(e=>{return{type:v(e.id),label:e.name,cover:/* @__PURE__ */$(z,{type:e.node.type}),keywords:[(t=e.node.type,Y(t,"section",R.components[t]?.label??t)),e.node.type]};var t})});const s=n(Z,D);for(const t of Object.keys(R.categories??{})){const o=s.filter(e=>e.cat===t);0!==o.length&&e.push({key:`category:${t}`,title:i(R,t,w),tiles:o.map(q)})}return e},[N,x,E,Z,R,K]),_=e=>{const t=e.indexOf(":"),o=e.slice(0,t),n=e.slice(t+1);if("section"===o)return{kind:"section",type:n};if("block"===o)return{kind:"block",type:n};if("template"===o){const e=E.find(e=>e.id===n);return e?{kind:"template",template:e}:null}return null};/* @__PURE__ */
2
- return O(V,{children:[
3
- /* @__PURE__ */$(r,{icon:/* @__PURE__ */$(g,{size:15}),title:K.title,context:x?K.contextBlocks:K.contextAll,actions:/* @__PURE__ */$(c,{label:K.done,description:K.doneDescription,onClick:C}),onHide:M}),
4
- /* @__PURE__ */O("div",{className:"sf-addside sf-scroll",children:[
5
- /* @__PURE__ */$(k,{groups:U,session:H,itemFor:e=>A(_(e)??{kind:"section",type:e}),onInsert:e=>{const t=_(e);t&&L(t)},at:F,hint:x?K.hintBlocks:K.hint,searchLabel:x?K.searchBlocks:K.searchSections,readOnly:Q,words:P}),T&&!x?T:null]})]})}export{N as AddSidePanel,I as blockKey,B as sectionKey,v as templateKey};
@@ -1 +0,0 @@
1
- var t={settings:"Settings",buckets:{Content:"Content",Style:"Style",Layout:"Layout",Animation:"Animation"},followsDefault:"Default",reset:"Reset",resetName:({label:t})=>`Reset ${t}`,backToDefault:({detail:t})=>`Back to default: ${t}`,resetTitle:({label:t,detail:e})=>`Reset ${t} (back to ${e})`};export{t as DEFAULT_PANEL_WORDS};
@@ -1 +0,0 @@
1
- var t={Content:"_sContent",Style:"_sStyle",Layout:"_sLayout",Animation:"_sAnimation"};export{t as BUCKET_KEY};
@@ -1,9 +0,0 @@
1
- import{DEFAULT_TREE_WORDS as e}from"./chunk-K56YDHYQ.js";import{useContext as r,createContext as a,isValidElement as l}from"react";import{Tree as o,TreeGroupLabel as n,TreeGroup as i,Tooltip as s,TreeRow as t,IconButton as d,TreeSeam as c,TreeEmptySlot as m}from"efficient-shell/ui";import{jsx as p,jsxs as g,Fragment as h}from"react/jsx-runtime";var u,b=()=>u??=a(1),f=()=>r(b());function k({className:r,children:a,rootProps:l,ariaLabel:n,words:i=e}){/* @__PURE__ */
2
- return p(o,{"aria-label":n??i.name??e.name,className:r?`es-tree ${r}`:"es-tree",rootProps:l,children:a})}function v({children:e}){/* @__PURE__ */
3
- return p(n,{children:e})}function w({children:e}){const r=f(),a=b();/* @__PURE__ */
4
- return p(a.Provider,{value:r+1,children:/* @__PURE__ */p(i,{children:e})})}var N=e.dragHint,P=e=>[e].flat(1/0).some(e=>l(e)&&!0===e.props.pressed);function y({icon:r,name:a,preview:l,selected:o,hidden:n,draggable:i,dragHint:d,dragging:c,drop:m,fold:u,actions:b,nameSlot:k,onSelect:v,marks:w,badge:N,trailing:y,children:A,rowProps:S,level:T,words:H=e}){const j=f(),B=["es-tree-row",o?"is-selected":"",n?"is-hidden":"",i?"is-draggable":"",c?"is-dragging":"",m?`is-drop-${m}`:""].filter(Boolean).join(" "),C=/* @__PURE__ */g(h,{children:[
5
- /* @__PURE__ */p("span",{className:"es-tree-name",children:a}),w?.map(e=>/* @__PURE__ */p(s,{content:e.label,children:/* @__PURE__ */p("span",{className:"es-tree-mark","aria-label":e.label,role:"img",children:e.icon})},e.key)),y?/* @__PURE__ */p(s,{content:y.label,children:/* @__PURE__ */p("span",{className:"es-tree-trailing","aria-label":y.label,role:"img",children:y.icon})}):null,A]}),x=S?.onClick,$={click:!1},D=x?e=>{x(e),$.click=!0,queueMicrotask(()=>{$.click=!1})}:void 0,L=v?()=>{$.click||v()}:void 0;/* @__PURE__ */
6
- return p(t,{label:C,level:T??j,icon:r,preview:l,selected:!!o,expanded:u?u.open:void 0,onToggle:u?.onToggle,onSelect:L,muted:!!n,badge:N,actions:b,actionsPinned:P(b),rename:k,drop:m,dragging:!!c,draggable:!!i,dragHint:d??H.dragHint,className:B,rowProps:{...S,onClick:D,...i?{"aria-keyshortcuts":"Alt+ArrowUp Alt+ArrowDown"}:{}}})}function A({kind:e,label:r,onClick:a,pressed:l,disabled:o,children:n}){/* @__PURE__ */
7
- return p(s,{content:r,children:/* @__PURE__ */p(d,{"aria-label":r,"aria-pressed":l,"aria-disabled":o||void 0,variant:"delete"===e?"ghost-danger":"ghost",size:"sm","data-kind":e,className:o?"es-tree-act-off":void 0,onClick:e=>{e.stopPropagation(),a()},children:n})})}function S({drop:e,onAdd:r,label:a,seamProps:l}){const o=["es-tree-seam",e?"is-drop":"",r?"has-add":"",l?.className??""].filter(Boolean).join(" "),n={...l,className:o};/* @__PURE__ */
8
- return p(c,{drop:!!e,onInsert:r,label:a,seamProps:n})}function T({drop:r,onAdd:a,label:l,seamProps:o,words:n=e}){const i=l??(a?n.addBlock??e.addBlock:n.emptySlot??e.emptySlot),s={...o,className:o?.className?`es-tree-empty ${o.className}`:"es-tree-empty"};/* @__PURE__ */
9
- return p(m,{drop:!!r,onAdd:a,label:i,slotProps:s})}export{k as LayersTree,w as Subtree,N as TREE_DRAG_HINT,T as TreeEmptySlot,v as TreeGroupLabel,y as TreeRow,A as TreeRowAction,S as TreeSeam};