@paged-media/introspect-wasm 0.61.1 → 0.63.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/catalog.json CHANGED
@@ -756,12 +756,257 @@
756
756
  "kind": "write",
757
757
  "summary": "Set or clear the text caret/range."
758
758
  },
759
+ {
760
+ "name": "paged.reorderElement",
761
+ "params": "(id, target)",
762
+ "returns": "bool",
763
+ "kind": "author",
764
+ "summary": "Raise or lower an element in its parent's z-order. target = front | back | forward | backward | {index: n} (n = the final slot, 0 = backmost)."
765
+ },
766
+ {
767
+ "name": "paged.pasteInto",
768
+ "params": "(containerId, childId)",
769
+ "returns": "bool",
770
+ "kind": "author",
771
+ "summary": "Nest an existing item inside a container frame."
772
+ },
773
+ {
774
+ "name": "paged.releaseFrom",
775
+ "params": "(childId)",
776
+ "returns": "bool",
777
+ "kind": "author",
778
+ "summary": "Lift a nested item back out of its container (inverse of pasteInto)."
779
+ },
780
+ {
781
+ "name": "paged.closePath",
782
+ "params": "(id, subpath?)",
783
+ "returns": "bool",
784
+ "kind": "author",
785
+ "summary": "Close an open contour; subpath defaults to the whole path."
786
+ },
787
+ {
788
+ "name": "paged.joinPaths",
789
+ "params": "(id, otherId)",
790
+ "returns": "bool",
791
+ "kind": "author",
792
+ "summary": "Weld two open paths into one."
793
+ },
794
+ {
795
+ "name": "paged.pathfinderDivide",
796
+ "params": "([id, ...])",
797
+ "returns": "bool",
798
+ "kind": "author",
799
+ "summary": "Divide the selection into its planar regions."
800
+ },
801
+ {
802
+ "name": "paged.pathfinderTrim",
803
+ "params": "([id, ...])",
804
+ "returns": "bool",
805
+ "kind": "author",
806
+ "summary": "Trim hidden parts of the lower shapes away."
807
+ },
808
+ {
809
+ "name": "paged.pathfinderMerge",
810
+ "params": "([id, ...])",
811
+ "returns": "bool",
812
+ "kind": "author",
813
+ "summary": "Merge adjacent same-paint regions of the selection."
814
+ },
815
+ {
816
+ "name": "paged.pathfinderCrop",
817
+ "params": "([id, ...])",
818
+ "returns": "bool",
819
+ "kind": "author",
820
+ "summary": "Crop the selection to the topmost shape."
821
+ },
822
+ {
823
+ "name": "paged.pathfinderOutline",
824
+ "params": "([id, ...])",
825
+ "returns": "bool",
826
+ "kind": "author",
827
+ "summary": "Reduce the selection to its outlined edges."
828
+ },
829
+ {
830
+ "name": "paged.pathfinderMinusBack",
831
+ "params": "([id, ...])",
832
+ "returns": "bool",
833
+ "kind": "author",
834
+ "summary": "Subtract the shapes behind from the frontmost one."
835
+ },
836
+ {
837
+ "name": "paged.pathfinderFaces",
838
+ "params": "([id, ...], [faceId, ...], mode)",
839
+ "returns": "bool",
840
+ "kind": "author",
841
+ "summary": "Keep or drop named faces of the planar arrangement; mode = keep | remove. Face ids come from paged.planarRegions."
842
+ },
843
+ {
844
+ "name": "paged.planarRegions",
845
+ "params": "([id, ...], [x, y]?)",
846
+ "returns": "PlanarRegionsResult JSON",
847
+ "kind": "read",
848
+ "summary": "The planar arrangement of the named paths: found, faces (each with an id), inputCount, complete, reason. With a point, only the face under it. This is how a script names a face for pathfinderFaces."
849
+ },
850
+ {
851
+ "name": "paged.applyOpacityMask",
852
+ "params": "(targetId, maskId, {maskType?, invert?}?)",
853
+ "returns": "bool",
854
+ "kind": "author",
855
+ "summary": "Mask one element with another."
856
+ },
857
+ {
858
+ "name": "paged.releaseOpacityMask",
859
+ "params": "(targetId)",
860
+ "returns": "bool",
861
+ "kind": "author",
862
+ "summary": "Remove an element's opacity mask."
863
+ },
864
+ {
865
+ "name": "paged.attachTextToPath",
866
+ "params": "(id, storyId, {pathTypeAlignment?, flipPathEffect?, startBracket?, endBracket?}?)",
867
+ "returns": "bool",
868
+ "kind": "author",
869
+ "summary": "Run a story along a path."
870
+ },
871
+ {
872
+ "name": "paged.detachTextFromPath",
873
+ "params": "(id)",
874
+ "returns": "bool",
875
+ "kind": "author",
876
+ "summary": "Take a story back off its path."
877
+ },
878
+ {
879
+ "name": "paged.insertAnchoredFrame",
880
+ "params": "(storyId, offset, width, height, imageUri?)",
881
+ "returns": "bool",
882
+ "kind": "author",
883
+ "summary": "Anchor a frame in the text at a story offset; with imageUri the frame is created holding that image."
884
+ },
885
+ {
886
+ "name": "paged.insertHyperlink",
887
+ "params": "(storyId, start, end, url)",
888
+ "returns": "bool",
889
+ "kind": "author",
890
+ "summary": "Make a character range a clickable link. Read the result with paged.collection(\"hyperlinks\") — paged.links() is the placed-asset list, not this."
891
+ },
892
+ {
893
+ "name": "paged.layerSetVisible",
894
+ "params": "(layerId, visible)",
895
+ "returns": "bool",
896
+ "kind": "write",
897
+ "summary": "Show or hide a layer."
898
+ },
899
+ {
900
+ "name": "paged.layerSetLocked",
901
+ "params": "(layerId, locked)",
902
+ "returns": "bool",
903
+ "kind": "write",
904
+ "summary": "Lock or unlock a layer."
905
+ },
906
+ {
907
+ "name": "paged.layerSetPrintable",
908
+ "params": "(layerId, printable)",
909
+ "returns": "bool",
910
+ "kind": "write",
911
+ "summary": "Include a layer in output, or hold it back."
912
+ },
913
+ {
914
+ "name": "paged.layerSetName",
915
+ "params": "(layerId, name)",
916
+ "returns": "bool",
917
+ "kind": "write",
918
+ "summary": "Rename a layer."
919
+ },
920
+ {
921
+ "name": "paged.createSwatch",
922
+ "params": "(spec)",
923
+ "returns": "string (created id) | null",
924
+ "kind": "author",
925
+ "summary": "Create a swatch from a SwatchSpec ({space, value: [...], name?, model?, tint?}); returns its selfId."
926
+ },
927
+ {
928
+ "name": "paged.editSwatch",
929
+ "params": "(swatchId, spec)",
930
+ "returns": "bool",
931
+ "kind": "author",
932
+ "summary": "Replace a swatch's definition."
933
+ },
934
+ {
935
+ "name": "paged.deleteSwatch",
936
+ "params": "(swatchId)",
937
+ "returns": "bool",
938
+ "kind": "author",
939
+ "summary": "Delete a swatch."
940
+ },
941
+ {
942
+ "name": "paged.createGradient",
943
+ "params": "(spec)",
944
+ "returns": "string (created id) | null",
945
+ "kind": "author",
946
+ "summary": "Create a gradient from a GradientSpec ({kind: \"Linear\"|\"Radial\", stops: [...], name?}); returns its selfId."
947
+ },
948
+ {
949
+ "name": "paged.editGradient",
950
+ "params": "(gradientId, spec)",
951
+ "returns": "bool",
952
+ "kind": "author",
953
+ "summary": "Replace a gradient's definition."
954
+ },
955
+ {
956
+ "name": "paged.deleteGradient",
957
+ "params": "(gradientId)",
958
+ "returns": "bool",
959
+ "kind": "author",
960
+ "summary": "Delete a gradient."
961
+ },
962
+ {
963
+ "name": "paged.createColorGroup",
964
+ "params": "(spec)",
965
+ "returns": "string (created id) | null",
966
+ "kind": "author",
967
+ "summary": "Create a colour group from a ColorGroupSpec; returns its selfId."
968
+ },
969
+ {
970
+ "name": "paged.editColorGroup",
971
+ "params": "(groupId, spec)",
972
+ "returns": "bool",
973
+ "kind": "author",
974
+ "summary": "Replace a colour group's definition."
975
+ },
976
+ {
977
+ "name": "paged.deleteColorGroup",
978
+ "params": "(groupId)",
979
+ "returns": "bool",
980
+ "kind": "author",
981
+ "summary": "Delete a colour group."
982
+ },
759
983
  {
760
984
  "name": "console.log",
761
985
  "params": "(...)",
762
986
  "returns": "undefined",
763
987
  "kind": "console",
764
- "summary": "Append a line to the captured output log (also warn/error/info)."
988
+ "summary": "Append a line to the captured output log."
989
+ },
990
+ {
991
+ "name": "console.warn",
992
+ "params": "(...)",
993
+ "returns": "undefined",
994
+ "kind": "console",
995
+ "summary": "Append a warn-level line to the captured output log."
996
+ },
997
+ {
998
+ "name": "console.error",
999
+ "params": "(...)",
1000
+ "returns": "undefined",
1001
+ "kind": "console",
1002
+ "summary": "Append an error-level line to the captured output log."
1003
+ },
1004
+ {
1005
+ "name": "console.info",
1006
+ "params": "(...)",
1007
+ "returns": "undefined",
1008
+ "kind": "console",
1009
+ "summary": "Append an info-level line to the captured output log."
765
1010
  }
