orcasvn-react-diagrams 0.2.12 → 0.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +15 -11
  3. package/ai/api-contract.json +47 -0
  4. package/ai/invariants.json +6 -2
  5. package/ai/manifest.json +1 -1
  6. package/dist/cjs/examples.js +427 -48
  7. package/dist/cjs/index.js +226 -36
  8. package/dist/cjs/types/api/createDiagramEditor.d.ts +2 -1
  9. package/dist/cjs/types/api/types.d.ts +50 -0
  10. package/dist/cjs/types/displaybox/demos/deletionEventsDemo.d.ts +2 -0
  11. package/dist/cjs/types/displaybox/demos/focusElementDemo.d.ts +4 -0
  12. package/dist/cjs/types/engine/DiagramEngine.d.ts +9 -0
  13. package/dist/esm/examples.js +427 -48
  14. package/dist/esm/examples.js.map +1 -1
  15. package/dist/esm/index.js +226 -36
  16. package/dist/esm/index.js.map +1 -1
  17. package/dist/esm/types/api/createDiagramEditor.d.ts +2 -1
  18. package/dist/esm/types/api/types.d.ts +50 -0
  19. package/dist/esm/types/displaybox/demos/deletionEventsDemo.d.ts +2 -0
  20. package/dist/esm/types/displaybox/demos/focusElementDemo.d.ts +4 -0
  21. package/dist/esm/types/engine/DiagramEngine.d.ts +9 -0
  22. package/dist/examples.d.ts +51 -0
  23. package/dist/index.d.ts +52 -1
  24. package/docs/API_CONTRACT.md +48 -1
  25. package/docs/ARCHITECTURE.md +9 -7
  26. package/docs/CAPABILITIES.md +3 -0
  27. package/docs/COMMANDS_EVENTS.md +15 -6
  28. package/docs/DOCUMENTATION_WORKFLOW.md +3 -1
  29. package/docs/INTEGRATION_PLAYBOOK.md +4 -0
  30. package/docs/PORTING_CHECKLIST.md +4 -1
  31. package/package.json +1 -1
  32. package/src/displaybox/demos/DeletionEventsDemoTab.tsx +167 -9
  33. package/src/displaybox/demos/deletionEventsDemo.ts +2 -2
  34. package/src/displaybox/demos/focusElementDemo.ts +91 -0
  35. package/src/displaybox/demos/index.tsx +2 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  All notable changes to this project are documented in this file.
4
4
 
5
+ ## [0.2.13] - 2026-07-07
6
+
7
+ ### Added
8
+ - Host-callable `focusElement(elementId, options?)` editor helper for centering one target element and optionally applying an explicit zoom.
9
+ - Observational `elementDoubleClick` event for element-body double click / double tap without replacing ordinary click selection or text-edit precedence.
10
+ - Cancellable `elementDeleting`, `portDeleting`, `linkDeleting`, and `textDeleting` lifecycle events that fire before direct, selection-driven, or cascade removals commit.
11
+
12
+ ### Changed
13
+ - Delete requests now evaluate the full cascade plan before mutation commit, so a veto from any dependent `...Deleting` handler aborts that root delete request while unrelated selected roots can still continue deleting.
14
+ - `focusElement(...)` resolves nested and hidden elements by explicit id, preserves the current zoom by default, and uses the same viewport patch path as `setViewport(...)`.
15
+
16
+ ### Docs
17
+ - Updated release highlights, architecture/API/event docs, integration guidance, and machine-readable contract/invariant metadata for `v0.2.13`.
18
+
5
19
  ## [0.2.12] - 2026-06-26
6
20
 
7
21
  ### Added
package/README.md CHANGED
@@ -30,17 +30,21 @@ editor.addElement({
30
30
  });
