tamagui 1.134.5 → 1.135.1

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/native.js CHANGED
@@ -13354,6 +13354,9 @@ var require_index_native19 = __commonJS({
13354
13354
  }), mod);
13355
13355
  }, index_exports2 = {};
13356
13356
  __export2(index_exports2, {
13357
+ LayoutMeasurementController: function() {
13358
+ return LayoutMeasurementController2;
13359
+ },
13357
13360
  createMeasure: function() {
13358
13361
  return createMeasure;
13359
13362
  },
@@ -13392,18 +13395,29 @@ var require_index_native19 = __commonJS({
13392
13395
  }
13393
13396
  });
13394
13397
  module2.exports = __toCommonJS2(index_exports2);
13395
- var import_constants4 = require_index_native(), import_is_equal_shallow = require_index_native12(), LayoutHandlers = /* @__PURE__ */ new WeakMap(), Nodes = /* @__PURE__ */ new Set(), IntersectionState = /* @__PURE__ */ new WeakMap(), globalIntersectionObserver = null, strategy = "async";
13398
+ var import_jsx_runtime6 = require("react/jsx-runtime"), import_constants4 = require_index_native(), import_is_equal_shallow = require_index_native12(), import_react3 = require("react"), LayoutHandlers = /* @__PURE__ */ new WeakMap(), LayoutDisableKey = /* @__PURE__ */ new WeakMap(), Nodes = /* @__PURE__ */ new Set(), IntersectionState = /* @__PURE__ */ new WeakMap(), DisableLayoutContextValues = {}, DisableLayoutContextKey = /* @__PURE__ */ (0, import_react3.createContext)(""), ENABLE = import_constants4.isClient && typeof IntersectionObserver < "u", LayoutMeasurementController2 = function(param) {
13399
+ var { disable, children } = param, id = (0, import_react3.useId)();
13400
+ return (0, import_constants4.useIsomorphicLayoutEffect)(function() {
13401
+ DisableLayoutContextValues[id] = disable;
13402
+ }, [
13403
+ disable,
13404
+ id
13405
+ ]), /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DisableLayoutContextKey.Provider, {
13406
+ value: id,
13407
+ children
13408
+ });
13409
+ }, globalIntersectionObserver = null, strategy = "async";
13396
13410
  function setOnLayoutStrategy3(state) {
13397
13411
  strategy = state;
13398
13412
  }
13399
- var NodeRectCache = /* @__PURE__ */ new WeakMap(), ParentRectCache = /* @__PURE__ */ new WeakMap(), LastChangeTime = /* @__PURE__ */ new WeakMap(), rAF = typeof window < "u" ? window.requestAnimationFrame : void 0, avoidUpdates = !0, queuedUpdates = /* @__PURE__ */ new Map();
13413
+ var NodeRectCache = /* @__PURE__ */ new WeakMap(), LastChangeTime = /* @__PURE__ */ new WeakMap(), avoidUpdates = !0, queuedUpdates = /* @__PURE__ */ new Map();
13400
13414
  function enable() {
13401
13415
  avoidUpdates && (avoidUpdates = !1, queuedUpdates && (queuedUpdates.forEach(function(cb) {
13402
13416
  return cb();
13403
13417
  }), queuedUpdates.clear()));
13404
13418
  }
