@meursyphus/flitter 0.0.7 → 0.0.9

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.
@@ -414,18 +414,6 @@ function createUniqueId() {
414
414
  return (id++).toString();
415
415
  }
416
416
 
417
- // src/utils/TypedObject.ts
418
- function entries(obj) {
419
- return Object.entries(obj);
420
- }
421
- function keys(obj) {
422
- return Object.keys(obj);
423
- }
424
- var TypedObject_default = {
425
- entries,
426
- keys
427
- };
428
-
429
417
  // src/utils/index.ts
430
418
  var _Utils = class _Utils {
431
419
  static sum(values) {
@@ -11960,6 +11948,14 @@ var ToolTipPosition = /* @__PURE__ */ ((ToolTipPosition2) => {
11960
11948
  return ToolTipPosition2;
11961
11949
  })(ToolTipPosition || {});
11962
11950
 
11951
+ // src/exception/index.ts
11952
+ var NotImplementedError = class extends Error {
11953
+ constructor(method) {
11954
+ super(`${method} is not implemented`);
11955
+ this.name = "NotImplementedError";
11956
+ }
11957
+ };
11958
+
11963
11959
  // src/renderobject/RenderObject.ts
11964
11960
  var _domNode, _domOrder, _domOrderChanged;
11965
11961
  var RenderObject = class {
@@ -11996,8 +11992,11 @@ var RenderObject = class {
11996
11992
  set domOrder(newOrder) {
11997
11993
  if (newOrder === __privateGet(this, _domOrder))
11998
11994
  return;
11999
- __privateSet(this, _domOrderChanged, true);
12000
11995
  __privateSet(this, _domOrder, newOrder);
11996
+ this.didDomOrderChange();
11997
+ }
11998
+ didDomOrderChange() {
11999
+ __privateSet(this, _domOrderChanged, true);
12001
12000
  }
12002
12001
  get domNode() {
12003
12002
  assert(__privateGet(this, _domNode) != null, "domNode is not initialized");
@@ -12091,7 +12090,7 @@ var RenderObject = class {
12091
12090
  this.ownerElement = ownerElement;
12092
12091
  this.depth = ownerElement.depth;
12093
12092
  if (this.isPainter) {
12094
- this.mountSvgEl(this.renderOwner.paintContext);
12093
+ this.mountSvgEl(this.renderOwner.renderContext.paintContext);
12095
12094
  this.renderOwner.didDomOrderChange();
12096
12095
  }
12097
12096
  }
@@ -12125,8 +12124,8 @@ var RenderObject = class {
12125
12124
  resolveSvgEl() {
12126
12125
  const container = this.domNode;
12127
12126
  const svgEls = {};
12128
- for (let i = 0; i < container.children.length; i++) {
12129
- const child = container.children[i];
12127
+ for (const element of container.children) {
12128
+ const child = element;
12130
12129
  const name = child.getAttribute("data-render-name");
12131
12130
  svgEls[name] = child;
12132
12131
  }
@@ -12135,7 +12134,10 @@ var RenderObject = class {
12135
12134
  rearrangeDomOrder() {
12136
12135
  if (!__privateGet(this, _domOrderChanged))
12137
12136
  return;
12138
- this.isPainter && this.renderOwner.paintContext.insertSvgEl(this.domNode, this.domOrder);
12137
+ this.isPainter && this.renderOwner.renderContext.paintContext.insertSvgEl(
12138
+ this.domNode,
12139
+ this.domOrder
12140
+ );
12139
12141
  __privateSet(this, _domOrderChanged, false);
12140
12142
  }
12141
12143
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -12147,7 +12149,7 @@ var RenderObject = class {
12147
12149
  */
12148
12150
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
12149
12151
  preformLayout() {
12150
- throw { message: "not implemented performLayout" };
12152
+ throw new NotImplementedError("performLayout");
12151
12153
  }
12152
12154
  /*
12153
12155
  * Do not call this method directly. instead call paint
@@ -12196,12 +12198,22 @@ var RenderObject = class {
12196
12198
  });
12197
12199
  }
12198
12200
  /**
12199
- *
12200
12201
  * It is currently only used on ZIndexRenderObject
12201
12202
  */
12202
12203
  accept(visitor) {
12203
12204
  visitor.visitGeneral(this);
12204
12205
  }
12206
+ hitTest({ globalPoint }) {
12207
+ const viewPort = this.renderOwner.renderContext.viewPort;
12208
+ const { translation, scale } = viewPort;
12209
+ const bounds = {
12210
+ left: (this.matrix.storage[12] + translation.x) * scale,
12211
+ top: (this.matrix.storage[13] + translation.y) * scale,
12212
+ right: (this.matrix.storage[12] + translation.x + this.size.width) * scale,
12213
+ bottom: (this.matrix.storage[13] + translation.y + this.size.height) * scale
12214
+ };
12215
+ return globalPoint.x >= bounds.left && globalPoint.x <= bounds.right && globalPoint.y >= bounds.top && globalPoint.y <= bounds.bottom;
12216
+ }
12205
12217
  };
12206
12218
  _domNode = new WeakMap();
12207
12219
  _domOrder = new WeakMap();
@@ -12427,7 +12439,7 @@ var RenderObjectElement = class extends Element_default {
12427
12439
  }
12428
12440
  findAncestorRenderObjectElement() {
12429
12441
  let ancestor = this.parent;
12430
- while (ancestor != null && !(ancestor.type === "render")) {
12442
+ while (ancestor != null && ancestor.type !== "render") {
12431
12443
  ancestor = ancestor.parent;
12432
12444
  }
12433
12445
  return ancestor;
@@ -12461,7 +12473,6 @@ var RenderObjectToWidgetAdapter = class extends RenderObjectWidget_default {
12461
12473
  app,
12462
12474
  renderOwner,
12463
12475
  buildOwner,
12464
- renderContext,
12465
12476
  scheduler
12466
12477
  }) {
12467
12478
  super({ children: [app] });
@@ -12471,7 +12482,7 @@ var RenderObjectToWidgetAdapter = class extends RenderObjectWidget_default {
12471
12482
  __publicField(this, "scheduler");
12472
12483
  this.renderOwner = renderOwner;
12473
12484
  this.buildOwner = buildOwner;
12474
- this.renderContext = renderContext;
12485
+ this.renderContext = renderOwner.renderContext;
12475
12486
  this.scheduler = scheduler;
12476
12487
  }
12477
12488
  createElement() {
@@ -12484,8 +12495,8 @@ var RenderObjectToWidgetAdapter = class extends RenderObjectWidget_default {
12484
12495
  createRenderObject() {
12485
12496
  return new RenderView_default({ renderOwner: this.renderOwner });
12486
12497
  }
12487
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
12488
12498
  updateRenderObject(renderObject) {
12499
+ renderObject.renderOwner = this.renderOwner;
12489
12500
  }
12490
12501
  };
12491
12502
  var RenderObjectToWidgetAdapter_default = RenderObjectToWidgetAdapter;
@@ -12529,9 +12540,11 @@ var BuildOwner_default = BuildOwner;
12529
12540
  var RenderOwner = class {
12530
12541
  constructor({
12531
12542
  onNeedVisualUpdate,
12532
- paintContext
12543
+ renderContext,
12544
+ hitTestDispatcher
12533
12545
  }) {
12534
- __publicField(this, "paintContext");
12546
+ __publicField(this, "hitTestDispatcher");
12547
+ __publicField(this, "renderContext");
12535
12548
  __publicField(this, "onNeedVisualUpdate");
12536
12549
  __publicField(this, "needsPaintRenderObjects", []);
12537
12550
  __publicField(this, "needsLayoutRenderObjects", []);
@@ -12541,7 +12554,9 @@ var RenderOwner = class {
12541
12554
  __publicField(this, "renderView");
12542
12555
  __publicField(this, "domOrderChanged", true);
12543
12556
  this.onNeedVisualUpdate = onNeedVisualUpdate;
12544
- this.paintContext = paintContext;
12557
+ this.renderContext = renderContext;
12558
+ this.hitTestDispatcher = hitTestDispatcher;
12559
+ this.hitTestDispatcher.init({ renderContext: this.renderContext });
12545
12560
  }
12546
12561
  requestVisualUpdate() {
12547
12562
  this.onNeedVisualUpdate();
@@ -12582,7 +12597,7 @@ var RenderOwner = class {
12582
12597
  dirties.sort((a, b) => a.depth - b.depth).forEach((renderObject) => {
12583
12598
  if (!renderObject.needsPaint)
12584
12599
  return;
12585
- renderObject.paintWithoutLayout(this.paintContext);
12600
+ renderObject.paintWithoutLayout(this.renderContext.paintContext);
12586
12601
  });
12587
12602
  }
12588
12603
  };
@@ -12660,39 +12675,58 @@ var RenderOwner_default = RenderOwner;
12660
12675
 
12661
12676
  // src/scheduler/Scheduler.ts
12662
12677
  var Scheduler = class {
12663
- constructor() {
12678
+ constructor({
12679
+ renderFrameDispatcher
12680
+ }) {
12664
12681
  __publicField(this, "phase");
12665
12682
  __publicField(this, "persistenceCallbacks");
12666
12683
  __publicField(this, "postFrameCallbacks");
12684
+ __publicField(this, "renderFrameDispatcher");
12685
+ __publicField(this, "hasScheduledFrame", false);
12667
12686
  this.phase = 0 /* idle */;
12668
12687
  this.persistenceCallbacks = [];
12669
12688
  this.postFrameCallbacks = [];
12689
+ this.renderFrameDispatcher = renderFrameDispatcher;
12690
+ renderFrameDispatcher.setOnFrame(() => this.handleDrawFrame());
12670
12691
  }
12671
- consumePostCallbacks() {
12692
+ flushPostCallbacks() {
12672
12693
  this.postFrameCallbacks.forEach((callback) => {
12673
12694
  callback();
12674
12695
  });
12675
12696
  this.postFrameCallbacks = [];
12676
12697
  }
12677
- schedule() {
12698
+ ensureVisualUpdate() {
12678
12699
  switch (this.phase) {
12679
12700
  case 0 /* idle */:
12680
12701
  case 2 /* postFrameCallbacks */:
12681
- this.performSchedule();
12702
+ this.schedule();
12682
12703
  break;
12683
12704
  case 1 /* persistenceCallbacks */:
12684
12705
  break;
12685
12706
  }
12686
12707
  }
12687
- performSchedule() {
12708
+ schedule() {
12709
+ if (this.hasScheduledFrame)
12710
+ return;
12711
+ this.renderFrameDispatcher.dispatch();
12712
+ this.hasScheduledFrame = true;
12713
+ }
12714
+ handleDrawFrame() {
12715
+ assert(
12716
+ this.phase === 0 /* idle */,
12717
+ "Scheduler should be idle on beginning frame"
12718
+ );
12719
+ this.hasScheduledFrame = false;
12688
12720
  this.phase = 1 /* persistenceCallbacks */;
12721
+ this.flushPersistenceCallbacks();
12722
+ this.phase = 2 /* postFrameCallbacks */;
12723
+ this.flushPostCallbacks();
12724
+ this.phase = 0 /* idle */;
12725
+ }
12726
+ flushPersistenceCallbacks() {
12689
12727
  this.persistenceCallbacks.forEach((callback) => {
12690
12728
  callback();
12691
12729
  });
12692
- this.phase = 2 /* postFrameCallbacks */;
12693
- this.consumePostCallbacks();
12694
- this.postFrameCallbacks = [];
12695
- this.phase = 0 /* idle */;
12696
12730
  }
12697
12731
  addPersistenceCallbacks(callback) {
12698
12732
  this.persistenceCallbacks.push(() => callback());
@@ -12707,9 +12741,6 @@ var Scheduler_default = Scheduler;
12707
12741
  var RenderFrameDispatcher = class {
12708
12742
  constructor({ onFrame } = {}) {
12709
12743
  __publicField(this, "onFrame");
12710
- // Actually we don't need to invoke browser to render because browser automatically render its own state periodically
12711
- // so Here we just call onFrame callback.
12712
- __publicField(this, "idle", true);
12713
12744
  this.onFrame = onFrame;
12714
12745
  }
12715
12746
  setOnFrame(callback) {
@@ -12718,13 +12749,9 @@ var RenderFrameDispatcher = class {
12718
12749
  dispatch() {
12719
12750
  if (typeof window === "undefined")
12720
12751
  return;
12721
- if (!this.idle)
12722
- return;
12723
- this.idle = false;
12724
12752
  window.requestAnimationFrame(() => {
12725
12753
  var _a;
12726
12754
  (_a = this.onFrame) == null ? void 0 : _a.call(this);
12727
- this.idle = true;
12728
12755
  });
12729
12756
  }
12730
12757
  };
@@ -12746,6 +12773,154 @@ var GlobalKey = class {
12746
12773
  };
12747
12774
  var Globalkey_default = GlobalKey;
12748
12775
 
12776
+ // src/hit-test/HitTestDispatcher.ts
12777
+ var _activated, _detectors, _rootPosition, _renderContext, _hitPosition, _handleMouseDown, _handleClick, _hitHistory, _handleMouseMove, _handleMouseUp, _handleMouseWheel, _handleMouseEnter, _handleMouseLeave, _wrapEvent, _didDomOrderChangeState;
12778
+ var HitTestDispatcher = class {
12779
+ constructor() {
12780
+ __privateAdd(this, _activated, typeof window !== "undefined");
12781
+ __privateAdd(this, _detectors, []);
12782
+ __privateAdd(this, _rootPosition, null);
12783
+ __privateAdd(this, _renderContext, void 0);
12784
+ __privateAdd(this, _hitPosition, new offset_default({ x: 0, y: 0 }));
12785
+ __privateAdd(this, _handleMouseDown, (e) => {
12786
+ this.hitTest(e, "onMouseDown");
12787
+ });
12788
+ __privateAdd(this, _handleClick, (e) => {
12789
+ this.hitTest(e, "onClick");
12790
+ });
12791
+ __privateAdd(this, _hitHistory, []);
12792
+ __privateAdd(this, _handleMouseMove, (e) => {
12793
+ this.traceHitPosition(e);
12794
+ this.hitTest(e, "onMouseMove");
12795
+ e.isPropagationStopped = false;
12796
+ for (const i in __privateGet(this, _detectors)) {
12797
+ const detector = __privateGet(this, _detectors)[i];
12798
+ if (e.isPropagationStopped)
12799
+ return;
12800
+ if (!__privateGet(this, _hitHistory)[i] && detector.hitTest({ globalPoint: __privateGet(this, _hitPosition) })) {
12801
+ detector.onMouseEnter(e);
12802
+ }
12803
+ }
12804
+ e.isPropagationStopped = false;
12805
+ for (const i in __privateGet(this, _detectors)) {
12806
+ const detector = __privateGet(this, _detectors)[i];
12807
+ if (e.isPropagationStopped)
12808
+ return;
12809
+ if (__privateGet(this, _hitHistory)[i] && !detector.hitTest({ globalPoint: __privateGet(this, _hitPosition) })) {
12810
+ detector.onMouseLeave(e);
12811
+ }
12812
+ }
12813
+ __privateGet(this, _detectors).forEach((detector, i) => {
12814
+ __privateGet(this, _hitHistory)[i] = detector.hitTest({
12815
+ globalPoint: __privateGet(this, _hitPosition)
12816
+ });
12817
+ });
12818
+ });
12819
+ __privateAdd(this, _handleMouseUp, (e) => {
12820
+ this.hitTest(e, "onMouseUp");
12821
+ });
12822
+ __privateAdd(this, _handleMouseWheel, (e) => {
12823
+ this.hitTest(e, "onMouseWheel");
12824
+ e.isPropagationStopped = false;
12825
+ for (const detector of __privateGet(this, _detectors)) {
12826
+ if (e.isPropagationStopped)
12827
+ return;
12828
+ if (!detector.hitTest({ globalPoint: __privateGet(this, _hitPosition) }))
12829
+ continue;
12830
+ detector.onMouseEnter(e);
12831
+ }
12832
+ e.isPropagationStopped = false;
12833
+ });
12834
+ __privateAdd(this, _handleMouseEnter, () => {
12835
+ const rect = __privateGet(this, _renderContext).view.getBoundingClientRect();
12836
+ __privateSet(this, _rootPosition, new offset_default({
12837
+ x: rect.left,
12838
+ y: rect.top
12839
+ }));
12840
+ });
12841
+ __privateAdd(this, _handleMouseLeave, () => {
12842
+ __privateSet(this, _rootPosition, null);
12843
+ });
12844
+ __publicField(this, "hitTest", (e, type) => {
12845
+ for (const detector of __privateGet(this, _detectors)) {
12846
+ if (e.isPropagationStopped)
12847
+ return;
12848
+ if (!detector.hitTest({ globalPoint: __privateGet(this, _hitPosition) }))
12849
+ continue;
12850
+ detector[type](e);
12851
+ }
12852
+ });
12853
+ __privateAdd(this, _wrapEvent, (callback) => (e) => {
12854
+ const stopPropagation = e.stopPropagation;
12855
+ e.stopPropagation = function() {
12856
+ e.isPropagationStopped = true;
12857
+ stopPropagation.call(e);
12858
+ };
12859
+ return callback(e);
12860
+ });
12861
+ /**
12862
+ * This code is for batch processing. The intention is not to perform the sorting operation every time this method is called,
12863
+ * but rather to ensure that the sorting happens only once in a batch manner. This is achieved by wrapping the sorting logic
12864
+ * inside a setTimeout, which defers the execution until the current call stack is clear, effectively coalescing multiple calls
12865
+ * into a single operation.
12866
+ */
12867
+ __privateAdd(this, _didDomOrderChangeState, "idle");
12868
+ }
12869
+ init({ renderContext }) {
12870
+ if (!__privateGet(this, _activated))
12871
+ return;
12872
+ __privateSet(this, _renderContext, renderContext);
12873
+ const { view } = __privateGet(this, _renderContext);
12874
+ view.addEventListener("mousedown", __privateGet(this, _wrapEvent).call(this, __privateGet(this, _handleMouseDown)));
12875
+ view.addEventListener("click", __privateGet(this, _wrapEvent).call(this, __privateGet(this, _handleClick)));
12876
+ view.addEventListener("mousemove", __privateGet(this, _wrapEvent).call(this, __privateGet(this, _handleMouseMove)));
12877
+ view.addEventListener("mouseup", __privateGet(this, _wrapEvent).call(this, __privateGet(this, _handleMouseUp)));
12878
+ view.addEventListener("wheel", __privateGet(this, _wrapEvent).call(this, __privateGet(this, _handleMouseWheel)));
12879
+ view.addEventListener("mouseenter", __privateGet(this, _handleMouseEnter));
12880
+ view.addEventListener("mouseleave", __privateGet(this, _handleMouseLeave));
12881
+ }
12882
+ traceHitPosition(e) {
12883
+ if (__privateGet(this, _rootPosition) == null)
12884
+ return;
12885
+ __privateGet(this, _hitPosition).x = e.clientX - __privateGet(this, _rootPosition).x;
12886
+ __privateGet(this, _hitPosition).y = e.clientY - __privateGet(this, _rootPosition).y;
12887
+ }
12888
+ didChangeDomOrder() {
12889
+ if (__privateGet(this, _didDomOrderChangeState) === "processing")
12890
+ return;
12891
+ __privateSet(this, _didDomOrderChangeState, "processing");
12892
+ setTimeout(() => {
12893
+ __privateSet(this, _detectors, __privateGet(this, _detectors).sort((a, b) => b.domOrder - a.domOrder));
12894
+ __privateSet(this, _didDomOrderChangeState, "idle");
12895
+ }, 0);
12896
+ }
12897
+ addDetector(detector) {
12898
+ if (!__privateGet(this, _activated))
12899
+ return;
12900
+ __privateGet(this, _detectors).push(detector);
12901
+ }
12902
+ removeDetector(detector) {
12903
+ if (!__privateGet(this, _activated))
12904
+ return;
12905
+ __privateSet(this, _detectors, __privateGet(this, _detectors).filter((d) => d !== detector));
12906
+ }
12907
+ };
12908
+ _activated = new WeakMap();
12909
+ _detectors = new WeakMap();
12910
+ _rootPosition = new WeakMap();
12911
+ _renderContext = new WeakMap();
12912
+ _hitPosition = new WeakMap();
12913
+ _handleMouseDown = new WeakMap();
12914
+ _handleClick = new WeakMap();
12915
+ _hitHistory = new WeakMap();
12916
+ _handleMouseMove = new WeakMap();
12917
+ _handleMouseUp = new WeakMap();
12918
+ _handleMouseWheel = new WeakMap();
12919
+ _handleMouseEnter = new WeakMap();
12920
+ _handleMouseLeave = new WeakMap();
12921
+ _wrapEvent = new WeakMap();
12922
+ _didDomOrderChangeState = new WeakMap();
12923
+
12749
12924
  // src/runApp.ts
12750
12925
  var AppRunner = class {
12751
12926
  constructor({
@@ -12762,24 +12937,33 @@ var AppRunner = class {
12762
12937
  __publicField(this, "scheduler");
12763
12938
  __publicField(this, "didRun", false);
12764
12939
  __publicField(this, "widget");
12940
+ __publicField(this, "handleViewResize", (size) => {
12941
+ this.viewSize = size;
12942
+ if (this.didRun) {
12943
+ this.draw();
12944
+ } else {
12945
+ this.runApp(this.widget);
12946
+ }
12947
+ });
12765
12948
  this.viewSize = ssrSize;
12766
12949
  const renderContext = new RenderContext({
12767
12950
  view,
12768
12951
  document: _document,
12769
- window: _window
12952
+ window: _window,
12953
+ onResize: this.handleViewResize
12770
12954
  });
12771
- const renderDispatcher = new RenderFrameDispatcher_default();
12955
+ const renderFrameDispatcher = new RenderFrameDispatcher_default();
12956
+ const scheduler = new Scheduler_default({ renderFrameDispatcher });
12772
12957
  const buildOwner = new BuildOwner_default({
12773
- onNeedVisualUpdate: () => renderDispatcher.dispatch()
12958
+ onNeedVisualUpdate: () => scheduler.ensureVisualUpdate()
12774
12959
  });
12775
12960
  const renderOwner = new RenderOwner_default({
12776
- onNeedVisualUpdate: () => renderDispatcher.dispatch(),
12777
- paintContext: renderContext.paintContext
12961
+ onNeedVisualUpdate: () => scheduler.ensureVisualUpdate(),
12962
+ renderContext,
12963
+ hitTestDispatcher: new HitTestDispatcher()
12778
12964
  });
12779
- const scheduler = new Scheduler_default();
12780
12965
  scheduler.addPersistenceCallbacks(() => buildOwner.flushBuild());
12781
12966
  scheduler.addPersistenceCallbacks(() => renderOwner.drawFrame());
12782
- renderDispatcher.setOnFrame(() => scheduler.schedule());
12783
12967
  this.buildOwner = buildOwner;
12784
12968
  this.renderOwner = renderOwner;
12785
12969
  this.scheduler = scheduler;
@@ -12793,14 +12977,12 @@ var AppRunner = class {
12793
12977
  app: widget,
12794
12978
  buildOwner: this.buildOwner,
12795
12979
  renderOwner: this.renderOwner,
12796
- renderContext: this.renderContext,
12797
12980
  scheduler: this.scheduler
12798
12981
  }).createElement();
12799
12982
  this.root.mount(void 0);
12800
12983
  this.root.renderObject.constraints = constraints_default.tight(this.viewSize);
12801
12984
  this.didRun = true;
12802
12985
  this.draw();
12803
- this.scheduler.consumePostCallbacks();
12804
12986
  return this.renderContext.view.innerHTML;
12805
12987
  }
12806
12988
  setConfig({
@@ -12814,7 +12996,7 @@ var AppRunner = class {
12814
12996
  this.renderContext.window = window2;
12815
12997
  if (view)
12816
12998
  this.renderContext.view = view;
12817
- this.renderOwner.paintContext = this.renderContext.paintContext;
12999
+ this.renderOwner.renderContext = this.renderContext;
12818
13000
  }
12819
13001
  onMount({
12820
13002
  view,
@@ -12825,28 +13007,13 @@ var AppRunner = class {
12825
13007
  window,
12826
13008
  document
12827
13009
  });
12828
- resizeTarget && this.observeCanvasSize(resizeTarget);
12829
- }
12830
- observeCanvasSize(target) {
12831
- const resize = (child) => {
12832
- const { width, height } = child.target.getBoundingClientRect();
12833
- this.viewSize = new size_default({ width, height });
12834
- };
12835
- const resizeObserver = new ResizeObserver((entries2) => {
12836
- const child = entries2[0];
12837
- resize(child);
12838
- if (this.didRun) {
12839
- this.draw();
12840
- } else {
12841
- this.runApp(this.widget);
12842
- }
12843
- });
12844
- resizeObserver.observe(target);
13010
+ resizeTarget && this.renderContext.observeSize(resizeTarget);
12845
13011
  }
12846
13012
  draw() {
12847
13013
  this.layout();
12848
13014
  this.renderOwner.rearrangeDomOrder();
12849
13015
  this.paint();
13016
+ this.scheduler.flushPostCallbacks();
12850
13017
  }
12851
13018
  rebuild() {
12852
13019
  this.root.children[0].rebuild();
@@ -12859,19 +13026,42 @@ var AppRunner = class {
12859
13026
  const rootRenderObject = this.root.renderObject;
12860
13027
  rootRenderObject.paint(this.renderContext.paintContext);
12861
13028
  }
13029
+ dispose() {
13030
+ this.root.unmount();
13031
+ this.renderContext.dispose();
13032
+ }
12862
13033
  };
12863
13034
  var RenderContext = class {
12864
13035
  constructor({
12865
13036
  document: document2,
12866
13037
  window: window2,
12867
- view
13038
+ view,
13039
+ onResize
12868
13040
  }) {
12869
13041
  __publicField(this, "document");
12870
13042
  __publicField(this, "window");
12871
13043
  __publicField(this, "view");
13044
+ __publicField(this, "viewPort", {
13045
+ translation: { x: 0, y: 0 },
13046
+ scale: 1
13047
+ });
13048
+ __publicField(this, "viewSize", new size_default({ width: 0, height: 0 }));
13049
+ __publicField(this, "resizeObserver");
13050
+ __publicField(this, "onResize");
12872
13051
  this.document = document2;
12873
13052
  this.window = window2;
12874
13053
  this.view = view;
13054
+ this.onResize = onResize;
13055
+ }
13056
+ setViewport({
13057
+ translation,
13058
+ scale
13059
+ }) {
13060
+ this.viewPort = { translation, scale };
13061
+ this.view.setAttribute(
13062
+ "viewBox",
13063
+ `${-this.viewPort.translation.x} ${-this.viewPort.translation.y} ${this.viewSize.width / this.viewPort.scale} ${this.viewSize.height / this.viewPort.scale}`
13064
+ );
12875
13065
  }
12876
13066
  setConfig({
12877
13067
  document: document2,
@@ -12906,6 +13096,17 @@ var RenderContext = class {
12906
13096
  }
12907
13097
  };
12908
13098
  }
13099
+ dispose() {
13100
+ this.resizeObserver.disconnect();
13101
+ }
13102
+ observeSize(target) {
13103
+ this.resizeObserver = new ResizeObserver(([child]) => {
13104
+ const { width, height } = child.target.getBoundingClientRect();
13105
+ this.viewSize = new size_default({ width, height });
13106
+ this.onResize(this.viewSize);
13107
+ });
13108
+ this.resizeObserver.observe(target);
13109
+ }
12909
13110
  };
12910
13111
 
12911
13112
  // src/element/ComponentElement.ts
@@ -17257,7 +17458,6 @@ var BaseGestureDetector = class extends SingleChildRenderObjectWidget_default {
17257
17458
  onDragEnd,
17258
17459
  onDragMove,
17259
17460
  onDragStart,
17260
- bubble = {},
17261
17461
  onWheel
17262
17462
  }) {
17263
17463
  super({ child, key });
@@ -17273,7 +17473,6 @@ var BaseGestureDetector = class extends SingleChildRenderObjectWidget_default {
17273
17473
  __publicField(this, "onDragEnd");
17274
17474
  __publicField(this, "onWheel");
17275
17475
  __publicField(this, "cursor");
17276
- __publicField(this, "bubble");
17277
17476
  this.onClick = onClick != null ? onClick : emptyCallback;
17278
17477
  this.onMouseDown = onMouseDown != null ? onMouseDown : emptyCallback;
17279
17478
  this.onMouseMove = onMouseMove != null ? onMouseMove : emptyCallback;
@@ -17286,19 +17485,6 @@ var BaseGestureDetector = class extends SingleChildRenderObjectWidget_default {
17286
17485
  this.onDragEnd = onDragEnd != null ? onDragEnd : emptyCallback;
17287
17486
  this.onWheel = onWheel != null ? onWheel : emptyCallback;
17288
17487
  this.cursor = cursor != null ? cursor : "pointer";
17289
- this.bubble = __spreadValues({
17290
- mousedown: false,
17291
- mouseenter: false,
17292
- mouseleave: false,
17293
- mousemove: false,
17294
- mouseover: false,
17295
- mouseup: false,
17296
- click: false,
17297
- wheel: false,
17298
- dragstart: false,
17299
- dragend: false,
17300
- drag: false
17301
- }, bubble);
17302
17488
  }
17303
17489
  createRenderObject() {
17304
17490
  return new RenderGestureDetector({
@@ -17313,8 +17499,7 @@ var BaseGestureDetector = class extends SingleChildRenderObjectWidget_default {
17313
17499
  onDragMove: this.onDragMove,
17314
17500
  onDragEnd: this.onDragEnd,
17315
17501
  onWheel: this.onWheel,
17316
- cursor: this.cursor,
17317
- bubble: this.bubble
17502
+ cursor: this.cursor
17318
17503
  });
17319
17504
  }
17320
17505
  updateRenderObject(renderObject) {
@@ -17326,7 +17511,6 @@ var BaseGestureDetector = class extends SingleChildRenderObjectWidget_default {
17326
17511
  renderObject.onDragStart = this.onDragStart;
17327
17512
  renderObject.onDragMove = this.onDragMove;
17328
17513
  renderObject.onDragEnd = this.onDragEnd;
17329
- renderObject.bubble = this.bubble;
17330
17514
  renderObject.onWheel = this.onWheel;
17331
17515
  }
17332
17516
  };
@@ -17343,13 +17527,11 @@ var RenderGestureDetector = class extends SingleChildRenderObject_default {
17343
17527
  onDragMove,
17344
17528
  onDragStart,
17345
17529
  cursor,
17346
- bubble,
17347
17530
  onWheel
17348
17531
  }) {
17349
17532
  super({ isPainter: true });
17350
17533
  __publicField(this, "isRenderGestureDetector", true);
17351
17534
  __publicField(this, "id", createUniqueId());
17352
- __publicField(this, "_bubble");
17353
17535
  __publicField(this, "_cursor");
17354
17536
  __publicField(this, "_onClick");
17355
17537
  __publicField(this, "_onMouseDown");
@@ -17374,13 +17556,6 @@ var RenderGestureDetector = class extends SingleChildRenderObject_default {
17374
17556
  this._onDragStart = onDragStart;
17375
17557
  this._onWheel = onWheel;
17376
17558
  this._cursor = cursor;
17377
- this._bubble = bubble;
17378
- }
17379
- get bubble() {
17380
- return this._bubble;
17381
- }
17382
- set bubble(prop) {
17383
- this._bubble = prop;
17384
17559
  }
17385
17560
  get cursor() {
17386
17561
  return this._cursor;
@@ -17479,37 +17654,10 @@ var RenderGestureDetector = class extends SingleChildRenderObject_default {
17479
17654
  return;
17480
17655
  this._onWheel = prop;
17481
17656
  }
17482
- get listeners() {
17483
- const listeners = {
17484
- click: this.onClick,
17485
- mousedown: this.onMouseDown,
17486
- mousemove: this.onMouseMove,
17487
- mouseup: this.onMouseUp,
17488
- mouseover: this.onMouseOver,
17489
- mouseenter: this.onMouseEnter,
17490
- mouseleave: this.onMouseLeave,
17491
- wheel: this.onWheel,
17492
- dragstart: this.onDragStart,
17493
- drag: this.onDragMove,
17494
- dragend: this.onDragEnd
17495
- };
17496
- return TypedObject_default.keys(listeners).reduce(
17497
- (acc, key) => {
17498
- acc[key] = (e) => {
17499
- var _a;
17500
- if (this.bubble[key]) {
17501
- this.dispatchParent(e);
17502
- }
17503
- (_a = listeners[key]) == null ? void 0 : _a.call(listeners, e);
17504
- };
17505
- return acc;
17506
- },
17507
- {}
17508
- );
17509
- }
17510
17657
  attach(ownerElement) {
17511
17658
  super.attach(ownerElement);
17512
17659
  this.addEventListeners();
17660
+ this.renderOwner.hitTestDispatcher.addDetector(this);
17513
17661
  }
17514
17662
  dispose(context) {
17515
17663
  this.removeEventListeners();
@@ -17519,6 +17667,7 @@ var RenderGestureDetector = class extends SingleChildRenderObject_default {
17519
17667
  globalDragBackend = null;
17520
17668
  }
17521
17669
  super.dispose(context);
17670
+ this.renderOwner.hitTestDispatcher.removeDetector(this);
17522
17671
  }
17523
17672
  removeEventListeners() {
17524
17673
  getSingletonDragBackend().disconnectDragSource(this.id);
@@ -17527,22 +17676,13 @@ var RenderGestureDetector = class extends SingleChildRenderObject_default {
17527
17676
  const isBrowser = typeof window !== "undefined";
17528
17677
  if (!isBrowser)
17529
17678
  return;
17530
- const {
17531
- svgEls: { rect }
17532
- } = this.resolveSvgEl();
17533
17679
  const dragBackend = getSingletonDragBackend();
17534
17680
  dragBackend.isSetup || dragBackend.setup();
17535
17681
  backendRefCount++;
17536
- const _a = this.listeners, { drag, dragend, dragstart } = _a, restListeners = __objRest(_a, ["drag", "dragend", "dragstart"]);
17537
- dragBackend.connectDragSource(this.id, rect, {
17538
- onDragStart: dragstart,
17539
- onDragMove: drag,
17540
- onDragEnd: dragend
17541
- });
17542
- TypedObject_default.entries(restListeners).forEach(([type, listener]) => {
17543
- rect.addEventListener(type, (e) => {
17544
- listener(e);
17545
- });
17682
+ dragBackend.connectDragSource(this, {
17683
+ onDragStart: this.onDragStart,
17684
+ onDragMove: this.onDragMove,
17685
+ onDragEnd: this.onDragEnd
17546
17686
  });
17547
17687
  }
17548
17688
  performPaint({ rect }) {
@@ -17558,19 +17698,9 @@ var RenderGestureDetector = class extends SingleChildRenderObject_default {
17558
17698
  rect
17559
17699
  };
17560
17700
  }
17561
- dispatch(e) {
17562
- var _a, _b;
17563
- (_b = (_a = this.listeners)[e.type]) == null ? void 0 : _b.call(_a, e);
17564
- }
17565
- dispatchParent(e) {
17566
- let parent = this.parent;
17567
- while (parent != null) {
17568
- if (parent == null ? void 0 : parent.isRenderGestureDetector) {
17569
- parent.dispatch(e);
17570
- break;
17571
- }
17572
- parent = parent.parent;
17573
- }
17701
+ didChangeDomOrder() {
17702
+ super.didChangeDomOrder();
17703
+ this.renderOwner.hitTestDispatcher.didChangeDomOrder();
17574
17704
  }
17575
17705
  };
17576
17706
  function emptyCallback(_arg) {
@@ -17579,7 +17709,6 @@ var DragBackend = class {
17579
17709
  constructor() {
17580
17710
  __publicField(this, "isSetup", false);
17581
17711
  __publicField(this, "activeDragSourceId", null);
17582
- __publicField(this, "dragStartListener", {});
17583
17712
  __publicField(this, "dragMoveListener", {});
17584
17713
  __publicField(this, "dragEndListener", {});
17585
17714
  __publicField(this, "handleMouseMoveTop", (e) => {
@@ -17619,19 +17748,21 @@ var DragBackend = class {
17619
17748
  this.root.removeEventListener("mouseup", this.handleMouseUpTop);
17620
17749
  this.isSetup = false;
17621
17750
  }
17622
- connectDragSource(sourceId, node, {
17751
+ setActiveDragSourceId(sourceId) {
17752
+ this.activeDragSourceId = sourceId;
17753
+ }
17754
+ connectDragSource(detector, {
17623
17755
  onDragStart = emptyCallback,
17624
17756
  onDragMove = emptyCallback,
17625
17757
  onDragEnd = emptyCallback
17626
17758
  } = {}) {
17627
- this.dragStartListener[sourceId] = (e) => {
17628
- this.activeDragSourceId = sourceId;
17759
+ const sourceId = detector.id;
17760
+ const onMouseDown = detector.onMouseDown;
17761
+ detector.onMouseDown = (e) => {
17762
+ onMouseDown(e);
17763
+ this.setActiveDragSourceId(sourceId);
17629
17764
  onDragStart(e);
17630
17765
  };
17631
- node.addEventListener(
17632
- "mousedown",
17633
- this.dragStartListener[sourceId].bind(this)
17634
- );
17635
17766
  this.dragMoveListener[sourceId] = (e) => {
17636
17767
  onDragMove(e);
17637
17768
  };
@@ -18372,19 +18503,6 @@ var ToolTipState = class extends State {
18372
18503
  clipped: false,
18373
18504
  children: [
18374
18505
  GestureDetector_default({
18375
- bubble: {
18376
- mousedown: true,
18377
- mouseenter: true,
18378
- mouseleave: true,
18379
- mousemove: true,
18380
- mouseover: true,
18381
- mouseup: true,
18382
- click: true,
18383
- drag: true,
18384
- dragend: true,
18385
- dragstart: true,
18386
- wheel: true
18387
- },
18388
18506
  cursor: "default",
18389
18507
  child: this.widget.child,
18390
18508
  onMouseEnter: () => {