766
1011
  ],
767
1012
  "idGrammar": [
@@ -803,6 +1048,7 @@
803
1048
  "appliedParagraphStyle",
804
1049
  "appliedCharacterStyle",
805
1050
  "appliedObjectStyle",
1051
+ "itemLayer",
806
1052
  "appliedCellStyle",
807
1053
  "appliedTableStyle",
808
1054
  "appliedConditions",
@@ -923,6 +1169,7 @@
923
1169
  "frameDirectionalFeatherNoise",
924
1170
  "frameDirectionalFeatherChoke",
925
1171
  "frameBlendMode",
1172
+ "frameGradientFeather",
926
1173
  "cellFillColor",
927
1174
  "cellFillTint",
928
1175
  "cellInsetTop",
@@ -942,8 +1189,6 @@
942
1189
  "cellRightEdgeStrokeColor",
943
1190
  "cellRightEdgeStrokeWeight",
944
1191
  "cellRightEdgeStrokeTint",
945
- "tableRowCount",
946
- "tableColumnCount",
947
1192
  "pluginMetadata",
948
1193
  "anchoredPosition",
949
1194
  "anchorPoint",
@@ -956,7 +1201,34 @@
956
1201
  "anchoredSpineRelative",
957
1202
  "anchoredLockPosition",
958
1203
  "elementVisible",
959
- "elementLocked"
1204
+ "elementLocked",
1205
+ "characterFontFamily",
1206
+ "characterFontStyle",
1207
+ "characterKerningMethod",
1208
+ "characterCase",
1209
+ "characterPosition",
1210
+ "characterLanguage",
1211
+ "characterBaselineShift",
1212
+ "characterHorizontalScale",
1213
+ "characterVerticalScale",
1214
+ "characterSkew",
1215
+ "characterUnderline",
1216
+ "characterStrikethru",
1217
+ "characterLigatures",
1218
+ "characterOtfFeatures",
1219
+ "paragraphLeftIndent",
1220
+ "paragraphRightIndent",
1221
+ "paragraphDropCapCharacters",
1222
+ "paragraphDropCapLines",
1223
+ "paragraphHyphenation",
1224
+ "paragraphKeepLinesTogether",
1225
+ "paragraphKeepWithNext",
1226
+ "paragraphRuleAbove",
1227
+ "paragraphRuleBelow",
1228
+ "paragraphTabStops",
1229
+ "paragraphListType",
1230
+ "paragraphBulletCharacter",
1231
+ "paragraphNumberingFormat"
960
1232
  ],
961
1233
  "constraints": [
962
1234
  "Scripts run in Boa (pure ECMAScript), NOT Node: no require/import, fetch, fs, setTimeout, or network. Use only paged.* and console.*.",
@@ -967,6 +1239,125 @@
967
1239
  "insertFrame/insertTextFrame return the new element's kind:id address (and auto-select it); insertPage returns the new page's selfId. Pass the returned id straight to paged.set / placeImage / insertText (use paged.pages() for a page id, paged.stories() for the minted story).",
968
1240
  "Bounds are page-local points in [top, left, bottom, right] order. The document works in points (1/72 inch)."
969
1241
  ],
1242
+ "operations": [
1243
+ "insertText",
1244
+ "deleteRange",
1245
+ "applyStyle",
1246
+ "insertField",
1247
+ "insertAnchoredFrame",
1248
+ "insertHyperlink",
1249
+ "setFieldValue",
1250
+ "placeImage",
1251
+ "replaceImageBytes",
1252
+ "moveFrame",
1253
+ "resizeFrame",
1254
+ "linkFrames",
1255
+ "unlinkFrames",
1256
+ "insertPage",
1257
+ "deletePage",
1258
+ "resizePage",
1259
+ "insertFrame",
1260
+ "insertTextFrame",
1261
+ "deleteFrame",
1262
+ "insertLine",
1263
+ "insertPath",
1264
+ "setDocumentDefaults",
1265
+ "setColorSettings",
1266
+ "setProofSetup",
1267
+ "importSwatchLibrary",
1268
+ "setInkSetting",
1269
+ "setUseStandardLabForSpots",
1270
+ "pathPointInsert",
1271
+ "pathPointRemove",
1272
+ "pathOpenAt",
1273
+ "outlineStroke",
1274
+ "offsetPath",
1275
+ "simplifyPath",
1276
+ "closePath",
1277
+ "joinPaths",
1278
+ "pasteInto",
1279
+ "releaseFrom",
1280
+ "reorderElement",
1281
+ "applyOpacityMask",
1282
+ "releaseOpacityMask",
1283
+ "attachTextToPath",
1284
+ "detachTextFromPath",
1285
+ "createGroup",
1286
+ "dissolveGroup",
1287
+ "setGroupTransform",
1288
+ "setPluginMetadata",
1289
+ "pathPointCurveType",
1290
+ "pathPointSet",
1291
+ "batch",
1292
+ "bindCreated",
1293
+ "layerSetVisible",
1294
+ "layerSetLocked",
1295
+ "layerSetPrintable",
1296
+ "layerSetName",
1297
+ "layerMove",
1298
+ "layerInsert",
1299
+ "layerRemove",
1300
+ "setElementProperty",
1301
+ "pathfinderBoolean",
1302
+ "pathfinderDivide",
1303
+ "pathfinderTrim",
1304
+ "pathfinderMerge",
1305
+ "pathfinderCrop",
1306
+ "pathfinderOutline",
1307
+ "pathfinderMinusBack",
1308
+ "pathfinderFaces",
1309
+ "createSwatch",
1310
+ "editSwatch",
1311
+ "deleteSwatch",
1312
+ "createGradient",
1313
+ "editGradient",
1314
+ "deleteGradient",
1315
+ "createColorGroup",
1316
+ "editColorGroup",
1317
+ "deleteColorGroup",
1318
+ "createNumberingList",
1319
+ "editNumberingList",
1320
+ "deleteNumberingList",
1321
+ "createParagraphStyle",
1322
+ "renameParagraphStyle",
1323
+ "deleteParagraphStyle",
1324
+ "createCharacterStyle",
1325
+ "renameCharacterStyle",
1326
+ "deleteCharacterStyle",
1327
+ "createObjectStyle",
1328
+ "renameObjectStyle",
1329
+ "deleteObjectStyle",
1330
+ "createCellStyle",
1331
+ "renameCellStyle",
1332
+ "deleteCellStyle",
1333
+ "createTableStyle",
1334
+ "renameTableStyle",
1335
+ "deleteTableStyle",
1336
+ "setStyleProperty",
1337
+ "insertOval",
1338
+ "insertGuide",
1339
+ "moveGuide",
1340
+ "deleteGuide",
1341
+ "setConditionVisible",
1342
+ "activateConditionSet",
1343
+ "applyMasterToPage",
1344
+ "duplicatePage",
1345
+ "insertSection",
1346
+ "editSection",
1347
+ "deleteSection",
1348
+ "setRowHeight",
1349
+ "setColumnWidth",
1350
+ "insertTableRow",
1351
+ "deleteTableRow",
1352
+ "insertTableColumn",
1353
+ "deleteTableColumn",
1354
+ "insertHeaderRow",
1355
+ "removeHeaderRow",
1356
+ "insertFooterRow",
1357
+ "removeFooterRow",
1358
+ "setCellSpan",
1359
+ "insertTable"
1360
+ ],
970
1361
  "elements": [
971
1362
  {
972
1363
  "name": "TextFrame",
@@ -1328,5 +1719,39 @@
1328
1719
  }
1329
1720
  ]
