@bigbinary/neeto-atoms 1.0.13 → 1.0.15
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/{Label-BVy4hy9Z.js → Label-jZPbTxdX.js} +2 -2
- package/dist/{Label-BVy4hy9Z.js.map → Label-jZPbTxdX.js.map} +1 -1
- package/dist/{Popover-BFMrtVPq.js → Popover-dib6elwS.js} +5 -17
- package/dist/Popover-dib6elwS.js.map +1 -0
- package/dist/{Tooltip-DhwIZnOU.js → Tooltip-3ZzQyaDV.js} +6 -27
- package/dist/Tooltip-3ZzQyaDV.js.map +1 -0
- package/dist/cjs/{Label-DpyfZsiT.js → Label-B8SlyX1E.js} +2 -2
- package/dist/cjs/{Label-DpyfZsiT.js.map → Label-B8SlyX1E.js.map} +1 -1
- package/dist/cjs/{Popover-LIxANoTc.js → Popover-B1d4URJl.js} +4 -16
- package/dist/cjs/Popover-B1d4URJl.js.map +1 -0
- package/dist/cjs/{Tooltip-CtxI7QBY.js → Tooltip-criVUtIg.js} +5 -26
- package/dist/cjs/Tooltip-criVUtIg.js.map +1 -0
- package/dist/cjs/components/DropdownMenu.js +2 -9
- package/dist/cjs/components/DropdownMenu.js.map +1 -1
- package/dist/cjs/components/Label.js +2 -2
- package/dist/cjs/components/Popover.js +1 -1
- package/dist/cjs/components/Tooltip.js +1 -1
- package/dist/cjs/components/index.js +3 -3
- package/dist/cjs/index.js +3 -3
- package/dist/components/DropdownMenu/MenuItem.d.ts +2 -1
- package/dist/components/DropdownMenu/SubMenu.d.ts +5 -2
- package/dist/components/DropdownMenu.js +2 -9
- package/dist/components/DropdownMenu.js.map +1 -1
- package/dist/components/Label.js +2 -2
- package/dist/components/Popover/Popover.d.ts +0 -2
- package/dist/components/Popover.js +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts +4 -3
- package/dist/components/Tooltip.js +1 -1
- package/dist/components/index.js +3 -3
- package/dist/index.js +3 -3
- package/package.json +1 -1
- package/dist/Popover-BFMrtVPq.js.map +0 -1
- package/dist/Tooltip-DhwIZnOU.js.map +0 -1
- package/dist/cjs/Popover-LIxANoTc.js.map +0 -1
- package/dist/cjs/Tooltip-CtxI7QBY.js.map +0 -1
|
@@ -4,7 +4,7 @@ import { c as cn } from './utils-DdHUxIdC.js';
|
|
|
4
4
|
import { r as renderIcon } from './renderIcon-tlvMyboj.js';
|
|
5
5
|
import { Label as Label$1 } from './primitives/Label.js';
|
|
6
6
|
import { TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from './primitives/Tooltip.js';
|
|
7
|
-
import { P as Popover } from './Popover-
|
|
7
|
+
import { P as Popover } from './Popover-dib6elwS.js';
|
|
8
8
|
import { B as Button } from './Button-Q7MPG6ph.js';
|
|
9
9
|
import { c as createLucideIcon } from './createLucideIcon-C8ycilSN.js';
|
|
10
10
|
|
|
@@ -55,4 +55,4 @@ const Label = forwardRef(({ required, helpIconProps, className, children, ...oth
|
|
|
55
55
|
Label.displayName = "Label";
|
|
56
56
|
|
|
57
57
|
export { Label as L };
|
|
58
|
-
//# sourceMappingURL=Label-
|
|
58
|
+
//# sourceMappingURL=Label-jZPbTxdX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Label-
|
|
1
|
+
{"version":3,"file":"Label-jZPbTxdX.js","sources":["../node_modules/lucide-react/dist/esm/icons/circle-question-mark.js","../src/components/Label/constants.ts","../src/components/Label/Label.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\", key: \"1u773s\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst CircleQuestionMark = createLucideIcon(\"circle-question-mark\", __iconNode);\n\nexport { __iconNode, CircleQuestionMark as default };\n//# sourceMappingURL=circle-question-mark.js.map\n","export const SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n auto: \"top\",\n};\n","import React, { forwardRef } from \"react\";\n\nimport { CircleHelpIcon } from \"lucide-react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon, type IconProp } from \"src/lib/renderIcon\";\nimport { Label as PrimitiveLabel } from \"src/primitives/Label\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"src/primitives/Tooltip\";\nimport { Popover } from \"src/components/Popover\";\nimport { Button, type ButtonProps } from \"src/components/Button\";\n\nimport { SIDE_MAP } from \"./constants\";\n\ninterface HelpIconTooltipProps {\n /** Tooltip content. */\n content?: React.ReactNode;\n /** Tooltip position. */\n position?: string;\n}\n\ninterface HelpIconPopoverProps {\n /** Popover title. */\n title?: React.ReactNode;\n /** Popover description. */\n description?: React.ReactNode;\n /** Props for an optional help link button inside the popover. */\n helpLinkProps?: ButtonProps;\n}\n\ninterface HelpIconProps {\n /** Click handler on the help icon. */\n onClick?: () => void;\n /** Custom icon. Defaults to CircleHelpIcon. */\n icon?: IconProp;\n /** Show a tooltip on hover. */\n tooltipProps?: HelpIconTooltipProps;\n /** Show a popover on hover with title, description, and optional link. */\n popoverProps?: HelpIconPopoverProps;\n /** Additional class name for the help icon. */\n className?: string;\n}\n\nexport interface LabelProps extends React.ComponentProps<\n typeof PrimitiveLabel\n> {\n /** Shows a red asterisk after the label text. */\n required?: boolean;\n /** Props for the help icon (tooltip or popover mode). */\n helpIconProps?: HelpIconProps;\n /** Additional CSS class names. */\n className?: string;\n}\n\nconst Label = forwardRef<HTMLLabelElement, LabelProps>(\n ({ required, helpIconProps, className, children, ...otherProps }, ref) => {\n const helpIcon = helpIconProps?.icon ?? CircleHelpIcon;\n\n const iconElement = (\n <span\n className={cn(\n \"inline-flex cursor-help text-muted-foreground transition-colors hover:text-foreground\",\n helpIconProps?.onClick && \"cursor-pointer\",\n helpIconProps?.className\n )}\n onClick={helpIconProps?.onClick}\n >\n {renderIcon(helpIcon, \"size-3.5\")}\n </span>\n );\n\n const renderHelpIcon = () => {\n if (!helpIconProps) return null;\n\n // Popover mode\n if (helpIconProps.popoverProps) {\n const { title, description, helpLinkProps } =\n helpIconProps.popoverProps;\n\n return (\n <Popover trigger={iconElement}>\n {title && <Popover.Title>{title}</Popover.Title>}\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n {helpLinkProps && (\n <Button\n variant=\"link\"\n size=\"sm\"\n className=\"mt-1 h-auto self-start p-0\"\n {...helpLinkProps}\n href={helpLinkProps.href}\n />\n )}\n </Popover>\n );\n }\n\n // Tooltip mode\n if (helpIconProps.tooltipProps?.content) {\n const side =\n SIDE_MAP[helpIconProps.tooltipProps.position ?? \"auto\"] ?? \"top\";\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{iconElement}</TooltipTrigger>\n <TooltipContent side={side}>\n {helpIconProps.tooltipProps.content}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n // Icon only (with optional onClick)\n return iconElement;\n };\n\n return (\n <PrimitiveLabel ref={ref} className={cn(className)} {...otherProps}>\n {children}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n {renderHelpIcon()}\n </PrimitiveLabel>\n );\n }\n);\n\nLabel.displayName = \"Label\";\n\nexport { Label };\n"],"names":["CircleHelpIcon","_jsx","_jsxs","PrimitiveLabel"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import React__default, { forwardRef, useState, useCallback,
|
|
2
|
+
import React__default, { forwardRef, useState, useCallback, useEffect } from 'react';
|
|
3
3
|
import { c as cva } from './index-D7Zy7P05.js';
|
|
4
4
|
import { c as cn } from './utils-DdHUxIdC.js';
|
|
5
5
|
import { HoverCard, HoverCardTrigger, HoverCardContent } from './primitives/HoverCard.js';
|
|
@@ -48,10 +48,10 @@ const popoverVariants = cva("flex flex-col gap-2.5", {
|
|
|
48
48
|
});
|
|
49
49
|
const Title = forwardRef(({ children, className, ...otherProps }, ref) => (jsx("div", { ref: ref, "data-slot": "popover-title", className: cn("text-sm font-semibold", className), ...otherProps, children: children })));
|
|
50
50
|
Title.displayName = "Popover.Title";
|
|
51
|
-
const Popover = forwardRef(({ children, trigger, variant = "default", disabled = false, position = "auto", className, open: openProp, onOpenChange: onOpenChangeProp, hideAfter = -1,
|
|
51
|
+
const Popover = forwardRef(({ children, trigger, variant = "default", disabled = false, position = "auto", className, open: openProp, onOpenChange: onOpenChangeProp, hideAfter = -1, defaultOpen, openDelay = 200, closeDelay = 200,
|
|
52
52
|
// Radix HoverCardContent props forwarded
|
|
53
53
|
...contentProps }, ref) => {
|
|
54
|
-
// Internal state for uncontrolled mode + hideAfter
|
|
54
|
+
// Internal state for uncontrolled mode + hideAfter
|
|
55
55
|
const [internalOpen, setInternalOpen] = useState(false);
|
|
56
56
|
const isControlled = openProp !== undefined;
|
|
57
57
|
const open = isControlled ? openProp : internalOpen;
|
|
@@ -60,7 +60,6 @@ const Popover = forwardRef(({ children, trigger, variant = "default", disabled =
|
|
|
60
60
|
setInternalOpen(next);
|
|
61
61
|
onOpenChangeProp?.(next);
|
|
62
62
|
}, [isControlled, onOpenChangeProp]);
|
|
63
|
-
const triggerRef = useRef(null);
|
|
64
63
|
// Auto-hide after hideAfter ms
|
|
65
64
|
useEffect(() => {
|
|
66
65
|
if (!open || hideAfter <= 0)
|
|
@@ -68,17 +67,6 @@ const Popover = forwardRef(({ children, trigger, variant = "default", disabled =
|
|
|
68
67
|
const timer = setTimeout(() => handleOpenChange(false), hideAfter);
|
|
69
68
|
return () => clearTimeout(timer);
|
|
70
69
|
}, [open, hideAfter, handleOpenChange]);
|
|
71
|
-
// Hide popover when trigger exits viewport
|
|
72
|
-
useEffect(() => {
|
|
73
|
-
if (!hideOnTargetExit || !open || !triggerRef.current)
|
|
74
|
-
return;
|
|
75
|
-
const observer = new IntersectionObserver(([entry]) => {
|
|
76
|
-
if (!entry.isIntersecting)
|
|
77
|
-
handleOpenChange(false);
|
|
78
|
-
});
|
|
79
|
-
observer.observe(triggerRef.current);
|
|
80
|
-
return () => observer.disconnect();
|
|
81
|
-
}, [hideOnTargetExit, open, handleOpenChange]);
|
|
82
70
|
if (disabled) {
|
|
83
71
|
return jsx(Fragment, { children: trigger });
|
|
84
72
|
}
|
|
@@ -86,10 +74,10 @@ const Popover = forwardRef(({ children, trigger, variant = "default", disabled =
|
|
|
86
74
|
const align = ALIGN_MAP[position] ?? "center";
|
|
87
75
|
// Wrap non-element trigger in a span
|
|
88
76
|
const triggerElement = React__default.isValidElement(trigger) ? (trigger) : (jsx("span", { children: trigger }));
|
|
89
|
-
return (jsxs(HoverCard, { open: open, onOpenChange: handleOpenChange, defaultOpen: defaultOpen, openDelay: openDelay, closeDelay: closeDelay, children: [jsx(HoverCardTrigger, {
|
|
77
|
+
return (jsxs(HoverCard, { open: open, onOpenChange: handleOpenChange, defaultOpen: defaultOpen, openDelay: openDelay, closeDelay: closeDelay, children: [jsx(HoverCardTrigger, { asChild: true, children: triggerElement }), jsx(HoverCardContent, { ref: ref, side: side, align: align, className: cn(popoverVariants({ variant }), className), ...contentProps, children: children })] }));
|
|
90
78
|
});
|
|
91
79
|
Popover.displayName = "Popover";
|
|
92
80
|
Popover.Title = Title;
|
|
93
81
|
|
|
94
82
|
export { Popover as P };
|
|
95
|
-
//# sourceMappingURL=Popover-
|
|
83
|
+
//# sourceMappingURL=Popover-dib6elwS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Popover-dib6elwS.js","sources":["../src/components/Popover/constants.ts","../src/components/Popover/Popover.tsx"],"sourcesContent":["export const SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n \"top-start\": \"top\",\n \"top-end\": \"top\",\n \"bottom-start\": \"bottom\",\n \"bottom-end\": \"bottom\",\n \"left-start\": \"left\",\n \"left-end\": \"left\",\n \"right-start\": \"right\",\n \"right-end\": \"right\",\n auto: \"bottom\",\n};\n\nexport const ALIGN_MAP: Record<string, \"start\" | \"center\" | \"end\"> = {\n top: \"center\",\n bottom: \"center\",\n left: \"center\",\n right: \"center\",\n \"top-start\": \"start\",\n \"top-end\": \"end\",\n \"bottom-start\": \"start\",\n \"bottom-end\": \"end\",\n \"left-start\": \"start\",\n \"left-end\": \"end\",\n \"right-start\": \"start\",\n \"right-end\": \"end\",\n auto: \"center\",\n};\n","import React, {\n forwardRef,\n useCallback,\n useEffect,\n useState,\n type ReactNode,\n} from \"react\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n HoverCard,\n HoverCardContent,\n HoverCardTrigger,\n} from \"src/primitives/HoverCard\";\n\ntype PopoverPosition =\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left-start\"\n | \"left-end\"\n | \"right-start\"\n | \"right-end\"\n | \"auto\";\n\nconst popoverVariants = cva(\"flex flex-col gap-2.5\", {\n variants: {\n variant: {\n default: \"\",\n primary: \"bg-primary text-primary-foreground ring-0 shadow-lg\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n});\n\ntype PopoverVariant = NonNullable<\n VariantProps<typeof popoverVariants>[\"variant\"]\n>;\n\n/** Radix HoverCard.Content props we forward via ...otherProps. */\ntype HoverCardContentProps = React.ComponentProps<typeof HoverCardContent>;\n\nexport interface PopoverProps extends Omit<\n HoverCardContentProps,\n \"children\" | \"className\" | \"side\" | \"align\"\n> {\n /** Content rendered inside the popover. */\n children?: ReactNode;\n /** The trigger element that opens the popover on hover. */\n trigger?: ReactNode;\n /** Color variant of the popover. */\n variant?: PopoverVariant;\n /** Disable the popover. */\n disabled?: boolean;\n /** Placement of the popover relative to the trigger. */\n position?: PopoverPosition;\n /** Additional CSS class names for the popover content. */\n className?: string;\n /** Whether the popover is open (controlled). */\n open?: boolean;\n /** Callback when open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Auto-hide after N milliseconds. Use -1 to disable. */\n hideAfter?: number;\n /** Radix HoverCard `defaultOpen` prop. */\n defaultOpen?: boolean;\n /** Delay in ms before the popover opens on hover. */\n openDelay?: number;\n /** Delay in ms before the popover closes after hover leaves. */\n closeDelay?: number;\n}\n\nimport { SIDE_MAP, ALIGN_MAP } from \"./constants\";\n\ninterface PopoverTitleProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n}\n\nconst Title = forwardRef<HTMLDivElement, PopoverTitleProps>(\n ({ children, className, ...otherProps }, ref) => (\n <div\n ref={ref}\n data-slot=\"popover-title\"\n className={cn(\"text-sm font-semibold\", className)}\n {...otherProps}\n >\n {children}\n </div>\n )\n);\nTitle.displayName = \"Popover.Title\";\n\nconst Popover = forwardRef<HTMLDivElement, PopoverProps>(\n (\n {\n children,\n trigger,\n variant = \"default\",\n disabled = false,\n position = \"auto\",\n className,\n open: openProp,\n onOpenChange: onOpenChangeProp,\n hideAfter = -1,\n defaultOpen,\n openDelay = 200,\n closeDelay = 200,\n // Radix HoverCardContent props forwarded\n ...contentProps\n },\n ref\n ) => {\n // Internal state for uncontrolled mode + hideAfter\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : internalOpen;\n\n const handleOpenChange = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChangeProp?.(next);\n },\n [isControlled, onOpenChangeProp]\n );\n\n // Auto-hide after hideAfter ms\n useEffect(() => {\n if (!open || hideAfter <= 0) return;\n const timer = setTimeout(() => handleOpenChange(false), hideAfter);\n return () => clearTimeout(timer);\n }, [open, hideAfter, handleOpenChange]);\n\n if (disabled) {\n return <>{trigger}</>;\n }\n\n const side = SIDE_MAP[position] ?? \"bottom\";\n const align = ALIGN_MAP[position] ?? \"center\";\n\n // Wrap non-element trigger in a span\n const triggerElement = React.isValidElement(trigger) ? (\n trigger\n ) : (\n <span>{trigger}</span>\n );\n\n return (\n <HoverCard\n open={open}\n onOpenChange={handleOpenChange}\n defaultOpen={defaultOpen}\n openDelay={openDelay}\n closeDelay={closeDelay}\n >\n <HoverCardTrigger asChild>{triggerElement}</HoverCardTrigger>\n <HoverCardContent\n ref={ref}\n side={side}\n align={align}\n className={cn(popoverVariants({ variant }), className)}\n {...contentProps}\n >\n {children}\n </HoverCardContent>\n </HoverCard>\n );\n }\n) as React.ForwardRefExoticComponent<\n PopoverProps & React.RefAttributes<HTMLDivElement>\n> & {\n Title: typeof Title;\n};\n\nPopover.displayName = \"Popover\";\nPopover.Title = Title;\n\nexport { Popover };\n"],"names":["_jsx","_Fragment","React","_jsxs"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import React__default, {
|
|
2
|
+
import React__default, { useState, useEffect } from 'react';
|
|
3
3
|
import { TooltipProvider, Tooltip as Tooltip$1, TooltipTrigger, TooltipContent } from './primitives/Tooltip.js';
|
|
4
4
|
|
|
5
5
|
const SIDE_MAP = {
|
|
@@ -33,20 +33,10 @@ const ALIGN_MAP = {
|
|
|
33
33
|
auto: "center",
|
|
34
34
|
};
|
|
35
35
|
|
|
36
|
-
const Tooltip =
|
|
36
|
+
const Tooltip = ({ content, children, disabled = false, position = "auto", interactive = false, hideAfter = -1, className, delayDuration = 0, defaultOpen,
|
|
37
37
|
// Radix TooltipContent props forwarded
|
|
38
|
-
...contentProps }
|
|
38
|
+
...contentProps }) => {
|
|
39
39
|
const [open, setOpen] = useState(false);
|
|
40
|
-
const triggerRef = useRef(null);
|
|
41
|
-
// Merge external ref with internal trigger ref
|
|
42
|
-
const setTriggerRef = useCallback((node) => {
|
|
43
|
-
triggerRef.current = node;
|
|
44
|
-
if (typeof ref === "function")
|
|
45
|
-
ref(node);
|
|
46
|
-
else if (ref)
|
|
47
|
-
ref.current =
|
|
48
|
-
node;
|
|
49
|
-
}, [ref]);
|
|
50
40
|
// Auto-hide after hideAfter ms
|
|
51
41
|
useEffect(() => {
|
|
52
42
|
if (!open || hideAfter <= 0)
|
|
@@ -54,17 +44,6 @@ const Tooltip = forwardRef(({ content, children, disabled = false, position = "a
|
|
|
54
44
|
const timer = setTimeout(() => setOpen(false), hideAfter);
|
|
55
45
|
return () => clearTimeout(timer);
|
|
56
46
|
}, [open, hideAfter]);
|
|
57
|
-
// Hide tooltip when trigger exits viewport
|
|
58
|
-
useEffect(() => {
|
|
59
|
-
if (!hideOnTargetExit || !open || !triggerRef.current)
|
|
60
|
-
return;
|
|
61
|
-
const observer = new IntersectionObserver(([entry]) => {
|
|
62
|
-
if (!entry.isIntersecting)
|
|
63
|
-
setOpen(false);
|
|
64
|
-
});
|
|
65
|
-
observer.observe(triggerRef.current);
|
|
66
|
-
return () => observer.disconnect();
|
|
67
|
-
}, [hideOnTargetExit, open]);
|
|
68
47
|
if (disabled || !content) {
|
|
69
48
|
return jsx(Fragment, { children: children });
|
|
70
49
|
}
|
|
@@ -72,9 +51,9 @@ const Tooltip = forwardRef(({ content, children, disabled = false, position = "a
|
|
|
72
51
|
const align = ALIGN_MAP[position] ?? "center";
|
|
73
52
|
// Wrap non-element children in a span so TooltipTrigger can attach
|
|
74
53
|
const trigger = React__default.isValidElement(children) ? (children) : (jsx("span", { children: children }));
|
|
75
|
-
return (jsx(TooltipProvider, { delayDuration: delayDuration, children: jsxs(Tooltip$1, { open: open, onOpenChange: setOpen, defaultOpen: defaultOpen, disableHoverableContent: !interactive, children: [jsx(TooltipTrigger, {
|
|
76
|
-
}
|
|
54
|
+
return (jsx(TooltipProvider, { delayDuration: delayDuration, children: jsxs(Tooltip$1, { open: open, onOpenChange: setOpen, defaultOpen: defaultOpen, disableHoverableContent: !interactive, children: [jsx(TooltipTrigger, { asChild: true, children: trigger }), jsx(TooltipContent, { side: side, align: align, className: className, onPointerDownOutside: interactive ? e => e.preventDefault() : undefined, ...contentProps, children: content })] }) }));
|
|
55
|
+
};
|
|
77
56
|
Tooltip.displayName = "Tooltip";
|
|
78
57
|
|
|
79
58
|
export { Tooltip as T };
|
|
80
|
-
//# sourceMappingURL=Tooltip-
|
|
59
|
+
//# sourceMappingURL=Tooltip-3ZzQyaDV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip-3ZzQyaDV.js","sources":["../src/components/Tooltip/constants.ts","../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["export const SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n \"top-start\": \"top\",\n \"top-end\": \"top\",\n \"bottom-start\": \"bottom\",\n \"bottom-end\": \"bottom\",\n \"left-start\": \"left\",\n \"left-end\": \"left\",\n \"right-start\": \"right\",\n \"right-end\": \"right\",\n auto: \"top\",\n};\n\nexport const ALIGN_MAP: Record<string, \"start\" | \"center\" | \"end\"> = {\n top: \"center\",\n bottom: \"center\",\n left: \"center\",\n right: \"center\",\n \"top-start\": \"start\",\n \"top-end\": \"end\",\n \"bottom-start\": \"start\",\n \"bottom-end\": \"end\",\n \"left-start\": \"start\",\n \"left-end\": \"end\",\n \"right-start\": \"start\",\n \"right-end\": \"end\",\n auto: \"center\",\n};\n","import React, { useEffect, useState, type ReactNode } from \"react\";\n\nimport {\n Tooltip as PrimitiveTooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"src/primitives/Tooltip\";\n\ntype TooltipPosition =\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left-start\"\n | \"left-end\"\n | \"right-start\"\n | \"right-end\"\n | \"auto\";\n\n/** Radix Tooltip.Content props we forward via ...otherProps. */\ntype TooltipContentProps = React.ComponentProps<typeof TooltipContent>;\n\nexport interface TooltipProps extends Omit<\n TooltipContentProps,\n \"children\" | \"className\" | \"side\" | \"align\" | \"content\"\n> {\n /** Content rendered inside the tooltip popup. */\n content?: ReactNode;\n /** The trigger element. */\n children?: ReactNode;\n /** Disable the tooltip. */\n disabled?: boolean;\n /** Placement of the tooltip relative to the trigger. */\n position?: TooltipPosition;\n /** Whether the tooltip stays open when hovered over. */\n interactive?: boolean;\n /** Auto-hide after N milliseconds. Use -1 to disable. */\n hideAfter?: number;\n /** Additional CSS class names for the tooltip content. */\n className?: string;\n /** Delay in ms before the tooltip opens (forwarded to TooltipProvider). */\n delayDuration?: number;\n /** Radix Tooltip `defaultOpen` prop. */\n defaultOpen?: boolean;\n}\n\nimport { SIDE_MAP, ALIGN_MAP } from \"./constants\";\n\nconst Tooltip = ({\n content,\n children,\n disabled = false,\n position = \"auto\",\n interactive = false,\n hideAfter = -1,\n className,\n delayDuration = 0,\n defaultOpen,\n // Radix TooltipContent props forwarded\n ...contentProps\n}: TooltipProps) => {\n const [open, setOpen] = useState(false);\n\n // Auto-hide after hideAfter ms\n useEffect(() => {\n if (!open || hideAfter <= 0) return;\n const timer = setTimeout(() => setOpen(false), hideAfter);\n return () => clearTimeout(timer);\n }, [open, hideAfter]);\n\n if (disabled || !content) {\n return <>{children}</>;\n }\n\n const side = SIDE_MAP[position] ?? \"top\";\n const align = ALIGN_MAP[position] ?? \"center\";\n\n // Wrap non-element children in a span so TooltipTrigger can attach\n const trigger = React.isValidElement(children) ? (\n children\n ) : (\n <span>{children}</span>\n );\n\n return (\n <TooltipProvider delayDuration={delayDuration}>\n <PrimitiveTooltip\n open={open}\n onOpenChange={setOpen}\n defaultOpen={defaultOpen}\n disableHoverableContent={!interactive}\n >\n <TooltipTrigger asChild>{trigger}</TooltipTrigger>\n <TooltipContent\n side={side}\n align={align}\n className={className}\n onPointerDownOutside={\n interactive ? e => e.preventDefault() : undefined\n }\n {...contentProps}\n >\n {content}\n </TooltipContent>\n </PrimitiveTooltip>\n </TooltipProvider>\n );\n};\n\nTooltip.displayName = \"Tooltip\";\n\nexport { Tooltip };\n"],"names":["_jsx","_Fragment","React","_jsxs","PrimitiveTooltip"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ var utils = require('./utils-CTr7wn5d.js');
|
|
|
6
6
|
var renderIcon = require('./renderIcon-fLF3odqg.js');
|
|
7
7
|
var primitives_Label = require('./primitives/Label.js');
|
|
8
8
|
var primitives_Tooltip = require('./primitives/Tooltip.js');
|
|
9
|
-
var Popover = require('./Popover-
|
|
9
|
+
var Popover = require('./Popover-B1d4URJl.js');
|
|
10
10
|
var Button = require('./Button-Bt_AElge.js');
|
|
11
11
|
var createLucideIcon = require('./createLucideIcon-D0tRgV6l.js');
|
|
12
12
|
|
|
@@ -57,4 +57,4 @@ const Label = React.forwardRef(({ required, helpIconProps, className, children,
|
|
|
57
57
|
Label.displayName = "Label";
|
|
58
58
|
|
|
59
59
|
exports.Label = Label;
|
|
60
|
-
//# sourceMappingURL=Label-
|
|
60
|
+
//# sourceMappingURL=Label-B8SlyX1E.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Label-
|
|
1
|
+
{"version":3,"file":"Label-B8SlyX1E.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle-question-mark.js","../../../src/components/Label/constants.ts","../../../src/components/Label/Label.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\", key: \"1u773s\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst CircleQuestionMark = createLucideIcon(\"circle-question-mark\", __iconNode);\n\nexport { __iconNode, CircleQuestionMark as default };\n//# sourceMappingURL=circle-question-mark.js.map\n","export const SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n auto: \"top\",\n};\n","import React, { forwardRef } from \"react\";\n\nimport { CircleHelpIcon } from \"lucide-react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon, type IconProp } from \"src/lib/renderIcon\";\nimport { Label as PrimitiveLabel } from \"src/primitives/Label\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"src/primitives/Tooltip\";\nimport { Popover } from \"src/components/Popover\";\nimport { Button, type ButtonProps } from \"src/components/Button\";\n\nimport { SIDE_MAP } from \"./constants\";\n\ninterface HelpIconTooltipProps {\n /** Tooltip content. */\n content?: React.ReactNode;\n /** Tooltip position. */\n position?: string;\n}\n\ninterface HelpIconPopoverProps {\n /** Popover title. */\n title?: React.ReactNode;\n /** Popover description. */\n description?: React.ReactNode;\n /** Props for an optional help link button inside the popover. */\n helpLinkProps?: ButtonProps;\n}\n\ninterface HelpIconProps {\n /** Click handler on the help icon. */\n onClick?: () => void;\n /** Custom icon. Defaults to CircleHelpIcon. */\n icon?: IconProp;\n /** Show a tooltip on hover. */\n tooltipProps?: HelpIconTooltipProps;\n /** Show a popover on hover with title, description, and optional link. */\n popoverProps?: HelpIconPopoverProps;\n /** Additional class name for the help icon. */\n className?: string;\n}\n\nexport interface LabelProps extends React.ComponentProps<\n typeof PrimitiveLabel\n> {\n /** Shows a red asterisk after the label text. */\n required?: boolean;\n /** Props for the help icon (tooltip or popover mode). */\n helpIconProps?: HelpIconProps;\n /** Additional CSS class names. */\n className?: string;\n}\n\nconst Label = forwardRef<HTMLLabelElement, LabelProps>(\n ({ required, helpIconProps, className, children, ...otherProps }, ref) => {\n const helpIcon = helpIconProps?.icon ?? CircleHelpIcon;\n\n const iconElement = (\n <span\n className={cn(\n \"inline-flex cursor-help text-muted-foreground transition-colors hover:text-foreground\",\n helpIconProps?.onClick && \"cursor-pointer\",\n helpIconProps?.className\n )}\n onClick={helpIconProps?.onClick}\n >\n {renderIcon(helpIcon, \"size-3.5\")}\n </span>\n );\n\n const renderHelpIcon = () => {\n if (!helpIconProps) return null;\n\n // Popover mode\n if (helpIconProps.popoverProps) {\n const { title, description, helpLinkProps } =\n helpIconProps.popoverProps;\n\n return (\n <Popover trigger={iconElement}>\n {title && <Popover.Title>{title}</Popover.Title>}\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n {helpLinkProps && (\n <Button\n variant=\"link\"\n size=\"sm\"\n className=\"mt-1 h-auto self-start p-0\"\n {...helpLinkProps}\n href={helpLinkProps.href}\n />\n )}\n </Popover>\n );\n }\n\n // Tooltip mode\n if (helpIconProps.tooltipProps?.content) {\n const side =\n SIDE_MAP[helpIconProps.tooltipProps.position ?? \"auto\"] ?? \"top\";\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{iconElement}</TooltipTrigger>\n <TooltipContent side={side}>\n {helpIconProps.tooltipProps.content}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n // Icon only (with optional onClick)\n return iconElement;\n };\n\n return (\n <PrimitiveLabel ref={ref} className={cn(className)} {...otherProps}>\n {children}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n {renderHelpIcon()}\n </PrimitiveLabel>\n );\n }\n);\n\nLabel.displayName = \"Label\";\n\nexport { Label };\n"],"names":["createLucideIcon","forwardRef","CircleHelpIcon","_jsx","cn","renderIcon","_jsxs","Popover","Button","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","PrimitiveLabel"],"mappings":";;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;;;AAIA,MAAM,UAAU,GAAG;AACnB,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC5D,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,sCAAsC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AACxE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE;AAC7C,CAAC;AACD,MAAM,kBAAkB,GAAGA,iCAAgB,CAAC,sBAAsB,EAAE,UAAU,CAAC;;ACdxE,MAAM,QAAQ,GAAwD;AAC3E,IAAA,GAAG,EAAE,KAAK;AACV,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,IAAI,EAAE,KAAK;CACZ;;ACoDD,MAAM,KAAK,GAAGC,gBAAU,CACtB,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,UAAU,EAAE,EAAE,GAAG,KAAI;AACvE,IAAA,MAAM,QAAQ,GAAG,aAAa,EAAE,IAAI,IAAIC,kBAAc;AAEtD,IAAA,MAAM,WAAW,IACfC,cAAA,CAAA,MAAA,EAAA,EACE,SAAS,EAAEC,QAAE,CACX,uFAAuF,EACvF,aAAa,EAAE,OAAO,IAAI,gBAAgB,EAC1C,aAAa,EAAE,SAAS,CACzB,EACD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAA,QAAA,EAE9BC,qBAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAA,CAC5B,CACR;IAED,MAAM,cAAc,GAAG,MAAK;AAC1B,QAAA,IAAI,CAAC,aAAa;AAAE,YAAA,OAAO,IAAI;;AAG/B,QAAA,IAAI,aAAa,CAAC,YAAY,EAAE;YAC9B,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,GACzC,aAAa,CAAC,YAAY;YAE5B,QACEC,eAAA,CAACC,eAAO,EAAA,EAAC,OAAO,EAAE,WAAW,EAAA,QAAA,EAAA,CAC1B,KAAK,IAAIJ,cAAA,CAACI,eAAO,CAAC,KAAK,EAAA,EAAA,QAAA,EAAE,KAAK,EAAA,CAAiB,EAC/C,WAAW,KACVJ,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,+BAA+B,EAAA,QAAA,EAAE,WAAW,EAAA,CAAK,CAC/D,EACA,aAAa,KACZA,cAAA,CAACK,aAAM,EAAA,EACL,OAAO,EAAC,MAAM,EACd,IAAI,EAAC,IAAI,EACT,SAAS,EAAC,4BAA4B,EAAA,GAClC,aAAa,EACjB,IAAI,EAAE,aAAa,CAAC,IAAI,EAAA,CACxB,CACH,CAAA,EAAA,CACO;QAEd;;AAGA,QAAA,IAAI,aAAa,CAAC,YAAY,EAAE,OAAO,EAAE;AACvC,YAAA,MAAM,IAAI,GACR,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK;AAElE,YAAA,QACEL,cAAA,CAACM,kCAAe,EAAA,EAAA,QAAA,EACdH,eAAA,CAACI,0BAAO,EAAA,EAAA,QAAA,EAAA,CACNP,cAAA,CAACQ,iCAAc,EAAA,EAAC,OAAO,EAAA,IAAA,EAAA,QAAA,EAAE,WAAW,EAAA,CAAkB,EACtDR,cAAA,CAACS,iCAAc,EAAA,EAAC,IAAI,EAAE,IAAI,YACvB,aAAa,CAAC,YAAY,CAAC,OAAO,EAAA,CACpB,CAAA,EAAA,CACT,EAAA,CACM;QAEtB;;AAGA,QAAA,OAAO,WAAW;AACpB,IAAA,CAAC;AAED,IAAA,QACEN,eAAA,CAACO,sBAAc,EAAA,EAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAET,QAAE,CAAC,SAAS,CAAC,KAAM,UAAU,EAAA,QAAA,EAAA,CAC/D,QAAQ,EACR,QAAQ,KACPD,cAAA,CAAA,MAAA,EAAA,EAAA,aAAA,EAAkB,MAAM,EAAC,SAAS,EAAC,kBAAkB,EAAA,QAAA,EAAA,GAAA,EAAA,CAE9C,CACR,EACA,cAAc,EAAE,CAAA,EAAA,CACF;AAErB,CAAC;AAGH,KAAK,CAAC,WAAW,GAAG,OAAO;;;;","x_google_ignoreList":[0]}
|
|
@@ -54,10 +54,10 @@ const popoverVariants = index.cva("flex flex-col gap-2.5", {
|
|
|
54
54
|
});
|
|
55
55
|
const Title = React.forwardRef(({ children, className, ...otherProps }, ref) => (jsxRuntime.jsx("div", { ref: ref, "data-slot": "popover-title", className: utils.cn("text-sm font-semibold", className), ...otherProps, children: children })));
|
|
56
56
|
Title.displayName = "Popover.Title";
|
|
57
|
-
const Popover = React.forwardRef(({ children, trigger, variant = "default", disabled = false, position = "auto", className, open: openProp, onOpenChange: onOpenChangeProp, hideAfter = -1,
|
|
57
|
+
const Popover = React.forwardRef(({ children, trigger, variant = "default", disabled = false, position = "auto", className, open: openProp, onOpenChange: onOpenChangeProp, hideAfter = -1, defaultOpen, openDelay = 200, closeDelay = 200,
|
|
58
58
|
// Radix HoverCardContent props forwarded
|
|
59
59
|
...contentProps }, ref) => {
|
|
60
|
-
// Internal state for uncontrolled mode + hideAfter
|
|
60
|
+
// Internal state for uncontrolled mode + hideAfter
|
|
61
61
|
const [internalOpen, setInternalOpen] = React.useState(false);
|
|
62
62
|
const isControlled = openProp !== undefined;
|
|
63
63
|
const open = isControlled ? openProp : internalOpen;
|
|
@@ -66,7 +66,6 @@ const Popover = React.forwardRef(({ children, trigger, variant = "default", disa
|
|
|
66
66
|
setInternalOpen(next);
|
|
67
67
|
onOpenChangeProp?.(next);
|
|
68
68
|
}, [isControlled, onOpenChangeProp]);
|
|
69
|
-
const triggerRef = React.useRef(null);
|
|
70
69
|
// Auto-hide after hideAfter ms
|
|
71
70
|
React.useEffect(() => {
|
|
72
71
|
if (!open || hideAfter <= 0)
|
|
@@ -74,17 +73,6 @@ const Popover = React.forwardRef(({ children, trigger, variant = "default", disa
|
|
|
74
73
|
const timer = setTimeout(() => handleOpenChange(false), hideAfter);
|
|
75
74
|
return () => clearTimeout(timer);
|
|
76
75
|
}, [open, hideAfter, handleOpenChange]);
|
|
77
|
-
// Hide popover when trigger exits viewport
|
|
78
|
-
React.useEffect(() => {
|
|
79
|
-
if (!hideOnTargetExit || !open || !triggerRef.current)
|
|
80
|
-
return;
|
|
81
|
-
const observer = new IntersectionObserver(([entry]) => {
|
|
82
|
-
if (!entry.isIntersecting)
|
|
83
|
-
handleOpenChange(false);
|
|
84
|
-
});
|
|
85
|
-
observer.observe(triggerRef.current);
|
|
86
|
-
return () => observer.disconnect();
|
|
87
|
-
}, [hideOnTargetExit, open, handleOpenChange]);
|
|
88
76
|
if (disabled) {
|
|
89
77
|
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: trigger });
|
|
90
78
|
}
|
|
@@ -92,10 +80,10 @@ const Popover = React.forwardRef(({ children, trigger, variant = "default", disa
|
|
|
92
80
|
const align = ALIGN_MAP[position] ?? "center";
|
|
93
81
|
// Wrap non-element trigger in a span
|
|
94
82
|
const triggerElement = React__default.default.isValidElement(trigger) ? (trigger) : (jsxRuntime.jsx("span", { children: trigger }));
|
|
95
|
-
return (jsxRuntime.jsxs(primitives_HoverCard.HoverCard, { open: open, onOpenChange: handleOpenChange, defaultOpen: defaultOpen, openDelay: openDelay, closeDelay: closeDelay, children: [jsxRuntime.jsx(primitives_HoverCard.HoverCardTrigger, {
|
|
83
|
+
return (jsxRuntime.jsxs(primitives_HoverCard.HoverCard, { open: open, onOpenChange: handleOpenChange, defaultOpen: defaultOpen, openDelay: openDelay, closeDelay: closeDelay, children: [jsxRuntime.jsx(primitives_HoverCard.HoverCardTrigger, { asChild: true, children: triggerElement }), jsxRuntime.jsx(primitives_HoverCard.HoverCardContent, { ref: ref, side: side, align: align, className: utils.cn(popoverVariants({ variant }), className), ...contentProps, children: children })] }));
|
|
96
84
|
});
|
|
97
85
|
Popover.displayName = "Popover";
|
|
98
86
|
Popover.Title = Title;
|
|
99
87
|
|
|
100
88
|
exports.Popover = Popover;
|
|
101
|
-
//# sourceMappingURL=Popover-
|
|
89
|
+
//# sourceMappingURL=Popover-B1d4URJl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Popover-B1d4URJl.js","sources":["../../../src/components/Popover/constants.ts","../../../src/components/Popover/Popover.tsx"],"sourcesContent":["export const SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n \"top-start\": \"top\",\n \"top-end\": \"top\",\n \"bottom-start\": \"bottom\",\n \"bottom-end\": \"bottom\",\n \"left-start\": \"left\",\n \"left-end\": \"left\",\n \"right-start\": \"right\",\n \"right-end\": \"right\",\n auto: \"bottom\",\n};\n\nexport const ALIGN_MAP: Record<string, \"start\" | \"center\" | \"end\"> = {\n top: \"center\",\n bottom: \"center\",\n left: \"center\",\n right: \"center\",\n \"top-start\": \"start\",\n \"top-end\": \"end\",\n \"bottom-start\": \"start\",\n \"bottom-end\": \"end\",\n \"left-start\": \"start\",\n \"left-end\": \"end\",\n \"right-start\": \"start\",\n \"right-end\": \"end\",\n auto: \"center\",\n};\n","import React, {\n forwardRef,\n useCallback,\n useEffect,\n useState,\n type ReactNode,\n} from \"react\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n HoverCard,\n HoverCardContent,\n HoverCardTrigger,\n} from \"src/primitives/HoverCard\";\n\ntype PopoverPosition =\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left-start\"\n | \"left-end\"\n | \"right-start\"\n | \"right-end\"\n | \"auto\";\n\nconst popoverVariants = cva(\"flex flex-col gap-2.5\", {\n variants: {\n variant: {\n default: \"\",\n primary: \"bg-primary text-primary-foreground ring-0 shadow-lg\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n});\n\ntype PopoverVariant = NonNullable<\n VariantProps<typeof popoverVariants>[\"variant\"]\n>;\n\n/** Radix HoverCard.Content props we forward via ...otherProps. */\ntype HoverCardContentProps = React.ComponentProps<typeof HoverCardContent>;\n\nexport interface PopoverProps extends Omit<\n HoverCardContentProps,\n \"children\" | \"className\" | \"side\" | \"align\"\n> {\n /** Content rendered inside the popover. */\n children?: ReactNode;\n /** The trigger element that opens the popover on hover. */\n trigger?: ReactNode;\n /** Color variant of the popover. */\n variant?: PopoverVariant;\n /** Disable the popover. */\n disabled?: boolean;\n /** Placement of the popover relative to the trigger. */\n position?: PopoverPosition;\n /** Additional CSS class names for the popover content. */\n className?: string;\n /** Whether the popover is open (controlled). */\n open?: boolean;\n /** Callback when open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Auto-hide after N milliseconds. Use -1 to disable. */\n hideAfter?: number;\n /** Radix HoverCard `defaultOpen` prop. */\n defaultOpen?: boolean;\n /** Delay in ms before the popover opens on hover. */\n openDelay?: number;\n /** Delay in ms before the popover closes after hover leaves. */\n closeDelay?: number;\n}\n\nimport { SIDE_MAP, ALIGN_MAP } from \"./constants\";\n\ninterface PopoverTitleProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n}\n\nconst Title = forwardRef<HTMLDivElement, PopoverTitleProps>(\n ({ children, className, ...otherProps }, ref) => (\n <div\n ref={ref}\n data-slot=\"popover-title\"\n className={cn(\"text-sm font-semibold\", className)}\n {...otherProps}\n >\n {children}\n </div>\n )\n);\nTitle.displayName = \"Popover.Title\";\n\nconst Popover = forwardRef<HTMLDivElement, PopoverProps>(\n (\n {\n children,\n trigger,\n variant = \"default\",\n disabled = false,\n position = \"auto\",\n className,\n open: openProp,\n onOpenChange: onOpenChangeProp,\n hideAfter = -1,\n defaultOpen,\n openDelay = 200,\n closeDelay = 200,\n // Radix HoverCardContent props forwarded\n ...contentProps\n },\n ref\n ) => {\n // Internal state for uncontrolled mode + hideAfter\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : internalOpen;\n\n const handleOpenChange = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChangeProp?.(next);\n },\n [isControlled, onOpenChangeProp]\n );\n\n // Auto-hide after hideAfter ms\n useEffect(() => {\n if (!open || hideAfter <= 0) return;\n const timer = setTimeout(() => handleOpenChange(false), hideAfter);\n return () => clearTimeout(timer);\n }, [open, hideAfter, handleOpenChange]);\n\n if (disabled) {\n return <>{trigger}</>;\n }\n\n const side = SIDE_MAP[position] ?? \"bottom\";\n const align = ALIGN_MAP[position] ?? \"center\";\n\n // Wrap non-element trigger in a span\n const triggerElement = React.isValidElement(trigger) ? (\n trigger\n ) : (\n <span>{trigger}</span>\n );\n\n return (\n <HoverCard\n open={open}\n onOpenChange={handleOpenChange}\n defaultOpen={defaultOpen}\n openDelay={openDelay}\n closeDelay={closeDelay}\n >\n <HoverCardTrigger asChild>{triggerElement}</HoverCardTrigger>\n <HoverCardContent\n ref={ref}\n side={side}\n align={align}\n className={cn(popoverVariants({ variant }), className)}\n {...contentProps}\n >\n {children}\n </HoverCardContent>\n </HoverCard>\n );\n }\n) as React.ForwardRefExoticComponent<\n PopoverProps & React.RefAttributes<HTMLDivElement>\n> & {\n Title: typeof Title;\n};\n\nPopover.displayName = \"Popover\";\nPopover.Title = Title;\n\nexport { Popover };\n"],"names":["cva","forwardRef","_jsx","cn","useState","useCallback","useEffect","_Fragment","React","_jsxs","HoverCard","HoverCardTrigger","HoverCardContent"],"mappings":"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"}
|
|
@@ -39,20 +39,10 @@ const ALIGN_MAP = {
|
|
|
39
39
|
auto: "center",
|
|
40
40
|
};
|
|
41
41
|
|
|
42
|
-
const Tooltip =
|
|
42
|
+
const Tooltip = ({ content, children, disabled = false, position = "auto", interactive = false, hideAfter = -1, className, delayDuration = 0, defaultOpen,
|
|
43
43
|
// Radix TooltipContent props forwarded
|
|
44
|
-
...contentProps }
|
|
44
|
+
...contentProps }) => {
|
|
45
45
|
const [open, setOpen] = React.useState(false);
|
|
46
|
-
const triggerRef = React.useRef(null);
|
|
47
|
-
// Merge external ref with internal trigger ref
|
|
48
|
-
const setTriggerRef = React.useCallback((node) => {
|
|
49
|
-
triggerRef.current = node;
|
|
50
|
-
if (typeof ref === "function")
|
|
51
|
-
ref(node);
|
|
52
|
-
else if (ref)
|
|
53
|
-
ref.current =
|
|
54
|
-
node;
|
|
55
|
-
}, [ref]);
|
|
56
46
|
// Auto-hide after hideAfter ms
|
|
57
47
|
React.useEffect(() => {
|
|
58
48
|
if (!open || hideAfter <= 0)
|
|
@@ -60,17 +50,6 @@ const Tooltip = React.forwardRef(({ content, children, disabled = false, positio
|
|
|
60
50
|
const timer = setTimeout(() => setOpen(false), hideAfter);
|
|
61
51
|
return () => clearTimeout(timer);
|
|
62
52
|
}, [open, hideAfter]);
|
|
63
|
-
// Hide tooltip when trigger exits viewport
|
|
64
|
-
React.useEffect(() => {
|
|
65
|
-
if (!hideOnTargetExit || !open || !triggerRef.current)
|
|
66
|
-
return;
|
|
67
|
-
const observer = new IntersectionObserver(([entry]) => {
|
|
68
|
-
if (!entry.isIntersecting)
|
|
69
|
-
setOpen(false);
|
|
70
|
-
});
|
|
71
|
-
observer.observe(triggerRef.current);
|
|
72
|
-
return () => observer.disconnect();
|
|
73
|
-
}, [hideOnTargetExit, open]);
|
|
74
53
|
if (disabled || !content) {
|
|
75
54
|
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: children });
|
|
76
55
|
}
|
|
@@ -78,9 +57,9 @@ const Tooltip = React.forwardRef(({ content, children, disabled = false, positio
|
|
|
78
57
|
const align = ALIGN_MAP[position] ?? "center";
|
|
79
58
|
// Wrap non-element children in a span so TooltipTrigger can attach
|
|
80
59
|
const trigger = React__default.default.isValidElement(children) ? (children) : (jsxRuntime.jsx("span", { children: children }));
|
|
81
|
-
return (jsxRuntime.jsx(primitives_Tooltip.TooltipProvider, { delayDuration: delayDuration, children: jsxRuntime.jsxs(primitives_Tooltip.Tooltip, { open: open, onOpenChange: setOpen, defaultOpen: defaultOpen, disableHoverableContent: !interactive, children: [jsxRuntime.jsx(primitives_Tooltip.TooltipTrigger, {
|
|
82
|
-
}
|
|
60
|
+
return (jsxRuntime.jsx(primitives_Tooltip.TooltipProvider, { delayDuration: delayDuration, children: jsxRuntime.jsxs(primitives_Tooltip.Tooltip, { open: open, onOpenChange: setOpen, defaultOpen: defaultOpen, disableHoverableContent: !interactive, children: [jsxRuntime.jsx(primitives_Tooltip.TooltipTrigger, { asChild: true, children: trigger }), jsxRuntime.jsx(primitives_Tooltip.TooltipContent, { side: side, align: align, className: className, onPointerDownOutside: interactive ? e => e.preventDefault() : undefined, ...contentProps, children: content })] }) }));
|
|
61
|
+
};
|
|
83
62
|
Tooltip.displayName = "Tooltip";
|
|
84
63
|
|
|
85
64
|
exports.Tooltip = Tooltip;
|
|
86
|
-
//# sourceMappingURL=Tooltip-
|
|
65
|
+
//# sourceMappingURL=Tooltip-criVUtIg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip-criVUtIg.js","sources":["../../../src/components/Tooltip/constants.ts","../../../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["export const SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n \"top-start\": \"top\",\n \"top-end\": \"top\",\n \"bottom-start\": \"bottom\",\n \"bottom-end\": \"bottom\",\n \"left-start\": \"left\",\n \"left-end\": \"left\",\n \"right-start\": \"right\",\n \"right-end\": \"right\",\n auto: \"top\",\n};\n\nexport const ALIGN_MAP: Record<string, \"start\" | \"center\" | \"end\"> = {\n top: \"center\",\n bottom: \"center\",\n left: \"center\",\n right: \"center\",\n \"top-start\": \"start\",\n \"top-end\": \"end\",\n \"bottom-start\": \"start\",\n \"bottom-end\": \"end\",\n \"left-start\": \"start\",\n \"left-end\": \"end\",\n \"right-start\": \"start\",\n \"right-end\": \"end\",\n auto: \"center\",\n};\n","import React, { useEffect, useState, type ReactNode } from \"react\";\n\nimport {\n Tooltip as PrimitiveTooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"src/primitives/Tooltip\";\n\ntype TooltipPosition =\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left-start\"\n | \"left-end\"\n | \"right-start\"\n | \"right-end\"\n | \"auto\";\n\n/** Radix Tooltip.Content props we forward via ...otherProps. */\ntype TooltipContentProps = React.ComponentProps<typeof TooltipContent>;\n\nexport interface TooltipProps extends Omit<\n TooltipContentProps,\n \"children\" | \"className\" | \"side\" | \"align\" | \"content\"\n> {\n /** Content rendered inside the tooltip popup. */\n content?: ReactNode;\n /** The trigger element. */\n children?: ReactNode;\n /** Disable the tooltip. */\n disabled?: boolean;\n /** Placement of the tooltip relative to the trigger. */\n position?: TooltipPosition;\n /** Whether the tooltip stays open when hovered over. */\n interactive?: boolean;\n /** Auto-hide after N milliseconds. Use -1 to disable. */\n hideAfter?: number;\n /** Additional CSS class names for the tooltip content. */\n className?: string;\n /** Delay in ms before the tooltip opens (forwarded to TooltipProvider). */\n delayDuration?: number;\n /** Radix Tooltip `defaultOpen` prop. */\n defaultOpen?: boolean;\n}\n\nimport { SIDE_MAP, ALIGN_MAP } from \"./constants\";\n\nconst Tooltip = ({\n content,\n children,\n disabled = false,\n position = \"auto\",\n interactive = false,\n hideAfter = -1,\n className,\n delayDuration = 0,\n defaultOpen,\n // Radix TooltipContent props forwarded\n ...contentProps\n}: TooltipProps) => {\n const [open, setOpen] = useState(false);\n\n // Auto-hide after hideAfter ms\n useEffect(() => {\n if (!open || hideAfter <= 0) return;\n const timer = setTimeout(() => setOpen(false), hideAfter);\n return () => clearTimeout(timer);\n }, [open, hideAfter]);\n\n if (disabled || !content) {\n return <>{children}</>;\n }\n\n const side = SIDE_MAP[position] ?? \"top\";\n const align = ALIGN_MAP[position] ?? \"center\";\n\n // Wrap non-element children in a span so TooltipTrigger can attach\n const trigger = React.isValidElement(children) ? (\n children\n ) : (\n <span>{children}</span>\n );\n\n return (\n <TooltipProvider delayDuration={delayDuration}>\n <PrimitiveTooltip\n open={open}\n onOpenChange={setOpen}\n defaultOpen={defaultOpen}\n disableHoverableContent={!interactive}\n >\n <TooltipTrigger asChild>{trigger}</TooltipTrigger>\n <TooltipContent\n side={side}\n align={align}\n className={className}\n onPointerDownOutside={\n interactive ? e => e.preventDefault() : undefined\n }\n {...contentProps}\n >\n {content}\n </TooltipContent>\n </PrimitiveTooltip>\n </TooltipProvider>\n );\n};\n\nTooltip.displayName = \"Tooltip\";\n\nexport { Tooltip };\n"],"names":["useState","useEffect","_jsx","_Fragment","React","TooltipProvider","_jsxs","PrimitiveTooltip","TooltipTrigger","TooltipContent"],"mappings":"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"}
|
|
@@ -156,18 +156,11 @@ const MenuItemButton = React.forwardRef(({ children, isActive = false, isDisable
|
|
|
156
156
|
});
|
|
157
157
|
MenuItemButton.displayName = "Dropdown.MenuItem.Button";
|
|
158
158
|
|
|
159
|
-
const MenuItem = React.forwardRef(({ children,
|
|
160
|
-
// When used without className or extra props, skip the wrapper div
|
|
161
|
-
// so Radix's DropdownMenuItem sits directly inside the Group.
|
|
162
|
-
const hasWrapper = className || ref || Object.keys(otherProps).length > 0;
|
|
163
|
-
if (!hasWrapper)
|
|
164
|
-
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: children });
|
|
165
|
-
return (jsxRuntime.jsx("div", { ref: ref, className: className, role: "none", ...otherProps, children: children }));
|
|
166
|
-
});
|
|
159
|
+
const MenuItem = React.forwardRef(({ children, ...otherProps }, ref) => (jsxRuntime.jsx(primitives_DropdownMenu.DropdownMenuItem, { ref: ref, ...otherProps, children: children })));
|
|
167
160
|
MenuItem.displayName = "Dropdown.MenuItem";
|
|
168
161
|
MenuItem.Button = MenuItemButton;
|
|
169
162
|
|
|
170
|
-
const SubMenu = React.forwardRef(({ label, icon, children, className }, ref) => (jsxRuntime.jsxs(primitives_DropdownMenu.DropdownMenuSub, { children: [jsxRuntime.jsxs(primitives_DropdownMenu.DropdownMenuSubTrigger, { ref: ref, className: className, children: [icon && jsxRuntime.jsx("span", { className: "shrink-0", children: renderIcon.renderIcon(icon, "size-4") }), label && jsxRuntime.jsx("span", { children: label })] }), jsxRuntime.jsx(primitives_DropdownMenu.DropdownMenuSubContent, { children: children })] })));
|
|
163
|
+
const SubMenu = React.forwardRef(({ label, icon, children, className, triggerProps, contentProps }, ref) => (jsxRuntime.jsxs(primitives_DropdownMenu.DropdownMenuSub, { children: [jsxRuntime.jsxs(primitives_DropdownMenu.DropdownMenuSubTrigger, { ref: ref, className: className, ...triggerProps, children: [icon && jsxRuntime.jsx("span", { className: "shrink-0", children: renderIcon.renderIcon(icon, "size-4") }), label && jsxRuntime.jsx("span", { children: label })] }), jsxRuntime.jsx(primitives_DropdownMenu.DropdownMenuSubContent, { ...contentProps, children: children })] })));
|
|
171
164
|
SubMenu.displayName = "Dropdown.SubMenu";
|
|
172
165
|
|
|
173
166
|
const DropdownMenu = DropdownBase;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu.js","sources":["../../../../src/components/DropdownMenu/constants.ts","../../../../src/components/DropdownMenu/SplitTrigger.tsx","../../../../src/components/DropdownMenu/TriggerButton.tsx","../../../../src/components/DropdownMenu/types.ts","../../../../src/components/DropdownMenu/DropdownBase.tsx","../../../../src/components/DropdownMenu/Divider.tsx","../../../../src/components/DropdownMenu/Label.tsx","../../../../src/components/DropdownMenu/Menu.tsx","../../../../src/components/DropdownMenu/MenuItemButton.tsx","../../../../src/components/DropdownMenu/MenuItem.tsx","../../../../src/components/DropdownMenu/SubMenu.tsx","../../../../src/components/DropdownMenu/index.tsx"],"sourcesContent":["import type { ButtonSize, ButtonStyle } from \"./types\";\n\nexport const SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n \"top-start\": \"top\",\n \"top-end\": \"top\",\n \"bottom-start\": \"bottom\",\n \"bottom-end\": \"bottom\",\n \"left-start\": \"left\",\n \"left-end\": \"left\",\n \"right-start\": \"right\",\n \"right-end\": \"right\",\n auto: \"bottom\",\n};\n\nexport const ALIGN_MAP: Record<string, \"start\" | \"center\" | \"end\"> = {\n top: \"center\",\n bottom: \"center\",\n left: \"center\",\n right: \"center\",\n \"top-start\": \"start\",\n \"top-end\": \"end\",\n \"bottom-start\": \"start\",\n \"bottom-end\": \"end\",\n \"left-start\": \"start\",\n \"left-end\": \"end\",\n \"right-start\": \"start\",\n \"right-end\": \"end\",\n auto: \"end\",\n};\n\nexport const BUTTON_STYLE_MAP: Record<\n ButtonStyle,\n \"default\" | \"secondary\" | \"destructive\" | \"outline\" | \"ghost\" | \"link\"\n> = {\n primary: \"default\",\n secondary: \"secondary\",\n tertiary: \"outline\",\n text: \"ghost\",\n danger: \"destructive\",\n \"danger-text\": \"ghost\",\n link: \"link\",\n};\n\nexport const BUTTON_SIZE_MAP: Record<ButtonSize, \"sm\" | \"default\" | \"lg\"> = {\n small: \"sm\",\n medium: \"default\",\n large: \"lg\",\n};\n\nexport const MENU_ITEM_STYLE_MAP: Record<\n \"default\" | \"danger\",\n \"default\" | \"destructive\"\n> = {\n default: \"default\",\n danger: \"destructive\",\n};\n\nexport const CHEVRON_SIZE_MAP: Record<ButtonSize, string> = {\n small: \"size-3.5\",\n medium: \"size-4\",\n large: \"size-4\",\n};\n","import React, { forwardRef } from \"react\";\n\nimport { ChevronDown } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon } from \"src/lib/renderIcon\";\nimport { Button as PrimitiveButton } from \"src/primitives/Button\";\nimport { ButtonGroup } from \"src/primitives/ButtonGroup\";\nimport { DropdownMenuTrigger } from \"src/primitives/DropdownMenu\";\n\nimport {\n BUTTON_SIZE_MAP,\n BUTTON_STYLE_MAP,\n CHEVRON_SIZE_MAP,\n} from \"./constants\";\nimport type { BaseTriggerProps } from \"./types\";\n\ninterface SplitTriggerOwnProps extends BaseTriggerProps {\n /** Ref forwarded to the action button (left side). */\n actionButtonRef?: React.Ref<HTMLButtonElement>;\n}\n\n/**\n * Radix injects extra props (aria-expanded, data-state, …) via Slot on the\n * DropdownMenuTrigger child. We capture them with a rest-spread.\n */\ntype SplitTriggerProps = SplitTriggerOwnProps &\n Omit<React.ComponentProps<\"div\">, keyof SplitTriggerOwnProps>;\n\nconst SplitTrigger = forwardRef<HTMLDivElement, SplitTriggerProps>(\n (\n {\n label,\n icon,\n buttonStyle,\n buttonSize,\n buttonProps,\n disabled,\n isOpen,\n onClick,\n actionButtonRef,\n className,\n ...otherProps\n },\n ref\n ) => {\n const { t } = useTranslation();\n const variant = BUTTON_STYLE_MAP[buttonStyle];\n const size = BUTTON_SIZE_MAP[buttonSize];\n\n return (\n <ButtonGroup\n ref={ref}\n className={cn(\"neeto-ui-action-dropdown\", className)}\n {...otherProps}\n >\n {/* Action button — fires the primary onClick */}\n <PrimitiveButton\n ref={actionButtonRef}\n type=\"button\"\n variant={variant}\n size={size}\n disabled={disabled}\n onClick={onClick}\n data-testid=\"action-dropdown-btn\"\n {...buttonProps}\n >\n {icon && renderIcon(icon, \"size-4\")}\n {label && <span>{label}</span>}\n </PrimitiveButton>\n\n {/* Chevron trigger — opens the dropdown menu */}\n <DropdownMenuTrigger asChild disabled={disabled}>\n <PrimitiveButton\n type=\"button\"\n variant={variant}\n size={size}\n disabled={disabled}\n aria-label={t(\n \"neetoatoms.dropdownMenu.openMenu\",\n \"Open dropdown menu\"\n )}\n className=\"px-1.5\"\n >\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(\n CHEVRON_SIZE_MAP[buttonSize],\n \"shrink-0 transition-transform duration-200\",\n isOpen && \"rotate-180\"\n )}\n />\n </PrimitiveButton>\n </DropdownMenuTrigger>\n </ButtonGroup>\n );\n }\n);\nSplitTrigger.displayName = \"Dropdown.SplitTrigger\";\n\nexport { SplitTrigger };\n","import React, { forwardRef } from \"react\";\n\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon } from \"src/lib/renderIcon\";\nimport { Button as PrimitiveButton } from \"src/primitives/Button\";\n\nimport { BUTTON_SIZE_MAP, BUTTON_STYLE_MAP, CHEVRON_SIZE_MAP } from \"./constants\";\nimport type { BaseTriggerProps } from \"./types\";\n\n/**\n * Extra props that Radix's Slot injects when the parent Trigger uses\n * `asChild` (aria-expanded, aria-haspopup, data-state, id, …).\n * We capture them with a rest-spread so they reach the DOM button.\n */\ntype TriggerButtonProps = BaseTriggerProps &\n Omit<React.ComponentProps<\"button\">, keyof BaseTriggerProps>;\n\nconst TriggerButton = forwardRef<HTMLButtonElement, TriggerButtonProps>(\n (\n {\n label,\n icon,\n buttonStyle,\n buttonSize,\n buttonProps,\n disabled,\n isOpen,\n onClick,\n className,\n ...otherProps\n },\n ref\n ) => (\n <PrimitiveButton\n ref={ref}\n type=\"button\"\n variant={BUTTON_STYLE_MAP[buttonStyle]}\n size={BUTTON_SIZE_MAP[buttonSize]}\n disabled={disabled}\n className={cn(\n buttonStyle === \"danger-text\" &&\n \"text-destructive hover:text-destructive\",\n \"gap-1.5\",\n className\n )}\n onClick={onClick}\n {...otherProps}\n {...buttonProps}\n >\n <span className=\"inline-flex items-center gap-1.5\">\n {icon && renderIcon(icon, \"size-4\")}\n {label && <span>{label}</span>}\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(\n CHEVRON_SIZE_MAP[buttonSize],\n \"shrink-0 transition-transform duration-200\",\n isOpen && \"rotate-180\"\n )}\n />\n </span>\n </PrimitiveButton>\n )\n);\nTriggerButton.displayName = \"Dropdown.TriggerButton\";\n\nexport { TriggerButton };\n","import { createContext, type ReactNode, type Ref } from \"react\";\n\nimport { Button as PrimitiveButton } from \"src/primitives/Button\";\nimport {\n DropdownMenuContent,\n DropdownMenuItem as PrimitiveDropdownMenuItem,\n} from \"src/primitives/DropdownMenu\";\nimport type { IconProp } from \"src/lib/renderIcon\";\n\nexport type DropdownPosition =\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left-start\"\n | \"left-end\"\n | \"right-start\"\n | \"right-end\"\n | \"auto\";\n\nexport type ButtonStyle =\n | \"primary\"\n | \"secondary\"\n | \"tertiary\"\n | \"text\"\n | \"danger\"\n | \"danger-text\"\n | \"link\";\n\nexport type ButtonSize = \"small\" | \"medium\" | \"large\";\n\nexport type MenuItemButtonStyle = \"default\" | \"danger\";\n\nexport interface BaseTriggerProps {\n label?: string;\n icon?: IconProp;\n buttonStyle: ButtonStyle;\n buttonSize: ButtonSize;\n buttonProps?: Omit<\n React.ComponentProps<typeof PrimitiveButton>,\n \"variant\" | \"size\" | \"disabled\"\n >;\n disabled: boolean;\n isOpen: boolean;\n onClick?: (e: React.MouseEvent) => void;\n}\n\nexport interface DropdownProps {\n /** Text label displayed inside the trigger button. */\n label?: string;\n /** Icon rendered inside the trigger button. */\n icon?: IconProp;\n /** Visual style of the trigger button(s). */\n buttonStyle?: ButtonStyle;\n /** Size of the trigger button(s). */\n buttonSize?: ButtonSize;\n /** Extra props forwarded to the trigger button. In split-button mode, forwarded to the action button. */\n buttonProps?: Omit<\n React.ComponentProps<typeof PrimitiveButton>,\n \"variant\" | \"size\" | \"disabled\"\n >;\n /** Custom trigger element. Overrides the default button trigger. */\n customTarget?: ReactNode | ((props: { isOpen: boolean }) => ReactNode);\n /** Whether the dropdown is disabled. */\n disabled?: boolean;\n /** Dropdown menu content. */\n children?: ReactNode;\n /** Position of the dropdown menu relative to the trigger. */\n position?: DropdownPosition;\n /** Whether pressing Escape closes the dropdown. */\n closeOnEsc?: boolean;\n /** Whether selecting an item closes the dropdown. */\n closeOnSelect?: boolean;\n /** Whether clicking outside closes the dropdown. */\n closeOnOutsideClick?: boolean;\n /** Controlled open state. */\n isOpen?: boolean;\n /** Callback fired when the dropdown closes. */\n onClose?: () => void;\n /**\n * Callback fired when the trigger button is clicked.\n * When provided (without `customTarget`), renders a **split-button**:\n * a primary action button (fires `onClick`) paired with a separate\n * chevron that opens the dropdown menu.\n */\n onClick?: (e: React.MouseEvent) => void;\n /** Additional CSS class names for the trigger wrapper. */\n className?: string;\n /** Ref forwarded to the trigger button. In split-button mode, forwarded to the action button. */\n triggerRef?: Ref<HTMLButtonElement>;\n /** Extra props forwarded to the DropdownMenuContent. */\n dropdownProps?: Omit<\n React.ComponentProps<typeof DropdownMenuContent>,\n \"side\" | \"align\"\n >;\n}\n\nexport interface MenuItemButtonProps extends Omit<\n React.ComponentProps<typeof PrimitiveDropdownMenuItem>,\n \"prefix\" | \"style\" | \"onClick\"\n> {\n /** Highlight as active. */\n isActive?: boolean;\n /** Disable the menu item button. */\n isDisabled?: boolean;\n /** Visual style of the button. */\n style?: MenuItemButtonStyle;\n /** Content rendered before the label. */\n prefix?: ReactNode;\n /** Content rendered after the label. */\n suffix?: ReactNode;\n /** Internal route (renders as anchor). */\n to?: string;\n /** External link (renders as anchor). */\n href?: string;\n /** Callback fired when the item is selected. */\n onClick?: (e: Event) => void;\n /** Children / label text. */\n children?: ReactNode;\n /** Additional CSS class names. */\n className?: string;\n}\n\nexport const DropdownContext = createContext({ closeOnSelect: true });\n","import { useCallback, useState } from \"react\";\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from \"src/primitives/DropdownMenu\";\n\nimport { ALIGN_MAP, SIDE_MAP } from \"./constants\";\nimport { SplitTrigger } from \"./SplitTrigger\";\nimport { TriggerButton } from \"./TriggerButton\";\nimport { DropdownContext, type DropdownProps } from \"./types\";\n\nconst DropdownBase = ({\n label,\n icon,\n buttonStyle = \"primary\",\n buttonSize = \"medium\",\n buttonProps,\n customTarget,\n disabled = false,\n children,\n position = \"bottom-end\",\n closeOnEsc = true,\n closeOnSelect = true,\n closeOnOutsideClick = true,\n isOpen: isOpenProp,\n onClose,\n onClick,\n className,\n triggerRef,\n dropdownProps,\n}: DropdownProps) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = isOpenProp !== undefined;\n const open = isControlled ? isOpenProp : internalOpen;\n const handleOpenChange = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n if (!next) onClose?.();\n },\n [isControlled, onClose]\n );\n\n const side = SIDE_MAP[position] ?? \"bottom\";\n const align = ALIGN_MAP[position] ?? \"end\";\n\n // Split-button mode: onClick provided without a customTarget.\n const isSplit = !!onClick && !customTarget;\n\n const sharedTriggerProps = {\n label,\n icon,\n buttonStyle,\n buttonSize,\n buttonProps,\n disabled,\n isOpen: open,\n onClick,\n };\n\n const triggerNode = isSplit ? (\n <SplitTrigger\n {...sharedTriggerProps}\n actionButtonRef={triggerRef}\n className={className}\n />\n ) : (\n <DropdownMenuTrigger asChild disabled={disabled} className={className}>\n {customTarget ? (\n typeof customTarget === \"function\" ? (\n customTarget({ isOpen: open })\n ) : (\n customTarget\n )\n ) : (\n <TriggerButton ref={triggerRef} {...sharedTriggerProps} />\n )}\n </DropdownMenuTrigger>\n );\n\n return (\n <DropdownContext.Provider value={{ closeOnSelect }}>\n <DropdownMenu\n open={open}\n onOpenChange={handleOpenChange}\n modal={closeOnOutsideClick}\n >\n {triggerNode}\n <DropdownMenuContent\n side={side}\n align={align}\n onEscapeKeyDown={closeOnEsc ? undefined : e => e.preventDefault()}\n onInteractOutside={\n closeOnOutsideClick ? undefined : e => e.preventDefault()\n }\n {...dropdownProps}\n >\n {children}\n </DropdownMenuContent>\n </DropdownMenu>\n </DropdownContext.Provider>\n );\n};\n\nexport { DropdownBase };\n","import React, { forwardRef } from \"react\";\n\nimport { DropdownMenuSeparator } from \"src/primitives/DropdownMenu\";\n\nconst Divider = forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof DropdownMenuSeparator>\n>((props, ref) => <DropdownMenuSeparator ref={ref} {...props} />);\nDivider.displayName = \"Dropdown.Divider\";\n\nexport { Divider };\n","import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { DropdownMenuLabel } from \"src/primitives/DropdownMenu\";\n\ninterface MenuLabelProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n}\n\nconst Label = forwardRef<HTMLDivElement, MenuLabelProps>(\n ({ children, className, ...otherProps }, ref) => (\n <DropdownMenuLabel ref={ref} className={className} {...otherProps}>\n {children}\n </DropdownMenuLabel>\n )\n);\nLabel.displayName = \"Dropdown.Label\";\n\nexport { Label };\n","import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { DropdownMenuGroup } from \"src/primitives/DropdownMenu\";\n\ninterface MenuProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n}\n\nconst Menu = forwardRef<HTMLDivElement, MenuProps>(\n ({ children, className, ...otherProps }, ref) => (\n <DropdownMenuGroup\n ref={ref}\n className={cn(\"flex flex-col\", className)}\n {...otherProps}\n >\n {children}\n </DropdownMenuGroup>\n )\n);\nMenu.displayName = \"Dropdown.Menu\";\n\nexport { Menu };\n","import { forwardRef, useCallback, useMemo, useContext } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { DropdownMenuItem as PrimitiveDropdownMenuItem } from \"src/primitives/DropdownMenu\";\n\nimport { MENU_ITEM_STYLE_MAP } from \"./constants\";\nimport { DropdownContext, type MenuItemButtonProps } from \"./types\";\n\nconst MenuItemButton = forwardRef<HTMLDivElement, MenuItemButtonProps>(\n (\n {\n children,\n isActive = false,\n isDisabled = false,\n style = \"default\",\n prefix,\n suffix,\n to,\n href,\n className,\n onClick,\n variant: _variant,\n disabled: _disabled,\n asChild: _asChild,\n onSelect: _onSelect,\n ...otherProps\n },\n ref\n ) => {\n const { closeOnSelect } = useContext(DropdownContext);\n const variant = MENU_ITEM_STYLE_MAP[style];\n const linkHref = to ?? href;\n\n const handleSelect = useCallback(\n (e: Event) => {\n if (!closeOnSelect) e.preventDefault();\n onClick?.(e);\n },\n [closeOnSelect, onClick]\n );\n\n const itemContent = useMemo(\n () => (\n <>\n {prefix && (\n <span data-slot=\"menu-item-prefix\" className=\"shrink-0\">\n {prefix}\n </span>\n )}\n <span className=\"flex-1 truncate\">{children}</span>\n {suffix && (\n <span\n data-slot=\"menu-item-suffix\"\n className=\"ms-auto shrink-0 text-muted-foreground\"\n >\n {suffix}\n </span>\n )}\n </>\n ),\n [prefix, children, suffix]\n );\n\n return (\n <PrimitiveDropdownMenuItem\n ref={ref}\n variant={variant}\n disabled={isDisabled}\n data-active={isActive || undefined}\n className={cn(\n isActive && \"bg-accent text-accent-foreground\",\n className\n )}\n asChild={!!linkHref}\n onSelect={handleSelect}\n {...otherProps}\n >\n {linkHref ? <a href={linkHref}>{itemContent}</a> : itemContent}\n </PrimitiveDropdownMenuItem>\n );\n }\n);\nMenuItemButton.displayName = \"Dropdown.MenuItem.Button\";\n\nexport { MenuItemButton };\n","import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { MenuItemButton } from \"./MenuItemButton\";\n\ninterface MenuItemProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n}\n\nconst MenuItem = forwardRef<HTMLDivElement, MenuItemProps>(\n ({ children, className, ...otherProps }, ref) => {\n // When used without className or extra props, skip the wrapper div\n // so Radix's DropdownMenuItem sits directly inside the Group.\n const hasWrapper = className || ref || Object.keys(otherProps).length > 0;\n\n if (!hasWrapper) return <>{children}</>;\n\n return (\n <div ref={ref} className={className} role=\"none\" {...otherProps}>\n {children}\n </div>\n );\n }\n) as React.ForwardRefExoticComponent<\n MenuItemProps & React.RefAttributes<HTMLDivElement>\n> & {\n Button: typeof MenuItemButton;\n};\nMenuItem.displayName = \"Dropdown.MenuItem\";\nMenuItem.Button = MenuItemButton;\n\nexport { MenuItem };\n","import { forwardRef, type ReactNode } from \"react\";\n\nimport { renderIcon, type IconProp } from \"src/lib/renderIcon\";\nimport {\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from \"src/primitives/DropdownMenu\";\n\ninterface SubMenuProps {\n label?: string;\n icon?: IconProp;\n children?: ReactNode;\n className?: string;\n}\n\nconst SubMenu = forwardRef<HTMLDivElement, SubMenuProps>(\n ({ label, icon, children, className }, ref) => (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger ref={ref} className={className}>\n {icon && <span className=\"shrink-0\">{renderIcon(icon, \"size-4\")}</span>}\n {label && <span>{label}</span>}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>{children}</DropdownMenuSubContent>\n </DropdownMenuSub>\n )\n);\nSubMenu.displayName = \"Dropdown.SubMenu\";\n\nexport { SubMenu };\n","import { DropdownBase } from \"./DropdownBase\";\nimport { Divider } from \"./Divider\";\nimport { Label } from \"./Label\";\nimport { Menu } from \"./Menu\";\nimport { MenuItem } from \"./MenuItem\";\nimport { SubMenu } from \"./SubMenu\";\n\nexport type { DropdownProps, DropdownPosition } from \"./types\";\n\ntype DropdownComponent = typeof DropdownBase & {\n displayName?: string;\n Menu: typeof Menu;\n MenuItem: typeof MenuItem;\n Divider: typeof Divider;\n Label: typeof Label;\n SubMenu: typeof SubMenu;\n};\n\nconst DropdownMenu = DropdownBase as DropdownComponent;\nDropdownMenu.displayName = \"DropdownMenu\";\nDropdownMenu.Menu = Menu;\nDropdownMenu.MenuItem = MenuItem;\nDropdownMenu.Divider = Divider;\nDropdownMenu.Label = Label;\nDropdownMenu.SubMenu = SubMenu;\n\nexport { DropdownMenu };\n"],"names":["forwardRef","useTranslation","_jsxs","ButtonGroup","cn","PrimitiveButton","renderIcon","_jsx","DropdownMenuTrigger","ChevronDown","createContext","useState","useCallback","DropdownMenu","DropdownMenuContent","DropdownMenuSeparator","DropdownMenuLabel","DropdownMenuGroup","useContext","useMemo","_Fragment","PrimitiveDropdownMenuItem","DropdownMenuSub","DropdownMenuSubTrigger","DropdownMenuSubContent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DropdownMenu.js","sources":["../../../../src/components/DropdownMenu/constants.ts","../../../../src/components/DropdownMenu/SplitTrigger.tsx","../../../../src/components/DropdownMenu/TriggerButton.tsx","../../../../src/components/DropdownMenu/types.ts","../../../../src/components/DropdownMenu/DropdownBase.tsx","../../../../src/components/DropdownMenu/Divider.tsx","../../../../src/components/DropdownMenu/Label.tsx","../../../../src/components/DropdownMenu/Menu.tsx","../../../../src/components/DropdownMenu/MenuItemButton.tsx","../../../../src/components/DropdownMenu/MenuItem.tsx","../../../../src/components/DropdownMenu/SubMenu.tsx","../../../../src/components/DropdownMenu/index.tsx"],"sourcesContent":["import type { ButtonSize, ButtonStyle } from \"./types\";\n\nexport const SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n \"top-start\": \"top\",\n \"top-end\": \"top\",\n \"bottom-start\": \"bottom\",\n \"bottom-end\": \"bottom\",\n \"left-start\": \"left\",\n \"left-end\": \"left\",\n \"right-start\": \"right\",\n \"right-end\": \"right\",\n auto: \"bottom\",\n};\n\nexport const ALIGN_MAP: Record<string, \"start\" | \"center\" | \"end\"> = {\n top: \"center\",\n bottom: \"center\",\n left: \"center\",\n right: \"center\",\n \"top-start\": \"start\",\n \"top-end\": \"end\",\n \"bottom-start\": \"start\",\n \"bottom-end\": \"end\",\n \"left-start\": \"start\",\n \"left-end\": \"end\",\n \"right-start\": \"start\",\n \"right-end\": \"end\",\n auto: \"end\",\n};\n\nexport const BUTTON_STYLE_MAP: Record<\n ButtonStyle,\n \"default\" | \"secondary\" | \"destructive\" | \"outline\" | \"ghost\" | \"link\"\n> = {\n primary: \"default\",\n secondary: \"secondary\",\n tertiary: \"outline\",\n text: \"ghost\",\n danger: \"destructive\",\n \"danger-text\": \"ghost\",\n link: \"link\",\n};\n\nexport const BUTTON_SIZE_MAP: Record<ButtonSize, \"sm\" | \"default\" | \"lg\"> = {\n small: \"sm\",\n medium: \"default\",\n large: \"lg\",\n};\n\nexport const MENU_ITEM_STYLE_MAP: Record<\n \"default\" | \"danger\",\n \"default\" | \"destructive\"\n> = {\n default: \"default\",\n danger: \"destructive\",\n};\n\nexport const CHEVRON_SIZE_MAP: Record<ButtonSize, string> = {\n small: \"size-3.5\",\n medium: \"size-4\",\n large: \"size-4\",\n};\n","import React, { forwardRef } from \"react\";\n\nimport { ChevronDown } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon } from \"src/lib/renderIcon\";\nimport { Button as PrimitiveButton } from \"src/primitives/Button\";\nimport { ButtonGroup } from \"src/primitives/ButtonGroup\";\nimport { DropdownMenuTrigger } from \"src/primitives/DropdownMenu\";\n\nimport {\n BUTTON_SIZE_MAP,\n BUTTON_STYLE_MAP,\n CHEVRON_SIZE_MAP,\n} from \"./constants\";\nimport type { BaseTriggerProps } from \"./types\";\n\ninterface SplitTriggerOwnProps extends BaseTriggerProps {\n /** Ref forwarded to the action button (left side). */\n actionButtonRef?: React.Ref<HTMLButtonElement>;\n}\n\n/**\n * Radix injects extra props (aria-expanded, data-state, …) via Slot on the\n * DropdownMenuTrigger child. We capture them with a rest-spread.\n */\ntype SplitTriggerProps = SplitTriggerOwnProps &\n Omit<React.ComponentProps<\"div\">, keyof SplitTriggerOwnProps>;\n\nconst SplitTrigger = forwardRef<HTMLDivElement, SplitTriggerProps>(\n (\n {\n label,\n icon,\n buttonStyle,\n buttonSize,\n buttonProps,\n disabled,\n isOpen,\n onClick,\n actionButtonRef,\n className,\n ...otherProps\n },\n ref\n ) => {\n const { t } = useTranslation();\n const variant = BUTTON_STYLE_MAP[buttonStyle];\n const size = BUTTON_SIZE_MAP[buttonSize];\n\n return (\n <ButtonGroup\n ref={ref}\n className={cn(\"neeto-ui-action-dropdown\", className)}\n {...otherProps}\n >\n {/* Action button — fires the primary onClick */}\n <PrimitiveButton\n ref={actionButtonRef}\n type=\"button\"\n variant={variant}\n size={size}\n disabled={disabled}\n onClick={onClick}\n data-testid=\"action-dropdown-btn\"\n {...buttonProps}\n >\n {icon && renderIcon(icon, \"size-4\")}\n {label && <span>{label}</span>}\n </PrimitiveButton>\n\n {/* Chevron trigger — opens the dropdown menu */}\n <DropdownMenuTrigger asChild disabled={disabled}>\n <PrimitiveButton\n type=\"button\"\n variant={variant}\n size={size}\n disabled={disabled}\n aria-label={t(\n \"neetoatoms.dropdownMenu.openMenu\",\n \"Open dropdown menu\"\n )}\n className=\"px-1.5\"\n >\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(\n CHEVRON_SIZE_MAP[buttonSize],\n \"shrink-0 transition-transform duration-200\",\n isOpen && \"rotate-180\"\n )}\n />\n </PrimitiveButton>\n </DropdownMenuTrigger>\n </ButtonGroup>\n );\n }\n);\nSplitTrigger.displayName = \"Dropdown.SplitTrigger\";\n\nexport { SplitTrigger };\n","import React, { forwardRef } from \"react\";\n\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon } from \"src/lib/renderIcon\";\nimport { Button as PrimitiveButton } from \"src/primitives/Button\";\n\nimport { BUTTON_SIZE_MAP, BUTTON_STYLE_MAP, CHEVRON_SIZE_MAP } from \"./constants\";\nimport type { BaseTriggerProps } from \"./types\";\n\n/**\n * Extra props that Radix's Slot injects when the parent Trigger uses\n * `asChild` (aria-expanded, aria-haspopup, data-state, id, …).\n * We capture them with a rest-spread so they reach the DOM button.\n */\ntype TriggerButtonProps = BaseTriggerProps &\n Omit<React.ComponentProps<\"button\">, keyof BaseTriggerProps>;\n\nconst TriggerButton = forwardRef<HTMLButtonElement, TriggerButtonProps>(\n (\n {\n label,\n icon,\n buttonStyle,\n buttonSize,\n buttonProps,\n disabled,\n isOpen,\n onClick,\n className,\n ...otherProps\n },\n ref\n ) => (\n <PrimitiveButton\n ref={ref}\n type=\"button\"\n variant={BUTTON_STYLE_MAP[buttonStyle]}\n size={BUTTON_SIZE_MAP[buttonSize]}\n disabled={disabled}\n className={cn(\n buttonStyle === \"danger-text\" &&\n \"text-destructive hover:text-destructive\",\n \"gap-1.5\",\n className\n )}\n onClick={onClick}\n {...otherProps}\n {...buttonProps}\n >\n <span className=\"inline-flex items-center gap-1.5\">\n {icon && renderIcon(icon, \"size-4\")}\n {label && <span>{label}</span>}\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(\n CHEVRON_SIZE_MAP[buttonSize],\n \"shrink-0 transition-transform duration-200\",\n isOpen && \"rotate-180\"\n )}\n />\n </span>\n </PrimitiveButton>\n )\n);\nTriggerButton.displayName = \"Dropdown.TriggerButton\";\n\nexport { TriggerButton };\n","import { createContext, type ReactNode, type Ref } from \"react\";\n\nimport { Button as PrimitiveButton } from \"src/primitives/Button\";\nimport {\n DropdownMenuContent,\n DropdownMenuItem as PrimitiveDropdownMenuItem,\n} from \"src/primitives/DropdownMenu\";\nimport type { IconProp } from \"src/lib/renderIcon\";\n\nexport type DropdownPosition =\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left-start\"\n | \"left-end\"\n | \"right-start\"\n | \"right-end\"\n | \"auto\";\n\nexport type ButtonStyle =\n | \"primary\"\n | \"secondary\"\n | \"tertiary\"\n | \"text\"\n | \"danger\"\n | \"danger-text\"\n | \"link\";\n\nexport type ButtonSize = \"small\" | \"medium\" | \"large\";\n\nexport type MenuItemButtonStyle = \"default\" | \"danger\";\n\nexport interface BaseTriggerProps {\n label?: string;\n icon?: IconProp;\n buttonStyle: ButtonStyle;\n buttonSize: ButtonSize;\n buttonProps?: Omit<\n React.ComponentProps<typeof PrimitiveButton>,\n \"variant\" | \"size\" | \"disabled\"\n >;\n disabled: boolean;\n isOpen: boolean;\n onClick?: (e: React.MouseEvent) => void;\n}\n\nexport interface DropdownProps {\n /** Text label displayed inside the trigger button. */\n label?: string;\n /** Icon rendered inside the trigger button. */\n icon?: IconProp;\n /** Visual style of the trigger button(s). */\n buttonStyle?: ButtonStyle;\n /** Size of the trigger button(s). */\n buttonSize?: ButtonSize;\n /** Extra props forwarded to the trigger button. In split-button mode, forwarded to the action button. */\n buttonProps?: Omit<\n React.ComponentProps<typeof PrimitiveButton>,\n \"variant\" | \"size\" | \"disabled\"\n >;\n /** Custom trigger element. Overrides the default button trigger. */\n customTarget?: ReactNode | ((props: { isOpen: boolean }) => ReactNode);\n /** Whether the dropdown is disabled. */\n disabled?: boolean;\n /** Dropdown menu content. */\n children?: ReactNode;\n /** Position of the dropdown menu relative to the trigger. */\n position?: DropdownPosition;\n /** Whether pressing Escape closes the dropdown. */\n closeOnEsc?: boolean;\n /** Whether selecting an item closes the dropdown. */\n closeOnSelect?: boolean;\n /** Whether clicking outside closes the dropdown. */\n closeOnOutsideClick?: boolean;\n /** Controlled open state. */\n isOpen?: boolean;\n /** Callback fired when the dropdown closes. */\n onClose?: () => void;\n /**\n * Callback fired when the trigger button is clicked.\n * When provided (without `customTarget`), renders a **split-button**:\n * a primary action button (fires `onClick`) paired with a separate\n * chevron that opens the dropdown menu.\n */\n onClick?: (e: React.MouseEvent) => void;\n /** Additional CSS class names for the trigger wrapper. */\n className?: string;\n /** Ref forwarded to the trigger button. In split-button mode, forwarded to the action button. */\n triggerRef?: Ref<HTMLButtonElement>;\n /** Extra props forwarded to the DropdownMenuContent. */\n dropdownProps?: Omit<\n React.ComponentProps<typeof DropdownMenuContent>,\n \"side\" | \"align\"\n >;\n}\n\nexport interface MenuItemButtonProps extends Omit<\n React.ComponentProps<typeof PrimitiveDropdownMenuItem>,\n \"prefix\" | \"style\" | \"onClick\"\n> {\n /** Highlight as active. */\n isActive?: boolean;\n /** Disable the menu item button. */\n isDisabled?: boolean;\n /** Visual style of the button. */\n style?: MenuItemButtonStyle;\n /** Content rendered before the label. */\n prefix?: ReactNode;\n /** Content rendered after the label. */\n suffix?: ReactNode;\n /** Internal route (renders as anchor). */\n to?: string;\n /** External link (renders as anchor). */\n href?: string;\n /** Callback fired when the item is selected. */\n onClick?: (e: Event) => void;\n /** Children / label text. */\n children?: ReactNode;\n /** Additional CSS class names. */\n className?: string;\n}\n\nexport const DropdownContext = createContext({ closeOnSelect: true });\n","import { useCallback, useState } from \"react\";\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from \"src/primitives/DropdownMenu\";\n\nimport { ALIGN_MAP, SIDE_MAP } from \"./constants\";\nimport { SplitTrigger } from \"./SplitTrigger\";\nimport { TriggerButton } from \"./TriggerButton\";\nimport { DropdownContext, type DropdownProps } from \"./types\";\n\nconst DropdownBase = ({\n label,\n icon,\n buttonStyle = \"primary\",\n buttonSize = \"medium\",\n buttonProps,\n customTarget,\n disabled = false,\n children,\n position = \"bottom-end\",\n closeOnEsc = true,\n closeOnSelect = true,\n closeOnOutsideClick = true,\n isOpen: isOpenProp,\n onClose,\n onClick,\n className,\n triggerRef,\n dropdownProps,\n}: DropdownProps) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = isOpenProp !== undefined;\n const open = isControlled ? isOpenProp : internalOpen;\n const handleOpenChange = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n if (!next) onClose?.();\n },\n [isControlled, onClose]\n );\n\n const side = SIDE_MAP[position] ?? \"bottom\";\n const align = ALIGN_MAP[position] ?? \"end\";\n\n // Split-button mode: onClick provided without a customTarget.\n const isSplit = !!onClick && !customTarget;\n\n const sharedTriggerProps = {\n label,\n icon,\n buttonStyle,\n buttonSize,\n buttonProps,\n disabled,\n isOpen: open,\n onClick,\n };\n\n const triggerNode = isSplit ? (\n <SplitTrigger\n {...sharedTriggerProps}\n actionButtonRef={triggerRef}\n className={className}\n />\n ) : (\n <DropdownMenuTrigger asChild disabled={disabled} className={className}>\n {customTarget ? (\n typeof customTarget === \"function\" ? (\n customTarget({ isOpen: open })\n ) : (\n customTarget\n )\n ) : (\n <TriggerButton ref={triggerRef} {...sharedTriggerProps} />\n )}\n </DropdownMenuTrigger>\n );\n\n return (\n <DropdownContext.Provider value={{ closeOnSelect }}>\n <DropdownMenu\n open={open}\n onOpenChange={handleOpenChange}\n modal={closeOnOutsideClick}\n >\n {triggerNode}\n <DropdownMenuContent\n side={side}\n align={align}\n onEscapeKeyDown={closeOnEsc ? undefined : e => e.preventDefault()}\n onInteractOutside={\n closeOnOutsideClick ? undefined : e => e.preventDefault()\n }\n {...dropdownProps}\n >\n {children}\n </DropdownMenuContent>\n </DropdownMenu>\n </DropdownContext.Provider>\n );\n};\n\nexport { DropdownBase };\n","import React, { forwardRef } from \"react\";\n\nimport { DropdownMenuSeparator } from \"src/primitives/DropdownMenu\";\n\nconst Divider = forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof DropdownMenuSeparator>\n>((props, ref) => <DropdownMenuSeparator ref={ref} {...props} />);\nDivider.displayName = \"Dropdown.Divider\";\n\nexport { Divider };\n","import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { DropdownMenuLabel } from \"src/primitives/DropdownMenu\";\n\ninterface MenuLabelProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n}\n\nconst Label = forwardRef<HTMLDivElement, MenuLabelProps>(\n ({ children, className, ...otherProps }, ref) => (\n <DropdownMenuLabel ref={ref} className={className} {...otherProps}>\n {children}\n </DropdownMenuLabel>\n )\n);\nLabel.displayName = \"Dropdown.Label\";\n\nexport { Label };\n","import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { DropdownMenuGroup } from \"src/primitives/DropdownMenu\";\n\ninterface MenuProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n}\n\nconst Menu = forwardRef<HTMLDivElement, MenuProps>(\n ({ children, className, ...otherProps }, ref) => (\n <DropdownMenuGroup\n ref={ref}\n className={cn(\"flex flex-col\", className)}\n {...otherProps}\n >\n {children}\n </DropdownMenuGroup>\n )\n);\nMenu.displayName = \"Dropdown.Menu\";\n\nexport { Menu };\n","import { forwardRef, useCallback, useMemo, useContext } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { DropdownMenuItem as PrimitiveDropdownMenuItem } from \"src/primitives/DropdownMenu\";\n\nimport { MENU_ITEM_STYLE_MAP } from \"./constants\";\nimport { DropdownContext, type MenuItemButtonProps } from \"./types\";\n\nconst MenuItemButton = forwardRef<HTMLDivElement, MenuItemButtonProps>(\n (\n {\n children,\n isActive = false,\n isDisabled = false,\n style = \"default\",\n prefix,\n suffix,\n to,\n href,\n className,\n onClick,\n variant: _variant,\n disabled: _disabled,\n asChild: _asChild,\n onSelect: _onSelect,\n ...otherProps\n },\n ref\n ) => {\n const { closeOnSelect } = useContext(DropdownContext);\n const variant = MENU_ITEM_STYLE_MAP[style];\n const linkHref = to ?? href;\n\n const handleSelect = useCallback(\n (e: Event) => {\n if (!closeOnSelect) e.preventDefault();\n onClick?.(e);\n },\n [closeOnSelect, onClick]\n );\n\n const itemContent = useMemo(\n () => (\n <>\n {prefix && (\n <span data-slot=\"menu-item-prefix\" className=\"shrink-0\">\n {prefix}\n </span>\n )}\n <span className=\"flex-1 truncate\">{children}</span>\n {suffix && (\n <span\n data-slot=\"menu-item-suffix\"\n className=\"ms-auto shrink-0 text-muted-foreground\"\n >\n {suffix}\n </span>\n )}\n </>\n ),\n [prefix, children, suffix]\n );\n\n return (\n <PrimitiveDropdownMenuItem\n ref={ref}\n variant={variant}\n disabled={isDisabled}\n data-active={isActive || undefined}\n className={cn(\n isActive && \"bg-accent text-accent-foreground\",\n className\n )}\n asChild={!!linkHref}\n onSelect={handleSelect}\n {...otherProps}\n >\n {linkHref ? <a href={linkHref}>{itemContent}</a> : itemContent}\n </PrimitiveDropdownMenuItem>\n );\n }\n);\nMenuItemButton.displayName = \"Dropdown.MenuItem.Button\";\n\nexport { MenuItemButton };\n","import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { DropdownMenuItem as PrimitiveDropdownMenuItem } from \"src/primitives/DropdownMenu\";\n\nimport { MenuItemButton } from \"./MenuItemButton\";\n\ninterface MenuItemProps extends React.ComponentProps<\n typeof PrimitiveDropdownMenuItem\n> {\n children?: ReactNode;\n className?: string;\n}\n\nconst MenuItem = forwardRef<HTMLDivElement, MenuItemProps>(\n ({ children, ...otherProps }, ref) => (\n <PrimitiveDropdownMenuItem ref={ref} {...otherProps}>\n {children}\n </PrimitiveDropdownMenuItem>\n )\n) as React.ForwardRefExoticComponent<\n MenuItemProps & React.RefAttributes<HTMLDivElement>\n> & {\n Button: typeof MenuItemButton;\n};\nMenuItem.displayName = \"Dropdown.MenuItem\";\nMenuItem.Button = MenuItemButton;\n\nexport { MenuItem };\n","import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { renderIcon, type IconProp } from \"src/lib/renderIcon\";\nimport {\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from \"src/primitives/DropdownMenu\";\n\ninterface SubMenuProps {\n label?: string;\n icon?: IconProp;\n children?: ReactNode;\n className?: string;\n triggerProps?: Omit<\n React.ComponentProps<typeof DropdownMenuSubTrigger>,\n \"ref\" | \"className\" | \"children\"\n >;\n contentProps?: Omit<\n React.ComponentProps<typeof DropdownMenuSubContent>,\n \"children\"\n >;\n}\n\nconst SubMenu = forwardRef<HTMLDivElement, SubMenuProps>(\n ({ label, icon, children, className, triggerProps, contentProps }, ref) => (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger ref={ref} className={className} {...triggerProps}>\n {icon && <span className=\"shrink-0\">{renderIcon(icon, \"size-4\")}</span>}\n {label && <span>{label}</span>}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent {...contentProps}>\n {children}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )\n);\nSubMenu.displayName = \"Dropdown.SubMenu\";\n\nexport { SubMenu };\n","import { DropdownBase } from \"./DropdownBase\";\nimport { Divider } from \"./Divider\";\nimport { Label } from \"./Label\";\nimport { Menu } from \"./Menu\";\nimport { MenuItem } from \"./MenuItem\";\nimport { SubMenu } from \"./SubMenu\";\n\nexport type { DropdownProps, DropdownPosition } from \"./types\";\n\ntype DropdownComponent = typeof DropdownBase & {\n displayName?: string;\n Menu: typeof Menu;\n MenuItem: typeof MenuItem;\n Divider: typeof Divider;\n Label: typeof Label;\n SubMenu: typeof SubMenu;\n};\n\nconst DropdownMenu = DropdownBase as DropdownComponent;\nDropdownMenu.displayName = \"DropdownMenu\";\nDropdownMenu.Menu = Menu;\nDropdownMenu.MenuItem = MenuItem;\nDropdownMenu.Divider = Divider;\nDropdownMenu.Label = Label;\nDropdownMenu.SubMenu = SubMenu;\n\nexport { DropdownMenu };\n"],"names":["forwardRef","useTranslation","_jsxs","ButtonGroup","cn","PrimitiveButton","renderIcon","_jsx","DropdownMenuTrigger","ChevronDown","createContext","useState","useCallback","DropdownMenu","DropdownMenuContent","DropdownMenuSeparator","DropdownMenuLabel","DropdownMenuGroup","useContext","useMemo","_Fragment","PrimitiveDropdownMenuItem","DropdownMenuSub","DropdownMenuSubTrigger","DropdownMenuSubContent"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var Label = require('../Label-
|
|
3
|
+
var Label = require('../Label-B8SlyX1E.js');
|
|
4
4
|
require('react/jsx-runtime');
|
|
5
5
|
require('react');
|
|
6
6
|
require('../utils-CTr7wn5d.js');
|
|
@@ -25,7 +25,7 @@ require('../index-Df-Ffa3s.js');
|
|
|
25
25
|
require('../index-DcCSSgb7.js');
|
|
26
26
|
require('../index-CyrAgb4H.js');
|
|
27
27
|
require('../index-CB9xFokC.js');
|
|
28
|
-
require('../Popover-
|
|
28
|
+
require('../Popover-B1d4URJl.js');
|
|
29
29
|
require('../index-BZhTddX0.js');
|
|
30
30
|
require('../primitives/HoverCard.js');
|
|
31
31
|
require('../Button-Bt_AElge.js');
|
|
@@ -15,10 +15,10 @@ var components_DropdownMenu = require('./DropdownMenu.js');
|
|
|
15
15
|
var Empty = require('../Empty-qzle6YvT.js');
|
|
16
16
|
var Input = require('../Input-pkugjUb0.js');
|
|
17
17
|
var Kbd = require('../Kbd-DHirsI--.js');
|
|
18
|
-
var Label = require('../Label-
|
|
18
|
+
var Label = require('../Label-B8SlyX1E.js');
|
|
19
19
|
var MultiEmailInput = require('../MultiEmailInput-l0_YVjbp.js');
|
|
20
20
|
var Pagination = require('../Pagination-Byzt9Kmj.js');
|
|
21
|
-
var Popover = require('../Popover-
|
|
21
|
+
var Popover = require('../Popover-B1d4URJl.js');
|
|
22
22
|
var Progress = require('../Progress-DoCxZ_ZH.js');
|
|
23
23
|
var RadioGroup = require('../RadioGroup-1RAoe38m.js');
|
|
24
24
|
var Select = require('../Select-Br1AT_wm.js');
|
|
@@ -32,7 +32,7 @@ var Textarea = require('../Textarea-BfdlAJ59.js');
|
|
|
32
32
|
var TimePicker = require('../TimePicker-Ba2FdT1O.js');
|
|
33
33
|
var TimePickerPanel = require('../TimePickerPanel-DGNr97cj.js');
|
|
34
34
|
var Toastr = require('../Toastr-BGp7-kmf.js');
|
|
35
|
-
var Tooltip = require('../Tooltip-
|
|
35
|
+
var Tooltip = require('../Tooltip-criVUtIg.js');
|
|
36
36
|
var TranslationProvider = require('../TranslationProvider-DBZHXmzX.js');
|
|
37
37
|
var Tree = require('../Tree-BPd0DuLh.js');
|
|
38
38
|
var search = require('../search-CfYUGi4v.js');
|
package/dist/cjs/index.js
CHANGED
|
@@ -22,13 +22,13 @@ var components_DropdownMenu = require('./components/DropdownMenu.js');
|
|
|
22
22
|
var Empty = require('./Empty-qzle6YvT.js');
|
|
23
23
|
var Input = require('./Input-pkugjUb0.js');
|
|
24
24
|
var Kbd = require('./Kbd-DHirsI--.js');
|
|
25
|
-
var Label = require('./Label-
|
|
25
|
+
var Label = require('./Label-B8SlyX1E.js');
|
|
26
26
|
var Pagination = require('./Pagination-Byzt9Kmj.js');
|
|
27
27
|
var RadioGroup = require('./RadioGroup-1RAoe38m.js');
|
|
28
28
|
var Select = require('./Select-Br1AT_wm.js');
|
|
29
29
|
var MultiEmailInput = require('./MultiEmailInput-l0_YVjbp.js');
|
|
30
30
|
var Sheet = require('./Sheet-CIhtNCBV.js');
|
|
31
|
-
var Popover = require('./Popover-
|
|
31
|
+
var Popover = require('./Popover-B1d4URJl.js');
|
|
32
32
|
var Progress = require('./Progress-DoCxZ_ZH.js');
|
|
33
33
|
var Slider = require('./Slider-jNUS9vt8.js');
|
|
34
34
|
var Spinner = require('./Spinner-DQutDMQq.js');
|
|
@@ -37,7 +37,7 @@ var Toastr = require('./Toastr-BGp7-kmf.js');
|
|
|
37
37
|
var Switch = require('./Switch-CFf8DtB_.js');
|
|
38
38
|
var Tabs = require('./Tabs-D2247rd7.js');
|
|
39
39
|
var Textarea = require('./Textarea-BfdlAJ59.js');
|
|
40
|
-
var Tooltip = require('./Tooltip-
|
|
40
|
+
var Tooltip = require('./Tooltip-criVUtIg.js');
|
|
41
41
|
var Typography = require('./Typography-CxDOxAG_.js');
|
|
42
42
|
var DataTable = require('./DataTable-CWs96k8n.js');
|
|
43
43
|
var Tree = require('./Tree-BPd0DuLh.js');
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, { type ReactNode } from "react";
|
|
2
|
+
import { DropdownMenuItem as PrimitiveDropdownMenuItem } from "src/primitives/DropdownMenu";
|
|
2
3
|
import { MenuItemButton } from "./MenuItemButton";
|
|
3
|
-
interface MenuItemProps extends React.ComponentProps<
|
|
4
|
+
interface MenuItemProps extends React.ComponentProps<typeof PrimitiveDropdownMenuItem> {
|
|
4
5
|
children?: ReactNode;
|
|
5
6
|
className?: string;
|
|
6
7
|
}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import { type ReactNode } from "react";
|
|
1
|
+
import React, { type ReactNode } from "react";
|
|
2
2
|
import { type IconProp } from "src/lib/renderIcon";
|
|
3
|
+
import { DropdownMenuSubContent, DropdownMenuSubTrigger } from "src/primitives/DropdownMenu";
|
|
3
4
|
interface SubMenuProps {
|
|
4
5
|
label?: string;
|
|
5
6
|
icon?: IconProp;
|
|
6
7
|
children?: ReactNode;
|
|
7
8
|
className?: string;
|
|
9
|
+
triggerProps?: Omit<React.ComponentProps<typeof DropdownMenuSubTrigger>, "ref" | "className" | "children">;
|
|
10
|
+
contentProps?: Omit<React.ComponentProps<typeof DropdownMenuSubContent>, "children">;
|
|
8
11
|
}
|
|
9
|
-
declare const SubMenu:
|
|
12
|
+
declare const SubMenu: React.ForwardRefExoticComponent<SubMenuProps & React.RefAttributes<HTMLDivElement>>;
|
|
10
13
|
export { SubMenu };
|
|
@@ -154,18 +154,11 @@ const MenuItemButton = forwardRef(({ children, isActive = false, isDisabled = fa
|
|
|
154
154
|
});
|
|
155
155
|
MenuItemButton.displayName = "Dropdown.MenuItem.Button";
|
|
156
156
|
|
|
157
|
-
const MenuItem = forwardRef(({ children,
|
|
158
|
-
// When used without className or extra props, skip the wrapper div
|
|
159
|
-
// so Radix's DropdownMenuItem sits directly inside the Group.
|
|
160
|
-
const hasWrapper = className || ref || Object.keys(otherProps).length > 0;
|
|
161
|
-
if (!hasWrapper)
|
|
162
|
-
return jsx(Fragment, { children: children });
|
|
163
|
-
return (jsx("div", { ref: ref, className: className, role: "none", ...otherProps, children: children }));
|
|
164
|
-
});
|
|
157
|
+
const MenuItem = forwardRef(({ children, ...otherProps }, ref) => (jsx(DropdownMenuItem, { ref: ref, ...otherProps, children: children })));
|
|
165
158
|
MenuItem.displayName = "Dropdown.MenuItem";
|
|
166
159
|
MenuItem.Button = MenuItemButton;
|
|
167
160
|
|
|
168
|
-
const SubMenu = forwardRef(({ label, icon, children, className }, ref) => (jsxs(DropdownMenuSub, { children: [jsxs(DropdownMenuSubTrigger, { ref: ref, className: className, children: [icon && jsx("span", { className: "shrink-0", children: renderIcon(icon, "size-4") }), label && jsx("span", { children: label })] }), jsx(DropdownMenuSubContent, { children: children })] })));
|
|
161
|
+
const SubMenu = forwardRef(({ label, icon, children, className, triggerProps, contentProps }, ref) => (jsxs(DropdownMenuSub, { children: [jsxs(DropdownMenuSubTrigger, { ref: ref, className: className, ...triggerProps, children: [icon && jsx("span", { className: "shrink-0", children: renderIcon(icon, "size-4") }), label && jsx("span", { children: label })] }), jsx(DropdownMenuSubContent, { ...contentProps, children: children })] })));
|
|
169
162
|
SubMenu.displayName = "Dropdown.SubMenu";
|
|
170
163
|
|
|
171
164
|
const DropdownMenu = DropdownBase;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu.js","sources":["../../src/components/DropdownMenu/constants.ts","../../src/components/DropdownMenu/SplitTrigger.tsx","../../src/components/DropdownMenu/TriggerButton.tsx","../../src/components/DropdownMenu/types.ts","../../src/components/DropdownMenu/DropdownBase.tsx","../../src/components/DropdownMenu/Divider.tsx","../../src/components/DropdownMenu/Label.tsx","../../src/components/DropdownMenu/Menu.tsx","../../src/components/DropdownMenu/MenuItemButton.tsx","../../src/components/DropdownMenu/MenuItem.tsx","../../src/components/DropdownMenu/SubMenu.tsx","../../src/components/DropdownMenu/index.tsx"],"sourcesContent":["import type { ButtonSize, ButtonStyle } from \"./types\";\n\nexport const SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n \"top-start\": \"top\",\n \"top-end\": \"top\",\n \"bottom-start\": \"bottom\",\n \"bottom-end\": \"bottom\",\n \"left-start\": \"left\",\n \"left-end\": \"left\",\n \"right-start\": \"right\",\n \"right-end\": \"right\",\n auto: \"bottom\",\n};\n\nexport const ALIGN_MAP: Record<string, \"start\" | \"center\" | \"end\"> = {\n top: \"center\",\n bottom: \"center\",\n left: \"center\",\n right: \"center\",\n \"top-start\": \"start\",\n \"top-end\": \"end\",\n \"bottom-start\": \"start\",\n \"bottom-end\": \"end\",\n \"left-start\": \"start\",\n \"left-end\": \"end\",\n \"right-start\": \"start\",\n \"right-end\": \"end\",\n auto: \"end\",\n};\n\nexport const BUTTON_STYLE_MAP: Record<\n ButtonStyle,\n \"default\" | \"secondary\" | \"destructive\" | \"outline\" | \"ghost\" | \"link\"\n> = {\n primary: \"default\",\n secondary: \"secondary\",\n tertiary: \"outline\",\n text: \"ghost\",\n danger: \"destructive\",\n \"danger-text\": \"ghost\",\n link: \"link\",\n};\n\nexport const BUTTON_SIZE_MAP: Record<ButtonSize, \"sm\" | \"default\" | \"lg\"> = {\n small: \"sm\",\n medium: \"default\",\n large: \"lg\",\n};\n\nexport const MENU_ITEM_STYLE_MAP: Record<\n \"default\" | \"danger\",\n \"default\" | \"destructive\"\n> = {\n default: \"default\",\n danger: \"destructive\",\n};\n\nexport const CHEVRON_SIZE_MAP: Record<ButtonSize, string> = {\n small: \"size-3.5\",\n medium: \"size-4\",\n large: \"size-4\",\n};\n","import React, { forwardRef } from \"react\";\n\nimport { ChevronDown } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon } from \"src/lib/renderIcon\";\nimport { Button as PrimitiveButton } from \"src/primitives/Button\";\nimport { ButtonGroup } from \"src/primitives/ButtonGroup\";\nimport { DropdownMenuTrigger } from \"src/primitives/DropdownMenu\";\n\nimport {\n BUTTON_SIZE_MAP,\n BUTTON_STYLE_MAP,\n CHEVRON_SIZE_MAP,\n} from \"./constants\";\nimport type { BaseTriggerProps } from \"./types\";\n\ninterface SplitTriggerOwnProps extends BaseTriggerProps {\n /** Ref forwarded to the action button (left side). */\n actionButtonRef?: React.Ref<HTMLButtonElement>;\n}\n\n/**\n * Radix injects extra props (aria-expanded, data-state, …) via Slot on the\n * DropdownMenuTrigger child. We capture them with a rest-spread.\n */\ntype SplitTriggerProps = SplitTriggerOwnProps &\n Omit<React.ComponentProps<\"div\">, keyof SplitTriggerOwnProps>;\n\nconst SplitTrigger = forwardRef<HTMLDivElement, SplitTriggerProps>(\n (\n {\n label,\n icon,\n buttonStyle,\n buttonSize,\n buttonProps,\n disabled,\n isOpen,\n onClick,\n actionButtonRef,\n className,\n ...otherProps\n },\n ref\n ) => {\n const { t } = useTranslation();\n const variant = BUTTON_STYLE_MAP[buttonStyle];\n const size = BUTTON_SIZE_MAP[buttonSize];\n\n return (\n <ButtonGroup\n ref={ref}\n className={cn(\"neeto-ui-action-dropdown\", className)}\n {...otherProps}\n >\n {/* Action button — fires the primary onClick */}\n <PrimitiveButton\n ref={actionButtonRef}\n type=\"button\"\n variant={variant}\n size={size}\n disabled={disabled}\n onClick={onClick}\n data-testid=\"action-dropdown-btn\"\n {...buttonProps}\n >\n {icon && renderIcon(icon, \"size-4\")}\n {label && <span>{label}</span>}\n </PrimitiveButton>\n\n {/* Chevron trigger — opens the dropdown menu */}\n <DropdownMenuTrigger asChild disabled={disabled}>\n <PrimitiveButton\n type=\"button\"\n variant={variant}\n size={size}\n disabled={disabled}\n aria-label={t(\n \"neetoatoms.dropdownMenu.openMenu\",\n \"Open dropdown menu\"\n )}\n className=\"px-1.5\"\n >\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(\n CHEVRON_SIZE_MAP[buttonSize],\n \"shrink-0 transition-transform duration-200\",\n isOpen && \"rotate-180\"\n )}\n />\n </PrimitiveButton>\n </DropdownMenuTrigger>\n </ButtonGroup>\n );\n }\n);\nSplitTrigger.displayName = \"Dropdown.SplitTrigger\";\n\nexport { SplitTrigger };\n","import React, { forwardRef } from \"react\";\n\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon } from \"src/lib/renderIcon\";\nimport { Button as PrimitiveButton } from \"src/primitives/Button\";\n\nimport { BUTTON_SIZE_MAP, BUTTON_STYLE_MAP, CHEVRON_SIZE_MAP } from \"./constants\";\nimport type { BaseTriggerProps } from \"./types\";\n\n/**\n * Extra props that Radix's Slot injects when the parent Trigger uses\n * `asChild` (aria-expanded, aria-haspopup, data-state, id, …).\n * We capture them with a rest-spread so they reach the DOM button.\n */\ntype TriggerButtonProps = BaseTriggerProps &\n Omit<React.ComponentProps<\"button\">, keyof BaseTriggerProps>;\n\nconst TriggerButton = forwardRef<HTMLButtonElement, TriggerButtonProps>(\n (\n {\n label,\n icon,\n buttonStyle,\n buttonSize,\n buttonProps,\n disabled,\n isOpen,\n onClick,\n className,\n ...otherProps\n },\n ref\n ) => (\n <PrimitiveButton\n ref={ref}\n type=\"button\"\n variant={BUTTON_STYLE_MAP[buttonStyle]}\n size={BUTTON_SIZE_MAP[buttonSize]}\n disabled={disabled}\n className={cn(\n buttonStyle === \"danger-text\" &&\n \"text-destructive hover:text-destructive\",\n \"gap-1.5\",\n className\n )}\n onClick={onClick}\n {...otherProps}\n {...buttonProps}\n >\n <span className=\"inline-flex items-center gap-1.5\">\n {icon && renderIcon(icon, \"size-4\")}\n {label && <span>{label}</span>}\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(\n CHEVRON_SIZE_MAP[buttonSize],\n \"shrink-0 transition-transform duration-200\",\n isOpen && \"rotate-180\"\n )}\n />\n </span>\n </PrimitiveButton>\n )\n);\nTriggerButton.displayName = \"Dropdown.TriggerButton\";\n\nexport { TriggerButton };\n","import { createContext, type ReactNode, type Ref } from \"react\";\n\nimport { Button as PrimitiveButton } from \"src/primitives/Button\";\nimport {\n DropdownMenuContent,\n DropdownMenuItem as PrimitiveDropdownMenuItem,\n} from \"src/primitives/DropdownMenu\";\nimport type { IconProp } from \"src/lib/renderIcon\";\n\nexport type DropdownPosition =\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left-start\"\n | \"left-end\"\n | \"right-start\"\n | \"right-end\"\n | \"auto\";\n\nexport type ButtonStyle =\n | \"primary\"\n | \"secondary\"\n | \"tertiary\"\n | \"text\"\n | \"danger\"\n | \"danger-text\"\n | \"link\";\n\nexport type ButtonSize = \"small\" | \"medium\" | \"large\";\n\nexport type MenuItemButtonStyle = \"default\" | \"danger\";\n\nexport interface BaseTriggerProps {\n label?: string;\n icon?: IconProp;\n buttonStyle: ButtonStyle;\n buttonSize: ButtonSize;\n buttonProps?: Omit<\n React.ComponentProps<typeof PrimitiveButton>,\n \"variant\" | \"size\" | \"disabled\"\n >;\n disabled: boolean;\n isOpen: boolean;\n onClick?: (e: React.MouseEvent) => void;\n}\n\nexport interface DropdownProps {\n /** Text label displayed inside the trigger button. */\n label?: string;\n /** Icon rendered inside the trigger button. */\n icon?: IconProp;\n /** Visual style of the trigger button(s). */\n buttonStyle?: ButtonStyle;\n /** Size of the trigger button(s). */\n buttonSize?: ButtonSize;\n /** Extra props forwarded to the trigger button. In split-button mode, forwarded to the action button. */\n buttonProps?: Omit<\n React.ComponentProps<typeof PrimitiveButton>,\n \"variant\" | \"size\" | \"disabled\"\n >;\n /** Custom trigger element. Overrides the default button trigger. */\n customTarget?: ReactNode | ((props: { isOpen: boolean }) => ReactNode);\n /** Whether the dropdown is disabled. */\n disabled?: boolean;\n /** Dropdown menu content. */\n children?: ReactNode;\n /** Position of the dropdown menu relative to the trigger. */\n position?: DropdownPosition;\n /** Whether pressing Escape closes the dropdown. */\n closeOnEsc?: boolean;\n /** Whether selecting an item closes the dropdown. */\n closeOnSelect?: boolean;\n /** Whether clicking outside closes the dropdown. */\n closeOnOutsideClick?: boolean;\n /** Controlled open state. */\n isOpen?: boolean;\n /** Callback fired when the dropdown closes. */\n onClose?: () => void;\n /**\n * Callback fired when the trigger button is clicked.\n * When provided (without `customTarget`), renders a **split-button**:\n * a primary action button (fires `onClick`) paired with a separate\n * chevron that opens the dropdown menu.\n */\n onClick?: (e: React.MouseEvent) => void;\n /** Additional CSS class names for the trigger wrapper. */\n className?: string;\n /** Ref forwarded to the trigger button. In split-button mode, forwarded to the action button. */\n triggerRef?: Ref<HTMLButtonElement>;\n /** Extra props forwarded to the DropdownMenuContent. */\n dropdownProps?: Omit<\n React.ComponentProps<typeof DropdownMenuContent>,\n \"side\" | \"align\"\n >;\n}\n\nexport interface MenuItemButtonProps extends Omit<\n React.ComponentProps<typeof PrimitiveDropdownMenuItem>,\n \"prefix\" | \"style\" | \"onClick\"\n> {\n /** Highlight as active. */\n isActive?: boolean;\n /** Disable the menu item button. */\n isDisabled?: boolean;\n /** Visual style of the button. */\n style?: MenuItemButtonStyle;\n /** Content rendered before the label. */\n prefix?: ReactNode;\n /** Content rendered after the label. */\n suffix?: ReactNode;\n /** Internal route (renders as anchor). */\n to?: string;\n /** External link (renders as anchor). */\n href?: string;\n /** Callback fired when the item is selected. */\n onClick?: (e: Event) => void;\n /** Children / label text. */\n children?: ReactNode;\n /** Additional CSS class names. */\n className?: string;\n}\n\nexport const DropdownContext = createContext({ closeOnSelect: true });\n","import { useCallback, useState } from \"react\";\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from \"src/primitives/DropdownMenu\";\n\nimport { ALIGN_MAP, SIDE_MAP } from \"./constants\";\nimport { SplitTrigger } from \"./SplitTrigger\";\nimport { TriggerButton } from \"./TriggerButton\";\nimport { DropdownContext, type DropdownProps } from \"./types\";\n\nconst DropdownBase = ({\n label,\n icon,\n buttonStyle = \"primary\",\n buttonSize = \"medium\",\n buttonProps,\n customTarget,\n disabled = false,\n children,\n position = \"bottom-end\",\n closeOnEsc = true,\n closeOnSelect = true,\n closeOnOutsideClick = true,\n isOpen: isOpenProp,\n onClose,\n onClick,\n className,\n triggerRef,\n dropdownProps,\n}: DropdownProps) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = isOpenProp !== undefined;\n const open = isControlled ? isOpenProp : internalOpen;\n const handleOpenChange = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n if (!next) onClose?.();\n },\n [isControlled, onClose]\n );\n\n const side = SIDE_MAP[position] ?? \"bottom\";\n const align = ALIGN_MAP[position] ?? \"end\";\n\n // Split-button mode: onClick provided without a customTarget.\n const isSplit = !!onClick && !customTarget;\n\n const sharedTriggerProps = {\n label,\n icon,\n buttonStyle,\n buttonSize,\n buttonProps,\n disabled,\n isOpen: open,\n onClick,\n };\n\n const triggerNode = isSplit ? (\n <SplitTrigger\n {...sharedTriggerProps}\n actionButtonRef={triggerRef}\n className={className}\n />\n ) : (\n <DropdownMenuTrigger asChild disabled={disabled} className={className}>\n {customTarget ? (\n typeof customTarget === \"function\" ? (\n customTarget({ isOpen: open })\n ) : (\n customTarget\n )\n ) : (\n <TriggerButton ref={triggerRef} {...sharedTriggerProps} />\n )}\n </DropdownMenuTrigger>\n );\n\n return (\n <DropdownContext.Provider value={{ closeOnSelect }}>\n <DropdownMenu\n open={open}\n onOpenChange={handleOpenChange}\n modal={closeOnOutsideClick}\n >\n {triggerNode}\n <DropdownMenuContent\n side={side}\n align={align}\n onEscapeKeyDown={closeOnEsc ? undefined : e => e.preventDefault()}\n onInteractOutside={\n closeOnOutsideClick ? undefined : e => e.preventDefault()\n }\n {...dropdownProps}\n >\n {children}\n </DropdownMenuContent>\n </DropdownMenu>\n </DropdownContext.Provider>\n );\n};\n\nexport { DropdownBase };\n","import React, { forwardRef } from \"react\";\n\nimport { DropdownMenuSeparator } from \"src/primitives/DropdownMenu\";\n\nconst Divider = forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof DropdownMenuSeparator>\n>((props, ref) => <DropdownMenuSeparator ref={ref} {...props} />);\nDivider.displayName = \"Dropdown.Divider\";\n\nexport { Divider };\n","import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { DropdownMenuLabel } from \"src/primitives/DropdownMenu\";\n\ninterface MenuLabelProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n}\n\nconst Label = forwardRef<HTMLDivElement, MenuLabelProps>(\n ({ children, className, ...otherProps }, ref) => (\n <DropdownMenuLabel ref={ref} className={className} {...otherProps}>\n {children}\n </DropdownMenuLabel>\n )\n);\nLabel.displayName = \"Dropdown.Label\";\n\nexport { Label };\n","import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { DropdownMenuGroup } from \"src/primitives/DropdownMenu\";\n\ninterface MenuProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n}\n\nconst Menu = forwardRef<HTMLDivElement, MenuProps>(\n ({ children, className, ...otherProps }, ref) => (\n <DropdownMenuGroup\n ref={ref}\n className={cn(\"flex flex-col\", className)}\n {...otherProps}\n >\n {children}\n </DropdownMenuGroup>\n )\n);\nMenu.displayName = \"Dropdown.Menu\";\n\nexport { Menu };\n","import { forwardRef, useCallback, useMemo, useContext } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { DropdownMenuItem as PrimitiveDropdownMenuItem } from \"src/primitives/DropdownMenu\";\n\nimport { MENU_ITEM_STYLE_MAP } from \"./constants\";\nimport { DropdownContext, type MenuItemButtonProps } from \"./types\";\n\nconst MenuItemButton = forwardRef<HTMLDivElement, MenuItemButtonProps>(\n (\n {\n children,\n isActive = false,\n isDisabled = false,\n style = \"default\",\n prefix,\n suffix,\n to,\n href,\n className,\n onClick,\n variant: _variant,\n disabled: _disabled,\n asChild: _asChild,\n onSelect: _onSelect,\n ...otherProps\n },\n ref\n ) => {\n const { closeOnSelect } = useContext(DropdownContext);\n const variant = MENU_ITEM_STYLE_MAP[style];\n const linkHref = to ?? href;\n\n const handleSelect = useCallback(\n (e: Event) => {\n if (!closeOnSelect) e.preventDefault();\n onClick?.(e);\n },\n [closeOnSelect, onClick]\n );\n\n const itemContent = useMemo(\n () => (\n <>\n {prefix && (\n <span data-slot=\"menu-item-prefix\" className=\"shrink-0\">\n {prefix}\n </span>\n )}\n <span className=\"flex-1 truncate\">{children}</span>\n {suffix && (\n <span\n data-slot=\"menu-item-suffix\"\n className=\"ms-auto shrink-0 text-muted-foreground\"\n >\n {suffix}\n </span>\n )}\n </>\n ),\n [prefix, children, suffix]\n );\n\n return (\n <PrimitiveDropdownMenuItem\n ref={ref}\n variant={variant}\n disabled={isDisabled}\n data-active={isActive || undefined}\n className={cn(\n isActive && \"bg-accent text-accent-foreground\",\n className\n )}\n asChild={!!linkHref}\n onSelect={handleSelect}\n {...otherProps}\n >\n {linkHref ? <a href={linkHref}>{itemContent}</a> : itemContent}\n </PrimitiveDropdownMenuItem>\n );\n }\n);\nMenuItemButton.displayName = \"Dropdown.MenuItem.Button\";\n\nexport { MenuItemButton };\n","import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { MenuItemButton } from \"./MenuItemButton\";\n\ninterface MenuItemProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n}\n\nconst MenuItem = forwardRef<HTMLDivElement, MenuItemProps>(\n ({ children, className, ...otherProps }, ref) => {\n // When used without className or extra props, skip the wrapper div\n // so Radix's DropdownMenuItem sits directly inside the Group.\n const hasWrapper = className || ref || Object.keys(otherProps).length > 0;\n\n if (!hasWrapper) return <>{children}</>;\n\n return (\n <div ref={ref} className={className} role=\"none\" {...otherProps}>\n {children}\n </div>\n );\n }\n) as React.ForwardRefExoticComponent<\n MenuItemProps & React.RefAttributes<HTMLDivElement>\n> & {\n Button: typeof MenuItemButton;\n};\nMenuItem.displayName = \"Dropdown.MenuItem\";\nMenuItem.Button = MenuItemButton;\n\nexport { MenuItem };\n","import { forwardRef, type ReactNode } from \"react\";\n\nimport { renderIcon, type IconProp } from \"src/lib/renderIcon\";\nimport {\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from \"src/primitives/DropdownMenu\";\n\ninterface SubMenuProps {\n label?: string;\n icon?: IconProp;\n children?: ReactNode;\n className?: string;\n}\n\nconst SubMenu = forwardRef<HTMLDivElement, SubMenuProps>(\n ({ label, icon, children, className }, ref) => (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger ref={ref} className={className}>\n {icon && <span className=\"shrink-0\">{renderIcon(icon, \"size-4\")}</span>}\n {label && <span>{label}</span>}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>{children}</DropdownMenuSubContent>\n </DropdownMenuSub>\n )\n);\nSubMenu.displayName = \"Dropdown.SubMenu\";\n\nexport { SubMenu };\n","import { DropdownBase } from \"./DropdownBase\";\nimport { Divider } from \"./Divider\";\nimport { Label } from \"./Label\";\nimport { Menu } from \"./Menu\";\nimport { MenuItem } from \"./MenuItem\";\nimport { SubMenu } from \"./SubMenu\";\n\nexport type { DropdownProps, DropdownPosition } from \"./types\";\n\ntype DropdownComponent = typeof DropdownBase & {\n displayName?: string;\n Menu: typeof Menu;\n MenuItem: typeof MenuItem;\n Divider: typeof Divider;\n Label: typeof Label;\n SubMenu: typeof SubMenu;\n};\n\nconst DropdownMenu = DropdownBase as DropdownComponent;\nDropdownMenu.displayName = \"DropdownMenu\";\nDropdownMenu.Menu = Menu;\nDropdownMenu.MenuItem = MenuItem;\nDropdownMenu.Divider = Divider;\nDropdownMenu.Label = Label;\nDropdownMenu.SubMenu = SubMenu;\n\nexport { DropdownMenu };\n"],"names":["_jsxs","PrimitiveButton","_jsx","DropdownMenu","_Fragment","PrimitiveDropdownMenuItem"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DropdownMenu.js","sources":["../../src/components/DropdownMenu/constants.ts","../../src/components/DropdownMenu/SplitTrigger.tsx","../../src/components/DropdownMenu/TriggerButton.tsx","../../src/components/DropdownMenu/types.ts","../../src/components/DropdownMenu/DropdownBase.tsx","../../src/components/DropdownMenu/Divider.tsx","../../src/components/DropdownMenu/Label.tsx","../../src/components/DropdownMenu/Menu.tsx","../../src/components/DropdownMenu/MenuItemButton.tsx","../../src/components/DropdownMenu/MenuItem.tsx","../../src/components/DropdownMenu/SubMenu.tsx","../../src/components/DropdownMenu/index.tsx"],"sourcesContent":["import type { ButtonSize, ButtonStyle } from \"./types\";\n\nexport const SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n \"top-start\": \"top\",\n \"top-end\": \"top\",\n \"bottom-start\": \"bottom\",\n \"bottom-end\": \"bottom\",\n \"left-start\": \"left\",\n \"left-end\": \"left\",\n \"right-start\": \"right\",\n \"right-end\": \"right\",\n auto: \"bottom\",\n};\n\nexport const ALIGN_MAP: Record<string, \"start\" | \"center\" | \"end\"> = {\n top: \"center\",\n bottom: \"center\",\n left: \"center\",\n right: \"center\",\n \"top-start\": \"start\",\n \"top-end\": \"end\",\n \"bottom-start\": \"start\",\n \"bottom-end\": \"end\",\n \"left-start\": \"start\",\n \"left-end\": \"end\",\n \"right-start\": \"start\",\n \"right-end\": \"end\",\n auto: \"end\",\n};\n\nexport const BUTTON_STYLE_MAP: Record<\n ButtonStyle,\n \"default\" | \"secondary\" | \"destructive\" | \"outline\" | \"ghost\" | \"link\"\n> = {\n primary: \"default\",\n secondary: \"secondary\",\n tertiary: \"outline\",\n text: \"ghost\",\n danger: \"destructive\",\n \"danger-text\": \"ghost\",\n link: \"link\",\n};\n\nexport const BUTTON_SIZE_MAP: Record<ButtonSize, \"sm\" | \"default\" | \"lg\"> = {\n small: \"sm\",\n medium: \"default\",\n large: \"lg\",\n};\n\nexport const MENU_ITEM_STYLE_MAP: Record<\n \"default\" | \"danger\",\n \"default\" | \"destructive\"\n> = {\n default: \"default\",\n danger: \"destructive\",\n};\n\nexport const CHEVRON_SIZE_MAP: Record<ButtonSize, string> = {\n small: \"size-3.5\",\n medium: \"size-4\",\n large: \"size-4\",\n};\n","import React, { forwardRef } from \"react\";\n\nimport { ChevronDown } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon } from \"src/lib/renderIcon\";\nimport { Button as PrimitiveButton } from \"src/primitives/Button\";\nimport { ButtonGroup } from \"src/primitives/ButtonGroup\";\nimport { DropdownMenuTrigger } from \"src/primitives/DropdownMenu\";\n\nimport {\n BUTTON_SIZE_MAP,\n BUTTON_STYLE_MAP,\n CHEVRON_SIZE_MAP,\n} from \"./constants\";\nimport type { BaseTriggerProps } from \"./types\";\n\ninterface SplitTriggerOwnProps extends BaseTriggerProps {\n /** Ref forwarded to the action button (left side). */\n actionButtonRef?: React.Ref<HTMLButtonElement>;\n}\n\n/**\n * Radix injects extra props (aria-expanded, data-state, …) via Slot on the\n * DropdownMenuTrigger child. We capture them with a rest-spread.\n */\ntype SplitTriggerProps = SplitTriggerOwnProps &\n Omit<React.ComponentProps<\"div\">, keyof SplitTriggerOwnProps>;\n\nconst SplitTrigger = forwardRef<HTMLDivElement, SplitTriggerProps>(\n (\n {\n label,\n icon,\n buttonStyle,\n buttonSize,\n buttonProps,\n disabled,\n isOpen,\n onClick,\n actionButtonRef,\n className,\n ...otherProps\n },\n ref\n ) => {\n const { t } = useTranslation();\n const variant = BUTTON_STYLE_MAP[buttonStyle];\n const size = BUTTON_SIZE_MAP[buttonSize];\n\n return (\n <ButtonGroup\n ref={ref}\n className={cn(\"neeto-ui-action-dropdown\", className)}\n {...otherProps}\n >\n {/* Action button — fires the primary onClick */}\n <PrimitiveButton\n ref={actionButtonRef}\n type=\"button\"\n variant={variant}\n size={size}\n disabled={disabled}\n onClick={onClick}\n data-testid=\"action-dropdown-btn\"\n {...buttonProps}\n >\n {icon && renderIcon(icon, \"size-4\")}\n {label && <span>{label}</span>}\n </PrimitiveButton>\n\n {/* Chevron trigger — opens the dropdown menu */}\n <DropdownMenuTrigger asChild disabled={disabled}>\n <PrimitiveButton\n type=\"button\"\n variant={variant}\n size={size}\n disabled={disabled}\n aria-label={t(\n \"neetoatoms.dropdownMenu.openMenu\",\n \"Open dropdown menu\"\n )}\n className=\"px-1.5\"\n >\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(\n CHEVRON_SIZE_MAP[buttonSize],\n \"shrink-0 transition-transform duration-200\",\n isOpen && \"rotate-180\"\n )}\n />\n </PrimitiveButton>\n </DropdownMenuTrigger>\n </ButtonGroup>\n );\n }\n);\nSplitTrigger.displayName = \"Dropdown.SplitTrigger\";\n\nexport { SplitTrigger };\n","import React, { forwardRef } from \"react\";\n\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon } from \"src/lib/renderIcon\";\nimport { Button as PrimitiveButton } from \"src/primitives/Button\";\n\nimport { BUTTON_SIZE_MAP, BUTTON_STYLE_MAP, CHEVRON_SIZE_MAP } from \"./constants\";\nimport type { BaseTriggerProps } from \"./types\";\n\n/**\n * Extra props that Radix's Slot injects when the parent Trigger uses\n * `asChild` (aria-expanded, aria-haspopup, data-state, id, …).\n * We capture them with a rest-spread so they reach the DOM button.\n */\ntype TriggerButtonProps = BaseTriggerProps &\n Omit<React.ComponentProps<\"button\">, keyof BaseTriggerProps>;\n\nconst TriggerButton = forwardRef<HTMLButtonElement, TriggerButtonProps>(\n (\n {\n label,\n icon,\n buttonStyle,\n buttonSize,\n buttonProps,\n disabled,\n isOpen,\n onClick,\n className,\n ...otherProps\n },\n ref\n ) => (\n <PrimitiveButton\n ref={ref}\n type=\"button\"\n variant={BUTTON_STYLE_MAP[buttonStyle]}\n size={BUTTON_SIZE_MAP[buttonSize]}\n disabled={disabled}\n className={cn(\n buttonStyle === \"danger-text\" &&\n \"text-destructive hover:text-destructive\",\n \"gap-1.5\",\n className\n )}\n onClick={onClick}\n {...otherProps}\n {...buttonProps}\n >\n <span className=\"inline-flex items-center gap-1.5\">\n {icon && renderIcon(icon, \"size-4\")}\n {label && <span>{label}</span>}\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(\n CHEVRON_SIZE_MAP[buttonSize],\n \"shrink-0 transition-transform duration-200\",\n isOpen && \"rotate-180\"\n )}\n />\n </span>\n </PrimitiveButton>\n )\n);\nTriggerButton.displayName = \"Dropdown.TriggerButton\";\n\nexport { TriggerButton };\n","import { createContext, type ReactNode, type Ref } from \"react\";\n\nimport { Button as PrimitiveButton } from \"src/primitives/Button\";\nimport {\n DropdownMenuContent,\n DropdownMenuItem as PrimitiveDropdownMenuItem,\n} from \"src/primitives/DropdownMenu\";\nimport type { IconProp } from \"src/lib/renderIcon\";\n\nexport type DropdownPosition =\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left-start\"\n | \"left-end\"\n | \"right-start\"\n | \"right-end\"\n | \"auto\";\n\nexport type ButtonStyle =\n | \"primary\"\n | \"secondary\"\n | \"tertiary\"\n | \"text\"\n | \"danger\"\n | \"danger-text\"\n | \"link\";\n\nexport type ButtonSize = \"small\" | \"medium\" | \"large\";\n\nexport type MenuItemButtonStyle = \"default\" | \"danger\";\n\nexport interface BaseTriggerProps {\n label?: string;\n icon?: IconProp;\n buttonStyle: ButtonStyle;\n buttonSize: ButtonSize;\n buttonProps?: Omit<\n React.ComponentProps<typeof PrimitiveButton>,\n \"variant\" | \"size\" | \"disabled\"\n >;\n disabled: boolean;\n isOpen: boolean;\n onClick?: (e: React.MouseEvent) => void;\n}\n\nexport interface DropdownProps {\n /** Text label displayed inside the trigger button. */\n label?: string;\n /** Icon rendered inside the trigger button. */\n icon?: IconProp;\n /** Visual style of the trigger button(s). */\n buttonStyle?: ButtonStyle;\n /** Size of the trigger button(s). */\n buttonSize?: ButtonSize;\n /** Extra props forwarded to the trigger button. In split-button mode, forwarded to the action button. */\n buttonProps?: Omit<\n React.ComponentProps<typeof PrimitiveButton>,\n \"variant\" | \"size\" | \"disabled\"\n >;\n /** Custom trigger element. Overrides the default button trigger. */\n customTarget?: ReactNode | ((props: { isOpen: boolean }) => ReactNode);\n /** Whether the dropdown is disabled. */\n disabled?: boolean;\n /** Dropdown menu content. */\n children?: ReactNode;\n /** Position of the dropdown menu relative to the trigger. */\n position?: DropdownPosition;\n /** Whether pressing Escape closes the dropdown. */\n closeOnEsc?: boolean;\n /** Whether selecting an item closes the dropdown. */\n closeOnSelect?: boolean;\n /** Whether clicking outside closes the dropdown. */\n closeOnOutsideClick?: boolean;\n /** Controlled open state. */\n isOpen?: boolean;\n /** Callback fired when the dropdown closes. */\n onClose?: () => void;\n /**\n * Callback fired when the trigger button is clicked.\n * When provided (without `customTarget`), renders a **split-button**:\n * a primary action button (fires `onClick`) paired with a separate\n * chevron that opens the dropdown menu.\n */\n onClick?: (e: React.MouseEvent) => void;\n /** Additional CSS class names for the trigger wrapper. */\n className?: string;\n /** Ref forwarded to the trigger button. In split-button mode, forwarded to the action button. */\n triggerRef?: Ref<HTMLButtonElement>;\n /** Extra props forwarded to the DropdownMenuContent. */\n dropdownProps?: Omit<\n React.ComponentProps<typeof DropdownMenuContent>,\n \"side\" | \"align\"\n >;\n}\n\nexport interface MenuItemButtonProps extends Omit<\n React.ComponentProps<typeof PrimitiveDropdownMenuItem>,\n \"prefix\" | \"style\" | \"onClick\"\n> {\n /** Highlight as active. */\n isActive?: boolean;\n /** Disable the menu item button. */\n isDisabled?: boolean;\n /** Visual style of the button. */\n style?: MenuItemButtonStyle;\n /** Content rendered before the label. */\n prefix?: ReactNode;\n /** Content rendered after the label. */\n suffix?: ReactNode;\n /** Internal route (renders as anchor). */\n to?: string;\n /** External link (renders as anchor). */\n href?: string;\n /** Callback fired when the item is selected. */\n onClick?: (e: Event) => void;\n /** Children / label text. */\n children?: ReactNode;\n /** Additional CSS class names. */\n className?: string;\n}\n\nexport const DropdownContext = createContext({ closeOnSelect: true });\n","import { useCallback, useState } from \"react\";\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from \"src/primitives/DropdownMenu\";\n\nimport { ALIGN_MAP, SIDE_MAP } from \"./constants\";\nimport { SplitTrigger } from \"./SplitTrigger\";\nimport { TriggerButton } from \"./TriggerButton\";\nimport { DropdownContext, type DropdownProps } from \"./types\";\n\nconst DropdownBase = ({\n label,\n icon,\n buttonStyle = \"primary\",\n buttonSize = \"medium\",\n buttonProps,\n customTarget,\n disabled = false,\n children,\n position = \"bottom-end\",\n closeOnEsc = true,\n closeOnSelect = true,\n closeOnOutsideClick = true,\n isOpen: isOpenProp,\n onClose,\n onClick,\n className,\n triggerRef,\n dropdownProps,\n}: DropdownProps) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = isOpenProp !== undefined;\n const open = isControlled ? isOpenProp : internalOpen;\n const handleOpenChange = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n if (!next) onClose?.();\n },\n [isControlled, onClose]\n );\n\n const side = SIDE_MAP[position] ?? \"bottom\";\n const align = ALIGN_MAP[position] ?? \"end\";\n\n // Split-button mode: onClick provided without a customTarget.\n const isSplit = !!onClick && !customTarget;\n\n const sharedTriggerProps = {\n label,\n icon,\n buttonStyle,\n buttonSize,\n buttonProps,\n disabled,\n isOpen: open,\n onClick,\n };\n\n const triggerNode = isSplit ? (\n <SplitTrigger\n {...sharedTriggerProps}\n actionButtonRef={triggerRef}\n className={className}\n />\n ) : (\n <DropdownMenuTrigger asChild disabled={disabled} className={className}>\n {customTarget ? (\n typeof customTarget === \"function\" ? (\n customTarget({ isOpen: open })\n ) : (\n customTarget\n )\n ) : (\n <TriggerButton ref={triggerRef} {...sharedTriggerProps} />\n )}\n </DropdownMenuTrigger>\n );\n\n return (\n <DropdownContext.Provider value={{ closeOnSelect }}>\n <DropdownMenu\n open={open}\n onOpenChange={handleOpenChange}\n modal={closeOnOutsideClick}\n >\n {triggerNode}\n <DropdownMenuContent\n side={side}\n align={align}\n onEscapeKeyDown={closeOnEsc ? undefined : e => e.preventDefault()}\n onInteractOutside={\n closeOnOutsideClick ? undefined : e => e.preventDefault()\n }\n {...dropdownProps}\n >\n {children}\n </DropdownMenuContent>\n </DropdownMenu>\n </DropdownContext.Provider>\n );\n};\n\nexport { DropdownBase };\n","import React, { forwardRef } from \"react\";\n\nimport { DropdownMenuSeparator } from \"src/primitives/DropdownMenu\";\n\nconst Divider = forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof DropdownMenuSeparator>\n>((props, ref) => <DropdownMenuSeparator ref={ref} {...props} />);\nDivider.displayName = \"Dropdown.Divider\";\n\nexport { Divider };\n","import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { DropdownMenuLabel } from \"src/primitives/DropdownMenu\";\n\ninterface MenuLabelProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n}\n\nconst Label = forwardRef<HTMLDivElement, MenuLabelProps>(\n ({ children, className, ...otherProps }, ref) => (\n <DropdownMenuLabel ref={ref} className={className} {...otherProps}>\n {children}\n </DropdownMenuLabel>\n )\n);\nLabel.displayName = \"Dropdown.Label\";\n\nexport { Label };\n","import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { DropdownMenuGroup } from \"src/primitives/DropdownMenu\";\n\ninterface MenuProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n}\n\nconst Menu = forwardRef<HTMLDivElement, MenuProps>(\n ({ children, className, ...otherProps }, ref) => (\n <DropdownMenuGroup\n ref={ref}\n className={cn(\"flex flex-col\", className)}\n {...otherProps}\n >\n {children}\n </DropdownMenuGroup>\n )\n);\nMenu.displayName = \"Dropdown.Menu\";\n\nexport { Menu };\n","import { forwardRef, useCallback, useMemo, useContext } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { DropdownMenuItem as PrimitiveDropdownMenuItem } from \"src/primitives/DropdownMenu\";\n\nimport { MENU_ITEM_STYLE_MAP } from \"./constants\";\nimport { DropdownContext, type MenuItemButtonProps } from \"./types\";\n\nconst MenuItemButton = forwardRef<HTMLDivElement, MenuItemButtonProps>(\n (\n {\n children,\n isActive = false,\n isDisabled = false,\n style = \"default\",\n prefix,\n suffix,\n to,\n href,\n className,\n onClick,\n variant: _variant,\n disabled: _disabled,\n asChild: _asChild,\n onSelect: _onSelect,\n ...otherProps\n },\n ref\n ) => {\n const { closeOnSelect } = useContext(DropdownContext);\n const variant = MENU_ITEM_STYLE_MAP[style];\n const linkHref = to ?? href;\n\n const handleSelect = useCallback(\n (e: Event) => {\n if (!closeOnSelect) e.preventDefault();\n onClick?.(e);\n },\n [closeOnSelect, onClick]\n );\n\n const itemContent = useMemo(\n () => (\n <>\n {prefix && (\n <span data-slot=\"menu-item-prefix\" className=\"shrink-0\">\n {prefix}\n </span>\n )}\n <span className=\"flex-1 truncate\">{children}</span>\n {suffix && (\n <span\n data-slot=\"menu-item-suffix\"\n className=\"ms-auto shrink-0 text-muted-foreground\"\n >\n {suffix}\n </span>\n )}\n </>\n ),\n [prefix, children, suffix]\n );\n\n return (\n <PrimitiveDropdownMenuItem\n ref={ref}\n variant={variant}\n disabled={isDisabled}\n data-active={isActive || undefined}\n className={cn(\n isActive && \"bg-accent text-accent-foreground\",\n className\n )}\n asChild={!!linkHref}\n onSelect={handleSelect}\n {...otherProps}\n >\n {linkHref ? <a href={linkHref}>{itemContent}</a> : itemContent}\n </PrimitiveDropdownMenuItem>\n );\n }\n);\nMenuItemButton.displayName = \"Dropdown.MenuItem.Button\";\n\nexport { MenuItemButton };\n","import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { DropdownMenuItem as PrimitiveDropdownMenuItem } from \"src/primitives/DropdownMenu\";\n\nimport { MenuItemButton } from \"./MenuItemButton\";\n\ninterface MenuItemProps extends React.ComponentProps<\n typeof PrimitiveDropdownMenuItem\n> {\n children?: ReactNode;\n className?: string;\n}\n\nconst MenuItem = forwardRef<HTMLDivElement, MenuItemProps>(\n ({ children, ...otherProps }, ref) => (\n <PrimitiveDropdownMenuItem ref={ref} {...otherProps}>\n {children}\n </PrimitiveDropdownMenuItem>\n )\n) as React.ForwardRefExoticComponent<\n MenuItemProps & React.RefAttributes<HTMLDivElement>\n> & {\n Button: typeof MenuItemButton;\n};\nMenuItem.displayName = \"Dropdown.MenuItem\";\nMenuItem.Button = MenuItemButton;\n\nexport { MenuItem };\n","import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { renderIcon, type IconProp } from \"src/lib/renderIcon\";\nimport {\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from \"src/primitives/DropdownMenu\";\n\ninterface SubMenuProps {\n label?: string;\n icon?: IconProp;\n children?: ReactNode;\n className?: string;\n triggerProps?: Omit<\n React.ComponentProps<typeof DropdownMenuSubTrigger>,\n \"ref\" | \"className\" | \"children\"\n >;\n contentProps?: Omit<\n React.ComponentProps<typeof DropdownMenuSubContent>,\n \"children\"\n >;\n}\n\nconst SubMenu = forwardRef<HTMLDivElement, SubMenuProps>(\n ({ label, icon, children, className, triggerProps, contentProps }, ref) => (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger ref={ref} className={className} {...triggerProps}>\n {icon && <span className=\"shrink-0\">{renderIcon(icon, \"size-4\")}</span>}\n {label && <span>{label}</span>}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent {...contentProps}>\n {children}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )\n);\nSubMenu.displayName = \"Dropdown.SubMenu\";\n\nexport { SubMenu };\n","import { DropdownBase } from \"./DropdownBase\";\nimport { Divider } from \"./Divider\";\nimport { Label } from \"./Label\";\nimport { Menu } from \"./Menu\";\nimport { MenuItem } from \"./MenuItem\";\nimport { SubMenu } from \"./SubMenu\";\n\nexport type { DropdownProps, DropdownPosition } from \"./types\";\n\ntype DropdownComponent = typeof DropdownBase & {\n displayName?: string;\n Menu: typeof Menu;\n MenuItem: typeof MenuItem;\n Divider: typeof Divider;\n Label: typeof Label;\n SubMenu: typeof SubMenu;\n};\n\nconst DropdownMenu = DropdownBase as DropdownComponent;\nDropdownMenu.displayName = \"DropdownMenu\";\nDropdownMenu.Menu = Menu;\nDropdownMenu.MenuItem = MenuItem;\nDropdownMenu.Divider = Divider;\nDropdownMenu.Label = Label;\nDropdownMenu.SubMenu = SubMenu;\n\nexport { DropdownMenu };\n"],"names":["_jsxs","PrimitiveButton","_jsx","DropdownMenu","_Fragment","PrimitiveDropdownMenuItem"],"mappings":"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"}
|
package/dist/components/Label.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { L as Label } from '../Label-
|
|
1
|
+
export { L as Label } from '../Label-jZPbTxdX.js';
|
|
2
2
|
import 'react/jsx-runtime';
|
|
3
3
|
import 'react';
|
|
4
4
|
import '../utils-DdHUxIdC.js';
|
|
@@ -23,7 +23,7 @@ import '../index-fV_U4ZJM.js';
|
|
|
23
23
|
import '../index-yFgkK_AM.js';
|
|
24
24
|
import '../index-Cor698lu.js';
|
|
25
25
|
import '../index-CSggBaQF.js';
|
|
26
|
-
import '../Popover-
|
|
26
|
+
import '../Popover-dib6elwS.js';
|
|
27
27
|
import '../index-D7Zy7P05.js';
|
|
28
28
|
import '../primitives/HoverCard.js';
|
|
29
29
|
import '../Button-Q7MPG6ph.js';
|
|
@@ -27,8 +27,6 @@ export interface PopoverProps extends Omit<HoverCardContentProps, "children" | "
|
|
|
27
27
|
onOpenChange?: (open: boolean) => void;
|
|
28
28
|
/** Auto-hide after N milliseconds. Use -1 to disable. */
|
|
29
29
|
hideAfter?: number;
|
|
30
|
-
/** Auto-hide the popover when the trigger scrolls out of the viewport. */
|
|
31
|
-
hideOnTargetExit?: boolean;
|
|
32
30
|
/** Radix HoverCard `defaultOpen` prop. */
|
|
33
31
|
defaultOpen?: boolean;
|
|
34
32
|
/** Delay in ms before the popover opens on hover. */
|
|
@@ -16,8 +16,6 @@ export interface TooltipProps extends Omit<TooltipContentProps, "children" | "cl
|
|
|
16
16
|
interactive?: boolean;
|
|
17
17
|
/** Auto-hide after N milliseconds. Use -1 to disable. */
|
|
18
18
|
hideAfter?: number;
|
|
19
|
-
/** Auto-hide the tooltip when the trigger scrolls out of the viewport. */
|
|
20
|
-
hideOnTargetExit?: boolean;
|
|
21
19
|
/** Additional CSS class names for the tooltip content. */
|
|
22
20
|
className?: string;
|
|
23
21
|
/** Delay in ms before the tooltip opens (forwarded to TooltipProvider). */
|
|
@@ -25,5 +23,8 @@ export interface TooltipProps extends Omit<TooltipContentProps, "children" | "cl
|
|
|
25
23
|
/** Radix Tooltip `defaultOpen` prop. */
|
|
26
24
|
defaultOpen?: boolean;
|
|
27
25
|
}
|
|
28
|
-
declare const Tooltip:
|
|
26
|
+
declare const Tooltip: {
|
|
27
|
+
({ content, children, disabled, position, interactive, hideAfter, className, delayDuration, defaultOpen, ...contentProps }: TooltipProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
displayName: string;
|
|
29
|
+
};
|
|
29
30
|
export { Tooltip };
|
package/dist/components/index.js
CHANGED
|
@@ -13,10 +13,10 @@ export { DropdownMenu } from './DropdownMenu.js';
|
|
|
13
13
|
export { E as Empty } from '../Empty-B2JwFmru.js';
|
|
14
14
|
export { I as Input } from '../Input-C1gcv9o2.js';
|
|
15
15
|
export { K as Kbd } from '../Kbd-EqbC0bua.js';
|
|
16
|
-
export { L as Label } from '../Label-
|
|
16
|
+
export { L as Label } from '../Label-jZPbTxdX.js';
|
|
17
17
|
export { M as MultiEmailInput } from '../MultiEmailInput-SCTYovtX.js';
|
|
18
18
|
export { P as Pagination } from '../Pagination-DSc9yXPy.js';
|
|
19
|
-
export { P as Popover } from '../Popover-
|
|
19
|
+
export { P as Popover } from '../Popover-dib6elwS.js';
|
|
20
20
|
export { P as Progress } from '../Progress-B9NlUm6e.js';
|
|
21
21
|
export { R as RadioGroup } from '../RadioGroup-BNeYQAoT.js';
|
|
22
22
|
export { S as Select } from '../Select-TlFBcxcY.js';
|
|
@@ -30,7 +30,7 @@ export { T as Textarea } from '../Textarea-C0z50h0N.js';
|
|
|
30
30
|
export { T as TimePicker } from '../TimePicker-C4x62jI1.js';
|
|
31
31
|
export { T as TimePickerPanel } from '../TimePickerPanel-CiF0RExY.js';
|
|
32
32
|
export { T as Toastr } from '../Toastr-DYqpSaMd.js';
|
|
33
|
-
export { T as Tooltip } from '../Tooltip-
|
|
33
|
+
export { T as Tooltip } from '../Tooltip-3ZzQyaDV.js';
|
|
34
34
|
export { T as TranslationProvider } from '../TranslationProvider-Ba9rn47H.js';
|
|
35
35
|
export { T as Tree } from '../Tree-C7r10UY5.js';
|
|
36
36
|
export { f as flattenTreeData, g as getExpandedKeysFromSearch, a as getParentKey } from '../search-BK7Ozh5_.js';
|
package/dist/index.js
CHANGED
|
@@ -20,13 +20,13 @@ export { DropdownMenu } from './components/DropdownMenu.js';
|
|
|
20
20
|
export { E as Empty } from './Empty-B2JwFmru.js';
|
|
21
21
|
export { I as Input } from './Input-C1gcv9o2.js';
|
|
22
22
|
export { K as Kbd } from './Kbd-EqbC0bua.js';
|
|
23
|
-
export { L as Label } from './Label-
|
|
23
|
+
export { L as Label } from './Label-jZPbTxdX.js';
|
|
24
24
|
export { P as Pagination } from './Pagination-DSc9yXPy.js';
|
|
25
25
|
export { R as RadioGroup } from './RadioGroup-BNeYQAoT.js';
|
|
26
26
|
export { S as Select } from './Select-TlFBcxcY.js';
|
|
27
27
|
export { M as MultiEmailInput } from './MultiEmailInput-SCTYovtX.js';
|
|
28
28
|
export { S as Sheet } from './Sheet-QFC_mHyj.js';
|
|
29
|
-
export { P as Popover } from './Popover-
|
|
29
|
+
export { P as Popover } from './Popover-dib6elwS.js';
|
|
30
30
|
export { P as Progress } from './Progress-B9NlUm6e.js';
|
|
31
31
|
export { S as Slider } from './Slider-BCQXhs0Q.js';
|
|
32
32
|
export { S as Spinner } from './Spinner-C8HSac-2.js';
|
|
@@ -35,7 +35,7 @@ export { T as Toastr } from './Toastr-DYqpSaMd.js';
|
|
|
35
35
|
export { S as Switch } from './Switch-B83TGxJ_.js';
|
|
36
36
|
export { T as Tabs } from './Tabs-DWfKnl3S.js';
|
|
37
37
|
export { T as Textarea } from './Textarea-C0z50h0N.js';
|
|
38
|
-
export { T as Tooltip } from './Tooltip-
|
|
38
|
+
export { T as Tooltip } from './Tooltip-3ZzQyaDV.js';
|
|
39
39
|
export { T as Typography, t as typographyVariants } from './Typography-Bl-NoDAX.js';
|
|
40
40
|
export { D as DataTable, u as useColumnOrdering, a as useColumnPinning, b as useColumnVisibility, c as useTablePagination, d as useTableSelection, e as useTableSort } from './DataTable-DWR9gX9d.js';
|
|
41
41
|
export { T as Tree } from './Tree-C7r10UY5.js';
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Popover-BFMrtVPq.js","sources":["../src/components/Popover/constants.ts","../src/components/Popover/Popover.tsx"],"sourcesContent":["export const SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n \"top-start\": \"top\",\n \"top-end\": \"top\",\n \"bottom-start\": \"bottom\",\n \"bottom-end\": \"bottom\",\n \"left-start\": \"left\",\n \"left-end\": \"left\",\n \"right-start\": \"right\",\n \"right-end\": \"right\",\n auto: \"bottom\",\n};\n\nexport const ALIGN_MAP: Record<string, \"start\" | \"center\" | \"end\"> = {\n top: \"center\",\n bottom: \"center\",\n left: \"center\",\n right: \"center\",\n \"top-start\": \"start\",\n \"top-end\": \"end\",\n \"bottom-start\": \"start\",\n \"bottom-end\": \"end\",\n \"left-start\": \"start\",\n \"left-end\": \"end\",\n \"right-start\": \"start\",\n \"right-end\": \"end\",\n auto: \"center\",\n};\n","import React, {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n HoverCard,\n HoverCardContent,\n HoverCardTrigger,\n} from \"src/primitives/HoverCard\";\n\ntype PopoverPosition =\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left-start\"\n | \"left-end\"\n | \"right-start\"\n | \"right-end\"\n | \"auto\";\n\nconst popoverVariants = cva(\"flex flex-col gap-2.5\", {\n variants: {\n variant: {\n default: \"\",\n primary: \"bg-primary text-primary-foreground ring-0 shadow-lg\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n});\n\ntype PopoverVariant = NonNullable<\n VariantProps<typeof popoverVariants>[\"variant\"]\n>;\n\n/** Radix HoverCard.Content props we forward via ...otherProps. */\ntype HoverCardContentProps = React.ComponentProps<typeof HoverCardContent>;\n\nexport interface PopoverProps extends Omit<\n HoverCardContentProps,\n \"children\" | \"className\" | \"side\" | \"align\"\n> {\n /** Content rendered inside the popover. */\n children?: ReactNode;\n /** The trigger element that opens the popover on hover. */\n trigger?: ReactNode;\n /** Color variant of the popover. */\n variant?: PopoverVariant;\n /** Disable the popover. */\n disabled?: boolean;\n /** Placement of the popover relative to the trigger. */\n position?: PopoverPosition;\n /** Additional CSS class names for the popover content. */\n className?: string;\n /** Whether the popover is open (controlled). */\n open?: boolean;\n /** Callback when open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Auto-hide after N milliseconds. Use -1 to disable. */\n hideAfter?: number;\n /** Auto-hide the popover when the trigger scrolls out of the viewport. */\n hideOnTargetExit?: boolean;\n /** Radix HoverCard `defaultOpen` prop. */\n defaultOpen?: boolean;\n /** Delay in ms before the popover opens on hover. */\n openDelay?: number;\n /** Delay in ms before the popover closes after hover leaves. */\n closeDelay?: number;\n}\n\nimport { SIDE_MAP, ALIGN_MAP } from \"./constants\";\n\ninterface PopoverTitleProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n}\n\nconst Title = forwardRef<HTMLDivElement, PopoverTitleProps>(\n ({ children, className, ...otherProps }, ref) => (\n <div\n ref={ref}\n data-slot=\"popover-title\"\n className={cn(\"text-sm font-semibold\", className)}\n {...otherProps}\n >\n {children}\n </div>\n )\n);\nTitle.displayName = \"Popover.Title\";\n\nconst Popover = forwardRef<HTMLDivElement, PopoverProps>(\n (\n {\n children,\n trigger,\n variant = \"default\",\n disabled = false,\n position = \"auto\",\n className,\n open: openProp,\n onOpenChange: onOpenChangeProp,\n hideAfter = -1,\n hideOnTargetExit = false,\n defaultOpen,\n openDelay = 200,\n closeDelay = 200,\n // Radix HoverCardContent props forwarded\n ...contentProps\n },\n ref\n ) => {\n // Internal state for uncontrolled mode + hideAfter / hideOnTargetExit\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : internalOpen;\n\n const handleOpenChange = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChangeProp?.(next);\n },\n [isControlled, onOpenChangeProp]\n );\n\n const triggerRef = useRef<HTMLElement | null>(null);\n\n // Auto-hide after hideAfter ms\n useEffect(() => {\n if (!open || hideAfter <= 0) return;\n const timer = setTimeout(() => handleOpenChange(false), hideAfter);\n return () => clearTimeout(timer);\n }, [open, hideAfter, handleOpenChange]);\n\n // Hide popover when trigger exits viewport\n useEffect(() => {\n if (!hideOnTargetExit || !open || !triggerRef.current) return;\n const observer = new IntersectionObserver(([entry]) => {\n if (!entry.isIntersecting) handleOpenChange(false);\n });\n observer.observe(triggerRef.current);\n return () => observer.disconnect();\n }, [hideOnTargetExit, open, handleOpenChange]);\n\n if (disabled) {\n return <>{trigger}</>;\n }\n\n const side = SIDE_MAP[position] ?? \"bottom\";\n const align = ALIGN_MAP[position] ?? \"center\";\n\n // Wrap non-element trigger in a span\n const triggerElement = React.isValidElement(trigger) ? (\n trigger\n ) : (\n <span>{trigger}</span>\n );\n\n return (\n <HoverCard\n open={open}\n onOpenChange={handleOpenChange}\n defaultOpen={defaultOpen}\n openDelay={openDelay}\n closeDelay={closeDelay}\n >\n <HoverCardTrigger\n ref={triggerRef as React.Ref<HTMLAnchorElement>}\n asChild\n >\n {triggerElement}\n </HoverCardTrigger>\n <HoverCardContent\n ref={ref}\n side={side}\n align={align}\n className={cn(popoverVariants({ variant }), className)}\n {...contentProps}\n >\n {children}\n </HoverCardContent>\n </HoverCard>\n );\n }\n) as React.ForwardRefExoticComponent<\n PopoverProps & React.RefAttributes<HTMLDivElement>\n> & {\n Title: typeof Title;\n};\n\nPopover.displayName = \"Popover\";\nPopover.Title = Title;\n\nexport { Popover };\n"],"names":["_jsx","_Fragment","React","_jsxs"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip-DhwIZnOU.js","sources":["../src/components/Tooltip/constants.ts","../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["export const SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n \"top-start\": \"top\",\n \"top-end\": \"top\",\n \"bottom-start\": \"bottom\",\n \"bottom-end\": \"bottom\",\n \"left-start\": \"left\",\n \"left-end\": \"left\",\n \"right-start\": \"right\",\n \"right-end\": \"right\",\n auto: \"top\",\n};\n\nexport const ALIGN_MAP: Record<string, \"start\" | \"center\" | \"end\"> = {\n top: \"center\",\n bottom: \"center\",\n left: \"center\",\n right: \"center\",\n \"top-start\": \"start\",\n \"top-end\": \"end\",\n \"bottom-start\": \"start\",\n \"bottom-end\": \"end\",\n \"left-start\": \"start\",\n \"left-end\": \"end\",\n \"right-start\": \"start\",\n \"right-end\": \"end\",\n auto: \"center\",\n};\n","import React, {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\n\nimport {\n Tooltip as PrimitiveTooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"src/primitives/Tooltip\";\n\ntype TooltipPosition =\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left-start\"\n | \"left-end\"\n | \"right-start\"\n | \"right-end\"\n | \"auto\";\n\n/** Radix Tooltip.Content props we forward via ...otherProps. */\ntype TooltipContentProps = React.ComponentProps<typeof TooltipContent>;\n\nexport interface TooltipProps extends Omit<\n TooltipContentProps,\n \"children\" | \"className\" | \"side\" | \"align\" | \"content\"\n> {\n /** Content rendered inside the tooltip popup. */\n content?: ReactNode;\n /** The trigger element. */\n children?: ReactNode;\n /** Disable the tooltip. */\n disabled?: boolean;\n /** Placement of the tooltip relative to the trigger. */\n position?: TooltipPosition;\n /** Whether the tooltip stays open when hovered over. */\n interactive?: boolean;\n /** Auto-hide after N milliseconds. Use -1 to disable. */\n hideAfter?: number;\n /** Auto-hide the tooltip when the trigger scrolls out of the viewport. */\n hideOnTargetExit?: boolean;\n /** Additional CSS class names for the tooltip content. */\n className?: string;\n /** Delay in ms before the tooltip opens (forwarded to TooltipProvider). */\n delayDuration?: number;\n /** Radix Tooltip `defaultOpen` prop. */\n defaultOpen?: boolean;\n}\n\nimport { SIDE_MAP, ALIGN_MAP } from \"./constants\";\n\nconst Tooltip = forwardRef<HTMLButtonElement, TooltipProps>(\n (\n {\n content,\n children,\n disabled = false,\n position = \"auto\",\n interactive = false,\n hideAfter = -1,\n hideOnTargetExit = false,\n className,\n delayDuration = 0,\n defaultOpen,\n // Radix TooltipContent props forwarded\n ...contentProps\n },\n ref\n ) => {\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLElement | null>(null);\n\n // Merge external ref with internal trigger ref\n const setTriggerRef = useCallback(\n (node: HTMLButtonElement | null) => {\n triggerRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref)\n (ref as React.MutableRefObject<HTMLButtonElement | null>).current =\n node;\n },\n [ref]\n );\n\n // Auto-hide after hideAfter ms\n useEffect(() => {\n if (!open || hideAfter <= 0) return;\n const timer = setTimeout(() => setOpen(false), hideAfter);\n return () => clearTimeout(timer);\n }, [open, hideAfter]);\n\n // Hide tooltip when trigger exits viewport\n useEffect(() => {\n if (!hideOnTargetExit || !open || !triggerRef.current) return;\n const observer = new IntersectionObserver(([entry]) => {\n if (!entry.isIntersecting) setOpen(false);\n });\n observer.observe(triggerRef.current);\n return () => observer.disconnect();\n }, [hideOnTargetExit, open]);\n\n if (disabled || !content) {\n return <>{children}</>;\n }\n\n const side = SIDE_MAP[position] ?? \"top\";\n const align = ALIGN_MAP[position] ?? \"center\";\n\n // Wrap non-element children in a span so TooltipTrigger can attach\n const trigger = React.isValidElement(children) ? (\n children\n ) : (\n <span>{children}</span>\n );\n\n return (\n <TooltipProvider delayDuration={delayDuration}>\n <PrimitiveTooltip\n open={open}\n onOpenChange={setOpen}\n defaultOpen={defaultOpen}\n disableHoverableContent={!interactive}\n >\n <TooltipTrigger ref={setTriggerRef} asChild>\n {trigger}\n </TooltipTrigger>\n <TooltipContent\n side={side}\n align={align}\n className={className}\n onPointerDownOutside={\n interactive ? e => e.preventDefault() : undefined\n }\n {...contentProps}\n >\n {content}\n </TooltipContent>\n </PrimitiveTooltip>\n </TooltipProvider>\n );\n }\n);\n\nTooltip.displayName = \"Tooltip\";\n\nexport { Tooltip };\n"],"names":["_jsx","_Fragment","React","_jsxs","PrimitiveTooltip"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Popover-LIxANoTc.js","sources":["../../../src/components/Popover/constants.ts","../../../src/components/Popover/Popover.tsx"],"sourcesContent":["export const SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n \"top-start\": \"top\",\n \"top-end\": \"top\",\n \"bottom-start\": \"bottom\",\n \"bottom-end\": \"bottom\",\n \"left-start\": \"left\",\n \"left-end\": \"left\",\n \"right-start\": \"right\",\n \"right-end\": \"right\",\n auto: \"bottom\",\n};\n\nexport const ALIGN_MAP: Record<string, \"start\" | \"center\" | \"end\"> = {\n top: \"center\",\n bottom: \"center\",\n left: \"center\",\n right: \"center\",\n \"top-start\": \"start\",\n \"top-end\": \"end\",\n \"bottom-start\": \"start\",\n \"bottom-end\": \"end\",\n \"left-start\": \"start\",\n \"left-end\": \"end\",\n \"right-start\": \"start\",\n \"right-end\": \"end\",\n auto: \"center\",\n};\n","import React, {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n HoverCard,\n HoverCardContent,\n HoverCardTrigger,\n} from \"src/primitives/HoverCard\";\n\ntype PopoverPosition =\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left-start\"\n | \"left-end\"\n | \"right-start\"\n | \"right-end\"\n | \"auto\";\n\nconst popoverVariants = cva(\"flex flex-col gap-2.5\", {\n variants: {\n variant: {\n default: \"\",\n primary: \"bg-primary text-primary-foreground ring-0 shadow-lg\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n});\n\ntype PopoverVariant = NonNullable<\n VariantProps<typeof popoverVariants>[\"variant\"]\n>;\n\n/** Radix HoverCard.Content props we forward via ...otherProps. */\ntype HoverCardContentProps = React.ComponentProps<typeof HoverCardContent>;\n\nexport interface PopoverProps extends Omit<\n HoverCardContentProps,\n \"children\" | \"className\" | \"side\" | \"align\"\n> {\n /** Content rendered inside the popover. */\n children?: ReactNode;\n /** The trigger element that opens the popover on hover. */\n trigger?: ReactNode;\n /** Color variant of the popover. */\n variant?: PopoverVariant;\n /** Disable the popover. */\n disabled?: boolean;\n /** Placement of the popover relative to the trigger. */\n position?: PopoverPosition;\n /** Additional CSS class names for the popover content. */\n className?: string;\n /** Whether the popover is open (controlled). */\n open?: boolean;\n /** Callback when open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Auto-hide after N milliseconds. Use -1 to disable. */\n hideAfter?: number;\n /** Auto-hide the popover when the trigger scrolls out of the viewport. */\n hideOnTargetExit?: boolean;\n /** Radix HoverCard `defaultOpen` prop. */\n defaultOpen?: boolean;\n /** Delay in ms before the popover opens on hover. */\n openDelay?: number;\n /** Delay in ms before the popover closes after hover leaves. */\n closeDelay?: number;\n}\n\nimport { SIDE_MAP, ALIGN_MAP } from \"./constants\";\n\ninterface PopoverTitleProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n}\n\nconst Title = forwardRef<HTMLDivElement, PopoverTitleProps>(\n ({ children, className, ...otherProps }, ref) => (\n <div\n ref={ref}\n data-slot=\"popover-title\"\n className={cn(\"text-sm font-semibold\", className)}\n {...otherProps}\n >\n {children}\n </div>\n )\n);\nTitle.displayName = \"Popover.Title\";\n\nconst Popover = forwardRef<HTMLDivElement, PopoverProps>(\n (\n {\n children,\n trigger,\n variant = \"default\",\n disabled = false,\n position = \"auto\",\n className,\n open: openProp,\n onOpenChange: onOpenChangeProp,\n hideAfter = -1,\n hideOnTargetExit = false,\n defaultOpen,\n openDelay = 200,\n closeDelay = 200,\n // Radix HoverCardContent props forwarded\n ...contentProps\n },\n ref\n ) => {\n // Internal state for uncontrolled mode + hideAfter / hideOnTargetExit\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : internalOpen;\n\n const handleOpenChange = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChangeProp?.(next);\n },\n [isControlled, onOpenChangeProp]\n );\n\n const triggerRef = useRef<HTMLElement | null>(null);\n\n // Auto-hide after hideAfter ms\n useEffect(() => {\n if (!open || hideAfter <= 0) return;\n const timer = setTimeout(() => handleOpenChange(false), hideAfter);\n return () => clearTimeout(timer);\n }, [open, hideAfter, handleOpenChange]);\n\n // Hide popover when trigger exits viewport\n useEffect(() => {\n if (!hideOnTargetExit || !open || !triggerRef.current) return;\n const observer = new IntersectionObserver(([entry]) => {\n if (!entry.isIntersecting) handleOpenChange(false);\n });\n observer.observe(triggerRef.current);\n return () => observer.disconnect();\n }, [hideOnTargetExit, open, handleOpenChange]);\n\n if (disabled) {\n return <>{trigger}</>;\n }\n\n const side = SIDE_MAP[position] ?? \"bottom\";\n const align = ALIGN_MAP[position] ?? \"center\";\n\n // Wrap non-element trigger in a span\n const triggerElement = React.isValidElement(trigger) ? (\n trigger\n ) : (\n <span>{trigger}</span>\n );\n\n return (\n <HoverCard\n open={open}\n onOpenChange={handleOpenChange}\n defaultOpen={defaultOpen}\n openDelay={openDelay}\n closeDelay={closeDelay}\n >\n <HoverCardTrigger\n ref={triggerRef as React.Ref<HTMLAnchorElement>}\n asChild\n >\n {triggerElement}\n </HoverCardTrigger>\n <HoverCardContent\n ref={ref}\n side={side}\n align={align}\n className={cn(popoverVariants({ variant }), className)}\n {...contentProps}\n >\n {children}\n </HoverCardContent>\n </HoverCard>\n );\n }\n) as React.ForwardRefExoticComponent<\n PopoverProps & React.RefAttributes<HTMLDivElement>\n> & {\n Title: typeof Title;\n};\n\nPopover.displayName = \"Popover\";\nPopover.Title = Title;\n\nexport { Popover };\n"],"names":["cva","forwardRef","_jsx","cn","useState","useCallback","useRef","useEffect","_Fragment","React","_jsxs","HoverCard","HoverCardTrigger","HoverCardContent"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip-CtxI7QBY.js","sources":["../../../src/components/Tooltip/constants.ts","../../../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["export const SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n \"top-start\": \"top\",\n \"top-end\": \"top\",\n \"bottom-start\": \"bottom\",\n \"bottom-end\": \"bottom\",\n \"left-start\": \"left\",\n \"left-end\": \"left\",\n \"right-start\": \"right\",\n \"right-end\": \"right\",\n auto: \"top\",\n};\n\nexport const ALIGN_MAP: Record<string, \"start\" | \"center\" | \"end\"> = {\n top: \"center\",\n bottom: \"center\",\n left: \"center\",\n right: \"center\",\n \"top-start\": \"start\",\n \"top-end\": \"end\",\n \"bottom-start\": \"start\",\n \"bottom-end\": \"end\",\n \"left-start\": \"start\",\n \"left-end\": \"end\",\n \"right-start\": \"start\",\n \"right-end\": \"end\",\n auto: \"center\",\n};\n","import React, {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\n\nimport {\n Tooltip as PrimitiveTooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"src/primitives/Tooltip\";\n\ntype TooltipPosition =\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left-start\"\n | \"left-end\"\n | \"right-start\"\n | \"right-end\"\n | \"auto\";\n\n/** Radix Tooltip.Content props we forward via ...otherProps. */\ntype TooltipContentProps = React.ComponentProps<typeof TooltipContent>;\n\nexport interface TooltipProps extends Omit<\n TooltipContentProps,\n \"children\" | \"className\" | \"side\" | \"align\" | \"content\"\n> {\n /** Content rendered inside the tooltip popup. */\n content?: ReactNode;\n /** The trigger element. */\n children?: ReactNode;\n /** Disable the tooltip. */\n disabled?: boolean;\n /** Placement of the tooltip relative to the trigger. */\n position?: TooltipPosition;\n /** Whether the tooltip stays open when hovered over. */\n interactive?: boolean;\n /** Auto-hide after N milliseconds. Use -1 to disable. */\n hideAfter?: number;\n /** Auto-hide the tooltip when the trigger scrolls out of the viewport. */\n hideOnTargetExit?: boolean;\n /** Additional CSS class names for the tooltip content. */\n className?: string;\n /** Delay in ms before the tooltip opens (forwarded to TooltipProvider). */\n delayDuration?: number;\n /** Radix Tooltip `defaultOpen` prop. */\n defaultOpen?: boolean;\n}\n\nimport { SIDE_MAP, ALIGN_MAP } from \"./constants\";\n\nconst Tooltip = forwardRef<HTMLButtonElement, TooltipProps>(\n (\n {\n content,\n children,\n disabled = false,\n position = \"auto\",\n interactive = false,\n hideAfter = -1,\n hideOnTargetExit = false,\n className,\n delayDuration = 0,\n defaultOpen,\n // Radix TooltipContent props forwarded\n ...contentProps\n },\n ref\n ) => {\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLElement | null>(null);\n\n // Merge external ref with internal trigger ref\n const setTriggerRef = useCallback(\n (node: HTMLButtonElement | null) => {\n triggerRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref)\n (ref as React.MutableRefObject<HTMLButtonElement | null>).current =\n node;\n },\n [ref]\n );\n\n // Auto-hide after hideAfter ms\n useEffect(() => {\n if (!open || hideAfter <= 0) return;\n const timer = setTimeout(() => setOpen(false), hideAfter);\n return () => clearTimeout(timer);\n }, [open, hideAfter]);\n\n // Hide tooltip when trigger exits viewport\n useEffect(() => {\n if (!hideOnTargetExit || !open || !triggerRef.current) return;\n const observer = new IntersectionObserver(([entry]) => {\n if (!entry.isIntersecting) setOpen(false);\n });\n observer.observe(triggerRef.current);\n return () => observer.disconnect();\n }, [hideOnTargetExit, open]);\n\n if (disabled || !content) {\n return <>{children}</>;\n }\n\n const side = SIDE_MAP[position] ?? \"top\";\n const align = ALIGN_MAP[position] ?? \"center\";\n\n // Wrap non-element children in a span so TooltipTrigger can attach\n const trigger = React.isValidElement(children) ? (\n children\n ) : (\n <span>{children}</span>\n );\n\n return (\n <TooltipProvider delayDuration={delayDuration}>\n <PrimitiveTooltip\n open={open}\n onOpenChange={setOpen}\n defaultOpen={defaultOpen}\n disableHoverableContent={!interactive}\n >\n <TooltipTrigger ref={setTriggerRef} asChild>\n {trigger}\n </TooltipTrigger>\n <TooltipContent\n side={side}\n align={align}\n className={className}\n onPointerDownOutside={\n interactive ? e => e.preventDefault() : undefined\n }\n {...contentProps}\n >\n {content}\n </TooltipContent>\n </PrimitiveTooltip>\n </TooltipProvider>\n );\n }\n);\n\nTooltip.displayName = \"Tooltip\";\n\nexport { Tooltip };\n"],"names":["forwardRef","useState","useRef","useCallback","useEffect","_jsx","_Fragment","React","TooltipProvider","_jsxs","PrimitiveTooltip","TooltipTrigger","TooltipContent"],"mappings":"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"}
|