@zentauri-ui/zentauri-components 1.7.5 → 1.7.7

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 (124) hide show
  1. package/README.md +11 -6
  2. package/cli/registry.json +3 -0
  3. package/dist/chunk-DEZRB6DS.mjs +83 -0
  4. package/dist/chunk-DEZRB6DS.mjs.map +1 -0
  5. package/dist/chunk-GRJFGIZC.mjs +417 -0
  6. package/dist/chunk-GRJFGIZC.mjs.map +1 -0
  7. package/dist/chunk-QHEHBC6M.js +421 -0
  8. package/dist/chunk-QHEHBC6M.js.map +1 -0
  9. package/dist/chunk-V5JTDRV5.mjs +278 -0
  10. package/dist/chunk-V5JTDRV5.mjs.map +1 -0
  11. package/dist/chunk-Z4KHAD6Y.js +295 -0
  12. package/dist/chunk-Z4KHAD6Y.js.map +1 -0
  13. package/dist/chunk-ZX2IBIZT.js +92 -0
  14. package/dist/chunk-ZX2IBIZT.js.map +1 -0
  15. package/dist/design-system/context-menu.d.ts +41 -0
  16. package/dist/design-system/context-menu.d.ts.map +1 -0
  17. package/dist/design-system/index.d.ts +3 -0
  18. package/dist/design-system/index.d.ts.map +1 -1
  19. package/dist/design-system/timeline.d.ts +56 -0
  20. package/dist/design-system/timeline.d.ts.map +1 -0
  21. package/dist/design-system/tree-view.d.ts +66 -0
  22. package/dist/design-system/tree-view.d.ts.map +1 -0
  23. package/dist/ui/context-menu/context-menu.d.ts +11 -0
  24. package/dist/ui/context-menu/context-menu.d.ts.map +1 -0
  25. package/dist/ui/context-menu/index.d.ts +4 -0
  26. package/dist/ui/context-menu/index.d.ts.map +1 -0
  27. package/dist/ui/context-menu/types.d.ts +81 -0
  28. package/dist/ui/context-menu/types.d.ts.map +1 -0
  29. package/dist/ui/context-menu/variants.d.ts +7 -0
  30. package/dist/ui/context-menu/variants.d.ts.map +1 -0
  31. package/dist/ui/context-menu.js +500 -0
  32. package/dist/ui/context-menu.js.map +1 -0
  33. package/dist/ui/context-menu.mjs +488 -0
  34. package/dist/ui/context-menu.mjs.map +1 -0
  35. package/dist/ui/dropdown.js +9 -89
  36. package/dist/ui/dropdown.js.map +1 -1
  37. package/dist/ui/dropdown.mjs +1 -81
  38. package/dist/ui/dropdown.mjs.map +1 -1
  39. package/dist/ui/scroll-area/scroll-area.d.ts.map +1 -1
  40. package/dist/ui/scroll-area.js.map +1 -1
  41. package/dist/ui/scroll-area.mjs.map +1 -1
  42. package/dist/ui/timeline/animated/animations.d.ts +8 -0
  43. package/dist/ui/timeline/animated/animations.d.ts.map +1 -0
  44. package/dist/ui/timeline/animated/index.d.ts +6 -0
  45. package/dist/ui/timeline/animated/index.d.ts.map +1 -0
  46. package/dist/ui/timeline/animated/timeline-item-animated.d.ts +8 -0
  47. package/dist/ui/timeline/animated/timeline-item-animated.d.ts.map +1 -0
  48. package/dist/ui/timeline/animated/types.d.ts +12 -0
  49. package/dist/ui/timeline/animated/types.d.ts.map +1 -0
  50. package/dist/ui/timeline/animated.js +94 -0
  51. package/dist/ui/timeline/animated.js.map +1 -0
  52. package/dist/ui/timeline/animated.mjs +71 -0
  53. package/dist/ui/timeline/animated.mjs.map +1 -0
  54. package/dist/ui/timeline/index.d.ts +4 -0
  55. package/dist/ui/timeline/index.d.ts.map +1 -0
  56. package/dist/ui/timeline/timeline-base.d.ts +37 -0
  57. package/dist/ui/timeline/timeline-base.d.ts.map +1 -0
  58. package/dist/ui/timeline/timeline.d.ts +8 -0
  59. package/dist/ui/timeline/timeline.d.ts.map +1 -0
  60. package/dist/ui/timeline/types.d.ts +38 -0
  61. package/dist/ui/timeline/types.d.ts.map +1 -0
  62. package/dist/ui/timeline/variants.d.ts +19 -0
  63. package/dist/ui/timeline/variants.d.ts.map +1 -0
  64. package/dist/ui/timeline.js +63 -0
  65. package/dist/ui/timeline.js.map +1 -0
  66. package/dist/ui/timeline.mjs +14 -0
  67. package/dist/ui/timeline.mjs.map +1 -0
  68. package/dist/ui/tree-view/animated/animations.d.ts +6 -0
  69. package/dist/ui/tree-view/animated/animations.d.ts.map +1 -0
  70. package/dist/ui/tree-view/animated/index.d.ts +5 -0
  71. package/dist/ui/tree-view/animated/index.d.ts.map +1 -0
  72. package/dist/ui/tree-view/animated/tree-view-animated.d.ts +6 -0
  73. package/dist/ui/tree-view/animated/tree-view-animated.d.ts.map +1 -0
  74. package/dist/ui/tree-view/animated/types.d.ts +6 -0
  75. package/dist/ui/tree-view/animated/types.d.ts.map +1 -0
  76. package/dist/ui/tree-view/animated.js +53 -0
  77. package/dist/ui/tree-view/animated.js.map +1 -0
  78. package/dist/ui/tree-view/animated.mjs +50 -0
  79. package/dist/ui/tree-view/animated.mjs.map +1 -0
  80. package/dist/ui/tree-view/index.d.ts +5 -0
  81. package/dist/ui/tree-view/index.d.ts.map +1 -0
  82. package/dist/ui/tree-view/tree-view-base.d.ts +15 -0
  83. package/dist/ui/tree-view/tree-view-base.d.ts.map +1 -0
  84. package/dist/ui/tree-view/tree-view.d.ts +6 -0
  85. package/dist/ui/tree-view/tree-view.d.ts.map +1 -0
  86. package/dist/ui/tree-view/types.d.ts +61 -0
  87. package/dist/ui/tree-view/types.d.ts.map +1 -0
  88. package/dist/ui/tree-view/variants.d.ts +9 -0
  89. package/dist/ui/tree-view/variants.d.ts.map +1 -0
  90. package/dist/ui/tree-view.js +27 -0
  91. package/dist/ui/tree-view.js.map +1 -0
  92. package/dist/ui/tree-view.mjs +14 -0
  93. package/dist/ui/tree-view.mjs.map +1 -0
  94. package/package.json +1 -1
  95. package/src/design-system/context-menu.ts +44 -0
  96. package/src/design-system/index.ts +3 -0
  97. package/src/design-system/timeline.ts +87 -0
  98. package/src/design-system/tree-view.ts +113 -0
  99. package/src/ui/context-menu/context-menu.test.tsx +176 -0
  100. package/src/ui/context-menu/context-menu.tsx +536 -0
  101. package/src/ui/context-menu/index.ts +29 -0
  102. package/src/ui/context-menu/types.ts +110 -0
  103. package/src/ui/context-menu/variants.ts +26 -0
  104. package/src/ui/scroll-area/scroll-area.tsx +0 -2
  105. package/src/ui/timeline/animated/animations.ts +16 -0
  106. package/src/ui/timeline/animated/index.ts +22 -0
  107. package/src/ui/timeline/animated/timeline-item-animated.tsx +76 -0
  108. package/src/ui/timeline/animated/types.ts +21 -0
  109. package/src/ui/timeline/index.ts +30 -0
  110. package/src/ui/timeline/timeline-base.tsx +232 -0
  111. package/src/ui/timeline/timeline.test.tsx +262 -0
  112. package/src/ui/timeline/timeline.tsx +24 -0
  113. package/src/ui/timeline/types.ts +61 -0
  114. package/src/ui/timeline/variants.ts +60 -0
  115. package/src/ui/tree-view/animated/animations.ts +13 -0
  116. package/src/ui/tree-view/animated/index.ts +6 -0
  117. package/src/ui/tree-view/animated/tree-view-animated.tsx +52 -0
  118. package/src/ui/tree-view/animated/types.ts +6 -0
  119. package/src/ui/tree-view/index.ts +13 -0
  120. package/src/ui/tree-view/tree-view-base.tsx +496 -0
  121. package/src/ui/tree-view/tree-view.test.tsx +136 -0
  122. package/src/ui/tree-view/tree-view.tsx +9 -0
  123. package/src/ui/tree-view/types.ts +68 -0
  124. package/src/ui/tree-view/variants.ts +32 -0
