@jsenv/dom 0.17.60 → 0.17.62

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 +179 -114
  2. package/package.json +3 -3
package/dist/jsenv_dom.js CHANGED
@@ -2134,6 +2134,9 @@ const parseCSSTransform = (transformString, normalize) => {
2134
2134
  }
2135
2135
 
2136
2136
  const transformObj = {};
2137
+ // Set as soon as a part of the transform cannot be said with named keys
2138
+ // (a complex 3D matrix, a function whose value we cannot normalize).
2139
+ let somethingCouldNotBeRead = false;
2137
2140
 
2138
2141
  for (const { functionName, value, source } of readTransformFunctions(
2139
2142
  transformString,
@@ -2144,20 +2147,32 @@ const parseCSSTransform = (transformString, normalize) => {
2144
2147
  if (matrixComponents) {
2145
2148
  // Only add non-default values to preserve original information
2146
2149
  Object.assign(transformObj, matrixComponents);
2150
+ } else {
2151
+ // If matrix can't be parsed to simple components, skip it (keep complex transforms as-is)
2152
+ somethingCouldNotBeRead = true;
2147
2153
  }
2148
- // If matrix can't be parsed to simple components, skip it (keep complex transforms as-is)
2149
2154
  continue;
2150
2155
  }
2151
2156
 
2152
2157
  // Handle regular transform functions
2153
2158
  const normalizedValue = normalize(value.trim(), functionName, "js");
2154
- if (normalizedValue !== undefined) {
2155
- transformObj[functionName] = normalizedValue;
2159
+ if (normalizedValue === undefined) {
2160
+ somethingCouldNotBeRead = true;
2161
+ continue;
2156
2162
  }
2163
+ transformObj[functionName] = normalizedValue;
2157
2164
  }
2158
2165
 
2159
- // Return undefined if no properties were extracted (preserves original information)
2160
- return Object.keys(transformObj).length > 0 ? transformObj : undefined;
2166
+ // Nothing was extracted: either the transform truly holds nothing worth naming
2167
+ // (an identity matrix, what "translateX(0px)" computes to), which is an empty
2168
+ // object, or it holds something we could not read, which is undefined —
2169
+ // "there is a transform here, do not treat it as none". The two must not be
2170
+ // confused: an empty object stringifies back to "none" and would wipe a
2171
+ // transform we merely failed to understand.
2172
+ if (Object.keys(transformObj).length === 0 && somethingCouldNotBeRead) {
2173
+ return undefined;
2174
+ }
2175
+ return transformObj;
2161
2176
  };
2162
2177
 
2163
2178
  // Cuts "translateX(10px) translateY(env(safe-area-inset-top))" into its
@@ -2627,17 +2642,32 @@ const normalizeStyle = (
2627
2642
  return value;
2628
2643
  }
2629
2644
  const transformProperty = propertyName.slice(10); // Remove "transform." prefix
2645
+ const getDefaultTransformPartValue = () => {
2646
+ if (transformProperty.startsWith("scale")) {
2647
+ return 1;
2648
+ }
2649
+ // translate, rotate, skew
2650
+ return 0;
2651
+ };
2630
2652
  // If value is a CSS transform string, parse it first to extract the specific property
2631
2653
  if (typeof value === "string") {
2632
2654
  if (value === "none") {
2633
- if (transformProperty.startsWith("scale")) {
2634
- return 1;
2635
- }
2636
- // translate, rotate, skew
2637
- return 0;
2655
+ return getDefaultTransformPartValue();
2638
2656
  }
2639
2657
  const parsedTransform = parseCSSTransform(value, normalizeStyle);
2640
- return parsedTransform?.[transformProperty];
2658
+ if (!parsedTransform) {
2659
+ // The transform could not be read as named parts; we know nothing about
2660
+ // this one, and saying 0 would be inventing a position.
2661
+ return undefined;
2662
+ }
2663
+ const transformPartValue = parsedTransform[transformProperty];
2664
+ if (transformPartValue === undefined) {
2665
+ // The transform was read and does not translate/rotate/scale on this
2666
+ // axis: that is the default value, not the absence of an answer.
2667
+ // "rotate(45deg)" has a translateX, and it is 0.
2668
+ return getDefaultTransformPartValue();
2669
+ }
2670
+ return transformPartValue;
2641
2671
  }
2642
2672
  // If value is a transform object, extract the property directly
2643
2673
  if (typeof value === "object" && value !== null) {
@@ -4675,6 +4705,105 @@ const waitForPressHeld = (
4675
4705
  };
4676
4706
  };
4677
4707
 
4708
+ /**
4709
+ * A press that turns out to be a tap: let go of before it went anywhere.
4710
+ *
4711
+ * The counterpart of the hold next door (press_held.js). That one is a press
4712
+ * saying something by NOT moving for long enough; this one is a press saying
4713
+ * something by being BRIEF — and it is the same ambiguity read from the other
4714
+ * end, so a caller that reads both gets one press told apart once.
4715
+ *
4716
+ * Its reason to exist is what a tap is NOT: a `click` is the browser's answer to
4717
+ * the same question and it cannot be counted, because a browser withholds the
4718
+ * clicks of a gesture it is keeping for itself — two taps in a row on a page
4719
+ * that can be double-tap-zoomed produce two `pointerup` and a single `click`.
4720
+ * Anything counting presses (a double click that has to mean the same thing
4721
+ * under a finger and under a mouse) therefore has to read the pointer, and this
4722
+ * is that read: one press in, "it stayed a tap" out.
4723
+ *
4724
+ * What disqualifies a press is exactly what says it became a gesture: it
4725
+ * travelled (past `slop`), or the browser took the touch for itself
4726
+ * (`pointercancel` — a scroll starting under the finger, the system's own
4727
+ * double-tap zoom). How LONG it lasted is not asked here: a press held still is
4728
+ * a tap for as long as the hand wants, and whether a slow one still counts
4729
+ * towards whatever is being counted belongs to the counter, which is the only
4730
+ * one that knows what rhythm it is looking for.
4731
+ */
4732
+
4733
+ // How far the pointer may travel and still be a tap. Wider than a hold's slop
4734
+ // because it is a different question: a hold asks whether a finger is standing
4735
+ // still, a tap only asks whether the press went somewhere — and between two of
4736
+ // them the finger LEAVES the glass, so what a counter compares is fingertips
4737
+ // apart rather than pixels apart.
4738
+ const TAP_SLOP_DEFAULT = 30;
4739
+
4740
+ /**
4741
+ * Watches one press and says whether it stayed a tap.
4742
+ *
4743
+ * @param {PointerEvent} pressEvent The `pointerdown` that may be a tap.
4744
+ * @param {object} options
4745
+ * @param {number} [options.slop=30] How far (px) the pointer may travel before
4746
+ * the press is a gesture rather than a tap.
4747
+ * @param {(tapEvent: PointerEvent) => void} options.onTap The press was let go
4748
+ * of, having gone nowhere.
4749
+ * @returns {{ cancel: () => void }} Somebody else settled what the press is.
4750
+ */
4751
+ const waitForTap = (pressEvent, { slop = TAP_SLOP_DEFAULT, onTap }) => {
4752
+ const { pointerId, clientX, clientY } = pressEvent;
4753
+
4754
+ const cleanupCallbacks = [];
4755
+ const stopWatching = () => {
4756
+ for (const cleanupCallback of cleanupCallbacks) {
4757
+ cleanupCallback();
4758
+ }
4759
+ cleanupCallbacks.length = 0;
4760
+ };
4761
+
4762
+ const onPointerMove = (pointerMoveEvent) => {
4763
+ if (pointerMoveEvent.pointerId !== pointerId) {
4764
+ return;
4765
+ }
4766
+ const xTravel = Math.abs(pointerMoveEvent.clientX - clientX);
4767
+ const yTravel = Math.abs(pointerMoveEvent.clientY - clientY);
4768
+ if (xTravel < slop && yTravel < slop) {
4769
+ return;
4770
+ }
4771
+ // The press is going somewhere: it is scrolling, swiping, panning, carrying
4772
+ // something. Whatever it is, it is not a tap.
4773
+ stopWatching();
4774
+ };
4775
+ const onPointerUp = (pointerUpEvent) => {
4776
+ if (pointerUpEvent.pointerId !== pointerId) {
4777
+ return;
4778
+ }
4779
+ stopWatching();
4780
+ onTap(pointerUpEvent);
4781
+ };
4782
+ // Not the hand letting go: the browser saying it is taking the touch for a
4783
+ // gesture of its own, which is the one press that ends without ever having
4784
+ // been anybody else's.
4785
+ const onPointerCancel = (pointerCancelEvent) => {
4786
+ if (pointerCancelEvent.pointerId !== pointerId) {
4787
+ return;
4788
+ }
4789
+ stopWatching();
4790
+ };
4791
+ // On window rather than on the element: the pointer can leave it, and the
4792
+ // element itself can be taken out of the document while the press is watched.
4793
+ window.addEventListener("pointermove", onPointerMove);
4794
+ window.addEventListener("pointerup", onPointerUp);
4795
+ window.addEventListener("pointercancel", onPointerCancel);
4796
+ cleanupCallbacks.push(() => {
4797
+ window.removeEventListener("pointermove", onPointerMove);
4798
+ window.removeEventListener("pointerup", onPointerUp);
4799
+ window.removeEventListener("pointercancel", onPointerCancel);
4800
+ });
4801
+
4802
+ return {
4803
+ cancel: stopWatching,
4804
+ };
4805
+ };
4806
+
4678
4807
  const activeElementSignal = signal(
4679
4808
  typeof document === "object" ? document.activeElement : undefined,
4680
4809
  );
@@ -8472,7 +8601,7 @@ const installImportMetaCssBuild = (importMeta) => {
8472
8601
  const stylesheet = new CSSStyleSheet({ baseUrl: importMeta.url });
8473
8602
  stylesheet.replaceSync(value);
8474
8603
  stylesheetMap.set(url, stylesheet);
8475
- document.adoptedStyleSheets = [...document.adoptedStyleSheets, stylesheet];
8604
+ document.adoptedStyleSheets.push(stylesheet);
8476
8605
  };
8477
8606
  const update = (url, value) => {
8478
8607
  stylesheetMap.get(url).replaceSync(value);
@@ -12038,113 +12167,44 @@ const findTableCellCol = (cellElement) => {
12038
12167
  installImportMetaCssBuild(import.meta);
12039
12168
 
12040
12169
  // While a pointer is on something that travels: said on the document, because
12041
- // what has to be told is the document.
12170
+ // what has to be told is the document. The selector below writes it out rather
12171
+ // than reading this constant: a substitution in a selector is one the build
12172
+ // cannot read, and it ships the whole stylesheet unparsed and uncompressed.
12042
12173
  const GESTURE_ATTRIBUTE = "data-drag-travel-gesture";
12043
12174
 
12044
12175
  // …and while one is actually travelling something, which is a later moment and
12045
12176
  // takes more away (see the CSS).
12046
12177
  const WALKING_ATTRIBUTE = "data-drag-travel-walking";
12047
12178
 
12048
- import.meta.css = /* css */ [`
12049
- :root[${GESTURE_ATTRIBUTE}] {
12050
- /* The bounce the browser plays when a gesture reaches the end of a page —
12051
- and the swipe that goes back in history with it. Both are the browser
12052
- answering a gesture that is already answered, here, by what the finger is
12053
- dragging: the page rocks under a travel that is doing its own moving, and
12054
- one gesture is seen twice. From the press, because the browser starts
12055
- answering from the press — waiting for the first pixel that travels would
12056
- let it happen once, every time. Only while a finger is down, so a page
12057
- that bounces the rest of the time goes on bouncing. */
12058
- overscroll-behavior: none;
12059
- }
12060
- /* …and nothing inside a travelling box hands its leftovers to what is above
12061
- it: a list that reaches its end passes what is left of the gesture up the
12062
- chain, and the page moves behind a travel that is being dragged.
12063
-
12064
- Written ONCE AND FOR ALL rather than while a finger is down, unlike
12065
- everything else here: a browser decides what a gesture may do when the
12066
- gesture BEGINS — at the touchstart, at the first wheel event — and a
12067
- property written after that decision arrives too late for the gesture it
12068
- was meant for. That is what "most of the time it does not move, sometimes
12069
- it does" is made of.
12070
-
12071
- On the axis the box travels on, and that one only: the other axis is the
12072
- content's own scrolling and is left alone. Containing does not stop it from
12073
- scrolling anyway — it stops it from spilling over.
12074
-
12075
- !important because this is not a preference: a box that travels cannot let
12076
- the page travel with it, and the rule has to win over whatever an
12077
- application says about its own scrollers.
12078
-
12079
- Said on the box, where it is a statement about the box and not about what
12080
- it happens to hold — and read only where a browser asks the box at all:
12081
- one that CLIPS is asked (it is a scroll container, which is what "asked"
12082
- means to a browser), one that does not is walked past. A box that travels
12083
- usually clips, because moving something in and out of a box is what
12084
- clipping is for. One that does not still travels — what an inner scroller
12085
- has left over reaches the page there, and the rule below says why that is
12086
- the lesser of the two prices. An application that knows which of ITS
12087
- elements scroll can contain those itself, on the element every engine
12088
- reads; nothing in here can know that from a stylesheet. */
12089
- [data-drag-travel*="x"] {
12090
- overscroll-behavior-x: contain !important;
12091
- }
12092
- [data-drag-travel*="y"] {
12093
- overscroll-behavior-y: contain !important;
12094
- }
12095
- /* The scrollers a browser makes on its own, wherever they are inside the box:
12096
- a textarea and a list of options scroll their own content by nature, and
12097
- nobody had to say so for them — no stylesheet declared them, so nothing
12098
- else here can find them, and they would hand what is left of a gesture to
12099
- the page like any undeclared scroller does.
12100
-
12101
- Named rather than found, because being native is exactly what makes them
12102
- nameable. An input is NOT in the list: it is the one form control that has
12103
- nothing to scroll on the axis anything travels on, and containing it is how
12104
- a row-wide invisible checkbox becomes a hole under the wheel.
12105
-
12106
- A textarea with nothing in it, or a list of options short enough to fit, is
12107
- contained too — a browser cannot be asked "only if it scrolls". On Blink
12108
- that costs a wheel over an empty textarea, which then moves nothing rather
12109
- than the list around it; elsewhere the engine already only asks what
12110
- scrolls. Worth the page not moving behind a travel. */
12111
- [data-drag-travel*="x"] :is(textarea, select[multiple], select[size]) {
12179
+ import.meta.css = /* css */ [`:root[data-drag-travel-gesture] {
12180
+ overscroll-behavior: none;
12181
+ }
12182
+
12183
+ [data-drag-travel*="x"] {
12184
+ overscroll-behavior-x: contain !important;
12185
+ }
12186
+
12187
+ [data-drag-travel*="y"] {
12188
+ overscroll-behavior-y: contain !important;
12189
+ }
12190
+
12191
+ [data-drag-travel*="x"] :is(textarea, select[multiple], select[size]) {
12192
+ overscroll-behavior-x: contain !important;
12193
+ }
12194
+
12195
+ [data-drag-travel*="y"] :is(textarea, select[multiple], select[size]) {
12196
+ overscroll-behavior-y: contain !important;
12197
+ }
12198
+
12199
+ @supports not (-webkit-app-region: none) {
12200
+ [data-drag-travel*="x"] * {
12112
12201
  overscroll-behavior-x: contain !important;
12113
12202
  }
12114
- [data-drag-travel*="y"] :is(textarea, select[multiple], select[size]) {
12203
+
12204
+ [data-drag-travel*="y"] * {
12115
12205
  overscroll-behavior-y: contain !important;
12116
12206
  }
12117
- /* The same thing said again to everything inside — and only where saying it
12118
- is what works.
12119
-
12120
- Two readings of "contain" are out there, and the rule above lands in only
12121
- one of them. Blink walks EVERY scroll container between the pointer and the
12122
- page and asks each one whether the gesture may go past it, whether or not
12123
- it had anything to scroll: the box above is asked, and containing it is the
12124
- whole answer. Gecko and WebKit ask only the ones that actually scroll: the
12125
- box is skipped (it travels, it does not scroll), and what is left of a
12126
- list's gesture reaches the page unless the LIST itself was told — which is
12127
- what this does, to everything, because which descendant scrolls is not
12128
- something a stylesheet can know.
12129
-
12130
- Not said to Blink, where it is not needed and does harm: an element that
12131
- clips is a scroll container to a browser (a line of text with an ellipsis,
12132
- a rounded card, an invisible checkbox covering a row), and Blink asking one
12133
- of those with nothing to scroll gets "no further" for an answer — the wheel
12134
- stops there and the list right above it never moves. A dead zone under the
12135
- pointer, wherever something inside the box happens to clip.
12136
-
12137
- Blink is told apart by a property only it has, rather than by reading a user
12138
- agent: the split above is between engines, and -webkit-app-region is one of
12139
- the few things that names one. */
12140
- @supports not (-webkit-app-region: none) {
12141
- [data-drag-travel*="x"] * {
12142
- overscroll-behavior-x: contain !important;
12143
- }
12144
- [data-drag-travel*="y"] * {
12145
- overscroll-behavior-y: contain !important;
12146
- }
12147
- }
12207
+ }
12148
12208
  `, "@jsenv/dom/src/interaction/drag/drag_to_travel.js"];
12149
12209
 
12150
12210
  // How far a pointer goes before it is a travel rather than a click: below this
@@ -14077,10 +14137,15 @@ const createDragToMoveGestureController = ({
14077
14137
  // (e.g. a drag clone passed by the caller) or the element itself.
14078
14138
  // Capture any pre-existing translate so we can accumulate on top of it
14079
14139
  // rather than resetting it to zero on the first drag event.
14080
- const transformAtGrab = dragStyleController.getUnderlyingValue(
14081
- elementImpacted,
14082
- "transform",
14083
- );
14140
+ // Nothing is written on the element on "manual" (the caller draws it where
14141
+ // it goes), so there is nothing to accumulate on and nothing to read.
14142
+ const transformAtGrabOrNull =
14143
+ dragPositionEffect === "manual"
14144
+ ? null
14145
+ : dragStyleController.getUnderlyingValue(elementImpacted, "transform");
14146
+ // A transform that cannot be read as named parts (a complex 3D matrix)
14147
+ // comes back undefined: the drag then starts from a zero baseline.
14148
+ const transformAtGrab = transformAtGrabOrNull || {};
14084
14149
  const translateXAtGrab = transformAtGrab.translateX;
14085
14150
  const translateYAtGrab = transformAtGrab.translateY;
14086
14151
 
@@ -21675,4 +21740,4 @@ const useResizeStatus = (elementRef, { as = "number" } = {}) => {
21675
21740
  };
21676
21741
  };
21677
21742
 
21678
- export { EASING, ELEMENT_SIZE_CHANGE, activeElementSignal, addActiveElementEffect, addAttributeEffect, allowWheelThrough, appendStyles, applyNewPosition, canScroll, captureScrollState, chainEvent, claimWheelGesture, clickIsSuppressed, 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, getScrollIntoViewScopedOffsets, getScrollRelativeRect, getSelfAndAncestorScrolls, getStyle, getTranslateX, getTranslateXWithoutTransition, getTranslateY, getVirtualKeyboardOverlayHeight, getVisuallyVisibleInfo, getWidth, getWidthWithoutTransition, hasCSSSizeUnit, initFlexDetailsSet, initFocusGroup, initPositionSticky, installPanZoom, isAncestorOpen, isDisplayedDespiteClosedAncestor, isPressDisputedByDrag, isPressDrivenClick, isPrimaryButtonEvent, isSameColor, isScrollable, isTouchDrivenEvent, keepTouchRefusable, markDragSource, measureLongestVisualLineWidth, measureScrollbar, measureWidestChildRow, mergeOneStyle, mergeTwoStyles, normalizeKeyboardKey, normalizeStyle, normalizeStyles, observeAncestorOpenState, onAncestorReopen, parsePositionArea, parseStyle, performTabNavigation, pickPositionRelativeTo, prefersDarkColors, prefersLightColors, preventFocusNav, preventFocusNavViaKeyboard, preventIntermediateScrollbar, refuseDragTo, releaseWheelGesture, resolveCSSColor, resolveCSSSize, resolveColorLuminance, resolveOklchLightness, scrollIntoViewScoped, scrollIntoViewThroughScrollables, scrollIntoViewWithStickyAwareness, scrollRoomTowards, setAttribute, setAttributes, setPlacementViewportInsets, setStyles, setVirtualKeyboardOverlaysContent, snapToPixel, startDragTo, startDragToResizeGesture, startDragToTravel, stickyAsRelativeCoords, stringifyStyle, subscribeVirtualKeyboardGeometryChange, subscribeVisualViewportResizeSettled, subscribeWindowResizeSettled, suppressClickAfterGesture, trapFocusInside, trapScrollInside, useActiveElement, useAvailableHeight, useAvailableWidth, useMaxHeight, useMaxWidth, useResizeStatus, visibleRectEffect, waitForPressHeld, watchWheelTravel, wheelGestureIsTakenFrom };
21743
+ export { EASING, ELEMENT_SIZE_CHANGE, activeElementSignal, addActiveElementEffect, addAttributeEffect, allowWheelThrough, appendStyles, applyNewPosition, canScroll, captureScrollState, chainEvent, claimWheelGesture, clickIsSuppressed, 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, getScrollIntoViewScopedOffsets, getScrollRelativeRect, getSelfAndAncestorScrolls, getStyle, getTranslateX, getTranslateXWithoutTransition, getTranslateY, getVirtualKeyboardOverlayHeight, getVisuallyVisibleInfo, getWidth, getWidthWithoutTransition, hasCSSSizeUnit, initFlexDetailsSet, initFocusGroup, initPositionSticky, installPanZoom, isAncestorOpen, isDisplayedDespiteClosedAncestor, isPressDisputedByDrag, isPressDrivenClick, isPrimaryButtonEvent, isSameColor, isScrollable, isTouchDrivenEvent, keepTouchRefusable, markDragSource, measureLongestVisualLineWidth, measureScrollbar, measureWidestChildRow, mergeOneStyle, mergeTwoStyles, normalizeKeyboardKey, normalizeStyle, normalizeStyles, observeAncestorOpenState, onAncestorReopen, parsePositionArea, parseStyle, performTabNavigation, pickPositionRelativeTo, prefersDarkColors, prefersLightColors, preventFocusNav, preventFocusNavViaKeyboard, preventIntermediateScrollbar, refuseDragTo, releaseWheelGesture, resolveCSSColor, resolveCSSSize, resolveColorLuminance, resolveOklchLightness, scrollIntoViewScoped, scrollIntoViewThroughScrollables, scrollIntoViewWithStickyAwareness, scrollRoomTowards, setAttribute, setAttributes, setPlacementViewportInsets, setStyles, setVirtualKeyboardOverlaysContent, snapToPixel, startDragTo, startDragToResizeGesture, startDragToTravel, stickyAsRelativeCoords, stringifyStyle, subscribeVirtualKeyboardGeometryChange, subscribeVisualViewportResizeSettled, subscribeWindowResizeSettled, suppressClickAfterGesture, trapFocusInside, trapScrollInside, useActiveElement, useAvailableHeight, useAvailableWidth, useMaxHeight, useMaxWidth, useResizeStatus, visibleRectEffect, waitForPressHeld, waitForTap, watchWheelTravel, wheelGestureIsTakenFrom };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/dom",
3
- "version": "0.17.60",
3
+ "version": "0.17.62",
4
4
  "type": "module",
5
5
  "description": "DOM utilities for writing frontend code",
6
6
  "repository": {
@@ -37,7 +37,7 @@
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@preact/signals": "^2.11.2",
40
- "preact": "^11.0.0-beta.2"
40
+ "preact": "^11.0.0-rc.2"
41
41
  },
42
42
  "dependencies": {},
43
43
  "devDependencies": {
@@ -45,7 +45,7 @@
45
45
  "@jsenv/navi": "../navi",
46
46
  "@jsenv/snapshot": "../../tooling/snapshot",
47
47
  "@preact/signals": "2.11.2",
48
- "preact": "11.0.0-beta.2"
48
+ "preact": "11.0.0-rc.2"
49
49
  },
50
50
  "publishConfig": {
51
51
  "access": "public"