1330
1721
  }
1722
+ ],
1723
+ "pathAliases": [
1724
+ {
1725
+ "name": "frameTextWrapInvert",
1726
+ "wire": "textWrapInvert"
1727
+ },
1728
+ {
1729
+ "name": "frameInnerShadow",
1730
+ "wire": "frameInnerShadowEnabled"
1731
+ },
1732
+ {
1733
+ "name": "frameOuterGlow",
1734
+ "wire": "frameOuterGlowEnabled"
1735
+ },
1736
+ {
1737
+ "name": "frameInnerGlow",
1738
+ "wire": "frameInnerGlowEnabled"
1739
+ },
1740
+ {
1741
+ "name": "frameBevel",
1742
+ "wire": "frameBevelEnabled"
1743
+ },
1744
+ {
1745
+ "name": "frameSatin",
1746
+ "wire": "frameSatinEnabled"
1747
+ },
1748
+ {
1749
+ "name": "frameFeather",
1750
+ "wire": "frameFeatherEnabled"
1751
+ },
1752
+ {
1753
+ "name": "frameDirectionalFeather",
1754
+ "wire": "frameDirectionalFeatherEnabled"
1755
+ }
1331
1756
  ]
1332
1757
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paged-media/introspect-wasm",
3
- "version": "0.61.1",
3
+ "version": "0.63.0",
4
4
  "type": "module",
5
5
  "main": "paged_introspect_wasm.js",
6
6
  "types": "paged_introspect_wasm.d.ts",
@@ -5,6 +5,17 @@
5
5
  */
6
6
  export type ScenePathSeg = { op: "moveTo"; x: number; y: number } | { op: "lineTo"; x: number; y: number } | { op: "cubicTo"; cx1: number; cy1: number; cx2: number; cy2: number; x: number; y: number } | { op: "close" };
7
7
 
8
+ /**
9
+ * A byte buffer that crosses the message channel. Wraps `Vec<u8>`
10
+ * so transferable-via-`postMessage` semantics are explicit at call
11
+ * sites; the wasm crate decides whether to clone or transfer based
12
+ * on whether the value is the JS-side `Uint8Array` or a Rust-side
13
+ * `Vec`. The wire form is whatever serde produces for `Vec<u8>` —
14
+ * JSON renders an array of numbers; future binary protocols (CBOR
15
+ * / messagepack) render a real bytes blob without code change.
16
+ */
17
+ export type ByteBuf = number[];
18
+
8
19
  /**
9
20
  * A compositing blend mode for [`SceneItem::FillPathBlend`] (C-1.4).
10
21
  * Mirrors the CSS-relevant subset of the display list\'s
@@ -15,6 +26,17 @@ export type ScenePathSeg = { op: "moveTo"; x: number; y: number } | { op: "lineT
15
26
  */
16
27
  export type SceneBlendMode = "multiply" | "screen" | "overlay" | "darken" | "lighten" | "colorDodge" | "colorBurn" | "hardLight" | "softLight" | "difference" | "exclusion" | "hue" | "saturation" | "color" | "luminosity";
17
28
 
