@univerjs/docs-drawing-ui 1.0.0-alpha.1 → 1.0.0-insiders.20260701-0ef51b0

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/lib/cjs/index.js CHANGED
@@ -666,7 +666,10 @@ let DocDrawingUpdateRenderController = class DocDrawingUpdateRenderController ex
666
666
  });
667
667
  }));
668
668
  this.disposeWithMe(this._commandService.onCommandExecuted(async (command) => {
669
- if (command.id === _univerjs_docs.RichTextEditingMutation.id) queueMicrotask(() => {
669
+ if (command.id !== _univerjs_docs.RichTextEditingMutation.id) return;
670
+ const params = command.params;
671
+ if ((params === null || params === void 0 ? void 0 : params.unitId) && params.unitId !== this._context.unitId) return;
672
+ queueMicrotask(() => {
670
673
  this._updateDrawingsEditStatus();
671
674
  });
672
675
  }));
@@ -1462,6 +1465,30 @@ function calcDocFloatDomPosition(object, renderUnit) {
1462
1465
  right: left + width
1463
1466
  }, renderUnit.scene, opacity, angle);
1464
1467
  }
1468
+ function mergeDocFloatDomRuntimeProps(existingProps, param) {
1469
+ const customBlockRenderViewport = pickValidCustomBlockRenderViewport(param.customBlockRenderViewport);
1470
+ if (!customBlockRenderViewport) return existingProps;
1471
+ return {
1472
+ ...existingProps,
1473
+ customBlockRenderViewport
1474
+ };
1475
+ }
1476
+ function pickValidCustomBlockRenderViewport(viewport) {
1477
+ const result = {};
1478
+ if (isNonNegativeNumber(viewport === null || viewport === void 0 ? void 0 : viewport.bleedLeft)) result.bleedLeft = viewport.bleedLeft;
1479
+ if (isPositiveNumber(viewport === null || viewport === void 0 ? void 0 : viewport.bleedWidth)) result.bleedWidth = viewport.bleedWidth;
1480
+ if (isPositiveNumber(viewport === null || viewport === void 0 ? void 0 : viewport.contentHeight)) result.contentHeight = viewport.contentHeight;
1481
+ if (isPositiveNumber(viewport === null || viewport === void 0 ? void 0 : viewport.contentWidth)) result.contentWidth = viewport.contentWidth;
1482
+ if (isPositiveNumber(viewport === null || viewport === void 0 ? void 0 : viewport.height)) result.height = viewport.height;
1483
+ if (isPositiveNumber(viewport === null || viewport === void 0 ? void 0 : viewport.viewportHeight)) result.viewportHeight = viewport.viewportHeight;
1484
+ return Object.keys(result).length ? result : void 0;
1485
+ }
1486
+ function isPositiveNumber(value) {
1487
+ return typeof value === "number" && Number.isFinite(value) && value > 0;
1488
+ }
1489
+ function isNonNegativeNumber(value) {
1490
+ return typeof value === "number" && Number.isFinite(value) && value >= 0;
1491
+ }
1465
1492
  let DocFloatDomController = class DocFloatDomController extends _univerjs_core.Disposable {
1466
1493
  constructor(_renderManagerService, _drawingManagerService, _drawingRenderService, _canvasFloatDomService, _univerInstanceService, _commandService) {
1467
1494
  super();
@@ -1479,6 +1506,7 @@ let DocFloatDomController = class DocFloatDomController extends _univerjs_core.D
1479
1506
  }
1480
1507
  _initialize() {
1481
1508
  this._drawingAddRemoveListener();
1509
+ this._drawingRuntimePropsListener();
1482
1510
  this._initScrollAndZoomEvent();
1483
1511
  }
1484
1512
  _getSceneAndTransformerByDrawingSearch(unitId) {
@@ -1514,6 +1542,12 @@ let DocFloatDomController = class DocFloatDomController extends _univerjs_core.D
1514
1542
  const rects = await this._drawingRenderService.renderFloatDom(rectParam, renderObject.scene);
1515
1543
  if (rects == null || rects.length === 0) return;
1516
1544
  for (const rect of rects) {
1545
+ var _renderObject$scene$g;
1546
+ const runtimeParam = rectParam;
1547
+ const runtimeViewport = pickValidCustomBlockRenderViewport(runtimeParam.customBlockRenderViewport);
1548
+ const preserveRuntimeGeometry = isEmbedFloatDomRuntimeParam(runtimeParam);
1549
+ syncRectWithRuntimeParam(rect, runtimeParam, runtimeViewport, void 0, preserveRuntimeGeometry);
1550
+ const runtimeTransform = runtimeViewport || preserveRuntimeGeometry ? createTransformFromRect(rect) : void 0;
1517
1551
  this._addHoverForRect(rect);
1518
1552
  const disposableCollection = new _univerjs_core.DisposableCollection();
1519
1553
  const position$ = new rxjs.BehaviorSubject(calcDocFloatDomPosition(rect, renderObject.renderUnit));
@@ -1521,7 +1555,10 @@ let DocFloatDomController = class DocFloatDomController extends _univerjs_core.D
1521
1555
  const data = rectParam.data;
1522
1556
  const info = {
1523
1557
  dispose: disposableCollection,
1558
+ preserveRuntimeGeometry,
1524
1559
  rect,
1560
+ runtimeTransform,
1561
+ runtimeViewport,
1525
1562
  position$,
1526
1563
  unitId
1527
1564
  };
@@ -1529,6 +1566,8 @@ let DocFloatDomController = class DocFloatDomController extends _univerjs_core.D
1529
1566
  position$,
1530
1567
  id: rectParam.drawingId,
1531
1568
  componentKey: rectParam.componentKey,
1569
+ eventPassThrough: preserveRuntimeGeometry ? false : void 0,
1570
+ preserveOnFocusChange: preserveRuntimeGeometry,
1532
1571
  onPointerDown: (evt) => {
1533
1572
  canvas.dispatchEvent(new PointerEvent(evt.type, evt));
1534
1573
  },
@@ -1542,20 +1581,42 @@ let DocFloatDomController = class DocFloatDomController extends _univerjs_core.D
1542
1581
  canvas.dispatchEvent(new WheelEvent(evt.type, evt));
1543
1582
  },
1544
1583
  data,
1584
+ props: mergeDocFloatDomRuntimeProps(void 0, rectParam),
1545
1585
  unitId
1546
1586
  });
