@dust-tt/sparkle 0.2.260 → 0.2.261

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 (34) hide show
  1. package/dist/cjs/index.js +8058 -343
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/esm/components/NewDropdown.d.ts +58 -0
  4. package/dist/esm/components/NewDropdown.d.ts.map +1 -0
  5. package/dist/esm/components/NewDropdown.js +105 -0
  6. package/dist/esm/components/NewDropdown.js.map +1 -0
  7. package/dist/esm/components/Popover.d.ts +15 -0
  8. package/dist/esm/components/Popover.d.ts.map +1 -0
  9. package/dist/esm/components/Popover.js +20 -0
  10. package/dist/esm/components/Popover.js.map +1 -0
  11. package/dist/esm/components/index.d.ts +2 -0
  12. package/dist/esm/components/index.d.ts.map +1 -1
  13. package/dist/esm/components/index.js +2 -0
  14. package/dist/esm/components/index.js.map +1 -1
  15. package/dist/esm/lib/utils.d.ts +2 -0
  16. package/dist/esm/lib/utils.d.ts.map +1 -1
  17. package/dist/esm/lib/utils.js +9 -0
  18. package/dist/esm/lib/utils.js.map +1 -1
  19. package/dist/esm/stories/NewDropdown.stories.d.ts +8 -0
  20. package/dist/esm/stories/NewDropdown.stories.d.ts.map +1 -0
  21. package/dist/esm/stories/NewDropdown.stories.js +136 -0
  22. package/dist/esm/stories/NewDropdown.stories.js.map +1 -0
  23. package/dist/esm/stories/Popover.stories.d.ts +11 -0
  24. package/dist/esm/stories/Popover.stories.d.ts.map +1 -0
  25. package/dist/esm/stories/Popover.stories.js +33 -0
  26. package/dist/esm/stories/Popover.stories.js.map +1 -0
  27. package/dist/sparkle.css +361 -1
  28. package/package.json +6 -1
  29. package/src/components/NewDropdown.tsx +315 -0
  30. package/src/components/Popover.tsx +67 -0
  31. package/src/components/index.ts +19 -1
  32. package/src/lib/utils.ts +7 -0
  33. package/src/stories/NewDropdown.stories.tsx +282 -0
  34. package/src/stories/Popover.stories.tsx +102 -0
