@tamagui/floating 3.0.0-beta.924.1 → 3.0.0

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 (27) hide show
  1. package/dist/cjs/interactions/useInteractions.cjs +35 -45
  2. package/dist/cjs/interactions/useInteractions.native.cjs +101 -100
  3. package/dist/cjs/interactions/useInteractions.native.js +101 -100
  4. package/dist/cjs/interactions/useInteractions.native.js.map +1 -1
  5. package/dist/cjs/interactions/useListNavigation.cjs +4 -3
  6. package/dist/cjs/interactions/useListNavigation.native.cjs +5 -4
  7. package/dist/cjs/interactions/useListNavigation.native.js +5 -4
  8. package/dist/cjs/interactions/useListNavigation.native.js.map +1 -1
  9. package/dist/cjs/interactions/utils.native.cjs +3 -10
  10. package/dist/cjs/interactions/utils.native.js +3 -10
  11. package/dist/cjs/interactions/utils.native.js.map +1 -1
  12. package/dist/esm/interactions/useInteractions.mjs +36 -45
  13. package/dist/esm/interactions/useInteractions.mjs.map +1 -1
  14. package/dist/esm/interactions/useInteractions.native.js +102 -100
  15. package/dist/esm/interactions/useInteractions.native.js.map +1 -1
  16. package/dist/esm/interactions/useListNavigation.mjs +4 -3
  17. package/dist/esm/interactions/useListNavigation.mjs.map +1 -1
  18. package/dist/esm/interactions/useListNavigation.native.js +5 -4
  19. package/dist/esm/interactions/useListNavigation.native.js.map +1 -1
  20. package/dist/esm/interactions/utils.native.js +3 -10
  21. package/dist/esm/interactions/utils.native.js.map +1 -1
  22. package/package.json +7 -5
  23. package/src/interactions/useInteractions.ts +61 -59
  24. package/src/interactions/useListNavigation.ts +7 -2
  25. package/types/interactions/useInteractions.d.ts +3 -3
  26. package/types/interactions/useInteractions.d.ts.map +1 -1
  27. package/types/interactions/useListNavigation.d.ts.map +1 -1
@@ -1,10 +1,3 @@
1
- function _instanceof(left, right) {
2
- if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
3
- return !!right[Symbol.hasInstance](left);
4
- } else {
5
- return left instanceof right;
6
- }
7
- }
8
1
  function getDocument(node) {
9
2
  return (node === null || node === void 0 ? void 0 : node.ownerDocument) || document;
10
3
  }
@@ -23,7 +16,7 @@ function contains(parent, child) {
23
16
  return false;
24
17
  }
25
18
  function isShadowRoot(node) {
26
- return _instanceof(node, ShadowRoot);
19
+ return node instanceof ShadowRoot;
27
20
  }