1547
1587
  const listener = rect.onTransformChange$.subscribeEvent(() => {
1548
1588
  const newPosition = calcDocFloatDomPosition(rect, renderObject.renderUnit);
1549
1589
  position$.next(newPosition);
1550
1590
  });
1591
+ const scrollListener = subscribeViewportScrollAfter((_renderObject$scene$g = renderObject.scene.getViewport(_univerjs_docs_ui.VIEWPORT_KEY.VIEW_MAIN)) === null || _renderObject$scene$g === void 0 ? void 0 : _renderObject$scene$g.onScrollAfter$, () => position$.next(calcDocFloatDomPosition(rect, renderObject.renderUnit)));
1551
1592
  disposableCollection.add(() => {
1552
1593
  this._canvasFloatDomService.removeFloatDom(rectParam.drawingId);
1553
1594
  });
1554
1595
  listener && disposableCollection.add(listener);
1596
+ scrollListener && disposableCollection.add(scrollListener);
1555
1597
  this._domLayerInfoMap.set(rectParam.drawingId, info);
1556
1598
  }
1557
1599
  });
1558
1600
  }
1601
+ _drawingRuntimePropsListener() {
1602
+ this.disposeWithMe(this._drawingManagerService.refreshTransform$.subscribe((params) => {
1603
+ params.forEach((param) => {
1604
+ var _this$_canvasFloatDom;
1605
+ const floatDomInfo = this._domLayerInfoMap.get(param.drawingId);
1606
+ if (!floatDomInfo) return;
1607
+ const runtimeParam = param;
1608
+ const runtimeViewport = pickValidCustomBlockRenderViewport(runtimeParam.customBlockRenderViewport);
1609
+ if (runtimeViewport) floatDomInfo.runtimeViewport = runtimeViewport;
1610
+ if (syncRectWithRuntimeParam(floatDomInfo.rect, runtimeParam, floatDomInfo.runtimeViewport, floatDomInfo.runtimeTransform, floatDomInfo.preserveRuntimeGeometry)) {
1611
+ if (runtimeViewport || floatDomInfo.preserveRuntimeGeometry) floatDomInfo.runtimeTransform = createTransformFromRect(floatDomInfo.rect);
1612
+ const renderObject = this._getSceneAndTransformerByDrawingSearch(floatDomInfo.unitId);
1613
+ if (renderObject) floatDomInfo.position$.next(calcDocFloatDomPosition(floatDomInfo.rect, renderObject.renderUnit));
1614
+ }
1615
+ const currentProps = (_this$_canvasFloatDom = this._canvasFloatDomService.domLayers.find(([id]) => id === param.drawingId)) === null || _this$_canvasFloatDom === void 0 ? void 0 : _this$_canvasFloatDom[1].props;
1616
+ this._canvasFloatDomService.updateFloatDom(param.drawingId, { props: mergeDocFloatDomRuntimeProps(currentProps, param) });
1617
+ });
1618
+ }));
1619
+ }
1559
1620
  _addHoverForRect(o) {
1560
1621
  this.disposeWithMe((0, _univerjs_core.toDisposable)(o.onPointerEnter$.subscribeEvent(() => {
1561
1622
  o.cursor = _univerjs_engine_render.CURSOR_TYPE.GRAB;
@@ -1656,6 +1717,71 @@ DocFloatDomController = __decorate([
1656
1717
  __decorateParam(4, _univerjs_core.IUniverInstanceService),
1657
1718
  __decorateParam(5, _univerjs_core.ICommandService)
1658
1719
  ], DocFloatDomController);
1720
+ function syncRectWithRuntimeParam(rect, param, fallbackViewport, fallbackTransform, preserveRuntimeGeometry) {
1721
+ const transform = getRuntimeTransform(param, rect, fallbackViewport, fallbackTransform, preserveRuntimeGeometry);
1722
+ if (!transform) return false;
1723
+ rect.transformByState(transform);
1724
+ return true;
1725
+ }
1726
+ function getRuntimeTransform(param, rect, fallbackViewport, fallbackTransform, preserveRuntimeGeometry) {
1727
+ var _param$transform, _param$transforms, _param$customBlockRen, _runtimeViewport$heig2;
1728
+ const transform = (_param$transform = param.transform) !== null && _param$transform !== void 0 ? _param$transform : (_param$transforms = param.transforms) === null || _param$transforms === void 0 ? void 0 : _param$transforms[0];
1729
+ const runtimeViewport = (_param$customBlockRen = param.customBlockRenderViewport) !== null && _param$customBlockRen !== void 0 ? _param$customBlockRen : fallbackViewport;
1730
+ if (!param.customBlockRenderViewport && preserveRuntimeGeometry && fallbackTransform && transform) {
1731
+ var _fallbackTransform$wi, _fallbackTransform$he;
1732
+ return {
1733
+ ...transform,
1734
+ width: (_fallbackTransform$wi = fallbackTransform.width) !== null && _fallbackTransform$wi !== void 0 ? _fallbackTransform$wi : transform.width,
1735
+ height: (_fallbackTransform$he = fallbackTransform.height) !== null && _fallbackTransform$he !== void 0 ? _fallbackTransform$he : transform.height
1736
+ };
1737
+ }
1738
+ if (!transform) {
1739
+ var _runtimeViewport$heig;
1740
+ const height = (_runtimeViewport$heig = runtimeViewport === null || runtimeViewport === void 0 ? void 0 : runtimeViewport.height) !== null && _runtimeViewport$heig !== void 0 ? _runtimeViewport$heig : runtimeViewport === null || runtimeViewport === void 0 ? void 0 : runtimeViewport.contentHeight;
1741
+ if (!isPositiveNumber(height)) return;
1742
+ return {
1743
+ left: rect.left,
1744
+ top: rect.top,
1745
+ width: rect.width,
1746
+ height,
1747
+ angle: rect.angle
1748
+ };
1749
+ }
1750
+ const height = (_runtimeViewport$heig2 = runtimeViewport === null || runtimeViewport === void 0 ? void 0 : runtimeViewport.height) !== null && _runtimeViewport$heig2 !== void 0 ? _runtimeViewport$heig2 : runtimeViewport === null || runtimeViewport === void 0 ? void 0 : runtimeViewport.contentHeight;
1751
+ if (!isPositiveNumber(height)) return transform;
1752
+ return {
1753
+ ...transform,
1754
+ height
1755
+ };
1756
+ }
1757
+ function isEmbedFloatDomRuntimeParam(param) {
1758
+ const data = param.data;
1759
+ if (!data || typeof data !== "object") return false;
1760
+ const candidate = data;
1761
+ return candidate.version === 1 && typeof candidate.embedId === "string" && typeof candidate.hostAnchorId === "string";
1762
+ }
1763
+ function createTransformFromRect(rect) {
1764
+ return {
1765
+ angle: rect.angle,
1766
+ height: rect.height,
1767
+ left: rect.left,
1768
+ top: rect.top,
1769
+ width: rect.width
1770
+ };
1771
+ }
1772
+ function subscribeViewportScrollAfter(scrollEvent, callback) {
1773
+ if (!scrollEvent || typeof scrollEvent !== "object") return;
1774
+ const eventSubject = scrollEvent;
1775
+ if (typeof eventSubject.subscribeEvent === "function") return eventSubject.subscribeEvent(callback);
1776
+ const observable = scrollEvent;
1777
+ if (typeof observable.subscribe === "function") {
1778
+ const subscription = observable.subscribe(callback);
1779
+ return (0, _univerjs_core.toDisposable)(() => {
1780
+ var _subscription$unsubsc;
1781
+ return (_subscription$unsubsc = subscription.unsubscribe) === null || _subscription$unsubsc === void 0 ? void 0 : _subscription$unsubsc.call(subscription);
1782
+ });
1783
+ }
1784
+ }
1659
1785
 
1660
1786
  //#endregion
1661
1787
  //#region src/menu/image.menu.ts
@@ -1785,7 +1911,7 @@ function InsertEllipseShapeBelowMenuFactory(accessor) {
1785
1911
  //#endregion
1786
1912
  //#region package.json
1787
1913
  var name = "@univerjs/docs-drawing-ui";
1788
- var version = "1.0.0-alpha.1";
1914
+ var version = "1.0.0-insiders.20260701-0ef51b0";
1789
1915
 
1790
1916
  //#endregion
1791
1917
  //#region src/config/config.ts
@@ -2925,6 +3051,7 @@ let DocDrawingTransformUpdateController = class DocDrawingTransformUpdateControl
2925
3051
  behindText,
2926
3052
  transform,
2927
3053
  transforms: [transform],
3054
+ customBlockRenderViewport: drawing.customBlockRenderViewport,
2928
3055
  isMultiTransform
2929
3056
  };
2930
3057
  else if (isMultiTransform === _univerjs_core.BooleanNumber.TRUE) updateDrawingMap[drawingId].transforms.push(transform);
package/lib/es/index.js CHANGED
@@ -665,7 +665,10 @@ let DocDrawingUpdateRenderController = class DocDrawingUpdateRenderController ex
665
665
  });
666
666
  }));
