efficient-easel 22.0.0 → 23.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.
- package/README.md +38 -23
- package/dist/{CanvasDragLayer-B6Yn9S8T.d.ts → CanvasDragLayer-NZpaX6aq.d.ts} +15 -4
- package/dist/{ScreenDocumentContext-BIK3uWtF.d.ts → ScreenDocumentContext-BDLUYzlM.d.ts} +4 -4
- package/dist/blocks/index.d.ts +11 -11
- package/dist/canvas/index.d.ts +21 -9
- package/dist/canvas/index.js +1 -1
- package/dist/{canvas-typing-Be4FO4q7.d.ts → canvas-typing-DOBx8dD3.d.ts} +12 -2
- package/dist/{chunk-XWKQP6AE.js → chunk-3P735WOM.js} +4 -4
- package/dist/{chunk-KWLHKKZO.js → chunk-4YUC7B7E.js} +1 -1
- package/dist/chunk-6F5GO337.js +1 -0
- package/dist/{chunk-3S5N4HLJ.js → chunk-6NJHYXJM.js} +1 -1
- package/dist/{chunk-BTDI7JAA.js → chunk-A6ZP5II4.js} +2 -2
- package/dist/{chunk-IWCKVZHS.js → chunk-AGWKB77Q.js} +1 -1
- package/dist/chunk-AT4DDMJS.js +1 -0
- package/dist/chunk-FF54HWSE.js +8 -0
- package/dist/{chunk-IROEWITG.js → chunk-FOOK54T2.js} +1 -1
- package/dist/{chunk-SWBADIQT.js → chunk-G3HAKQUF.js} +1 -1
- package/dist/{chunk-ZOSEBPAI.js → chunk-GKG3M5QK.js} +1 -1
- package/dist/chunk-GXRS52JD.js +5 -0
- package/dist/{chunk-YC6KLSW3.js → chunk-HLMQ34GP.js} +1 -1
- package/dist/chunk-HZSZT3BE.js +7 -0
- package/dist/{chunk-EB6NI2VK.js → chunk-IYHO4XQX.js} +1 -1
- package/dist/chunk-IZGFJWH4.js +1 -0
- package/dist/chunk-KXM6YRG2.js +1 -0
- package/dist/chunk-KXTXYINN.js +16 -0
- package/dist/chunk-LN43DP2A.js +18 -0
- package/dist/{chunk-YHFKWV7H.js → chunk-MXECWHRJ.js} +10 -10
- package/dist/chunk-OXZDSOZV.js +1 -0
- package/dist/{chunk-BSHIQIZC.js → chunk-RPMSET77.js} +1 -1
- package/dist/{chunk-K7BTCBWD.js → chunk-TGZCD6IP.js} +1 -1
- package/dist/chunk-VZUXOZGP.js +64 -0
- package/dist/{chunk-RY5AWQ63.js → chunk-XJ23ULBP.js} +1 -1
- package/dist/{chunk-TLN5ZT76.js → chunk-YHEYJKQL.js} +1 -1
- package/dist/chunk-YU3WHLGI.js +1 -0
- package/dist/copy/index.d.ts +20 -6
- package/dist/copy/index.js +29 -29
- package/dist/data/index.d.ts +30 -22
- package/dist/data/index.js +1 -1
- package/dist/drag/drag.css +10 -1
- package/dist/drag/index.d.ts +5 -5
- package/dist/drag/index.js +1 -1
- package/dist/draw/index.d.ts +1 -1
- package/dist/easel/easel.css +12 -5
- package/dist/easel/index.d.ts +90 -53
- package/dist/easel/index.js +1 -1
- package/dist/edit-lock/index.d.ts +5 -5
- package/dist/fields/fields.css +1 -1
- package/dist/fields/index.d.ts +15 -15
- package/dist/fields/index.js +1 -1
- package/dist/node-ops/index.d.ts +3 -3
- package/dist/node-ops/index.js +1 -1
- package/dist/panel/index.d.ts +1 -1
- package/dist/panel/panel.css +6 -1
- package/dist/pick/index.d.ts +5 -5
- package/dist/{plan-CRUh2kVK.d.ts → plan-D0DgSLnY.d.ts} +5 -5
- package/dist/render/index.d.ts +13 -13
- package/dist/render/index.js +1 -1
- package/dist/{resolve-AJ6WF4EL.d.ts → resolve-Bz4mszpL.d.ts} +5 -5
- package/dist/screen/components/AddBlockRow.js +1 -1
- package/dist/screen/components/AddSidePanel.d.ts +2 -2
- package/dist/screen/components/AddSidePanel.js +1 -1
- package/dist/screen/components/NodeContextMenu.d.ts +17 -20
- package/dist/screen/components/NodeContextMenu.js +1 -1
- package/dist/screen/components/PageEditGuardNotices.js +1 -1
- package/dist/screen/components/PreviewDeviceContext.d.ts +1 -1
- package/dist/screen/components/PreviewPartsContext.d.ts +2 -2
- package/dist/screen/components/SaveControls.d.ts +8 -8
- package/dist/screen/components/ScreenChrome.js +1 -1
- package/dist/screen/components/ScreenDocumentContext.d.ts +5 -5
- package/dist/screen/components/ScreenDocumentContext.js +1 -1
- package/dist/screen/components/ScreenMount.d.ts +8 -8
- package/dist/screen/components/ScreenMount.js +1 -1
- package/dist/screen/components/ScreenStoreProvider.d.ts +12 -12
- package/dist/screen/components/ScreenStoreProvider.js +1 -1
- package/dist/screen/components/SectionScreenShell.js +17 -17
- package/dist/screen/components/usePartBridge.d.ts +10 -10
- package/dist/screen/components/usePartBridge.js +1 -1
- package/dist/screen/index.d.ts +8 -8
- package/dist/screen/index.js +1 -1
- package/dist/screen/lib/admin-bridge.d.ts +4 -4
- package/dist/screen/lib/document/block-types-in.d.ts +2 -1
- package/dist/screen/lib/document/block-types-in.js +1 -1
- package/dist/screen/lib/document/content-tree.d.ts +8 -8
- package/dist/screen/lib/document/device-fields.d.ts +7 -7
- package/dist/screen/lib/document/device-fields.js +1 -1
- package/dist/screen/lib/document/field-markers.d.ts +4 -4
- package/dist/screen/lib/document/palette-sections.d.ts +5 -5
- package/dist/screen/lib/document/panel-fields.d.ts +5 -5
- package/dist/screen/lib/document/panel-no-control-mark.d.ts +3 -3
- package/dist/screen/lib/document/part-id.d.ts +1 -1
- package/dist/screen/lib/document/preview-events.d.ts +2 -2
- package/dist/screen/lib/document/preview-selection-context.d.ts +2 -2
- package/dist/screen/lib/document/section-doc.d.ts +5 -5
- package/dist/screen/lib/document/section-doc.js +1 -1
- package/dist/screen/lib/document/slot-child-name.d.ts +1 -1
- package/dist/screen/lib/document/slot-section-spec.d.ts +1 -1
- package/dist/screen/lib/document/style-clipboard.d.ts +8 -8
- package/dist/screen/lib/document/style-clipboard.js +1 -1
- package/dist/screen/lib/document/tree-reveal.d.ts +4 -4
- package/dist/screen/lib/document/use-section-ops.d.ts +6 -6
- package/dist/screen/lib/document/use-section-ops.js +1 -1
- package/dist/screen/lib/document-addressing.d.ts +5 -5
- package/dist/screen/lib/document-hooks.d.ts +4 -4
- package/dist/screen/lib/host.d.ts +5 -5
- package/dist/screen/lib/key-scope.d.ts +1 -1
- package/dist/screen/lib/key-scope.js +1 -1
- package/dist/screen/lib/media-panel.d.ts +5 -5
- package/dist/screen/lib/media-picker.d.ts +6 -6
- package/dist/screen/lib/page-lock.d.ts +4 -4
- package/dist/screen/lib/screen-parts.d.ts +22 -10
- package/dist/screen/lib/screen-parts.js +1 -1
- package/dist/screen/lib/section-templates.d.ts +4 -4
- package/dist/screen/lib/session-context.d.ts +4 -4
- package/dist/screen/lib/session.d.ts +5 -5
- package/dist/screen/lib/shared-sections.d.ts +4 -4
- package/dist/screen/screen.css +14 -14
- package/dist/screen/words.d.ts +4 -3
- package/dist/screen/words.js +1 -1
- package/dist/{session-CrWwDt7Z.d.ts → session-EsjORLQ0.d.ts} +1 -1
- package/dist/shell/shell.css +2 -2
- package/dist/strings/index.d.ts +2 -2
- package/dist/strings/index.js +2 -2
- package/dist/style-clipboard/index.d.ts +2 -2
- package/dist/text-styles/index.d.ts +3 -3
- package/dist/text-styles/model.d.ts +1 -1
- package/dist/{types-BFd8FqQw.d.ts → types-BIytwvvH.d.ts} +2 -2
- package/dist/{types-DFxBChE3.d.ts → types-BljCVdzR.d.ts} +17 -17
- package/dist/{types-DlQIM1YO.d.ts → types-Dq180WRV.d.ts} +8 -8
- package/dist/{useNodeOps-C_nisDHh.d.ts → useNodeOps-igxrnEhq.d.ts} +2 -2
- package/dist/{watch-D0bNZRtU.d.ts → watch-Unf6SfUf.d.ts} +3 -3
- package/dist/{words-gIDCeRv3.d.ts → words-B5Gb7KFq.d.ts} +1 -1
- package/dist/{words-BpTjCfqO.d.ts → words-Cf5VT2Ic.d.ts} +2 -2
- package/package.json +1 -1
- package/dist/chunk-4LGROS5L.js +0 -1
- package/dist/chunk-BDSLF5BR.js +0 -1
- package/dist/chunk-CPL43ZLJ.js +0 -1
- package/dist/chunk-CUZQ2HMA.js +0 -18
- package/dist/chunk-GHBK7BKL.js +0 -1
- package/dist/chunk-IYYE7VJN.js +0 -65
- package/dist/chunk-KN2TIXUT.js +0 -1
- package/dist/chunk-L55YIXDC.js +0 -1
- package/dist/chunk-MZ5GSSZ3.js +0 -7
- package/dist/chunk-SJMS247S.js +0 -5
- package/dist/chunk-TXR7GC5A.js +0 -8
- package/dist/chunk-WJSEWAWK.js +0 -15
package/dist/data/index.d.ts
CHANGED
|
@@ -1,29 +1,37 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { B as BlockShape, c as FieldShape, d as FieldsShape, e as NodeProps, R as RootData } from '../types-
|
|
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-
|
|
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
|
|
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
|
|
11
|
+
* then the prop path the old library gives it — `items[0].content`, `box.content`.
|
|
12
12
|
*
|
|
13
|
-
* One deliberate difference from the old
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
270
|
+
/** `{ parentId, slot }` → the old library's zone key `"<parentId>:<slot>"`. */
|
|
263
271
|
declare const zoneKey: ({ parentId, slot }: SlotAddress) => string;
|
|
264
|
-
/** The old
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 };
|
package/dist/data/index.js
CHANGED
|
@@ -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-
|
|
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";
|
package/dist/drag/drag.css
CHANGED
|
@@ -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;
|
package/dist/drag/index.d.ts
CHANGED
|
@@ -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-
|
|
4
|
-
import { D as DragSession } from '../session-
|
|
5
|
-
export { a as DragHeld, c as createDragSession } from '../session-
|
|
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-
|
|
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-
|
|
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
|
package/dist/drag/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{AddPanel,CanvasDragLayer,CanvasInsert,EMPTY_MEASURE,HANDLE_GRACE_MS,canvasTarget,contains,gapInZone,gapLine,insertSeams,measureCanvas,pickSource,seamsBetween,sourcesAt}from"../chunk-
|
|
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";
|
package/dist/draw/index.d.ts
CHANGED
|
@@ -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-
|
|
11
|
+
import '../words-B5Gb7KFq.js';
|
package/dist/easel/easel.css
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
@@ -126,10 +126,17 @@
|
|
|
126
126
|
is measured from the words' bounding box, so words on three lines get one
|
|
127
127
|
rectangle, not a line round each. Its colour is the one outline colour
|
|
128
128
|
above: without its fallback the outline is not drawn in the canvas. */
|
|
129
|
-
.es-canvas-outline.is-typing
|
|
129
|
+
.es-canvas-outline.is-typing,
|
|
130
|
+
.es-canvas-outline.is-selected.is-words {
|
|
130
131
|
outline: 2px solid var(--es-canvas-outline-colour);
|
|
131
|
-
outline-offset:
|
|
132
|
-
}
|
|
132
|
+
outline-offset: var(--es-words-clear);
|
|
133
|
+
}
|
|
134
|
+
/* The 4px is WORDS_CLEAR in canvas/dom, the one home: the canvas sets
|
|
135
|
+
`--es-words-clear` from it on both boxes; no literal here. Selected words
|
|
136
|
+
wear that same box from the click on (Lewis 2026-10-26, option B): a
|
|
137
|
+
double-click puts the caret in it and moves nothing. The drag layer keeps
|
|
138
|
+
the handle, the name and the hint on its corners, measured from the same
|
|
139
|
+
constant. */
|
|
133
140
|
/* THE POINTER (Lewis 2026-10-20, mockup v4 decision c): on the canvas it is
|
|
134
141
|
the arrow — over words, and over the links and buttons the page drew, which
|
|
135
142
|
the canvas never follows — and the I-beam only inside the words being
|
package/dist/easel/index.d.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { DataInput } from '../data/index.js';
|
|
2
|
-
import { N as NodeSelection, P as PassThrough } from '../plan-
|
|
3
|
-
export { I as ItemSelector } from '../plan-
|
|
4
|
-
import { E as EaselConfig, a as EaselView, b as EaselAction, P as Permissions, c as EaselCore, d as EaselUi } from '../types-
|
|
5
|
-
export { A as AppState, e as EaselHistory, H as HistoryEntry, S as SetDataPatch } from '../types-
|
|
6
|
-
import { S as SlotAddress, D as Data, P as Place, N as Node } from '../types-
|
|
7
|
-
import { c as ResolveTrigger, a as ResolveCache, R as ResolvableItem } from '../resolve-
|
|
2
|
+
import { N as NodeSelection, P as PassThrough } from '../plan-D0DgSLnY.js';
|
|
3
|
+
export { I as ItemSelector } from '../plan-D0DgSLnY.js';
|
|
4
|
+
import { E as EaselConfig, a as EaselView, b as EaselAction, P as Permissions, c as EaselCore, d as EaselUi } from '../types-BljCVdzR.js';
|
|
5
|
+
export { A as AppState, e as EaselHistory, H as HistoryEntry, S as SetDataPatch } from '../types-BljCVdzR.js';
|
|
6
|
+
import { S as SlotAddress, D as Data, a as DataConfig, P as Place, N as Node } from '../types-Dq180WRV.js';
|
|
7
|
+
import { c as ResolveTrigger, a as ResolveCache, R as ResolvableItem } from '../resolve-Bz4mszpL.js';
|
|
8
8
|
import * as react from 'react';
|
|
9
9
|
import { ReactNode, CSSProperties, ComponentType, ReactElement } from 'react';
|
|
10
10
|
import { TextToolbarProps } from 'efficient-shell/ui';
|
|
11
|
-
import { C as CopyBoxLastTool, a as CopyThemeColor, b as CanvasTypingEnd } from '../canvas-typing-
|
|
11
|
+
import { C as CopyBoxLastTool, a as CopyThemeColor, b as CanvasTypingEnd } from '../canvas-typing-DOBx8dD3.js';
|
|
12
12
|
import { InlineRule } from 'efficient-shell/markup';
|
|
13
|
-
import { b as NodeOpsHost, C as ClipboardEntry } from '../useNodeOps-
|
|
14
|
-
import { I as InspectorFields } from '../types-
|
|
15
|
-
import '../words-
|
|
13
|
+
import { b as NodeOpsHost, C as ClipboardEntry } from '../useNodeOps-igxrnEhq.js';
|
|
14
|
+
import { I as InspectorFields } from '../types-BIytwvvH.js';
|
|
15
|
+
import '../words-Cf5VT2Ic.js';
|
|
16
16
|
import '../buckets-_MGDYJlb.js';
|
|
17
17
|
|
|
18
18
|
interface EaselOptions<C extends EaselConfig = EaselConfig> {
|
|
@@ -31,11 +31,11 @@ interface EaselOptions<C extends EaselConfig = EaselConfig> {
|
|
|
31
31
|
* loaded as if it were an edit.
|
|
32
32
|
*/
|
|
33
33
|
onChange?: (data: Data) => void;
|
|
34
|
-
/** Easel-wide permissions, under each block's own (the old
|
|
34
|
+
/** Easel-wide permissions, under each block's own (the old library's `permissions`). */
|
|
35
35
|
permissions?: Partial<Permissions>;
|
|
36
36
|
/**
|
|
37
37
|
* Changes recorded closer together than this collapse into ONE undo step —
|
|
38
|
-
* The old
|
|
38
|
+
* The old library's 250 ms history debounce, so a word typed into a field is undone as
|
|
39
39
|
* a word and not as letters. A `batch` is never collapsed into its
|
|
40
40
|
* neighbours. 0 records every change on its own.
|
|
41
41
|
*/
|
|
@@ -55,7 +55,7 @@ interface Easel<C extends EaselConfig = EaselConfig> {
|
|
|
55
55
|
getState: () => EaselView<C>;
|
|
56
56
|
subscribe: (listener: () => void) => () => void;
|
|
57
57
|
/**
|
|
58
|
-
* One
|
|
58
|
+
* One action. Outside a `batch`, one undo step when it records.
|
|
59
59
|
* Permissions are not checked here (see `setPermissions`).
|
|
60
60
|
*/
|
|
61
61
|
dispatch: (action: EaselAction) => void;
|
|
@@ -87,8 +87,8 @@ interface Easel<C extends EaselConfig = EaselConfig> {
|
|
|
87
87
|
select?: NodeSelection | undefined;
|
|
88
88
|
}) => void;
|
|
89
89
|
/**
|
|
90
|
-
* Put a different document in WITHOUT remounting anything — the old
|
|
91
|
-
* new `key` on
|
|
90
|
+
* Put a different document in WITHOUT remounting anything — the old library needed a
|
|
91
|
+
* new `key` on the old library's root component for that, which threw away every subscriber's state.
|
|
92
92
|
* The history starts again at this document unless `keepHistory`.
|
|
93
93
|
*/
|
|
94
94
|
load: (data: DataInput | Data, options?: {
|
|
@@ -111,11 +111,11 @@ interface Easel<C extends EaselConfig = EaselConfig> {
|
|
|
111
111
|
*/
|
|
112
112
|
setPermissions: (permissions: Partial<Permissions>) => void;
|
|
113
113
|
/**
|
|
114
|
-
* Run every block's `resolveData` over the document, as
|
|
114
|
+
* Run every block's `resolveData` over the document, as the old library's root component did when it
|
|
115
115
|
* mounted (trigger `'load'`), and write what changed as ONE change folded
|
|
116
116
|
* into the step it happens in — a resolver bringing a stale document up to
|
|
117
|
-
* date is not an undo step (the old
|
|
118
|
-
* document). `onChange` hears it, as the old
|
|
117
|
+
* date is not an undo step (the old library made it one, which undid back to the stale
|
|
118
|
+
* document). `onChange` hears it, as the old library's did. `EaselProvider` runs this
|
|
119
119
|
* on mount; a node changed by hand while it ran is left as the hand left it.
|
|
120
120
|
*/
|
|
121
121
|
resolveAll: (options?: {
|
|
@@ -127,10 +127,10 @@ interface Easel<C extends EaselConfig = EaselConfig> {
|
|
|
127
127
|
* write what changed folded into the step it happens in — `resolveAll`, for
|
|
128
128
|
* one node. Resolves to whether anything was written.
|
|
129
129
|
*
|
|
130
|
-
* It is what the old
|
|
130
|
+
* It is what the old library's own insert ran: a block dropped from its component list
|
|
131
131
|
* was resolved with trigger `'insert'` (`insertComponent`), which is how a
|
|
132
132
|
* block seeds its children or stamps a default the moment it arrives. The
|
|
133
|
-
* `insert` ACTION never did — the old
|
|
133
|
+
* `insert` ACTION never did — the old library's reducer was pure, and so is this one —
|
|
134
134
|
* and the engine has no drop of its own: the Add list's click and the drag's
|
|
135
135
|
* drop are the host's. So a host that puts a new block in, by `dispatch` or
|
|
136
136
|
* by `run`, follows it with this (second host, 2026-10-07):
|
|
@@ -138,7 +138,7 @@ interface Easel<C extends EaselConfig = EaselConfig> {
|
|
|
138
138
|
* easel.dispatch({ type: 'insert', componentType, destinationZone, destinationIndex, id });
|
|
139
139
|
* void easel.resolveNode(id, { trigger: 'insert' });
|
|
140
140
|
*
|
|
141
|
-
* ONE undo step with the insert (the old
|
|
141
|
+
* ONE undo step with the insert (the old library made the resolver's write a second
|
|
142
142
|
* one, and a single undo left a block that had never been resolved). A node
|
|
143
143
|
* changed by hand, or taken out, while its resolver ran is left as it is.
|
|
144
144
|
* `trigger` is `'replace'` when not given, as `resolveNodeData`'s is.
|
|
@@ -148,10 +148,10 @@ interface Easel<C extends EaselConfig = EaselConfig> {
|
|
|
148
148
|
metadata?: Record<string, unknown>;
|
|
149
149
|
}) => Promise<boolean>;
|
|
150
150
|
/** This easel's memory of the last change each node was resolved for —
|
|
151
|
-
* The old
|
|
151
|
+
* The old library kept one per editor, shared by every write that resolves. */
|
|
152
152
|
readonly resolveCache: ResolveCache;
|
|
153
153
|
/**
|
|
154
|
-
* Swap the config in place —
|
|
154
|
+
* Swap the config in place — the old library's root component took a new `config` prop live. The
|
|
155
155
|
* website editor rebuilds a few blocks' fields when the site's gap moves; the
|
|
156
156
|
* document, the selection and the history are untouched.
|
|
157
157
|
*/
|
|
@@ -176,12 +176,12 @@ interface Easel<C extends EaselConfig = EaselConfig> {
|
|
|
176
176
|
* Puck 0.20's UI at mount (`defaultAppState.ui`), less the selection, which
|
|
177
177
|
* the store holds by id. A host's chrome reads these — the website editor
|
|
178
178
|
* opens its side panels from `leftSideBarVisible` / `rightSideBarVisible` — so
|
|
179
|
-
* a host moving off
|
|
179
|
+
* a host moving off the old library's root component finds them where they were.
|
|
180
180
|
*/
|
|
181
181
|
declare const DEFAULT_UI: Record<string, unknown>;
|
|
182
182
|
/**
|
|
183
183
|
* THE EASEL STORE (blueprint step 5.1): the document, the selection by id and
|
|
184
|
-
* the host's UI keys, with the old
|
|
184
|
+
* the host's UI keys, with the old library's actions, the old library's history and a `batch` the old library
|
|
185
185
|
* never had. Framework-free — `useEasel` (./react) is the React binding.
|
|
186
186
|
*/
|
|
187
187
|
declare function createEasel<C extends EaselConfig>(options: EaselOptions<C>): Easel<C>;
|
|
@@ -189,24 +189,24 @@ declare function createEasel<C extends EaselConfig>(options: EaselOptions<C>): E
|
|
|
189
189
|
/**
|
|
190
190
|
* Puck 0.20's reducer, on `efficient-easel/data` — blueprint step 5.1.
|
|
191
191
|
*
|
|
192
|
-
* Each action means what it meant to the old
|
|
192
|
+
* Each action means what it meant to the old library, so the apps' `dispatch` calls move
|
|
193
193
|
* over unchanged (`reorder`'s and `move`'s indexes, `replaceRoot` MERGING
|
|
194
194
|
* props, `duplicate` selecting the copy, `insert` leaving the selection where
|
|
195
195
|
* it was). Two things differ, on purpose:
|
|
196
196
|
*
|
|
197
|
-
* - THE SELECTION IS BY ID. The old
|
|
197
|
+
* - THE SELECTION IS BY ID. The old library held `itemSelector` — a place — so a node
|
|
198
198
|
* inserted or removed above the selected one silently moved the selection
|
|
199
199
|
* onto its neighbour, and both editors carried patches for exactly that.
|
|
200
200
|
* Here `itemSelector` is derived from the id on every read, and a
|
|
201
201
|
* selection whose node is gone becomes nothing rather than whatever now
|
|
202
202
|
* sits in its place.
|
|
203
|
-
* - A SLOT CAN BE SELECTED (a column): `ui.selectedSlot`, which the old
|
|
203
|
+
* - A SLOT CAN BE SELECTED (a column): `ui.selectedSlot`, which the old library had no
|
|
204
204
|
* way to say.
|
|
205
205
|
*/
|
|
206
|
-
/** Whether the old
|
|
206
|
+
/** Whether the old library records an action in history when the action does not say:
|
|
207
207
|
* everything but the state-setters. */
|
|
208
208
|
declare function recordsByDefault(action: EaselAction): boolean;
|
|
209
|
-
/** The UI as the old
|
|
209
|
+
/** The UI as the old library shows it: the host's keys, with the selection translated. */
|
|
210
210
|
declare function uiView(core: EaselCore, config: EaselConfig): EaselUi;
|
|
211
211
|
/** A selection that still points at something; otherwise nothing. */
|
|
212
212
|
declare function validSelection(data: Data, config: EaselConfig, selection: NodeSelection): NodeSelection;
|
|
@@ -223,13 +223,13 @@ interface EaselProviderProps {
|
|
|
223
223
|
* `edit` permission is off (`bindUndoKeys`).
|
|
224
224
|
*/
|
|
225
225
|
hotkeys?: boolean;
|
|
226
|
-
/** Run every block's `resolveData` once the easel mounts, as
|
|
226
|
+
/** Run every block's `resolveData` once the easel mounts, as the old library's root component did
|
|
227
227
|
* (`easel.resolveAll`). On by default. */
|
|
228
228
|
resolveOnMount?: boolean;
|
|
229
229
|
children?: ReactNode;
|
|
230
230
|
}
|
|
231
|
-
/** Puts one easel in reach of everything under it —
|
|
232
|
-
* half — and, as
|
|
231
|
+
/** Puts one easel in reach of everything under it — the old library's root component, its provider
|
|
232
|
+
* half — and, as the old library's root component did, binds undo / redo to the page's keyboard
|
|
233
233
|
* (`hotkeys={false}` for a host that binds its own) and runs every block's
|
|
234
234
|
* `resolveData` once on mount (`resolveOnMount={false}` to skip). */
|
|
235
235
|
declare function EaselProvider({ easel, hotkeys, resolveOnMount, children }: EaselProviderProps): react.JSX.Element;
|
|
@@ -252,7 +252,7 @@ declare function useEasel<T, C extends EaselConfig = EaselConfig>(selector: (vie
|
|
|
252
252
|
*/
|
|
253
253
|
declare function createUseEasel<C extends EaselConfig = EaselConfig>(): <T>(selector: (view: EaselView<C>) => T) => T;
|
|
254
254
|
|
|
255
|
-
/** What a slot component accepts — the old
|
|
255
|
+
/** What a slot component accepts — the old library's. */
|
|
256
256
|
interface CanvasSlotProps {
|
|
257
257
|
className?: string;
|
|
258
258
|
style?: CSSProperties;
|
|
@@ -282,7 +282,7 @@ interface CanvasFrameProps {
|
|
|
282
282
|
/** Called with the frame's document once it is ready, and null when it goes. */
|
|
283
283
|
onDocument?: (doc: Document | null) => void;
|
|
284
284
|
/**
|
|
285
|
-
* `'auto'` (the default, the old
|
|
285
|
+
* `'auto'` (the default, the old library's): the frame is as tall as its content, and
|
|
286
286
|
* the host's pane scrolls it — so the canvas reads like the page it is.
|
|
287
287
|
* `'fill'`: the frame fills its parent and scrolls itself.
|
|
288
288
|
*/
|
|
@@ -309,7 +309,7 @@ interface CanvasFrameProps {
|
|
|
309
309
|
* arriving late, a dev reload).
|
|
310
310
|
*
|
|
311
311
|
* ⚠️ THAT FIRST DOCUMENT HAS NO DOCTYPE, SO IT RENDERS IN QUIRKS MODE, and it
|
|
312
|
-
* is rewritten with one before anything is drawn. The old
|
|
312
|
+
* is rewritten with one before anything is drawn. The old library's frame was a
|
|
313
313
|
* `<!DOCTYPE html>` srcdoc, so every block was written against standards mode;
|
|
314
314
|
* in quirks mode a `height: 100%` resolves through auto-height ancestors (an
|
|
315
315
|
* empty slot grew to the frame's full height), tables stop inheriting the
|
|
@@ -359,7 +359,27 @@ declare const CanvasSharedContext: react.Context<((id: string) => boolean) | und
|
|
|
359
359
|
interface CanvasPart {
|
|
360
360
|
id: string;
|
|
361
361
|
element: Element;
|
|
362
|
+
/**
|
|
363
|
+
* The part is its block's ONLY part — a Text block's words (Lewis
|
|
364
|
+
* 2026-10-26: one box per text). The host counts its own parts; the engine
|
|
365
|
+
* cannot. A whole part of a block with no lists shares the block's box (and
|
|
366
|
+
* the handle's label on it); any other part gets a box of its own. Absent:
|
|
367
|
+
* the engine reads a block with no lists as one rung with its part.
|
|
368
|
+
*/
|
|
369
|
+
whole?: boolean;
|
|
370
|
+
/** The part's name as Layers shows it ("Scrolling bar"): the canvas's
|
|
371
|
+
* label on its box while it is selected (Lewis 2026-10-26). */
|
|
372
|
+
label?: string;
|
|
362
373
|
}
|
|
374
|
+
/**
|
|
375
|
+
* Whether a part of block `ownerId` gets a box of its own (Lewis 2026-10-26:
|
|
376
|
+
* one box per text): yes, unless the block has no lists and the part is its
|
|
377
|
+
* only one (`CanvasPart.whole`, a Text block's words) — then the block and its
|
|
378
|
+
* words are one rung and share the block's box and its handle. With no
|
|
379
|
+
* `whole` from the host, a block with no lists is read as that one rung. One
|
|
380
|
+
* rule for the canvas's boxes and the screen's label.
|
|
381
|
+
*/
|
|
382
|
+
declare function partHasOwnBox(data: Data, config: DataConfig, ownerId: string, part: CanvasPart): boolean;
|
|
363
383
|
/**
|
|
364
384
|
* THE HOST'S PARTS ON THE CLICK CHAIN (W0, click-through plan 2026-10-12; card
|
|
365
385
|
* [MERGE] One Text Block And Click Through Parts). A host that lets a merchant
|
|
@@ -379,9 +399,19 @@ interface CanvasParts {
|
|
|
379
399
|
selected(): string | null;
|
|
380
400
|
/** Select `partId` (its block is already the selection), or let it go. */
|
|
381
401
|
select(partId: string | null): void;
|
|
402
|
+
/**
|
|
403
|
+
* The selected part as it is drawn in `doc` (the canvas's document, the
|
|
404
|
+
* frame's when it has one), or null (Lewis 2026-10-26: one box per text).
|
|
405
|
+
* Handed: the canvas draws its selected outline round that part, a regular
|
|
406
|
+
* rectangle like a selected block's, and the block's own selected box
|
|
407
|
+
* stands down — unless the part is `whole` in a block with no lists, which
|
|
408
|
+
* keeps the block box. Absent: the block box, as before, and the host
|
|
409
|
+
* draws whatever it draws.
|
|
410
|
+
*/
|
|
411
|
+
selectedPart?(doc: Document): CanvasPart | null;
|
|
382
412
|
}
|
|
383
413
|
declare const CanvasPartsContext: react.Context<CanvasParts | undefined>;
|
|
384
|
-
/** What a host may wrap an outline in — the old
|
|
414
|
+
/** What a host may wrap an outline in — the old library's `componentOverlay`: render
|
|
385
415
|
* `children` to draw it, or nothing to hide it (a text part open on the
|
|
386
416
|
* block, say). */
|
|
387
417
|
type CanvasOverlay = ComponentType<{
|
|
@@ -467,7 +497,7 @@ interface EaselCanvasProps {
|
|
|
467
497
|
metadata?: Record<string, unknown>;
|
|
468
498
|
/** Copy the host's stylesheets into the frame (default true). */
|
|
469
499
|
mirrorStyles?: boolean;
|
|
470
|
-
/** The frame's height: as tall as its content (default, the old
|
|
500
|
+
/** The frame's height: as tall as its content (default, the old library's), or filling its parent. */
|
|
471
501
|
height?: 'auto' | 'fill';
|
|
472
502
|
/**
|
|
473
503
|
* The frame's accessible name — an iframe with none is announced as "frame".
|
|
@@ -490,14 +520,14 @@ interface EaselCanvasProps {
|
|
|
490
520
|
onDocument?: (doc: Document | null) => void;
|
|
491
521
|
/**
|
|
492
522
|
* Wraps everything drawn in the frame, and is handed the frame's document —
|
|
493
|
-
* The old
|
|
523
|
+
* The old library's `overrides.iframe`: where a host syncs its theme onto the frame's
|
|
494
524
|
* `<html>` or adds frame-only CSS.
|
|
495
525
|
*/
|
|
496
526
|
frameWrapper?: ComponentType<{
|
|
497
527
|
document?: Document;
|
|
498
528
|
children: ReactNode;
|
|
499
529
|
}>;
|
|
500
|
-
/** Wraps each outline — the old
|
|
530
|
+
/** Wraps each outline — the old library's `componentOverlay`; see `CanvasOverlay`. */
|
|
501
531
|
overlay?: CanvasOverlay;
|
|
502
532
|
/** Drawn inside the frame, after the document — a host's canvas-only layer. */
|
|
503
533
|
children?: ReactNode;
|
|
@@ -515,7 +545,7 @@ interface EaselCanvasProps {
|
|
|
515
545
|
passThrough?: PassThrough;
|
|
516
546
|
}
|
|
517
547
|
/**
|
|
518
|
-
* `the old
|
|
548
|
+
* `the old library's preview`, ours: the document for editing, its outlines, and the
|
|
519
549
|
* clicks that select. Must sit under an `EaselProvider`.
|
|
520
550
|
*/
|
|
521
551
|
declare function EaselCanvas({ frame, className, style, metadata, mirrorStyles, onDocument, height, title, nonce, hotkeys, frameWrapper: FrameWrapper, overlay, children, typing, passThrough: passThroughProp, }: EaselCanvasProps): ReactElement;
|
|
@@ -524,8 +554,8 @@ declare function EaselCanvas({ frame, className, style, metadata, mirrorStyles,
|
|
|
524
554
|
* THE PARTS, ON THE STORE (blueprint step 5.2).
|
|
525
555
|
*
|
|
526
556
|
* Every part built in steps 2.1–4.9 takes a HOST — what to read, how to write
|
|
527
|
-
* — so it never knew the old
|
|
528
|
-
* editor, against the old
|
|
557
|
+
* — so it never knew the old library. Until now each app wrote that host twice, once per
|
|
558
|
+
* editor, against the old library's store: `EmailFields` and `SiteFields` for the settings
|
|
529
559
|
* panel, the node-ops host for the menus. These are the hosts, written ONCE,
|
|
530
560
|
* against the engine's store; the parts' own APIs do not change.
|
|
531
561
|
*/
|
|
@@ -551,13 +581,13 @@ interface SelectedFields {
|
|
|
551
581
|
id: string;
|
|
552
582
|
/** The node the fields are for — the selected one, or the root as `{ type: 'root', props }`. */
|
|
553
583
|
node: ResolvableItem;
|
|
554
|
-
/** Its fields, resolved as the old
|
|
584
|
+
/** Its fields, resolved as the old library resolved them (`resolveFields` with the old library's params, parent included). */
|
|
555
585
|
fields: InspectorFields;
|
|
556
586
|
/** What the fields show. */
|
|
557
587
|
values: Record<string, unknown>;
|
|
558
588
|
/** The block's (or the root's) `edit` permission is off. */
|
|
559
589
|
readOnly: boolean;
|
|
560
|
-
/** Write one field: `resolveData` as the old
|
|
590
|
+
/** Write one field: `resolveData` as the old library ran it, then ONE replace — one undo step. */
|
|
561
591
|
onChange: (name: string, value: unknown) => void;
|
|
562
592
|
/**
|
|
563
593
|
* Write SEVERAL fields at once: one merged props object, `resolveData` once,
|
|
@@ -570,11 +600,11 @@ interface SelectedFields {
|
|
|
570
600
|
}
|
|
571
601
|
/**
|
|
572
602
|
* The settings panel's host: the selected node's fields and the write that
|
|
573
|
-
* changes one — what `EmailFields` and `SiteFields` each did against the old
|
|
603
|
+
* changes one — what `EmailFields` and `SiteFields` each did against the old library,
|
|
574
604
|
* here once:
|
|
575
|
-
* - fields resolve through `useResolvedFields` (the old
|
|
605
|
+
* - fields resolve through `useResolvedFields` (the old library's
|
|
576
606
|
* `useRegisterFieldsSlice`: `changed`, `lastFields`, `appState`, `parent`);
|
|
577
|
-
* - a change runs the block's `resolveData` (`resolveNodeData`, the old
|
|
607
|
+
* - a change runs the block's `resolveData` (`resolveNodeData`, the old library's
|
|
578
608
|
* `resolveComponentData`, with this easel's own memory of the last
|
|
579
609
|
* change) and then writes ONE `replace` of the node, or ONE `replaceRoot`.
|
|
580
610
|
*
|
|
@@ -583,16 +613,23 @@ interface SelectedFields {
|
|
|
583
613
|
* selected when the change began.
|
|
584
614
|
*/
|
|
585
615
|
declare function useSelectedFields(): SelectedFields;
|
|
616
|
+
/**
|
|
617
|
+
* The ROOT's fields and write, whatever is selected: `useSelectedFields` with
|
|
618
|
+
* nothing selected, for a panel that edits the page beside a selection — the
|
|
619
|
+
* website's Styles ▸ Basics, the This page group, open while a section is (Lewis, 2026-10-26).
|
|
620
|
+
* The same resolve and the same one `replaceRoot`; the selection is untouched.
|
|
621
|
+
*/
|
|
622
|
+
declare function useRootFields(): SelectedFields;
|
|
586
623
|
|
|
587
624
|
/**
|
|
588
|
-
* UNDO AND REDO ON THE KEYBOARD — the old
|
|
625
|
+
* UNDO AND REDO ON THE KEYBOARD — the old library's own six bindings, which both editors
|
|
589
626
|
* relied on without writing any: ⌘Z / Ctrl+Z undo; ⇧⌘Z, ⌘Y, Ctrl+Shift+Z and
|
|
590
627
|
* Ctrl+Y redo.
|
|
591
628
|
*
|
|
592
|
-
* Exact combinations, read off the physical key (`code`, as the old
|
|
629
|
+
* Exact combinations, read off the physical key (`code`, as the old library read it), so
|
|
593
630
|
* a layout that moves Z still undoes and ⌥⌘Z does nothing.
|
|
594
631
|
*
|
|
595
|
-
* ⚠️ THE OLD
|
|
632
|
+
* ⚠️ THE OLD LIBRARY FIRED THESE IN A TEXT FIELD TOO, and so does this: ⌘Z while typing
|
|
596
633
|
* in a setting undoes the easel's last step — which, since a field writes as
|
|
597
634
|
* it is typed, is the typing — and the browser's own text undo is prevented,
|
|
598
635
|
* so there are never two undo histories answering one key.
|
|
@@ -617,10 +654,10 @@ declare function useSelectedFields(): SelectedFields;
|
|
|
617
654
|
* editable region (efficient-easel/canvas `isTypingTarget`) — is not taken:
|
|
618
655
|
* it is that field's own undo. The assembled screen binds its keys so, to its
|
|
619
656
|
* own root and to the canvas frame, inside another app's page (lib/key-scope);
|
|
620
|
-
* left out, a press in a field undoes the easel's step, as the old
|
|
657
|
+
* left out, a press in a field undoes the easel's step, as the old library's did.
|
|
621
658
|
*/
|
|
622
659
|
declare function bindUndoKeys(doc: Document, easel: Pick<Easel, 'undo' | 'redo'> & Partial<Pick<Easel, 'getState'>>, options?: {
|
|
623
660
|
leaveTyping?: boolean;
|
|
624
661
|
}): () => void;
|
|
625
662
|
|
|
626
|
-
export { CanvasFrame, type CanvasFrameProps, type CanvasOverlay, type CanvasPart, type CanvasParts, CanvasPartsContext, CanvasPassThroughContext, CanvasSharedContext, type CanvasSlotProps, type CanvasTyping, type CanvasTypingState, type CanvasTypingTarget, DEFAULT_UI, type Easel, EaselAction, EaselCanvas, type EaselCanvasProps, EaselConfig, EaselCore, type EaselOptions, EaselProvider, type EaselProviderProps, EaselUi, EaselView, EditDocument, NodeSelection, Permissions, type SelectedFields, bindUndoKeys, createEasel, createUseEasel, recordsByDefault, reduce, uiView, useEasel, useEaselApi, useEaselNodeOps, useSelectedFields, validSelection };
|
|
663
|
+
export { CanvasFrame, type CanvasFrameProps, type CanvasOverlay, type CanvasPart, type CanvasParts, CanvasPartsContext, CanvasPassThroughContext, CanvasSharedContext, type CanvasSlotProps, type CanvasTyping, type CanvasTypingState, type CanvasTypingTarget, DEFAULT_UI, type Easel, EaselAction, EaselCanvas, type EaselCanvasProps, EaselConfig, EaselCore, type EaselOptions, EaselProvider, type EaselProviderProps, EaselUi, EaselView, EditDocument, NodeSelection, Permissions, type SelectedFields, bindUndoKeys, createEasel, createUseEasel, partHasOwnBox, recordsByDefault, reduce, uiView, useEasel, useEaselApi, useEaselNodeOps, useRootFields, useSelectedFields, validSelection };
|
package/dist/easel/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{CanvasFrame,CanvasPartsContext,CanvasPassThroughContext,CanvasSharedContext,DEFAULT_UI,EaselCanvas,EaselProvider,EditDocument,bindUndoKeys,createEasel,createUseEasel,recordsByDefault,reduce,uiView,useEasel,useEaselApi,useEaselNodeOps,useSelectedFields,validSelection}from"../chunk-
|
|
1
|
+
export{CanvasFrame,CanvasPartsContext,CanvasPassThroughContext,CanvasSharedContext,DEFAULT_UI,EaselCanvas,EaselProvider,EditDocument,bindUndoKeys,createEasel,createUseEasel,partHasOwnBox,recordsByDefault,reduce,uiView,useEasel,useEaselApi,useEaselNodeOps,useRootFields,useSelectedFields,validSelection}from"../chunk-KXTXYINN.js";import"../chunk-TBY3DFKS.js";import"../chunk-AGWKB77Q.js";import"../chunk-RPMSET77.js";import"../chunk-HZSZT3BE.js";import"../chunk-KRL3IUV3.js";import"../chunk-MFIRYGHW.js";import"../chunk-YU3WHLGI.js";import"../chunk-LF3FUSCQ.js";import"../chunk-TGZCD6IP.js";import"../chunk-KXM6YRG2.js";
|