13405
13419
  function startGlobalObservers() {
13406
- !import_constants4.isClient || globalIntersectionObserver || (globalIntersectionObserver = new IntersectionObserver(function(entries) {
13420
+ !ENABLE || globalIntersectionObserver || (globalIntersectionObserver = new IntersectionObserver(function(entries) {
13407
13421
  entries.forEach(function(entry) {
13408
13422
  var node = entry.target;
13409
13423
  IntersectionState.get(node) !== entry.isIntersecting && IntersectionState.set(node, entry.isIntersecting);
@@ -13412,29 +13426,29 @@ var require_index_native19 = __commonJS({
13412
13426
  threshold: 0
13413
13427
  }));
13414
13428
  }
13415
- if (import_constants4.isClient) if (rAF) {
13416
- supportsCheckVisibility = "checkVisibility" in document.body, BoundingRects = /* @__PURE__ */ new WeakMap();
13429
+ if (ENABLE) {
13430
+ BoundingRects = /* @__PURE__ */ new WeakMap();
13417
13431
  async function updateLayoutIfChanged(node) {
13418
- if (IntersectionState.get(node) !== !1 && !(process.env.TAMAGUI_ONLAYOUT_VISIBILITY_CHECK === "1" && supportsCheckVisibility && !node.checkVisibility())) {
13419
- var onLayout = LayoutHandlers.get(node);
13420
- if (typeof onLayout == "function") {
13421
- var parentNode = node.parentElement;
13422
- if (parentNode) {
13423
- var nodeRect, parentRect;
13424
- if (strategy === "async") {
13425
- var [nr, pr] = await Promise.all([
13426
- BoundingRects.get(node) || getBoundingClientRectAsync(node),
13427
- BoundingRects.get(parentNode) || getBoundingClientRectAsync(parentNode)
13428
- ]);
13429
- if (nr === !1 || pr === !1) return;
13430
- nodeRect = nr, parentRect = pr;
13431
- } else nodeRect = node.getBoundingClientRect(), parentRect = parentNode.getBoundingClientRect();
13432
+ var onLayout = LayoutHandlers.get(node);
13433
+ if (typeof onLayout == "function") {
13434
+ var parentNode = node.parentElement;
13435
+ if (parentNode) {
13436
+ var nodeRect, parentRect;
13437
+ if (strategy === "async") {
13438
+ var [nr, pr] = await Promise.all([
13439
+ BoundingRects.get(node),
13440
+ BoundingRects.get(parentNode)
13441
+ ]);
13442
+ if (!nr || !pr) return;
13443
+ nodeRect = nr, parentRect = pr;
13444
+ } else nodeRect = node.getBoundingClientRect(), parentRect = parentNode.getBoundingClientRect();
13445
+ if (!(!nodeRect || !parentRect)) {
13432
13446
  var cachedRect = NodeRectCache.get(node), cachedParentRect = NodeRectCache.get(parentNode);
13433
- if (!cachedRect || // has changed one rect
13447
+ if (!cachedRect || !cachedParentRect || // has changed one rect
13434
13448
  // @ts-expect-error DOMRectReadOnly can go into object
13435
- !(0, import_is_equal_shallow.isEqualShallow)(cachedRect, nodeRect) && // @ts-expect-error DOMRectReadOnly can go into object
13436
- (!cachedParentRect || !(0, import_is_equal_shallow.isEqualShallow)(cachedParentRect, parentRect))) {
13437
- NodeRectCache.set(node, nodeRect), ParentRectCache.set(parentNode, parentRect);
13449
+ !(0, import_is_equal_shallow.isEqualShallow)(cachedRect, nodeRect) || // @ts-expect-error DOMRectReadOnly can go into object
13450
+ !(0, import_is_equal_shallow.isEqualShallow)(cachedParentRect, parentRect)) {
13451
+ NodeRectCache.set(node, nodeRect), NodeRectCache.set(parentNode, parentRect);
13438
13452
  var event = getElementLayoutEvent(nodeRect, parentRect);
13439
13453
  avoidUpdates ? queuedUpdates.set(node, function() {
13440
13454
  return onLayout(event);
@@ -13444,14 +13458,10 @@ var require_index_native19 = __commonJS({
13444
13458
  }
13445
13459
  }
13446
13460
  }
13447
- rAF(layoutOnAnimationFrame), frameCount = 0, userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP, RUN_EVERY_X_FRAMES = userSkipVal ? +userSkipVal : 10;
13461
+ userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP, RUN_EVERY_X_FRAMES = userSkipVal ? +userSkipVal : 14;
13448
13462
  async function layoutOnAnimationFrame() {
13449
13463
  if (strategy !== "off") {
13450
- if (!Nodes.size || frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
13451
- rAF(layoutOnAnimationFrame);
13452
- return;
13453
- }
13454
- frameCount === Number.MAX_SAFE_INTEGER && (frameCount = 0), await new Promise(function(res) {
13464
+ var visibleNodes = [], didRun = await new Promise(function(res) {
13455
13465
  var io = new IntersectionObserver(function(entries) {
13456
13466
  io.disconnect();
13457
13467
  var _iteratorNormalCompletion2 = !0, _didIteratorError2 = !1, _iteratorError2 = void 0;
@@ -13469,14 +13479,17 @@ var require_index_native19 = __commonJS({
13469
13479
  if (_didIteratorError2) throw _iteratorError2;
13470
13480
  }
13471
13481
  }
13472
- res();
13482
+ res(!0);
13473
13483
  }, {
13474
13484
  threshold: 0
13475
- }), _iteratorNormalCompletion = !0, _didIteratorError = !1, _iteratorError = void 0;
13485
+ }), didObserve = !1, _iteratorNormalCompletion = !0, _didIteratorError = !1, _iteratorError = void 0;
13476
13486
  try {
13477
13487
  for (var _iterator = Nodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
13478
13488
  var node = _step.value;
13479
- node.parentElement instanceof HTMLElement && (io.observe(node), io.observe(node.parentElement));
13489
+ if (node.parentElement instanceof HTMLElement) {
13490
+ var disableKey = LayoutDisableKey.get(node);
13491
+ disableKey && DisableLayoutContextValues[disableKey] === !0 || IntersectionState.get(node) !== !1 && (didObserve = !0, io.observe(node), io.observe(node.parentElement), visibleNodes.push(node));
13492
+ }
13480
13493
  }
13481
13494
  } catch (err) {
13482
13495
  _didIteratorError = !0, _iteratorError = err;
@@ -13487,14 +13500,17 @@ var require_index_native19 = __commonJS({
13487
13500
  if (_didIteratorError) throw _iteratorError;
13488
13501
  }
13489
13502
  }
13490
- }), Nodes.forEach(function(node) {
13503
+ didObserve || res(!1);
13504
+ });
13505
+ didRun && visibleNodes.forEach(function(node) {
13491
13506
  updateLayoutIfChanged(node);
13492
13507
  });
13493
13508
  }
13494
- rAF(layoutOnAnimationFrame);
13509
+ setTimeout(layoutOnAnimationFrame, 16.6667 * RUN_EVERY_X_FRAMES);
13495
13510
  }
13496
- } else process.env.NODE_ENV === "development" && console.warn("No requestAnimationFrame - please polyfill for onLayout to work correctly");
13497
- var supportsCheckVisibility, BoundingRects, frameCount, userSkipVal, RUN_EVERY_X_FRAMES, getElementLayoutEvent = function(nodeRect, parentRect) {
13511
+ layoutOnAnimationFrame();
13512
+ }
13513
+ var BoundingRects, userSkipVal, RUN_EVERY_X_FRAMES, getElementLayoutEvent = function(nodeRect, parentRect) {
13498
13514
  return {
13499
13515
  nativeEvent: {
13500
13516
  layout: getRelativeDimensions(nodeRect, parentRect),
@@ -13514,8 +13530,8 @@ var require_index_native19 = __commonJS({
13514
13530
  };
13515
13531
  };
13516
13532
  function useElementLayout(ref, onLayout) {
13517
- var _ref_current, node = ensureWebElement((_ref_current = ref.current) === null || _ref_current === void 0 ? void 0 : _ref_current.host);
13518
- node && onLayout && LayoutHandlers.set(node, onLayout), (0, import_constants4.useIsomorphicLayoutEffect)(function() {
13533
+ var _ref_current, disableKey = (0, import_react3.useContext)(DisableLayoutContextKey), node = ensureWebElement((_ref_current = ref.current) === null || _ref_current === void 0 ? void 0 : _ref_current.host);
13534
+ node && onLayout && (LayoutHandlers.set(node, onLayout), LayoutDisableKey.set(node, disableKey)), (0, import_constants4.useIsomorphicLayoutEffect)(function() {
13519
13535
  var _ref_current2;
13520
13536
  if (onLayout) {
13521
13537
  var node2 = (_ref_current2 = ref.current) === null || _ref_current2 === void 0 ? void 0 : _ref_current2.host;
@@ -14109,6 +14125,9 @@ var require_index_native20 = __commonJS({
14109
14125
  }), mod);
14110
14126
  }, index_exports2 = {};
14111
14127
  __export2(index_exports2, {
14128
+ LayoutMeasurementController: function() {
14129
+ return import_use_element_layout2.LayoutMeasurementController;
14130
+ },
14112
14131
  Stack: function() {
14113
14132
  return Stack2;
14114
14133
  },
@@ -18527,26 +18546,27 @@ var require_SheetImplementationCustom_native = __commonJS({
18527
18546
  ...animationConfig
18528
18547
  }));
18529
18548
  }
18530
- }), isAbleToPosition = /* @__PURE__ */ function() {
18531
- return !(disableAnimation || !frameSize || !screenSize || isHidden || hasntMeasured && !open);
18532
- }();
18549
+ });
18533
18550
  (0, import_constants4.useIsomorphicLayoutEffect)(function() {
18534
- hasntMeasured && screenSize && frameSize && (at.current = screenSize, animatedNumber.setValue(screenSize, {
18535
- type: "timing",
18536
- duration: 0
18537
- }, function() {
18538
- setTimeout(function() {
18539
- setDisableAnimation(!1);
18540
- }, 10);
18541
- }));
18551
+ if (hasntMeasured && screenSize && frameSize) {
18552
+ at.current = screenSize, animatedNumber.setValue(screenSize, {
18553
+ type: "timing",
18554
+ duration: 0
18555
+ }, function() {
18556
+ setTimeout(function() {
18557
+ setDisableAnimation(!1);
18558
+ }, 10);
18559
+ });
18560
+ return;
18561
+ }
18562
+ disableAnimation || !frameSize || !screenSize || isHidden || hasntMeasured && !open || (animateTo(position), position === -1 && (scrollBridge.scrollLock = !1, scrollBridge.scrollStartY = -1));
18542
18563
  }, [
18543
18564
  hasntMeasured,
18565
+ disableAnimation,
18566
+ isHidden,
18567
+ frameSize,
18544
18568
  screenSize,
18545
- frameSize
18546
- ]), (0, import_constants4.useIsomorphicLayoutEffect)(function() {
18547
- isAbleToPosition && (animateTo(position), position === -1 && (scrollBridge.scrollLock = !1, scrollBridge.scrollStartY = -1));
18548
- }, [
18549
- isAbleToPosition,
18569
+ open,
18550
18570
  position
18551
18571
  ]);
18552
18572
  var _props_disableDrag, disableDrag = (_props_disableDrag = props.disableDrag) !== null && _props_disableDrag !== void 0 ? _props_disableDrag : controller == null ? void 0 : controller.disableDrag, themeName = (0, import_core12.useThemeName)(), [isDragging, setIsDragging] = import_react3.default.useState(!1), panResponder = import_react3.default.useMemo(function() {
@@ -18670,59 +18690,62 @@ var require_SheetImplementationCustom_native = __commonJS({
18670
18690
  ]);
18671
18691
  var forcedContentHeight = hasFit ? void 0 : snapPointsMode === "percent" ? `${maxSnapPoint}${import_constants4.isWeb ? "dvh" : "%"}` : maxSnapPoint, setHasScrollView = import_react3.default.useCallback(function(val) {
18672
18692
  hasScrollView.current = val;
18673
- }, []), contents = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_contexts.ParentSheetContext.Provider, {
18674
- value: nextParentContext,
18675
- children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_SheetContext.SheetProvider, {
18676
- ...providerProps,
18677
- setHasScrollView,
18678
- children: [
18679
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_animate_presence.AnimatePresence, {
18680
- custom: {
18681
- open
18682
- },
18683
- children: shouldHideParentSheet || !open ? null : overlayComponent
18684
- }),
18685
- snapPointsMode !== "percent" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native4.View, {
18686
- style: {
18687
- opacity: 0,
18688
- position: "absolute",
18689
- top: 0,
18690
- left: 0,
18691
- right: 0,
18692
- bottom: 0,
18693
- pointerEvents: "none"
18694
- },
18695
- onLayout: handleMaxContentViewLayout
18696
- }),
18697
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AnimatedView, {
18698
- ref,
18699
- ...panResponder == null ? void 0 : panResponder.panHandlers,
18700
- onLayout: handleAnimationViewLayout,
18701
- // @ts-ignore for CSS driver this is necessary to attach the transition
18702
- // also motion driver at least though i suspect all drivers?
18703
- animation: isDragging || disableAnimation ? null : animation,
18704
- // @ts-ignore
18705
- disableClassName: !0,
18706
- style: [
18707
- {
18693
+ }, []), contents = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_core12.LayoutMeasurementController, {
18694
+ disable: !open,
18695
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_contexts.ParentSheetContext.Provider, {
18696
+ value: nextParentContext,
18697
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_SheetContext.SheetProvider, {
18698
+ ...providerProps,
18699
+ setHasScrollView,
18700
+ children: [
18701
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_animate_presence.AnimatePresence, {
18702
+ custom: {
18703
+ open
18704
+ },
18705
+ children: shouldHideParentSheet || !open ? null : overlayComponent
18706
+ }),
18707
+ snapPointsMode !== "percent" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native4.View, {
18708
+ style: {
18709
+ opacity: 0,
18708
18710
  position: "absolute",
18709
- zIndex,
18710
- width: "100%",
18711
- height: forcedContentHeight,
18712
- minHeight: forcedContentHeight,
18713
- opacity: shouldHideParentSheet ? 0 : opacity,
18714
- ...(shouldHideParentSheet || !open) && {
18715
- pointerEvents: "none"
18716
- }
18711
+ top: 0,
18712
+ left: 0,
18713
+ right: 0,
18714
+ bottom: 0,
18715
+ pointerEvents: "none"
18717
18716
  },
18718
- animatedStyle
18719
- ],
18720
- children: (
18721
- /* <AdaptProvider>{props.children}</AdaptProvider> */
18722
- props.children
18723
- )
18724
- })
18725
- ]
18717
+ onLayout: handleMaxContentViewLayout
18718
+ }),
18719
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AnimatedView, {
18720
+ ref,
18721
+ ...panResponder == null ? void 0 : panResponder.panHandlers,
18722
+ onLayout: handleAnimationViewLayout,
18723
+ // @ts-ignore for CSS driver this is necessary to attach the transition
18724
+ // also motion driver at least though i suspect all drivers?
18725
+ animation: isDragging || disableAnimation ? null : animation,
18726
+ // @ts-ignore
18727
+ disableClassName: !0,
18728
+ style: [
18729
+ {
18730
+ position: "absolute",
18731
+ zIndex,
18732
+ width: "100%",
18733
+ height: forcedContentHeight,
18734
+ minHeight: forcedContentHeight,
18735
+ opacity: shouldHideParentSheet ? 0 : opacity,
18736
+ ...(shouldHideParentSheet || !open) && {
18737
+ pointerEvents: "none"
18738
+ }
18739
+ },
18740
+ animatedStyle
18741
+ ],
18742
+ children: (
18743
+ /* <AdaptProvider>{props.children}</AdaptProvider> */
18744
+ props.children
18745
+ )
18746
+ })
18747
+ ]
18748
+ })
18726
18749
  })
18727
18750
  });
18728
18751
  if (!import_portal2.USE_NATIVE_PORTAL) {
@@ -19841,16 +19864,19 @@ var require_Dialog_native = __commonJS({
19841
19864
  // NOTE: we remove the inner frame, but not the portal itself
19842
19865
  // saw a bug when we removed and re-added portals that caused stale inner contents of the portal
19843
19866
  // seems like a React bug itself but leaving this for now as it fixes
19844
- isFullyHidden && !isAdapted ? null : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DialogPortalFrame, {
19845
- ref,
19846
- ...import_constants4.isWeb && isMountedOrOpen && {
19847
- "aria-modal": !0
19848
- },
19849
- // passThrough={isAdapted}
19850
- pointerEvents: isMountedOrOpen ? "auto" : "none",
19851
- ...frameProps,
19852
- className: "_no_backdrop " + (frameProps.className || ""),
19853
- children: contents
19867
+ isFullyHidden && !isAdapted ? null : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_core12.LayoutMeasurementController, {
19868
+ disable: !isMountedOrOpen,
19869
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DialogPortalFrame, {
19870
+ ref,
19871
+ ...import_constants4.isWeb && isMountedOrOpen && {
19872
+ "aria-modal": !0
19873
+ },
19874
+ // passThrough={isAdapted}
19875
+ pointerEvents: isMountedOrOpen ? "auto" : "none",
19876
+ ...frameProps,
19877
+ className: "_no_backdrop " + (frameProps.className || ""),
19878
+ children: contents
19879
+ })
19854
19880
  })
19855
19881
  );
19856
19882
  return import_constants4.isWeb ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_portal2.Portal, {
@@ -24478,13 +24504,13 @@ var require_Popper_native = __commonJS({
24478
24504
  Object.assign(setupOptions, options);
24479
24505
  }
24480
24506
  function Popper(props) {
24481
- var { children, size: size2, strategy = "absolute", placement = "bottom", stayInFrame, allowFlip, offset: offset2, disableRTL, resize, passThrough, open, scope } = props, [arrowEl, setArrow] = React4.useState(null), [arrowSize, setArrowSize] = React4.useState(0), offsetOptions = offset2 ?? arrowSize, floatingStyle = React4.useRef({}), floating = (0, import_floating.useFloating)({
24482
- open: passThrough ? !1 : open || !0,
24507
+ var { children, size: size2, strategy = "absolute", placement = "bottom", stayInFrame, allowFlip, offset: offset2, disableRTL, resize, passThrough, open, scope } = props, [arrowEl, setArrow] = React4.useState(null), [arrowSize, setArrowSize] = React4.useState(0), offsetOptions = offset2 ?? arrowSize, floatingStyle = React4.useRef({}), isOpen = passThrough ? !1 : open || !0, floating = (0, import_floating.useFloating)({
24508
+ open: isOpen,
24483
24509
  strategy,
24484
24510
  placement,
24485
24511
  sameScrollView: !1,
24486
24512
  // this only takes effect on native
24487
- whileElementsMounted: passThrough || !open ? void 0 : import_floating.autoUpdate,
24513
+ whileElementsMounted: isOpen ? import_floating.autoUpdate : void 0,
24488
24514
  platform: disableRTL ?? setupOptions.disableRTL ? {
24489
24515
  ...import_floating.platform,
24490
24516
  isRTL(element) {
@@ -24542,10 +24568,13 @@ var require_Popper_native = __commonJS({
24542
24568
  JSON.stringify(middlewareData.arrow || null),
24543
24569
  floating.isPositioned
24544
24570
  ]);
24545
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PopperProvider, {
24546
- scope,
24547
- ...popperContext,
24548
- children
24571
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_core12.LayoutMeasurementController, {
24572
+ disable: !isOpen,
24573
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PopperProvider, {
24574
+ scope,
24575
+ ...popperContext,
24576
+ children
24577
+ })
24549
24578
  });
24550
24579
  }
24551
24580
  var PopperAnchor = import_stacks3.YStack.extractable(/* @__PURE__ */ React4.forwardRef(function(props, forwardedRef) {