@paged-media/introspect-wasm 0.62.0 → 0.64.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
@@ -630,6 +630,13 @@
630
630
  "kind": "write",
631
631
  "summary": "Flip a condition's visibility."
632
632
  },
633
+ {
634
+ "name": "paged.setFlowGrowRule",
635
+ "params": "(storyId, grow, maxPages?, copyFrameOptions?)",
636
+ "returns": "bool",
637
+ "kind": "write",
638
+ "summary": "Let a story's frame chain grow: generated pages are added after its last frame's page while it oversets (InDesign's Smart Text Reflow), and removed when empty. copyFrameOptions gives generated frames the chain's frame options (a Word section's mode) instead of InDesign's defaults. grow=false clears the rule."
639
+ },
633
640
  {
634
641
  "name": "paged.activateConditionSet",
635
642
  "params": "(setId)",
@@ -756,12 +763,257 @@
756
763
  "kind": "write",
757
764
  "summary": "Set or clear the text caret/range."
758
765
  },
766
+ {
767
+ "name": "paged.reorderElement",
768
+ "params": "(id, target)",
769
+ "returns": "bool",
770
+ "kind": "author",
771
+ "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)."
772
+ },
773
+ {
774
+ "name": "paged.pasteInto",
775
+ "params": "(containerId, childId)",
776
+ "returns": "bool",
777
+ "kind": "author",
778
+ "summary": "Nest an existing item inside a container frame."
779
+ },
780
+ {
781
+ "name": "paged.releaseFrom",
782
+ "params": "(childId)",
783
+ "returns": "bool",
784
+ "kind": "author",
785
+ "summary": "Lift a nested item back out of its container (inverse of pasteInto)."
786
+ },
787
+ {
788
+ "name": "paged.closePath",
789
+ "params": "(id, subpath?)",
790
+ "returns": "bool",
791
+ "kind": "author",
792
+ "summary": "Close an open contour; subpath defaults to the whole path."
793
+ },
794
+ {
795
+ "name": "paged.joinPaths",
796
+ "params": "(id, otherId)",
797
+ "returns": "bool",
798
+ "kind": "author",
799
+ "summary": "Weld two open paths into one."
800
+ },
801
+ {
802
+ "name": "paged.pathfinderDivide",
803
+ "params": "([id, ...])",
804
+ "returns": "bool",
805
+ "kind": "author",
806
+ "summary": "Divide the selection into its planar regions."
807
+ },
808
+ {
809
+ "name": "paged.pathfinderTrim",
810
+ "params": "([id, ...])",
811
+ "returns": "bool",
812
+ "kind": "author",
813
+ "summary": "Trim hidden parts of the lower shapes away."
814
+ },
815
+ {
816
+ "name": "paged.pathfinderMerge",
817
+ "params": "([id, ...])",
818
+ "returns": "bool",
819
+ "kind": "author",
820
+ "summary": "Merge adjacent same-paint regions of the selection."
821
+ },
822
+ {
823
+ "name": "paged.pathfinderCrop",
824
+ "params": "([id, ...])",
825
+ "returns": "bool",
826
+ "kind": "author",
827
+ "summary": "Crop the selection to the topmost shape."
828
+ },
829
+ {
830
+ "name": "paged.pathfinderOutline",
831
+ "params": "([id, ...])",
832
+ "returns": "bool",
833
+ "kind": "author",
834
+ "summary": "Reduce the selection to its outlined edges."
835
+ },
836
+ {
837
+ "name": "paged.pathfinderMinusBack",
838
+ "params": "([id, ...])",
839
+ "returns": "bool",
840
+ "kind": "author",
841
+ "summary": "Subtract the shapes behind from the frontmost one."
842
+ },
843
+ {
844
+ "name": "paged.pathfinderFaces",
845
+ "params": "([id, ...], [faceId, ...], mode)",
846
+ "returns": "bool",
847
+ "kind": "author",
848
+ "summary": "Keep or drop named faces of the planar arrangement; mode = keep | remove. Face ids come from paged.planarRegions."
849
+ },
850
+ {
851
+ "name": "paged.planarRegions",
852
+ "params": "([id, ...], [x, y]?)",
853
+ "returns": "PlanarRegionsResult JSON",
854
+ "kind": "read",
855
+ "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."
856
+ },
857
+ {
858
+ "name": "paged.applyOpacityMask",
859
+ "params": "(targetId, maskId, {maskType?, invert?}?)",
860
+ "returns": "bool",
861
+ "kind": "author",
862
+ "summary": "Mask one element with another."
863
+ },
864
+ {
865
+ "name": "paged.releaseOpacityMask",
866
+ "params": "(targetId)",
867
+ "returns": "bool",
868
+ "kind": "author",
869
+ "summary": "Remove an element's opacity mask."
870
+ },
871
+ {
872
+ "name": "paged.attachTextToPath",
873
+ "params": "(id, storyId, {pathTypeAlignment?, flipPathEffect?, startBracket?, endBracket?}?)",
874
+ "returns": "bool",
875
+ "kind": "author",
876
+ "summary": "Run a story along a path."
877
+ },
878
+ {
879
+ "name": "paged.detachTextFromPath",
880
+ "params": "(id)",
881
+ "returns": "bool",
882
+ "kind": "author",
883
+ "summary": "Take a story back off its path."
884
+ },
885
+ {
886
+ "name": "paged.insertAnchoredFrame",
887
+ "params": "(storyId, offset, width, height, imageUri?)",
888
+ "returns": "bool",
889
+ "kind": "author",
890
+ "summary": "Anchor a frame in the text at a story offset; with imageUri the frame is created holding that image."
891
+ },
892
+ {
893
+ "name": "paged.insertHyperlink",
894
+ "params": "(storyId, start, end, url)",
895
+ "returns": "bool",
896
+ "kind": "author",
897
+ "summary": "Make a character range a clickable link. Read the result with paged.collection(\"hyperlinks\") — paged.links() is the placed-asset list, not this."
898
+ },
899
+ {
900
+ "name": "paged.layerSetVisible",
901
+ "params": "(layerId, visible)",
902
+ "returns": "bool",
903
+ "kind": "write",
904
+ "summary": "Show or hide a layer."
905
+ },
906
+ {
907
+ "name": "paged.layerSetLocked",
908
+ "params": "(layerId, locked)",
909
+ "returns": "bool",
910
+ "kind": "write",
911
+ "summary": "Lock or unlock a layer."
912
+ },
913
+ {
914
+ "name": "paged.layerSetPrintable",
915
+ "params": "(layerId, printable)",
916
+ "returns": "bool",
917
+ "kind": "write",
918
+ "summary": "Include a layer in output, or hold it back."
919
+ },
920
+ {
921
+ "name": "paged.layerSetName",
922
+ "params": "(layerId, name)",
923
+ "returns": "bool",
924
+ "kind": "write",
925
+ "summary": "Rename a layer."
926
+ },
927
+ {
928
+ "name": "paged.createSwatch",
929
+ "params": "(spec)",
930
+ "returns": "string (created id) | null",
931
+ "kind": "author",
932
+ "summary": "Create a swatch from a SwatchSpec ({space, value: [...], name?, model?, tint?}); returns its selfId."
933
+ },
934
+ {
935
+ "name": "paged.editSwatch",
936
+ "params": "(swatchId, spec)",
937
+ "returns": "bool",
938
+ "kind": "author",
939
+ "summary": "Replace a swatch's definition."
940
+ },
941
+ {
942
+ "name": "paged.deleteSwatch",
943
+ "params": "(swatchId)",
944
+ "returns": "bool",
945
+ "kind": "author",
946
+ "summary": "Delete a swatch."
947
+ },
948
+ {
949
+ "name": "paged.createGradient",
950
+ "params": "(spec)",
951
+ "returns": "string (created id) | null",
952
+ "kind": "author",
953
+ "summary": "Create a gradient from a GradientSpec ({kind: \"Linear\"|\"Radial\", stops: [...], name?}); returns its selfId."
954
+ },
955
+ {
956
+ "name": "paged.editGradient",
957
+ "params": "(gradientId, spec)",
958
+ "returns": "bool",
959
+ "kind": "author",
960
+ "summary": "Replace a gradient's definition."
961
+ },
962
+ {
963
+ "name": "paged.deleteGradient",
964
+ "params": "(gradientId)",
965
+ "returns": "bool",
966
+ "kind": "author",
967
+ "summary": "Delete a gradient."
968
+ },
969
+ {
970
+ "name": "paged.createColorGroup",
971
+ "params": "(spec)",
972
+ "returns": "string (created id) | null",
973
+ "kind": "author",
974
+ "summary": "Create a colour group from a ColorGroupSpec; returns its selfId."
975
+ },
976
+ {
977
+ "name": "paged.editColorGroup",
978
+ "params": "(groupId, spec)",
979
+ "returns": "bool",
980
+ "kind": "author",
981
+ "summary": "Replace a colour group's definition."
982
+ },
983
+ {
984
+ "name": "paged.deleteColorGroup",
985
+ "params": "(groupId)",
986
+ "returns": "bool",
987
+ "kind": "author",
988
+ "summary": "Delete a colour group."
989
+ },
759
990
  {
760
991
  "name": "console.log",
761
992
  "params": "(...)",
762
993
  "returns": "undefined",
763
994
  "kind": "console",
764
- "summary": "Append a line to the captured output log (also warn/error/info)."
995
+ "summary": "Append a line to the captured output log."
996
+ },
997
+ {
998
+ "name": "console.warn",
999
+ "params": "(...)",
1000
+ "returns": "undefined",
1001
+ "kind": "console",
1002
+ "summary": "Append a warn-level line to the captured output log."
1003
+ },
1004
+ {
1005
+ "name": "console.error",
1006
+ "params": "(...)",
1007
+ "returns": "undefined",
1008
+ "kind": "console",
1009
+ "summary": "Append an error-level line to the captured output log."
1010
+ },
1011
+ {
1012
+ "name": "console.info",
1013
+ "params": "(...)",
1014
+ "returns": "undefined",
1015
+ "kind": "console",
1016
+ "summary": "Append an info-level line to the captured output log."
765
1017
  }
