microboard-temp 0.12.4 → 0.12.5

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.
@@ -54310,7 +54310,7 @@ class GravityEngine {
54310
54310
  G = 80;
54311
54311
  G_CENTER = 120;
54312
54312
  DAMPING = 0.92;
54313
- REPULSION = 60000;
54313
+ REPULSION = 800;
54314
54314
  TICK_MS = 33;
54315
54315
  SYNC_MS = 300;
54316
54316
  MAX_DISTANCE = 3000;
@@ -54345,13 +54345,18 @@ class GravityEngine {
54345
54345
  const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
54346
54346
  if (items.length < 1)
54347
54347
  return;
54348
- const snapshot = items.map((item) => {
54348
+ const snap = items.map((item, idx) => {
54349
54349
  const pos = item.transformation.getTranslation();
54350
54350
  const mbr = item.getMbr();
54351
54351
  const w = Math.max(mbr.getWidth(), 1);
54352
54352
  const h2 = Math.max(mbr.getHeight(), 1);
54353
54353
  return {
54354
+ idx,
54354
54355
  id: item.getId(),
54356
+ left: pos.x,
54357
+ top: pos.y,
54358
+ right: pos.x + w,
54359
+ bottom: pos.y + h2,
54355
54360
  cx: pos.x + w * 0.5,
54356
54361
  cy: pos.y + h2 * 0.5,
54357
54362
  w,
@@ -54359,16 +54364,15 @@ class GravityEngine {
54359
54364
  mass: w * h2
54360
54365
  };
54361
54366
  });
54362
- let sumX = 0;
54363
- let sumY = 0;
54364
- for (const s2 of snapshot) {
54367
+ let sumX = 0, sumY = 0;
54368
+ for (const s2 of snap) {
54365
54369
  sumX += s2.cx;
54366
54370
  sumY += s2.cy;
54367
54371
  }
54368
- const centerX = sumX / snapshot.length;
54369
- const centerY = sumY / snapshot.length;
54370
- for (let i = 0;i < snapshot.length; i++) {
54371
- const s1 = snapshot[i];
54372
+ const centerX = sumX / snap.length;
54373
+ const centerY = sumY / snap.length;
54374
+ for (let i = 0;i < snap.length; i++) {
54375
+ const s1 = snap[i];
54372
54376
  if (!this.velocities.has(s1.id)) {
54373
54377
  this.velocities.set(s1.id, { vx: 0, vy: 0 });
54374
54378
  }
@@ -54380,22 +54384,28 @@ class GravityEngine {
54380
54384
  const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
54381
54385
  ax += this.G_CENTER * dcx / distCenter;
54382
54386
  ay += this.G_CENTER * dcy / distCenter;
54383
- for (let j = 0;j < snapshot.length; j++) {
54387
+ for (let j = 0;j < snap.length; j++) {
54384
54388
  if (i === j)
54385
54389
  continue;
54386
- const s2 = snapshot[j];
54390
+ const s2 = snap[j];
54387
54391
  const dx = s2.cx - s1.cx;
54388
54392
  const dy = s2.cy - s1.cy;
54389
- const distSq = dx * dx + dy * dy;
54390
- const dist = Math.sqrt(distSq) + 0.001;
54393
+ const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
54391
54394
  if (dist > this.MAX_DISTANCE)
54392
54395
  continue;
54393
- const minDist = (s1.w + s2.w + s1.h + s2.h) * 0.25;
54394
- if (dist < minDist) {
54395
- const repAcc = this.REPULSION / (distSq + this.SOFTENING_SQ);
54396
- ax -= repAcc * dx / dist;
54397
- ay -= repAcc * dy / dist;
54396
+ const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
54397
+ if (overlapping) {
54398
+ const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
54399
+ const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
54400
+ if (overlapX < overlapY) {
54401
+ const sign = s1.cx < s2.cx ? -1 : 1;
54402
+ ax += sign * this.REPULSION * overlapX;
54403
+ } else {
54404
+ const sign = s1.cy < s2.cy ? -1 : 1;
54405
+ ay += sign * this.REPULSION * overlapY;
54406
+ }
54398
54407
  } else {
54408
+ const distSq = dx * dx + dy * dy;
54399
54409
  const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
54400
54410
  ax += gravAcc * dx / dist;
54401
54411
  ay += gravAcc * dy / dist;
@@ -54437,14 +54447,7 @@ class GravityEngine {
54437
54447
  method: "applyMatrix",
54438
54448
  items: movedItems.map(({ id, dx, dy }) => ({
54439
54449
  id,
54440
- matrix: {
54441
- translateX: dx,
54442
- translateY: dy,
54443
- scaleX: 1,
54444
- scaleY: 1,
54445
- shearX: 0,
54446
- shearY: 0
54447
- }
54450
+ matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
54448
54451
  }))
54449
54452
  };
54450
54453
  this.board.events.emit(operation);
package/dist/cjs/index.js CHANGED
@@ -54310,7 +54310,7 @@ class GravityEngine {
54310
54310
  G = 80;
54311
54311
  G_CENTER = 120;
54312
54312
  DAMPING = 0.92;
54313
- REPULSION = 60000;
54313
+ REPULSION = 800;
54314
54314
  TICK_MS = 33;
54315
54315
  SYNC_MS = 300;
54316
54316
  MAX_DISTANCE = 3000;
@@ -54345,13 +54345,18 @@ class GravityEngine {
54345
54345
  const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
54346
54346
  if (items.length < 1)
54347
54347
  return;
54348
- const snapshot = items.map((item) => {
54348
+ const snap = items.map((item, idx) => {
54349
54349
  const pos = item.transformation.getTranslation();
54350
54350
  const mbr = item.getMbr();
54351
54351
  const w = Math.max(mbr.getWidth(), 1);
54352
54352
  const h2 = Math.max(mbr.getHeight(), 1);
54353
54353
  return {
54354
+ idx,
54354
54355
  id: item.getId(),
54356
+ left: pos.x,
54357
+ top: pos.y,
54358
+ right: pos.x + w,
54359
+ bottom: pos.y + h2,
54355
54360
  cx: pos.x + w * 0.5,
54356
54361
  cy: pos.y + h2 * 0.5,
54357
54362
  w,
@@ -54359,16 +54364,15 @@ class GravityEngine {
54359
54364
  mass: w * h2
54360
54365
  };
54361
54366
  });
54362
- let sumX = 0;
54363
- let sumY = 0;
54364
- for (const s2 of snapshot) {
54367
+ let sumX = 0, sumY = 0;
54368
+ for (const s2 of snap) {
54365
54369
  sumX += s2.cx;
54366
54370
  sumY += s2.cy;
54367
54371
  }
54368
- const centerX = sumX / snapshot.length;
54369
- const centerY = sumY / snapshot.length;
54370
- for (let i = 0;i < snapshot.length; i++) {
54371
- const s1 = snapshot[i];
54372
+ const centerX = sumX / snap.length;
54373
+ const centerY = sumY / snap.length;
54374
+ for (let i = 0;i < snap.length; i++) {
54375
+ const s1 = snap[i];
54372
54376
  if (!this.velocities.has(s1.id)) {
54373
54377
  this.velocities.set(s1.id, { vx: 0, vy: 0 });
54374
54378
  }
@@ -54380,22 +54384,28 @@ class GravityEngine {
54380
54384
  const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
54381
54385
  ax += this.G_CENTER * dcx / distCenter;
54382
54386
  ay += this.G_CENTER * dcy / distCenter;
54383
- for (let j = 0;j < snapshot.length; j++) {
54387
+ for (let j = 0;j < snap.length; j++) {
54384
54388
  if (i === j)
54385
54389
  continue;
54386
- const s2 = snapshot[j];
54390
+ const s2 = snap[j];
54387
54391
  const dx = s2.cx - s1.cx;
54388
54392
  const dy = s2.cy - s1.cy;
54389
- const distSq = dx * dx + dy * dy;
54390
- const dist = Math.sqrt(distSq) + 0.001;
54393
+ const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
54391
54394
  if (dist > this.MAX_DISTANCE)
54392
54395
  continue;
54393
- const minDist = (s1.w + s2.w + s1.h + s2.h) * 0.25;
54394
- if (dist < minDist) {
54395
- const repAcc = this.REPULSION / (distSq + this.SOFTENING_SQ);
54396
- ax -= repAcc * dx / dist;
54397
- ay -= repAcc * dy / dist;
54396
+ const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
54397
+ if (overlapping) {
54398
+ const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
54399
+ const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
54400
+ if (overlapX < overlapY) {
54401
+ const sign = s1.cx < s2.cx ? -1 : 1;
54402
+ ax += sign * this.REPULSION * overlapX;
54403
+ } else {
54404
+ const sign = s1.cy < s2.cy ? -1 : 1;
54405
+ ay += sign * this.REPULSION * overlapY;
54406
+ }
54398
54407
  } else {
54408
+ const distSq = dx * dx + dy * dy;
54399
54409
  const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
54400
54410
  ax += gravAcc * dx / dist;
54401
54411
  ay += gravAcc * dy / dist;
@@ -54437,14 +54447,7 @@ class GravityEngine {
54437
54447
  method: "applyMatrix",
54438
54448
  items: movedItems.map(({ id, dx, dy }) => ({
54439
54449
  id,
54440
- matrix: {
54441
- translateX: dx,
54442
- translateY: dy,
54443
- scaleX: 1,
54444
- scaleY: 1,
54445
- shearX: 0,
54446
- shearY: 0
54447
- }
54450
+ matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
54448
54451
  }))
54449
54452
  };
54450
54453
  this.board.events.emit(operation);
package/dist/cjs/node.js CHANGED
@@ -56783,7 +56783,7 @@ class GravityEngine {
56783
56783
  G = 80;
56784
56784
  G_CENTER = 120;
56785
56785
  DAMPING = 0.92;
56786
- REPULSION = 60000;
56786
+ REPULSION = 800;
56787
56787
  TICK_MS = 33;
56788
56788
  SYNC_MS = 300;
56789
56789
  MAX_DISTANCE = 3000;
@@ -56818,13 +56818,18 @@ class GravityEngine {
56818
56818
  const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
56819
56819
  if (items.length < 1)
56820
56820
  return;
56821
- const snapshot = items.map((item) => {
56821
+ const snap = items.map((item, idx) => {
56822
56822
  const pos = item.transformation.getTranslation();
56823
56823
  const mbr = item.getMbr();
56824
56824
  const w = Math.max(mbr.getWidth(), 1);
56825
56825
  const h2 = Math.max(mbr.getHeight(), 1);
56826
56826
  return {
56827
+ idx,
56827
56828
  id: item.getId(),
56829
+ left: pos.x,
56830
+ top: pos.y,
56831
+ right: pos.x + w,
56832
+ bottom: pos.y + h2,
56828
56833
  cx: pos.x + w * 0.5,
56829
56834
  cy: pos.y + h2 * 0.5,
56830
56835
  w,
@@ -56832,16 +56837,15 @@ class GravityEngine {
56832
56837
  mass: w * h2
56833
56838
  };
56834
56839
  });
56835
- let sumX = 0;
56836
- let sumY = 0;
56837
- for (const s2 of snapshot) {
56840
+ let sumX = 0, sumY = 0;
56841
+ for (const s2 of snap) {
56838
56842
  sumX += s2.cx;
56839
56843
  sumY += s2.cy;
56840
56844
  }
56841
- const centerX = sumX / snapshot.length;
56842
- const centerY = sumY / snapshot.length;
56843
- for (let i = 0;i < snapshot.length; i++) {
56844
- const s1 = snapshot[i];
56845
+ const centerX = sumX / snap.length;
56846
+ const centerY = sumY / snap.length;
56847
+ for (let i = 0;i < snap.length; i++) {
56848
+ const s1 = snap[i];
56845
56849
  if (!this.velocities.has(s1.id)) {
56846
56850
  this.velocities.set(s1.id, { vx: 0, vy: 0 });
56847
56851
  }
@@ -56853,22 +56857,28 @@ class GravityEngine {
56853
56857
  const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
56854
56858
  ax += this.G_CENTER * dcx / distCenter;
56855
56859
  ay += this.G_CENTER * dcy / distCenter;
56856
- for (let j = 0;j < snapshot.length; j++) {
56860
+ for (let j = 0;j < snap.length; j++) {
56857
56861
  if (i === j)
56858
56862
  continue;
56859
- const s2 = snapshot[j];
56863
+ const s2 = snap[j];
56860
56864
  const dx = s2.cx - s1.cx;
56861
56865
  const dy = s2.cy - s1.cy;
56862
- const distSq = dx * dx + dy * dy;
56863
- const dist = Math.sqrt(distSq) + 0.001;
56866
+ const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
56864
56867
  if (dist > this.MAX_DISTANCE)
56865
56868
  continue;
56866
- const minDist = (s1.w + s2.w + s1.h + s2.h) * 0.25;
56867
- if (dist < minDist) {
56868
- const repAcc = this.REPULSION / (distSq + this.SOFTENING_SQ);
56869
- ax -= repAcc * dx / dist;
56870
- ay -= repAcc * dy / dist;
56869
+ const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
56870
+ if (overlapping) {
56871
+ const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
56872
+ const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
56873
+ if (overlapX < overlapY) {
56874
+ const sign = s1.cx < s2.cx ? -1 : 1;
56875
+ ax += sign * this.REPULSION * overlapX;
56876
+ } else {
56877
+ const sign = s1.cy < s2.cy ? -1 : 1;
56878
+ ay += sign * this.REPULSION * overlapY;
56879
+ }
56871
56880
  } else {
56881
+ const distSq = dx * dx + dy * dy;
56872
56882
  const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
56873
56883
  ax += gravAcc * dx / dist;
56874
56884
  ay += gravAcc * dy / dist;
@@ -56910,14 +56920,7 @@ class GravityEngine {
56910
56920
  method: "applyMatrix",
56911
56921
  items: movedItems.map(({ id, dx, dy }) => ({
56912
56922
  id,
56913
- matrix: {
56914
- translateX: dx,
56915
- translateY: dy,
56916
- scaleX: 1,
56917
- scaleY: 1,
56918
- shearX: 0,
56919
- shearY: 0
56920
- }
56923
+ matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
56921
56924
  }))
56922
56925
  };
56923
56926
  this.board.events.emit(operation);
@@ -54139,7 +54139,7 @@ class GravityEngine {
54139
54139
  G = 80;
54140
54140
  G_CENTER = 120;
54141
54141
  DAMPING = 0.92;
54142
- REPULSION = 60000;
54142
+ REPULSION = 800;
54143
54143
  TICK_MS = 33;
54144
54144
  SYNC_MS = 300;
54145
54145
  MAX_DISTANCE = 3000;
@@ -54174,13 +54174,18 @@ class GravityEngine {
54174
54174
  const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
54175
54175
  if (items.length < 1)
54176
54176
  return;
54177
- const snapshot = items.map((item) => {
54177
+ const snap = items.map((item, idx) => {
54178
54178
  const pos = item.transformation.getTranslation();
54179
54179
  const mbr = item.getMbr();
54180
54180
  const w = Math.max(mbr.getWidth(), 1);
54181
54181
  const h2 = Math.max(mbr.getHeight(), 1);
54182
54182
  return {
54183
+ idx,
54183
54184
  id: item.getId(),
54185
+ left: pos.x,
54186
+ top: pos.y,
54187
+ right: pos.x + w,
54188
+ bottom: pos.y + h2,
54184
54189
  cx: pos.x + w * 0.5,
54185
54190
  cy: pos.y + h2 * 0.5,
54186
54191
  w,
@@ -54188,16 +54193,15 @@ class GravityEngine {
54188
54193
  mass: w * h2
54189
54194
  };
54190
54195
  });
54191
- let sumX = 0;
54192
- let sumY = 0;
54193
- for (const s2 of snapshot) {
54196
+ let sumX = 0, sumY = 0;
54197
+ for (const s2 of snap) {
54194
54198
  sumX += s2.cx;
54195
54199
  sumY += s2.cy;
54196
54200
  }
54197
- const centerX = sumX / snapshot.length;
54198
- const centerY = sumY / snapshot.length;
54199
- for (let i = 0;i < snapshot.length; i++) {
54200
- const s1 = snapshot[i];
54201
+ const centerX = sumX / snap.length;
54202
+ const centerY = sumY / snap.length;
54203
+ for (let i = 0;i < snap.length; i++) {
54204
+ const s1 = snap[i];
54201
54205
  if (!this.velocities.has(s1.id)) {
54202
54206
  this.velocities.set(s1.id, { vx: 0, vy: 0 });
54203
54207
  }
@@ -54209,22 +54213,28 @@ class GravityEngine {
54209
54213
  const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
54210
54214
  ax += this.G_CENTER * dcx / distCenter;
54211
54215
  ay += this.G_CENTER * dcy / distCenter;
54212
- for (let j = 0;j < snapshot.length; j++) {
54216
+ for (let j = 0;j < snap.length; j++) {
54213
54217
  if (i === j)
54214
54218
  continue;
54215
- const s2 = snapshot[j];
54219
+ const s2 = snap[j];
54216
54220
  const dx = s2.cx - s1.cx;
54217
54221
  const dy = s2.cy - s1.cy;
54218
- const distSq = dx * dx + dy * dy;
54219
- const dist = Math.sqrt(distSq) + 0.001;
54222
+ const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
54220
54223
  if (dist > this.MAX_DISTANCE)
54221
54224
  continue;
54222
- const minDist = (s1.w + s2.w + s1.h + s2.h) * 0.25;
54223
- if (dist < minDist) {
54224
- const repAcc = this.REPULSION / (distSq + this.SOFTENING_SQ);
54225
- ax -= repAcc * dx / dist;
54226
- ay -= repAcc * dy / dist;
54225
+ const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
54226
+ if (overlapping) {
54227
+ const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
54228
+ const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
54229
+ if (overlapX < overlapY) {
54230
+ const sign = s1.cx < s2.cx ? -1 : 1;
54231
+ ax += sign * this.REPULSION * overlapX;
54232
+ } else {
54233
+ const sign = s1.cy < s2.cy ? -1 : 1;
54234
+ ay += sign * this.REPULSION * overlapY;
54235
+ }
54227
54236
  } else {
54237
+ const distSq = dx * dx + dy * dy;
54228
54238
  const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
54229
54239
  ax += gravAcc * dx / dist;
54230
54240
  ay += gravAcc * dy / dist;
@@ -54266,14 +54276,7 @@ class GravityEngine {
54266
54276
  method: "applyMatrix",
54267
54277
  items: movedItems.map(({ id, dx, dy }) => ({
54268
54278
  id,
54269
- matrix: {
54270
- translateX: dx,
54271
- translateY: dy,
54272
- scaleX: 1,
54273
- scaleY: 1,
54274
- shearX: 0,
54275
- shearY: 0
54276
- }
54279
+ matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
54277
54280
  }))
54278
54281
  };
54279
54282
  this.board.events.emit(operation);
package/dist/esm/index.js CHANGED
@@ -54132,7 +54132,7 @@ class GravityEngine {
54132
54132
  G = 80;
54133
54133
  G_CENTER = 120;
54134
54134
  DAMPING = 0.92;
54135
- REPULSION = 60000;
54135
+ REPULSION = 800;
54136
54136
  TICK_MS = 33;
54137
54137
  SYNC_MS = 300;
54138
54138
  MAX_DISTANCE = 3000;
@@ -54167,13 +54167,18 @@ class GravityEngine {
54167
54167
  const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
54168
54168
  if (items.length < 1)
54169
54169
  return;
54170
- const snapshot = items.map((item) => {
54170
+ const snap = items.map((item, idx) => {
54171
54171
  const pos = item.transformation.getTranslation();
54172
54172
  const mbr = item.getMbr();
54173
54173
  const w = Math.max(mbr.getWidth(), 1);
54174
54174
  const h2 = Math.max(mbr.getHeight(), 1);
54175
54175
  return {
54176
+ idx,
54176
54177
  id: item.getId(),
54178
+ left: pos.x,
54179
+ top: pos.y,
54180
+ right: pos.x + w,
54181
+ bottom: pos.y + h2,
54177
54182
  cx: pos.x + w * 0.5,
54178
54183
  cy: pos.y + h2 * 0.5,
54179
54184
  w,
@@ -54181,16 +54186,15 @@ class GravityEngine {
54181
54186
  mass: w * h2
54182
54187
  };
54183
54188
  });
54184
- let sumX = 0;
54185
- let sumY = 0;
54186
- for (const s2 of snapshot) {
54189
+ let sumX = 0, sumY = 0;
54190
+ for (const s2 of snap) {
54187
54191
  sumX += s2.cx;
54188
54192
  sumY += s2.cy;
54189
54193
  }
54190
- const centerX = sumX / snapshot.length;
54191
- const centerY = sumY / snapshot.length;
54192
- for (let i = 0;i < snapshot.length; i++) {
54193
- const s1 = snapshot[i];
54194
+ const centerX = sumX / snap.length;
54195
+ const centerY = sumY / snap.length;
54196
+ for (let i = 0;i < snap.length; i++) {
54197
+ const s1 = snap[i];
54194
54198
  if (!this.velocities.has(s1.id)) {
54195
54199
  this.velocities.set(s1.id, { vx: 0, vy: 0 });
54196
54200
  }
@@ -54202,22 +54206,28 @@ class GravityEngine {
54202
54206
  const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
54203
54207
  ax += this.G_CENTER * dcx / distCenter;
54204
54208
  ay += this.G_CENTER * dcy / distCenter;
54205
- for (let j = 0;j < snapshot.length; j++) {
54209
+ for (let j = 0;j < snap.length; j++) {
54206
54210
  if (i === j)
54207
54211
  continue;
54208
- const s2 = snapshot[j];
54212
+ const s2 = snap[j];
54209
54213
  const dx = s2.cx - s1.cx;
54210
54214
  const dy = s2.cy - s1.cy;
54211
- const distSq = dx * dx + dy * dy;
54212
- const dist = Math.sqrt(distSq) + 0.001;
54215
+ const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
54213
54216
  if (dist > this.MAX_DISTANCE)
54214
54217
  continue;
54215
- const minDist = (s1.w + s2.w + s1.h + s2.h) * 0.25;
54216
- if (dist < minDist) {
54217
- const repAcc = this.REPULSION / (distSq + this.SOFTENING_SQ);
54218
- ax -= repAcc * dx / dist;
54219
- ay -= repAcc * dy / dist;
54218
+ const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
54219
+ if (overlapping) {
54220
+ const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
54221
+ const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
54222
+ if (overlapX < overlapY) {
54223
+ const sign = s1.cx < s2.cx ? -1 : 1;
54224
+ ax += sign * this.REPULSION * overlapX;
54225
+ } else {
54226
+ const sign = s1.cy < s2.cy ? -1 : 1;
54227
+ ay += sign * this.REPULSION * overlapY;
54228
+ }
54220
54229
  } else {
54230
+ const distSq = dx * dx + dy * dy;
54221
54231
  const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
54222
54232
  ax += gravAcc * dx / dist;
54223
54233
  ay += gravAcc * dy / dist;
@@ -54259,14 +54269,7 @@ class GravityEngine {
54259
54269
  method: "applyMatrix",
54260
54270
  items: movedItems.map(({ id, dx, dy }) => ({
54261
54271
  id,
54262
- matrix: {
54263
- translateX: dx,
54264
- translateY: dy,
54265
- scaleX: 1,
54266
- scaleY: 1,
54267
- shearX: 0,
54268
- shearY: 0
54269
- }
54272
+ matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
54270
54273
  }))
54271
54274
  };
54272
54275
  this.board.events.emit(operation);
package/dist/esm/node.js CHANGED
@@ -56600,7 +56600,7 @@ class GravityEngine {
56600
56600
  G = 80;
56601
56601
  G_CENTER = 120;
56602
56602
  DAMPING = 0.92;
56603
- REPULSION = 60000;
56603
+ REPULSION = 800;
56604
56604
  TICK_MS = 33;
56605
56605
  SYNC_MS = 300;
56606
56606
  MAX_DISTANCE = 3000;
@@ -56635,13 +56635,18 @@ class GravityEngine {
56635
56635
  const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
56636
56636
  if (items.length < 1)
56637
56637
  return;
56638
- const snapshot = items.map((item) => {
56638
+ const snap = items.map((item, idx) => {
56639
56639
  const pos = item.transformation.getTranslation();
56640
56640
  const mbr = item.getMbr();
56641
56641
  const w = Math.max(mbr.getWidth(), 1);
56642
56642
  const h2 = Math.max(mbr.getHeight(), 1);
56643
56643
  return {
56644
+ idx,
56644
56645
  id: item.getId(),
56646
+ left: pos.x,
56647
+ top: pos.y,
56648
+ right: pos.x + w,
56649
+ bottom: pos.y + h2,
56645
56650
  cx: pos.x + w * 0.5,
56646
56651
  cy: pos.y + h2 * 0.5,
56647
56652
  w,
@@ -56649,16 +56654,15 @@ class GravityEngine {
56649
56654
  mass: w * h2
56650
56655
  };
56651
56656
  });
56652
- let sumX = 0;
56653
- let sumY = 0;
56654
- for (const s2 of snapshot) {
56657
+ let sumX = 0, sumY = 0;
56658
+ for (const s2 of snap) {
56655
56659
  sumX += s2.cx;
56656
56660
  sumY += s2.cy;
56657
56661
  }
56658
- const centerX = sumX / snapshot.length;
56659
- const centerY = sumY / snapshot.length;
56660
- for (let i = 0;i < snapshot.length; i++) {
56661
- const s1 = snapshot[i];
56662
+ const centerX = sumX / snap.length;
56663
+ const centerY = sumY / snap.length;
56664
+ for (let i = 0;i < snap.length; i++) {
56665
+ const s1 = snap[i];
56662
56666
  if (!this.velocities.has(s1.id)) {
56663
56667
  this.velocities.set(s1.id, { vx: 0, vy: 0 });
56664
56668
  }
@@ -56670,22 +56674,28 @@ class GravityEngine {
56670
56674
  const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
56671
56675
  ax += this.G_CENTER * dcx / distCenter;
56672
56676
  ay += this.G_CENTER * dcy / distCenter;
56673
- for (let j = 0;j < snapshot.length; j++) {
56677
+ for (let j = 0;j < snap.length; j++) {
56674
56678
  if (i === j)
56675
56679
  continue;
56676
- const s2 = snapshot[j];
56680
+ const s2 = snap[j];
56677
56681
  const dx = s2.cx - s1.cx;
56678
56682
  const dy = s2.cy - s1.cy;
56679
- const distSq = dx * dx + dy * dy;
56680
- const dist = Math.sqrt(distSq) + 0.001;
56683
+ const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
56681
56684
  if (dist > this.MAX_DISTANCE)
56682
56685
  continue;
56683
- const minDist = (s1.w + s2.w + s1.h + s2.h) * 0.25;
56684
- if (dist < minDist) {
56685
- const repAcc = this.REPULSION / (distSq + this.SOFTENING_SQ);
56686
- ax -= repAcc * dx / dist;
56687
- ay -= repAcc * dy / dist;
56686
+ const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
56687
+ if (overlapping) {
56688
+ const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
56689
+ const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
56690
+ if (overlapX < overlapY) {
56691
+ const sign = s1.cx < s2.cx ? -1 : 1;
56692
+ ax += sign * this.REPULSION * overlapX;
56693
+ } else {
56694
+ const sign = s1.cy < s2.cy ? -1 : 1;
56695
+ ay += sign * this.REPULSION * overlapY;
56696
+ }
56688
56697
  } else {
56698
+ const distSq = dx * dx + dy * dy;
56689
56699
  const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
56690
56700
  ax += gravAcc * dx / dist;
56691
56701
  ay += gravAcc * dy / dist;
@@ -56727,14 +56737,7 @@ class GravityEngine {
56727
56737
  method: "applyMatrix",
56728
56738
  items: movedItems.map(({ id, dx, dy }) => ({
56729
56739
  id,
56730
- matrix: {
56731
- translateX: dx,
56732
- translateY: dy,
56733
- scaleX: 1,
56734
- scaleY: 1,
56735
- shearX: 0,
56736
- shearY: 0
56737
- }
56740
+ matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
56738
56741
  }))
56739
56742
  };
56740
56743
  this.board.events.emit(operation);
@@ -8,7 +8,7 @@ export declare class GravityEngine {
8
8
  readonly G = 80;
9
9
  readonly G_CENTER = 120;
10
10
  readonly DAMPING = 0.92;
11
- readonly REPULSION = 60000;
11
+ readonly REPULSION = 800;
12
12
  readonly TICK_MS = 33;
13
13
  readonly SYNC_MS = 300;
14
14
  readonly MAX_DISTANCE = 3000;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "microboard-temp",
3
- "version": "0.12.4",
3
+ "version": "0.12.5",
4
4
  "description": "A flexible interactive whiteboard library",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",