667
667
  this.disposeWithMe(this._commandService.onCommandExecuted(async (command) => {
668
- if (command.id === RichTextEditingMutation.id) queueMicrotask(() => {
668
+ if (command.id !== RichTextEditingMutation.id) return;
669
+ const params = command.params;
670
+ if ((params === null || params === void 0 ? void 0 : params.unitId) && params.unitId !== this._context.unitId) return;
671
+ queueMicrotask(() => {
669
672
  this._updateDrawingsEditStatus();
670
673
  });
671
674
  }));
@@ -1461,6 +1464,30 @@ function calcDocFloatDomPosition(object, renderUnit) {
1461
1464
  right: left + width
1462
1465
  }, renderUnit.scene, opacity, angle);
1463
1466
  }
1467
+ function mergeDocFloatDomRuntimeProps(existingProps, param) {
1468
+ const customBlockRenderViewport = pickValidCustomBlockRenderViewport(param.customBlockRenderViewport);
1469
+ if (!customBlockRenderViewport) return existingProps;
1470
+ return {
1471
+ ...existingProps,
1472
+ customBlockRenderViewport
1473
+ };
1474
+ }
1475
+ function pickValidCustomBlockRenderViewport(viewport) {
1476
+ const result = {};
1477
+ if (isNonNegativeNumber(viewport === null || viewport === void 0 ? void 0 : viewport.bleedLeft)) result.bleedLeft = viewport.bleedLeft;
1478
+ if (isPositiveNumber(viewport === null || viewport === void 0 ? void 0 : viewport.bleedWidth)) result.bleedWidth = viewport.bleedWidth;
1479
+ if (isPositiveNumber(viewport === null || viewport === void 0 ? void 0 : viewport.contentHeight)) result.contentHeight = viewport.contentHeight;
1480
+ if (isPositiveNumber(viewport === null || viewport === void 0 ? void 0 : viewport.contentWidth)) result.contentWidth = viewport.contentWidth;
1481
+ if (isPositiveNumber(viewport === null || viewport === void 0 ? void 0 : viewport.height)) result.height = viewport.height;
1482
+ if (isPositiveNumber(viewport === null || viewport === void 0 ? void 0 : viewport.viewportHeight)) result.viewportHeight = viewport.viewportHeight;
1483
+ return Object.keys(result).length ? result : void 0;
1484
+ }
1485
+ function isPositiveNumber(value) {
1486
+ return typeof value === "number" && Number.isFinite(value) && value > 0;
1487
+ }
1488
+ function isNonNegativeNumber(value) {
1489
+ return typeof value === "number" && Number.isFinite(value) && value >= 0;
1490
+ }
1464
1491
  let DocFloatDomController = class DocFloatDomController extends Disposable {
1465
1492
  constructor(_renderManagerService, _drawingManagerService, _drawingRenderService, _canvasFloatDomService, _univerInstanceService, _commandService) {
1466
1493
  super();
@@ -1478,6 +1505,7 @@ let DocFloatDomController = class DocFloatDomController extends Disposable {
1478
1505
  }
1479
1506
  _initialize() {
1480
1507
  this._drawingAddRemoveListener();
1508
+ this._drawingRuntimePropsListener();
1481
1509
  this._initScrollAndZoomEvent();
1482
1510
  }
1483
1511
  _getSceneAndTransformerByDrawingSearch(unitId) {
@@ -1513,6 +1541,12 @@ let DocFloatDomController = class DocFloatDomController extends Disposable {
1513
1541
  const rects = await this._drawingRenderService.renderFloatDom(rectParam, renderObject.scene);
1514
1542
  if (rects == null || rects.length === 0) return;
1515
1543
  for (const rect of rects) {
1544
+ var _renderObject$scene$g;
1545
+ const runtimeParam = rectParam;
1546
+ const runtimeViewport = pickValidCustomBlockRenderViewport(runtimeParam.customBlockRenderViewport);
1547
+ const preserveRuntimeGeometry = isEmbedFloatDomRuntimeParam(runtimeParam);
1548
+ syncRectWithRuntimeParam(rect, runtimeParam, runtimeViewport, void 0, preserveRuntimeGeometry);
1549
+ const runtimeTransform = runtimeViewport || preserveRuntimeGeometry ? createTransformFromRect(rect) : void 0;
1516
1550
  this._addHoverForRect(rect);
1517
1551
  const disposableCollection = new DisposableCollection();
1518
1552
  const position$ = new BehaviorSubject(calcDocFloatDomPosition(rect, renderObject.renderUnit));
@@ -1520,7 +1554,10 @@ let DocFloatDomController = class DocFloatDomController extends Disposable {
1520
1554
  const data = rectParam.data;
1521
1555
  const info = {
1522
1556
  dispose: disposableCollection,
1557
+ preserveRuntimeGeometry,
1523
1558
  rect,
1559
+ runtimeTransform,
1560
+ runtimeViewport,
1524
1561
  position$,
1525
1562
  unitId
1526
1563
  };
@@ -1528,6 +1565,8 @@ let DocFloatDomController = class DocFloatDomController extends Disposable {
1528
1565
  position$,
1529
1566
  id: rectParam.drawingId,
1530
1567
  componentKey: rectParam.componentKey,
1568
+ eventPassThrough: preserveRuntimeGeometry ? false : void 0,
1569
+ preserveOnFocusChange: preserveRuntimeGeometry,
1531
1570
  onPointerDown: (evt) => {
1532
1571
  canvas.dispatchEvent(new PointerEvent(evt.type, evt));
1533
1572
  },
@@ -1541,20 +1580,42 @@ let DocFloatDomController = class DocFloatDomController extends Disposable {
1541
1580
  canvas.dispatchEvent(new WheelEvent(evt.type, evt));
1542
1581
  },
1543
1582
  data,
1583
+ props: mergeDocFloatDomRuntimeProps(void 0, rectParam),
1544
1584
  unitId
1545
1585
  });
1546
1586
  const listener = rect.onTransformChange$.subscribeEvent(() => {
1547
1587
  const newPosition = calcDocFloatDomPosition(rect, renderObject.renderUnit);
1548
1588
  position$.next(newPosition);
1549
1589
  });
1590
+ const scrollListener = subscribeViewportScrollAfter((_renderObject$scene$g = renderObject.scene.getViewport(VIEWPORT_KEY.VIEW_MAIN)) === null || _renderObject$scene$g === void 0 ? void 0 : _renderObject$scene$g.onScrollAfter$, () => position$.next(calcDocFloatDomPosition(rect, renderObject.renderUnit)));
1550
1591
  disposableCollection.add(() => {
1551
1592
  this._canvasFloatDomService.removeFloatDom(rectParam.drawingId);
1552
1593
  });
1553
1594
  listener && disposableCollection.add(listener);
1595
+ scrollListener && disposableCollection.add(scrollListener);
1554
1596
  this._domLayerInfoMap.set(rectParam.drawingId, info);
1555
1597
  }
1556
1598
  });
1557
1599
  }
1600
+ _drawingRuntimePropsListener() {
1601
+ this.disposeWithMe(this._drawingManagerService.refreshTransform$.subscribe((params) => {
1602
+ params.forEach((param) => {
1603
+ var _this$_canvasFloatDom;
1604
+ const floatDomInfo = this._domLayerInfoMap.get(param.drawingId);
1605
+ if (!floatDomInfo) return;
1606
+ const runtimeParam = param;
1607
+ const runtimeViewport = pickValidCustomBlockRenderViewport(runtimeParam.customBlockRenderViewport);
1608
+ if (runtimeViewport) floatDomInfo.runtimeViewport = runtimeViewport;
1609
+ if (syncRectWithRuntimeParam(floatDomInfo.rect, runtimeParam, floatDomInfo.runtimeViewport, floatDomInfo.runtimeTransform, floatDomInfo.preserveRuntimeGeometry)) {
1610
+ if (runtimeViewport || floatDomInfo.preserveRuntimeGeometry) floatDomInfo.runtimeTransform = createTransformFromRect(floatDomInfo.rect);
1611
+ const renderObject = this._getSceneAndTransformerByDrawingSearch(floatDomInfo.unitId);
1612
+ if (renderObject) floatDomInfo.position$.next(calcDocFloatDomPosition(floatDomInfo.rect, renderObject.renderUnit));
1613
+ }
1614
+ const currentProps = (_this$_canvasFloatDom = this._canvasFloatDomService.domLayers.find(([id]) => id === param.drawingId)) === null || _this$_canvasFloatDom === void 0 ? void 0 : _this$_canvasFloatDom[1].props;
1615
+ this._canvasFloatDomService.updateFloatDom(param.drawingId, { props: mergeDocFloatDomRuntimeProps(currentProps, param) });
1616
+ });
1617
+ }));
1618
+ }
1558
1619
  _addHoverForRect(o) {
1559
1620
  this.disposeWithMe(toDisposable(o.onPointerEnter$.subscribeEvent(() => {
1560
1621
  o.cursor = CURSOR_TYPE.GRAB;
@@ -1655,6 +1716,71 @@ DocFloatDomController = __decorate([
1655
1716
  __decorateParam(4, IUniverInstanceService),
1656
1717
  __decorateParam(5, ICommandService)
1657
1718
  ], DocFloatDomController);
1719
+ function syncRectWithRuntimeParam(rect, param, fallbackViewport, fallbackTransform, preserveRuntimeGeometry) {
1720
+ const transform = getRuntimeTransform(param, rect, fallbackViewport, fallbackTransform, preserveRuntimeGeometry);
1721
+ if (!transform) return false;
1722
+ rect.transformByState(transform);
1723
+ return true;
1724
+ }
1725
+ function getRuntimeTransform(param, rect, fallbackViewport, fallbackTransform, preserveRuntimeGeometry) {
1726
+ var _param$transform, _param$transforms, _param$customBlockRen, _runtimeViewport$heig2;
1727
+ const transform = (_param$transform = param.transform) !== null && _param$transform !== void 0 ? _param$transform : (_param$transforms = param.transforms) === null || _param$transforms === void 0 ? void 0 : _param$transforms[0];
1728
+ const runtimeViewport = (_param$customBlockRen = param.customBlockRenderViewport) !== null && _param$customBlockRen !== void 0 ? _param$customBlockRen : fallbackViewport;
1729
+ if (!param.customBlockRenderViewport && preserveRuntimeGeometry && fallbackTransform && transform) {
1730
+ var _fallbackTransform$wi, _fallbackTransform$he;
1731
+ return {
1732
+ ...transform,
1733
+ width: (_fallbackTransform$wi = fallbackTransform.width) !== null && _fallbackTransform$wi !== void 0 ? _fallbackTransform$wi : transform.width,
1734
+ height: (_fallbackTransform$he = fallbackTransform.height) !== null && _fallbackTransform$he !== void 0 ? _fallbackTransform$he : transform.height
1735
+ };
1736
+ }
1737
+ if (!transform) {
1738
+ var _runtimeViewport$heig;
1739
+ const height = (_runtimeViewport$heig = runtimeViewport === null || runtimeViewport === void 0 ? void 0 : runtimeViewport.height) !== null && _runtimeViewport$heig !== void 0 ? _runtimeViewport$heig : runtimeViewport === null || runtimeViewport === void 0 ? void 0 : runtimeViewport.contentHeight;
1740
+ if (!isPositiveNumber(height)) return;
1741
+ return {
1742
+ left: rect.left,
1743
+ top: rect.top,
1744
+ width: rect.width,
1745
+ height,
1746
+ angle: rect.angle
1747
+ };
1748
+ }
1749
+ const height = (_runtimeViewport$heig2 = runtimeViewport === null || runtimeViewport === void 0 ? void 0 : runtimeViewport.height) !== null && _runtimeViewport$heig2 !== void 0 ? _runtimeViewport$heig2 : runtimeViewport === null || runtimeViewport === void 0 ? void 0 : runtimeViewport.contentHeight;
1750
+ if (!isPositiveNumber(height)) return transform;
1751
+ return {
1752
+ ...transform,
1753
+ height
1754
+ };
1755
+ }
1756
+ function isEmbedFloatDomRuntimeParam(param) {
1757
+ const data = param.data;
1758
+ if (!data || typeof data !== "object") return false;
1759
+ const candidate = data;
1760
+ return candidate.version === 1 && typeof candidate.embedId === "string" && typeof candidate.hostAnchorId === "string";
1761
+ }
1762
+ function createTransformFromRect(rect) {
1763
+ return {
1764
+ angle: rect.angle,
1765
+ height: rect.height,
1766
+ left: rect.left,
1767
+ top: rect.top,
1768
+ width: rect.width
1769
+ };
1770
+ }
1771
+ function subscribeViewportScrollAfter(scrollEvent, callback) {
1772
+ if (!scrollEvent || typeof scrollEvent !== "object") return;
1773
+ const eventSubject = scrollEvent;
1774
+ if (typeof eventSubject.subscribeEvent === "function") return eventSubject.subscribeEvent(callback);
1775
+ const observable = scrollEvent;
1776
+ if (typeof observable.subscribe === "function") {
1777
+ const subscription = observable.subscribe(callback);
1778
+ return toDisposable(() => {
1779
+ var _subscription$unsubsc;
1780
+ return (_subscription$unsubsc = subscription.unsubscribe) === null || _subscription$unsubsc === void 0 ? void 0 : _subscription$unsubsc.call(subscription);
1781
+ });
1782
+ }
1783
+ }
1658
1784
 
1659
1785
  //#endregion
1660
1786
  //#region src/menu/image.menu.ts
@@ -1784,7 +1910,7 @@ function InsertEllipseShapeBelowMenuFactory(accessor) {
1784
1910
  //#endregion
1785
1911
  //#region package.json
1786
1912
  var name = "@univerjs/docs-drawing-ui";
1787
- var version = "1.0.0-alpha.1";
1913
+ var version = "1.0.0-insiders.20260701-0ef51b0";
1788
1914
 
1789
1915
  //#endregion
1790
1916
  //#region src/config/config.ts
@@ -2924,6 +3050,7 @@ let DocDrawingTransformUpdateController = class DocDrawingTransformUpdateControl
2924
3050
  behindText,
2925
3051
  transform,
2926
3052
  transforms: [transform],
3053
+ customBlockRenderViewport: drawing.customBlockRenderViewport,
2927
3054
  isMultiTransform
2928
3055
  };
2929
3056
  else if (isMultiTransform === BooleanNumber.TRUE) updateDrawingMap[drawingId].transforms.push(transform);
package/lib/index.js CHANGED
@@ -665,7 +665,10 @@ let DocDrawingUpdateRenderController = class DocDrawingUpdateRenderController ex
665
665
  });
666
666
  }));
667
667
  this.disposeWithMe(this._commandService.onCommandExecuted(async (command) => {
668
- if (command.id === RichTextEditingMutation.id) queueMicrotask(() => {
668
+ if (command.id !== RichTextEditingMutation.id) return;
669
+ const params = command.params;
670
+ if ((params === null || params === void 0 ? void 0 : params.unitId) && params.unitId !== this._context.unitId) return;
671
+ queueMicrotask(() => {
669
672
  this._updateDrawingsEditStatus();
670
673
  });
671
674
  }));
@@ -1461,6 +1464,30 @@ function calcDocFloatDomPosition(object, renderUnit) {
1461
1464
  right: left + width
1462
1465
  }, renderUnit.scene, opacity, angle);
1463
1466
  }
1467
+ function mergeDocFloatDomRuntimeProps(existingProps, param) {
1468
+ const customBlockRenderViewport = pickValidCustomBlockRenderViewport(param.customBlockRenderViewport);
1469
+ if (!customBlockRenderViewport) return existingProps;
1470
+ return {
1471
+ ...existingProps,
1472
+ customBlockRenderViewport
1473
+ };
1474
+ }
1475
+ function pickValidCustomBlockRenderViewport(viewport) {
1476
+ const result = {};
1477
+ if (isNonNegativeNumber(viewport === null || viewport === void 0 ? void 0 : viewport.bleedLeft)) result.bleedLeft = viewport.bleedLeft;
1478
+ if (isPositiveNumber(viewport === null || viewport === void 0 ? void 0 : viewport.bleedWidth)) result.bleedWidth = viewport.bleedWidth;
1479
+ if (isPositiveNumber(viewport === null || viewport === void 0 ? void 0 : viewport.contentHeight)) result.contentHeight = viewport.contentHeight;
1480
+ if (isPositiveNumber(viewport === null || viewport === void 0 ? void 0 : viewport.contentWidth)) result.contentWidth = viewport.contentWidth;
1481
+ if (isPositiveNumber(viewport === null || viewport === void 0 ? void 0 : viewport.height)) result.height = viewport.height;
1482
+ if (isPositiveNumber(viewport === null || viewport === void 0 ? void 0 : viewport.viewportHeight)) result.viewportHeight = viewport.viewportHeight;
1483
+ return Object.keys(result).length ? result : void 0;
1484
+ }
1485
+ function isPositiveNumber(value) {
1486
+ return typeof value === "number" && Number.isFinite(value) && value > 0;
1487
+ }
1488
+ function isNonNegativeNumber(value) {
1489
+ return typeof value === "number" && Number.isFinite(value) && value >= 0;
1490
+ }
1464
1491
  let DocFloatDomController = class DocFloatDomController extends Disposable {
1465
1492
  constructor(_renderManagerService, _drawingManagerService, _drawingRenderService, _canvasFloatDomService, _univerInstanceService, _commandService) {
1466
1493
  super();
@@ -1478,6 +1505,7 @@ let DocFloatDomController = class DocFloatDomController extends Disposable {
1478
1505
  }
1479
1506
  _initialize() {
1480
1507
  this._drawingAddRemoveListener();
1508
+ this._drawingRuntimePropsListener();
1481
1509
  this._initScrollAndZoomEvent();
1482
1510
  }
1483
1511
  _getSceneAndTransformerByDrawingSearch(unitId) {
@@ -1513,6 +1541,12 @@ let DocFloatDomController = class DocFloatDomController extends Disposable {
1513
1541
  const rects = await this._drawingRenderService.renderFloatDom(rectParam, renderObject.scene);
1514
1542
  if (rects == null || rects.length === 0) return;
1515
1543
  for (const rect of rects) {
1544
+ var _renderObject$scene$g;
1545
+ const runtimeParam = rectParam;
1546
+ const runtimeViewport = pickValidCustomBlockRenderViewport(runtimeParam.customBlockRenderViewport);
1547
+ const preserveRuntimeGeometry = isEmbedFloatDomRuntimeParam(runtimeParam);
1548
+ syncRectWithRuntimeParam(rect, runtimeParam, runtimeViewport, void 0, preserveRuntimeGeometry);
1549
+ const runtimeTransform = runtimeViewport || preserveRuntimeGeometry ? createTransformFromRect(rect) : void 0;
1516
1550
  this._addHoverForRect(rect);
1517
1551
  const disposableCollection = new DisposableCollection();
1518
1552
  const position$ = new BehaviorSubject(calcDocFloatDomPosition(rect, renderObject.renderUnit));
@@ -1520,7 +1554,10 @@ let DocFloatDomController = class DocFloatDomController extends Disposable {
1520
1554
  const data = rectParam.data;
1521
1555
  const info = {
1522
1556
  dispose: disposableCollection,
1557
+ preserveRuntimeGeometry,
1523
1558
  rect,
1559
+ runtimeTransform,
1560
+ runtimeViewport,
1524
1561
  position$,
1525
1562
  unitId
1526
1563
  };
@@ -1528,6 +1565,8 @@ let DocFloatDomController = class DocFloatDomController extends Disposable {
1528
1565
  position$,
1529
1566
  id: rectParam.drawingId,
1530
1567
  componentKey: rectParam.componentKey,
1568
+ eventPassThrough: preserveRuntimeGeometry ? false : void 0,
1569
+ preserveOnFocusChange: preserveRuntimeGeometry,
1531
1570
  onPointerDown: (evt) => {
1532
1571
  canvas.dispatchEvent(new PointerEvent(evt.type, evt));
1533
1572
  },
@@ -1541,20 +1580,42 @@ let DocFloatDomController = class DocFloatDomController extends Disposable {
1541
1580
  canvas.dispatchEvent(new WheelEvent(evt.type, evt));
1542
1581
  },
1543
1582
  data,
1583
+ props: mergeDocFloatDomRuntimeProps(void 0, rectParam),
1544
1584
  unitId
1545
1585
  });
1546
1586
  const listener = rect.onTransformChange$.subscribeEvent(() => {
1547
1587
  const newPosition = calcDocFloatDomPosition(rect, renderObject.renderUnit);
1548
1588
  position$.next(newPosition);
1549
1589
  });
1590
+ const scrollListener = subscribeViewportScrollAfter((_renderObject$scene$g = renderObject.scene.getViewport(VIEWPORT_KEY.VIEW_MAIN)) === null || _renderObject$scene$g === void 0 ? void 0 : _renderObject$scene$g.onScrollAfter$, () => position$.next(calcDocFloatDomPosition(rect, renderObject.renderUnit)));
1550
1591
  disposableCollection.add(() => {
1551
1592
  this._canvasFloatDomService.removeFloatDom(rectParam.drawingId);
1552
1593
  });
1553
1594
  listener && disposableCollection.add(listener);
1595
+ scrollListener && disposableCollection.add(scrollListener);
1554
1596
  this._domLayerInfoMap.set(rectParam.drawingId, info);
1555
1597
  }
1556
1598
  });
1557
1599
  }
1600
+ _drawingRuntimePropsListener() {
1601
+ this.disposeWithMe(this._drawingManagerService.refreshTransform$.subscribe((params) => {
1602
+ params.forEach((param) => {
1603
+ var _this$_canvasFloatDom;
1604
+ const floatDomInfo = this._domLayerInfoMap.get(param.drawingId);
1605
+ if (!floatDomInfo) return;
1606
+ const runtimeParam = param;
1607
+ const runtimeViewport = pickValidCustomBlockRenderViewport(runtimeParam.customBlockRenderViewport);
1608
+ if (runtimeViewport) floatDomInfo.runtimeViewport = runtimeViewport;
1609
+ if (syncRectWithRuntimeParam(floatDomInfo.rect, runtimeParam, floatDomInfo.runtimeViewport, floatDomInfo.runtimeTransform, floatDomInfo.preserveRuntimeGeometry)) {
1610
+ if (runtimeViewport || floatDomInfo.preserveRuntimeGeometry) floatDomInfo.runtimeTransform = createTransformFromRect(floatDomInfo.rect);
1611
+ const renderObject = this._getSceneAndTransformerByDrawingSearch(floatDomInfo.unitId);
1612
+ if (renderObject) floatDomInfo.position$.next(calcDocFloatDomPosition(floatDomInfo.rect, renderObject.renderUnit));
1613
+ }
1614
+ const currentProps = (_this$_canvasFloatDom = this._canvasFloatDomService.domLayers.find(([id]) => id === param.drawingId)) === null || _this$_canvasFloatDom === void 0 ? void 0 : _this$_canvasFloatDom[1].props;
1615
+ this._canvasFloatDomService.updateFloatDom(param.drawingId, { props: mergeDocFloatDomRuntimeProps(currentProps, param) });
1616
+ });
1617
+ }));
1618
+ }
1558
1619
  _addHoverForRect(o) {
1559
1620
  this.disposeWithMe(toDisposable(o.onPointerEnter$.subscribeEvent(() => {
1560
1621
  o.cursor = CURSOR_TYPE.GRAB;
@@ -1655,6 +1716,71 @@ DocFloatDomController = __decorate([
1655
1716
  __decorateParam(4, IUniverInstanceService),
1656
1717
  __decorateParam(5, ICommandService)
1657
1718
  ], DocFloatDomController);
1719
+ function syncRectWithRuntimeParam(rect, param, fallbackViewport, fallbackTransform, preserveRuntimeGeometry) {
1720
+ const transform = getRuntimeTransform(param, rect, fallbackViewport, fallbackTransform, preserveRuntimeGeometry);
1721
+ if (!transform) return false;
1722
+ rect.transformByState(transform);
1723
+ return true;
1724
+ }
1725
+ function getRuntimeTransform(param, rect, fallbackViewport, fallbackTransform, preserveRuntimeGeometry) {
1726
+ var _param$transform, _param$transforms, _param$customBlockRen, _runtimeViewport$heig2;
1727
+ const transform = (_param$transform = param.transform) !== null && _param$transform !== void 0 ? _param$transform : (_param$transforms = param.transforms) === null || _param$transforms === void 0 ? void 0 : _param$transforms[0];
1728
+ const runtimeViewport = (_param$customBlockRen = param.customBlockRenderViewport) !== null && _param$customBlockRen !== void 0 ? _param$customBlockRen : fallbackViewport;
1729
+ if (!param.customBlockRenderViewport && preserveRuntimeGeometry && fallbackTransform && transform) {
1730
+ var _fallbackTransform$wi, _fallbackTransform$he;
1731
+ return {
1732
+ ...transform,
1733
+ width: (_fallbackTransform$wi = fallbackTransform.width) !== null && _fallbackTransform$wi !== void 0 ? _fallbackTransform$wi : transform.width,
1734
+ height: (_fallbackTransform$he = fallbackTransform.height) !== null && _fallbackTransform$he !== void 0 ? _fallbackTransform$he : transform.height
1735
+ };
1736
+ }
1737
+ if (!transform) {
1738
+ var _runtimeViewport$heig;
1739
+ const height = (_runtimeViewport$heig = runtimeViewport === null || runtimeViewport === void 0 ? void 0 : runtimeViewport.height) !== null && _runtimeViewport$heig !== void 0 ? _runtimeViewport$heig : runtimeViewport === null || runtimeViewport === void 0 ? void 0 : runtimeViewport.contentHeight;
1740
+ if (!isPositiveNumber(height)) return;
1741
+ return {
1742
+ left: rect.left,
1743
+ top: rect.top,
1744
+ width: rect.width,
1745
+ height,
1746
+ angle: rect.angle
1747
+ };
1748
+ }
1749
+ const height = (_runtimeViewport$heig2 = runtimeViewport === null || runtimeViewport === void 0 ? void 0 : runtimeViewport.height) !== null && _runtimeViewport$heig2 !== void 0 ? _runtimeViewport$heig2 : runtimeViewport === null || runtimeViewport === void 0 ? void 0 : runtimeViewport.contentHeight;
1750
+ if (!isPositiveNumber(height)) return transform;
1751
+ return {
1752
+ ...transform,
1753
+ height
1754
+ };
1755
+ }
1756
+ function isEmbedFloatDomRuntimeParam(param) {
1757
+ const data = param.data;
1758
+ if (!data || typeof data !== "object") return false;
1759
+ const candidate = data;
1760
+ return candidate.version === 1 && typeof candidate.embedId === "string" && typeof candidate.hostAnchorId === "string";
1761
+ }
1762
+ function createTransformFromRect(rect) {
1763
+ return {
1764
+ angle: rect.angle,
1765
+ height: rect.height,
1766
+ left: rect.left,
1767
+ top: rect.top,
1768
+ width: rect.width
1769
+ };
1770
+ }
1771
+ function subscribeViewportScrollAfter(scrollEvent, callback) {
1772
+ if (!scrollEvent || typeof scrollEvent !== "object") return;
1773
+ const eventSubject = scrollEvent;
1774
+ if (typeof eventSubject.subscribeEvent === "function") return eventSubject.subscribeEvent(callback);
1775
+ const observable = scrollEvent;
1776
+ if (typeof observable.subscribe === "function") {
1777
+ const subscription = observable.subscribe(callback);
1778
+ return toDisposable(() => {
1779
+ var _subscription$unsubsc;
1780
+ return (_subscription$unsubsc = subscription.unsubscribe) === null || _subscription$unsubsc === void 0 ? void 0 : _subscription$unsubsc.call(subscription);
1781
+ });
1782
+ }
1783
+ }
1658
1784
 
1659
1785
  //#endregion
1660
1786
  //#region src/menu/image.menu.ts
@@ -1784,7 +1910,7 @@ function InsertEllipseShapeBelowMenuFactory(accessor) {
1784
1910
  //#endregion
1785
1911
  //#region package.json
1786
1912
  var name = "@univerjs/docs-drawing-ui";
1787
- var version = "1.0.0-alpha.1";
1913
+ var version = "1.0.0-insiders.20260701-0ef51b0";
1788
1914
 
1789
1915
  //#endregion
1790
1916
  //#region src/config/config.ts
@@ -2924,6 +3050,7 @@ let DocDrawingTransformUpdateController = class DocDrawingTransformUpdateControl
2924
3050
  behindText,
2925
3051
  transform,
2926
3052
  transforms: [transform],
3053
+ customBlockRenderViewport: drawing.customBlockRenderViewport,
2927
3054
  isMultiTransform
2928
3055
  };
2929
3056
  else if (isMultiTransform === BooleanNumber.TRUE) updateDrawingMap[drawingId].transforms.push(transform);
@@ -13,8 +13,10 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
+ import type { ITransformState } from '@univerjs/core';
17
+ import type { IDocFloatDom } from '@univerjs/docs-drawing';
16
18
  import type { IDocFloatDomDataBase } from '@univerjs/drawing';
17
- import type { IBoundRectNoAngle, Scene } from '@univerjs/engine-render';
19
+ import type { IBoundRectNoAngle, IDocsCustomBlockRenderViewport, Scene } from '@univerjs/engine-render';
18
20
  import type { IFloatDomLayout } from '@univerjs/ui';
19
21
  import { Disposable, ICommandService, IUniverInstanceService } from '@univerjs/core';
20
22
  import { IDrawingManagerService } from '@univerjs/drawing';
@@ -24,6 +26,13 @@ import { CanvasFloatDomService } from '@univerjs/ui';
24
26
  export declare function calcDocFloatDomPositionByRect(rect: IBoundRectNoAngle, scene: Scene, opacity?: number, angle?: number): IFloatDomLayout;
25
27
  interface IDocFloatDomParams extends IDocFloatDomDataBase {
26
28
  }
29
+ type IDocFloatDomRuntimeViewport = Partial<Pick<IDocsCustomBlockRenderViewport, 'bleedLeft' | 'bleedWidth' | 'contentHeight' | 'contentWidth' | 'height' | 'viewportHeight'>>;
30
+ interface IDocFloatDomRuntimeParam extends IDocFloatDom {
31
+ customBlockRenderViewport?: IDocFloatDomRuntimeViewport;
32
+ transform?: Partial<ITransformState>;
33
+ transforms?: Array<Partial<ITransformState>>;
34
+ }
35
+ export declare function mergeDocFloatDomRuntimeProps(existingProps: Record<string, unknown> | undefined, param: IDocFloatDomRuntimeParam): Record<string, unknown> | undefined;
27
36
  export declare class DocFloatDomController extends Disposable {
28
37
  private readonly _renderManagerService;
29
38
  private readonly _drawingManagerService;
@@ -38,6 +47,7 @@ export declare class DocFloatDomController extends Disposable {
38
47
  private _getSceneAndTransformerByDrawingSearch;
39
48
  private _drawingAddRemoveListener;
40
49
  private _insertRects;
50
+ private _drawingRuntimePropsListener;
41
51
  private _addHoverForRect;
42
52
  private _removeDom;
43
53
  private _initScrollAndZoomEvent;