efficient-easel 22.0.0 → 23.1.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 (151) hide show
  1. package/README.md +45 -23
  2. package/dist/{CanvasDragLayer-B6Yn9S8T.d.ts → CanvasDragLayer-NZpaX6aq.d.ts} +15 -4
  3. package/dist/{ScreenDocumentContext-BIK3uWtF.d.ts → ScreenDocumentContext-BDLUYzlM.d.ts} +4 -4
  4. package/dist/blocks/index.d.ts +11 -11
  5. package/dist/canvas/index.d.ts +21 -9
  6. package/dist/canvas/index.js +1 -1
  7. package/dist/{canvas-typing-Be4FO4q7.d.ts → canvas-typing-DOBx8dD3.d.ts} +12 -2
  8. package/dist/chunk-22I55W37.js +2 -0
  9. package/dist/chunk-2FYFAAAK.js +2 -0
  10. package/dist/{chunk-3S5N4HLJ.js → chunk-6NJHYXJM.js} +1 -1
  11. package/dist/chunk-6QSFJCJT.js +21 -0
  12. package/dist/{chunk-BTDI7JAA.js → chunk-A6ZP5II4.js} +2 -2
  13. package/dist/{chunk-IWCKVZHS.js → chunk-AGWKB77Q.js} +1 -1
  14. package/dist/chunk-AT4DDMJS.js +1 -0
  15. package/dist/chunk-DSKNJXB4.js +1 -0
  16. package/dist/{chunk-ZOSEBPAI.js → chunk-GKG3M5QK.js} +1 -1
  17. package/dist/{chunk-XWKQP6AE.js → chunk-HNV6HUSQ.js} +4 -4
  18. package/dist/chunk-HZSZT3BE.js +7 -0
  19. package/dist/{chunk-EB6NI2VK.js → chunk-IYHO4XQX.js} +1 -1
  20. package/dist/chunk-IZGFJWH4.js +1 -0
  21. package/dist/{chunk-KN2TIXUT.js → chunk-JPCOBNYW.js} +1 -1
  22. package/dist/{chunk-YC6KLSW3.js → chunk-JWOBAEBH.js} +1 -1
  23. package/dist/chunk-KXM6YRG2.js +1 -0
  24. package/dist/chunk-LN43DP2A.js +18 -0
  25. package/dist/{chunk-IROEWITG.js → chunk-LSTOOYG7.js} +1 -1
  26. package/dist/{chunk-TXR7GC5A.js → chunk-NQ7NRYTK.js} +8 -8
  27. package/dist/chunk-OXZDSOZV.js +1 -0
  28. package/dist/{chunk-BSHIQIZC.js → chunk-RPMSET77.js} +1 -1
  29. package/dist/{chunk-TLN5ZT76.js → chunk-T3LAGI43.js} +1 -1
  30. package/dist/chunk-TGSK5VII.js +5 -0
  31. package/dist/{chunk-K7BTCBWD.js → chunk-TGZCD6IP.js} +1 -1
  32. package/dist/chunk-VBOSOH5M.js +16 -0
  33. package/dist/{chunk-RY5AWQ63.js → chunk-VHFLOHGQ.js} +1 -1
  34. package/dist/chunk-YCSZAP7T.js +1 -0
  35. package/dist/chunk-YU3WHLGI.js +1 -0
  36. package/dist/chunk-Z6V22QRZ.js +64 -0
  37. package/dist/copy/index.d.ts +20 -6
  38. package/dist/copy/index.js +29 -29
  39. package/dist/data/index.d.ts +30 -22
  40. package/dist/data/index.js +1 -1
  41. package/dist/drag/drag.css +10 -1
  42. package/dist/drag/index.d.ts +5 -5
  43. package/dist/drag/index.js +1 -1
  44. package/dist/draw/index.d.ts +1 -1
  45. package/dist/easel/easel.css +24 -14
  46. package/dist/easel/index.d.ts +90 -53
  47. package/dist/easel/index.js +1 -1
  48. package/dist/edit-lock/index.d.ts +5 -5
  49. package/dist/fields/fields.css +1 -1
  50. package/dist/fields/index.d.ts +50 -16
  51. package/dist/fields/index.js +1 -1
  52. package/dist/node-ops/index.d.ts +3 -3
  53. package/dist/node-ops/index.js +1 -1
  54. package/dist/panel/index.d.ts +1 -1
  55. package/dist/panel/panel.css +6 -1
  56. package/dist/pick/index.d.ts +5 -5
  57. package/dist/{plan-CRUh2kVK.d.ts → plan-D0DgSLnY.d.ts} +5 -5
  58. package/dist/render/index.d.ts +13 -13
  59. package/dist/render/index.js +1 -1
  60. package/dist/{resolve-AJ6WF4EL.d.ts → resolve-Bz4mszpL.d.ts} +5 -5
  61. package/dist/rowMarks-CO5TpfLY.d.ts +44 -0
  62. package/dist/screen/components/AddBlockRow.js +1 -1
  63. package/dist/screen/components/AddSidePanel.d.ts +2 -2
  64. package/dist/screen/components/AddSidePanel.js +1 -1
  65. package/dist/screen/components/NodeContextMenu.d.ts +17 -20
  66. package/dist/screen/components/NodeContextMenu.js +1 -1
  67. package/dist/screen/components/PageEditGuardNotices.js +1 -1
  68. package/dist/screen/components/PreviewDeviceContext.d.ts +1 -1
  69. package/dist/screen/components/PreviewPartsContext.d.ts +2 -2
  70. package/dist/screen/components/SaveControls.d.ts +8 -8
  71. package/dist/screen/components/ScreenChrome.js +1 -1
  72. package/dist/screen/components/ScreenDocumentContext.d.ts +5 -5
  73. package/dist/screen/components/ScreenDocumentContext.js +1 -1
  74. package/dist/screen/components/ScreenMount.d.ts +9 -9
  75. package/dist/screen/components/ScreenMount.js +1 -1
  76. package/dist/screen/components/ScreenStoreProvider.d.ts +12 -12
  77. package/dist/screen/components/ScreenStoreProvider.js +1 -1
  78. package/dist/screen/components/SectionScreenShell.js +17 -17
  79. package/dist/screen/components/usePartBridge.d.ts +10 -10
  80. package/dist/screen/components/usePartBridge.js +1 -1
  81. package/dist/screen/index.d.ts +8 -8
  82. package/dist/screen/index.js +1 -1
  83. package/dist/screen/lib/admin-bridge.d.ts +4 -4
  84. package/dist/screen/lib/document/block-types-in.d.ts +2 -1
  85. package/dist/screen/lib/document/block-types-in.js +1 -1
  86. package/dist/screen/lib/document/content-tree.d.ts +8 -8
  87. package/dist/screen/lib/document/device-fields.d.ts +13 -27
  88. package/dist/screen/lib/document/device-fields.js +1 -1
  89. package/dist/screen/lib/document/field-markers.d.ts +4 -4
  90. package/dist/screen/lib/document/palette-sections.d.ts +5 -5
  91. package/dist/screen/lib/document/panel-fields.d.ts +5 -5
  92. package/dist/screen/lib/document/panel-no-control-mark.d.ts +6 -10
  93. package/dist/screen/lib/document/panel-no-control-mark.js +1 -1
  94. package/dist/screen/lib/document/part-id.d.ts +1 -1
  95. package/dist/screen/lib/document/preview-events.d.ts +2 -2
  96. package/dist/screen/lib/document/preview-selection-context.d.ts +2 -2
  97. package/dist/screen/lib/document/section-doc.d.ts +5 -5
  98. package/dist/screen/lib/document/section-doc.js +1 -1
  99. package/dist/screen/lib/document/slot-child-name.d.ts +1 -1
  100. package/dist/screen/lib/document/slot-section-spec.d.ts +1 -1
  101. package/dist/screen/lib/document/style-clipboard.d.ts +8 -8
  102. package/dist/screen/lib/document/style-clipboard.js +1 -1
  103. package/dist/screen/lib/document/tree-reveal.d.ts +4 -4
  104. package/dist/screen/lib/document/use-section-ops.d.ts +6 -6
  105. package/dist/screen/lib/document/use-section-ops.js +1 -1
  106. package/dist/screen/lib/document-addressing.d.ts +5 -5
  107. package/dist/screen/lib/document-hooks.d.ts +4 -4
  108. package/dist/screen/lib/host.d.ts +5 -5
  109. package/dist/screen/lib/key-scope.d.ts +1 -1
  110. package/dist/screen/lib/key-scope.js +1 -1
  111. package/dist/screen/lib/media-panel.d.ts +5 -5
  112. package/dist/screen/lib/media-picker.d.ts +6 -6
  113. package/dist/screen/lib/page-lock.d.ts +4 -4
  114. package/dist/screen/lib/screen-parts.d.ts +22 -10
  115. package/dist/screen/lib/screen-parts.js +1 -1
  116. package/dist/screen/lib/section-templates.d.ts +4 -4
  117. package/dist/screen/lib/session-context.d.ts +4 -4
  118. package/dist/screen/lib/session.d.ts +5 -5
  119. package/dist/screen/lib/shared-sections.d.ts +4 -4
  120. package/dist/screen/screen.css +14 -14
  121. package/dist/screen/words.d.ts +4 -3
  122. package/dist/screen/words.js +1 -1
  123. package/dist/{session-CrWwDt7Z.d.ts → session-EsjORLQ0.d.ts} +1 -1
  124. package/dist/shell/shell.css +2 -2
  125. package/dist/strings/index.d.ts +2 -2
  126. package/dist/strings/index.js +2 -2
  127. package/dist/style-clipboard/index.d.ts +2 -2
  128. package/dist/text-styles/index.d.ts +3 -3
  129. package/dist/text-styles/model.d.ts +1 -1
  130. package/dist/{types-BFd8FqQw.d.ts → types-BIytwvvH.d.ts} +2 -2
  131. package/dist/{types-DFxBChE3.d.ts → types-BljCVdzR.d.ts} +17 -17
  132. package/dist/{types-DlQIM1YO.d.ts → types-Dq180WRV.d.ts} +8 -8
  133. package/dist/{useNodeOps-C_nisDHh.d.ts → useNodeOps-igxrnEhq.d.ts} +2 -2
  134. package/dist/{watch-D0bNZRtU.d.ts → watch-Unf6SfUf.d.ts} +3 -3
  135. package/dist/{words-gIDCeRv3.d.ts → words-B5Gb7KFq.d.ts} +1 -1
  136. package/dist/{words-BpTjCfqO.d.ts → words-Cf5VT2Ic.d.ts} +2 -2
  137. package/package.json +2 -2
  138. package/dist/chunk-4LGROS5L.js +0 -1
  139. package/dist/chunk-BDSLF5BR.js +0 -1
  140. package/dist/chunk-CPL43ZLJ.js +0 -1
  141. package/dist/chunk-CUZQ2HMA.js +0 -18
  142. package/dist/chunk-GHBK7BKL.js +0 -1
  143. package/dist/chunk-INRERJU4.js +0 -2
  144. package/dist/chunk-IYYE7VJN.js +0 -65
  145. package/dist/chunk-KWLHKKZO.js +0 -2
  146. package/dist/chunk-L55YIXDC.js +0 -1
  147. package/dist/chunk-MZ5GSSZ3.js +0 -7
  148. package/dist/chunk-SJMS247S.js +0 -5
  149. package/dist/chunk-SWBADIQT.js +0 -1
  150. package/dist/chunk-WJSEWAWK.js +0 -15
  151. package/dist/chunk-YHFKWV7H.js +0 -21
