@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.
- package/dist/jsenv_dom.js +265 -216
- 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
|
-
|
|
7462
|
-
|
|
7469
|
+
|
|
7470
|
+
installImportMetaCssBuild(import.meta);const css$2 = /* css */`
|
|
7471
|
+
.navi_constraint_feedback_line {
|
|
7463
7472
|
position: fixed;
|
|
7464
|
-
|
|
7465
|
-
|
|
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
|
-
|
|
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 =
|
|
8784
|
-
showDebugMarkers =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
9263
|
+
intersectingIndex = intersectingTargets.indexOf(tableRow);
|
|
9221
9264
|
break;
|
|
9222
9265
|
}
|
|
9223
9266
|
}
|
|
9224
9267
|
if (!targetElement) {
|
|
9225
9268
|
targetElement = intersectingTargets[0];
|
|
9226
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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);
|