@multiplatform.one/forms 7.80.0 → 7.81.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.
Files changed (221) hide show
  1. package/dist/cjs/AdaptivePopup/index.cjs +2 -1
  2. package/dist/cjs/AdaptivePopup/index.native.js +2 -1
  3. package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
  4. package/dist/cjs/Button/index.cjs +12 -5
  5. package/dist/cjs/Button/index.native.js +14 -6
  6. package/dist/cjs/Button/index.native.js.map +1 -1
  7. package/dist/cjs/FloatingPanel/PanelHeader.cjs +3 -8
  8. package/dist/cjs/FloatingPanel/PanelHeader.native.js +3 -8
  9. package/dist/cjs/FloatingPanel/PanelHeader.native.js.map +1 -1
  10. package/dist/cjs/FloatingPanel/coverRect.cjs +0 -8
  11. package/dist/cjs/FloatingPanel/coverRect.native.js +0 -8
  12. package/dist/cjs/FloatingPanel/coverRect.native.js.map +1 -1
  13. package/dist/cjs/FloatingPanel/echoContext.cjs +5 -27
  14. package/dist/cjs/FloatingPanel/echoContext.native.js +5 -28
  15. package/dist/cjs/FloatingPanel/echoContext.native.js.map +1 -1
  16. package/dist/cjs/FloatingPanel/index.cjs +49 -131
  17. package/dist/cjs/FloatingPanel/index.native.js +216 -135
  18. package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
  19. package/dist/cjs/fields/Combobox/index.cjs +3 -10
  20. package/dist/cjs/fields/Combobox/index.native.js +3 -10
  21. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  22. package/dist/cjs/fields/Select/InlineChoices.cjs +4 -8
  23. package/dist/cjs/fields/Select/InlineChoices.native.js +4 -8
  24. package/dist/cjs/fields/Select/InlineChoices.native.js.map +1 -1
  25. package/dist/cjs/fields/Select/index.cjs +65 -201
  26. package/dist/cjs/fields/Select/index.native.js +74 -209
  27. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  28. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.cjs +2 -2
  29. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +2 -2
  30. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  31. package/dist/cjs/index.cjs +4 -0
  32. package/dist/cjs/index.native.js +4 -0
  33. package/dist/cjs/index.native.js.map +1 -1
  34. package/dist/cjs/shared/CheckGlyph.cjs +40 -0
  35. package/dist/cjs/shared/CheckGlyph.native.js +44 -0
  36. package/dist/cjs/shared/CheckGlyph.native.js.map +1 -0
  37. package/dist/cjs/shared/checkedOnField.cjs +104 -0
  38. package/dist/cjs/shared/checkedOnField.native.js +117 -0
  39. package/dist/cjs/shared/checkedOnField.native.js.map +1 -0
  40. package/dist/cjs/shared/floatingList.cjs +12 -5
  41. package/dist/cjs/shared/floatingList.native.js +15 -7
  42. package/dist/cjs/shared/floatingList.native.js.map +1 -1
  43. package/dist/esm/AdaptivePopup/index.mjs +3 -2
  44. package/dist/esm/AdaptivePopup/index.mjs.map +1 -1
  45. package/dist/esm/AdaptivePopup/index.native.js +3 -2
  46. package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
  47. package/dist/esm/Button/index.mjs +12 -5
  48. package/dist/esm/Button/index.mjs.map +1 -1
  49. package/dist/esm/Button/index.native.js +14 -6
  50. package/dist/esm/Button/index.native.js.map +1 -1
  51. package/dist/esm/FloatingPanel/PanelHeader.mjs +3 -8
  52. package/dist/esm/FloatingPanel/PanelHeader.mjs.map +1 -1
  53. package/dist/esm/FloatingPanel/PanelHeader.native.js +3 -8
  54. package/dist/esm/FloatingPanel/PanelHeader.native.js.map +1 -1
  55. package/dist/esm/FloatingPanel/coverRect.mjs +1 -8
  56. package/dist/esm/FloatingPanel/coverRect.mjs.map +1 -1
  57. package/dist/esm/FloatingPanel/coverRect.native.js +1 -8
  58. package/dist/esm/FloatingPanel/coverRect.native.js.map +1 -1
  59. package/dist/esm/FloatingPanel/echoContext.mjs +4 -24
  60. package/dist/esm/FloatingPanel/echoContext.mjs.map +1 -1
  61. package/dist/esm/FloatingPanel/echoContext.native.js +4 -25
  62. package/dist/esm/FloatingPanel/echoContext.native.js.map +1 -1
  63. package/dist/esm/FloatingPanel/index.mjs +53 -135
  64. package/dist/esm/FloatingPanel/index.mjs.map +1 -1
  65. package/dist/esm/FloatingPanel/index.native.js +180 -99
  66. package/dist/esm/FloatingPanel/index.native.js.map +1 -1
  67. package/dist/esm/fields/Combobox/index.mjs +4 -11
  68. package/dist/esm/fields/Combobox/index.mjs.map +1 -1
  69. package/dist/esm/fields/Combobox/index.native.js +4 -11
  70. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  71. package/dist/esm/fields/Select/InlineChoices.mjs +2 -6
  72. package/dist/esm/fields/Select/InlineChoices.mjs.map +1 -1
  73. package/dist/esm/fields/Select/InlineChoices.native.js +2 -6
  74. package/dist/esm/fields/Select/InlineChoices.native.js.map +1 -1
  75. package/dist/esm/fields/Select/index.mjs +68 -204
  76. package/dist/esm/fields/Select/index.mjs.map +1 -1
  77. package/dist/esm/fields/Select/index.native.js +77 -212
  78. package/dist/esm/fields/Select/index.native.js.map +1 -1
  79. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs +3 -3
  80. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -1
  81. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js +3 -3
  82. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  83. package/dist/esm/index.mjs +3 -1
  84. package/dist/esm/index.mjs.map +1 -1
  85. package/dist/esm/index.native.js +3 -1
  86. package/dist/esm/index.native.js.map +1 -1
  87. package/dist/esm/shared/CheckGlyph.mjs +15 -0
  88. package/dist/esm/shared/CheckGlyph.mjs.map +1 -0
  89. package/dist/esm/shared/CheckGlyph.native.js +16 -0
  90. package/dist/esm/shared/CheckGlyph.native.js.map +1 -0
  91. package/dist/esm/shared/checkedOnField.mjs +76 -0
  92. package/dist/esm/shared/checkedOnField.mjs.map +1 -0
  93. package/dist/esm/shared/checkedOnField.native.js +86 -0
  94. package/dist/esm/shared/checkedOnField.native.js.map +1 -0
  95. package/dist/esm/shared/floatingList.mjs +9 -5
  96. package/dist/esm/shared/floatingList.mjs.map +1 -1
  97. package/dist/esm/shared/floatingList.native.js +12 -7
  98. package/dist/esm/shared/floatingList.native.js.map +1 -1
  99. package/dist/jsx/AdaptivePopup/index.mjs +3 -2
  100. package/dist/jsx/AdaptivePopup/index.mjs.map +1 -1
  101. package/dist/jsx/AdaptivePopup/index.native.js +2 -1
  102. package/dist/jsx/AdaptivePopup/index.native.js.map +1 -1
  103. package/dist/jsx/Button/index.mjs +12 -5
  104. package/dist/jsx/Button/index.mjs.map +1 -1
  105. package/dist/jsx/Button/index.native.js +14 -6
  106. package/dist/jsx/Button/index.native.js.map +1 -1
  107. package/dist/jsx/FloatingPanel/PanelHeader.mjs +3 -8
  108. package/dist/jsx/FloatingPanel/PanelHeader.mjs.map +1 -1
  109. package/dist/jsx/FloatingPanel/PanelHeader.native.js +3 -8
  110. package/dist/jsx/FloatingPanel/PanelHeader.native.js.map +1 -1
  111. package/dist/jsx/FloatingPanel/coverRect.mjs +1 -8
  112. package/dist/jsx/FloatingPanel/coverRect.mjs.map +1 -1
  113. package/dist/jsx/FloatingPanel/coverRect.native.js +0 -8
  114. package/dist/jsx/FloatingPanel/coverRect.native.js.map +1 -1
  115. package/dist/jsx/FloatingPanel/echoContext.mjs +4 -24
  116. package/dist/jsx/FloatingPanel/echoContext.mjs.map +1 -1
  117. package/dist/jsx/FloatingPanel/echoContext.native.js +5 -28
  118. package/dist/jsx/FloatingPanel/echoContext.native.js.map +1 -1
  119. package/dist/jsx/FloatingPanel/index.mjs +53 -135
  120. package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
  121. package/dist/jsx/FloatingPanel/index.native.js +216 -135
  122. package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
  123. package/dist/jsx/fields/Combobox/index.mjs +4 -11
  124. package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
  125. package/dist/jsx/fields/Combobox/index.native.js +3 -10
  126. package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
  127. package/dist/jsx/fields/Select/InlineChoices.mjs +2 -6
  128. package/dist/jsx/fields/Select/InlineChoices.mjs.map +1 -1
  129. package/dist/jsx/fields/Select/InlineChoices.native.js +4 -8
  130. package/dist/jsx/fields/Select/InlineChoices.native.js.map +1 -1
  131. package/dist/jsx/fields/Select/index.mjs +68 -204
  132. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  133. package/dist/jsx/fields/Select/index.native.js +74 -209
  134. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  135. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs +3 -3
  136. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -1
  137. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js +2 -2
  138. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  139. package/dist/jsx/index.js +3 -1
  140. package/dist/jsx/index.js.map +1 -1
  141. package/dist/jsx/index.mjs +3 -1
  142. package/dist/jsx/index.mjs.map +1 -1
  143. package/dist/jsx/index.native.js +4 -0
  144. package/dist/jsx/index.native.js.map +1 -1
  145. package/dist/jsx/shared/CheckGlyph.mjs +15 -0
  146. package/dist/jsx/shared/CheckGlyph.mjs.map +1 -0
  147. package/dist/jsx/shared/CheckGlyph.native.js +44 -0
  148. package/dist/jsx/shared/CheckGlyph.native.js.map +1 -0
  149. package/dist/jsx/shared/checkedOnField.mjs +76 -0
  150. package/dist/jsx/shared/checkedOnField.mjs.map +1 -0
  151. package/dist/jsx/shared/checkedOnField.native.js +117 -0
  152. package/dist/jsx/shared/checkedOnField.native.js.map +1 -0
  153. package/dist/jsx/shared/floatingList.mjs +9 -5
  154. package/dist/jsx/shared/floatingList.mjs.map +1 -1
  155. package/dist/jsx/shared/floatingList.native.js +15 -7
  156. package/dist/jsx/shared/floatingList.native.js.map +1 -1
  157. package/package.json +8 -8
  158. package/src/AdaptivePopup/index.tsx +6 -3
  159. package/src/Button/Button.iconButton.spec.tsx +39 -0
  160. package/src/Button/index.tsx +20 -8
  161. package/src/FloatingPanel/FloatingPanel.iconCover.spec.tsx +279 -0
  162. package/src/FloatingPanel/FloatingPanel.menuFace.native.spec.tsx +78 -69
  163. package/src/FloatingPanel/FloatingPanel.seamlessCover.spec.tsx +12 -0
  164. package/src/FloatingPanel/PanelHeader.tsx +4 -12
  165. package/src/FloatingPanel/coverRect.ts +2 -15
  166. package/src/FloatingPanel/echoContext.ts +6 -40
  167. package/src/FloatingPanel/index.native.tsx +209 -144
  168. package/src/FloatingPanel/index.tsx +71 -187
  169. package/src/FloatingPanel/pointAnchor.spec.ts +1 -1
  170. package/src/FloatingPanel/pointAnchor.ts +4 -4
  171. package/src/FloatingPanel/sheetGrabber.spec.tsx +53 -0
  172. package/src/fields/Combobox/index.tsx +4 -9
  173. package/src/fields/Select/InlineChoices.tsx +2 -2
  174. package/src/fields/Select/Select.containingBlock.spec.tsx +131 -130
  175. package/src/fields/Select/Select.popUp.native.spec.tsx +276 -0
  176. package/src/fields/Select/Select.stories.tsx +26 -0
  177. package/src/fields/Select/index.tsx +84 -255
  178. package/src/fields/nativeDateTime/OsDateTimeSheet.tsx +3 -3
  179. package/src/index.ts +2 -1
  180. package/src/shared/CheckGlyph.tsx +12 -0
  181. package/src/shared/checkedOnField.ts +116 -0
  182. package/src/shared/floatingList.spec.tsx +154 -1
  183. package/src/shared/floatingList.tsx +18 -9
  184. package/types/AdaptivePopup/index.d.ts.map +1 -1
  185. package/types/Button/index.d.ts.map +1 -1
  186. package/types/FloatingPanel/PanelHeader.d.ts +1 -6
  187. package/types/FloatingPanel/PanelHeader.d.ts.map +1 -1
  188. package/types/FloatingPanel/coverRect.d.ts +2 -11
  189. package/types/FloatingPanel/coverRect.d.ts.map +1 -1
  190. package/types/FloatingPanel/echoContext.d.ts +5 -22
  191. package/types/FloatingPanel/echoContext.d.ts.map +1 -1
  192. package/types/FloatingPanel/index.d.ts +22 -9
  193. package/types/FloatingPanel/index.d.ts.map +1 -1
  194. package/types/FloatingPanel/index.native.d.ts +8 -1
  195. package/types/FloatingPanel/index.native.d.ts.map +1 -1
  196. package/types/FloatingPanel/pointAnchor.d.ts +4 -4
  197. package/types/fields/Combobox/index.d.ts.map +1 -1
  198. package/types/fields/Select/index.d.ts.map +1 -1
  199. package/types/index.d.ts +2 -1
  200. package/types/index.d.ts.map +1 -1
  201. package/types/shared/CheckGlyph.d.ts +10 -0
  202. package/types/shared/CheckGlyph.d.ts.map +1 -0
  203. package/types/shared/checkedOnField.d.ts +54 -0
  204. package/types/shared/checkedOnField.d.ts.map +1 -0
  205. package/types/shared/floatingList.d.ts +5 -2
  206. package/types/shared/floatingList.d.ts.map +1 -1
  207. package/dist/cjs/FloatingPanel/iconEcho.cjs +0 -106
  208. package/dist/cjs/FloatingPanel/iconEcho.native.js +0 -116
  209. package/dist/cjs/FloatingPanel/iconEcho.native.js.map +0 -1
  210. package/dist/esm/FloatingPanel/iconEcho.mjs +0 -79
  211. package/dist/esm/FloatingPanel/iconEcho.mjs.map +0 -1
  212. package/dist/esm/FloatingPanel/iconEcho.native.js +0 -86
  213. package/dist/esm/FloatingPanel/iconEcho.native.js.map +0 -1
  214. package/dist/jsx/FloatingPanel/iconEcho.mjs +0 -79
  215. package/dist/jsx/FloatingPanel/iconEcho.mjs.map +0 -1
  216. package/dist/jsx/FloatingPanel/iconEcho.native.js +0 -116
  217. package/dist/jsx/FloatingPanel/iconEcho.native.js.map +0 -1
  218. package/src/FloatingPanel/FloatingPanel.iconEcho.spec.tsx +0 -357
  219. package/src/FloatingPanel/iconEcho.tsx +0 -124
  220. package/types/FloatingPanel/iconEcho.d.ts +0 -29
  221. package/types/FloatingPanel/iconEcho.d.ts.map +0 -1