@@ -1,29 +1,37 @@
1
- import { D as Data, a as DataConfig, N as Node, S as SlotAddress, F as Found, P as Place, b as SlotEntry, W as WalkInfo } from '../types-DlQIM1YO.js';
2
- export { B as BlockShape, c as FieldShape, d as FieldsShape, e as NodeProps, R as RootData } from '../types-DlQIM1YO.js';
3
- export { R as ResolvableItem, a as ResolveCache, b as ResolveOptions, c as ResolveTrigger, d as changedProps, e as createResolveCache, f as deepEqual, r as resolveNodeData } from '../resolve-AJ6WF4EL.js';
1
+ import { N as Node, D as Data, a as DataConfig, S as SlotAddress, F as Found, P as Place, b as SlotEntry, W as WalkInfo } from '../types-Dq180WRV.js';
2
+ export { B as BlockShape, c as FieldShape, d as FieldsShape, e as NodeProps, R as RootData } from '../types-Dq180WRV.js';
3
+ export { R as ResolvableItem, a as ResolveCache, b as ResolveOptions, c as ResolveTrigger, d as changedProps, e as createResolveCache, f as deepEqual, r as resolveNodeData } from '../resolve-Bz4mszpL.js';
4
4
 
5
5
  /**
6
6
  * Finding a node's slots, and reading or writing a value at a prop path.
7
7
  *
8
- * A slot is found the way the old editor finds one: by the FIELDS, not by the value. A
8
+ * A slot is found the way the old library finds one: by the FIELDS, not by the value. A
9
9
  * prop is a slot when its field says `type: 'slot'`; a slot can also sit inside
10
10
  * an `object` field or inside each item of an `array` field, and its name is
11
- * then the prop path the old editor gives it — `items[0].content`, `box.content`.
11
+ * then the prop path the old library gives it — `items[0].content`, `box.content`.
12
12
  *
13
- * One deliberate difference from the old editor: the old editor also walks an object whose field is
13
+ * One deliberate difference from the old library: the old library also walks an object whose field is
14
14
  * NOT an `object` field using the PARENT's field map, so a key there that
15
15
  * happens to share a slot's name is treated as a slot. No document relies on
16
- * that (a non-array value there crashes the old editor's own walk), and a rule that
16
+ * that (a non-array value there crashes the old library's own walk), and a rule that
17
17
  * depends on a coincidence of names is not one to copy.
18
18
  *
19
19
  * Order is DECLARATION order — the order the fields are written in the config,
20
- * which is the order a person reads the block in (`col1` before `col2`). The old editor
20
+ * which is the order a person reads the block in (`col1` before `col2`). The old library
21
21
  * visits slots in reverse, as a side effect of how it fills empty ones; nothing
22
22
  * in either app depends on that.
23
23
  */