766
1018
  ],
767
1019
  "idGrammar": [
@@ -924,6 +1176,7 @@
924
1176
  "frameDirectionalFeatherNoise",
925
1177
  "frameDirectionalFeatherChoke",
926
1178
  "frameBlendMode",
1179
+ "frameGradientFeather",
927
1180
  "cellFillColor",
928
1181
  "cellFillTint",
929
1182
  "cellInsetTop",
@@ -943,8 +1196,6 @@
943
1196
  "cellRightEdgeStrokeColor",
944
1197
  "cellRightEdgeStrokeWeight",
945
1198
  "cellRightEdgeStrokeTint",
946
- "tableRowCount",
947
- "tableColumnCount",
948
1199
  "pluginMetadata",
949
1200
  "anchoredPosition",
950
1201
  "anchorPoint",
@@ -957,7 +1208,51 @@
957
1208
  "anchoredSpineRelative",
958
1209
  "anchoredLockPosition",
959
1210
  "elementVisible",
960
- "elementLocked"
1211
+ "elementLocked",
1212
+ "characterFontFamily",
1213
+ "characterFontStyle",
1214
+ "characterKerningMethod",
1215
+ "characterCase",
1216
+ "characterPosition",
1217
+ "characterLanguage",
1218
+ "characterBaselineShift",
1219
+ "characterHorizontalScale",
1220
+ "characterVerticalScale",
1221
+ "characterSkew",
1222
+ "characterUnderline",
1223
+ "characterStrikethru",
1224
+ "characterLigatures",
1225
+ "characterOtfFeatures",
1226
+ "paragraphLeftIndent",
1227
+ "paragraphRightIndent",
1228
+ "paragraphDropCapCharacters",
1229
+ "paragraphDropCapLines",
1230
+ "paragraphHyphenation",
1231
+ "paragraphHyphenationZone",
1232
+ "paragraphKeepLinesTogether",
1233
+ "paragraphKeepWithNext",
1234
+ "paragraphKeepAllLinesTogether",
1235
+ "paragraphKeepFirstLines",
1236
+ "paragraphKeepLastLines",
1237
+ "paragraphStartParagraph",
1238
+ "paragraphSpanColumnType",
1239
+ "paragraphSpanSplitColumnCount",
1240
+ "paragraphSpanColumnMinSpaceBefore",
1241
+ "paragraphSpanColumnMinSpaceAfter",
1242
+ "paragraphSplitColumnInsideGutter",
1243
+ "paragraphSplitColumnOutsideGutter",
1244
+ "paragraphRuleAbove",
1245
+ "paragraphRuleBelow",
1246
+ "paragraphTabStops",
1247
+ "paragraphListType",
1248
+ "paragraphBulletCharacter",
1249
+ "paragraphNumberingFormat",
1250
+ "paragraphBulletsTextAfter",
1251
+ "paragraphNumberingExpression",
1252
+ "paragraphNumberingStartAt",
1253
+ "paragraphNumberingContinue",
1254
+ "paragraphBulletsCharacterStyle",
1255
+ "paragraphNumberingCharacterStyle"
961
1256
  ],