@@ -1,7 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { IconSlot, useTouchSurface } from "@multiplatform.one/theme";
3
+ import { CheckGlyph } from "../../shared/CheckGlyph.native.js";
3
4
  import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, memo } from "react";
4
- import { CaretDownIcon, CaretRightIcon, CheckIcon } from "@phosphor-icons/react";
5
+ import { CaretDownIcon, CaretRightIcon } from "@phosphor-icons/react";
5
6
  import { useClick, useDismiss, useInteractions, useListNavigation, useRole, useTypeahead, FloatingFocusManager } from "@floating-ui/react";
6
7
  import { ensureKeyboardModalityTracking, keyboardFocusRingProps, useMenuRowCheckInk, menuRowChecked, menuRowFrame, sizeRecipeForToken, useGlyphColor, wasKeyboardFocus, transitionProps, Text as HouseText } from "@multiplatform.one/theme";
7
8
  import * as ReactNative from "react-native";
@@ -16,8 +17,8 @@ import { Input as InputParts, FocusContext } from "../../InputParts/index.native
16
17
  import { formCommonColors, formInputColors } from "../../shared/colorRamps.native.js";
17
18
  import { warnSelectTooFewOptions } from "../../shared/devWarn.native.js";
18
19
  import { getFieldError, getFieldHeight, mergeFieldHandler, useFormField, useResolvedValidators } from "../../shared/utils.native.js";
