@basic-ui/core 0.0.47 → 0.0.48

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.
@@ -1904,6 +1904,7 @@ const useMenuListContext = () => react.useContext(menuListContext);
1904
1904
  const Menu = /*#__PURE__*/react.forwardRef(function Menu(props, forwardedRef) {
1905
1905
  const {
1906
1906
  as: Comp = react.Fragment,
1907
+ innerAs,
1907
1908
  open: openProp,
1908
1909
  defaultOpen = false,
1909
1910
  onChange: onChangeProp,
@@ -1915,25 +1916,29 @@ const Menu = /*#__PURE__*/react.forwardRef(function Menu(props, forwardedRef) {
1915
1916
  const [open, onChange] = useControlledState(openProp, onChangeProp, defaultOpen, setState => (e, isOpen) => {
1916
1917
  setState(isOpen);
1917
1918
  });
1919
+ const [offsetFn, setOffsetFn] = react.useState(undefined);
1918
1920
  menuListIdRef.current = react.useId();
1919
- const offset = react.useRef([0, 0]);
1920
- const offsetFn = react.useCallback(({
1921
- reference
1922
- }) => [offset.current[0], offset.current[1] - reference.height], []);
1923
1921
  const isContextMenu = react.useRef(false);
1922
+
1923
+ if (!open && offsetFn) {
1924
+ setOffsetFn(undefined);
1925
+ }
1926
+
1924
1927
  const value = {
1925
1928
  menuListIdRef,
1926
1929
  openWithArrowKeyRef,
1927
1930
  open,
1928
1931
  onChange,
1929
1932
  buttonRef,
1930
- offset,
1931
1933
  offsetFn,
1934
+ setOffsetFn,
1932
1935
  isContextMenu
1933
1936
  };
1934
1937
  return /*#__PURE__*/jsxRuntime.jsx(MenuProvider, {
1935
1938
  value: value,
1936
- children: /*#__PURE__*/jsxRuntime.jsx(Comp, {
1939
+ children: /*#__PURE__*/jsxRuntime.jsx(Comp, { ...(Comp !== react.Fragment ? {
1940
+ as: innerAs
1941
+ } : {}),
1937
1942
  ref: forwardedRef,
1938
1943
  ...otherProps
1939
1944
  })
@@ -1943,6 +1948,7 @@ const Menu = /*#__PURE__*/react.forwardRef(function Menu(props, forwardedRef) {
1943
1948
  const MenuButton = /*#__PURE__*/react.forwardRef(function MenuButton(props, forwardedRef) {
1944
1949
  const {
1945
1950
  as: Comp = 'button',
1951
+ innerAs,
1946
1952
  id: preferredId,
1947
1953
  onClick,
1948
1954
  onKeyDown,
@@ -1978,7 +1984,7 @@ const MenuButton = /*#__PURE__*/react.forwardRef(function MenuButton(props, forw
1978
1984
  openWithArrowKeyRef.current = e.key;
1979
1985
  }
1980
1986
 
1981
- onChange && onChange(e, true);
1987
+ onChange(e, true);
1982
1988
  e.preventDefault();
1983
1989
  }
1984
1990
  };
@@ -1989,11 +1995,12 @@ const MenuButton = /*#__PURE__*/react.forwardRef(function MenuButton(props, forw
1989
1995
  }
1990
1996
 
1991
1997
  buttonRef.current = e.currentTarget;
1992
- onChange && onChange(e, !open);
1998
+ onChange(e, !open);
1993
1999
  };
1994
2000
 
1995
2001
  return /*#__PURE__*/jsxRuntime.jsx(Comp, {
1996
2002
  ref: forwardedRef,
2003
+ as: innerAs,
1997
2004
  id: buttonId,
1998
2005
  role: "button",
1999
2006
  type: "button",
@@ -2008,9 +2015,10 @@ const MenuButton = /*#__PURE__*/react.forwardRef(function MenuButton(props, forw
2008
2015
  });
2009
2016
  });
2010
2017
 
2011
- const ContextMenuTrigger = /*#__PURE__*/react.forwardRef(function MenuButton(props, forwardedRef) {
2018
+ const ContextMenuTrigger = /*#__PURE__*/react.forwardRef(function ContextMenuTrigger(props, forwardedRef) {
2012
2019
  const {
2013
2020
  as: Comp = 'div',
2021
+ innerAs,
2014
2022
  id: preferredId,
2015
2023
  onContextMenu,
2016
2024
  disabled,
@@ -2021,7 +2029,7 @@ const ContextMenuTrigger = /*#__PURE__*/react.forwardRef(function MenuButton(pro
2021
2029
  open,
2022
2030
  buttonRef,
2023
2031
  onChange,
2024
- offset,
2032
+ setOffsetFn,
2025
2033
  isContextMenu
2026
2034
  } = useMenuContext();
2027
2035
  const idGenerated = react.useId();
@@ -2033,15 +2041,20 @@ const ContextMenuTrigger = /*#__PURE__*/react.forwardRef(function MenuButton(pro
2033
2041
  }
2034
2042
 
2035
2043
  const rect = e.currentTarget.getBoundingClientRect();
2036
- offset.current = [e.nativeEvent.x - rect.x, e.nativeEvent.y - rect.y];
2037
2044
  isContextMenu.current = true;
2038
2045
  buttonRef.current = e.currentTarget;
2039
- onChange && onChange(e, !open);
2046
+ onChange(e, true);
2047
+ const mouseX = e.nativeEvent.x;
2048
+ const mouseY = e.nativeEvent.y;
2049
+ setOffsetFn(() => ({
2050
+ reference
2051
+ }) => [mouseX - rect.x, mouseY - rect.y - reference.height]);
2040
2052
  e.preventDefault();
2041
2053
  };
2042
2054
 
2043
2055
  return /*#__PURE__*/jsxRuntime.jsx(Comp, {
2044
2056
  ref: forwardedRef,
2057
+ as: innerAs,
2045
2058
  id: id,
2046
2059
  "aria-haspopup": true,
2047
2060
  "aria-controls": menuListIdRef.current,
@@ -2056,6 +2069,7 @@ const ContextMenuTrigger = /*#__PURE__*/react.forwardRef(function MenuButton(pro
2056
2069
  const MenuItem = /*#__PURE__*/react.forwardRef(function MenuItem(props, forwardedRef) {
2057
2070
  const {
2058
2071
  as: Comp = 'li',
2072
+ innerAs,
2059
2073
  disabled,
2060
2074
  onSelect,
2061
2075
  onClick,
@@ -2074,7 +2088,7 @@ const MenuItem = /*#__PURE__*/react.forwardRef(function MenuItem(props, forwarde
2074
2088
  const itemId = react.useId();
2075
2089
  const isActive = ref.current && ref.current === navigationItem;
2076
2090
  const handleSelect = wrapEvent(onSelect, e => {
2077
- onChange && onChange(e, false);
2091
+ onChange(e, false);
2078
2092
  buttonRef.current?.focus();
2079
2093
  e.preventDefault();
2080
2094
  });
@@ -2100,6 +2114,7 @@ const MenuItem = /*#__PURE__*/react.forwardRef(function MenuItem(props, forwarde
2100
2114
 
2101
2115
  return /*#__PURE__*/jsxRuntime.jsx(Comp, {
2102
2116
  ref: assignMultipleRefs(ref, forwardedRef),
2117
+ as: innerAs,
2103
2118
  id: disabled ? undefined : itemId,
2104
2119
  "data-menu-item": "",
2105
2120
  "data-highlighted": isActive ? '' : undefined,
@@ -2122,11 +2137,13 @@ const useEnhancedEffect$1 = typeof window !== 'undefined' ? react.useLayoutEffec
2122
2137
  const MenuList = /*#__PURE__*/react.forwardRef(function MenuList(props, forwardedRef) {
2123
2138
  const {
2124
2139
  as: Comp = 'ul',
2140
+ innerAs,
2125
2141
  onKeyDown,
2126
2142
  id: preferredId,
2127
2143
  defaultActiveItemValue,
2128
2144
  ...otherProps
2129
2145
  } = props;
2146
+ const interactedOutside = react.useRef(false);
2130
2147
  const itemSearchStr = react.useRef('');
2131
2148
  const itemSearchClearTimeout = react.useRef();
2132
2149
  const {
@@ -2170,22 +2187,34 @@ const MenuList = /*#__PURE__*/react.forwardRef(function MenuList(props, forwarde
2170
2187
  openWithArrowKeyRef.current = null;
2171
2188
  setMounted(true);
2172
2189
  }, [mounted, navigationItem, onNavigate, openWithArrowKeyRef, scope, defaultActiveItemValue]);
2173
- useOnClickOutside(menuListRef, e => {
2174
- console.log(isContextMenu.current);
2190
+ const handleClickOutside = react.useCallback(e => {
2191
+ if (!interactedOutside.current) {
2192
+ // First interaction should be ignored, because
2193
+ // this is what triggered the context menu to open
2194
+ interactedOutside.current = true;
2195
+ return;
2196
+ }
2175
2197
 
2176
- if (isContextMenu.current || e.target instanceof HTMLElement && e.target !== buttonRef.current && !buttonRef.current?.contains(e.target)) {
2177
- onChange && onChange(e, false);
2198
+ if (isContextMenu.current) {
2199
+ if (e.button === 0) {
2200
+ onChange(e, false);
2201
+ }
2202
+ } else {
2203
+ if (e.target instanceof HTMLElement && e.target !== buttonRef.current && !buttonRef.current?.contains(e.target)) {
2204
+ onChange(e, false);
2205
+ }
2178
2206
  }
2179
2207
 
2180
2208
  e.preventDefault();
2181
- }, true);
2209
+ }, [buttonRef, isContextMenu, onChange]);
2210
+ useOnClickOutside(menuListRef, handleClickOutside, open);
2182
2211
 
2183
2212
  function handleKeyDown(e) {
2184
2213
  switch (e.key) {
2185
2214
  case 'Escape':
2186
2215
  case 'Tab':
2187
2216
  {
2188
- onChange && onChange(e, false);
2217
+ onChange(e, false);
2189
2218
  e.preventDefault(); // prevents focusing on next element, because we will be handling it
2190
2219
 
2191
2220
  itemSearchStr.current = '';
@@ -2272,6 +2301,7 @@ const MenuList = /*#__PURE__*/react.forwardRef(function MenuList(props, forwarde
2272
2301
  }
2273
2302
 
2274
2303
  if (!open) {
2304
+ interactedOutside.current = false;
2275
2305
  return null;
2276
2306
  }
2277
2307
 
@@ -2282,6 +2312,7 @@ const MenuList = /*#__PURE__*/react.forwardRef(function MenuList(props, forwarde
2282
2312
  },
2283
2313
  children: /*#__PURE__*/jsxRuntime.jsx(Comp, {
2284
2314
  ref: assignMultipleRefs(forwardedRef, menuListRef),
2315
+ as: innerAs,
2285
2316
  id: menuListIdRef.current,
2286
2317
  role: "menu",
2287
2318
  "aria-labelledby": buttonRef.current?.id,
@@ -2426,6 +2457,7 @@ const PopperArrow = /*#__PURE__*/react.forwardRef(function PopperArrow({
2426
2457
  const MenuPopover = /*#__PURE__*/react.forwardRef(function MenuPopover(props, forwardedRef) {
2427
2458
  const {
2428
2459
  as = 'div',
2460
+ innerAs,
2429
2461
  ...otherProps
2430
2462
  } = props;
2431
2463
  const {
@@ -2441,6 +2473,7 @@ const MenuPopover = /*#__PURE__*/react.forwardRef(function MenuPopover(props, fo
2441
2473
 
2442
2474
  return /*#__PURE__*/jsxRuntime.jsx(Popper, {
2443
2475
  as: as,
2476
+ innerAs: innerAs,
2444
2477
  ref: forwardedRef,
2445
2478
  anchorEl: buttonRef,
2446
2479
  offsetFn: offsetFn,