29
+ /**
30
+ * A content-space mutation. Phase 1 carries the *envelope* only —
31
+ * the worker rejects each variant with `WorkerError::NotImplemented`.
32
+ * Phase 3 lights these up incrementally.
33
+ *
34
+ * Behind the default `mutations` feature: its payload types come from
35
+ * `paged-mutate`, and the read-only viewer SDK must not link that.
36
+ * See the crate docs.
37
+ */
38
+ export type Mutation = { op: "insertText"; args: { storyId: string; offset: number; text: string; cell?: TextCellAddr | null } } | { op: "deleteRange"; args: { storyId: string; start: number; end: number; cell?: TextCellAddr | null } } | { op: "applyStyle"; args: { storyId: string; start: number; end: number; style: string; scope: StyleScope; cell?: TextCellAddr | null } } | { op: "insertField"; args: { storyId: string; offset: number; field: FieldKind } } | { op: "insertAnchoredFrame"; args: { storyId: string; offset: number; width: number; height: number; imageUri?: string | null } } | { op: "insertHyperlink"; args: { storyId: string; start: number; end: number; url: string } } | { op: "setFieldValue"; args: { storyId: string; offset: number; value?: string | null } } | { op: "placeImage"; args: { elementId: string; uri: string; fit?: string | null } } | { op: "replaceImageBytes"; args: { elementId: string; bytes?: number[] | null } } | { op: "moveFrame"; args: { frameId: string; transform: [number, number, number, number, number, number] } } | { op: "resizeFrame"; args: { frameId: string; bounds: [number, number, number, number] } } | { op: "linkFrames"; args: { from: string; to: string } } | { op: "unlinkFrames"; args: { frame: string } } | { op: "insertPage"; args: { afterPageId: PageId | null; masterId: string | null } } | { op: "deletePage"; args: { pageId: PageId } } | { op: "resizePage"; args: { pageId: PageId; bounds: [number, number, number, number] } } | { op: "insertFrame"; args: { pageId: PageId; bounds: [number, number, number, number] } } | { op: "insertTextFrame"; args: { pageId: PageId; bounds: [number, number, number, number] } } | { op: "deleteFrame"; args: { frameId: string } } | { op: "insertLine"; args: { pageId: PageId; start: [number, number]; end: [number, number] } } | { op: "insertPath"; args: { pageId: PageId; anchors: PathAnchorSpec[]; open: boolean; smooth?: boolean } } | { op: "setDocumentDefaults"; args: { fillColor: string | null; strokeColor: string | null; strokeWeight: number | null } } | { op: "setColorSettings"; args: { cmykProfileName: string | null; rgbPolicy: string | null; intent: string | null; bpc: boolean | null } } | { op: "setProofSetup"; args: { profileName: string | null; simulatePaperWhite?: boolean; intent: string | null } } | { op: "importSwatchLibrary"; args: { bytes: number[]; groupName?: string | null } } | { op: "setInkSetting"; args: { spotId: string; convertToProcess?: boolean; aliasTo?: string | null } } | { op: "setUseStandardLabForSpots"; args: { enabled: boolean } } | { op: "pathPointInsert"; args: { elementId: ElementId; index: number; anchor: PathAnchorSpec; prevSubpathStarts?: number[] | null } } | { op: "pathPointRemove"; args: { elementId: ElementId; index: number } } | { op: "pathOpenAt"; args: { elementId: ElementId; index: number } } | { op: "outlineStroke"; args: { elementId: ElementId; width: number; cap: string; join: string; miterLimit: number } } | { op: "offsetPath"; args: { elementId: ElementId; delta: number; join: string; miterLimit: number } } | { op: "simplifyPath"; args: { elementId: ElementId; tolerance: number } } | { op: "closePath"; args: { elementId: ElementId; subpath?: number | null } } | { op: "joinPaths"; args: { elementId: ElementId; otherId: ElementId } } | { op: "pasteInto"; args: { containerId: ElementId; childId: ElementId } } | { op: "releaseFrom"; args: { childId: ElementId } } | { op: "reorderElement"; args: { elementId: ElementId; to: ZOrderTarget } } | { op: "applyOpacityMask"; args: { targetId: ElementId; maskId: ElementId; maskType?: string | null; invert?: boolean | null } } | { op: "releaseOpacityMask"; args: { targetId: ElementId } } | { op: "attachTextToPath"; args: { elementId: ElementId; storyId: string; pathTypeAlignment?: string | null; flipPathEffect?: string | null; startBracket?: number | null; endBracket?: number | null } } | { op: "detachTextFromPath"; args: { elementId: ElementId } } | { op: "createGroup"; args: { memberIds: ElementId[] } } | { op: "dissolveGroup"; args: { groupId: string } } | { op: "setGroupTransform"; args: { groupId: string; transform?: [number, number, number, number, number, number] | null } } | { op: "setPluginMetadata"; args: { elementId: ElementId; key: string; value?: string | null; caller?: string | null } } | { op: "pathPointCurveType"; args: { elementId: ElementId; index: number; smooth: boolean } } | { op: "pathPointSet"; args: { elementId: ElementId; index: number; role: PathPointRole; position: [number, number] } } | { op: "batch"; args: { ops: Mutation[] } } | { op: "bindCreated"; args: { handle: string } } | { op: "layerSetVisible"; args: { layerId: string; visible: boolean } } | { op: "layerSetLocked"; args: { layerId: string; locked: boolean } } | { op: "layerSetPrintable"; args: { layerId: string; printable: boolean } } | { op: "layerSetName"; args: { layerId: string; name: string } } | { op: "layerMove"; args: { layerId: string; newIndex: number } } | { op: "layerInsert"; args: { position: number; name: string } } | { op: "layerRemove"; args: { layerId: string } } | { op: "setElementProperty"; args: { elementId: ElementId; path: PropertyPath; value: Value } } | { op: "pathfinderBoolean"; args: { kept: ElementId; others: ElementId[]; kind: PathfinderKind } } | { op: "pathfinderDivide"; args: { elementIds: ElementId[] } } | { op: "pathfinderTrim"; args: { elementIds: ElementId[] } } | { op: "pathfinderMerge"; args: { elementIds: ElementId[] } } | { op: "pathfinderCrop"; args: { elementIds: ElementId[] } } | { op: "pathfinderOutline"; args: { elementIds: ElementId[] } } | { op: "pathfinderMinusBack"; args: { elementIds: ElementId[] } } | { op: "pathfinderFaces"; args: { elementIds: ElementId[]; faces: string[]; mode: FaceSelectMode } } | { op: "createSwatch"; args: { spec: SwatchSpec } } | { op: "editSwatch"; args: { swatchId: string; spec: SwatchSpec } } | { op: "deleteSwatch"; args: { swatchId: string } } | { op: "createGradient"; args: { spec: GradientSpec } } | { op: "editGradient"; args: { gradientId: string; spec: GradientSpec } } | { op: "deleteGradient"; args: { gradientId: string } } | { op: "createColorGroup"; args: { spec: ColorGroupSpec } } | { op: "editColorGroup"; args: { groupId: string; spec: ColorGroupSpec } } | { op: "deleteColorGroup"; args: { groupId: string } } | { op: "createNumberingList"; args: { spec: NumberingListSpec } } | { op: "editNumberingList"; args: { listId: string; spec: NumberingListSpec } } | { op: "deleteNumberingList"; args: { listId: string } } | { op: "createParagraphStyle"; args: { selfId?: string | null; name?: string | null; basedOn?: string | null } } | { op: "renameParagraphStyle"; args: { styleId: string; name: string } } | { op: "deleteParagraphStyle"; args: { styleId: string } } | { op: "createCharacterStyle"; args: { selfId?: string | null; name?: string | null; basedOn?: string | null } } | { op: "renameCharacterStyle"; args: { styleId: string; name: string } } | { op: "deleteCharacterStyle"; args: { styleId: string } } | { op: "createObjectStyle"; args: { selfId?: string | null; name?: string | null; basedOn?: string | null } } | { op: "renameObjectStyle"; args: { styleId: string; name: string } } | { op: "deleteObjectStyle"; args: { styleId: string } } | { op: "createCellStyle"; args: { selfId?: string | null; name?: string | null; basedOn?: string | null } } | { op: "renameCellStyle"; args: { styleId: string; name: string } } | { op: "deleteCellStyle"; args: { styleId: string } } | { op: "createTableStyle"; args: { selfId?: string | null; name?: string | null; basedOn?: string | null } } | { op: "renameTableStyle"; args: { styleId: string; name: string } } | { op: "deleteTableStyle"; args: { styleId: string } } | { op: "setStyleProperty"; args: { collection: StyleCollection; styleId: string; path: PropertyPath; value: Value } } | { op: "insertOval"; args: { pageId: PageId; bounds: [number, number, number, number] } } | { op: "insertGuide"; args: { spreadId: string; orientation: GuideOrientationSpec; position: number; pageIndex?: number } } | { op: "moveGuide"; args: { guideId: string; position: number } } | { op: "deleteGuide"; args: { guideId: string } } | { op: "setConditionVisible"; args: { condition: string; visible: boolean } } | { op: "activateConditionSet"; args: { set: string } } | { op: "applyMasterToPage"; args: { page: PageId; master?: string | null } } | { op: "duplicatePage"; args: { page: PageId } } | { op: "insertSection"; args: { atPage: PageId; prefix?: string | null; numberingStyle?: string | null; startAt?: number | null } } | { op: "editSection"; args: { sectionId: string; prefix?: string | null | null; numberingStyle?: string | null; startAt?: number | null | null } } | { op: "deleteSection"; args: { sectionId: string } } | { op: "setRowHeight"; args: { storyId: string; tableId: string; row: number; height?: number | null } } | { op: "setColumnWidth"; args: { storyId: string; tableId: string; col: number; width?: number | null } } | { op: "insertTableRow"; args: { storyId: string; tableId: string; at: number } } | { op: "deleteTableRow"; args: { storyId: string; tableId: string; at: number } } | { op: "insertTableColumn"; args: { storyId: string; tableId: string; at: number } } | { op: "deleteTableColumn"; args: { storyId: string; tableId: string; at: number } } | { op: "insertHeaderRow"; args: { storyId: string; tableId: string } } | { op: "removeHeaderRow"; args: { storyId: string; tableId: string } } | { op: "insertFooterRow"; args: { storyId: string; tableId: string } } | { op: "removeFooterRow"; args: { storyId: string; tableId: string } } | { op: "setCellSpan"; args: { storyId: string; tableId: string; row: number; col: number; rowSpan: number; columnSpan: number } } | { op: "insertTable"; args: { storyId: string; rows: number; cols: number; headerRows?: number; footerRows?: number; columnWidths?: number[]; rowHeights?: number[] } };
39
+
18
40
  /**
19
41
  * A plugin gradient paint for [`SceneItem::FillPathGradient`] (C-1.3).
20
42
  * Coordinates are frame-content points (mapped by the frame transform
@@ -222,6 +244,19 @@ export interface GradientFeatherStopSpec {
222
244
  midpointPct?: number;
223
245
  }
224
246
 
247
+ /**
248
+ * Element address the user can select OR a `SetElementProperty`
249
+ * mutation can target. The first six variants are page items
250
+ * (selection state holds these); `StoryRange` is the half-open
251
+ * character range that character / paragraph property writes
252
+ * address. Selection state today never holds `StoryRange` (the
253
+ * text-side caret + range live in `ContentSelection`); the
254
+ * variant exists so the apply layer can be reached via the
255
+ * existing `Mutation::SetElementProperty` wire shape — see
256
+ * `docs/paged/sdk-implementation-plan.md` §3c.1 ADR.
257
+ */
258
+ export type ElementId = { kind: "textFrame"; id: string } | { kind: "rectangle"; id: string } | { kind: "oval"; id: string } | { kind: "polygon"; id: string } | { kind: "graphicLine"; id: string } | { kind: "group"; id: string } | { kind: "storyRange"; id: { story_id: string; start: number; end: number } } | { kind: "table"; id: { story_id: string; table_id: string } } | { kind: "tableCell"; id: { story_id: string; table_id: string; row: number; col: number } };
259
+
225
260
  /**
226
261
  * Hint to downstream caches about what the apply touched. Lists
227
262
  * instead of a single enum so a Batch aggregates by union without
@@ -239,6 +274,16 @@ export interface InvalidationHint {
239
274
  structural: boolean;
240
275
  }
241
276
 
277
+ /**
278
+ * How a `SetElementSelection` request combines with the current set.
279
+ * Mirrors the canonical macOS / industry convention:
280
+ * - `Replace` — plain click; selection becomes the request.
281
+ * - `Add` — Shift-click; union (already-selected ids stay).
282
+ * - `Toggle` — Cmd/Ctrl-click; ids already in the set are removed,
283
+ * ids not in the set are added.
284
+ */
285
+ export type SelectionMode = "replace" | "add" | "toggle";
286
+
242
287
  /**
243
288
  * One RGBA8 tile of a [`PixelLayer`]. `rgba` is tightly packed
244
289
  * (`width*height*4`, row-major); the tile is placed at the `(x, y)`
@@ -341,25 +386,13 @@ export type PathfinderKind = "union" | "intersect" | "subtract" | "exclude";
341
386
  */
342
387
  export type NodeId = { kind: "TextFrame"; id: string } | { kind: "Rectangle"; id: string } | { kind: "Oval"; id: string } | { kind: "Polygon"; id: string } | { kind: "GraphicLine"; id: string } | { kind: "Group"; id: string } | { kind: "Spread"; id: string } | { kind: "Page"; id: string } | { kind: "Story"; id: string } | { kind: "Layer"; id: string } | { kind: "StoryRange"; id: { story_id: string; start: number; end: number } } | { kind: "Table"; id: { story_id: string; table_id: string } } | { kind: "TableCell"; id: { story_id: string; table_id: string; row: number; col: number } };