19
- import { ScrollArrow } from "../../shared/floatingList.native.js";
20
- import { FloatingPanel, TriggerEchoRow, placeEchoOverTrigger, useFloatingPanel, panelViewportPadding, useViewportGtSm } from "../../FloatingPanel/index.native.js";
20
+ import { growOnScroll, placeCheckedOnField, ScrollArrow, scrollArrowBand } from "../../shared/floatingList.native.js";
21
+ import { FloatingPanel, useFloatingPanel, panelViewportPadding, useViewportGtSm } from "../../FloatingPanel/index.native.js";
21
22
  import { pickerCompactFace, resolveCompactFace } from "../../FloatingPanel/compactFace.native.js";
22
23
  import { PanelPortal } from "../../FloatingPanel/PanelPortal.native.js";
23
24
  import { fixedContainingBlockOrigin } from "../../FloatingPanel/containingBlock.native.js";
@@ -430,11 +431,7 @@ var SelectItem = /* @__PURE__ */memo(function SelectItem2(param) {
430
431
  numberOfLines: 1,
431
432
  flex: 1,
432
433
  children: option.label
433
- }), isSelected && /* @__PURE__ */_jsx(CheckIcon, {
434
- size: 14,
435
- weight: "bold",
436
- color: ctx.markColor
437
- })]
434
+ }), isSelected && /* @__PURE__ */_jsx(CheckGlyph, {})]
438
435
  });