@@ -0,0 +1,11 @@
1
+ import type { ContextMenuContentProps, ContextMenuItemProps, ContextMenuLabelProps, ContextMenuProps, ContextMenuSeparatorProps, ContextMenuSubContentProps, ContextMenuSubProps, ContextMenuSubTriggerProps, ContextMenuTriggerProps } from "./types";
2
+ export declare const ContextMenu: ({ children, defaultOpen, open: controlledOpen, onOpenChange, closeOnEscape, closeOnOutsideClick, }: ContextMenuProps) => import("react/jsx-runtime").JSX.Element;
3
+ export declare const ContextMenuTrigger: ({ children, className, disabled, }: ContextMenuTriggerProps) => import("react/jsx-runtime").JSX.Element;
4
+ export declare const ContextMenuContent: ({ children, className, collisionPadding, spacing, style, width, ...props }: ContextMenuContentProps) => import("react/jsx-runtime").JSX.Element | null;
5
+ export declare const ContextMenuItem: ({ children, className, closeOnSelect, disabled, inset, leftIcon, onClick, onKeyDown, onSelect, rightIcon, variant, ...props }: ContextMenuItemProps) => import("react/jsx-runtime").JSX.Element;
6
+ export declare const ContextMenuLabel: ({ children, className, inset, ...props }: ContextMenuLabelProps) => import("react/jsx-runtime").JSX.Element;
7
+ export declare const ContextMenuSeparator: ({ className, ...props }: ContextMenuSeparatorProps) => import("react/jsx-runtime").JSX.Element;
8
+ export declare const ContextMenuSub: ({ children, defaultOpen, }: ContextMenuSubProps) => import("react/jsx-runtime").JSX.Element;
9
+ export declare const ContextMenuSubTrigger: ({ children, className, disabled, inset, onFocus, onKeyDown, onPointerEnter, rightIcon, variant, ...props }: ContextMenuSubTriggerProps) => import("react/jsx-runtime").JSX.Element;
10
+ export declare const ContextMenuSubContent: ({ children, className, spacing, ...props }: ContextMenuSubContentProps) => import("react/jsx-runtime").JSX.Element | null;
11
+ //# sourceMappingURL=context-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-menu.d.ts","sourceRoot":"","sources":["../../../src/ui/context-menu/context-menu.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EACV,uBAAuB,EAEvB,oBAAoB,EACpB,qBAAqB,EAErB,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,EAE1B,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,EAGxB,MAAM,SAAS,CAAC;AAiEjB,eAAO,MAAM,WAAW,GAAI,oGAOzB,gBAAgB,4CAuFlB,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,oCAIhC,uBAAuB,4CAsDzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,4EAQhC,uBAAuB,mDA8DzB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,+HAa7B,oBAAoB,4CAqDtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,0CAK9B,qBAAqB,4CASvB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,yBAGlC,yBAAyB,4CAQ3B,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,4BAG5B,mBAAmB,4CAWrB,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,4GAWnC,0BAA0B,4CA+C5B,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,4CAKnC,0BAA0B,mDAqB5B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuLabel, ContextMenuSeparator, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, } from "./context-menu";
2
+ export type { ContextMenuContentProps, ContextMenuItemProps, ContextMenuLabelProps, ContextMenuPosition, ContextMenuProps, ContextMenuSeparatorProps, ContextMenuSubContentProps, ContextMenuSubProps, ContextMenuSubTriggerProps, ContextMenuTriggerProps, } from "./types";
3
+ export { contextMenuContentVariants, contextMenuItemVariants, } from "./variants";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/context-menu/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,81 @@
1
+ import type { VariantProps } from "class-variance-authority";
2
+ import type { ComponentPropsWithRef, HTMLAttributes, MouseEvent, ReactElement, ReactNode, Ref, RefObject } from "react";
3
+ import type { contextMenuContentVariants, contextMenuItemVariants } from "./variants";
4
+ export type ContextMenuPosition = {
5
+ x: number;
6
+ y: number;
7
+ };
8
+ export type ContextMenuContextType = {
9
+ open: boolean;
10
+ setOpen: (open: boolean) => void;
11
+ openAt: (position: ContextMenuPosition) => void;
12
+ position: ContextMenuPosition | null;
13
+ contentId: string;
14
+ triggerRef: RefObject<HTMLElement | null>;
15
+ contentRef: RefObject<HTMLDivElement | null>;
16
+ };
17
+ export type ContextMenuProps = {
18
+ children: ReactNode;
19
+ defaultOpen?: boolean;
20
+ open?: boolean;
21
+ onOpenChange?: (open: boolean) => void;
22
+ closeOnEscape?: boolean;
23
+ closeOnOutsideClick?: boolean;
24
+ };
25
+ export type ContextMenuTriggerProps = {
26
+ children: ReactNode;
27
+ className?: string;
28
+ disabled?: boolean;
29
+ };
30
+ export type ContextMenuContentProps = ComponentPropsWithRef<"div"> & VariantProps<typeof contextMenuContentVariants> & {
31
+ children: ReactNode;
32
+ collisionPadding?: number;
33
+ width?: number;
34
+ };
35
+ export type ContextMenuItemProps = HTMLAttributes<HTMLDivElement> & VariantProps<typeof contextMenuItemVariants> & {
36
+ children: ReactNode;
37
+ closeOnSelect?: boolean;
38
+ disabled?: boolean;
39
+ inset?: boolean;
40
+ leftIcon?: ReactNode;
41
+ onSelect?: () => void;
42
+ rightIcon?: ReactNode;
43
+ };
44
+ export type ContextMenuLabelProps = HTMLAttributes<HTMLParagraphElement> & {
45
+ children: ReactNode;
46
+ inset?: boolean;
47
+ };
48
+ export type ContextMenuSeparatorProps = HTMLAttributes<HTMLDivElement>;
49
+ export type ContextMenuSubContextType = {
50
+ open: boolean;
51
+ setOpen: (open: boolean) => void;
52
+ };
53
+ export type ContextMenuSubProps = {
54
+ children: ReactNode;
55
+ defaultOpen?: boolean;
56
+ };
57
+ export type ContextMenuSubTriggerProps = HTMLAttributes<HTMLDivElement> & VariantProps<typeof contextMenuItemVariants> & {
58
+ children: ReactNode;
59
+ disabled?: boolean;
60
+ inset?: boolean;
61
+ rightIcon?: ReactNode;
62
+ };
63
+ export type ContextMenuSubContentProps = ComponentPropsWithRef<"div"> & VariantProps<typeof contextMenuContentVariants> & {
64
+ children: ReactNode;
65
+ };
66
+ export type GetSafePositionProps = {
67
+ position: ContextMenuPosition | null;
68
+ width: number;
69
+ height: number;
70
+ collisionPadding: number;
71
+ };
72
+ export type ReactChildSoleCandidate = ReactElement<{
73
+ className?: string;
74
+ ref?: Ref<HTMLElement>;
75
+ onContextMenu?: (event: MouseEvent<HTMLElement>) => void;
76
+ tabIndex?: number;
77
+ "aria-controls"?: string;
78
+ "aria-expanded"?: boolean;
79
+ "aria-haspopup"?: string;
80
+ }>;
81
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ui/context-menu/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const contextMenuContentVariants: (props?: ({
2
+ spacing?: "default" | "none" | "md" | "sm" | "lg" | "xl" | null | undefined;
3
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
4
+ export declare const contextMenuItemVariants: (props?: ({
5
+ variant?: "default" | "outline" | "sky" | "emerald" | "violet" | "amber" | "rose" | "gray" | "indigo" | "white" | "black" | "orange" | "pink" | "purple" | "teal" | "yellow" | "gradient-blue" | "gradient-green" | "gradient-red" | "gradient-yellow" | "gradient-purple" | "gradient-teal" | "gradient-indigo" | "gradient-pink" | "gradient-orange" | "ghost" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ //# sourceMappingURL=variants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../../src/ui/context-menu/variants.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,0BAA0B;;8EAOrC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;8EAOlC,CAAC"}
@@ -0,0 +1,500 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkZX2IBIZT_js = require('../chunk-ZX2IBIZT.js');
5
+ var chunkZS5756ZC_js = require('../chunk-ZS5756ZC.js');
6
+ var react = require('react');
7
+ var fi = require('react-icons/fi');
8
+ var classVarianceAuthority = require('class-variance-authority');
9
+ var jsxRuntime = require('react/jsx-runtime');
10
+
11
+ // src/design-system/context-menu.ts
12
+ var zuiContextMenuContentBase = "min-w-[220px] rounded-lg border border-[color:var(--zui-dropdown-content-border,oklch(20.8%_0.042_265.755_/_0.1))] bg-[var(--zui-dropdown-content-bg,oklch(96.8%_0.007_247.896))] p-2 text-[color:var(--zui-dropdown-content-fg,oklch(20.8%_0.042_265.755))] shadow-lg outline-none dark:border-[color:var(--zui-dropdown-content-border-dark,#ffffff1a)] dark:bg-[var(--zui-dropdown-content-bg-dark,oklch(20.8%_0.042_265.755))] dark:text-[color:var(--zui-dropdown-content-fg-dark,oklch(96.8%_0.007_247.896))]";
13
+ var zuiContextMenuItemBase = chunkZX2IBIZT_js.zuiDropdownItemBase;
14
+ var zuiContextMenuItemVariants = {
15
+ ...chunkZX2IBIZT_js.zuiDropdownItemVariants,
16
+ ghost: `${chunkZX2IBIZT_js.zuiDropdownItemVariants.ghost} dark:bg-[var(--zui-dropdown-item-ghost-bg-dark,transparent)]`,
17
+ sky: `${chunkZX2IBIZT_js.zuiDropdownItemVariants.sky} dark:bg-[var(--zui-dropdown-item-sky-bg-dark,oklch(29.3%_0.066_243.157))] dark:text-[color:var(--zui-dropdown-item-sky-fg-dark,oklch(90.1%_0.058_230.902))] dark:hover:text-[color:var(--zui-dropdown-item-sky-fg-hover-dark,oklch(90.1%_0.058_230.902))]`,
18
+ rose: `${chunkZX2IBIZT_js.zuiDropdownItemVariants.rose} dark:bg-[var(--zui-dropdown-item-rose-bg-dark,oklch(27.1%_0.105_12.094))] dark:text-[color:var(--zui-dropdown-item-rose-fg-dark,oklch(89.2%_0.058_10.001))] dark:hover:text-[color:var(--zui-dropdown-item-rose-fg-hover-dark,oklch(89.2%_0.058_10.001))]`,
19
+ purple: `${chunkZX2IBIZT_js.zuiDropdownItemVariants.purple} dark:bg-[var(--zui-dropdown-item-purple-bg-dark,oklch(29.1%_0.149_302.717))] dark:text-[color:var(--zui-dropdown-item-purple-fg-dark,oklch(90.2%_0.063_306.703))] dark:hover:text-[color:var(--zui-dropdown-item-purple-fg-hover-dark,oklch(90.2%_0.063_306.703))]`,
20
+ pink: `${chunkZX2IBIZT_js.zuiDropdownItemVariants.pink} dark:bg-[var(--zui-dropdown-item-pink-bg-dark,oklch(28.4%_0.109_3.907))] dark:text-[color:var(--zui-dropdown-item-pink-fg-dark,oklch(89.9%_0.061_343.231))] dark:hover:text-[color:var(--zui-dropdown-item-pink-fg-hover-dark,oklch(89.9%_0.061_343.231))]`,
21
+ orange: `${chunkZX2IBIZT_js.zuiDropdownItemVariants.orange} dark:bg-[var(--zui-dropdown-item-orange-bg-dark,oklch(26.6%_0.079_36.259))] dark:text-[color:var(--zui-dropdown-item-orange-fg-dark,oklch(90.1%_0.076_70.697))] dark:hover:text-[color:var(--zui-dropdown-item-orange-fg-hover-dark,oklch(90.1%_0.076_70.697))]`,
22
+ yellow: `${chunkZX2IBIZT_js.zuiDropdownItemVariants.yellow} dark:bg-[var(--zui-dropdown-item-yellow-bg-dark,oklch(28.6%_0.066_53.813))] dark:text-[color:var(--zui-dropdown-item-yellow-fg-dark,oklch(94.5%_0.129_101.54))] dark:hover:text-[color:var(--zui-dropdown-item-yellow-fg-hover-dark,oklch(94.5%_0.129_101.54))]`,
23
+ teal: `${chunkZX2IBIZT_js.zuiDropdownItemVariants.teal} dark:bg-[var(--zui-dropdown-item-teal-bg-dark,oklch(27.7%_0.046_192.524))] dark:text-[color:var(--zui-dropdown-item-teal-fg-dark,oklch(91%_0.096_180.426))] dark:hover:text-[color:var(--zui-dropdown-item-teal-fg-hover-dark,oklch(91%_0.096_180.426))]`,
24
+ indigo: `${chunkZX2IBIZT_js.zuiDropdownItemVariants.indigo} dark:bg-[var(--zui-dropdown-item-indigo-bg-dark,oklch(25.7%_0.09_281.288))] dark:text-[color:var(--zui-dropdown-item-indigo-fg-dark,oklch(87%_0.065_274.039))] dark:hover:text-[color:var(--zui-dropdown-item-indigo-fg-hover-dark,oklch(87%_0.065_274.039))]`,
25
+ emerald: `${chunkZX2IBIZT_js.zuiDropdownItemVariants.emerald} dark:bg-[var(--zui-dropdown-item-emerald-bg-dark,oklch(26.2%_0.051_172.552))] dark:text-[color:var(--zui-dropdown-item-emerald-fg-dark,oklch(90.5%_0.093_164.15))] dark:hover:text-[color:var(--zui-dropdown-item-emerald-fg-hover-dark,oklch(90.5%_0.093_164.15))]`,
26
+ gray: `${chunkZX2IBIZT_js.zuiDropdownItemVariants.gray} dark:bg-[var(--zui-dropdown-item-gray-bg-dark,oklch(13%_0.028_261.692))] dark:text-[color:var(--zui-dropdown-item-gray-fg-dark,oklch(92.8%_0.006_264.531))] dark:hover:text-[color:var(--zui-dropdown-item-gray-fg-hover-dark,oklch(92.8%_0.006_264.531))]`,
27
+ amber: `${chunkZX2IBIZT_js.zuiDropdownItemVariants.amber} dark:bg-[var(--zui-dropdown-item-amber-bg-dark,oklch(27.9%_0.077_45.635))] dark:text-[color:var(--zui-dropdown-item-amber-fg-dark,oklch(92.4%_0.12_95.746))] dark:hover:text-[color:var(--zui-dropdown-item-amber-fg-hover-dark,oklch(92.4%_0.12_95.746))]`,
28
+ violet: `${chunkZX2IBIZT_js.zuiDropdownItemVariants.violet} dark:bg-[var(--zui-dropdown-item-violet-bg-dark,oklch(28.3%_0.141_291.089))] dark:text-[color:var(--zui-dropdown-item-violet-fg-dark,oklch(89.4%_0.057_293.283))] dark:hover:text-[color:var(--zui-dropdown-item-violet-fg-hover-dark,oklch(89.4%_0.057_293.283))]`,
29
+ "gradient-blue": `${chunkZX2IBIZT_js.zuiDropdownItemVariants["gradient-blue"]} dark:from-[var(--zui-dropdown-item-gradient-blue-from-dark,oklch(28.2%_0.091_267.935))] dark:to-[var(--zui-dropdown-item-gradient-blue-to-dark,oklch(29.1%_0.149_302.717))]`,
30
+ "gradient-green": `${chunkZX2IBIZT_js.zuiDropdownItemVariants["gradient-green"]} dark:from-[var(--zui-dropdown-item-gradient-green-from-dark,oklch(26.6%_0.065_152.934))] dark:to-[var(--zui-dropdown-item-gradient-green-to-dark,oklch(27.4%_0.072_132.109))]`,
31
+ "gradient-red": `${chunkZX2IBIZT_js.zuiDropdownItemVariants["gradient-red"]} dark:from-[var(--zui-dropdown-item-gradient-red-from-dark,oklch(25.8%_0.092_26.042))] dark:to-[var(--zui-dropdown-item-gradient-red-to-dark,oklch(28.4%_0.109_3.907))]`,
32
+ "gradient-yellow": `${chunkZX2IBIZT_js.zuiDropdownItemVariants["gradient-yellow"]} dark:from-[var(--zui-dropdown-item-gradient-yellow-from-dark,oklch(28.6%_0.066_53.813))] dark:to-[var(--zui-dropdown-item-gradient-yellow-to-dark,oklch(26.6%_0.079_36.259))]`,
33
+ "gradient-purple": `${chunkZX2IBIZT_js.zuiDropdownItemVariants["gradient-purple"]} dark:from-[var(--zui-dropdown-item-gradient-purple-from-dark,oklch(29.1%_0.149_302.717))] dark:to-[var(--zui-dropdown-item-gradient-purple-to-dark,oklch(28.4%_0.109_3.907))]`,
34
+ "gradient-teal": `${chunkZX2IBIZT_js.zuiDropdownItemVariants["gradient-teal"]} dark:from-[var(--zui-dropdown-item-gradient-teal-from-dark,oklch(27.7%_0.046_192.524))] dark:to-[var(--zui-dropdown-item-gradient-teal-to-dark,oklch(30.2%_0.056_229.695))]`,
35
+ "gradient-indigo": `${chunkZX2IBIZT_js.zuiDropdownItemVariants["gradient-indigo"]} dark:from-[var(--zui-dropdown-item-gradient-indigo-from-dark,oklch(25.7%_0.09_281.288))] dark:to-[var(--zui-dropdown-item-gradient-indigo-to-dark,oklch(29.1%_0.149_302.717))]`,
36
+ "gradient-pink": `${chunkZX2IBIZT_js.zuiDropdownItemVariants["gradient-pink"]} dark:from-[var(--zui-dropdown-item-gradient-pink-from-dark,oklch(28.4%_0.109_3.907))] dark:to-[var(--zui-dropdown-item-gradient-pink-to-dark,oklch(27.1%_0.105_12.094))]`,
37
+ "gradient-orange": `${chunkZX2IBIZT_js.zuiDropdownItemVariants["gradient-orange"]} dark:from-[var(--zui-dropdown-item-gradient-orange-from-dark,oklch(26.6%_0.079_36.259))] dark:to-[var(--zui-dropdown-item-gradient-orange-to-dark,oklch(25.8%_0.092_26.042))]`
38
+ };
39
+ var zuiContextMenuSpacing = chunkZX2IBIZT_js.zuiDropdownSpacing;
40
+ var zuiContextMenuLabelBase = "px-3 py-2 text-xs font-semibold uppercase tracking-[0.18em] text-[color:var(--zui-dropdown-label-fg,oklch(55.1%_0.027_264.364))] dark:text-[color:var(--zui-dropdown-label-fg-dark,oklch(70.7%_0.022_261.325))]";
41
+ var zuiContextMenuSeparatorBase = "my-1 h-px bg-[var(--zui-dropdown-separator-bg,oklch(20.8%_0.042_265.755_/_0.12))] dark:bg-[var(--zui-dropdown-separator-bg-dark,#ffffff1a)]";
42
+ var contextMenuContentVariants = classVarianceAuthority.cva(zuiContextMenuContentBase, {
43
+ variants: {
44
+ spacing: zuiContextMenuSpacing
45
+ },
46
+ defaultVariants: {
47
+ spacing: "default"
48
+ }
49
+ });
50
+ var contextMenuItemVariants = classVarianceAuthority.cva(zuiContextMenuItemBase, {
51
+ variants: {
52
+ variant: zuiContextMenuItemVariants
53
+ },
54
+ defaultVariants: {
55
+ variant: "default"
56
+ }
57
+ });
58
+ var ContextMenuContext = react.createContext(null);
59
+ var ContextMenuSubContext = react.createContext(
60
+ null
61
+ );
62
+ var useContextMenu = () => {
63
+ const context = react.useContext(ContextMenuContext);
64
+ if (!context) {
65
+ throw new Error("ContextMenu components must be used within ContextMenu");
66
+ }
67
+ return context;
68
+ };
69
+ var useContextMenuSub = () => {
70
+ const context = react.useContext(ContextMenuSubContext);
71
+ if (!context) {
72
+ throw new Error(
73
+ "ContextMenuSub components must be used within ContextMenuSub"
74
+ );
75
+ }
76
+ return context;
77
+ };
78
+ function mergeRefs(...refs) {
79
+ return (node) => {
80
+ for (const ref of refs) {
81
+ if (typeof ref === "function") {
82
+ ref(node);
83
+ } else if (ref) {
84
+ ref.current = node;
85
+ }
86
+ }
87
+ };
88
+ }
89
+ var getSafePosition = ({
90
+ position,
91
+ width,
92
+ height,
93
+ collisionPadding
94
+ }) => {
95
+ const fallback = position ?? { x: collisionPadding, y: collisionPadding };
96
+ if (typeof window === "undefined") {
97
+ return fallback;
98
+ }
99
+ return {
100
+ x: Math.max(
101
+ collisionPadding,
102
+ Math.min(fallback.x, window.innerWidth - width - collisionPadding)
103
+ ),
104
+ y: Math.max(
105
+ collisionPadding,
106
+ Math.min(fallback.y, window.innerHeight - height - collisionPadding)
107
+ )
108
+ };
109
+ };
110
+ var ContextMenu = ({
111
+ children,
112
+ defaultOpen = false,
113
+ open: controlledOpen,
114
+ onOpenChange,
115
+ closeOnEscape = true,
116
+ closeOnOutsideClick = true
117
+ }) => {
118
+ const [uncontrolledOpen, setUncontrolledOpen] = react.useState(defaultOpen);
119
+ const [position, setPosition] = react.useState(null);
120
+ const contentId = `${react.useId()}-context-menu`;
121
+ const triggerRef = react.useRef(null);
122
+ const contentRef = react.useRef(null);
123
+ const isControlled = controlledOpen !== void 0;
124
+ const open = isControlled ? controlledOpen : uncontrolledOpen;
125
+ const setOpen = react.useCallback(
126
+ (nextOpen) => {
127
+ if (!isControlled) {
128
+ setUncontrolledOpen(nextOpen);
129
+ }
130
+ onOpenChange?.(nextOpen);
131
+ },
132
+ [isControlled, onOpenChange]
133
+ );
134
+ const openAt = react.useCallback(
135
+ (nextPosition) => {
136
+ setPosition(nextPosition);
137
+ setOpen(true);
138
+ },
139
+ [setOpen]
140
+ );
141
+ react.useEffect(() => {
142
+ if (!open) {
143
+ return void 0;
144
+ }
145
+ const onPointerDown = (event) => {
146
+ if (!closeOnOutsideClick) {
147
+ return;
148
+ }
149
+ const target = event.target;
150
+ if (contentRef.current?.contains(target)) {
151
+ return;
152
+ }
153
+ if (triggerRef.current?.contains(target) && event.button !== 0) {
154
+ return;
155
+ }
156
+ setOpen(false);
157
+ };
158
+ const onKeyDown = (event) => {
159
+ if (event.key === "Escape" && closeOnEscape) {
160
+ setOpen(false);
161
+ triggerRef.current?.focus();
162
+ }
163
+ };
164
+ const onScroll = () => {
165
+ setOpen(false);
166
+ };
167
+ document.addEventListener("pointerdown", onPointerDown);
168
+ document.addEventListener("keydown", onKeyDown);
169
+ document.addEventListener("scroll", onScroll, { capture: true });
170
+ return () => {
171
+ document.removeEventListener("pointerdown", onPointerDown);
172
+ document.removeEventListener("keydown", onKeyDown);
173
+ document.removeEventListener("scroll", onScroll, { capture: true });
174
+ };
175
+ }, [closeOnEscape, closeOnOutsideClick, open, setOpen]);
176
+ const contextValue = react.useMemo(
177
+ () => ({
178
+ open,
179
+ setOpen,
180
+ openAt,
181
+ contentId,
182
+ triggerRef,
183
+ contentRef,
184
+ position
185
+ }),
186
+ [contentId, open, openAt, setOpen, position]
187
+ );
188
+ return /* @__PURE__ */ jsxRuntime.jsx(ContextMenuContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "contents", children }) });
189
+ };
190
+ var ContextMenuTrigger = ({
191
+ children,
192
+ className,
193
+ disabled = false
194
+ }) => {
195
+ const { open, openAt, contentId, triggerRef } = useContextMenu();
196
+ const handleContextMenu = (event) => {
197
+ if (disabled) {
198
+ return;
199
+ }
200
+ event.preventDefault();
201
+ const isKeyboardTrigger = event.clientX === 0 && event.clientY === 0;
202
+ if (isKeyboardTrigger) {
203
+ const rect = event.currentTarget.getBoundingClientRect();
204
+ openAt({ x: rect.left, y: rect.bottom });
205
+ } else {
206
+ openAt({ x: event.clientX, y: event.clientY });
207
+ }
208
+ };
209
+ const childList = react.Children.toArray(children).filter(
210
+ (node) => node !== null && node !== void 0 && typeof node !== "boolean"
211
+ );
212
+ const soleCandidate = childList.length === 1 && react.isValidElement(childList[0]) ? childList[0] : void 0;
213
+ if (soleCandidate) {
214
+ return react.cloneElement(soleCandidate, {
215
+ ref: mergeRefs(triggerRef, soleCandidate.props.ref),
216
+ onContextMenu: (event) => {
217
+ soleCandidate.props.onContextMenu?.(event);
218
+ if (!event.defaultPrevented) {
219
+ handleContextMenu(event);
220
+ }
221
+ },
222
+ className: chunkZS5756ZC_js.cn(className, soleCandidate.props.className),
223
+ tabIndex: soleCandidate.props.tabIndex ?? 0,
224
+ "aria-controls": open ? contentId : void 0,
225
+ "aria-expanded": open,
226
+ "aria-haspopup": "menu"
227
+ });
228
+ }
229
+ return /* @__PURE__ */ jsxRuntime.jsx(
230
+ "span",
231
+ {
232
+ ref: triggerRef,
233
+ className,
234
+ tabIndex: 0,
235
+ onContextMenu: handleContextMenu,
236
+ "aria-controls": open ? contentId : void 0,
237
+ "aria-expanded": open,
238
+ "aria-haspopup": "menu",
239
+ children
240
+ }
241
+ );
242
+ };
243
+ var ContextMenuContent = ({
244
+ children,
245
+ className,
246
+ collisionPadding = 8,
247
+ spacing,
248
+ style,
249
+ width = 220,
250
+ ...props
251
+ }) => {
252
+ const { open, contentId, contentRef, position } = useContextMenu();
253
+ const [menuSize, setMenuSize] = react.useState({ width, height: 0 });
254
+ react.useLayoutEffect(() => {
255
+ if (!open || !contentRef.current) {
256
+ return;
257
+ }
258
+ const rect = contentRef.current.getBoundingClientRect();
259
+ const nextSize = {
260
+ width: Math.max(width, rect.width),
261
+ height: rect.height
262
+ };
263
+ setMenuSize(
264
+ (currentSize) => currentSize.width === nextSize.width && currentSize.height === nextSize.height ? currentSize : nextSize
265
+ );
266
+ });
267
+ react.useEffect(() => {
268
+ if (!open) {
269
+ setMenuSize({ width, height: 0 });
270
+ }
271
+ }, [open, width]);
272
+ if (!open) {
273
+ return null;
274
+ }
275
+ const safePosition = getSafePosition({
276
+ position,
277
+ width: menuSize.width,
278
+ height: menuSize.height,
279
+ collisionPadding
280
+ });
281
+ return /* @__PURE__ */ jsxRuntime.jsx(
282
+ "div",
283
+ {
284
+ ref: contentRef,
285
+ id: contentId,
286
+ role: "menu",
287
+ tabIndex: -1,
288
+ className: chunkZS5756ZC_js.cn(
289
+ contextMenuContentVariants({ spacing }),
290
+ "fixed z-50",
291
+ className
292
+ ),
293
+ style: {
294
+ left: safePosition.x,
295
+ top: safePosition.y,
296
+ minWidth: width,
297
+ ...style
298
+ },
299
+ ...props,
300
+ children
301
+ }
302
+ );
303
+ };
304
+ var ContextMenuItem = ({
305
+ children,
306
+ className,
307
+ closeOnSelect = true,
308
+ disabled = false,
309
+ inset = false,
310
+ leftIcon,
311
+ onClick,
312
+ onKeyDown,
313
+ onSelect,
314
+ rightIcon,
315
+ variant,
316
+ ...props
317
+ }) => {
318
+ const { setOpen } = useContextMenu();
319
+ const handleSelect = () => {
320
+ if (disabled) {
321
+ return;
322
+ }
323
+ onSelect?.();
324
+ if (closeOnSelect) {
325
+ setOpen(false);
326
+ }
327
+ };
328
+ const handleKeyDown = (event) => {
329
+ onKeyDown?.(event);
330
+ if (event.defaultPrevented || disabled) {
331
+ return;
332
+ }
333
+ if (event.key === "Enter" || event.key === " ") {
334
+ event.preventDefault();
335
+ handleSelect();
336
+ }
337
+ };
338
+ return /* @__PURE__ */ jsxRuntime.jsxs(
339
+ "div",
340
+ {
341
+ role: "menuitem",
342
+ tabIndex: disabled ? void 0 : 0,
343
+ "aria-disabled": disabled || void 0,
344
+ className: chunkZS5756ZC_js.cn(
345
+ contextMenuItemVariants({ variant }),
346
+ inset && "pl-8",
347
+ disabled && "pointer-events-none cursor-not-allowed opacity-50",
348
+ className
349
+ ),
350
+ onClick: (event) => {
351
+ onClick?.(event);
352
+ if (!event.defaultPrevented) {
353
+ handleSelect();
354
+ }
355
+ },
356
+ onKeyDown: handleKeyDown,
357
+ ...props,
358
+ children: [
359
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
360
+ leftIcon,
361
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children })
362
+ ] }),
363
+ rightIcon ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-4 flex items-center", children: rightIcon }) : null
364
+ ]
365
+ }
366
+ );
367
+ };
368
+ var ContextMenuLabel = ({
369
+ children,
370
+ className,
371
+ inset = false,
372
+ ...props
373
+ }) => {
374
+ return /* @__PURE__ */ jsxRuntime.jsx(
375
+ "p",
376
+ {
377
+ className: chunkZS5756ZC_js.cn(zuiContextMenuLabelBase, inset && "pl-8", className),
378
+ ...props,
379
+ children
380
+ }
381
+ );
382
+ };
383
+ var ContextMenuSeparator = ({
384
+ className,
385
+ ...props
386
+ }) => {
387
+ return /* @__PURE__ */ jsxRuntime.jsx(
388
+ "div",
389
+ {
390
+ role: "separator",
391
+ className: chunkZS5756ZC_js.cn(zuiContextMenuSeparatorBase, className),
392
+ ...props
393
+ }
394
+ );
395
+ };
396
+ var ContextMenuSub = ({
397
+ children,
398
+ defaultOpen = false
399
+ }) => {
400
+ const [open, setOpen] = react.useState(defaultOpen);
401
+ const value = react.useMemo(() => ({ open, setOpen }), [open]);
402
+ return /* @__PURE__ */ jsxRuntime.jsx(ContextMenuSubContext.Provider, { value, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative", onPointerLeave: () => setOpen(false), children }) });
403
+ };
404
+ var ContextMenuSubTrigger = ({
405
+ children,
406
+ className,
407
+ disabled = false,
408
+ inset = false,
409
+ onFocus,
410
+ onKeyDown,
411
+ onPointerEnter,
412
+ rightIcon = /* @__PURE__ */ jsxRuntime.jsx(fi.FiChevronRight, { "aria-hidden": "true" }),
413
+ variant,
414
+ ...props
415
+ }) => {
416
+ const { open, setOpen } = useContextMenuSub();
417
+ return /* @__PURE__ */ jsxRuntime.jsxs(
418
+ "div",
419
+ {
420
+ role: "menuitem",
421
+ tabIndex: disabled ? void 0 : 0,
422
+ "aria-disabled": disabled || void 0,
423
+ "aria-expanded": open,
424
+ "aria-haspopup": "menu",
425
+ className: chunkZS5756ZC_js.cn(
426
+ contextMenuItemVariants({ variant }),
427
+ inset && "pl-8",
428
+ disabled && "pointer-events-none cursor-not-allowed opacity-50",
429
+ className
430
+ ),
431
+ onFocus: (event) => {
432
+ onFocus?.(event);
433
+ },
434
+ onPointerEnter: (event) => {
435
+ onPointerEnter?.(event);
436
+ if (!disabled) {
437
+ setOpen(true);
438
+ }
439
+ },
440
+ onKeyDown: (event) => {
441
+ onKeyDown?.(event);
442
+ if (event.defaultPrevented || disabled) {
443
+ return;
444
+ }
445
+ if (event.key === "ArrowRight" || event.key === "Enter") {
446
+ event.preventDefault();
447
+ setOpen(true);
448
+ }
449
+ if (event.key === "ArrowLeft") {
450
+ event.preventDefault();
451
+ setOpen(false);
452
+ }
453
+ },
454
+ ...props,
455
+ children: [
456
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-0 items-center gap-2", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children }) }),
457
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-4 flex items-center", children: rightIcon })
458
+ ]
459
+ }
460
+ );
461
+ };
462
+ var ContextMenuSubContent = ({
463
+ children,
464
+ className,
465
+ spacing,
466
+ ...props
467
+ }) => {
468
+ const { open } = useContextMenuSub();
469
+ if (!open) {
470
+ return null;
471
+ }
472
+ return /* @__PURE__ */ jsxRuntime.jsx(
473
+ "div",
474
+ {
475
+ role: "menu",
476
+ tabIndex: -1,
477
+ className: chunkZS5756ZC_js.cn(
478
+ contextMenuContentVariants({ spacing }),
479
+ "absolute left-full top-0 z-50 ml-2",
480
+ className
481
+ ),
482
+ ...props,
483
+ children
484
+ }
485
+ );
486
+ };
487
+
488
+ exports.ContextMenu = ContextMenu;
489
+ exports.ContextMenuContent = ContextMenuContent;
490
+ exports.ContextMenuItem = ContextMenuItem;
491
+ exports.ContextMenuLabel = ContextMenuLabel;
492
+ exports.ContextMenuSeparator = ContextMenuSeparator;
493
+ exports.ContextMenuSub = ContextMenuSub;
494
+ exports.ContextMenuSubContent = ContextMenuSubContent;
495
+ exports.ContextMenuSubTrigger = ContextMenuSubTrigger;
496
+ exports.ContextMenuTrigger = ContextMenuTrigger;
497
+ exports.contextMenuContentVariants = contextMenuContentVariants;
498
+ exports.contextMenuItemVariants = contextMenuItemVariants;
499
+ //# sourceMappingURL=context-menu.js.map
500
+ //# sourceMappingURL=context-menu.js.map