962
1257
  "constraints": [
963
1258
  "Scripts run in Boa (pure ECMAScript), NOT Node: no require/import, fetch, fs, setTimeout, or network. Use only paged.* and console.*.",
@@ -968,6 +1263,126 @@
968
1263
  "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).",
969
1264
  "Bounds are page-local points in [top, left, bottom, right] order. The document works in points (1/72 inch)."
970
1265
  ],
1266
+ "operations": [
1267
+ "insertText",
1268
+ "deleteRange",
1269
+ "applyStyle",
1270
+ "insertField",
1271
+ "insertAnchoredFrame",
1272
+ "insertHyperlink",
1273
+ "setFieldValue",
1274
+ "placeImage",
1275
+ "replaceImageBytes",
1276
+ "moveFrame",
1277
+ "resizeFrame",
1278
+ "linkFrames",
1279
+ "unlinkFrames",
1280
+ "insertPage",
1281
+ "deletePage",
1282
+ "resizePage",
1283
+ "insertFrame",
1284
+ "insertTextFrame",
1285
+ "deleteFrame",
1286
+ "insertLine",
1287
+ "insertPath",
1288
+ "setDocumentDefaults",
1289
+ "setColorSettings",
1290
+ "setProofSetup",
1291
+ "importSwatchLibrary",
1292
+ "setInkSetting",
1293
+ "setUseStandardLabForSpots",
1294
+ "pathPointInsert",
1295
+ "pathPointRemove",
1296
+ "pathOpenAt",
1297
+ "outlineStroke",
1298
+ "offsetPath",
1299
+ "simplifyPath",
1300
+ "closePath",
1301
+ "joinPaths",
1302
+ "pasteInto",
1303
+ "releaseFrom",
1304
+ "reorderElement",
1305
+ "applyOpacityMask",
1306
+ "releaseOpacityMask",
1307
+ "attachTextToPath",
1308
+ "detachTextFromPath",
1309
+ "createGroup",
1310
+ "dissolveGroup",
1311
+ "setGroupTransform",
1312
+ "setPluginMetadata",
1313
+ "pathPointCurveType",
1314
+ "pathPointSet",
1315
+ "batch",
1316
+ "bindCreated",
1317
+ "layerSetVisible",
1318
+ "layerSetLocked",
1319
+ "layerSetPrintable",
1320
+ "layerSetName",
1321
+ "layerMove",
1322
+ "layerInsert",
1323
+ "layerRemove",
1324
+ "setElementProperty",
1325
+ "pathfinderBoolean",
1326
+ "pathfinderDivide",
1327
+ "pathfinderTrim",
1328
+ "pathfinderMerge",
1329
+ "pathfinderCrop",
1330
+ "pathfinderOutline",
1331
+ "pathfinderMinusBack",
1332
+ "pathfinderFaces",
1333
+ "createSwatch",
1334
+ "editSwatch",
1335
+ "deleteSwatch",
1336
+ "createGradient",
1337
+ "editGradient",
1338
+ "deleteGradient",
1339
+ "createColorGroup",
1340
+ "editColorGroup",
1341
+ "deleteColorGroup",
1342
+ "createNumberingList",
1343
+ "editNumberingList",
1344
+ "deleteNumberingList",
1345
+ "createParagraphStyle",
1346
+ "renameParagraphStyle",
1347
+ "deleteParagraphStyle",
1348
+ "createCharacterStyle",
1349
+ "renameCharacterStyle",
1350
+ "deleteCharacterStyle",
1351
+ "createObjectStyle",
1352
+ "renameObjectStyle",
1353
+ "deleteObjectStyle",
1354
+ "createCellStyle",
1355
+ "renameCellStyle",
1356
+ "deleteCellStyle",
1357
+ "createTableStyle",
1358
+ "renameTableStyle",
1359
+ "deleteTableStyle",
1360
+ "setStyleProperty",
1361
+ "insertOval",
1362
+ "insertGuide",
1363
+ "moveGuide",
1364
+ "deleteGuide",
1365
+ "setConditionVisible",
1366
+ "setFlowGrowRule",
1367
+ "activateConditionSet",
1368
+ "applyMasterToPage",
1369
+ "duplicatePage",
1370
+ "insertSection",
1371
+ "editSection",
1372
+ "deleteSection",
1373
+ "setRowHeight",
1374
+ "setColumnWidth",
1375
+ "insertTableRow",
1376
+ "deleteTableRow",
1377
+ "insertTableColumn",
1378
+ "deleteTableColumn",
1379
+ "insertHeaderRow",
1380
+ "removeHeaderRow",
1381
+ "insertFooterRow",
1382
+ "removeFooterRow",
1383
+ "setCellSpan",
1384
+ "insertTable"
1385
+ ],
971
1386
  "elements": [
972
1387
  {
973
1388
  "name": "TextFrame",
@@ -1329,5 +1744,39 @@
1329
1744
  }
1330
1745
  ]
