@jsenv/dom 0.17.7 → 0.17.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.
Files changed (2) hide show
  1. package/dist/jsenv_dom.js +224 -29
  2. package/package.json +1 -1
package/dist/jsenv_dom.js CHANGED
@@ -7491,6 +7491,86 @@ const trapScrollInside = (element, { boundaryElement } = {}) => {
7491
7491
  };
7492
7492
  };
7493
7493
 
7494
+ /**
7495
+ * Who is answering the wheel gesture happening right now.
7496
+ *
7497
+ * A wheel gesture has no beginning and no end of its own: it is a burst of
7498
+ * events that starts when the fingers move and goes on after they are gone —
7499
+ * the tail of it is the momentum the system keeps sending. And it has no target
7500
+ * either: every event is aimed at whatever happens to be under the pointer at
7501
+ * that instant. So a burst that began over one box lands on another as soon as
7502
+ * the hand drifts, or as soon as what was under it has travelled away — and
7503
+ * read box by box, ONE gesture is answered twice: a slide moves, then the box
7504
+ * around it moves too, under a hand that pushed once.
7505
+ *
7506
+ * Hence an owner. Whoever answers a burst first says so, everyone else asks
7507
+ * before answering, and the owner keeps it until the events stop coming.
7508
+ * Silence is the only end there is, which is why an owner has to say it is
7509
+ * still there on every event of its gesture — a claim nobody renews is a
7510
+ * gesture that is over.
7511
+ */
7512
+
7513
+ // How long a silence ends a gesture, for an owner that says nothing else: long
7514
+ // enough to survive a page that is busy — the frames right after something sets
7515
+ // off are the ones where the main thread has the most to do, and a silence read
7516
+ // there as "the hand is gone" would cut one gesture into several.
7517
+ const GESTURE_END_DELAY = 150;
7518
+
7519
+ let gestureOwner = null;
7520
+ let gestureOnEnd = null;
7521
+ let gestureEndTimeout = null;
7522
+
7523
+ const endGesture = () => {
7524
+ const onEnd = gestureOnEnd;
7525
+ gestureOwner = null;
7526
+ gestureOnEnd = null;
7527
+ gestureEndTimeout = null;
7528
+ onEnd?.();
7529
+ };
7530
+
7531
+ /**
7532
+ * Is the burst going on right now somebody else's? Asked before answering a
7533
+ * wheel event: `false` means it is free, or already this one's.
7534
+ */
7535
+ const wheelGestureIsTakenFrom = (candidate) =>
7536
+ gestureOwner !== null && gestureOwner !== candidate;
7537
+
7538
+ /**
7539
+ * Take the gesture, or say it is still going. Called on every event of it: the
7540
+ * claim lapses on its own once `delay` goes by without a word, and `onEnd` is
7541
+ * how the owner hears about that — it is the only end a wheel gesture has.
7542
+ *
7543
+ * @param {any} owner - anything that can be compared, usually the element.
7544
+ * @param {object} [options]
7545
+ * @param {() => void} [options.onEnd] - the silence was long enough.
7546
+ * @param {number} [options.delay] - how long that silence is.
7547
+ */
7548
+ const claimWheelGesture = (
7549
+ owner,
7550
+ { onEnd, delay = GESTURE_END_DELAY } = {},
7551
+ ) => {
7552
+ if (wheelGestureIsTakenFrom(owner)) {
7553
+ return false;
7554
+ }
7555
+ gestureOwner = owner;
7556
+ gestureOnEnd = onEnd;
7557
+ clearTimeout(gestureEndTimeout);
7558
+ gestureEndTimeout = setTimeout(endGesture, delay);
7559
+ return true;
7560
+ };
7561
+
7562
+ /**
7563
+ * Give it back before the silence does — the box is going away, the gesture was
7564
+ * handed to something else. Whoever does not own it says nothing.
7565
+ */
7566
+ const releaseWheelGesture = (owner) => {
7567
+ if (gestureOwner !== owner) {
7568
+ return;
7569
+ }
7570
+ clearTimeout(gestureEndTimeout);
7571
+ endGesture();
7572
+ };
7573
+
7494
7574
  /**
7495
7575
  * Creates intuitive scrolling behavior when scrolling over an element that needs to stay interactive
7496
7576
  * (we can't use pointer-events: none). Instead of scrolling the document unexpectedly,
@@ -11853,12 +11933,15 @@ installImportMetaCssBuild(import.meta);/**
11853
11933
  * what to paint while the finger moves. The caller knows those and nothing else
11854
11934
  * does — this reads the gesture and calls back.
11855
11935
  *
11856
- * Who owns a gesture is decided in two places, and both are read here:
11936
+ * Who owns a gesture is decided in three places, and all three are read here:
11857
11937
  * - what says so itself, with [data-no-drag-travel] or by being a field — a
11858
11938
  * component that reads the pointer marks itself, because the container it
11859
11939
  * ends up in cannot know what it is;
11860
11940
  * - a scroller between the pointer and the box with room left that way, which
11861
- * keeps the gesture until it has none.
11941
+ * keeps the gesture until it has none;
11942
+ * - another box that travels, between the pointer and this one: the innermost
11943
+ * one walks the axis it walks, and leaves the others whatever axis it does
11944
+ * not (see axesLeftBy).
11862
11945
  */
