@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,282 @@
1
+ import { DropdownMenuCheckboxItemProps } from "@radix-ui/react-dropdown-menu";
2
+ import type { Meta } from "@storybook/react";
3
+ import React from "react";
4
+
5
+ import {
6
+ NewDropdownMenu,
7
+ NewDropdownMenuCheckboxItem,
8
+ NewDropdownMenuContent,
9
+ NewDropdownMenuGroup,
10
+ NewDropdownMenuItem,
11
+ NewDropdownMenuLabel,
12
+ NewDropdownMenuPortal,
13
+ NewDropdownMenuRadioGroup,
14
+ NewDropdownMenuRadioItem,
15
+ NewDropdownMenuSeparator,
16
+ NewDropdownMenuSub,
17
+ NewDropdownMenuSubContent,
18
+ NewDropdownMenuSubTrigger,
19
+ NewDropdownMenuTrigger,
20
+ } from "@sparkle/components/NewDropdown";
21
+ import {
22
+ AnthropicLogo,
23
+ GithubLogo,
24
+ MistralLogo,
25
+ OpenaiLogo,
26
+ } from "@sparkle/logo/platforms";
27
+
28
+ import {
29
+ ArrowDownCircleIcon,
30
+ Button,
31
+ ChatBubbleBottomCenterPlusIcon,
32
+ CloudArrowDownIcon,
33
+ Cog6ToothIcon,
34
+ LogoutIcon,
35
+ MagicIcon,
36
+ UserGroupIcon,
37
+ UserIcon,
38
+ } from "../index_with_tw_base";
39
+
40
+ const meta = {
41
+ title: "NewPrimitives/Dropdown",
42
+ component: NewDropdownMenu,
43
+ } satisfies Meta<typeof NewDropdownMenu>;
44
+
45
+ export default meta;
46
+
47
+ export const DropdownExamples = () => (
48
+ <div className="s-flex s-h-80 s-w-full s-flex-col s-items-center s-justify-center s-gap-4">
49
+ <div>{SimpleDropdownDemo()}</div>
50
+ <div>{ComplexDropdownDemo()}</div>
51
+ <div>{DropdownMenuCheckboxes()}</div>
52
+ <div>{DropdownMenuRadioGroupDemo()}</div>
53
+ <div>{ModelsDropdownDemo()}</div>
54
+ <div>{ModelsDropdownRadioGroupDemo()}</div>
55
+ </div>
56
+ );
57
+
58
+ function SimpleDropdownDemo() {
59
+ return (
60
+ <NewDropdownMenu>
61
+ <NewDropdownMenuTrigger>Open Simple Dropdown</NewDropdownMenuTrigger>
62
+ <NewDropdownMenuContent>
63
+ <NewDropdownMenuLabel label="My Account" />
64
+ <NewDropdownMenuItem label="Profile" />
65
+ <NewDropdownMenuItem label="Billing" />
66
+ <NewDropdownMenuItem label="Team" />
67
+ <NewDropdownMenuItem label="Subscription" />
68
+ </NewDropdownMenuContent>
69
+ </NewDropdownMenu>
70
+ );
71
+ }
72
+
73
+ function ComplexDropdownDemo() {
74
+ return (
75
+ <NewDropdownMenu>
76
+ <NewDropdownMenuTrigger>Open Complex</NewDropdownMenuTrigger>
77
+ <NewDropdownMenuContent className="s-w-56">
78
+ <NewDropdownMenuLabel label="My Account" />
79
+ <NewDropdownMenuGroup>
80
+ <NewDropdownMenuItem icon={UserIcon} label="Profile" />
81
+ <NewDropdownMenuItem icon={ArrowDownCircleIcon} label="Billing" />
82
+ <NewDropdownMenuItem icon={Cog6ToothIcon} label="Settings" />
83
+ <NewDropdownMenuItem icon={UserIcon} label="Keyboard shortcuts" />
84
+ </NewDropdownMenuGroup>
85
+ <NewDropdownMenuSeparator />
86
+ <NewDropdownMenuGroup>
87
+ <NewDropdownMenuLabel label="Team" />
88
+ <NewDropdownMenuItem icon={UserIcon} label="Members" />
89
+ <NewDropdownMenuSub>
90
+ <NewDropdownMenuSubTrigger icon={UserIcon} label="Invite users" />
91
+ <NewDropdownMenuPortal>
92
+ <NewDropdownMenuSubContent>
93
+ <NewDropdownMenuItem icon={MagicIcon} label="Email" />
94
+ <NewDropdownMenuItem
95
+ icon={ChatBubbleBottomCenterPlusIcon}
96
+ label="Message"
97
+ />
98
+ <NewDropdownMenuSeparator />
99
+ <NewDropdownMenuItem icon={UserIcon} label="More..." />
100
+ </NewDropdownMenuSubContent>
101
+ </NewDropdownMenuPortal>
102
+ </NewDropdownMenuSub>
103
+ <NewDropdownMenuItem icon={UserGroupIcon} label="New Team" />
104
+ </NewDropdownMenuGroup>
105
+ <NewDropdownMenuSeparator />
106
+ <NewDropdownMenuItem icon={GithubLogo} label="GitHub" />
107
+ <NewDropdownMenuItem icon={UserIcon} label="Support" />
108
+ <NewDropdownMenuItem icon={CloudArrowDownIcon} label="API" disabled />
109
+ <NewDropdownMenuSeparator />
110
+ <NewDropdownMenuItem icon={LogoutIcon} label="Log out" />
111
+ </NewDropdownMenuContent>
112
+ </NewDropdownMenu>
113
+ );
114
+ }
115
+
116
+ type Checked = DropdownMenuCheckboxItemProps["checked"];
117
+
118
+ function DropdownMenuCheckboxes() {
119
+ const [showStatusBar, setShowStatusBar] = React.useState<Checked>(true);
120
+ const [showActivityBar, setShowActivityBar] = React.useState<Checked>(false);
121
+ const [showPanel, setShowPanel] = React.useState<Checked>(false);
122
+
123
+ return (
124
+ <NewDropdownMenu>
125
+ <NewDropdownMenuTrigger>Open Checkbox</NewDropdownMenuTrigger>
126
+ <NewDropdownMenuContent className="s-w-56">
127
+ <NewDropdownMenuLabel label="Appearance" />
128
+ <NewDropdownMenuSeparator />
129
+ <NewDropdownMenuCheckboxItem
130
+ checked={showStatusBar}
131
+ onCheckedChange={setShowStatusBar}
132
+ >
133
+ Status Bar
134
+ </NewDropdownMenuCheckboxItem>
135
+ <NewDropdownMenuCheckboxItem
136
+ checked={showActivityBar}
137
+ onCheckedChange={setShowActivityBar}
138
+ disabled
139
+ >
140
+ Activity Bar
141
+ </NewDropdownMenuCheckboxItem>
142
+ <NewDropdownMenuCheckboxItem
143
+ checked={showPanel}
144
+ onCheckedChange={setShowPanel}
145
+ >
146
+ Panel
147
+ </NewDropdownMenuCheckboxItem>
148
+ </NewDropdownMenuContent>
149
+ </NewDropdownMenu>
150
+ );
151
+ }
152
+
153
+ function DropdownMenuRadioGroupDemo() {
154
+ const [position, setPosition] = React.useState("bottom");
155
+
156
+ return (
157
+ <NewDropdownMenu>
158
+ <NewDropdownMenuTrigger>Open Radio Group</NewDropdownMenuTrigger>
159
+ <NewDropdownMenuContent className="s-w-56">
160
+ <NewDropdownMenuLabel label="Panel Position" />
161
+ <NewDropdownMenuSeparator />
162
+ <NewDropdownMenuRadioGroup value={position} onValueChange={setPosition}>
163
+ <NewDropdownMenuRadioItem value="top">Top</NewDropdownMenuRadioItem>
164
+ <NewDropdownMenuRadioItem value="bottom">
165
+ Bottom
166
+ </NewDropdownMenuRadioItem>
167
+ <NewDropdownMenuRadioItem value="right">
168
+ Right
169
+ </NewDropdownMenuRadioItem>
170
+ </NewDropdownMenuRadioGroup>
171
+ </NewDropdownMenuContent>
172
+ </NewDropdownMenu>
173
+ );
174
+ }
175
+
176
+ function ModelsDropdownDemo() {
177
+ const [selectedModel, setSelectedModel] = React.useState<string>("GPT4-o");
178
+ const bestPerformingModels = [
179
+ {
180
+ name: "GPT4-o",
181
+ description: "OpenAI's most advanced model.",
182
+ icon: OpenaiLogo,
183
+ },
184
+ {
185
+ name: "Claude 3.5 Sonnet",
186
+ description: "Anthropic's latest Claude 3.5 Sonnet model (200k context).",
187
+ icon: AnthropicLogo,
188
+ },
189
+ {
190
+ name: "Mistral Large",
191
+ description: "Mistral's `large 2` model (128k context).",
192
+ icon: MistralLogo,
193
+ },
194
+ ];
195
+
196
+ return (
197
+ <NewDropdownMenu>
198
+ <NewDropdownMenuTrigger>
199
+ <Button
200
+ type="select"
201
+ labelVisible={true}
202
+ label={selectedModel}
203
+ variant="secondary"
204
+ hasMagnifying={false}
205
+ size="sm"
206
+ />
207
+ </NewDropdownMenuTrigger>
208
+ <NewDropdownMenuContent>
209
+ <NewDropdownMenuLabel label="Best performing models" />
210
+ {bestPerformingModels.map((modelConfig) => (
211
+ <NewDropdownMenuItem
212
+ key={modelConfig.name}
213
+ label={modelConfig.name}
214
+ onClick={() => setSelectedModel(modelConfig.name)}
215
+ description={modelConfig.description}
216
+ icon={modelConfig.icon}
217
+ />
218
+ ))}
219
+ </NewDropdownMenuContent>
220
+ </NewDropdownMenu>
221
+ );
222
+ }
223
+
224
+ interface ModelConfig {
225
+ name: string;
226
+ description: string;
227
+ icon: React.ComponentType;
228
+ }
229
+
230
+ function ModelsDropdownRadioGroupDemo() {
231
+ const [selectedModel, setSelectedModel] = React.useState<string>("GPT4-o");
232
+
233
+ const bestPerformingModels: ModelConfig[] = [
234
+ {
235
+ name: "GPT4-o",
236
+ description: "OpenAI's most advanced model.",
237
+ icon: OpenaiLogo,
238
+ },
239
+ {
240
+ name: "Claude 3.5 Sonnet",
241
+ description: "Anthropic's latest Claude 3.5 Sonnet model (200k context).",
242
+ icon: AnthropicLogo,
243
+ },
244
+ {
245
+ name: "Mistral Large",
246
+ description: "Mistral's `large 2` model (128k context).",
247
+ icon: MistralLogo,
248
+ },
249
+ ];
250
+
251
+ return (
252
+ <NewDropdownMenu>
253
+ <NewDropdownMenuTrigger>
254
+ <Button
255
+ type="select"
256
+ labelVisible={true}
257
+ label={selectedModel}
258
+ variant="secondary"
259
+ hasMagnifying={false}
260
+ size="sm"
261
+ />
262
+ </NewDropdownMenuTrigger>
263
+ <NewDropdownMenuContent>
264
+ <NewDropdownMenuRadioGroup
265
+ value={selectedModel}
266
+ onValueChange={(value) => setSelectedModel(value)}
267
+ >
268
+ <NewDropdownMenuLabel label="Best performing models" />
269
+ {bestPerformingModels.map((modelConfig) => (
270
+ <NewDropdownMenuRadioItem
271
+ key={modelConfig.name}
272
+ label={modelConfig.name}
273
+ icon={modelConfig.icon}
274
+ description={modelConfig.description}
275
+ value={modelConfig.name}
276
+ />
277
+ ))}
278
+ </NewDropdownMenuRadioGroup>
279
+ </NewDropdownMenuContent>
280
+ </NewDropdownMenu>
281
+ );
282
+ }
@@ -0,0 +1,102 @@
1
+ import type { Meta } from "@storybook/react";
2
+ import React from "react";
3
+
4
+ import {
5
+ Button, EmojiPicker,
6
+ Input,
7
+ Popover,
8
+ PopoverContent,
9
+ PopoverRoot,
10
+ PopoverTrigger,
11
+ } from "../index_with_tw_base";
12
+
13
+ const meta = {
14
+ title: "Primitives/Popover",
15
+ component: Popover,
16
+ } satisfies Meta<typeof Popover>;
17
+
18
+ export default meta;
19
+
20
+ export function SimplePopoverExample () {
21
+ return (
22
+ <Popover
23
+ trigger={
24
+ <Button label="Popover" variant="secondary"/>
25
+ }
26
+ content={
27
+ <div className="s-grid s-gap-2 s-p-2">
28
+ <p>Lorem</p>
29
+ <p>Ipsum</p>
30
+ <p>Lorem</p>
31
+ <p>Ipsum</p>
32
+ </div>
33
+ }
34
+ side="right"
35
+ sideOffset={100}
36
+ />
37
+ );
38
+ }
39
+
40
+ export function PopoverExample() {
41
+ return (
42
+ <PopoverRoot>
43
+ <PopoverTrigger>
44
+ <Button label="Popover" variant="primary" />
45
+ </PopoverTrigger>
46
+ <PopoverContent className="s-p-4">
47
+ <div className="s-grid s-gap-4">
48
+ <div className="s-space-y-2">
49
+ <h4 className="s-font-medium s-leading-none s-pb-2">Dimensions</h4>
50
+ <p className="s-text-sm s-text-muted-foreground">
51
+ Set the dimensions for the layer.
52
+ </p>
53
+ </div>
54
+ <div className="s-grid s-gap-4">
55
+ <Input
56
+ name="width"
57
+ value="200px"
58
+ placeholder="Width"
59
+ className="s-col-span-2 s-h-8"
60
+ />
61
+ <Input
62
+ name="max-width"
63
+ value="300px"
64
+ placeholder="Max. width"
65
+ className="s-col-span-2 s-h-8"
66
+ />
67
+ <Input
68
+ name="height"
69
+ value="30px"
70
+ placeholder="Height"
71
+ className="s-col-span-2 s-h-8"
72
+ />
73
+ <Input
74
+ name="max-height"
75
+ value="100px"
76
+ placeholder="Max. height"
77
+ className="s-col-span-2 s-h-8"
78
+ />
79
+ </div>
80
+ </div>
81
+ </PopoverContent>
82
+ </PopoverRoot>
83
+ );
84
+ }
85
+
86
+ export function PopoverGrowingExample() {
87
+ return (
88
+ <Popover
89
+ fullWidth={true}
90
+ trigger={
91
+ <Button label="Emoji Picker Popover" variant="primary"></Button>
92
+ }
93
+ content={
94
+ <EmojiPicker
95
+ theme="light"
96
+ previewPosition="none"
97
+ onEmojiSelect={(emoji) => console.log(emoji)}
98
+ />
99
+ }
100
+ />
101
+ );
102
+ }