@jsenv/dom 0.10.4 → 0.10.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.
Files changed (2) hide show
  1. package/dist/jsenv_dom.js +265 -216
  2. package/package.json +1 -1
package/dist/jsenv_dom.js CHANGED
@@ -6956,6 +6956,13 @@ installImportMetaCssBuild(import.meta);/**
6956
6956
  * donc juste x/y ca seras surement mieux
6957
6957
  *
6958
6958
  */
6959
+ const css$3 = /* css */`
6960
+ .navi_drag_gesture_backdrop {
6961
+ position: fixed;
6962
+ inset: 0;
6963
+ user-select: none;
6964
+ }
6965
+ `;
6959
6966
  const createDragGestureController = (options = {}) => {
6960
6967
  const {
6961
6968
  name,
@@ -7102,6 +7109,7 @@ const createDragGestureController = (options = {}) => {
7102
7109
 
7103
7110
  // 2. VISUAL CONTROL: Backdrop for consistent cursor and pointer event blocking
7104
7111
  if (backdrop) {
7112
+ import.meta.css = [css$3, "@jsenv/dom/src/interaction/drag/drag_gesture.js"];
7105
7113
  const backdropElement = document.createElement("div");
7106
7114
  backdropElement.className = "navi_drag_gesture_backdrop";
7107
7115
  backdropElement.ariaHidden = "true";
@@ -7458,15 +7466,24 @@ const definePropertyAsReadOnly = (object, propertyName) => {
7458
7466
  value: object[propertyName]
7459
7467
  });
7460
7468
  };
7461
- import.meta.css = [/* css */`
7462
- .navi_drag_gesture_backdrop {
7469
+
7470
+ installImportMetaCssBuild(import.meta);const css$2 = /* css */`
7471
+ .navi_constraint_feedback_line {
7463
7472
  position: fixed;
7464
- inset: 0;
7465
- user-select: none;
7473
+ z-index: 9998;
7474
+ border-top: 2px dotted rgba(59, 130, 246, 0.7);
7475
+ visibility: hidden;
7476
+ transform-origin: left center;
7477
+ transition: opacity 0.15s ease;
7478
+ pointer-events: none;
7466
7479
  }
7467
- `, "@jsenv/dom/src/interaction/drag/drag_gesture.js"];
7468
7480
 
7469
- installImportMetaCssBuild(import.meta);const setupConstraintFeedbackLine = () => {
7481
+ .navi_constraint_feedback_line[data-visible] {
7482
+ visibility: visible;
7483
+ }
7484
+ `;
7485
+ const setupConstraintFeedbackLine = () => {
7486
+ import.meta.css = [css$2, "@jsenv/dom/src/interaction/drag/constraint_feedback_line.js"];
7470
7487
  const constraintFeedbackLine = createConstraintFeedbackLine();
7471
7488
 
7472
7489
  // Track last known mouse position for constraint feedback line during scroll
@@ -7539,21 +7556,6 @@ const createConstraintFeedbackLine = () => {
7539
7556
  document.body.appendChild(line);
7540
7557
  return line;
7541
7558
  };
7542
- import.meta.css = [/* css */`
7543
- .navi_constraint_feedback_line {
7544
- position: fixed;
7545
- z-index: 9998;
7546
- border-top: 2px dotted rgba(59, 130, 246, 0.7);
7547
- visibility: hidden;
7548
- transform-origin: left center;
7549
- transition: opacity 0.15s ease;
7550
- pointer-events: none;
7551
- }
7552
-
7553
- .navi_constraint_feedback_line[data-visible] {
7554
- visibility: visible;
7555
- }
7556
- `, "@jsenv/dom/src/interaction/drag/constraint_feedback_line.js"];
7557
7559
 
7558
7560
  installImportMetaCssBuild(import.meta);// Keep visual markers (debug markers, obstacle markers, constraint feedback line) in DOM after drag ends
7559
7561
  const MARKER_SIZE = 12;
@@ -7561,9 +7563,197 @@ let currentDebugMarkers = [];
7561
7563
  let currentConstraintMarkers = [];
7562
7564
  let currentReferenceElementMarker = null;
7563
7565
  let currentElementMarker = null;
7566
+ const css$1 = /* css */`
7567
+ .navi_debug_markers_container {
7568
+ position: fixed;
7569
+ top: 0;
7570
+ left: 0;
7571
+ z-index: 999998;
7572
+ width: 100vw;
7573
+ height: 100vh;
7574
+ pointer-events: none;
7575
+ overflow: hidden;
7576
+ --marker-size: ${MARKER_SIZE}px;
7577
+ }
7578
+
7579
+ .navi_debug_marker {
7580
+ position: absolute;
7581
+ pointer-events: none;
7582
+ }
7583
+
7584
+ /* Markers based on side rather than orientation */
7585
+ .navi_debug_marker[data-left],
7586
+ .navi_debug_marker[data-right] {
7587
+ width: var(--marker-size);
7588
+ height: 100vh;
7589
+ }
7590
+
7591
+ .navi_debug_marker[data-top],
7592
+ .navi_debug_marker[data-bottom] {
7593
+ width: 100vw;
7594
+ height: var(--marker-size);
7595
+ }
7596
+
7597
+ /* Gradient directions based on side, using CSS custom properties for color */
7598
+ .navi_debug_marker[data-left] {
7599
+ background: linear-gradient(
7600
+ to right,
7601
+ rgba(from var(--marker-color) r g b / 0.9) 0%,
7602
+ rgba(from var(--marker-color) r g b / 0.7) 30%,
7603
+ rgba(from var(--marker-color) r g b / 0.3) 70%,
7604
+ rgba(from var(--marker-color) r g b / 0) 100%
7605
+ );
7606
+ }
7607
+
7608
+ .navi_debug_marker[data-right] {
7609
+ background: linear-gradient(
7610
+ to left,
7611
+ rgba(from var(--marker-color) r g b / 0.9) 0%,
7612
+ rgba(from var(--marker-color) r g b / 0.7) 30%,
7613
+ rgba(from var(--marker-color) r g b / 0.3) 70%,
7614
+ rgba(from var(--marker-color) r g b / 0) 100%
7615
+ );
7616
+ }
7617
+
7618
+ .navi_debug_marker[data-top] {
7619
+ background: linear-gradient(
7620
+ to bottom,
7621
+ rgba(from var(--marker-color) r g b / 0.9) 0%,
7622
+ rgba(from var(--marker-color) r g b / 0.7) 30%,
7623
+ rgba(from var(--marker-color) r g b / 0.3) 70%,
7624
+ rgba(from var(--marker-color) r g b / 0) 100%
7625
+ );
7626
+ }
7627
+
7628
+ .navi_debug_marker[data-bottom] {
7629
+ background: linear-gradient(
7630
+ to top,
7631
+ rgba(from var(--marker-color) r g b / 0.9) 0%,
7632
+ rgba(from var(--marker-color) r g b / 0.7) 30%,
7633
+ rgba(from var(--marker-color) r g b / 0.3) 70%,
7634
+ rgba(from var(--marker-color) r g b / 0) 100%
7635
+ );
7636
+ }
7637
+
7638
+ .navi_debug_marker_label {
7639
+ position: absolute;
7640
+ padding: 2px 6px;
7641
+ color: rgb(from var(--marker-color) r g b / 1);
7642
+ font-weight: bold;
7643
+ font-size: 12px;
7644
+ white-space: nowrap;
7645
+ background: rgba(255, 255, 255, 0.9);
7646
+ border: 1px solid;
7647
+ border-color: rgb(from var(--marker-color) r g b / 1);
7648
+ border-radius: 3px;
7649
+ pointer-events: none;
7650
+ }
7651
+
7652
+ /* Label positioning based on side data attributes */
7653
+
7654
+ /* Left side markers - vertical with 90° rotation */
7655
+ .navi_debug_marker[data-left] .navi_debug_marker_label {
7656
+ top: 20px;
7657
+ left: 10px;
7658
+ transform: rotate(90deg);
7659
+ transform-origin: left center;
7660
+ }
7661
+
7662
+ /* Right side markers - vertical with -90° rotation */
7663
+ .navi_debug_marker[data-right] .navi_debug_marker_label {
7664
+ top: 20px;
7665
+ right: 10px;
7666
+ left: auto;
7667
+ transform: rotate(-90deg);
7668
+ transform-origin: right center;
7669
+ }
7670
+
7671
+ /* Top side markers - horizontal, label on the line */
7672
+ .navi_debug_marker[data-top] .navi_debug_marker_label {
7673
+ top: 0px;
7674
+ left: 20px;
7675
+ }
7676
+
7677
+ /* Bottom side markers - horizontal, label on the line */
7678
+ .navi_debug_marker[data-bottom] .navi_debug_marker_label {
7679
+ top: auto;
7680
+ bottom: 0px;
7681
+ left: 20px;
7682
+ }
7683
+
7684
+ .navi_obstacle_marker {
7685
+ position: absolute;
7686
+ z-index: 9999;
7687
+ background-color: orange;
7688
+ opacity: 0.6;
7689
+ pointer-events: none;
7690
+ }
7691
+
7692
+ .navi_obstacle_marker_label {
7693
+ position: absolute;
7694
+ top: 50%;
7695
+ left: 50%;
7696
+ color: white;
7697
+ font-weight: bold;
7698
+ font-size: 12px;
7699
+ text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8);
7700
+ transform: translate(-50%, -50%);
7701
+ pointer-events: none;
7702
+ }
7703
+
7704
+ .navi_element_marker {
7705
+ position: absolute;
7706
+ z-index: 9997;
7707
+ background-color: var(--element-color-alpha, rgba(255, 0, 150, 0.3));
7708
+ border: 2px solid var(--element-color, rgb(255, 0, 150));
7709
+ opacity: 0.9;
7710
+ pointer-events: none;
7711
+ }
7712
+
7713
+ .navi_element_marker_label {
7714
+ position: absolute;
7715
+ top: -25px;
7716
+ right: 0;
7717
+ padding: 2px 6px;
7718
+ color: var(--element-color, rgb(255, 0, 150));
7719
+ font-weight: bold;
7720
+ font-size: 11px;
7721
+ white-space: nowrap;
7722
+ background: rgba(255, 255, 255, 0.9);
7723
+ border: 1px solid var(--element-color, rgb(255, 0, 150));
7724
+ border-radius: 3px;
7725
+ pointer-events: none;
7726
+ }
7727
+
7728
+ .navi_reference_element_marker {
7729
+ position: absolute;
7730
+ z-index: 9998;
7731
+ background-color: rgba(0, 150, 255, 0.3);
7732
+ border: 2px dashed rgba(0, 150, 255, 0.7);
7733
+ opacity: 0.8;
7734
+ pointer-events: none;
7735
+ }
7736
+
7737
+ .navi_reference_element_marker_label {
7738
+ position: absolute;
7739
+ top: -25px;
7740
+ left: 0;
7741
+ padding: 2px 6px;
7742
+ color: rgba(0, 150, 255, 1);
7743
+ font-weight: bold;
7744
+ font-size: 11px;
7745
+ white-space: nowrap;
7746
+ background: rgba(255, 255, 255, 0.9);
7747
+ border: 1px solid rgba(0, 150, 255, 0.7);
7748
+ border-radius: 3px;
7749
+ pointer-events: none;
7750
+ }
7751
+ `;
7564
7752
  const setupDragDebugMarkers = (dragGesture, {
7565
7753
  referenceElement
7566
7754
  }) => {
7755
+ import.meta.css = [css$1, "@jsenv/dom/src/interaction/drag/drag_debug_markers.js"];
7756
+
7567
7757
  // Clean up any existing persistent markers from previous drag gestures
7568
7758
  {
7569
7759
  // Remove any existing markers from previous gestures
@@ -7950,192 +8140,6 @@ const createReferenceElementMarker = ({
7950
8140
  container.appendChild(marker);
7951
8141
  return marker;
7952
8142
  };
7953
- import.meta.css = [/* css */`
7954
- .navi_debug_markers_container {
7955
- position: fixed;
7956
- top: 0;
7957
- left: 0;
7958
- z-index: 999998;
7959
- width: 100vw;
7960
- height: 100vh;
7961
- pointer-events: none;
7962
- overflow: hidden;
7963
- --marker-size: ${MARKER_SIZE}px;
7964
- }
7965
-
7966
- .navi_debug_marker {
7967
- position: absolute;
7968
- pointer-events: none;
7969
- }
7970
-
7971
- /* Markers based on side rather than orientation */
7972
- .navi_debug_marker[data-left],
7973
- .navi_debug_marker[data-right] {
7974
- width: var(--marker-size);
7975
- height: 100vh;
7976
- }
7977
-
7978
- .navi_debug_marker[data-top],
7979
- .navi_debug_marker[data-bottom] {
7980
- width: 100vw;
7981
- height: var(--marker-size);
7982
- }
7983
-
7984
- /* Gradient directions based on side, using CSS custom properties for color */
7985
- .navi_debug_marker[data-left] {
7986
- background: linear-gradient(
7987
- to right,
7988
- rgba(from var(--marker-color) r g b / 0.9) 0%,
7989
- rgba(from var(--marker-color) r g b / 0.7) 30%,
7990
- rgba(from var(--marker-color) r g b / 0.3) 70%,
7991
- rgba(from var(--marker-color) r g b / 0) 100%
7992
- );
7993
- }
7994
-
7995
- .navi_debug_marker[data-right] {
7996
- background: linear-gradient(
7997
- to left,
7998
- rgba(from var(--marker-color) r g b / 0.9) 0%,
7999
- rgba(from var(--marker-color) r g b / 0.7) 30%,
8000
- rgba(from var(--marker-color) r g b / 0.3) 70%,
8001
- rgba(from var(--marker-color) r g b / 0) 100%
8002
- );
8003
- }
8004
-
8005
- .navi_debug_marker[data-top] {
8006
- background: linear-gradient(
8007
- to bottom,
8008
- rgba(from var(--marker-color) r g b / 0.9) 0%,
8009
- rgba(from var(--marker-color) r g b / 0.7) 30%,
8010
- rgba(from var(--marker-color) r g b / 0.3) 70%,
8011
- rgba(from var(--marker-color) r g b / 0) 100%
8012
- );
8013
- }
8014
-
8015
- .navi_debug_marker[data-bottom] {
8016
- background: linear-gradient(
8017
- to top,
8018
- rgba(from var(--marker-color) r g b / 0.9) 0%,
8019
- rgba(from var(--marker-color) r g b / 0.7) 30%,
8020
- rgba(from var(--marker-color) r g b / 0.3) 70%,
8021
- rgba(from var(--marker-color) r g b / 0) 100%
8022
- );
8023
- }
8024
-
8025
- .navi_debug_marker_label {
8026
- position: absolute;
8027
- padding: 2px 6px;
8028
- color: rgb(from var(--marker-color) r g b / 1);
8029
- font-weight: bold;
8030
- font-size: 12px;
8031
- white-space: nowrap;
8032
- background: rgba(255, 255, 255, 0.9);
8033
- border: 1px solid;
8034
- border-color: rgb(from var(--marker-color) r g b / 1);
8035
- border-radius: 3px;
8036
- pointer-events: none;
8037
- }
8038
-
8039
- /* Label positioning based on side data attributes */
8040
-
8041
- /* Left side markers - vertical with 90° rotation */
8042
- .navi_debug_marker[data-left] .navi_debug_marker_label {
8043
- top: 20px;
8044
- left: 10px;
8045
- transform: rotate(90deg);
8046
- transform-origin: left center;
8047
- }
8048
-
8049
- /* Right side markers - vertical with -90° rotation */
8050
- .navi_debug_marker[data-right] .navi_debug_marker_label {
8051
- top: 20px;
8052
- right: 10px;
8053
- left: auto;
8054
- transform: rotate(-90deg);
8055
- transform-origin: right center;
8056
- }
8057
-
8058
- /* Top side markers - horizontal, label on the line */
8059
- .navi_debug_marker[data-top] .navi_debug_marker_label {
8060
- top: 0px;
8061
- left: 20px;
8062
- }
8063
-
8064
- /* Bottom side markers - horizontal, label on the line */
8065
- .navi_debug_marker[data-bottom] .navi_debug_marker_label {
8066
- top: auto;
8067
- bottom: 0px;
8068
- left: 20px;
8069
- }
8070
-
8071
- .navi_obstacle_marker {
8072
- position: absolute;
8073
- z-index: 9999;
8074
- background-color: orange;
8075
- opacity: 0.6;
8076
- pointer-events: none;
8077
- }
8078
-
8079
- .navi_obstacle_marker_label {
8080
- position: absolute;
8081
- top: 50%;
8082
- left: 50%;
8083
- color: white;
8084
- font-weight: bold;
8085
- font-size: 12px;
8086
- text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8);
8087
- transform: translate(-50%, -50%);
8088
- pointer-events: none;
8089
- }
8090
-
8091
- .navi_element_marker {
8092
- position: absolute;
8093
- z-index: 9997;
8094
- background-color: var(--element-color-alpha, rgba(255, 0, 150, 0.3));
8095
- border: 2px solid var(--element-color, rgb(255, 0, 150));
8096
- opacity: 0.9;
8097
- pointer-events: none;
8098
- }
8099
-
8100
- .navi_element_marker_label {
8101
- position: absolute;
8102
- top: -25px;
8103
- right: 0;
8104
- padding: 2px 6px;
8105
- color: var(--element-color, rgb(255, 0, 150));
8106
- font-weight: bold;
8107
- font-size: 11px;
8108
- white-space: nowrap;
8109
- background: rgba(255, 255, 255, 0.9);
8110
- border: 1px solid var(--element-color, rgb(255, 0, 150));
8111
- border-radius: 3px;
8112
- pointer-events: none;
8113
- }
8114
-
8115
- .navi_reference_element_marker {
8116
- position: absolute;
8117
- z-index: 9998;
8118
- background-color: rgba(0, 150, 255, 0.3);
8119
- border: 2px dashed rgba(0, 150, 255, 0.7);
8120
- opacity: 0.8;
8121
- pointer-events: none;
8122
- }
8123
-
8124
- .navi_reference_element_marker_label {
8125
- position: absolute;
8126
- top: -25px;
8127
- left: 0;
8128
- padding: 2px 6px;
8129
- color: rgba(0, 150, 255, 1);
8130
- font-weight: bold;
8131
- font-size: 11px;
8132
- white-space: nowrap;
8133
- background: rgba(255, 255, 255, 0.9);
8134
- border: 1px solid rgba(0, 150, 255, 0.7);
8135
- border-radius: 3px;
8136
- pointer-events: none;
8137
- }
8138
- `, "@jsenv/dom/src/interaction/drag/drag_debug_markers.js"];
8139
8143
 
8140
8144
  const initDragConstraints = (
8141
8145
  dragGesture,
@@ -8767,6 +8771,7 @@ const createStickyFrontierOnAxis = (
8767
8771
  const dragStyleController = createStyleController("drag_to_move");
8768
8772
 
8769
8773
  const createDragToMoveGestureController = ({
8774
+ cloneOnDrag = false,
8770
8775
  stickyFrontiers = true,
8771
8776
  // Padding to reduce the area used to autoscroll by this amount (applied after sticky frontiers)
8772
8777
  // This creates an invisible space around the area where elements cannot be dragged
@@ -8780,8 +8785,8 @@ const createDragToMoveGestureController = ({
8780
8785
  // position due to obstacles, boundaries, or other constraints. The line originates from where the mouse
8781
8786
  // initially grabbed the element, but moves with the element to show the current anchor position.
8782
8787
  // It becomes visible when there's a significant distance between mouse and grab point.
8783
- showConstraintFeedbackLine = true,
8784
- showDebugMarkers = true,
8788
+ showConstraintFeedbackLine = false,
8789
+ showDebugMarkers = false,
8785
8790
  resetPositionAfterRelease = false,
8786
8791
  ...options
8787
8792
  } = {}) => {
@@ -8789,6 +8794,18 @@ const createDragToMoveGestureController = ({
8789
8794
  dragGesture,
8790
8795
  { element, referenceElement, elementToMove, convertScrollablePosition },
8791
8796
  ) => {
8797
+ if (cloneOnDrag) {
8798
+ const { grabEvent } = dragGesture.gestureInfo;
8799
+ const ghostData = createDragGhost(element, {
8800
+ clientX: grabEvent.clientX,
8801
+ clientY: grabEvent.clientY,
8802
+ });
8803
+ elementToMove = ghostData.ghostWrapper;
8804
+ dragGesture.gestureInfo.elementImpacted = ghostData.ghostWrapper;
8805
+ dragGesture.addReleaseCallback(() => {
8806
+ ghostData.remove();
8807
+ });
8808
+ }
8792
8809
  const direction = dragGesture.gestureInfo.direction;
8793
8810
  // const dragGestureName = dragGesture.gestureInfo.name;
8794
8811
  const scrollContainer = dragGesture.gestureInfo.scrollContainer;
@@ -9058,6 +9075,31 @@ const createDragToMoveGestureController = ({
9058
9075
  return dragGestureController;
9059
9076
  };
9060
9077
 
9078
+ const createDragGhost = (element, pointerEvent) => {
9079
+ const rect = element.getBoundingClientRect();
9080
+
9081
+ const ghost = element.cloneNode(true);
9082
+ ghost.dataset.dragging = "";
9083
+ ghost.style.pointerEvents = "none";
9084
+ // transform-origin set to pointer position within the element for natural scale expansion
9085
+ const originX = pointerEvent.clientX - rect.left;
9086
+ const originY = pointerEvent.clientY - rect.top;
9087
+ ghost.style.transformOrigin = `${originX}px ${originY}px`;
9088
+
9089
+ const ghostWrapper = document.createElement("div");
9090
+ ghostWrapper.style.cssText = `position: absolute; pointer-events: none; z-index: 9999; top: ${rect.top + window.scrollY}px; left: ${rect.left + window.scrollX}px; width: ${rect.width}px;`;
9091
+ ghostWrapper.appendChild(ghost);
9092
+ document.body.appendChild(ghostWrapper);
9093
+
9094
+ return {
9095
+ ghost,
9096
+ ghostWrapper,
9097
+ remove: () => {
9098
+ ghostWrapper.remove();
9099
+ },
9100
+ };
9101
+ };
9102
+
9061
9103
  const startDragToResizeGesture = (
9062
9104
  pointerdownEvent,
9063
9105
  { onDragStart, onDrag, onRelease, ...options },
@@ -9133,7 +9175,7 @@ const getResizeDirection = (element) => {
9133
9175
  * @returns {Object|null} Drop target info with elementSide or null if no valid target found
9134
9176
  */
9135
9177
  const getDropTargetInfo = (gestureInfo, targetElements) => {
9136
- const dragElement = gestureInfo.element;
9178
+ const dragElement = gestureInfo.elementImpacted || gestureInfo.element;
9137
9179
  const dragElementRect = dragElement.getBoundingClientRect();
9138
9180
  const intersectingTargets = [];
9139
9181
  let someTargetIsCol;
@@ -9178,12 +9220,13 @@ const getDropTargetInfo = (gestureInfo, targetElements) => {
9178
9220
  const elementsUnderDragElement = document.elementsFromPoint(clientX, clientY);
9179
9221
  let targetElement = null;
9180
9222
  let targetIndex = -1;
9223
+ let intersectingIndex = -1;
9181
9224
  for (const element of elementsUnderDragElement) {
9182
9225
  // First, check if the element itself is a target
9183
9226
  const directIndex = intersectingTargets.indexOf(element);
9184
9227
  if (directIndex !== -1) {
9185
9228
  targetElement = element;
9186
- targetIndex = directIndex;
9229
+ intersectingIndex = directIndex;
9187
9230
  break;
9188
9231
  }
9189
9232
  // Special case: if element is <td> or <th> and not in targets,
@@ -9204,7 +9247,7 @@ const getDropTargetInfo = (gestureInfo, targetElements) => {
9204
9247
  break try_col;
9205
9248
  }
9206
9249
  targetElement = tableCellCol;
9207
- targetIndex = colIndex;
9250
+ intersectingIndex = colIndex;
9208
9251
  break;
9209
9252
  }
9210
9253
  try_tr: {
@@ -9217,26 +9260,31 @@ const getDropTargetInfo = (gestureInfo, targetElements) => {
9217
9260
  break try_tr;
9218
9261
  }
9219
9262
  targetElement = tableRow;
9220
- targetIndex = rowIndex;
9263
+ intersectingIndex = intersectingTargets.indexOf(tableRow);
9221
9264
  break;
9222
9265
  }
9223
9266
  }
9224
9267
  if (!targetElement) {
9225
9268
  targetElement = intersectingTargets[0];
9226
- targetIndex = 0;
9269
+ intersectingIndex = 0;
9227
9270
  }
9271
+ targetIndex = targetElements.indexOf(targetElement);
9228
9272
 
9229
9273
  // Determine position within the target for both axes
9230
9274
  const targetRect = targetElement.getBoundingClientRect();
9231
9275
  const targetCenterX = targetRect.left + targetRect.width / 2;
9232
9276
  const targetCenterY = targetRect.top + targetRect.height / 2;
9233
9277
  const result = {
9278
+ // Index of the target element within the original targetElements array
9234
9279
  index: targetIndex,
9235
9280
  element: targetElement,
9236
9281
  elementSide: {
9237
9282
  x: dragElementRect.left < targetCenterX ? "start" : "end",
9238
9283
  y: dragElementRect.top < targetCenterY ? "start" : "end",
9239
9284
  },
9285
+ // Index within the intersecting subset — could be useful to know how many
9286
+ // elements were overlapping, but rarely needed in practice
9287
+ intersectingIndex,
9240
9288
  intersecting: intersectingTargets,
9241
9289
  };
9242
9290
  return result;
@@ -9321,15 +9369,16 @@ installImportMetaCssBuild(import.meta);/**
9321
9369
  *
9322
9370
  * The element should have a CSS "top" value specified (e.g., top: 10px).
9323
9371
  */
9324
- import.meta.css = [/* css */`
9372
+ const css = /* css */`
9325
9373
  [data-position-sticky-placeholder] {
9326
9374
  position: static !important;
9327
9375
  width: auto !important;
9328
9376
  height: auto !important;
9329
9377
  opacity: 0 !important;
9330
9378
  }
9331
- `, "@jsenv/dom/src/position/position_sticky.js"];
9379
+ `;
9332
9380
  const initPositionSticky = element => {
9381
+ import.meta.css = [css, "@jsenv/dom/src/position/position_sticky.js"];
9333
9382
  const computedStyle = getComputedStyle(element);
9334
9383
  const topCssValue = computedStyle.top;
9335
9384
  const top = parseFloat(topCssValue);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/dom",
3
- "version": "0.10.4",
3
+ "version": "0.10.5",
4
4
  "type": "module",
5
5
  "description": "DOM utilities for writing frontend code",
6
6
  "repository": {