11863
11946
 
11864
11947
  // While a pointer is on something that travels: said on the document, because
@@ -11910,7 +11993,9 @@ import.meta.css = [/* css */`
11910
11993
  /* A drag over text selects it on the way, and the blue trail says the
11911
11994
  gesture was understood as something else. Not from the press: a press on
11912
11995
  text IS how one selects it, and only a press that has become a travel has
11913
- said it was about something else. */
11996
+ said it was about something else — which is also why this cannot be the
11997
+ whole answer, and why the selection made meanwhile is dropped by hand
11998
+ (see dropSelection). */
11914
11999
  user-select: none;
11915
12000
  }
11916
12001
  `, "@jsenv/dom/src/interaction/drag/drag_to_travel.js"];
@@ -11938,6 +12023,79 @@ const DRAG_RESISTANCE = 0.3;
11938
12023
  // click it would have made is swallowed on the way out.
11939
12024
  const DRAG_EXCLUDED_SELECTOR = ["input", "textarea", "select", '[contenteditable=""]', '[contenteditable="true"]', "[data-no-drag-travel]"].join(",");
11940
12025
 
12026
+ // Which axes a box travels on, one attribute per gesture, said in the DOM by
12027
+ // whoever owns the box: it is what a box ABOVE another reads to know the
12028
+ // gesture is not its own, and the DOM is the only place where that is knowable
12029
+ // from the outside.
12030
+ const DRAG_AXES_ATTRIBUTE = "data-travel-by-drag";
12031
+ const WHEEL_AXES_ATTRIBUTE = "data-travel-by-wheel";
12032
+
12033
+ /**
12034
+ * What is left for this box of the axes it travels, once the boxes it CONTAINS
12035
+ * have taken theirs: a row of slides inside a page that walks between pages, a
12036
+ * carousel inside a carousel. Both get the same press (it bubbles), both answer
12037
+ * the same finger, and the one under it is the one the hand is pointing at — so
12038
+ * the innermost takes the axes it walks, and what it does not walk is left to
12039
+ * whoever is above: a row swiped sideways inside a column of screens keeps the
12040
+ * sideways gesture, and the column still answers a finger going down.
12041
+ *
12042
+ * Read at the press and nowhere else, because that is the only moment where the
12043
+ * order is still ours: from the first pixel the gesture is held by whoever asked
12044
+ * the browser for the pointer LAST, which is the outermost box — the wrong one,
12045
+ * and past that point the inner one stops being told anything. So the box that
12046
+ * does not own the gesture must never ask for it.
12047
+ */
12048
+ const axesLeftBy = (axes, fromElement, stopElement, attribute) => {
12049
+ if (!stopElement.contains(fromElement)) {
12050
+ // Not a press that came up through this box: a browser view transition
12051
+ // delivers one to the document root instead, and the caller hands it over
12052
+ // by hand. Nothing was walked past, so nothing was taken.
12053
+ return axes;
12054
+ }
12055
+ let left = axes;
12056
+ let element = fromElement;
12057
+ while (element && element !== stopElement && element.nodeType === 1) {
12058
+ const taken = element.getAttribute(attribute);
12059
+ if (taken) {
12060
+ let rest = "";
12061
+ for (const axis of left) {
12062
+ if (!taken.includes(axis)) {
12063
+ rest += axis;
12064
+ }
12065
+ }
12066
+ left = rest;
12067
+ if (!left) {
12068
+ return "";
12069
+ }
12070
+ }
12071
+ element = element.parentElement;
12072
+ }
12073
+ return left;
12074
+ };
12075
+
12076
+ /**
12077
+ * What the browser painted blue while it was still allowed to think this press
12078
+ * was about text.
12079
+ *
12080
+ * A mouse dragged across a page selects what it crosses, and it starts doing so
12081
+ * from the first pixel — while this is still spending ten of them deciding
12082
+ * whether the press is a travel at all. By the time it is one, a trail is
12083
+ * already there. `user-select: none` (see the CSS) stops it GROWING, it does not
12084
+ * take back what was made, and a selection already under way goes on being
12085
+ * extended by some browsers whatever the property says.
12086
+ *
12087
+ * So it is dropped, and dropped again as it comes back. The cause is outside —
12088
+ * one gesture, two things answering it, and the browser answers first — and
12089
+ * cannot be removed from here; what can be removed is its trace, on every frame
12090
+ * of a travel that is walking.
12091
+ */
12092
+ const dropSelection = () => {
12093
+ const selection = window.getSelection();
12094
+ if (selection && !selection.isCollapsed) {
12095
+ selection.removeAllRanges();
12096
+ }
12097
+ };
12098
+
11941
12099
  /**
11942
12100
  * A scroller between the pointer and the box it is in, with room left the way
11943
12101
  * the gesture goes: it gets the gesture, and nothing travels — dragging a row
@@ -12028,7 +12186,10 @@ const travelsAfter = ({
12028
12186
  * travel, which the element under the finger may not.
12029
12187
  * @param {"x"|"y"|"xy"} [options.axes="xy"] - which ways this box can travel. A
12030
12188
  * finger leaning on any other axis is given up on at once, whole, so whatever
12031
- * else wants it (a scroller, the page) gets it whole.
12189
+ * else wants it (a scroller, the page) gets it whole. An axis a box NESTED in
12190
+ * this one travels is not one of them: it is that box's, and this call
12191
+ * returns null when nothing is left (see axesLeftBy). Say so in the DOM with
12192
+ * [data-travel-by-drag] for the boxes above to read.
12032
12193
  * @param {false|"x"|"y"} [options.immediate=false] - the axis this press is
12033
12194
  * already on, for a press that landed on something moving: the gesture is
12034
12195
  * then read from its first pixel instead of waiting for an intent, and every
@@ -12075,6 +12236,19 @@ const startDragToTravel = (pointerDownEvent, {
12075
12236
  if (!target.closest || target.closest(DRAG_EXCLUDED_SELECTOR)) {
12076
12237
  return null;
12077
12238
  }
12239
+ // A box between the finger and this one that travels the same way: the
12240
+ // gesture is its, and this one is left with the axes it does not walk — none
12241
+ // at all, most of the time, and then there is no gesture here to read.
12242
+ const axesLeft = axesLeftBy(axes, target, element, DRAG_AXES_ATTRIBUTE);
12243
+ if (!axesLeft) {
12244
+ return null;
12245
+ }
12246
+ // What was caught in flight travels on an axis of its own, and it is not up
12247
+ // for decision: a box below has taken that axis, so what this press caught it
12248
+ // cannot carry on either.
12249
+ if (immediate && !axesLeft.includes(immediate)) {
12250
+ return null;
12251
+ }
12078
12252
 
12079
12253
  // The travel in hand: null until the finger has picked an axis and the caller
12080
12254
  // has accepted it.
@@ -12188,7 +12362,7 @@ const startDragToTravel = (pointerDownEvent, {
12188
12362
  return;
12189
12363
  }
12190
12364
  axis = reachX >= reachY ? "x" : "y";
12191
- if (!axes.includes(axis)) {
12365
+ if (!axesLeft.includes(axis)) {
12192
12366
  giveUp();
12193
12367
  return;
12194
12368
  }
@@ -12233,6 +12407,9 @@ const startDragToTravel = (pointerDownEvent, {
12233
12407
  };
12234
12408
  document.documentElement.setAttribute(WALKING_ATTRIBUTE, axis);
12235
12409
  }
12410
+ // Whatever the press was taken for until now, it was taken for something
12411
+ // else (see dropSelection).
12412
+ dropSelection();
12236
12413
  const {
12237
12414
  axis
12238
12415
  } = travel;
@@ -12294,6 +12471,10 @@ const startDragToTravel = (pointerDownEvent, {
12294
12471
  return;
12295
12472
  }
12296
12473
  finish();
12474
+ // Last chance: the pointer moves once more as it goes up, and by then the
12475
+ // attribute above is off — so a trail made on that last move would be the
12476
+ // one that stays (see dropSelection).
12477
+ dropSelection();
12297
12478
  const {
12298
12479
  axis,
12299
12480
  size,
@@ -12361,14 +12542,6 @@ const startDragToTravel = (pointerDownEvent, {
12361
12542
  };
12362
12543
  };
12363
12544
 
12364
- // A wheel gesture has no beginning and no end of its own: it is a stream of
12365
- // events that starts when the fingers move and stops some time after they are
12366
- // gone — the tail of it is the momentum the system keeps sending. So the end is
12367
- // read from silence, and long enough to survive a page that is busy: the frames
12368
- // right after a travel sets off are the ones where the main thread has the most
12369
- // to do, and a silence read there as "the hand is gone" would cut one gesture
12370
- // into several.
12371
- const WHEEL_GESTURE_END_DELAY = 150;
12372
12545
  // What each screen AFTER the first costs inside one gesture. Deliberately
12373
12546
  // steep: reconstructing "how much did that flick mean" from a stream nobody
12374
12547
  // agrees on is guesswork, and a guess that overshoots leaves someone three
@@ -12407,6 +12580,12 @@ const WHEEL_FADE_RUN = 2;
12407
12580
  * no idea how they got there. Under-shooting costs one more push, so that is
12408
12581
  * the side to be wrong on.
12409
12582
  *
12583
+ * A burst has no target either — every event lands on whatever is under the
12584
+ * pointer at that instant — so it is CLAIMED at its first event and answered to
12585
+ * the end wherever the pointer wanders (see wheel_gesture.js). Without that, a
12586
+ * hand pushing a nested carousel and drifting off it walks a slide, then walks
12587
+ * the box around it, on one push.
12588
+ *
12410
12589
  * The rest of the stream is mostly momentum, still arriving with the fingers
12411
12590
  * gone, and it must not be counted. What gives it away is that momentum only
12412
12591
  * ever WEAKENS: a stream that keeps shrinking is a push already answered, and a
@@ -12415,7 +12594,9 @@ const WHEEL_FADE_RUN = 2;
12415
12594
  * @param {Element} element
12416
12595
  * @param {object} options
12417
12596
  * @param {"x"|"y"|"xy"} [options.axes="xy"] - which ways this box can travel.
12418
- * The other one is the content's own scrolling and is left alone.
12597
+ * The other one is the content's own scrolling and is left alone, and an axis
12598
+ * a box NESTED in this one travels is that box's (see axesLeftBy). Say so in
12599
+ * the DOM with [data-travel-by-wheel] for the boxes above to read.
12419
12600
  * @param {(detail: {axis: string, sign: number, event: WheelEvent}) => void} options.onStep
12420
12601
  * - one push, one screen. `sign` is positive towards the start of the axis,
12421
12602
  * which brings in what comes BEFORE — a wheel says how far the CONTENT
@@ -12427,9 +12608,7 @@ const watchWheelTravel = (element, {
12427
12608
  onStep
12428
12609
  }) => {
12429
12610
  let gesture = null;
12430
- let endTimeout = null;
12431
12611
  const forgetGesture = () => {
12432
- endTimeout = null;
12433
12612
  gesture = null;
12434
12613
  document.documentElement.removeAttribute(GESTURE_ATTRIBUTE);
12435
12614
  document.documentElement.removeAttribute(WALKING_ATTRIBUTE);
@@ -12471,7 +12650,10 @@ const watchWheelTravel = (element, {
12471
12650
  return clientX >= left && clientX <= right && clientY >= top && clientY <= bottom;
12472
12651
  };
12473
12652
  const onWheel = wheelEvent => {
12474
- if (!isOverElement(wheelEvent)) {
12653
+ // The burst is already somebody else's — the box inside this one, a wheel
12654
+ // picker, whoever answered its first event. It is theirs to the end of it,
12655
+ // wherever the pointer has drifted since (see wheel_gesture.js).
12656
+ if (wheelGestureIsTakenFrom(element)) {
12475
12657
  return;
12476
12658
  }
12477
12659
  const axis = Math.abs(wheelEvent.deltaX) > Math.abs(wheelEvent.deltaY) ? "x" : "y";
@@ -12484,19 +12666,30 @@ const watchWheelTravel = (element, {
12484
12666
  // right.
12485
12667
  const sign = delta > 0 ? -1 : 1;
12486
12668
  if (!gesture) {
12669
+ // Where the hand is pushing, asked at the START of a burst and never
12670
+ // again: from there on the gesture is this box's, and a pointer that has
12671
+ // wandered off it says nothing about what the hand is pushing.
12672
+ if (!isOverElement(wheelEvent)) {
12673
+ return;
12674
+ }
12487
12675
  if (!axes.includes(axis)) {
12488
12676
  // The other axis: the content's own scrolling, left whole to whatever
12489
12677
  // wants it.
12490
12678
  return;
12491
12679
  }
12492
12680
  // Who owns it, asked once for the gesture rather than for every event of
12493
- // it — the same two claims a press is read against (see the top of this
12494
- // file), and both are answered by giving the gesture up whole: nothing is
12495
- // prevented and the browser scrolls as it would have.
12681
+ // it — the same claims a press is read against (see the top of this
12682
+ // file), and all of them are answered by giving the gesture up whole:
12683
+ // nothing is prevented and the browser scrolls as it would have.
12496
12684
  const {
12497
12685
  target
12498
12686
  } = wheelEvent;
12499
- if (target.closest && target.closest(DRAG_EXCLUDED_SELECTOR) || scrollRoomTowards(target, element, axis, sign)) {
12687
+ if (target.closest && target.closest(DRAG_EXCLUDED_SELECTOR) || scrollRoomTowards(target, element, axis, sign) ||
12688
+ // …plus the third: a box below this one that travels on this axis. Its
12689
+ // watcher hears the same wheel event this one does — they all listen at
12690
+ // the document — so without this both step, and one push moves two
12691
+ // things.
12692
+ !axesLeftBy(axis, target, element, WHEEL_AXES_ATTRIBUTE)) {
12500
12693
  return;
12501
12694
  }
12502
12695
  gesture = {
@@ -12514,8 +12707,11 @@ const watchWheelTravel = (element, {
12514
12707
  // — scroll the page behind the box, bounce it, go back in history — is one
12515
12708
  // gesture answered twice.
12516
12709
  wheelEvent.preventDefault();
12517
- clearTimeout(endTimeout);
12518
- endTimeout = setTimeout(forgetGesture, WHEEL_GESTURE_END_DELAY);
12710
+ // …and said on every event of it, because a claim nobody renews is a
12711
+ // gesture that is over: silence is the only end a wheel has.
12712
+ claimWheelGesture(element, {
12713
+ onEnd: forgetGesture
12714
+ });
12519
12715
  if (axis !== gesture.axis) {
12520
12716
  // The other axis mid-gesture: a hand is never perfectly straight, and the
12521
12717
  // axis was decided when the gesture set off.
@@ -12572,11 +12768,10 @@ const watchWheelTravel = (element, {
12572
12768
  document.removeEventListener("wheel", onWheel, {
12573
12769
  capture: true
12574
12770
  });
12575
- clearTimeout(endTimeout);
12576
- endTimeout = null;
12577
- gesture = null;
12578
- document.documentElement.removeAttribute(GESTURE_ATTRIBUTE);
12579
- document.documentElement.removeAttribute(WALKING_ATTRIBUTE);
12771
+ // Handed back rather than left to lapse: a box that is gone must not hold a
12772
+ // gesture the boxes still there are asking about.
12773
+ releaseWheelGesture(element);
12774
+ forgetGesture();
12580
12775
  };
12581
12776
  };
12582
12777
 
@@ -18117,4 +18312,4 @@ const useResizeStatus = (elementRef, { as = "number" } = {}) => {
18117
18312
  };
18118
18313
  };
18119
18314
 
18120
- export { EASING, ELEMENT_SIZE_CHANGE, activeElementSignal, addActiveElementEffect, addAttributeEffect, allowWheelThrough, appendStyles, applyNewPosition, canScroll, captureScrollState, chainEvent, closestOpenableAncestor, contrastColor, createBackgroundColorTransition, createBackgroundTransition, createBorderRadiusTransition, createBorderTransition, createDragGestureController, createDragToMoveGestureController, createEventGroupLogger, createGroupTransitionController, createHeightTransition, createIterableWeakSet, createOpacityTransition, createPubSub, createStyleController, createTimelineTransition, createTransition, createTranslateXTransition, createValueEffect, createWidthTransition, cubicBezier, dispatchCustomEvent, dispatchInternalCustomEvent, dispatchPublicCustomEvent, dragAfterIntent, elementIsFocusable, elementIsVisibleForFocus, elementIsVisuallyVisible, findAfter, findAncestor, findBefore, findDescendant, findEvent, findFocusDelegateTarget, findFocusable, findSelfOrAncestorFixedPosition, formatEventSideEffect, getAncestorOpenType, getAvailableHeight, getAvailableWidth, getBackground, getBackgroundColor, getBorder, getBorderRadius, getBorderSizes, getContrastRatio, getDefaultStyles, getDragCoordinates, getDropTargetInfo, getElementSignature, getFirstVisuallyVisibleAncestor, getFocusVisibilityInfo, getHeight, getHeightWithoutTransition, getInnerHeight, getInnerWidth, getKeyboardEventDefaultAction, getLuminance, getMarginSizes, getMaxHeight, getMaxWidth, getMinHeight, getMinWidth, getOpacity, getOpacityWithoutTransition, getPaddingSizes, getPositionedParent, getPositioningScrollOffset, getPreferedColorScheme, getScrollBox, getScrollContainer, getScrollContainerSet, getScrollRelativeRect, getSelfAndAncestorScrolls, getStyle, getTranslateX, getTranslateXWithoutTransition, getTranslateY, getVisuallyVisibleInfo, getWidth, getWidthWithoutTransition, hasCSSSizeUnit, initFlexDetailsSet, initFocusGroup, initPositionSticky, isAncestorOpen, isPrimaryButtonEvent, isSameColor, isScrollable, measureLongestVisualLineWidth, measureScrollbar, measureWidestChildRow, mergeOneStyle, mergeTwoStyles, normalizeKeyboardKey, normalizeStyle, normalizeStyles, observeAncestorOpenState, onAncestorReopen, parsePositionArea, parseStyle, performTabNavigation, pickPositionRelativeTo, prefersDarkColors, prefersLightColors, preventFocusNav, preventFocusNavViaKeyboard, preventIntermediateScrollbar, resolveCSSColor, resolveCSSSize, resolveColorLuminance, resolveOklchLightness, scrollIntoViewScoped, scrollIntoViewWithStickyAwareness, scrollRoomTowards, setAttribute, setAttributes, setStyles, snapToPixel, startDragToReorder, startDragToResizeGesture, startDragToTravel, stickyAsRelativeCoords, stringifyStyle, subscribeVisualViewportResizeSettled, subscribeWindowResizeSettled, trapFocusInside, trapScrollInside, useActiveElement, useAvailableHeight, useAvailableWidth, useMaxHeight, useMaxWidth, useResizeStatus, visibleRectEffect, watchWheelTravel };
18315
+ export { EASING, ELEMENT_SIZE_CHANGE, activeElementSignal, addActiveElementEffect, addAttributeEffect, allowWheelThrough, appendStyles, applyNewPosition, canScroll, captureScrollState, chainEvent, claimWheelGesture, closestOpenableAncestor, contrastColor, createBackgroundColorTransition, createBackgroundTransition, createBorderRadiusTransition, createBorderTransition, createDragGestureController, createDragToMoveGestureController, createEventGroupLogger, createGroupTransitionController, createHeightTransition, createIterableWeakSet, createOpacityTransition, createPubSub, createStyleController, createTimelineTransition, createTransition, createTranslateXTransition, createValueEffect, createWidthTransition, cubicBezier, dispatchCustomEvent, dispatchInternalCustomEvent, dispatchPublicCustomEvent, dragAfterIntent, elementIsFocusable, elementIsVisibleForFocus, elementIsVisuallyVisible, findAfter, findAncestor, findBefore, findDescendant, findEvent, findFocusDelegateTarget, findFocusable, findSelfOrAncestorFixedPosition, formatEventSideEffect, getAncestorOpenType, getAvailableHeight, getAvailableWidth, getBackground, getBackgroundColor, getBorder, getBorderRadius, getBorderSizes, getContrastRatio, getDefaultStyles, getDragCoordinates, getDropTargetInfo, getElementSignature, getFirstVisuallyVisibleAncestor, getFocusVisibilityInfo, getHeight, getHeightWithoutTransition, getInnerHeight, getInnerWidth, getKeyboardEventDefaultAction, getLuminance, getMarginSizes, getMaxHeight, getMaxWidth, getMinHeight, getMinWidth, getOpacity, getOpacityWithoutTransition, getPaddingSizes, getPositionedParent, getPositioningScrollOffset, getPreferedColorScheme, getScrollBox, getScrollContainer, getScrollContainerSet, getScrollRelativeRect, getSelfAndAncestorScrolls, getStyle, getTranslateX, getTranslateXWithoutTransition, getTranslateY, getVisuallyVisibleInfo, getWidth, getWidthWithoutTransition, hasCSSSizeUnit, initFlexDetailsSet, initFocusGroup, initPositionSticky, isAncestorOpen, isPrimaryButtonEvent, isSameColor, isScrollable, measureLongestVisualLineWidth, measureScrollbar, measureWidestChildRow, mergeOneStyle, mergeTwoStyles, normalizeKeyboardKey, normalizeStyle, normalizeStyles, observeAncestorOpenState, onAncestorReopen, parsePositionArea, parseStyle, performTabNavigation, pickPositionRelativeTo, prefersDarkColors, prefersLightColors, preventFocusNav, preventFocusNavViaKeyboard, preventIntermediateScrollbar, releaseWheelGesture, resolveCSSColor, resolveCSSSize, resolveColorLuminance, resolveOklchLightness, scrollIntoViewScoped, scrollIntoViewWithStickyAwareness, scrollRoomTowards, setAttribute, setAttributes, setStyles, snapToPixel, startDragToReorder, startDragToResizeGesture, startDragToTravel, stickyAsRelativeCoords, stringifyStyle, subscribeVisualViewportResizeSettled, subscribeWindowResizeSettled, trapFocusInside, trapScrollInside, useActiveElement, useAvailableHeight, useAvailableWidth, useMaxHeight, useMaxWidth, useResizeStatus, visibleRectEffect, watchWheelTravel, wheelGestureIsTakenFrom };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/dom",
3
- "version": "0.17.7",
3
+ "version": "0.17.9",
4
4
  "type": "module",
5
5
  "description": "DOM utilities for writing frontend code",
6
6
  "repository": {