@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.
Files changed (100) hide show
  1. package/client/components/icons/AchievementBadges.tsx +33 -0
  2. package/client/components/icons/ConceptIcons.tsx +169 -22
  3. package/client/components/icons/NavLogo.tsx +4 -4
  4. package/client/components/icons/ProviderBadges.tsx +28 -28
  5. package/client/components/icons/ProviderSeals.tsx +35 -35
  6. package/client/components/icons/StandardLogo.tsx +47 -0
  7. package/client/components/icons/UtilityChevronDown.tsx +1 -1
  8. package/client/components/icons/UtilityClearRegular.tsx +43 -0
  9. package/client/components/icons/UtilityCompare.tsx +71 -0
  10. package/client/components/icons/UtilityHome.tsx +26 -0
  11. package/client/components/icons/UtilityReset.tsx +7 -7
  12. package/client/components/icons/UtilitySave.tsx +35 -0
  13. package/client/components/icons/UtilityScopeLarge.tsx +86 -0
  14. package/client/components/icons/UtilityShow.tsx +41 -0
  15. package/client/components/icons/UtilityTarget.tsx +21 -0
  16. package/client/components/icons/UtilityTargetActive.tsx +34 -0
  17. package/client/components/icons/UtilityText.tsx +8 -8
  18. package/client/components/ui/accordion.tsx +6 -9
  19. package/client/components/ui/alert-dialog.tsx +6 -19
  20. package/client/components/ui/alert.tsx +5 -6
  21. package/client/components/ui/avatar.tsx +3 -9
  22. package/client/components/ui/badge.tsx +5 -8
  23. package/client/components/ui/breadcrumb.tsx +24 -11
  24. package/client/components/ui/button.tsx +40 -56
  25. package/client/components/ui/calendar.tsx +24 -28
  26. package/client/components/ui/card.tsx +6 -9
  27. package/client/components/ui/carousel.tsx +14 -14
  28. package/client/components/ui/chart.tsx +25 -28
  29. package/client/components/ui/checkbox.tsx +3 -8
  30. package/client/components/ui/code-badge.tsx +22 -0
  31. package/client/components/ui/command.tsx +12 -48
  32. package/client/components/ui/context-menu.tsx +17 -32
  33. package/client/components/ui/dialog.tsx +9 -18
  34. package/client/components/ui/drawer.tsx +7 -13
  35. package/client/components/ui/dropdown-menu.tsx +17 -29
  36. package/client/components/ui/form.tsx +4 -4
  37. package/client/components/ui/hover-card.tsx +1 -4
  38. package/client/components/ui/input-otp.tsx +7 -10
  39. package/client/components/ui/input.tsx +34 -9
  40. package/client/components/ui/label.tsx +2 -4
  41. package/client/components/ui/menubar.tsx +19 -40
  42. package/client/components/ui/navigation-menu.tsx +10 -27
  43. package/client/components/ui/navigation.tsx +861 -0
  44. package/client/components/ui/pagination.tsx +8 -8
  45. package/client/components/ui/popover.tsx +1 -4
  46. package/client/components/ui/progress.tsx +2 -5
  47. package/client/components/ui/radio-group.tsx +4 -7
  48. package/client/components/ui/resizable.tsx +4 -10
  49. package/client/components/ui/scroll-area.tsx +5 -8
  50. package/client/components/ui/{SearchField.tsx → search.tsx} +7 -10
  51. package/client/components/ui/select.tsx +19 -44
  52. package/client/components/ui/separator.tsx +2 -2
  53. package/client/components/ui/sheet.tsx +12 -23
  54. package/client/components/ui/sidebar.tsx +55 -82
  55. package/client/components/ui/skeleton.tsx +1 -1
  56. package/client/components/ui/slider.tsx +4 -7
  57. package/client/components/ui/sonner.tsx +5 -8
  58. package/client/components/ui/switch.tsx +2 -9
  59. package/client/components/ui/table.tsx +9 -18
  60. package/client/components/ui/tabs.tsx +43 -203
  61. package/client/components/ui/tag.tsx +68 -0
  62. package/client/components/ui/textarea.tsx +1 -4
  63. package/client/components/ui/toast.tsx +9 -19
  64. package/client/components/ui/toaster.tsx +1 -1
  65. package/client/components/ui/toggle-group.tsx +20 -3
  66. package/client/components/ui/toggle.tsx +13 -13
  67. package/client/components/ui/tooltip.tsx +147 -10
  68. package/client/global.css +5421 -1049
  69. package/client/storybook.css +1164 -0
  70. package/client/ui/AspectRatio.stories.tsx +1 -1
  71. package/client/ui/Button.stories.tsx +5 -5
  72. package/client/ui/Card.stories.tsx +223 -2
  73. package/client/ui/CodeBadge.stories.tsx +76 -0
  74. package/client/ui/Dialog.stories.tsx +52 -5
  75. package/client/ui/Icons.stories.tsx +31 -31
  76. package/client/ui/Input.stories.tsx +125 -0
  77. package/client/ui/Label.stories.tsx +8 -11
  78. package/client/ui/Navigation.stories.tsx +1 -1
  79. package/client/ui/RadioGroup/RadioGroup.stories.tsx +1 -1
  80. package/client/ui/SearchField.stories.tsx +1 -1
  81. package/client/ui/{Select/Select.stories.tsx → Select.stories.tsx} +2 -2
  82. package/client/ui/{Switch/Switch.stories.tsx → Switch.stories.tsx} +3 -3
  83. package/client/ui/Tabs.stories.tsx +174 -10
  84. package/client/ui/Tag.stories.tsx +48 -1
  85. package/client/ui/{Textarea/Textarea.stories.tsx → Textarea.stories.tsx} +9 -10
  86. package/client/ui/Toggle.stories.tsx +3 -3
  87. package/client/ui/Tooltip.stories.tsx +28 -4
  88. package/dist/ui/index.cjs.js +1 -1
  89. package/dist/ui/index.d.ts +4 -6
  90. package/dist/ui/index.es.js +1227 -2235
  91. package/dist/ui/ui-library.css +1 -0
  92. package/package.json +3 -3
  93. package/client/components/ui/Navigation.tsx +0 -958
  94. package/client/components/ui/StrategyTable.tsx +0 -303
  95. package/client/components/ui/Tag.tsx +0 -127
  96. package/client/ui/Input/Input.stories.tsx +0 -69
  97. package/client/ui/StrategyTable.stories.tsx +0 -138
  98. package/client/ui/WELLDashboard/WELLDashboard.stories.tsx +0 -115
  99. package/client/ui/WELLDashboard/index.tsx +0 -317
  100. /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
- }: React.ComponentProps<typeof TooltipPrimitive.Root>) {
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
- <TooltipProvider>
26
- <TooltipPrimitive.Root data-slot="tooltip" {...props} />
27
- </TooltipProvider>
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
- return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />;
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="absolute left-1/2 -translate-x-1/2 flex justify-center group-data-[side=top]:bottom-0 group-data-[side=top]:rotate-180 group-data-[side=bottom]:top-0 group-data-[side=left]:right-0 group-data-[side=right]:left-0">
196
+ <div className="tooltip-arrow" data-side={side}>
60
197
  <svg
61
198
  xmlns="http://www.w3.org/2000/svg"
62
199
  width="10"