28
21
  function getTarget(event) {
29
22
  if ("composedPath" in event) {
@@ -40,10 +33,10 @@ function activeElement(doc) {
40
33
  return el;
41
34
  }
42
35
  function isHTMLElement(value) {
43
- return _instanceof(value, HTMLElement);
36
+ return value instanceof HTMLElement;
44
37
  }
45
38
  function isElement(value) {
46
- return _instanceof(value, Element);
39
+ return value instanceof Element;
47
40
  }
48
41
  var TYPEABLE_SELECTOR = "input:not([type='hidden']):not([disabled]),[contenteditable]:not([contenteditable='false']),textarea:not([disabled])";
49
42
  function isTypeableElement(element) {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.native.js","names":[],"sources":["esm/interactions/utils.native.js"],"sourcesContent":["function _instanceof(left, right) {\n if (right != null && typeof Symbol !== \"undefined\" && right[Symbol.hasInstance]) {\n return !!right[Symbol.hasInstance](left);\n } else {\n return left instanceof right;\n }\n}\nfunction getDocument(node) {\n return (node === null || node === void 0 ? void 0 : node.ownerDocument) || document;\n}\nfunction contains(parent, child) {\n var _child_getRootNode;\n if (!parent || !child) return false;\n var rootNode = (_child_getRootNode = child.getRootNode) === null || _child_getRootNode === void 0 ? void 0 : _child_getRootNode.call(child);\n if (parent.contains(child)) return true;\n if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n while (next) {\n if (parent === next) return true;\n next = next.parentNode || next.host;\n }\n }\n return false;\n}\nfunction isShadowRoot(node) {\n return _instanceof(node, ShadowRoot);\n}\nfunction getTarget(event) {\n if (\"composedPath\" in event) {\n return event.composedPath()[0];\n }\n return event.target;\n}\nfunction activeElement(doc) {\n var _el_shadowRoot;\n var el = doc.activeElement;\n while ((el === null || el === void 0 ? void 0 : (_el_shadowRoot = el.shadowRoot) === null || _el_shadowRoot === void 0 ? void 0 : _el_shadowRoot.activeElement) != null) {\n el = el.shadowRoot.activeElement;\n }\n return el;\n}\nfunction isHTMLElement(value) {\n return _instanceof(value, HTMLElement);\n}\nfunction isElement(value) {\n return _instanceof(value, Element);\n}\nvar TYPEABLE_SELECTOR = \"input:not([type='hidden']):not([disabled]),[contenteditable]:not([contenteditable='false']),textarea:not([disabled])\";\nfunction isTypeableElement(element) {\n return isHTMLElement(element) && element.matches(TYPEABLE_SELECTOR);\n}\nfunction isTypeableCombobox(element) {\n if (!element) return false;\n return element.getAttribute(\"role\") === \"combobox\" && isTypeableElement(element);\n}\nfunction getPlatform() {\n var uaData = navigator.userAgentData;\n if (uaData === null || uaData === void 0 ? void 0 : uaData.platform) return uaData.platform;\n return navigator.platform;\n}\nfunction getUserAgent() {\n var uaData = navigator.userAgentData;\n if (uaData && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function(param) {\n var { brand, version } = param;\n return `${brand}/${version}`;\n }).join(\" \");\n }\n return navigator.userAgent;\n}\nfunction isSafari() {\n return /apple/i.test(navigator.vendor);\n}\nfunction isMac() {\n return getPlatform().toLowerCase().startsWith(\"mac\") && !navigator.maxTouchPoints;\n}\nfunction isJSDOM() {\n return getUserAgent().includes(\"jsdom/\");\n}\nfunction matchesFocusVisible(element) {\n if (!element || isJSDOM()) return true;\n try {\n return element.matches(\":focus-visible\");\n } catch (e) {\n return true;\n }\n}\nfunction isMouseLikePointerType(pointerType, strict) {\n var values = [\n \"mouse\",\n \"pen\"\n ];\n if (!strict) {\n values.push(\"\", void 0);\n }\n return values.includes(pointerType);\n}\nfunction clearTimeoutIfSet(timeoutRef) {\n if (timeoutRef.current !== -1) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = -1;\n }\n}\nfunction stopEvent(event) {\n event.preventDefault();\n event.stopPropagation();\n}\nfunction isVirtualClick(event) {\n if (event.mozInputSource === 0 && event.isTrusted) return true;\n if (isAndroid() && event.pointerType) {\n return event.type === \"click\" && event.buttons === 1;\n }\n return event.detail === 0 && !event.pointerType;\n}\nfunction isVirtualPointerEvent(event) {\n if (isJSDOM()) return false;\n return !isAndroid() && event.width === 0 && event.height === 0 || isAndroid() && event.width === 1 && event.height === 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === \"mouse\" || event.width < 1 && event.height < 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === \"touch\";\n}\nfunction isAndroid() {\n var re = /android/i;\n return re.test(getPlatform()) || re.test(getUserAgent());\n}\nvar rafId = 0;\nfunction enqueueFocus(el) {\n var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n var { preventScroll = false, cancelPrevious = true, sync = false } = options;\n cancelPrevious && cancelAnimationFrame(rafId);\n var exec = function() {\n return el === null || el === void 0 ? void 0 : el.focus({\n preventScroll\n });\n };\n if (sync) {\n exec();\n } else {\n rafId = requestAnimationFrame(exec);\n }\n}\nfunction isListIndexDisabled(listRef, index, disabledIndices) {\n if (typeof disabledIndices === \"function\") return disabledIndices(index);\n if (disabledIndices) return disabledIndices.includes(index);\n var element = listRef.current[index];\n return element == null || element.hasAttribute(\"disabled\") || element.getAttribute(\"aria-disabled\") === \"true\";\n}\nfunction findNonDisabledListIndex(listRef) {\n var { startingIndex = -1, decrement = false, disabledIndices, amount = 1 } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n var index = startingIndex;\n do {\n index += decrement ? -amount : amount;\n } while (index >= 0 && index <= listRef.current.length - 1 && isListIndexDisabled(listRef, index, disabledIndices));\n return index;\n}\nfunction getMinListIndex(listRef, disabledIndices) {\n return findNonDisabledListIndex(listRef, {\n disabledIndices\n });\n}\nfunction getMaxListIndex(listRef, disabledIndices) {\n return findNonDisabledListIndex(listRef, {\n decrement: true,\n startingIndex: listRef.current.length,\n disabledIndices\n });\n}\nfunction isIndexOutOfListBounds(listRef, index) {\n return index < 0 || index >= listRef.current.length;\n}\nexport {\n activeElement,\n clearTimeoutIfSet,\n contains,\n enqueueFocus,\n findNonDisabledListIndex,\n getDocument,\n getMaxListIndex,\n getMinListIndex,\n getTarget,\n isElement,\n isHTMLElement,\n isIndexOutOfListBounds,\n isListIndexDisabled,\n isMac,\n isMouseLikePointerType,\n isSafari,\n isTypeableCombobox,\n isTypeableElement,\n isVirtualClick,\n isVirtualPointerEvent,\n matchesFocusVisible,\n stopEvent\n};\n//# sourceMappingURL=utils.js.map\n"],"mappings":";AAAA,SAAS,YAAY,MAAM,OAAO;CAChC,IAAI,SAAS,QAAQ,OAAO,WAAW,eAAe,MAAM,OAAO,cAAc;EAC/E,OAAO,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,IAAI;CACzC,OAAO;EACL,OAAO,gBAAgB;CACzB;AACF;AACA,SAAS,YAAY,MAAM;CACzB,QAAQ,SAAS,QAAQ,SAAS,KAAK,IAAI,KAAK,IAAI,KAAK,kBAAkB;AAC7E;AACA,SAAS,SAAS,QAAQ,OAAO;CAC/B,IAAI;CACJ,IAAI,CAAC,UAAU,CAAC,OAAO,OAAO;CAC9B,IAAI,YAAY,qBAAqB,MAAM,iBAAiB,QAAQ,uBAAuB,KAAK,IAAI,KAAK,IAAI,mBAAmB,KAAK,KAAK;CAC1I,IAAI,OAAO,SAAS,KAAK,GAAG,OAAO;CACnC,IAAI,YAAY,aAAa,QAAQ,GAAG;EACtC,IAAI,OAAO;EACX,OAAO,MAAM;GACX,IAAI,WAAW,MAAM,OAAO;GAC5B,OAAO,KAAK,cAAc,KAAK;EACjC;CACF;CACA,OAAO;AACT;AACA,SAAS,aAAa,MAAM;CAC1B,OAAO,YAAY,MAAM,UAAU;AACrC;AACA,SAAS,UAAU,OAAO;CACxB,IAAI,kBAAkB,OAAO;EAC3B,OAAO,MAAM,aAAa,CAAC,CAAC;CAC9B;CACA,OAAO,MAAM;AACf;AACA,SAAS,cAAc,KAAK;CAC1B,IAAI;CACJ,IAAI,KAAK,IAAI;CACb,QAAQ,OAAO,QAAQ,OAAO,KAAK,IAAI,KAAK,KAAK,iBAAiB,GAAG,gBAAgB,QAAQ,mBAAmB,KAAK,IAAI,KAAK,IAAI,eAAe,kBAAkB,MAAM;EACvK,KAAK,GAAG,WAAW;CACrB;CACA,OAAO;AACT;AACA,SAAS,cAAc,OAAO;CAC5B,OAAO,YAAY,OAAO,WAAW;AACvC;AACA,SAAS,UAAU,OAAO;CACxB,OAAO,YAAY,OAAO,OAAO;AACnC;AACA,IAAI,oBAAoB;AACxB,SAAS,kBAAkB,SAAS;CAClC,OAAO,cAAc,OAAO,KAAK,QAAQ,QAAQ,iBAAiB;AACpE;AACA,SAAS,mBAAmB,SAAS;CACnC,IAAI,CAAC,SAAS,OAAO;CACrB,OAAO,QAAQ,aAAa,MAAM,MAAM,cAAc,kBAAkB,OAAO;AACjF;AACA,SAAS,cAAc;CACrB,IAAI,SAAS,UAAU;CACvB,IAAI,WAAW,QAAQ,WAAW,KAAK,IAAI,KAAK,IAAI,OAAO,UAAU,OAAO,OAAO;CACnF,OAAO,UAAU;AACnB;AACA,SAAS,eAAe;CACtB,IAAI,SAAS,UAAU;CACvB,IAAI,UAAU,MAAM,QAAQ,OAAO,MAAM,GAAG;EAC1C,OAAO,OAAO,OAAO,IAAI,SAAS,OAAO;GACvC,IAAI,EAAE,OAAO,YAAY;GACzB,OAAO,GAAG,MAAM,GAAG;EACrB,CAAC,CAAC,CAAC,KAAK,GAAG;CACb;CACA,OAAO,UAAU;AACnB;AACA,SAAS,WAAW;CAClB,OAAO,SAAS,KAAK,UAAU,MAAM;AACvC;AACA,SAAS,QAAQ;CACf,OAAO,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,KAAK,KAAK,CAAC,UAAU;AACrE;AACA,SAAS,UAAU;CACjB,OAAO,aAAa,CAAC,CAAC,SAAS,QAAQ;AACzC;AACA,SAAS,oBAAoB,SAAS;CACpC,IAAI,CAAC,WAAW,QAAQ,GAAG,OAAO;CAClC,IAAI;EACF,OAAO,QAAQ,QAAQ,gBAAgB;CACzC,SAAS,GAAG;EACV,OAAO;CACT;AACF;AACA,SAAS,uBAAuB,aAAa,QAAQ;CACnD,IAAI,SAAS,CACX,SACA,KACF;CACA,IAAI,CAAC,QAAQ;EACX,OAAO,KAAK,IAAI,KAAK,CAAC;CACxB;CACA,OAAO,OAAO,SAAS,WAAW;AACpC;AACA,SAAS,kBAAkB,YAAY;CACrC,IAAI,WAAW,YAAY,CAAC,GAAG;EAC7B,aAAa,WAAW,OAAO;EAC/B,WAAW,UAAU,CAAC;CACxB;AACF;AACA,SAAS,UAAU,OAAO;CACxB,MAAM,eAAe;CACrB,MAAM,gBAAgB;AACxB;AACA,SAAS,eAAe,OAAO;CAC7B,IAAI,MAAM,mBAAmB,KAAK,MAAM,WAAW,OAAO;CAC1D,IAAI,UAAU,KAAK,MAAM,aAAa;EACpC,OAAO,MAAM,SAAS,WAAW,MAAM,YAAY;CACrD;CACA,OAAO,MAAM,WAAW,KAAK,CAAC,MAAM;AACtC;AACA,SAAS,sBAAsB,OAAO;CACpC,IAAI,QAAQ,GAAG,OAAO;CACtB,OAAO,CAAC,UAAU,KAAK,MAAM,UAAU,KAAK,MAAM,WAAW,KAAK,UAAU,KAAK,MAAM,UAAU,KAAK,MAAM,WAAW,KAAK,MAAM,aAAa,KAAK,MAAM,WAAW,KAAK,MAAM,gBAAgB,WAAW,MAAM,QAAQ,KAAK,MAAM,SAAS,KAAK,MAAM,aAAa,KAAK,MAAM,WAAW,KAAK,MAAM,gBAAgB;AACxT;AACA,SAAS,YAAY;CACnB,IAAI,KAAK;CACT,OAAO,GAAG,KAAK,YAAY,CAAC,KAAK,GAAG,KAAK,aAAa,CAAC;AACzD;AACA,IAAI,QAAQ;AACZ,SAAS,aAAa,IAAI;CACxB,IAAI,UAAU,UAAU,SAAS,KAAK,UAAU,OAAO,KAAK,IAAI,UAAU,KAAK,CAAC;CAChF,IAAI,EAAE,gBAAgB,OAAO,iBAAiB,MAAM,OAAO,UAAU;CACrE,kBAAkB,qBAAqB,KAAK;CAC5C,IAAI,OAAO,WAAW;EACpB,OAAO,OAAO,QAAQ,OAAO,KAAK,IAAI,KAAK,IAAI,GAAG,MAAM,EACtD,cACF,CAAC;CACH;CACA,IAAI,MAAM;EACR,KAAK;CACP,OAAO;EACL,QAAQ,sBAAsB,IAAI;CACpC;AACF;AACA,SAAS,oBAAoB,SAAS,OAAO,iBAAiB;CAC5D,IAAI,OAAO,oBAAoB,YAAY,OAAO,gBAAgB,KAAK;CACvE,IAAI,iBAAiB,OAAO,gBAAgB,SAAS,KAAK;CAC1D,IAAI,UAAU,QAAQ,QAAQ;CAC9B,OAAO,WAAW,QAAQ,QAAQ,aAAa,UAAU,KAAK,QAAQ,aAAa,eAAe,MAAM;AAC1G;AACA,SAAS,yBAAyB,SAAS;CACzC,IAAI,EAAE,gBAAgB,CAAC,GAAG,YAAY,OAAO,iBAAiB,SAAS,MAAM,UAAU,SAAS,KAAK,UAAU,OAAO,KAAK,IAAI,UAAU,KAAK,CAAC;CAC/I,IAAI,QAAQ;CACZ,GAAG;EACD,SAAS,YAAY,CAAC,SAAS;CACjC,SAAS,SAAS,KAAK,SAAS,QAAQ,QAAQ,SAAS,KAAK,oBAAoB,SAAS,OAAO,eAAe;CACjH,OAAO;AACT;AACA,SAAS,gBAAgB,SAAS,iBAAiB;CACjD,OAAO,yBAAyB,SAAS,EACvC,gBACF,CAAC;AACH;AACA,SAAS,gBAAgB,SAAS,iBAAiB;CACjD,OAAO,yBAAyB,SAAS;EACvC,WAAW;EACX,eAAe,QAAQ,QAAQ;EAC/B;CACF,CAAC;AACH;AACA,SAAS,uBAAuB,SAAS,OAAO;CAC9C,OAAO,QAAQ,KAAK,SAAS,QAAQ,QAAQ;AAC/C"}
1
+ {"version":3,"file":"utils.native.js","names":[],"sources":["esm/interactions/utils.native.js"],"sourcesContent":["function getDocument(node) {\n return (node === null || node === void 0 ? void 0 : node.ownerDocument) || document;\n}\nfunction contains(parent, child) {\n var _child_getRootNode;\n if (!parent || !child) return false;\n var rootNode = (_child_getRootNode = child.getRootNode) === null || _child_getRootNode === void 0 ? void 0 : _child_getRootNode.call(child);\n if (parent.contains(child)) return true;\n if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n while (next) {\n if (parent === next) return true;\n next = next.parentNode || next.host;\n }\n }\n return false;\n}\nfunction isShadowRoot(node) {\n return node instanceof ShadowRoot;\n}\nfunction getTarget(event) {\n if (\"composedPath\" in event) {\n return event.composedPath()[0];\n }\n return event.target;\n}\nfunction activeElement(doc) {\n var _el_shadowRoot;\n var el = doc.activeElement;\n while ((el === null || el === void 0 ? void 0 : (_el_shadowRoot = el.shadowRoot) === null || _el_shadowRoot === void 0 ? void 0 : _el_shadowRoot.activeElement) != null) {\n el = el.shadowRoot.activeElement;\n }\n return el;\n}\nfunction isHTMLElement(value) {\n return value instanceof HTMLElement;\n}\nfunction isElement(value) {\n return value instanceof Element;\n}\nvar TYPEABLE_SELECTOR = \"input:not([type='hidden']):not([disabled]),[contenteditable]:not([contenteditable='false']),textarea:not([disabled])\";\nfunction isTypeableElement(element) {\n return isHTMLElement(element) && element.matches(TYPEABLE_SELECTOR);\n}\nfunction isTypeableCombobox(element) {\n if (!element) return false;\n return element.getAttribute(\"role\") === \"combobox\" && isTypeableElement(element);\n}\nfunction getPlatform() {\n var uaData = navigator.userAgentData;\n if (uaData === null || uaData === void 0 ? void 0 : uaData.platform) return uaData.platform;\n return navigator.platform;\n}\nfunction getUserAgent() {\n var uaData = navigator.userAgentData;\n if (uaData && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function(param) {\n var { brand, version } = param;\n return `${brand}/${version}`;\n }).join(\" \");\n }\n return navigator.userAgent;\n}\nfunction isSafari() {\n return /apple/i.test(navigator.vendor);\n}\nfunction isMac() {\n return getPlatform().toLowerCase().startsWith(\"mac\") && !navigator.maxTouchPoints;\n}\nfunction isJSDOM() {\n return getUserAgent().includes(\"jsdom/\");\n}\nfunction matchesFocusVisible(element) {\n if (!element || isJSDOM()) return true;\n try {\n return element.matches(\":focus-visible\");\n } catch (e) {\n return true;\n }\n}\nfunction isMouseLikePointerType(pointerType, strict) {\n var values = [\n \"mouse\",\n \"pen\"\n ];\n if (!strict) {\n values.push(\"\", void 0);\n }\n return values.includes(pointerType);\n}\nfunction clearTimeoutIfSet(timeoutRef) {\n if (timeoutRef.current !== -1) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = -1;\n }\n}\nfunction stopEvent(event) {\n event.preventDefault();\n event.stopPropagation();\n}\nfunction isVirtualClick(event) {\n if (event.mozInputSource === 0 && event.isTrusted) return true;\n if (isAndroid() && event.pointerType) {\n return event.type === \"click\" && event.buttons === 1;\n }\n return event.detail === 0 && !event.pointerType;\n}\nfunction isVirtualPointerEvent(event) {\n if (isJSDOM()) return false;\n return !isAndroid() && event.width === 0 && event.height === 0 || isAndroid() && event.width === 1 && event.height === 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === \"mouse\" || event.width < 1 && event.height < 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === \"touch\";\n}\nfunction isAndroid() {\n var re = /android/i;\n return re.test(getPlatform()) || re.test(getUserAgent());\n}\nvar rafId = 0;\nfunction enqueueFocus(el) {\n var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n var { preventScroll = false, cancelPrevious = true, sync = false } = options;\n cancelPrevious && cancelAnimationFrame(rafId);\n var exec = function() {\n return el === null || el === void 0 ? void 0 : el.focus({\n preventScroll\n });\n };\n if (sync) {\n exec();\n } else {\n rafId = requestAnimationFrame(exec);\n }\n}\nfunction isListIndexDisabled(listRef, index, disabledIndices) {\n if (typeof disabledIndices === \"function\") return disabledIndices(index);\n if (disabledIndices) return disabledIndices.includes(index);\n var element = listRef.current[index];\n return element == null || element.hasAttribute(\"disabled\") || element.getAttribute(\"aria-disabled\") === \"true\";\n}\nfunction findNonDisabledListIndex(listRef) {\n var { startingIndex = -1, decrement = false, disabledIndices, amount = 1 } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n var index = startingIndex;\n do {\n index += decrement ? -amount : amount;\n } while (index >= 0 && index <= listRef.current.length - 1 && isListIndexDisabled(listRef, index, disabledIndices));\n return index;\n}\nfunction getMinListIndex(listRef, disabledIndices) {\n return findNonDisabledListIndex(listRef, {\n disabledIndices\n });\n}\nfunction getMaxListIndex(listRef, disabledIndices) {\n return findNonDisabledListIndex(listRef, {\n decrement: true,\n startingIndex: listRef.current.length,\n disabledIndices\n });\n}\nfunction isIndexOutOfListBounds(listRef, index) {\n return index < 0 || index >= listRef.current.length;\n}\nexport {\n activeElement,\n clearTimeoutIfSet,\n contains,\n enqueueFocus,\n findNonDisabledListIndex,\n getDocument,\n getMaxListIndex,\n getMinListIndex,\n getTarget,\n isElement,\n isHTMLElement,\n isIndexOutOfListBounds,\n isListIndexDisabled,\n isMac,\n isMouseLikePointerType,\n isSafari,\n isTypeableCombobox,\n isTypeableElement,\n isVirtualClick,\n isVirtualPointerEvent,\n matchesFocusVisible,\n stopEvent\n};\n//# sourceMappingURL=utils.js.map\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@tamagui/floating",
3
- "version": "3.0.0-beta.924.1",
3
+ "version": "3.0.0",
4
+ "license": "MIT",
4
5
  "source": "src/index.ts",
5
6
  "files": [
6
7
  "src",
@@ -36,12 +37,12 @@
36
37
  "dependencies": {
37
38
  "@floating-ui/react-dom": "^2.1.6",
38
39
  "@floating-ui/react-native": "^0.10.7",
39
- "@tamagui/use-event": "3.0.0-beta.924.1"
40
+ "@tamagui/use-event": "3.0.0"
40
41
  },
41
42
  "devDependencies": {
42
- "@tamagui/build": "3.0.0-beta.924.1",
43
+ "@tamagui/build": "3.0.0",
43
44
  "react": "19.2.3",
44
- "react-native": "0.86.2"
45
+ "react-native": "0.87.1"
45
46
  },
46
47
  "peerDependencies": {
47
48
  "react": ">=19",
@@ -51,5 +52,6 @@
51
52
  "type": "git",
52
53
  "url": "git+https://github.com/tamagui/tamagui.git",
53
54
  "directory": "code/core/floating"
54
- }
55
+ },
56
+ "releaseSourceCommit": "15fbca480b143f876f6975601e23a17d3f90d2ee"
55
57
  }
@@ -1,82 +1,84 @@
1
+ import { useCallback, useMemo } from 'react'
1
2
  import type { HTMLProps } from 'react'
2
3
  import type { ElementProps } from './types'
3
4
 
5
+ type PropGetter = (userProps?: Record<string, any>) => Record<string, any>
6
+
4
7
  // merges prop getters from multiple interaction hooks.
5
8
  // event handlers are chained (all run), first non-undefined return value wins.
6
9
  // non-function props: user props override hook props.
10
+ //
11
+ // the getters are memoized on the hook outputs so a consumer can hold the
12
+ // result in context: every interaction hook memoizes its props, so a render
13
+ // that changes none of them keeps the same getters
7
14
  export function useInteractions(propsList: Array<ElementProps | void>) {
8
- const filtered = propsList.filter(Boolean) as ElementProps[]
9
-
10
- // collect all event handlers by event name for each element type
11
- const referenceFns = new Map<string, Array<(...args: any[]) => any>>()
12
- const floatingFns = new Map<string, Array<(...args: any[]) => any>>()
13
- const itemFns = new Map<string, Array<(...args: any[]) => any>>()
15
+ const referenceDeps = propsList.map((props) => props?.reference)
16
+ const floatingDeps = propsList.map((props) => props?.floating)
17
+ const itemDeps = propsList.map((props) => props?.item)
14
18
 
15
- const referenceStatic: Record<string, any> = {}
16
- const floatingStatic: Record<string, any> = {}
19
+ const getReferenceProps = useCallback<PropGetter>(
20
+ (userProps) => mergeProps(referenceDeps, userProps),
21
+ referenceDeps
22
+ )
23
+ const getFloatingProps = useCallback<PropGetter>(
24
+ (userProps) => mergeProps(floatingDeps, userProps),
25
+ floatingDeps
26
+ )
27
+ const getItemProps = useCallback<PropGetter>(
28
+ (userProps) => mergeProps(itemDeps, userProps, true),
29
+ itemDeps
30
+ )
17
31
 
18
- for (const props of filtered) {
19
- if (props.reference) {
20
- collectProps(props.reference as any, referenceFns, referenceStatic)
21
- }
22
- if (props.floating) {
23
- collectProps(props.floating as any, floatingFns, floatingStatic)
24
- }
25
- if (props.item && typeof props.item === 'object') {
26
- collectProps(props.item as any, itemFns, {})
27
- }
28
- }
29
-
30
- return {
31
- getReferenceProps(userProps?: HTMLProps<Element>) {
32
- return buildProps(referenceFns, referenceStatic, userProps)
33
- },
34
- getFloatingProps(userProps?: HTMLProps<HTMLElement>) {
35
- return buildProps(floatingFns, floatingStatic, userProps)
36
- },
37
- getItemProps(userProps?: HTMLProps<HTMLElement>) {
38
- return buildProps(itemFns, {}, userProps)
39
- },
40
- }
32
+ return useMemo(
33
+ () => ({
34
+ getReferenceProps: getReferenceProps as (
35
+ userProps?: HTMLProps<Element>
36
+ ) => Record<string, any>,
37
+ getFloatingProps: getFloatingProps as (
38
+ userProps?: HTMLProps<HTMLElement>
39
+ ) => Record<string, any>,
40
+ getItemProps: getItemProps as (
41
+ userProps?: HTMLProps<HTMLElement>
42
+ ) => Record<string, any>,
43
+ }),
44
+ [getReferenceProps, getFloatingProps, getItemProps]
45
+ )
41
46
  }
42
47
 
43
- function collectProps(
44
- props: Record<string, any>,
45
- fnMap: Map<string, Array<(...args: any[]) => any>>,
46
- staticMap: Record<string, any>
47
- ) {
48
- for (const key of Object.keys(props)) {
49
- if (typeof props[key] === 'function') {
50
- let arr = fnMap.get(key)
51
- if (!arr) {
52
- arr = []
53
- fnMap.set(key, arr)
48
+ function mergeProps(
49
+ list: Array<Record<string, any> | ((...args: any[]) => any) | void>,
50
+ userProps?: Record<string, any>,
51
+ objectsOnly = false
52
+ ): Record<string, any> {
53
+ const fnMap = new Map<string, Array<(...args: any[]) => any>>()
54
+ // hook static props first, then user props override
55
+ const result: Record<string, any> = {}
56
+
57
+ for (const props of list) {
58
+ if (!props || (objectsOnly && typeof props !== 'object')) continue
59
+ for (const key of Object.keys(props)) {
60
+ const value = (props as Record<string, any>)[key]
61
+ if (typeof value === 'function') {
62
+ let arr = fnMap.get(key)
63
+ if (!arr) {
64
+ arr = []
65
+ fnMap.set(key, arr)
66
+ }
67
+ arr.push(value)
68
+ } else {
69
+ result[key] = value
54
70
  }
55
- arr.push(props[key])
56
- } else {
57
- staticMap[key] = props[key]
58
71
  }
59
72
  }
60
- }
61
-
62
- function buildProps(
63
- fnMap: Map<string, Array<(...args: any[]) => any>>,
64
- staticProps: Record<string, any>,
65
- userProps?: Record<string, any>
66
- ): Record<string, any> {
67
- // hook static props first, then user props override
68
- const result: Record<string, any> = { ...staticProps }
69
73
 
70
74
  // merge event handlers from hooks
71
75
  for (const [key, fns] of fnMap) {
72
- const hookHandler = (...args: any[]) => {
76
+ result[key] = (...args: any[]) => {
73
77
  for (const fn of fns) {
74
- const result = fn(...args)
75
- if (result !== undefined) return result
78
+ const out = fn(...args)
79
+ if (out !== undefined) return out
76
80
  }
77
81
  }
78
-
79
- result[key] = hookHandler
80
82
  }
81
83
 
82
84
  // user props override everything — but chain event handlers
@@ -525,6 +525,11 @@ export function useListNavigation(
525
525
  virtual,
526
526
  ])
527
527
 
528
+ // read at event time so the item props stay stable across the floating
529
+ // element mounting; consumers hold them in context beside every item
530
+ const floatingRef = useRef(elements.floating)
531
+ floatingRef.current = elements.floating
532
+
528
533
  const item = useMemo(() => {
529
534
  function syncCurrentTarget(currentTarget: HTMLElement | null) {
530
535
  if (!latestOpenRef.current) return
@@ -563,13 +568,13 @@ export function useListNavigation(
563
568
  onNavigate()
564
569
 
565
570
  if (!virtual) {
566
- elements.floating?.focus({ preventScroll: true })
571
+ floatingRef.current?.focus({ preventScroll: true })
567
572
  }
568
573
  },
569
574
  }
570
575
 
571
576
  return itemProps
572
- }, [latestOpenRef, focusItemOnHover, listRef, onNavigate, virtual, elements.floating])
577
+ }, [latestOpenRef, focusItemOnHover, listRef, onNavigate, virtual])
573
578
 
574
579
  return useMemo(
575
580
  () => (enabled ? { reference, floating, item } : {}),
@@ -1,8 +1,8 @@
1
1
  import type { HTMLProps } from 'react';
2
2
  import type { ElementProps } from './types';
3
3
  export declare function useInteractions(propsList: Array<ElementProps | void>): {
4
- getReferenceProps(userProps?: HTMLProps<Element>): Record<string, any>;
5
- getFloatingProps(userProps?: HTMLProps<HTMLElement>): Record<string, any>;
6
- getItemProps(userProps?: HTMLProps<HTMLElement>): Record<string, any>;
4
+ getReferenceProps: (userProps?: HTMLProps<Element>) => Record<string, any>;
5
+ getFloatingProps: (userProps?: HTMLProps<HTMLElement>) => Record<string, any>;
6
+ getItemProps: (userProps?: HTMLProps<HTMLElement>) => Record<string, any>;
7
7
  };
8
8
  //# sourceMappingURL=useInteractions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useInteractions.d.ts","sourceRoot":"","sources":["../../src/interactions/useInteractions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAK3C,wBAAgB,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;IAwBjE,iBAAiB,aAAa,SAAS,CAAC,OAAO,CAAC;IAGhD,gBAAgB,aAAa,SAAS,CAAC,WAAW,CAAC;IAGnD,YAAY,aAAa,SAAS,CAAC,WAAW,CAAC;EAIlD"}
1
+ {"version":3,"file":"useInteractions.d.ts","sourceRoot":"","sources":["../../src/interactions/useInteractions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAW3C,wBAAgB,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;uBAoBvB,CACtC,SAAS,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,KAC3B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;sBACc,CACpC,SAAS,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,KAC/B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;kBACM,CAC5B,SAAS,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,KAC/B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;EAI7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"useListNavigation.d.ts","sourceRoot":"","sources":["../../src/interactions/useListNavigation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,sBAAsB,EACvB,MAAM,SAAS,CAAA;AAgFhB,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,0BAA0B,EACnC,KAAK,EAAE,sBAAsB,GAC5B,YAAY,CAued"}
1
+ {"version":3,"file":"useListNavigation.d.ts","sourceRoot":"","sources":["../../src/interactions/useListNavigation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,sBAAsB,EACvB,MAAM,SAAS,CAAA;AAgFhB,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,0BAA0B,EACnC,KAAK,EAAE,sBAAsB,GAC5B,YAAY,CA4ed"}