@particle-academy/react-fancy 2.3.1 → 2.3.3

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/index.cjs CHANGED
@@ -6943,84 +6943,15 @@ function ContextMenuTrigger({
6943
6943
  return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-react-fancy-context-menu-trigger": "", onContextMenu: handleContextMenu, className: cn(className), children });
6944
6944
  }
6945
6945
  ContextMenuTrigger.displayName = "ContextMenuTrigger";
6946
- function ContextMenuContent({
6947
- children,
6948
- className
6949
- }) {
6950
- const { open, setOpen, position } = useContextMenu();
6951
- const menuRef = react.useRef(null);
6952
- const close = react.useCallback(() => setOpen(false), [setOpen]);
6953
- useOutsideClick(menuRef, close, open);
6954
- useEscapeKey(close, open);
6955
- const { mounted, className: animClass, ref: animRef } = useAnimation({
6956
- open,
6957
- enterClass: "fancy-scale-in",
6958
- exitClass: "fancy-fade-out"
6959
- });
6960
- if (!mounted) return null;
6961
- return /* @__PURE__ */ jsxRuntime.jsx(Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
6962
- "div",
6963
- {
6964
- ref: (node) => {
6965
- menuRef.current = node;
6966
- animRef.current = node;
6967
- },
6968
- "data-react-fancy-context-menu": "",
6969
- role: "menu",
6970
- className: cn(
6971
- "fixed z-50 min-w-[8rem] rounded-xl border border-zinc-200 bg-white p-1 shadow-lg dark:border-zinc-700 dark:bg-zinc-900",
6972
- animClass,
6973
- className
6974
- ),
6975
- style: { left: position.x, top: position.y },
6976
- children
6977
- }
6978
- ) });
6979
- }
6980
- ContextMenuContent.displayName = "ContextMenuContent";
6981
- function ContextMenuItem({
6982
- children,
6983
- onClick,
6984
- disabled = false,
6985
- danger = false,
6986
- className
6987
- }) {
6988
- const { setOpen } = useContextMenu();
6989
- return /* @__PURE__ */ jsxRuntime.jsx(
6990
- "button",
6991
- {
6992
- type: "button",
6993
- "data-react-fancy-context-menu-item": "",
6994
- role: "menuitem",
6995
- disabled,
6996
- "aria-disabled": disabled,
6997
- className: cn(
6998
- "flex w-full items-center rounded-lg px-3 py-2 text-left text-sm transition-colors",
6999
- danger ? "text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-950" : "text-zinc-700 hover:bg-zinc-100 dark:text-zinc-300 dark:hover:bg-zinc-800",
7000
- disabled && "cursor-not-allowed opacity-50",
7001
- className
7002
- ),
7003
- onClick: () => {
7004
- if (disabled) return;
7005
- onClick?.();
7006
- setOpen(false);
7007
- },
7008
- children
7009
- }
7010
- );
7011
- }
7012
- ContextMenuItem.displayName = "ContextMenuItem";
7013
- function ContextMenuSeparator({ className }) {
7014
- return /* @__PURE__ */ jsxRuntime.jsx(
7015
- "div",
7016
- {
7017
- "data-react-fancy-context-menu-separator": "",
7018
- role: "separator",
7019
- className: cn("my-1 h-px bg-zinc-200 dark:bg-zinc-700", className)
7020
- }
7021
- );
6946
+ var MenuGroupContext = react.createContext({
6947
+ activeSubId: null,
6948
+ setActiveSub: () => {
6949
+ }
6950
+ });
6951
+ function MenuGroupProvider({ children }) {
6952
+ const [activeSubId, setActiveSub] = react.useState(null);
6953
+ return /* @__PURE__ */ jsxRuntime.jsx(MenuGroupContext.Provider, { value: { activeSubId, setActiveSub }, children });
7022
6954
  }
7023
- ContextMenuSeparator.displayName = "ContextMenuSeparator";
7024
6955
  var ContextMenuSubContext = react.createContext({
7025
6956
  open: false,
7026
6957
  setOpen: () => {
@@ -7029,12 +6960,25 @@ var ContextMenuSubContext = react.createContext({
7029
6960
  }
7030
6961
  });
7031
6962
  function ContextMenuSub({ children }) {
7032
- const [open, setOpen] = react.useState(false);
6963
+ const id = react.useId();
6964
+ const { activeSubId, setActiveSub } = react.useContext(MenuGroupContext);
6965
+ const open = activeSubId === id;
7033
6966
  const closeTimer = react.useRef(null);
6967
+ const activeRef = react.useRef(activeSubId);
6968
+ activeRef.current = activeSubId;
6969
+ const setOpen = react.useCallback((v) => {
6970
+ if (closeTimer.current) {
6971
+ clearTimeout(closeTimer.current);
6972
+ closeTimer.current = null;
6973
+ }
6974
+ setActiveSub(v ? id : null);
6975
+ }, [id, setActiveSub]);
7034
6976
  const scheduleClose = react.useCallback(() => {
7035
6977
  if (closeTimer.current) clearTimeout(closeTimer.current);
7036
- closeTimer.current = setTimeout(() => setOpen(false), 150);
7037
- }, []);
6978
+ closeTimer.current = setTimeout(() => {
6979
+ if (activeRef.current === id) setActiveSub(null);
6980
+ }, 150);
6981
+ }, [id, setActiveSub]);
7038
6982
  const cancelClose = react.useCallback(() => {
7039
6983
  if (closeTimer.current) {
7040
6984
  clearTimeout(closeTimer.current);
@@ -7106,11 +7050,89 @@ function ContextMenuSubContent({ children, className }) {
7106
7050
  flipLeft ? "right-full mr-1" : "left-full ml-1",
7107
7051
  className
7108
7052
  ),
7109
- children
7053
+ children: /* @__PURE__ */ jsxRuntime.jsx(MenuGroupProvider, { children })
7110
7054
  }
7111
7055
  );
7112
7056
  }
7113
7057
  ContextMenuSubContent.displayName = "ContextMenuSubContent";
7058
+ function ContextMenuContent({
7059
+ children,
7060
+ className
7061
+ }) {
7062
+ const { open, setOpen, position } = useContextMenu();
7063
+ const menuRef = react.useRef(null);
7064
+ const close = react.useCallback(() => setOpen(false), [setOpen]);
7065
+ useOutsideClick(menuRef, close, open);
7066
+ useEscapeKey(close, open);
7067
+ const { mounted, className: animClass, ref: animRef } = useAnimation({
7068
+ open,
7069
+ enterClass: "fancy-scale-in",
7070
+ exitClass: "fancy-fade-out"
7071
+ });
7072
+ if (!mounted) return null;
7073
+ return /* @__PURE__ */ jsxRuntime.jsx(Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
7074
+ "div",
7075
+ {
7076
+ ref: (node) => {
7077
+ menuRef.current = node;
7078
+ animRef.current = node;
7079
+ },
7080
+ "data-react-fancy-context-menu": "",
7081
+ role: "menu",
7082
+ className: cn(
7083
+ "fixed z-50 min-w-[8rem] rounded-xl border border-zinc-200 bg-white p-1 shadow-lg dark:border-zinc-700 dark:bg-zinc-900",
7084
+ animClass,
7085
+ className
7086
+ ),
7087
+ style: { left: position.x, top: position.y },
7088
+ children: /* @__PURE__ */ jsxRuntime.jsx(MenuGroupProvider, { children })
7089
+ }
7090
+ ) });
7091
+ }
7092
+ ContextMenuContent.displayName = "ContextMenuContent";
7093
+ function ContextMenuItem({
7094
+ children,
7095
+ onClick,
7096
+ disabled = false,
7097
+ danger = false,
7098
+ className
7099
+ }) {
7100
+ const { setOpen } = useContextMenu();
7101
+ return /* @__PURE__ */ jsxRuntime.jsx(
7102
+ "button",
7103
+ {
7104
+ type: "button",
7105
+ "data-react-fancy-context-menu-item": "",
7106
+ role: "menuitem",
7107
+ disabled,
7108
+ "aria-disabled": disabled,
7109
+ className: cn(
7110
+ "flex w-full items-center rounded-lg px-3 py-2 text-left text-sm transition-colors",
7111
+ danger ? "text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-950" : "text-zinc-700 hover:bg-zinc-100 dark:text-zinc-300 dark:hover:bg-zinc-800",
7112
+ disabled && "cursor-not-allowed opacity-50",
7113
+ className
7114
+ ),
7115
+ onClick: () => {
7116
+ if (disabled) return;
7117
+ onClick?.();
7118
+ setOpen(false);
7119
+ },
7120
+ children
7121
+ }
7122
+ );
7123
+ }
7124
+ ContextMenuItem.displayName = "ContextMenuItem";
7125
+ function ContextMenuSeparator({ className }) {
7126
+ return /* @__PURE__ */ jsxRuntime.jsx(
7127
+ "div",
7128
+ {
7129
+ "data-react-fancy-context-menu-separator": "",
7130
+ role: "separator",
7131
+ className: cn("my-1 h-px bg-zinc-200 dark:bg-zinc-700", className)
7132
+ }
7133
+ );
7134
+ }
7135
+ ContextMenuSeparator.displayName = "ContextMenuSeparator";
7114
7136
  function ContextMenuRoot({ children }) {
7115
7137
  const [open, setOpen] = react.useState(false);
7116
7138
  const positionRef = react.useRef({ x: 0, y: 0 });
@@ -9801,7 +9823,7 @@ var Chart = {
9801
9823
  HorizontalBar: ChartHorizontalBar,
9802
9824
  StackedBar: ChartStackedBar
9803
9825
  };
9804
- function useId11(prefix) {
9826
+ function useId12(prefix) {
9805
9827
  const id = react.useId();
9806
9828
  return prefix ? `${prefix}-${id}` : id;
9807
9829
  }
@@ -12466,7 +12488,7 @@ exports.useEscapeKey = useEscapeKey;
12466
12488
  exports.useFileUpload = useFileUpload;
12467
12489
  exports.useFloatingPosition = useFloatingPosition;
12468
12490
  exports.useFocusTrap = useFocusTrap;
12469
- exports.useId = useId11;
12491
+ exports.useId = useId12;
12470
12492
  exports.useKanban = useKanban;
12471
12493
  exports.useMenu = useMenu;
12472
12494
  exports.useMobileMenu = useMobileMenu;