343
388
 
344
- /**
345
- * Stable page identity, independent of position in the page vector.
346
- *
347
- * Derived from the IDML `<Page Self=\"...\">` attribute where present;
348
- * synthesised as `\"page-<spread_idx>-<local_idx>\"` when missing
349
- * (older / synthetic fixtures without `Self`). The canvas keys
350
- * display-list caches and LOD tiles by `PageId`, so the value must
351
- * stay stable across re-layouts — only document-structural edits
352
- * (insert/delete page) should ever change the set of `PageId`s.
353
- */
354
- export type PageId = string;
355
-
356
389
  /**
357
390
  * The canonical mutation primitive. A closed set, extended only with
358
391
  * deliberation. Collection mutations (swatches, styles) operate on the
359
392
  * document\'s `BTreeMap` palettes/stylesheets rather than the scene
360
393
  * tree, so they\'re top-level variants rather than `InsertNode`.
361
394
  */
362
- export type Operation = { kind: "SetProperty"; node: NodeId; path: PropertyPath; value: Value } | { kind: "InsertNode"; parent: NodeId; position: number; node: NodeSpec; z_slot?: number | null } | { kind: "RemoveNode"; node: NodeId } | { kind: "MoveNode"; node: NodeId; new_parent: NodeId; position: number } | { kind: "ReorderNode"; node: NodeId; target: ZOrderTarget } | { kind: "Batch"; ops: Operation[] } | { kind: "InsertPage"; after_page_id?: string | null; master_id?: string | null; spread_self_id?: string | null; page_self_id?: string | null; restore_spread_json?: string | null } | { kind: "RemovePage"; page_id: string } | { kind: "MoveLayer"; layer_id: string; new_index: number } | { kind: "InsertLayer"; position: number; name: string; self_id?: string | null } | { kind: "RemoveLayer"; layer_id: string } | { kind: "CreateSwatch"; spec: SwatchSpec } | { kind: "EditSwatch"; swatch_id: string; spec: SwatchSpec } | { kind: "DeleteSwatch"; swatch_id: string } | { kind: "CreateParagraphStyle"; self_id?: string | null; name?: string | null; based_on?: string | null; restore_json?: string | null } | { kind: "RenameParagraphStyle"; style_id: string; name: string } | { kind: "DeleteParagraphStyle"; style_id: string } | { kind: "CreateCharacterStyle"; self_id?: string | null; name?: string | null; based_on?: string | null; restore_json?: string | null } | { kind: "RenameCharacterStyle"; style_id: string; name: string } | { kind: "DeleteCharacterStyle"; style_id: string } | { kind: "CreateObjectStyle"; self_id?: string | null; name?: string | null; based_on?: string | null; restore_json?: string | null } | { kind: "RenameObjectStyle"; style_id: string; name: string } | { kind: "DeleteObjectStyle"; style_id: string } | { kind: "CreateCellStyle"; self_id?: string | null; name?: string | null; based_on?: string | null; restore_json?: string | null } | { kind: "RenameCellStyle"; style_id: string; name: string } | { kind: "DeleteCellStyle"; style_id: string } | { kind: "CreateTableStyle"; self_id?: string | null; name?: string | null; based_on?: string | null; restore_json?: string | null } | { kind: "RenameTableStyle"; style_id: string; name: string } | { kind: "DeleteTableStyle"; style_id: string } | { kind: "CreateGroup"; spec: GroupSpec } | { kind: "DissolveGroup"; group_id: string; restore_slots?: number[] | null } | { kind: "SetGroupTransform"; group: string; transform?: [number, number, number, number, number, number] | null; prev?: [number, number, number, number, number, number] | null } | { kind: "CreateGradient"; spec: GradientSpec } | { kind: "EditGradient"; gradient_id: string; spec: GradientSpec } | { kind: "DeleteGradient"; gradient_id: string } | { kind: "CreateColorGroup"; spec: ColorGroupSpec } | { kind: "EditColorGroup"; group_id: string; spec: ColorGroupSpec } | { kind: "DeleteColorGroup"; group_id: string } | { kind: "CreateNumberingList"; spec: NumberingListSpec } | { kind: "EditNumberingList"; list_id: string; spec: NumberingListSpec } | { kind: "DeleteNumberingList"; list_id: string } | { kind: "SetStyleProperty"; collection: StyleCollection; style_id: string; path: PropertyPath; value: Value } | { kind: "PathfinderBoolean"; kept: NodeId; others: NodeId[]; opKind: PathfinderKind } | { kind: "PathfinderRegion"; elements: NodeId[]; verb: PathfinderRegionVerb } | { kind: "PathfinderFaces"; elements: NodeId[]; faces: string[]; mode: FaceSelectMode } | { kind: "JoinPaths"; kept: NodeId; other: NodeId } | { kind: "PasteInto"; container: NodeId; child: NodeId; child_index?: number | null } | { kind: "ReleaseFrom"; child: NodeId; restore_slot?: number | null } | { kind: "ApplyOpacityMask"; target: NodeId; mask: NodeId; mask_type?: OpacityMaskMode; invert?: boolean } | { kind: "ReleaseOpacityMask"; target: NodeId; restore_slot?: number | null } | { kind: "AttachTextToPath"; host: NodeId; story_id: string; spec?: TextPathSpec } | { kind: "DetachTextFromPath"; host: NodeId; index?: number | null; restore?: TextPathSpec | null } | { kind: "LinkFrames"; from: string; to: string } | { kind: "UnlinkFrames"; frame: string; prev_next?: string | null } | { kind: "ApplyStyle"; story_id: string; start: number; end: number; style: string; scope: StyleScope; cell?: CellAddr | null } | { kind: "InsertField"; story_id: string; offset: number; field: FieldKind } | { kind: "DeleteField"; story_id: string; offset: number; field: FieldKind } | { kind: "InsertAnchoredFrame"; story_id: string; offset: number; width: number; height: number; image_uri?: string | null; self_id: string } | { kind: "RemoveAnchoredFrame"; story_id: string; self_id: string } | { kind: "InsertHyperlink"; story_id: string; start: number; end: number; url: string; source_id: string; dest_id: string; hyperlink_id: string } | { kind: "RemoveHyperlink"; story_id: string; start: number; end: number; url: string; source_id: string; dest_id: string; hyperlink_id: string } | { kind: "SetFieldValue"; story_id: string; offset: number; value?: string | null } | { kind: "PlaceImage"; frame: NodeId; image_uri?: string | null; fit?: string | null } | { kind: "ReplaceImageBytes"; frame: NodeId; bytes?: number[] | null; prior_has_image_element?: boolean | null } | { kind: "InsertGuide"; spread_id: string; orientation: GuideOrientationSpec; position: number; page_index?: number; guide_id?: string | null } | { kind: "MoveGuide"; guide_id: string; position: number } | { kind: "DeleteGuide"; guide_id: string } | { kind: "SetConditionVisible"; condition: string; visible: boolean } | { kind: "ActivateConditionSet"; set: string } | { kind: "RestoreConditionVisibility"; states: [string, boolean][] } | { kind: "ApplyMasterToPage"; page: string; master?: string | null } | { kind: "DuplicatePage"; page: string; clone_spread_json?: string | null } | { kind: "InsertSection"; at_page: string; prefix?: string | null; numbering_style?: string | null; start_at?: number | null; self_id?: string | null } | { kind: "EditSection"; section_id: string; prefix?: string | null | null; numbering_style?: string | null; start_at?: number | null | null } | { kind: "DeleteSection"; section_id: string } | { kind: "SetRowHeight"; story_id: string; table_id: string; row: number; height?: number | null } | { kind: "SetColumnWidth"; story_id: string; table_id: string; col: number; width?: number | null } | { kind: "InsertTableRow"; story_id: string; table_id: string; at: number; restore?: TableLineRestoreJson | null } | { kind: "DeleteTableRow"; story_id: string; table_id: string; at: number } | { kind: "InsertTableColumn"; story_id: string; table_id: string; at: number; restore?: TableLineRestoreJson | null } | { kind: "DeleteTableColumn"; story_id: string; table_id: string; at: number } | { kind: "InsertHeaderRow"; story_id: string; table_id: string; restore?: TableLineRestoreJson | null } | { kind: "RemoveHeaderRow"; story_id: string; table_id: string } | { kind: "InsertFooterRow"; story_id: string; table_id: string; restore?: TableLineRestoreJson | null } | { kind: "RemoveFooterRow"; story_id: string; table_id: string } | { kind: "SetCellSpan"; story_id: string; table_id: string; row: number; col: number; row_span: number; column_span: number };
395
+ export type Operation = { kind: "SetProperty"; node: NodeId; path: PropertyPath; value: Value } | { kind: "InsertNode"; parent: NodeId; position: number; node: NodeSpec; z_slot?: number | null } | { kind: "RemoveNode"; node: NodeId } | { kind: "MoveNode"; node: NodeId; new_parent: NodeId; position: number } | { kind: "ReorderNode"; node: NodeId; target: ZOrderTarget } | { kind: "Batch"; ops: Operation[] } | { kind: "InsertPage"; after_page_id?: string | null; master_id?: string | null; spread_self_id?: string | null; page_self_id?: string | null; restore_spread_json?: string | null } | { kind: "RemovePage"; page_id: string } | { kind: "MoveLayer"; layer_id: string; new_index: number } | { kind: "InsertLayer"; position: number; name: string; self_id?: string | null } | { kind: "RemoveLayer"; layer_id: string } | { kind: "CreateSwatch"; spec: SwatchSpec } | { kind: "EditSwatch"; swatch_id: string; spec: SwatchSpec } | { kind: "DeleteSwatch"; swatch_id: string } | { kind: "CreateParagraphStyle"; self_id?: string | null; name?: string | null; based_on?: string | null; restore_json?: string | null } | { kind: "RenameParagraphStyle"; style_id: string; name: string } | { kind: "DeleteParagraphStyle"; style_id: string } | { kind: "CreateCharacterStyle"; self_id?: string | null; name?: string | null; based_on?: string | null; restore_json?: string | null } | { kind: "RenameCharacterStyle"; style_id: string; name: string } | { kind: "DeleteCharacterStyle"; style_id: string } | { kind: "CreateObjectStyle"; self_id?: string | null; name?: string | null; based_on?: string | null; restore_json?: string | null } | { kind: "RenameObjectStyle"; style_id: string; name: string } | { kind: "DeleteObjectStyle"; style_id: string } | { kind: "CreateCellStyle"; self_id?: string | null; name?: string | null; based_on?: string | null; restore_json?: string | null } | { kind: "RenameCellStyle"; style_id: string; name: string } | { kind: "DeleteCellStyle"; style_id: string } | { kind: "CreateTableStyle"; self_id?: string | null; name?: string | null; based_on?: string | null; restore_json?: string | null } | { kind: "RenameTableStyle"; style_id: string; name: string } | { kind: "DeleteTableStyle"; style_id: string } | { kind: "CreateGroup"; spec: GroupSpec } | { kind: "DissolveGroup"; group_id: string; restore_slots?: number[] | null } | { kind: "SetGroupTransform"; group: string; transform?: [number, number, number, number, number, number] | null; prev?: [number, number, number, number, number, number] | null } | { kind: "CreateGradient"; spec: GradientSpec } | { kind: "EditGradient"; gradient_id: string; spec: GradientSpec } | { kind: "DeleteGradient"; gradient_id: string } | { kind: "CreateColorGroup"; spec: ColorGroupSpec } | { kind: "EditColorGroup"; group_id: string; spec: ColorGroupSpec } | { kind: "DeleteColorGroup"; group_id: string } | { kind: "CreateNumberingList"; spec: NumberingListSpec } | { kind: "EditNumberingList"; list_id: string; spec: NumberingListSpec } | { kind: "DeleteNumberingList"; list_id: string } | { kind: "SetStyleProperty"; collection: StyleCollection; style_id: string; path: PropertyPath; value: Value } | { kind: "PathfinderBoolean"; kept: NodeId; others: NodeId[]; opKind: PathfinderKind } | { kind: "PathfinderRegion"; elements: NodeId[]; verb: PathfinderRegionVerb } | { kind: "PathfinderFaces"; elements: NodeId[]; faces: string[]; mode: FaceSelectMode } | { kind: "JoinPaths"; kept: NodeId; other: NodeId } | { kind: "PasteInto"; container: NodeId; child: NodeId; child_index?: number | null } | { kind: "ReleaseFrom"; child: NodeId; restore_slot?: number | null } | { kind: "ApplyOpacityMask"; target: NodeId; mask: NodeId; mask_type?: OpacityMaskMode; invert?: boolean } | { kind: "ReleaseOpacityMask"; target: NodeId; restore_slot?: number | null } | { kind: "AttachTextToPath"; host: NodeId; story_id: string; spec?: TextPathSpec } | { kind: "DetachTextFromPath"; host: NodeId; index?: number | null; restore?: TextPathSpec | null } | { kind: "LinkFrames"; from: string; to: string } | { kind: "UnlinkFrames"; frame: string; prev_next?: string | null; restore_target?: [string, string | null, string | null] | null } | { kind: "ApplyStyle"; story_id: string; start: number; end: number; style: string; scope: StyleScope; cell?: CellAddr | null } | { kind: "InsertField"; story_id: string; offset: number; field: FieldKind } | { kind: "DeleteField"; story_id: string; offset: number; field: FieldKind } | { kind: "InsertAnchoredFrame"; story_id: string; offset: number; width: number; height: number; image_uri?: string | null; self_id: string } | { kind: "RemoveAnchoredFrame"; story_id: string; self_id: string } | { kind: "InsertHyperlink"; story_id: string; start: number; end: number; url: string; source_id: string; dest_id: string; hyperlink_id: string } | { kind: "RemoveHyperlink"; story_id: string; start: number; end: number; url: string; source_id: string; dest_id: string; hyperlink_id: string } | { kind: "SetFieldValue"; story_id: string; offset: number; value?: string | null } | { kind: "PlaceImage"; frame: NodeId; image_uri?: string | null; fit?: string | null } | { kind: "ReplaceImageBytes"; frame: NodeId; bytes?: number[] | null; prior_has_image_element?: boolean | null } | { kind: "InsertGuide"; spread_id: string; orientation: GuideOrientationSpec; position: number; page_index?: number; guide_id?: string | null } | { kind: "MoveGuide"; guide_id: string; position: number } | { kind: "DeleteGuide"; guide_id: string } | { kind: "SetConditionVisible"; condition: string; visible: boolean } | { kind: "ActivateConditionSet"; set: string } | { kind: "RestoreConditionVisibility"; states: [string, boolean][] } | { kind: "ApplyMasterToPage"; page: string; master?: string | null } | { kind: "DuplicatePage"; page: string; clone_spread_json?: string | null } | { kind: "InsertSection"; at_page: string; prefix?: string | null; numbering_style?: string | null; start_at?: number | null; self_id?: string | null } | { kind: "EditSection"; section_id: string; prefix?: string | null | null; numbering_style?: string | null; start_at?: number | null | null } | { kind: "DeleteSection"; section_id: string } | { kind: "SetRowHeight"; story_id: string; table_id: string; row: number; height?: number | null } | { kind: "SetColumnWidth"; story_id: string; table_id: string; col: number; width?: number | null } | { kind: "InsertTableRow"; story_id: string; table_id: string; at: number; restore?: TableLineRestoreJson | null } | { kind: "DeleteTableRow"; story_id: string; table_id: string; at: number } | { kind: "InsertTableColumn"; story_id: string; table_id: string; at: number; restore?: TableLineRestoreJson | null } | { kind: "DeleteTableColumn"; story_id: string; table_id: string; at: number } | { kind: "InsertHeaderRow"; story_id: string; table_id: string; restore?: TableLineRestoreJson | null } | { kind: "RemoveHeaderRow"; story_id: string; table_id: string } | { kind: "InsertFooterRow"; story_id: string; table_id: string; restore?: TableLineRestoreJson | null } | { kind: "RemoveFooterRow"; story_id: string; table_id: string } | { kind: "SetCellSpan"; story_id: string; table_id: string; row: number; col: number; row_span: number; column_span: number };
363
396
 