31
31
  ```
32
32
 
33
- ## Release Highlights (v0.2.12)
34
-
35
- - Includes all completed `v0.2.1` through `v0.2.11` work, plus `v0.2.12` updates.
36
- - `v0.2.12` link labels via owned text:
37
- - create a link label with `addText({ ..., ownerId: linkId })`
38
- - link-owned text is stored midpoint-relative, so labels stay attached when the link reroutes or endpoints move
39
- - no separate `LinkData.label` or `LinkData.labels` field is required
40
- - `v0.2.12` link-created target port customization:
41
- - `createDiagramEditor({ onCreateLinkTargetPort })` lets hosts shape auto-created destination ports for link-to-element completion
42
- - the callback runs for both pointer drag and programmatic `completeLinkToElement(...)`, in `preview` and `commit` phases
43
- - `elementLinkConnecting` remains the cancellation surface; the callback customizes the target-port draft only
33
+ ## Release Highlights (v0.2.13)
34
+
35
+ - Includes all completed `v0.2.1` through `v0.2.12` work, plus `v0.2.13` updates.
36
+ - `v0.2.13` delete lifecycle guards:
37
+ - subscribe to `elementDeleting`, `portDeleting`, `linkDeleting`, or `textDeleting` to inspect a delete request before it commits
38
+ - each guard receives `trigger`, `root`, `cancel()`, and `cancelled` so hosts can veto direct, selection, or cascade removals
39
+ - a veto aborts the current root delete request without preventing unrelated selected roots from continuing
40
+ - `v0.2.13` viewport navigation helper:
41
+ - `focusElement(elementId, options?)` centers one target element by id
42
+ - current zoom is preserved by default, or hosts may pass `zoom`
43
+ - nested and hidden elements still resolve through the same world-position logic as the rest of the editor
44
+ - `v0.2.13` element double click event:
45
+ - subscribe to `elementDoubleClick` to observe double click / double tap on element bodies
46
+ - ordinary click selection still works as before
47
+ - text double click continues to prioritize built-in text editing
44
48
 
45
49
  ## API Docs
46
50
 
@@ -304,6 +304,13 @@
304
304
  "textDeleted"
305
305
  ]
306
306
  },
307
+ "focusElementOptions": {
308
+ "zoom": "number",
309
+ "behavior": [
310
+ "omitted zoom preserves the current viewport zoom",
311
+ "provided zoom is clamped to the same normalized fit-zoom bounds"
312
+ ]
313
+ },
307
314
  "viewportFitOptions": {
308
315
  "padding": "number",
309
316
  "minZoom": "number",
@@ -323,6 +330,40 @@
323
330
  "beforeGridTemplate": "number[]",
324
331
  "afterGridTemplate": "number[]"
325
332
  },
333
+ "elementDoubleClickEvent": {
334
+ "elementId": "string",
335
+ "pointer": "EnginePointerInfo",
336
+ "isMulti": "boolean"
337
+ },
338
+ "deletionLifecycle": {
339
+ "trigger": "'direct' | 'selection' | 'cascade'",
340
+ "root": {
341
+ "entity": "'element' | 'port' | 'link' | 'text'",
342
+ "id": "string"
343
+ },
344
+ "sharedFields": [
345
+ "trigger",
346
+ "root",
347
+ "cancel",
348
+ "cancelled"
349
+ ],
350
+ "elementDeleting": {
351
+ "elementId": "string"
352
+ },
353
+ "portDeleting": {
354
+ "portId": "string",
355
+ "elementId": "string"
356
+ },
357
+ "linkDeleting": {
358
+ "linkId": "string",
359
+ "sourcePortId": "string",
360
+ "targetPortId": "string"
361
+ },
362
+ "textDeleting": {
363
+ "textId": "string",
364
+ "ownerId": "string | null"
365
+ }
366
+ },
326
367
  "diagramImageExportOptions": {
327
368
  "mimeType": "string",
328
369
  "quality": "number",
@@ -374,6 +415,7 @@
374
415
  "completeLinkToElement",
375
416
  "cancelLink",
376
417
  "zoomToFitElements",
418
+ "focusElement",
377
419
  "exportImage",
378
420
  "resize",
379
421
  "setElementShapeHoverControls",
@@ -392,13 +434,18 @@
392
434
  "portMoved": "PortMovedEvent",
393
435
  "portSelected": "PortSelectedEvent",
394
436
  "elementClick": "ElementPointerEvent",
437
+ "elementDoubleClick": "ElementDoubleClickEvent",
395
438
  "elementDragged": "ElementDropEvent",
396
439
  "elementMoved": "ElementMovedEvent",
397
440
  "elementResized": "ElementResizedEvent",
398
441
  "gridLayoutChanged": "GridLayoutChangedEvent",
442
+ "elementDeleting": "ElementDeletingEvent",
399
443
  "elementDeleted": "ElementDeletedEvent",
444
+ "portDeleting": "PortDeletingEvent",
400
445
  "portDeleted": "PortDeletedEvent",
446
+ "linkDeleting": "LinkDeletingEvent",
401
447
  "linkDeleted": "LinkDeletedEvent",
448
+ "textDeleting": "TextDeletingEvent",
402
449
  "textDeleted": "TextDeletedEvent",
403
450
  "textUpdated": "TextUpdatedEvent",
404
451
  "elementSelected": "ElementSelectedEvent",
@@ -28,10 +28,12 @@
28
28
  "link": [
29
29
  "link visible-state requires both endpoint ports to remain visible",
30
30
  "manual routing preserves interior bend points on endpoint updates",
31
- "auto routing normalizes first/last points to source/target port world positions"
31
+ "auto routing normalizes first/last points to source/target port world positions",
32
+ "deleting a link removes any link-owned text"
32
33
  ],
33
34
  "text": [
34
35
  "owner-bound text stores owner-relative position",
36
+ "link-owned text stores position as an offset from the owning link midpoint",
35
37
  "owned text visible-state follows its resolved owner visibility",
36
38
  "orphan owner references are tolerated as standalone world text",
37
39
  "displayContent/displayOffset/displayClipSize may be derived from text layout rules"
@@ -41,7 +43,9 @@
41
43
  "mutations emit change with patches and full state snapshot",
42
44
  "setSelection/toggleSelection normalize away hidden element bodies, direct-owned hidden artifacts, and selectable=false element ids before emitting selection",
43
45
  "setSelection emits selection plus derived selected entity events",
44
- "setViewport emits viewport patch without immediate render"
46
+ "setViewport emits viewport patch without immediate render",
47
+ "delete mutators emit cancellable elementDeleting/portDeleting/linkDeleting/textDeleting before commit and matching deleted events after successful removal",
48
+ "deleteSelection can skip a vetoed selected root while continuing unrelated selected roots"
45
49
  ],
46
50
  "verificationTests": [
47
51
  "src/models/__tests__/DiagramModel.test.ts",
package/ai/manifest.json CHANGED
@@ -30,5 +30,5 @@
30
30
  "analysis/White paper/Overview.md",
31
31
  "analysis/White paper/Requirements-Functional.md"
32
32
  ],
33
- "updatedAt": "2026-06-26"
33
+ "updatedAt": "2026-07-07"
34
34
  }