@@ -0,0 +1,315 @@
1
+ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
2
+ import * as React from "react";
3
+
4
+ import {
5
+ CheckIcon,
6
+ ChevronRightIcon,
7
+ CircleIcon,
8
+ Icon,
9
+ } from "@sparkle/index_with_tw_base";
10
+ import { cn } from "@sparkle/lib/utils";
11
+
12
+ export const menuStyleClasses = {
13
+ inset: "s-pl-8",
14
+ container: cn(
15
+ "s-rounded-lg s-border s-border-hovering s-bg-white s-p-1 s-text-primary-950",
16
+ "s-z-50 s-min-w-[8rem] s-overflow-hidden",
17
+ "data-[state=open]:s-animate-in data-[state=closed]:s-animate-out data-[state=closed]:s-fade-out-0 data-[state=open]:s-fade-in-0 data-[state=closed]:s-zoom-out-95 data-[state=open]:s-zoom-in-95 data-[side=bottom]:s-slide-in-from-top-2 data-[side=left]:s-slide-in-from-right-2 data-[side=right]:s-slide-in-from-left-2 data-[side=top]:s-slide-in-from-bottom-2"
18
+ ),
19
+ item: cn(
20
+ "s-relative s-flex s-gap-2 s-cursor-pointer s-select-none s-items-center s-outline-none",
21
+ "s-rounded-md s-text-sm s-font-medium focus:s-text-primary-950 focus:s-bg-primary-100 s-px-2 s-py-2",
22
+ "s-transition-colors s-duration-300 data-[disabled]:s-pointer-events-none data-[disabled]:s-text-primary-400"
23
+ ),
24
+ subTrigger: {
25
+ default: "s-mr-1 s-ml-auto s-tracking-widest s-text-primary-400",
26
+ span: "s-absolute s-left-2 s-flex s-h-3.5 s-w-3.5 s-items-center s-justify-center",
27
+ },
28
+ label: "s-font-semibold s-px-2 s-py-2 s-text-xs s-text-muted-foreground",
29
+ description:
30
+ "s-grow s-truncate s-text-sm s-font-regular s-text-element-700 dark:s-text-element-600-dark",
31
+ separator: "-s-mx-1 s-my-1 s-h-px s-bg-separator",
32
+ shortcut: "s-ml-auto s-text-xs s-tracking-widest s-text-primary-400",
33
+ };
34
+
35
+ const NewDropdownMenu = DropdownMenuPrimitive.Root;
36
+ const NewDropdownMenuGroup = DropdownMenuPrimitive.Group;
37
+ const NewDropdownMenuPortal = DropdownMenuPrimitive.Portal;
38
+ const NewDropdownMenuSub = DropdownMenuPrimitive.Sub;
39
+ const NewDropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
40
+ const NewDropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
41
+
42
+ interface LabelAndIconProps {
43
+ label: string;
44
+ icon?: React.ComponentType;
45
+ }
46
+
47
+ type Simplify<T> = { [K in keyof T]: T[K] };
48
+
49
+ type EitherChildrenOrProps<BaseProps, ExtraProps> =
50
+ | (BaseProps & ExtraProps & { children?: never })
51
+ | (BaseProps & { [K in keyof ExtraProps]?: never });
52
+
53
+ type MutuallyExclusiveProps<BaseProps, ExtraProps> = Simplify<
54
+ EitherChildrenOrProps<BaseProps, ExtraProps>
55
+ >;
56
+
57
+ interface ItemWithLabelIconAndDescriptionProps {
58
+ label?: string;
59
+ icon?: React.ComponentType;
60
+ description?: string;
61
+ children?: React.ReactNode;
62
+ }
63
+
64
+ const ItemWithLabelIconAndDescription = <
65
+ T extends ItemWithLabelIconAndDescriptionProps,
66
+ >({
67
+ label,
68
+ icon,
69
+ description,
70
+ children,
71
+ }: T) => {
72
+ return (
73
+ <>
74
+ {label && (
75
+ <div className="s-grid s-grid-cols-[auto,1fr] s-gap-x-1">
76
+ {icon && (
77
+ <div
78
+ className={cn(
79
+ "s-flex",
80
+ description ? "s-items-start s-pt-0.5" : "s-items-center"
81
+ )}
82
+ >
83
+ <Icon size="xs" visual={icon} />
84
+ </div>
85
+ )}
86
+ <div className="s-flex s-flex-col">
87
+ <span>{label}</span>
88
+ {description && (
89
+ <span className={menuStyleClasses.description}>
90
+ {description}
91
+ </span>
92
+ )}
93
+ </div>
94
+ </div>
95
+ )}
96
+ {children}
97
+ </>
98
+ );
99
+ };
100
+
101
+ const NewDropdownMenuSubTrigger = React.forwardRef<
102
+ React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,
103
+ MutuallyExclusiveProps<
104
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger>,
105
+ LabelAndIconProps
106
+ > & {
107
+ inset?: boolean;
108
+ }
109
+ >(({ className, label, icon, children, inset, ...props }, ref) => (
110
+ <DropdownMenuPrimitive.SubTrigger
111
+ ref={ref}
112
+ className={cn(
113
+ menuStyleClasses.item,
114
+ inset ? menuStyleClasses.inset : "",
115
+ className || ""
116
+ )}
117
+ {...props}
118
+ >
119
+ {label && (
120
+ <>
121
+ {icon && <Icon size="xs" visual={icon} />}
122
+ {label}
123
+ <span className={menuStyleClasses.subTrigger.default}>
124
+ <Icon size="xs" visual={ChevronRightIcon} />
125
+ </span>
126
+ </>
127
+ )}
128
+ {children}
129
+ </DropdownMenuPrimitive.SubTrigger>
130
+ ));
131
+ NewDropdownMenuSubTrigger.displayName =
132
+ DropdownMenuPrimitive.SubTrigger.displayName;
133
+
134
+ const NewDropdownMenuSubContent = React.forwardRef<
135
+ React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,
136
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>
137
+ >(({ className, ...props }, ref) => (
138
+ <DropdownMenuPrimitive.SubContent
139
+ ref={ref}
140
+ className={cn(menuStyleClasses.container, "s-shadow-lg", className || "")}
141
+ {...props}
142
+ />
143
+ ));
144
+ NewDropdownMenuSubContent.displayName =
145
+ DropdownMenuPrimitive.SubContent.displayName;
146
+
147
+ const NewDropdownMenuContent = React.forwardRef<
148
+ React.ElementRef<typeof DropdownMenuPrimitive.Content>,
149
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>
150
+ >(({ className, sideOffset = 4, ...props }, ref) => (
151
+ <DropdownMenuPrimitive.Portal>
152
+ <DropdownMenuPrimitive.Content
153
+ ref={ref}
154
+ sideOffset={sideOffset}
155
+ className={cn(menuStyleClasses.container, "s-shadow-md", className || "")}
156
+ {...props}
157
+ />
158
+ </DropdownMenuPrimitive.Portal>
159
+ ));
160
+ NewDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
161
+
162
+ const NewDropdownMenuItem = React.forwardRef<
163
+ React.ElementRef<typeof DropdownMenuPrimitive.Item>,
164
+ MutuallyExclusiveProps<
165
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {
166
+ inset?: boolean;
167
+ },
168
+ LabelAndIconProps & { description?: string }
169
+ >
170
+ >(({ children, description, className, inset, icon, label, ...props }, ref) => (
171
+ <DropdownMenuPrimitive.Item
172
+ ref={ref}
173
+ className={cn(
174
+ menuStyleClasses.item,
175
+ inset ? menuStyleClasses.inset : "",
176
+ className || ""
177
+ )}
178
+ {...props}
179
+ >
180
+ <ItemWithLabelIconAndDescription
181
+ label={label}
182
+ icon={icon}
183
+ description={description}
184
+ >
185
+ {children}
186
+ </ItemWithLabelIconAndDescription>
187
+ </DropdownMenuPrimitive.Item>
188
+ ));
189
+ NewDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
190
+
191
+ const NewDropdownMenuCheckboxItem = React.forwardRef<
192
+ React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,
193
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>
194
+ >(({ className, children, checked, ...props }, ref) => (
195
+ <DropdownMenuPrimitive.CheckboxItem
196
+ ref={ref}
197
+ className={cn(
198
+ menuStyleClasses.item,
199
+ menuStyleClasses.inset,
200
+ className || ""
201
+ )}
202
+ checked={checked}
203
+ {...props}
204
+ >
205
+ <span className={menuStyleClasses.subTrigger.span}>
206
+ <DropdownMenuPrimitive.ItemIndicator>
207
+ <Icon size="xs" visual={CheckIcon} />
208
+ </DropdownMenuPrimitive.ItemIndicator>
209
+ </span>
210
+ {children}
211
+ </DropdownMenuPrimitive.CheckboxItem>
212
+ ));
213
+ NewDropdownMenuCheckboxItem.displayName =
214
+ DropdownMenuPrimitive.CheckboxItem.displayName;
215
+
216
+ const NewDropdownMenuRadioItem = React.forwardRef<
217
+ React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,
218
+ MutuallyExclusiveProps<
219
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>,
220
+ LabelAndIconProps & { description?: string }
221
+ >
222
+ >(({ className, children, description, label, icon, ...props }, ref) => (
223
+ <DropdownMenuPrimitive.RadioItem
224
+ ref={ref}
225
+ className={cn(
226
+ menuStyleClasses.item,
227
+ menuStyleClasses.inset,
228
+ className || ""
229
+ )}
230
+ {...props}
231
+ >
232
+ <span className={menuStyleClasses.subTrigger.span}>
233
+ <DropdownMenuPrimitive.ItemIndicator>
234
+ <Icon size="xs" visual={CircleIcon} />
235
+ </DropdownMenuPrimitive.ItemIndicator>
236
+ </span>
237
+ <ItemWithLabelIconAndDescription
238
+ label={label}
239
+ icon={icon}
240
+ description={description}
241
+ >
242
+ {children}
243
+ </ItemWithLabelIconAndDescription>
244
+ </DropdownMenuPrimitive.RadioItem>
245
+ ));
246
+ NewDropdownMenuRadioItem.displayName =
247
+ DropdownMenuPrimitive.RadioItem.displayName;
248
+
249
+ const NewDropdownMenuLabel = React.forwardRef<
250
+ React.ElementRef<typeof DropdownMenuPrimitive.Label>,
251
+ MutuallyExclusiveProps<
252
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {
253
+ inset?: boolean;
254
+ },
255
+ LabelAndIconProps
256
+ >
257
+ >(({ children, className, inset, label, ...props }, ref) => (
258
+ <DropdownMenuPrimitive.Label
259
+ ref={ref}
260
+ className={cn(
261
+ menuStyleClasses.label,
262
+ inset ? menuStyleClasses.inset : "",
263
+ className || ""
264
+ )}
265
+ {...props}
266
+ >
267
+ {label && <>{label}</>}
268
+ {children}
269
+ </DropdownMenuPrimitive.Label>
270
+ ));
271
+ NewDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
272
+
273
+ const NewDropdownMenuSeparator = React.forwardRef<
274
+ React.ElementRef<typeof DropdownMenuPrimitive.Separator>,
275
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>
276
+ >(({ className, ...props }, ref) => (
277
+ <DropdownMenuPrimitive.Separator
278
+ ref={ref}
279
+ className={cn(menuStyleClasses.separator, className || "")}
280
+ {...props}
281
+ />
282
+ ));
283
+ NewDropdownMenuSeparator.displayName =
284
+ DropdownMenuPrimitive.Separator.displayName;
285
+
286
+ const NewDropdownMenuShortcut = ({
287
+ className,
288
+ ...props
289
+ }: React.HTMLAttributes<HTMLSpanElement>) => {
290
+ return (
291
+ <span
292
+ className={cn(menuStyleClasses.shortcut, className || "")}
293
+ {...props}
294
+ />
295
+ );
296
+ };
297
+ NewDropdownMenuShortcut.displayName = "NewDropdownMenuShortcut";
298
+
299
+ export {
300
+ NewDropdownMenu,
301
+ NewDropdownMenuCheckboxItem,
302
+ NewDropdownMenuContent,
303
+ NewDropdownMenuGroup,
304
+ NewDropdownMenuItem,
305
+ NewDropdownMenuLabel,
306
+ NewDropdownMenuPortal,
307
+ NewDropdownMenuRadioGroup,
308
+ NewDropdownMenuRadioItem,
309
+ NewDropdownMenuSeparator,
310
+ NewDropdownMenuShortcut,
311
+ NewDropdownMenuSub,
312
+ NewDropdownMenuSubContent,
313
+ NewDropdownMenuSubTrigger,
314
+ NewDropdownMenuTrigger,
315
+ };
@@ -0,0 +1,67 @@
1
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
2
+ import * as React from "react";
3
+
4
+ import { cn } from "@sparkle/lib/utils";
5
+
6
+ const PopoverRoot = PopoverPrimitive.Root;
7
+
8
+ const PopoverTrigger = PopoverPrimitive.Trigger;
9
+
10
+ interface PopoverContentProps
11
+ extends React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> {
12
+ fullWidth?: boolean;
13
+ }
14
+
15
+ const PopoverContent = React.forwardRef<
16
+ React.ElementRef<typeof PopoverPrimitive.Content>,
17
+ PopoverContentProps
18
+ >(
19
+ (
20
+ {
21
+ className,
22
+ align = "center",
23
+ sideOffset = 4,
24
+ fullWidth = false,
25
+ ...props
26
+ },
27
+ ref
28
+ ) => (
29
+ <PopoverPrimitive.Portal>
30
+ <PopoverPrimitive.Content
31
+ ref={ref}
32
+ align={align}
33
+ sideOffset={sideOffset}
34
+ className={cn(
35
+ "data-[state=open]:s-animate-in data-[state=open]:s-fade-in-0 data-[state=open]:s-zoom-in-95",
36
+ "data-[state=closed]:s-animate-out data-[state=closed]:s-fade-out-0 data-[state=closed]:s-zoom-out-95",
37
+ "data-[side=bottom]:s-slide-in-from-top-2",
38
+ "data-[side=left]:s-slide-in-from-right-2",
39
+ "data-[side=right]:s-slide-in-from-left-2",
40
+ "data-[side=top]:s-slide-in-from-bottom-2",
41
+ "s-border-border s-text-primary-950 s-z-50 s-rounded-lg s-border s-bg-background s-shadow-md s-outline-none",
42
+ fullWidth ? "s-grow" : "s-w-72 s-p-4",
43
+ className
44
+ )}
45
+ {...props}
46
+ />
47
+ </PopoverPrimitive.Portal>
48
+ )
49
+ );
50
+
51
+ interface PopoverProps extends Omit<PopoverContentProps, "content"> {
52
+ trigger: React.ReactNode;
53
+ content: React.ReactNode;
54
+ }
55
+
56
+ function Popover({ trigger, content, ...props }: PopoverProps) {
57
+ return (
58
+ <PopoverRoot>
59
+ <PopoverTrigger>{trigger}</PopoverTrigger>
60
+ <PopoverContent {...props}>{content}</PopoverContent>
61
+ </PopoverRoot>
62
+ );
63
+ }
64
+
65
+ PopoverContent.displayName = PopoverPrimitive.Content.displayName;
66
+
67
+ export { Popover, PopoverContent, PopoverRoot, PopoverTrigger };
@@ -31,10 +31,28 @@ export { Input } from "./Input";
31
31
  export { Item } from "./Item";