364
397
  /**
365
398
  * Track J — wire-shape mirror of `paged_model::PathAnchor`. The
@@ -390,7 +423,7 @@ export type Value = { type: "bounds"; value: [number, number, number, number] }
390
423
  * (`\"fill.color\"`) — so JS callers don\'t need to learn the Rust
391
424
  * enum shape.
392
425
  */
393
- export type PropertyPath = "frameBounds" | "frameFillColor" | "frameStrokeColor" | "frameStrokeWeight" | "frameOpacity" | "frameTransform" | "imageContentTransform" | "framePathPoint" | "pathPointInsert" | "pathPointRemove" | "pathPointCurveType" | "layerVisible" | "layerLocked" | "layerPrintable" | "layerName" | "characterFontSize" | "characterLeading" | "characterTracking" | "characterFillColor" | "paragraphSpaceBefore" | "paragraphSpaceAfter" | "paragraphFirstLineIndent" | "appliedParagraphStyle" | "appliedCharacterStyle" | "appliedObjectStyle" | "appliedCellStyle" | "appliedTableStyle" | "framePath" | "frameNonprinting" | "frameFillTint" | "frameGradientFillAngle" | "frameGradientFillLength" | "frameGradientStrokeAngle" | "frameGradientStrokeLength" | "pathOpenAt" | "outlineStroke" | "outlineStrokeVariable" | "offsetPath" | "simplifyPath" | "closePath" | "frameGradientFeather" | "pageBounds" | "frameDropShadowMode" | "frameDropShadowXOffset" | "frameDropShadowYOffset" | "frameDropShadowSize" | "frameDropShadowOpacity" | "frameDropShadowColor" | "frameDropShadow" | "frameFittingCrops" | "frameFittingType" | "frameTextWrapMode" | "frameTextWrapOffsets" | "frameTextWrapContourType" | "frameTextWrapContourIncludeInside" | "paragraphJustification" | "paragraphStyleNextStyle" | "paragraphAppliedNumberingList" | "frameStrokeEndCap" | "frameInsetSpacing" | "appliedConditions" | "characterFontFamily" | "characterFontStyle" | "characterKerningMethod" | "characterCase" | "characterPosition" | "characterLanguage" | "characterBaselineShift" | "characterHorizontalScale" | "characterVerticalScale" | "characterSkew" | "characterUnderline" | "characterStrikethru" | "characterLigatures" | "characterOtfFeatures" | "paragraphLeftIndent" | "paragraphRightIndent" | "paragraphDropCapCharacters" | "paragraphDropCapLines" | "paragraphHyphenation" | "paragraphKeepLinesTogether" | "paragraphKeepWithNext" | "paragraphRuleAbove" | "paragraphRuleBelow" | "paragraphTabStops" | "paragraphListType" | "paragraphBulletCharacter" | "paragraphNumberingFormat" | "textFrameColumnCount" | "textFrameColumnGutter" | "textFrameColumnBalance" | "textFrameVerticalJustification" | "textFrameAutoSizing" | "textFrameFirstBaseline" | "textWrapInvert" | "frameFittingReferencePoint" | "frameAutoFit" | "frameStrokeType" | "frameStrokeJoin" | "frameStrokeMiterLimit" | "frameStrokeAlignment" | "frameStrokeGapColor" | "frameStrokeGapTint" | "frameStrokeDashArray" | "frameCornerOptionTopLeft" | "frameCornerOptionTopRight" | "frameCornerOptionBottomLeft" | "frameCornerOptionBottomRight" | "frameCornerRadiusTopLeft" | "frameCornerRadiusTopRight" | "frameCornerRadiusBottomLeft" | "frameCornerRadiusBottomRight" | "frameRotationAngle" | "frameScaleX" | "frameScaleY" | "frameFlipH" | "frameFlipV" | "frameOverprintFill" | "frameOverprintStroke" | "frameInnerShadowEnabled" | "frameInnerShadowBlendMode" | "frameInnerShadowColor" | "frameInnerShadowOpacity" | "frameInnerShadowAngle" | "frameInnerShadowDistance" | "frameInnerShadowSize" | "frameInnerShadowChoke" | "frameInnerShadowNoise" | "frameOuterGlowEnabled" | "frameOuterGlowBlendMode" | "frameOuterGlowColor" | "frameOuterGlowOpacity" | "frameOuterGlowSpread" | "frameOuterGlowSize" | "frameOuterGlowNoise" | "frameInnerGlowEnabled" | "frameInnerGlowBlendMode" | "frameInnerGlowColor" | "frameInnerGlowOpacity" | "frameInnerGlowChoke" | "frameInnerGlowSize" | "frameInnerGlowSource" | "frameInnerGlowNoise" | "frameBevelEnabled" | "frameBevelStyle" | "frameBevelTechnique" | "frameBevelDepth" | "frameBevelDirection" | "frameBevelSize" | "frameBevelSoften" | "frameBevelAngle" | "frameBevelAltitude" | "frameBevelHighlightColor" | "frameBevelShadowColor" | "frameBevelHighlightOpacity" | "frameBevelShadowOpacity" | "frameSatinEnabled" | "frameSatinBlendMode" | "frameSatinColor" | "frameSatinOpacity" | "frameSatinAngle" | "frameSatinDistance" | "frameSatinSize" | "frameSatinInvert" | "frameFeatherEnabled" | "frameFeatherWidth" | "frameFeatherCornerType" | "frameFeatherNoise" | "frameFeatherChoke" | "frameDirectionalFeatherEnabled" | "frameDirectionalFeatherLeftWidth" | "frameDirectionalFeatherRightWidth" | "frameDirectionalFeatherTopWidth" | "frameDirectionalFeatherBottomWidth" | "frameDirectionalFeatherAngle" | "frameDirectionalFeatherNoise" | "frameDirectionalFeatherChoke" | "frameBlendMode" | "nextTextFrame" | "previousTextFrame" | "cellFillColor" | "cellFillTint" | "cellInsetTop" | "cellInsetLeft" | "cellInsetBottom" | "cellInsetRight" | "cellVerticalJustification" | "cellTopEdgeStrokeColor" | "cellTopEdgeStrokeWeight" | "cellTopEdgeStrokeTint" | "cellBottomEdgeStrokeColor" | "cellBottomEdgeStrokeWeight" | "cellBottomEdgeStrokeTint" | "cellLeftEdgeStrokeColor" | "cellLeftEdgeStrokeWeight" | "cellLeftEdgeStrokeTint" | "cellRightEdgeStrokeColor" | "cellRightEdgeStrokeWeight" | "cellRightEdgeStrokeTint" | "tableRowCount" | "tableColumnCount" | "pluginMetadata" | "anchoredPosition" | "anchorPoint" | "anchoredXOffset" | "anchoredYOffset" | "anchoredHorizontalReference" | "anchoredVerticalReference" | "anchoredHorizontalAlignment" | "anchoredVerticalAlignment" | "anchoredSpineRelative" | "anchoredLockPosition" | "elementVisible" | "elementLocked" | "frameStrokeStartArrowhead" | "frameStrokeEndArrowhead";
426
+ export type PropertyPath = "frameBounds" | "frameFillColor" | "frameStrokeColor" | "frameStrokeWeight" | "frameOpacity" | "frameTransform" | "imageContentTransform" | "framePathPoint" | "pathPointInsert" | "pathPointRemove" | "pathPointCurveType" | "layerVisible" | "layerLocked" | "layerPrintable" | "layerName" | "characterFontSize" | "characterLeading" | "characterTracking" | "characterFillColor" | "paragraphSpaceBefore" | "paragraphSpaceAfter" | "paragraphFirstLineIndent" | "appliedParagraphStyle" | "appliedCharacterStyle" | "appliedObjectStyle" | "itemLayer" | "appliedCellStyle" | "appliedTableStyle" | "framePath" | "frameNonprinting" | "frameFillTint" | "frameGradientFillAngle" | "frameGradientFillLength" | "frameGradientStrokeAngle" | "frameGradientStrokeLength" | "pathOpenAt" | "outlineStroke" | "outlineStrokeVariable" | "offsetPath" | "simplifyPath" | "closePath" | "frameGradientFeather" | "pageBounds" | "frameDropShadowMode" | "frameDropShadowXOffset" | "frameDropShadowYOffset" | "frameDropShadowSize" | "frameDropShadowOpacity" | "frameDropShadowColor" | "frameDropShadow" | "frameFittingCrops" | "frameFittingType" | "frameTextWrapMode" | "frameTextWrapOffsets" | "frameTextWrapContourType" | "frameTextWrapContourIncludeInside" | "paragraphJustification" | "paragraphStyleNextStyle" | "paragraphAppliedNumberingList" | "frameStrokeEndCap" | "frameInsetSpacing" | "appliedConditions" | "characterFontFamily" | "characterFontStyle" | "characterKerningMethod" | "characterCase" | "characterPosition" | "characterLanguage" | "characterBaselineShift" | "characterHorizontalScale" | "characterVerticalScale" | "characterSkew" | "characterUnderline" | "characterStrikethru" | "characterLigatures" | "characterOtfFeatures" | "paragraphLeftIndent" | "paragraphRightIndent" | "paragraphDropCapCharacters" | "paragraphDropCapLines" | "paragraphHyphenation" | "paragraphKeepLinesTogether" | "paragraphKeepWithNext" | "paragraphRuleAbove" | "paragraphRuleBelow" | "paragraphTabStops" | "paragraphListType" | "paragraphBulletCharacter" | "paragraphNumberingFormat" | "textFrameColumnCount" | "textFrameColumnGutter" | "textFrameColumnBalance" | "textFrameVerticalJustification" | "textFrameAutoSizing" | "textFrameFirstBaseline" | "textWrapInvert" | "frameFittingReferencePoint" | "frameAutoFit" | "frameStrokeType" | "frameStrokeJoin" | "frameStrokeMiterLimit" | "frameStrokeAlignment" | "frameStrokeGapColor" | "frameStrokeGapTint" | "frameStrokeDashArray" | "frameCornerOptionTopLeft" | "frameCornerOptionTopRight" | "frameCornerOptionBottomLeft" | "frameCornerOptionBottomRight" | "frameCornerRadiusTopLeft" | "frameCornerRadiusTopRight" | "frameCornerRadiusBottomLeft" | "frameCornerRadiusBottomRight" | "frameRotationAngle" | "frameScaleX" | "frameScaleY" | "frameFlipH" | "frameFlipV" | "frameOverprintFill" | "frameOverprintStroke" | "frameInnerShadowEnabled" | "frameInnerShadowBlendMode" | "frameInnerShadowColor" | "frameInnerShadowOpacity" | "frameInnerShadowAngle" | "frameInnerShadowDistance" | "frameInnerShadowSize" | "frameInnerShadowChoke" | "frameInnerShadowNoise" | "frameOuterGlowEnabled" | "frameOuterGlowBlendMode" | "frameOuterGlowColor" | "frameOuterGlowOpacity" | "frameOuterGlowSpread" | "frameOuterGlowSize" | "frameOuterGlowNoise" | "frameInnerGlowEnabled" | "frameInnerGlowBlendMode" | "frameInnerGlowColor" | "frameInnerGlowOpacity" | "frameInnerGlowChoke" | "frameInnerGlowSize" | "frameInnerGlowSource" | "frameInnerGlowNoise" | "frameBevelEnabled" | "frameBevelStyle" | "frameBevelTechnique" | "frameBevelDepth" | "frameBevelDirection" | "frameBevelSize" | "frameBevelSoften" | "frameBevelAngle" | "frameBevelAltitude" | "frameBevelHighlightColor" | "frameBevelShadowColor" | "frameBevelHighlightOpacity" | "frameBevelShadowOpacity" | "frameSatinEnabled" | "frameSatinBlendMode" | "frameSatinColor" | "frameSatinOpacity" | "frameSatinAngle" | "frameSatinDistance" | "frameSatinSize" | "frameSatinInvert" | "frameFeatherEnabled" | "frameFeatherWidth" | "frameFeatherCornerType" | "frameFeatherNoise" | "frameFeatherChoke" | "frameDirectionalFeatherEnabled" | "frameDirectionalFeatherLeftWidth" | "frameDirectionalFeatherRightWidth" | "frameDirectionalFeatherTopWidth" | "frameDirectionalFeatherBottomWidth" | "frameDirectionalFeatherAngle" | "frameDirectionalFeatherNoise" | "frameDirectionalFeatherChoke" | "frameBlendMode" | "nextTextFrame" | "previousTextFrame" | "cellFillColor" | "cellFillTint" | "cellInsetTop" | "cellInsetLeft" | "cellInsetBottom" | "cellInsetRight" | "cellVerticalJustification" | "cellTopEdgeStrokeColor" | "cellTopEdgeStrokeWeight" | "cellTopEdgeStrokeTint" | "cellBottomEdgeStrokeColor" | "cellBottomEdgeStrokeWeight" | "cellBottomEdgeStrokeTint" | "cellLeftEdgeStrokeColor" | "cellLeftEdgeStrokeWeight" | "cellLeftEdgeStrokeTint" | "cellRightEdgeStrokeColor" | "cellRightEdgeStrokeWeight" | "cellRightEdgeStrokeTint" | "tableRowCount" | "tableColumnCount" | "pluginMetadata" | "anchoredPosition" | "anchorPoint" | "anchoredXOffset" | "anchoredYOffset" | "anchoredHorizontalReference" | "anchoredVerticalReference" | "anchoredHorizontalAlignment" | "anchoredVerticalAlignment" | "anchoredSpineRelative" | "anchoredLockPosition" | "elementVisible" | "elementLocked" | "frameStrokeStartArrowhead" | "frameStrokeEndArrowhead";
394
427
 