439
436
  });
440
437
  function FloatingSelectCore(param) {
@@ -455,8 +452,8 @@ function FloatingSelectCore(param) {
455
452
  dismissible,
456
453
  panelWidth
457
454
  } = param;
458
- var _ref, _ref1, _ref2, _panel_x, _ref3, _ref4;
459
- var _overlayStyle_current, _panel_triggerRef_current;
455
+ var _ref, _ref1, _ref2, _panel_x;
456
+ var _overlayStyle_current;
460
457
  var overlayZIndex = useOverlayZIndex("dropdown");
461
458
  var {
462
459
  style: elevatedSurfaceStyle,
@@ -564,38 +561,23 @@ function FloatingSelectCore(param) {
564
561
  sortedOptionsRef.current = orderOptionsBySelected(options, selected, selectedOrder);
565
562
  }, [options, value, multiple, selectedOrder]);
566
563
  var programmaticScrollRef = useRef(0);
567
- var pinnedTopRef = useRef(0);
568
- var pinnedHeightRef = useRef(0);
569
- var grownRef = useRef(false);
570
- var growUpOnlyRef = useRef(false);
571
- var growDownOnlyRef = useRef(false);
572
564
  var lastScrollTopRef = useRef(0);
573
- var coverScrollRef = useRef(false);
574
- var [coverScroll, setCoverScroll] = useState(false);
575
- var growsUpRef = useRef(false);
576
- var coverTrimRef = useRef(0);
577
- var echoed = !beside && !coverScroll;
565
+ var onFieldRef = useRef(null);
566
+ var opensUpRef = useRef(false);
567
+ var arrowBand = scrollArrowBand(knobProps.menuRow.minHeight);
578
568
  var repositionRef = useRef(null);
579
569
  var panel = useFloatingPanel({
580
570
  open,
581
571
  onOpenChange: setOpen,
582
572
  disabled,
583
573
  repositionRef,
584
- wheelGrowRef: selectedIndex >= 0 ? grownRef : void 0,
585
574
  onBeforeOpen: function onBeforeOpen() {
586
575
  computeSortedOptions();
587
576
  overlayStyle.current = null;
588
- pinnedTopRef.current = 0;
589
- pinnedHeightRef.current = 0;
590
- grownRef.current = false;
591
- growUpOnlyRef.current = false;
592
- growDownOnlyRef.current = false;
593
577
  lastScrollTopRef.current = 0;
594
578
  programmaticScrollRef.current = 0;
595
- coverScrollRef.current = false;
596
- growsUpRef.current = false;
597
- coverTrimRef.current = 0;
598
- setCoverScroll(false);
579
+ onFieldRef.current = null;
580
+ opensUpRef.current = false;
599
581
  },
600
582
  panelWidth
601
583
  });
@@ -658,10 +640,6 @@ function FloatingSelectCore(param) {
658
640
  if (!selectedItem) return;
659
641
  var isInitial1 = panel.initializingRef.current;
660
642
  if (isInitial1) dropdownElement.style.transition = "none";
661
- if (pinnedTopRef.current === 0 && pinnedHeightRef.current === 0) {
662
- programmaticScrollRef.current++;
663
- dropdownElement.scrollTop = 0;
664
- }
665
643
  var triggerBounds = trigger.getBoundingClientRect();
666
644
  var viewportHeight = window.innerHeight;
667
645
  var originTop = fixedContainingBlockOrigin(dropdownElement).top;
@@ -670,164 +648,54 @@ function FloatingSelectCore(param) {
670
648
  var borderBottomWidth = parseFloat(computedStyle.borderBottomWidth) || 0;
671
649
  var totalBorderWidth = borderTopWidth + borderBottomWidth;
672
650
  var scrollContentHeight = dropdownElement.scrollHeight;
673
- var totalContentHeight = scrollContentHeight + totalBorderWidth;
674
- var firstPlacement = pinnedTopRef.current === 0 && pinnedHeightRef.current === 0;
675
- var boundsTop = panelViewportPadding;
676
- var boundsBottom = viewportHeight - panelViewportPadding;
677
- var echoRow = dropdownElement.querySelector("[data-fp-trigger-row]");
678
- var echoHeight = echoRow ? triggerBounds.height : 0;
679
- var listHeight = totalContentHeight - echoHeight;
680
- var roomBelow = boundsBottom - triggerBounds.top;
681
- var roomAbove = triggerBounds.bottom - boundsTop;
682
- if (firstPlacement && totalContentHeight > roomBelow) {
683
- coverScrollRef.current = true;
684
- growsUpRef.current = roomAbove > roomBelow;
685
- setCoverScroll(true);
686
- }
687
- if (coverScrollRef.current) {
688
- var grown = grownRef.current || growUpOnlyRef.current || growDownOnlyRef.current;
689
- var room = grown ? boundsBottom - boundsTop : growsUpRef.current ? roomAbove : roomBelow;
690
- var trim = grown ? 0 : coverTrimRef.current;
691
- var height = Math.max(0, Math.min(listHeight, room - trim));
692
- var anchor = growsUpRef.current ? triggerBounds.bottom - height : triggerBounds.top;
693
- var top1 = Math.min(Math.max(anchor, boundsTop), boundsBottom - height);
694
- var previousTop = pinnedTopRef.current;
695
- if (!overlayStyle.current || overlayStyle.current.top !== top1 - originTop || overlayStyle.current.maxHeight !== height) {
696
- dropdownElement.style.top = `${top1 - originTop}px`;
697
- dropdownElement.style.maxHeight = `${height}px`;
698
- dropdownElement.style.height = "";
699
- overlayStyle.current = {
700
- top: top1 - originTop,
701
- maxHeight: height
702
- };
703
- void dropdownElement.offsetHeight;
704
- }
705
- pinnedTopRef.current = top1;
706
- pinnedHeightRef.current = height;
707
- if (grown && previousTop > top1 && dropdownElement.scrollTop > 0) {
708
- programmaticScrollRef.current++;
709
- dropdownElement.scrollTop = Math.max(0, dropdownElement.scrollTop - (previousTop - top1));
710
- }
711
- if (echoRow) return;
712
- var rowHeight = selectedItem.offsetHeight || 1;
713
- if (isInitial1 && selectedIndex >= 0) {
714
- var maxScrollTop = dropdownElement.scrollHeight - dropdownElement.clientHeight;
715
- var scrollTop;
716
- if (growsUpRef.current) {
717
- scrollTop = selectedItem.offsetTop + rowHeight - (triggerBounds.bottom - top1);
718
- } else {
719
- var short = Math.max(0, selectedItem.offsetTop - maxScrollTop - 2);
720
- scrollTop = selectedItem.offsetTop - Math.ceil(short / rowHeight) * rowHeight;
721
- }
722
- programmaticScrollRef.current++;
723
- dropdownElement.scrollTop = Math.min(maxScrollTop, Math.max(0, scrollTop));
724
- }
725
- if (isInitial1 && !grown) {
726
- var firstRow = listItemsRef.current[0];
727
- var visibleBottom = dropdownElement.scrollTop + dropdownElement.clientHeight;
728
- if (firstRow && visibleBottom < dropdownElement.scrollHeight - 2) {
729
- var cut = (visibleBottom - firstRow.offsetTop) % rowHeight;
730
- if (cut > 3 && cut < rowHeight - 3) {
731
- coverTrimRef.current = cut;
732
- var trimmedHeight = height - cut;
733
- var trimmedTop = growsUpRef.current ? top1 + cut : top1;
734
- dropdownElement.style.top = `${trimmedTop - originTop}px`;
735
- dropdownElement.style.maxHeight = `${trimmedHeight}px`;
736
- overlayStyle.current = {
737
- top: trimmedTop - originTop,
738
- maxHeight: trimmedHeight
739
- };
740
- pinnedTopRef.current = trimmedTop;
741
- pinnedHeightRef.current = trimmedHeight;
742
- }
743
- }
744
- }
745
- panel.initializingRef.current = false;
746
- void dropdownElement.offsetHeight;
747
- if (isInitial1) dropdownElement.style.transition = panel.panelTransition;
748
- requestAnimationFrame(function () {
749
- if (dropdownElement) panel.updateArrows(dropdownElement);
651
+ var boundsTop = panelViewportPadding + borderTopWidth;
652
+ var boundsBottom = viewportHeight - panelViewportPadding - borderBottomWidth;
653
+ if (!onFieldRef.current) {
654
+ var fit = placeCheckedOnField({
655
+ fieldTop: triggerBounds.top,
656
+ fieldBottom: triggerBounds.bottom,
657
+ rowTop: selectedItem.offsetTop,
658
+ rowHeight: selectedItem.offsetHeight || 1,
659
+ contentHeight: scrollContentHeight,
660
+ boundsTop,
661
+ boundsBottom,
662
+ band: arrowBand
663
+ });
664
+ onFieldRef.current = fit;
665
+ opensUpRef.current = fit.top + fit.height / 2 < (triggerBounds.top + triggerBounds.bottom) / 2;
666
+ } else if (!isInitial1) {
667
+ onFieldRef.current = growOnScroll({
668
+ ...onFieldRef.current,
669
+ scrollTop: dropdownElement.scrollTop,
670
+ contentHeight: scrollContentHeight,
671
+ boundsTop,
672
+ boundsBottom
750
673
  });
751
- return;
752
- }
753
- var idealTop = triggerBounds.top;
754
- var idealBottom = idealTop + totalContentHeight;
755
- var pinnedTop = Math.max(panelViewportPadding, idealTop);
756
- var pinnedBottom = Math.min(viewportHeight - panelViewportPadding, idealBottom);
757
- var pinnedHeight = Math.max(120, pinnedBottom - pinnedTop);
758
- if (firstPlacement) {
759
- pinnedTopRef.current = pinnedTop;
760
- pinnedHeightRef.current = pinnedHeight;
761
- }
762
- var top2 = pinnedTopRef.current;
763
- var height1 = pinnedHeightRef.current;
764
- if (grownRef.current) {
765
- var canGrowDown = Math.max(0, viewportHeight - panelViewportPadding - (top2 + height1));
766
- height1 += canGrowDown;
767
- var canGrowUp = Math.max(0, top2 - panelViewportPadding);
768
- top2 -= canGrowUp;
769
- height1 += canGrowUp;
770
- }
771
- if (growUpOnlyRef.current) {
772
- var canGrowUp1 = Math.max(0, top2 - panelViewportPadding);
773
- top2 -= canGrowUp1;
774
- height1 += canGrowUp1;
775
- }
776
- if (growDownOnlyRef.current) {
777
- var canGrowDown1 = Math.max(0, viewportHeight - panelViewportPadding - (top2 + height1));
778
- height1 += canGrowDown1;
779
- }
780
- height1 = Math.min(height1, viewportHeight - top2 - panelViewportPadding);
781
- height1 = Math.min(height1, totalContentHeight);
782
- height1 = Math.max(120, height1);
783
- var availableViewport = viewportHeight - 2 * panelViewportPadding;
784
- if ((grownRef.current || growUpOnlyRef.current || growDownOnlyRef.current) && height1 < availableViewport) {
785
- if (panel.placement.startsWith("top")) {
786
- top2 = panelViewportPadding;
787
- } else {
788
- top2 = viewportHeight - panelViewportPadding - height1;
789
- }
790
674
  }
791
- var cachedOverlayStyle = overlayStyle.current;
792
- if (!cachedOverlayStyle || cachedOverlayStyle.top !== top2 - originTop || cachedOverlayStyle.maxHeight !== height1) {
793
- dropdownElement.style.top = `${top2 - originTop}px`;
794
- dropdownElement.style.maxHeight = `${height1}px`;
675
+ var placed = onFieldRef.current;
676
+ var top1 = placed.top - borderTopWidth;
677
+ var height = placed.height + totalBorderWidth;
678
+ if (!overlayStyle.current || overlayStyle.current.top !== top1 - originTop || overlayStyle.current.maxHeight !== height) {
679
+ dropdownElement.style.top = `${top1 - originTop}px`;
680
+ dropdownElement.style.maxHeight = `${height}px`;
795
681
  dropdownElement.style.height = "";
796
682
  overlayStyle.current = {
797
- top: top2 - originTop,
798
- maxHeight: height1
683
+ top: top1 - originTop,
684
+ maxHeight: height
799
685
  };
800
686
  void dropdownElement.offsetHeight;
801
687
  }
802
- if (isInitial1 && selectedIndex >= 0 && !grownRef.current && !growUpOnlyRef.current && !growDownOnlyRef.current) {
803
- var rowBottom = selectedItem.offsetTop + selectedItem.offsetHeight;
804
- if (rowBottom > dropdownElement.clientHeight) {
805
- var maxScrollTop1 = dropdownElement.scrollHeight - dropdownElement.clientHeight;
806
- programmaticScrollRef.current++;
807
- dropdownElement.scrollTop = Math.max(0, Math.min(selectedItem.offsetTop - echoHeight, maxScrollTop1));
808
- }
688
+ if (Math.abs(dropdownElement.scrollTop - placed.scrollTop) >= 0.5) {
689
+ programmaticScrollRef.current++;
690
+ dropdownElement.scrollTop = placed.scrollTop;
809
691
  }
810
- placeEchoOverTrigger(dropdownElement, {
811
- triggerLeft: triggerBounds.left,
812
- triggerRight: triggerBounds.right,
813
- panelLeft: dropdownElement.getBoundingClientRect().left,
814
- panelWidth: dropdownElement.offsetWidth,
815
- rtl: getComputedStyle(trigger).direction === "rtl"
816
- }, {
817
- stretch: panelWidth !== void 0
818
- });
819
692
  panel.initializingRef.current = false;
820
693
  void dropdownElement.offsetHeight;
821
694
  if (isInitial1) dropdownElement.style.transition = panel.panelTransition;
822
695
  requestAnimationFrame(function () {
823
- if (dropdownElement) {
824
- panel.updateArrows(dropdownElement);
825
- requestAnimationFrame(function () {
826
- if (dropdownElement) panel.updateArrows(dropdownElement);
827
- });
828
- }
696
+ if (dropdownElement) panel.updateArrows(dropdownElement);
829
697
  });
830
- }, [selectedIndex, panel.refs, panel.updateArrows, panel.placement, panel.panelTransition, options.length, beside, coverScroll, panelWidth]);
698
+ }, [selectedIndex, panel.refs, panel.updateArrows, panel.panelTransition, options.length, beside, arrowBand]);
831
699
  repositionRef.current = repositionOverlay;
832
700
  useLayoutEffect(function () {
833
701
  if (!open || !panel.mounted) return;
@@ -1021,23 +889,10 @@ function FloatingSelectCore(param) {
1021
889
  return;
1022
890
  }
1023
891
  var arrowDir = panel.arrowScrollDirRef.current;
1024
- if (arrowDir) {
1025
- panel.arrowScrollDirRef.current = null;
1026
- lastScrollTopRef.current = el.scrollTop;
1027
- if (arrowDir === "down") {
1028
- growUpOnlyRef.current = true;
1029
- } else {
1030
- growDownOnlyRef.current = true;
1031
- }
1032
- repositionOverlay();
1033
- return;
1034
- }
892
+ if (arrowDir) panel.arrowScrollDirRef.current = null;
1035
893
  var delta = el.scrollTop - lastScrollTopRef.current;
1036
894
  lastScrollTopRef.current = el.scrollTop;
1037
- if (delta !== 0) {
1038
- grownRef.current = true;
1039
- repositionOverlay();
1040
- }
895
+ if (delta !== 0) repositionOverlay();
1041
896
  }, [panel.updateArrows, repositionOverlay]);
1042
897
  return /* @__PURE__ */_jsxs(_Fragment, {
1043
898
  children: [/* @__PURE__ */_jsxs(InputParts.Box, {
@@ -1154,7 +1009,7 @@ function FloatingSelectCore(param) {
1154
1009
  opacity: panel.visible ? 1 : 0,
1155
1010
  transform: panel.visible ? "scale(1)" : "scale(0.96)",
1156
1011
  transition: panel.panelTransition,
1157
- transformOrigin: coverScroll && growsUpRef.current || panel.placement.startsWith("top") ? "bottom left" : "top left",
1012
+ transformOrigin: opensUpRef.current ? "bottom left" : "top left",
1158
1013
  ...dragProps.style
1159
1014
  },
1160
1015
  onPointerDown: dragProps.onPointerDown,
@@ -1198,19 +1053,12 @@ function FloatingSelectCore(param) {
1198
1053
  "data-testid": "select-dropdown",
1199
1054
  paddingVertical: 0,
1200
1055
  paddingBottom: panel.coverCornerInset || 0,
1201
- children: [echoed ? /* @__PURE__ */_jsx(TriggerEchoRow, {
1202
- sourceRef: panel.triggerRef,
1203
- source: (_ref3 = selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.label) !== null && _ref3 !== void 0 ? _ref3 : placeholder,
1204
- onPress: function onPress() {
1205
- return setOpen(false);
1206
- },
1207
- presentational: true
1208
- }) : null, /* @__PURE__ */_jsx(ScrollArrow, {
1056
+ children: [/* @__PURE__ */_jsx(ScrollArrow, {
1209
1057
  direction: "up",
1210
1058
  scrollRef: panel.refs.floating,
1211
1059
  visible: panel.arrowUp,
1212
1060
  arrowScrollDirRef: panel.arrowScrollDirRef,
1213
- topOffset: echoed ? (_ref4 = (_panel_triggerRef_current = panel.triggerRef.current) === null || _panel_triggerRef_current === void 0 ? void 0 : _panel_triggerRef_current.getBoundingClientRect().height) !== null && _ref4 !== void 0 ? _ref4 : 0 : 0
1061
+ band: arrowBand
1214
1062
  }), groupLabel && /* @__PURE__ */_jsx(GroupHeader, {
1215
1063
  color: textColor,
1216
1064
  paddingHorizontal: knobProps.panelPadding.padding,
@@ -1247,7 +1095,8 @@ function FloatingSelectCore(param) {
1247
1095
  direction: "down",
1248
1096
  scrollRef: panel.refs.floating,
1249
1097
  visible: panel.arrowDown,
1250
- arrowScrollDirRef: panel.arrowScrollDirRef
1098
+ arrowScrollDirRef: panel.arrowScrollDirRef,
1099
+ band: arrowBand
1251
1100
  })]
1252
1101
  })
1253
1102
  })
@@ -1277,6 +1126,7 @@ function NativeSelectCore(param) {
1277
1126
  var insideOverlay = useInsideOverlay();
1278
1127
  var compactFace = pickerCompactFace(options.length);
1279
1128
  var asMenu = resolveCompactFace(compactFace, insideOverlay) === "menu";
1129
+ var beside = asMenu && insideOverlay && opensBesideTrigger(options.length);
1280
1130
  var hydrationTouch = useTouchSurface();
1281
1131
  var describedBy = useFieldDescribedBy();
1282
1132
  var fieldA11y = useFieldA11y();
@@ -1368,6 +1218,10 @@ function NativeSelectCore(param) {
1368
1218
  });
1369
1219
  }
1370
1220
  }, [open, selectedIndex]);
1221
+ var [onFieldRow, setOnFieldRow] = useState(null);
1222
+ useEffect(function () {
1223
+ if (!open) setOnFieldRow(null);
1224
+ }, [open]);
1371
1225
  var handleSelect = useCallback(function (optionValue) {
1372
1226
  if (multiple) {
1373
1227
  var current = Array.isArray(value) ? value : value ? [value] : [];
@@ -1492,11 +1346,7 @@ function NativeSelectCore(param) {
1492
1346
  numberOfLines: 1,
1493
1347
  flex: 1,
1494
1348
  children: option.label
1495
- }), selected && /* @__PURE__ */_jsx(CheckIcon, {
1496
- size: 14,
1497
- weight: "bold",
1498
- color: markColor
1499
- })]
1349
+ }), selected && /* @__PURE__ */_jsx(CheckGlyph, {})]
1500
1350
  }, isWeb ? option.value : void 0);
1501
1351
  if (isWeb) return row;
1502
1352
  return /* @__PURE__ */_jsx(RNPressable, {
@@ -1508,6 +1358,17 @@ function NativeSelectCore(param) {
1508
1358
  accessibilityState: {
1509
1359
  selected
1510
1360
  },
1361
+ onLayout: i === Math.max(selectedIndex, 0) ? function (param2) {
1362
+ var {
1363
+ nativeEvent: {
1364
+ layout
1365
+ }
1366
+ } = param2;
1367
+ return setOnFieldRow({
1368
+ top: layout.y,
1369
+ height: layout.height
1370
+ });
1371
+ } : void 0,
1511
1372
  children: row
1512
1373
  }, option.value);
1513
1374
  })]
@@ -1596,10 +1457,14 @@ function NativeSelectCore(param) {
1596
1457
  // sheet at page level and opens as a menu inside another overlay (FZ-7830).
1597
1458
  compactFace,
1598
1459
  panelWidth,
1599
- ...(asMenu && insideOverlay && opensBesideTrigger(options.length) ? {
1460
+ ...(beside ? {
1600
1461
  anchorMode: "attach",
1601
1462
  triggerEcho: false
1602
- } : null),
1463
+ } : isWeb || displayOptions.length === 0 ? null : {
1464
+ popUp: {
1465
+ row: onFieldRow
1466
+ }
1467
+ }),
1603
1468
  triggerA11y: {
1604
1469
  label: ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : fieldA11y === null || fieldA11y === void 0 ? void 0 : fieldA11y.label,
1605
1470
  value: triggerValueText,