32
32
  export { Markdown } from "./Markdown";
33
33
  export { Modal } from "./Modal";
34
+ export {
35
+ NewDropdownMenu,
36
+ NewDropdownMenuCheckboxItem,
37
+ NewDropdownMenuContent,
38
+ NewDropdownMenuGroup,
39
+ NewDropdownMenuItem,
40
+ NewDropdownMenuLabel,
41
+ NewDropdownMenuPortal,
42
+ NewDropdownMenuRadioGroup,
43
+ NewDropdownMenuRadioItem,
44
+ NewDropdownMenuSeparator,
45
+ NewDropdownMenuShortcut,
46
+ NewDropdownMenuSub,
47
+ NewDropdownMenuSubContent,
48
+ NewDropdownMenuSubTrigger,
49
+ NewDropdownMenuTrigger,
50
+ } from "./NewDropdown";
34
51
  export { Notification } from "./Notification";
35
52
  export { Page } from "./Page";
36
53
  export { PaginatedCitationsGrid } from "./PaginatedCitationsGrid";
37
54
  export { Pagination } from "./Pagination";
55
+ export { Popover, PopoverContent, PopoverRoot, PopoverTrigger } from "./Popover";
38
56
  export { Popup } from "./Popup";
39
57
  export { PriceTable } from "./PriceTable";
40
58
  export { RadioButton } from "./RadioButton";
@@ -52,4 +70,4 @@ export {
52
70
  TooltipTrigger,
53
71
  } from "./Tooltip";
54
72
  export { Tree } from "./Tree";
55
- export { ZoomableImageCitationWrapper } from "./ZoomableImageCitationWrapper";
73
+ export { ZoomableImageCitationWrapper } from "./ZoomableImageCitationWrapper";
package/src/lib/utils.ts CHANGED
@@ -1,4 +1,7 @@
1
+ import type { ClassValue } from "clsx";
2
+ import { clsx } from "clsx";
1
3
  import { useCallback, useState } from "react";
4
+ import { twMerge } from "tailwind-merge";
2
5
 
3
6
  export function classNames(...classes: string[]) {
4
7
  return classes.filter(Boolean).join(" ");
@@ -35,3 +38,7 @@ export function useCopyToClipboard(
35
38
 
36
39
  return [isCopied, copy];
37
40
  }
41
+
42
+ export function cn(...inputs: ClassValue[]) {
43
+ return twMerge(clsx(inputs));
44
+ }