@syscore/ui-library 1.1.12 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/components/icons/AchievementBadges.tsx +33 -0
- package/client/components/icons/ConceptIcons.tsx +169 -22
- package/client/components/icons/NavLogo.tsx +4 -4
- package/client/components/icons/ProviderBadges.tsx +28 -28
- package/client/components/icons/ProviderSeals.tsx +35 -35
- package/client/components/icons/StandardLogo.tsx +47 -0
- package/client/components/icons/UtilityChevronDown.tsx +1 -1
- package/client/components/icons/UtilityClearRegular.tsx +43 -0
- package/client/components/icons/UtilityCompare.tsx +71 -0
- package/client/components/icons/UtilityHome.tsx +26 -0
- package/client/components/icons/UtilityReset.tsx +7 -7
- package/client/components/icons/UtilitySave.tsx +35 -0
- package/client/components/icons/UtilityScopeLarge.tsx +86 -0
- package/client/components/icons/UtilityShow.tsx +41 -0
- package/client/components/icons/UtilityTarget.tsx +21 -0
- package/client/components/icons/UtilityTargetActive.tsx +34 -0
- package/client/components/icons/UtilityText.tsx +8 -8
- package/client/components/ui/accordion.tsx +6 -9
- package/client/components/ui/alert-dialog.tsx +6 -19
- package/client/components/ui/alert.tsx +5 -6
- package/client/components/ui/avatar.tsx +3 -9
- package/client/components/ui/badge.tsx +5 -8
- package/client/components/ui/breadcrumb.tsx +24 -11
- package/client/components/ui/button.tsx +40 -56
- package/client/components/ui/calendar.tsx +24 -28
- package/client/components/ui/card.tsx +6 -9
- package/client/components/ui/carousel.tsx +14 -14
- package/client/components/ui/chart.tsx +25 -28
- package/client/components/ui/checkbox.tsx +3 -8
- package/client/components/ui/code-badge.tsx +22 -0
- package/client/components/ui/command.tsx +12 -48
- package/client/components/ui/context-menu.tsx +17 -32
- package/client/components/ui/dialog.tsx +9 -18
- package/client/components/ui/drawer.tsx +7 -13
- package/client/components/ui/dropdown-menu.tsx +17 -29
- package/client/components/ui/form.tsx +4 -4
- package/client/components/ui/hover-card.tsx +1 -4
- package/client/components/ui/input-otp.tsx +7 -10
- package/client/components/ui/input.tsx +34 -9
- package/client/components/ui/label.tsx +2 -4
- package/client/components/ui/menubar.tsx +19 -40
- package/client/components/ui/navigation-menu.tsx +10 -27
- package/client/components/ui/navigation.tsx +861 -0
- package/client/components/ui/pagination.tsx +8 -8
- package/client/components/ui/popover.tsx +1 -4
- package/client/components/ui/progress.tsx +2 -5
- package/client/components/ui/radio-group.tsx +4 -7
- package/client/components/ui/resizable.tsx +4 -10
- package/client/components/ui/scroll-area.tsx +5 -8
- package/client/components/ui/{SearchField.tsx → search.tsx} +7 -10
- package/client/components/ui/select.tsx +19 -44
- package/client/components/ui/separator.tsx +2 -2
- package/client/components/ui/sheet.tsx +12 -23
- package/client/components/ui/sidebar.tsx +55 -82
- package/client/components/ui/skeleton.tsx +1 -1
- package/client/components/ui/slider.tsx +4 -7
- package/client/components/ui/sonner.tsx +5 -8
- package/client/components/ui/switch.tsx +2 -9
- package/client/components/ui/table.tsx +9 -18
- package/client/components/ui/tabs.tsx +43 -203
- package/client/components/ui/tag.tsx +68 -0
- package/client/components/ui/textarea.tsx +1 -4
- package/client/components/ui/toast.tsx +9 -19
- package/client/components/ui/toaster.tsx +1 -1
- package/client/components/ui/toggle-group.tsx +20 -3
- package/client/components/ui/toggle.tsx +13 -13
- package/client/components/ui/tooltip.tsx +147 -10
- package/client/global.css +5421 -1049
- package/client/storybook.css +1164 -0
- package/client/ui/AspectRatio.stories.tsx +1 -1
- package/client/ui/Button.stories.tsx +5 -5
- package/client/ui/Card.stories.tsx +223 -2
- package/client/ui/CodeBadge.stories.tsx +76 -0
- package/client/ui/Dialog.stories.tsx +52 -5
- package/client/ui/Icons.stories.tsx +31 -31
- package/client/ui/Input.stories.tsx +125 -0
- package/client/ui/Label.stories.tsx +8 -11
- package/client/ui/Navigation.stories.tsx +1 -1
- package/client/ui/RadioGroup/RadioGroup.stories.tsx +1 -1
- package/client/ui/SearchField.stories.tsx +1 -1
- package/client/ui/{Select/Select.stories.tsx → Select.stories.tsx} +2 -2
- package/client/ui/{Switch/Switch.stories.tsx → Switch.stories.tsx} +3 -3
- package/client/ui/Tabs.stories.tsx +174 -10
- package/client/ui/Tag.stories.tsx +48 -1
- package/client/ui/{Textarea/Textarea.stories.tsx → Textarea.stories.tsx} +9 -10
- package/client/ui/Toggle.stories.tsx +3 -3
- package/client/ui/Tooltip.stories.tsx +28 -4
- package/dist/ui/index.cjs.js +1 -1
- package/dist/ui/index.d.ts +4 -6
- package/dist/ui/index.es.js +1227 -2235
- package/dist/ui/ui-library.css +1 -0
- package/package.json +3 -3
- package/client/components/ui/Navigation.tsx +0 -958
- package/client/components/ui/StrategyTable.tsx +0 -303
- package/client/components/ui/Tag.tsx +0 -127
- package/client/ui/Input/Input.stories.tsx +0 -69
- package/client/ui/StrategyTable.stories.tsx +0 -138
- package/client/ui/WELLDashboard/WELLDashboard.stories.tsx +0 -115
- package/client/ui/WELLDashboard/index.tsx +0 -317
- /package/client/hooks/{UseTabs.tsx → use-tabs.tsx} +0 -0
|
@@ -5,6 +5,21 @@ import * as TooltipPrimitive from "@radix-ui/react-tooltip";
|
|
|
5
5
|
|
|
6
6
|
import { cn } from "@/lib/utils";
|
|
7
7
|
|
|
8
|
+
type TriggerMode = "hover" | "click";
|
|
9
|
+
|
|
10
|
+
// Context for passing trigger mode and close function to children
|
|
11
|
+
const TooltipContext = React.createContext<{
|
|
12
|
+
trigger: TriggerMode;
|
|
13
|
+
toggle: () => void;
|
|
14
|
+
close: () => void;
|
|
15
|
+
triggerRef: React.RefObject<HTMLButtonElement | null>;
|
|
16
|
+
}>({
|
|
17
|
+
trigger: "hover",
|
|
18
|
+
toggle: () => {},
|
|
19
|
+
close: () => {},
|
|
20
|
+
triggerRef: { current: null },
|
|
21
|
+
});
|
|
22
|
+
|
|
8
23
|
function TooltipProvider({
|
|
9
24
|
delayDuration = 0,
|
|
10
25
|
...props
|
|
@@ -18,20 +33,114 @@ function TooltipProvider({
|
|
|
18
33
|
);
|
|
19
34
|
}
|
|
20
35
|
|
|
36
|
+
interface TooltipProps
|
|
37
|
+
extends Omit<
|
|
38
|
+
React.ComponentProps<typeof TooltipPrimitive.Root>,
|
|
39
|
+
"open" | "onOpenChange"
|
|
40
|
+
> {
|
|
41
|
+
/**
|
|
42
|
+
* Trigger mode: "hover" (default) or "click"
|
|
43
|
+
* - hover: Opens on mouse hover, closes on hover off (default tooltip behavior)
|
|
44
|
+
* - click: Opens on click, closes on trigger click or click outside
|
|
45
|
+
*/
|
|
46
|
+
trigger?: TriggerMode;
|
|
47
|
+
/** Controlled open state (optional) */
|
|
48
|
+
open?: boolean;
|
|
49
|
+
/** Callback when open state changes (optional) */
|
|
50
|
+
onOpenChange?: (open: boolean) => void;
|
|
51
|
+
}
|
|
52
|
+
|
|
21
53
|
function Tooltip({
|
|
54
|
+
trigger = "hover",
|
|
55
|
+
open: controlledOpen,
|
|
56
|
+
onOpenChange,
|
|
57
|
+
children,
|
|
22
58
|
...props
|
|
23
|
-
}:
|
|
59
|
+
}: TooltipProps) {
|
|
60
|
+
const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);
|
|
61
|
+
const triggerRef = React.useRef<HTMLButtonElement>(null);
|
|
62
|
+
|
|
63
|
+
// Use controlled or uncontrolled state
|
|
64
|
+
const isControlled = controlledOpen !== undefined;
|
|
65
|
+
const isOpen = isControlled ? controlledOpen : uncontrolledOpen;
|
|
66
|
+
|
|
67
|
+
const handleOpenChange = React.useCallback(
|
|
68
|
+
(newOpen: boolean) => {
|
|
69
|
+
// For click mode, ignore hover-triggered changes
|
|
70
|
+
if (trigger === "click") return;
|
|
71
|
+
|
|
72
|
+
if (!isControlled) {
|
|
73
|
+
setUncontrolledOpen(newOpen);
|
|
74
|
+
}
|
|
75
|
+
onOpenChange?.(newOpen);
|
|
76
|
+
},
|
|
77
|
+
[isControlled, onOpenChange, trigger],
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
const close = React.useCallback(() => {
|
|
81
|
+
if (!isControlled) {
|
|
82
|
+
setUncontrolledOpen(false);
|
|
83
|
+
}
|
|
84
|
+
onOpenChange?.(false);
|
|
85
|
+
}, [isControlled, onOpenChange]);
|
|
86
|
+
|
|
87
|
+
const toggle = React.useCallback(() => {
|
|
88
|
+
const newOpen = !isOpen;
|
|
89
|
+
if (!isControlled) {
|
|
90
|
+
setUncontrolledOpen(newOpen);
|
|
91
|
+
}
|
|
92
|
+
onOpenChange?.(newOpen);
|
|
93
|
+
}, [isOpen, isControlled, onOpenChange]);
|
|
94
|
+
|
|
95
|
+
// For click mode, we fully control open state
|
|
96
|
+
const tooltipProps =
|
|
97
|
+
trigger === "click"
|
|
98
|
+
? {
|
|
99
|
+
open: isOpen,
|
|
100
|
+
onOpenChange: handleOpenChange,
|
|
101
|
+
}
|
|
102
|
+
: {
|
|
103
|
+
open: isControlled ? controlledOpen : undefined,
|
|
104
|
+
onOpenChange,
|
|
105
|
+
};
|
|
106
|
+
|
|
24
107
|
return (
|
|
25
|
-
<
|
|
26
|
-
<
|
|
27
|
-
|
|
108
|
+
<TooltipContext.Provider value={{ trigger, toggle, close, triggerRef }}>
|
|
109
|
+
<TooltipProvider delayDuration={trigger === "click" ? 100000 : 0}>
|
|
110
|
+
<TooltipPrimitive.Root data-slot="tooltip" {...tooltipProps} {...props}>
|
|
111
|
+
{children}
|
|
112
|
+
</TooltipPrimitive.Root>
|
|
113
|
+
</TooltipProvider>
|
|
114
|
+
</TooltipContext.Provider>
|
|
28
115
|
);
|
|
29
116
|
}
|
|
30
117
|
|
|
31
118
|
function TooltipTrigger({
|
|
119
|
+
onClick,
|
|
32
120
|
...props
|
|
33
121
|
}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
|
|
34
|
-
|
|
122
|
+
const { trigger, toggle, triggerRef } = React.useContext(TooltipContext);
|
|
123
|
+
|
|
124
|
+
const handleClick = React.useCallback(
|
|
125
|
+
(e: React.MouseEvent<HTMLButtonElement>) => {
|
|
126
|
+
if (trigger === "click") {
|
|
127
|
+
e.preventDefault();
|
|
128
|
+
e.stopPropagation();
|
|
129
|
+
toggle();
|
|
130
|
+
}
|
|
131
|
+
onClick?.(e);
|
|
132
|
+
},
|
|
133
|
+
[trigger, toggle, onClick],
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
return (
|
|
137
|
+
<TooltipPrimitive.Trigger
|
|
138
|
+
ref={triggerRef}
|
|
139
|
+
data-slot="tooltip-trigger"
|
|
140
|
+
onClick={handleClick}
|
|
141
|
+
{...props}
|
|
142
|
+
/>
|
|
143
|
+
);
|
|
35
144
|
}
|
|
36
145
|
|
|
37
146
|
function TooltipContent({
|
|
@@ -42,21 +151,49 @@ function TooltipContent({
|
|
|
42
151
|
alignOffset = 0,
|
|
43
152
|
...props
|
|
44
153
|
}: React.ComponentProps<typeof TooltipPrimitive.Content>) {
|
|
154
|
+
const { trigger, close, triggerRef } = React.useContext(TooltipContext);
|
|
155
|
+
const contentRef = React.useRef<HTMLDivElement>(null);
|
|
156
|
+
|
|
157
|
+
// Click outside detection for click mode
|
|
158
|
+
React.useEffect(() => {
|
|
159
|
+
if (trigger !== "click") return;
|
|
160
|
+
|
|
161
|
+
const handleClickOutside = (event: MouseEvent) => {
|
|
162
|
+
const target = event.target as Node;
|
|
163
|
+
const isOutsideContent =
|
|
164
|
+
contentRef.current && !contentRef.current.contains(target);
|
|
165
|
+
const isOutsideTrigger =
|
|
166
|
+
triggerRef.current && !triggerRef.current.contains(target);
|
|
167
|
+
|
|
168
|
+
if (isOutsideContent && isOutsideTrigger) {
|
|
169
|
+
close();
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
// Small delay to avoid closing immediately on the same click that opened it
|
|
174
|
+
const timeoutId = setTimeout(() => {
|
|
175
|
+
document.addEventListener("click", handleClickOutside);
|
|
176
|
+
}, 0);
|
|
177
|
+
|
|
178
|
+
return () => {
|
|
179
|
+
clearTimeout(timeoutId);
|
|
180
|
+
document.removeEventListener("click", handleClickOutside);
|
|
181
|
+
};
|
|
182
|
+
}, [trigger, close, triggerRef]);
|
|
183
|
+
|
|
45
184
|
return (
|
|
46
185
|
<TooltipPrimitive.Portal>
|
|
47
186
|
<TooltipPrimitive.Content
|
|
187
|
+
ref={contentRef}
|
|
48
188
|
data-slot="tooltip-content"
|
|
49
189
|
sideOffset={sideOffset}
|
|
50
190
|
alignOffset={alignOffset}
|
|
51
191
|
side={side}
|
|
52
|
-
className={cn(
|
|
53
|
-
"group relative bg-gray-700 animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-lg px-6 pt-8 pb-6 text-balance shadow-sm",
|
|
54
|
-
className,
|
|
55
|
-
)}
|
|
192
|
+
className={cn("tooltip-content", className)}
|
|
56
193
|
{...props}
|
|
57
194
|
>
|
|
58
195
|
{/* Marker/Arrow */}
|
|
59
|
-
<div className="
|
|
196
|
+
<div className="tooltip-arrow" data-side={side}>
|
|
60
197
|
<svg
|
|
61
198
|
xmlns="http://www.w3.org/2000/svg"
|
|
62
199
|
width="10"
|