@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.
- package/dist/cjs/index.js +8058 -343
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/components/NewDropdown.d.ts +58 -0
- package/dist/esm/components/NewDropdown.d.ts.map +1 -0
- package/dist/esm/components/NewDropdown.js +105 -0
- package/dist/esm/components/NewDropdown.js.map +1 -0
- package/dist/esm/components/Popover.d.ts +15 -0
- package/dist/esm/components/Popover.d.ts.map +1 -0
- package/dist/esm/components/Popover.js +20 -0
- package/dist/esm/components/Popover.js.map +1 -0
- package/dist/esm/components/index.d.ts +2 -0
- package/dist/esm/components/index.d.ts.map +1 -1
- package/dist/esm/components/index.js +2 -0
- package/dist/esm/components/index.js.map +1 -1
- package/dist/esm/lib/utils.d.ts +2 -0
- package/dist/esm/lib/utils.d.ts.map +1 -1
- package/dist/esm/lib/utils.js +9 -0
- package/dist/esm/lib/utils.js.map +1 -1
- package/dist/esm/stories/NewDropdown.stories.d.ts +8 -0
- package/dist/esm/stories/NewDropdown.stories.d.ts.map +1 -0
- package/dist/esm/stories/NewDropdown.stories.js +136 -0
- package/dist/esm/stories/NewDropdown.stories.js.map +1 -0
- package/dist/esm/stories/Popover.stories.d.ts +11 -0
- package/dist/esm/stories/Popover.stories.d.ts.map +1 -0
- package/dist/esm/stories/Popover.stories.js +33 -0
- package/dist/esm/stories/Popover.stories.js.map +1 -0
- package/dist/sparkle.css +361 -1
- package/package.json +6 -1
- package/src/components/NewDropdown.tsx +315 -0
- package/src/components/Popover.tsx +67 -0
- package/src/components/index.ts +19 -1
- package/src/lib/utils.ts +7 -0
- package/src/stories/NewDropdown.stories.tsx +282 -0
- 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
|
+
}
|