1331
1746
  }
1747
+ ],
1748
+ "pathAliases": [
1749
+ {
1750
+ "name": "frameTextWrapInvert",
1751
+ "wire": "textWrapInvert"
1752
+ },
1753
+ {
1754
+ "name": "frameInnerShadow",
1755
+ "wire": "frameInnerShadowEnabled"
1756
+ },
1757
+ {
1758
+ "name": "frameOuterGlow",
1759
+ "wire": "frameOuterGlowEnabled"
1760
+ },
1761
+ {
1762
+ "name": "frameInnerGlow",
1763
+ "wire": "frameInnerGlowEnabled"
1764
+ },
1765
+ {
1766
+ "name": "frameBevel",
1767
+ "wire": "frameBevelEnabled"
1768
+ },
1769
+ {
1770
+ "name": "frameSatin",
1771
+ "wire": "frameSatinEnabled"
1772
+ },
1773
+ {
1774
+ "name": "frameFeather",
1775
+ "wire": "frameFeatherEnabled"
1776
+ },
1777
+ {
1778
+ "name": "frameDirectionalFeather",
1779
+ "wire": "frameDirectionalFeatherEnabled"
1780
+ }
1332
1781
  ]
1333
1782
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paged-media/introspect-wasm",
3
- "version": "0.62.0",
3
+ "version": "0.64.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: "setFlowGrowRule"; args: { storyId: string; grow: boolean; maxPages?: number | null; copyFrameOptions?: boolean | null } } | { 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; 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 };
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: "SetFlowGrowRule"; story_id: string; rule: FlowGrowRule | null } | { 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" | "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";
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" | "paragraphHyphenationZone" | "paragraphKeepLinesTogether" | "paragraphKeepWithNext" | "paragraphKeepAllLinesTogether" | "paragraphKeepFirstLines" | "paragraphKeepLastLines" | "paragraphStartParagraph" | "paragraphSpanColumnType" | "paragraphSpanSplitColumnCount" | "paragraphSpanColumnMinSpaceBefore" | "paragraphSpanColumnMinSpaceAfter" | "paragraphSplitColumnInsideGutter" | "paragraphSplitColumnOutsideGutter" | "paragraphRuleAbove" | "paragraphRuleBelow" | "paragraphTabStops" | "paragraphListType" | "paragraphBulletCharacter" | "paragraphNumberingFormat" | "paragraphBulletsTextAfter" | "paragraphNumberingExpression" | "paragraphNumberingStartAt" | "paragraphNumberingContinue" | "paragraphBulletsCharacterStyle" | "paragraphNumberingCharacterStyle" | "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;
@@ -199,14 +199,14 @@ export function on_start() {
199
199
  function __wbg_get_imports() {
200
200
  const import0 = {
201
201
  __proto__: null,
202
- __wbg_Error_ef53bc310eb298a0: function(arg0, arg1) {
202
+ __wbg_Error_67e7344beaa85059: function(arg0, arg1) {
203
203
  const ret = Error(getStringFromWasm0(arg0, arg1));
204
204
  return ret;
205
205
  },
206
- __wbg___wbindgen_throw_1506f2235d1bdba0: function(arg0, arg1) {
206
+ __wbg___wbindgen_throw_5d9e815e6fdf150f: function(arg0, arg1) {
207
207
  throw new Error(getStringFromWasm0(arg0, arg1));
208
208
  },
209
- __wbg_error_a6fa202b58aa1cd3: function(arg0, arg1) {
209
+ __wbg_error_757e9472f8410341: function(arg0, arg1) {
210
210
  let deferred0_0;
211
211
  let deferred0_1;
212
212
  try {
@@ -217,7 +217,7 @@ function __wbg_get_imports() {
217
217
  wasm.__wbindgen_free(deferred0_0, deferred0_1, 1);
218
218
  }
219
219
  },
220
- __wbg_log_cf2e968649f3384e: function(arg0) {
220
+ __wbg_log_363d83b9114c8831: function(arg0) {
221
221
  console.log(arg0);
222
222
  },
223
223
  __wbg_new_227d7c05414eb861: function() {
@@ -231,7 +231,7 @@ function __wbg_get_imports() {
231
231
  getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
232
232
  getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
233
233
  },
234
- __wbindgen_cast_0000000000000001: function(arg0, arg1) {
234
+ __wbindgen_generic_0000000000000001: function(arg0, arg1) {
235
235
  // Cast intrinsic for `Ref(String) -> Externref`.
236
236
  const ret = getStringFromWasm0(arg0, arg1);
237
237
  return ret;
@@ -373,11 +373,15 @@ function __wbg_finalize_init(instance, module) {
373
373
 
374
374
  async function __wbg_load(module, imports) {
375
375
  if (typeof Response === 'function' && module instanceof Response) {
376
+ if (!module.ok) {
377
+ throw new Error(`failed to fetch Wasm: ${module.status} ${module.statusText} fetching '${module.url}'`);
378
+ }
379
+
376
380
  if (typeof WebAssembly.instantiateStreaming === 'function') {
377
381
  try {
378
382
  return await WebAssembly.instantiateStreaming(module, imports);
379
383
  } catch (e) {
380
- const validResponse = module.ok && expectedResponseType(module.type);
384
+ const validResponse = expectedResponseType(module.type);
381
385
 
382
386
  if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {
383
387
  console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
Binary file