24
24
 
25
25
  /** One step of a prop path: a key, or an index into an array. */
26
26
  type Segment = string | number;
27
+ /** One document node: a string `type` and a `props` object. */
28
+ declare const isNode: (value: unknown) => value is Node;
29
+ /**
30
+ * A slot's array, read by its SHAPE: non-empty, every item a node. A list field
31
+ * (stats rows, ticker items) fails and is left alone. The one answer for the
32
+ * easel and its hosts, so no walk keeps a private copy that drifts.
33
+ */
34
+ declare const isNodeList: (value: unknown) => value is Node[];
27
35
  declare function getIn(value: unknown, segments: readonly Segment[]): unknown;
28
36
 
29
37
  /** One translated value, and the fingerprint of the base value it was made from. */
@@ -195,7 +203,7 @@ declare function copyTranslation(overlay: TranslationOverlay | null | undefined,
195
203
  /**
196
204
  * efficient-easel/data — the document, as pure functions.
197
205
  *
198
- * The bottom layer of the engine that replaces the old editor (the blueprint "From
206
+ * The bottom layer of the engine that replaces the old library (the blueprint "From
199
207
  * The Ground Up For Efficient Editor", 2026-09-29, step 1.1). Every function
200
208
  * takes a document and returns a new one; nothing here holds state, knows
201
209
  * about React, or touches a browser global, so a server component, a Node
@@ -213,17 +221,17 @@ declare function copyTranslation(overlay: TranslationOverlay | null | undefined,
213
221
  * round-trip spec pins each one:
214
222
  *
215
223
  * 1. An empty slot is written as `[]`, and `zones` is written as `{}`.
216
- * 2. Default props follow the old editor: a new block is created WITH its
224
+ * 2. Default props follow the old library: a new block is created WITH its
217
225
  * `defaultProps`; the root's `defaultProps` are filled in on open; an
218
226
  * existing block is never back-filled.
219
227
  * 3. A root prop that no field declares (a site's `theme`, `fonts`, `scales`)
220
228
  * is kept exactly as it is. Nothing here drops a key it doesn't know.
221
229
  * 4. The two older formats are READ — root props written directly on `root`,
222
- * and children parked in `zones` — and converted on open, the way the old editor's
230
+ * and children parked in `zones` — and converted on open, the way the old library's
223
231
  * `migrate()` converts them. They are never written back.
224
232
  *
225
233
  * KEY ORDER. The backend stores these documents in Postgres `jsonb`, which does
226
- * not keep key order, so "the same document as the old editor" means the same keys and
234
+ * not keep key order, so "the same document as the old library" means the same keys and
227
235
  * values. What this layer does promise is stronger for its own round trip: a
228
236
  * document that is already in shape comes back as THE SAME OBJECT (so
229
237
  * `normalizeData(doc) === doc`), and every edit copies only the nodes on the
@@ -239,7 +247,7 @@ declare function copyTranslation(overlay: TranslationOverlay | null | undefined,
239
247
  */
240
248
 
241
249
  /**
242
- * What `normalizeData` accepts: any saved document, as loosely as the old editor's own
250
+ * What `normalizeData` accepts: any saved document, as loosely as the old library's own
243
251
  * `Data` type describes one (`root.props` optional). Converting the older
244
252
  * shapes is its job, so it must take them without a cast. Every OTHER function
245
253
  * here takes the normalised `Data` it returns.
@@ -259,9 +267,9 @@ declare const ROOT_ID = "root";
259
267
  declare const ROOT_SLOT = "default-zone";
260
268
  /** The top-level list, as an address. */
261
269
  declare const ROOT_LIST: SlotAddress;
262
- /** `{ parentId, slot }` → the old editor's zone key `"<parentId>:<slot>"`. */
270
+ /** `{ parentId, slot }` → the old library's zone key `"<parentId>:<slot>"`. */
263
271
  declare const zoneKey: ({ parentId, slot }: SlotAddress) => string;
264
- /** The old editor's zone key → `{ parentId, slot }`. Ids and prop paths hold no colon. */
272
+ /** The old library's zone key → `{ parentId, slot }`. Ids and prop paths hold no colon. */
265
273
  declare function parseZoneKey(key: string): SlotAddress;
266
274
  type DataErrorCode = 'not-found' | 'no-slot' | 'bad-index' | 'duplicate-id' | 'cycle' | 'id-change' | 'unknown-type';
267
275
  declare class DataError extends Error {
@@ -294,7 +302,7 @@ declare function find(data: Data, config: DataConfig, id: string): Found | null;
294
302
  /** The list at an address, or `null` when no such slot exists. */
295
303
  declare function getList(data: Data, config: DataConfig, address: SlotAddress): Node[] | null;
296
304
  /**
297
- * What the easel does to a document when it opens it — the same result the old editor
305
+ * What the easel does to a document when it opens it — the same result the old library
298
306
  * reaches on load, with the older formats converted (rule 4):
299
307
  *
300
308
  * - `root` holding its props directly becomes `{ props: { …those keys } }`;
@@ -309,7 +317,7 @@ declare function getList(data: Data, config: DataConfig, address: SlotAddress):
309
317
  */
310
318
  declare function normalizeData(data: DataInput | Data, config: DataConfig): Data;
311
319
  /**
312
- * A new block, the way the Add panel makes one — the old editor's `insert` recipe:
320
+ * A new block, the way the Add panel makes one — the old library's `insert` recipe:
313
321
  * `{ ...defaultProps, id }`, plus any `props` the caller starts it with. The
314
322
  * defaults are copied, so two blocks never share an array or object, and every
315
323
  * child a default slot seeds gets its own id.
@@ -328,7 +336,7 @@ declare function insert(data: Data, config: DataConfig, place: Place, node: Node
328
336
  declare function remove(data: Data, config: DataConfig, id: string): Data;
329
337
  /**
330
338
  * Move a node to `to`. Within one list, `to.index` is the node's index AFTER
331
- * the move (the old editor's rule), so `0 … length-1`; into another list it is the index
339
+ * the move (the old library's rule), so `0 … length-1`; into another list it is the index
332
340
  * to insert at, `0 … length`. A move into the node's own subtree is refused.
333
341
  */
334
342
  declare function move(data: Data, config: DataConfig, id: string, to: Place): Data;
@@ -336,7 +344,7 @@ declare function move(data: Data, config: DataConfig, id: string, to: Place): Da
336
344
  * Copy a node, and everything under it, to the place just after it. Every
337
345
  * copied node gets a fresh id. `strip` sees each copied node (with its new id)
338
346
  * and returns what to keep — the hook for "a copy must not claim the
339
- * original's baked image" (`bakedId`), which the old editor's own duplicate copied
347
+ * original's baked image" (`bakedId`), which the old library's own duplicate copied
340
348
  * verbatim.
341
349
  */
342
350
  declare function duplicate(data: Data, config: DataConfig, id: string, options?: {
@@ -354,7 +362,7 @@ declare function copyNode(node: Node, config: DataConfig, options?: {
354
362
  strip?: (node: Node) => Node;
355
363
  }): Node;
356
364
  /**
357
- * Merge `patch` into a node's props — the old editor's `replace`, for the common case of
365
+ * Merge `patch` into a node's props — the old library's `replace`, for the common case of
358
366
  * changing some props. A key keeps its place; a new key goes on the end;
359
367
  * `undefined` clears a key (JSON drops it on save). New children in a patched
360
368
  * slot are brought into shape. Changing `id` is refused. A patch that changes
@@ -362,7 +370,7 @@ declare function copyNode(node: Node, config: DataConfig, options?: {
362
370
  */
363
371
  declare function setProps(data: Data, config: DataConfig, id: string, patch: Record<string, unknown>): Data;
364
372
  /**
365
- * Replace a node wholesale — the old editor's `replace` action: the node keeps its place
373
+ * Replace a node wholesale — the old library's `replace` action: the node keeps its place
366
374
  * and its id, and every prop is the new node's (a key it does not carry is
367
375
  * gone, which `setProps` cannot do). Children in its slots that arrive without
368
376
  * an id get one, and an id another node already holds is refused, as `insert`
@@ -372,4 +380,4 @@ declare function replaceNode(data: Data, config: DataConfig, id: string, node: N
372
380
  /** Merge `patch` into the root's props, the same way `setProps` does. */
373
381
  declare function setRoot(data: Data, config: DataConfig, patch: Record<string, unknown>): Data;
374
382
 
375
- export { Data, DataConfig, DataError, type DataErrorCode, type DataInput, Found, Node, Place, ROOT_ID, ROOT_LIST, ROOT_SLOT, type Segment, SlotAddress, SlotEntry, type TranslatableItem, type TranslatablePath, type TranslatedValue, type TranslationEntries, type TranslationOverlay, type TranslationRef, type TranslationStatus, WalkInfo, applyTranslation, copyNode, copyTranslation, createNode, duplicate, extractTranslation, find, getIn, getList, insert, mapIds, move, newId, normalizeData, parseZoneKey, pruneTranslation, rebaseTranslation, remove, replaceNode, setProps, setRoot, slotsOf, translatablePaths, translationFingerprint, translationStatus, walk, zoneKey };
383
+ export { Data, DataConfig, DataError, type DataErrorCode, type DataInput, Found, Node, Place, ROOT_ID, ROOT_LIST, ROOT_SLOT, type Segment, SlotAddress, SlotEntry, type TranslatableItem, type TranslatablePath, type TranslatedValue, type TranslationEntries, type TranslationOverlay, type TranslationRef, type TranslationStatus, WalkInfo, applyTranslation, copyNode, copyTranslation, createNode, duplicate, extractTranslation, find, getIn, getList, insert, isNode, isNodeList, mapIds, move, newId, normalizeData, parseZoneKey, pruneTranslation, rebaseTranslation, remove, replaceNode, setProps, setRoot, slotsOf, translatablePaths, translationFingerprint, translationStatus, walk, zoneKey };
@@ -1 +1 @@
1
- export{DataError,ROOT_ID,ROOT_LIST,ROOT_SLOT,applyTranslation,changedProps,copyNode,copyTranslation,createNode,createResolveCache,deepEqual,duplicate,extractTranslation,find,getList,insert,mapIds,move,newId,normalizeData,parseZoneKey,pruneTranslation,rebaseTranslation,remove,replaceNode,resolveNodeData,setProps,setRoot,slotsOf,translatablePaths,translationFingerprint,translationStatus,walk,zoneKey}from"../chunk-K7BTCBWD.js";export{getIn}from"../chunk-L55YIXDC.js";
1
+ export{DataError,ROOT_ID,ROOT_LIST,ROOT_SLOT,applyTranslation,changedProps,copyNode,copyTranslation,createNode,createResolveCache,deepEqual,duplicate,extractTranslation,find,getList,insert,mapIds,move,newId,normalizeData,parseZoneKey,pruneTranslation,rebaseTranslation,remove,replaceNode,resolveNodeData,setProps,setRoot,slotsOf,translatablePaths,translationFingerprint,translationStatus,walk,zoneKey}from"../chunk-TGZCD6IP.js";export{getIn,isNode,isNodeList}from"../chunk-KXM6YRG2.js";
@@ -33,7 +33,8 @@
33
33
  display: inline-flex;
34
34
  pointer-events: none;
35
35
  }
36
- .es-canvas-handle {
36
+ .es-canvas-handle,
37
+ .es-canvas-tag {
37
38
  position: relative;
38
39
  display: inline-flex;
39
40
  align-items: center;
@@ -51,6 +52,14 @@
51
52
  pointer-events: none;
52
53
  transition: opacity 0.12s;
53
54
  }
55
+ /* The selected part's name tag (`tag`, Lewis 2026-10-26): the handle's look
56
+ (above), placed where it is drawn, never taking the pointer. After the
57
+ shared rule, so its place and opacity win. */
58
+ .es-canvas-tag {
59
+ position: absolute;
60
+ cursor: default;
61
+ opacity: 1;
62
+ }
54
63
  .es-canvas-handle.is-shown {
55
64
  opacity: 1;
56
65
  pointer-events: auto;
@@ -1,11 +1,11 @@
1
1
  import * as react from 'react';
2
2
  import { HTMLAttributes, CSSProperties, ReactNode } from 'react';
3
- import { P as Place } from '../types-DlQIM1YO.js';
4
- import { D as DragSession } from '../session-CrWwDt7Z.js';
5
- export { a as DragHeld, c as createDragSession } from '../session-CrWwDt7Z.js';
6
- export { B as Box, a as CanvasDragLayer, b as CanvasDragLayerProps, C as CanvasDragModel, c as CanvasDropTarget, d as CanvasSeam, e as CanvasSource, f as CanvasZone, E as EMPTY_MEASURE, H as HANDLE_GRACE_MS, M as MeasuredCanvas, g as MeasuredNode, h as canvasTarget, i as contains, j as gapInZone, k as gapLine, l as insertSeams, m as measureCanvas, p as pickSource, s as seamsBetween, n as sourcesAt } from '../CanvasDragLayer-B6Yn9S8T.js';
3
+ import { P as Place } from '../types-Dq180WRV.js';
4
+ import { D as DragSession } from '../session-EsjORLQ0.js';
5
+ export { a as DragHeld, c as createDragSession } from '../session-EsjORLQ0.js';
6
+ export { B as Box, a as CanvasDragLayer, b as CanvasDragLayerProps, C as CanvasDragModel, c as CanvasDropTarget, d as CanvasSeam, e as CanvasSource, f as CanvasZone, E as EMPTY_MEASURE, H as HANDLE_GRACE_MS, M as MeasuredCanvas, g as MeasuredNode, h as canvasTarget, i as contains, j as gapInZone, k as gapLine, l as insertSeams, m as measureCanvas, p as pickSource, s as seamsBetween, n as sourcesAt } from '../CanvasDragLayer-NZpaX6aq.js';
7
7
  import { D as DragWords } from '../words-SD4neL0n.js';
8
- import '../watch-D0bNZRtU.js';
8
+ import '../watch-Unf6SfUf.js';
9
9
 
10
10
  /**
11
11
  * Where a drop lands — the engine's one hit rule, as pure functions (blueprint
@@ -1 +1 @@
1
- export{AddPanel,CanvasDragLayer,CanvasInsert,EMPTY_MEASURE,HANDLE_GRACE_MS,canvasTarget,contains,gapInZone,gapLine,insertSeams,measureCanvas,pickSource,seamsBetween,sourcesAt}from"../chunk-CUZQ2HMA.js";import"../chunk-TQ5Y6S2X.js";export{AUTO_SCROLL_EDGE,AUTO_SCROLL_MAX_SPEED,autoScrollDelta,autoScrollSpeed,createDragSession,dropEffectFor,dropOnRow,frameScrollBox,gapToMoveIndex,isNoOpDrop,scrollBoxOf,scrollParent,startAutoScroll,stepGap,useTreeDrag}from"../chunk-3S5N4HLJ.js";import"../chunk-P2VEMZH5.js";import"../chunk-GHBK7BKL.js";import"../chunk-LF3FUSCQ.js";import"../chunk-K7BTCBWD.js";import"../chunk-L55YIXDC.js";
1
+ export{AddPanel,CanvasDragLayer,CanvasInsert,EMPTY_MEASURE,HANDLE_GRACE_MS,canvasTarget,contains,gapInZone,gapLine,insertSeams,measureCanvas,pickSource,seamsBetween,sourcesAt}from"../chunk-LN43DP2A.js";import"../chunk-TQ5Y6S2X.js";export{AUTO_SCROLL_EDGE,AUTO_SCROLL_MAX_SPEED,autoScrollDelta,autoScrollSpeed,createDragSession,dropEffectFor,dropOnRow,frameScrollBox,gapToMoveIndex,isNoOpDrop,scrollBoxOf,scrollParent,startAutoScroll,stepGap,useTreeDrag}from"../chunk-6NJHYXJM.js";import"../chunk-P2VEMZH5.js";import"../chunk-YU3WHLGI.js";import"../chunk-LF3FUSCQ.js";import"../chunk-TGZCD6IP.js";import"../chunk-KXM6YRG2.js";
@@ -8,4 +8,4 @@ export { AUTO_RULES, AutoRule, FOLLOW_RULES, VIEW_DESKTOP_MIN, VIEW_TABLET_MIN,
8
8
  export { HERO_SLIDER_GOTO_EVENT, HeroSliderGotoDetail } from '../screen/lib/document/preview-events.js';
9
9
  export { R as REPEAT_ATTRIBUTE, a as REPEAT_INDEX_ATTRIBUTE } from '../repeat-D65bJS8d.js';
10
10
  export { TEXT_STYLE_CASES, TEXT_STYLE_CASE_CSS, TextStyleCase, TextStyleCaseCss, isTextStyleCase, textStyleCaseCss, textStyleCaseOfCss } from '../text-styles/model.js';
11
- import '../words-gIDCeRv3.js';
11
+ import '../words-B5Gb7KFq.js';
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * efficient-easel/easel — the canvas's own marks (blueprint 5.1): the
3
3
  * lists' empty and selected states, and the outlines over the selected and
4
- * hovered block. The old editor's stylesheet drew these until now; the rules follow it.
4
+ * hovered block. The old library's stylesheet drew these until now; the rules follow it.
5
5
  *
6
6
  * The canvas is an iframe of its own, so this sheet must reach it: import it
7
7
  * once in the host, and `CanvasFrame` copies the host's stylesheets into the
@@ -51,7 +51,7 @@
51
51
  z-index: 0;
52
52
  }
53
53
  /* A frame that FILLS its parent (`height="fill"`): the page is at least as tall
54
- as the frame, as the old editor's `#frame-root` was, so a short page's background and
54
+ as the frame, as the old library's `#frame-root` was, so a short page's background and
55
55
  its top list reach the bottom of the canvas. `height: 1px` gives the root a
56
56
  height of its own for a list's `height: 100%` to resolve against. Not on an
57
57
  `auto` frame, whose height comes FROM the page: there `100vh` is the frame
@@ -82,8 +82,8 @@
82
82
  .es-zone:empty,
83
83
  .es-zone.is-area-selected:not(.is-root),
84
84
  .es-zone.is-hovering-area:not(.is-root) {
85
- background: color-mix(in srgb, var(--es-accent, #2563eb) 6%, transparent);
86
- outline: 2px dashed color-mix(in srgb, var(--es-accent, #2563eb) 35%, transparent);
85
+ background: color-mix(in srgb, var(--es-accent) 6%, transparent);
86
+ outline: 2px dashed color-mix(in srgb, var(--es-accent) 35%, transparent);
87
87
  }
88
88
  /* …except an empty list the drag layer draws its "+ Add block" cell over
89
89
  (`data-es-empty-cell`, efficient-easel/drag): at rest that slot draws
@@ -96,10 +96,12 @@
96
96
  }
97
97
 
98
98
  /* The outline colour, declared ONCE for the selection, the hover and the
99
- words being typed. The accent, with a fallback: the outlines draw inside
100
- the canvas frame, which holds the page's sheet and not the chrome's tokens. */
99
+ words being typed: the chrome's accent, no colour of our own. The outlines
100
+ draw inside the canvas frame, a document of its own: `--es-accent` reaches
101
+ it as the frame's `:root` sheet (`canvas/host-tokens`, read off the chrome),
102
+ so the canvas follows the shell's accent. */
101
103
  .es-canvas-outline {
102
- --es-canvas-outline-colour: var(--es-accent, #2563eb);
104
+ --es-canvas-outline-colour: var(--es-accent);
103
105
  pointer-events: none;
104
106
  box-sizing: border-box;
105
107
  z-index: 2147483000;
@@ -114,9 +116,9 @@
114
116
  }
115
117
  /* A node many pages use live (`CanvasSharedContext`; Shared section design v4,
116
118
  Lewis 2026-10-21): its selected and hover outlines in the shell's success
117
- colour, as its Layers row and tab are. The frame holds the host's sheets,
118
- and with them the shell's tokens; without them, the accent. No colour of
119
- our own (harness UI-24). */
119
+ colour, as its Layers row and tab are. `--status-success-solid` reaches the
120
+ frame the same way (`canvas/host-tokens`); without it, the accent. No
121
+ colour of our own (harness UI-24). */
120
122
  .es-canvas-outline.is-shared {
121
123
  --es-canvas-outline-colour: var(--status-success-solid, var(--es-accent));
122
124
  }
@@ -125,11 +127,19 @@
125
127
  colour, 4px clear of them, with the selection outline's square corners. It
126
128
  is measured from the words' bounding box, so words on three lines get one
127
129
  rectangle, not a line round each. Its colour is the one outline colour
128
- above: without its fallback the outline is not drawn in the canvas. */
129
- .es-canvas-outline.is-typing {
130
+ above: a frame without the chrome's token (`canvas/host-tokens`) draws no
131
+ outline. */
132
+ .es-canvas-outline.is-typing,
133
+ .es-canvas-outline.is-selected.is-words {
130
134
  outline: 2px solid var(--es-canvas-outline-colour);
131
- outline-offset: 4px;
132
- }
135
+ outline-offset: var(--es-words-clear);
136
+ }
137
+ /* The 4px is WORDS_CLEAR in canvas/dom, the one home: the canvas sets
138
+ `--es-words-clear` from it on both boxes; no literal here. Selected words
139
+ wear that same box from the click on (Lewis 2026-10-26, option B): a
140
+ double-click puts the caret in it and moves nothing. The drag layer keeps
141
+ the handle, the name and the hint on its corners, measured from the same
142
+ constant. */
133
143
  /* THE POINTER (Lewis 2026-10-20, mockup v4 decision c): on the canvas it is
134
144
  the arrow — over words, and over the links and buttons the page drew, which
135
145
  the canvas never follows — and the I-beam only inside the words being