395
428
  /**
396
429
  * W0.2 — wire mirror of `paged_model::ParagraphRule` (the
@@ -441,6 +474,60 @@ export type FieldKind = "pageNumber" | "nextPageNumber" | { placeholder: { plugi
441
474
  */
442
475
  export type GuideOrientationSpec = "vertical" | "horizontal";
443
476
 
477
+ /**
478
+ * W1.13 — cell qualifier for a content address that points INTO a
479
+ * table cell rather than the story\'s main paragraph flow.
480
+ *
481
+ * ## The two-stream addressing model
482
+ *
483
+ * Table-cell text is stored out of band on `Table.cells[].paragraphs`
484
+ * (see `idml_import`), disjoint from `Story.paragraphs`. So a content
485
+ * address needs to say *which* paragraph stream its byte offsets index:
486
+ *
487
+ * - `ContentSelection.cell == None` — offsets are story-local bytes
488
+ * over `story.paragraphs` (the body flow). Unchanged from before.
489
+ * - `ContentSelection.cell == Some(addr)` — offsets are CELL-LOCAL
490
+ * bytes over `cell.paragraphs`, under the same story-offset contract
491
+ * (run bytes + one synthetic `\\n` per inter-paragraph boundary,
492
+ * counted within the cell). The owning story is still `story_id`;
493
+ * `addr` picks the cell within that story\'s table.
494
+ *
495
+ * `table_id` / `row` / `col` are the SAME identifiers the hit-test
496
+ * surface emits (`HitResult.table_context` / `TableHitContext`) and
497
+ * that the renderer stamps onto cell `LineLayout`s
498
+ * (`paged_renderer::CellAddr`), so a hit that lands in a cell hands
499
+ * back exactly the qualifier the caret/edit address needs — no second
500
+ * query.
501
+ *
502
+ * ## Why a qualifier and not a re-numbered flat offset
503
+ *
504
+ * The alternative — fold cells into one flat story-offset space via a
505
+ * reserved high-bit/region scheme — was rejected: it makes
506
+ * `shift_for_insert`/`shift_for_delete`, undo inverse offsets, and the
507
+ * existing body-only consumers (BreakRecord, the A/B harness, every
508
+ * `RequestWordBounds`/`RequestLineBounds` caller) all have to learn the
509
+ * encoding, and a single arithmetic slip silently routes an edit into
510
+ * the wrong cell. The qualifier keeps body addressing byte-identical
511
+ * (the field defaults to `None` and is `#[serde(default)]`, so it
512
+ * rides v35 additively — old senders omit it) and makes \"which stream\
513
+ * an explicit, type-checked decision. Undo is trivially correct
514
+ * because the inverse op carries the same `cell` qualifier.
515
+ */
516
+ export interface TextCellAddr {
517
+ /**
518
+ * `<Table Self=\"...\">` id within `story_id`.
519
+ */
520
+ tableId: string;
521
+ /**
522
+ * Template row (0-based); span-origin row for spanned cells.
523
+ */
524
+ row: number;
525
+ /**
526
+ * Column (0-based); span-origin column for spanned cells.
527
+ */
528
+ col: number;
529
+ }
530
+
444
531
  /**
445
532
  * W1.20 — `(parent_group_id, index_within_parent_members)` carried by
446
533
  * a `GroupSpec` when a group must be (re)created nested inside another
@@ -567,6 +654,8 @@ export type StyleScope = "paragraph" | "character";
567
654
  */
568
655
  export type ZOrderTarget = "front" | "back" | "forward" | "backward" | { index: number };
569
656
 
657
+ export type PageId = string;
658
+
570
659
 
571
660
  export class Inspector {
572
661
  free(): void;
Binary file