@dust-tt/sparkle 0.2.474 → 0.2.476

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.
@@ -12,6 +12,7 @@ import {
12
12
  DropdownMenuPortal,
13
13
  DropdownMenuRadioGroup,
14
14
  DropdownMenuRadioItem,
15
+ DropdownMenuSearchbar,
15
16
  DropdownMenuSeparator,
16
17
  DropdownMenuStaticItem,
17
18
  DropdownMenuSub,
@@ -55,8 +56,7 @@ import {
55
56
  MagnifyingGlassIcon,
56
57
  PlusIcon,
57
58
  RobotIcon,
58
- ScrollArea,
59
- SearchInput,
59
+ SearchDropdownMenu,
60
60
  SuitcaseIcon,
61
61
  UserGroupIcon,
62
62
  UserIcon,
@@ -87,6 +87,38 @@ export const PickerExamples = () => (
87
87
  </div>
88
88
  );
89
89
 
90
+ export const SearchDropdownMenuExamples = () => {
91
+ const [searchInputValue, setSearchInputValue] = React.useState("");
92
+
93
+ const items = ["Profile", "Billing", "Team", "Subscription"];
94
+
95
+ const filteredItems = items.filter((item) =>
96
+ item.toLowerCase().includes(searchInputValue.toLowerCase())
97
+ );
98
+
99
+ return (
100
+ <div className="s-flex s-h-80 s-w-full s-flex-col s-items-center s-justify-center s-gap-4 s-text-foreground dark:s-text-foreground-night">
101
+ <div>
102
+ <SearchDropdownMenu
103
+ searchInputValue={searchInputValue}
104
+ setSearchInputValue={setSearchInputValue}
105
+ >
106
+ {filteredItems.map((item) => (
107
+ <DropdownMenuItem
108
+ key={item}
109
+ label={item}
110
+ onClick={() => {
111
+ setSearchInputValue("");
112
+ window.alert(item);
113
+ }}
114
+ />
115
+ ))}
116
+ </SearchDropdownMenu>
117
+ </div>
118
+ </div>
119
+ );
120
+ };
121
+
90
122
  function SimpleDropdownDemo() {
91
123
  return (
92
124
  <DropdownMenu>
@@ -135,7 +167,11 @@ function ComplexDropdownDemo() {
135
167
  <DropdownMenuContent className="s-w-56">
136
168
  <DropdownMenuLabel label="My Account" />
137
169
  <DropdownMenuGroup>
138
- <DropdownMenuItem icon={UserIcon} label="Profile" />
170
+ <DropdownMenuItem
171
+ icon={UserIcon}
172
+ label="Profile"
173
+ endComponent={<Button icon={ArrowUpOnSquareIcon} variant="ghost" />}
174
+ />
139
175
  <DropdownMenuItem icon={ArrowDownCircleIcon} label="Billing" />
140
176
  <DropdownMenuItem icon={Cog6ToothIcon} label="Settings" />
141
177
  <DropdownMenuItem icon={UserIcon} label="Keyboard shortcuts" />
@@ -155,6 +191,14 @@ function ComplexDropdownDemo() {
155
191
  />
156
192
  <DropdownMenuSeparator />
157
193
  <DropdownMenuItem icon={UserIcon} label="More..." />
194
+ <DropdownMenuItem icon={UserIcon} label="More.." />
195
+ <DropdownMenuItem icon={UserIcon} label="More..." />
196
+ <DropdownMenuItem icon={UserIcon} label="More.." />
197
+ <DropdownMenuItem icon={UserIcon} label="More" />
198
+ <DropdownMenuItem icon={UserIcon} label="More....." />
199
+ <DropdownMenuItem icon={UserIcon} label="More.." />
200
+ <DropdownMenuItem icon={UserIcon} label="More" />
201
+ <DropdownMenuItem icon={UserIcon} label="More...." />
158
202
  </DropdownMenuSubContent>
159
203
  </DropdownMenuPortal>
160
204
  </DropdownMenuSub>
@@ -505,92 +549,90 @@ function AttachFileDemo() {
505
549
  size="sm"
506
550
  />
507
551
  </DropdownMenuTrigger>
508
- <DropdownMenuContent className="s-w-[380px]">
509
- <div className="s-flex s-gap-1.5 s-p-1.5">
510
- <SearchInput
511
- ref={searchInputRef}
512
- name="search"
552
+ <DropdownMenuContent
553
+ className="s-w-[380px]"
554
+ dropdownHeaders={
555
+ <DropdownMenuSearchbar
556
+ value={searchText}
513
557
  onChange={setSearchText}
514
- onKeyDown={() => {}}
558
+ name="search"
515
559
  placeholder="Search in Dust"
516
- value={searchText}
560
+ button={<Button icon={ArrowUpOnSquareIcon} label="Upload File" />}
517
561
  />
518
- <Button icon={ArrowUpOnSquareIcon} label="Upload File" />
519
- </div>
562
+ }
563
+ >
520
564
  <DropdownMenuSeparator />
521
- <ScrollArea className="s-h-[380px]">
522
- {searchText ? (
523
- filteredItems.map((item) => {
524
- const randomMainIcon =
525
- mainIcons[Math.floor(Math.random() * mainIcons.length)];
526
- const randomExtraIcon =
527
- extraIcons[Math.floor(Math.random() * extraIcons.length)];
528
- return (
529
- <DropdownMenuItem
530
- key={item}
531
- label={item}
532
- description="Company Space/Notion"
533
- icon={randomMainIcon}
534
- extraIcon={randomExtraIcon}
535
- onClick={() => {
536
- setSelectedItem(item);
537
- setSearchText("");
538
- }}
539
- truncateText
540
- />
541
- );
542
- })
543
- ) : (
544
- <div className="s-flex s-h-full s-w-full s-items-center s-justify-center s-py-8">
545
- <div className="s-flex s-flex-col s-items-center s-justify-center s-gap-0 s-text-center s-text-base s-font-semibold s-text-primary-400">
546
- <Icon visual={MagnifyingGlassIcon} size="sm" />
547
- Search in Dust
548
- </div>
565
+ {searchText ? (
566
+ filteredItems.map((item) => {
567
+ const randomMainIcon =
568
+ mainIcons[Math.floor(Math.random() * mainIcons.length)];
569
+ const randomExtraIcon =
570
+ extraIcons[Math.floor(Math.random() * extraIcons.length)];
571
+ return (
572
+ <DropdownMenuItem
573
+ key={item}
574
+ label={item}
575
+ description="Company Space/Notion"
576
+ icon={randomMainIcon}
577
+ extraIcon={randomExtraIcon}
578
+ onClick={() => {
579
+ setSelectedItem(item);
580
+ setSearchText("");
581
+ }}
582
+ truncateText
583
+ />
584
+ );
585
+ })
586
+ ) : (
587
+ <div className="s-flex s-h-full s-w-full s-items-center s-justify-center s-py-8">
588
+ <div className="s-flex s-flex-col s-items-center s-justify-center s-gap-0 s-text-center s-text-base s-font-semibold s-text-primary-400">
589
+ <Icon visual={MagnifyingGlassIcon} size="sm" />
590
+ Search in Dust
549
591
  </div>
550
- )}
551
- </ScrollArea>
592
+ </div>
593
+ )}
552
594
  </DropdownMenuContent>
553
595
  </DropdownMenu>
554
596
  <DropdownMenu open={openAgents} onOpenChange={setOpenAgents}>
555
597
  <DropdownMenuTrigger asChild>
556
598
  <Button icon={RobotIcon} variant="outline" size="sm" isSelect />
557
599
  </DropdownMenuTrigger>
558
- <DropdownMenuContent className="s-w-[380px]">
559
- <div className="s-flex s-gap-1.5 s-p-1.5">
560
- <SearchInput
600
+ <DropdownMenuContent
601
+ className="s-h-96 s-w-[380px]"
602
+ dropdownHeaders={
603
+ <DropdownMenuSearchbar
561
604
  ref={agentsSearchInputRef}
562
605
  name="search"
563
606
  onChange={() => {}}
564
607
  onKeyDown={() => {}}
565
608
  placeholder="Search Agents"
566
609
  value=""
610
+ button={<Button icon={PlusIcon} label="Create" />}
567
611
  />
568
- <Button icon={PlusIcon} label="Create" />
569
- </div>
612
+ }
613
+ >
570
614
  <DropdownMenuSeparator />
571
- <ScrollArea className="s-h-[380px]">
572
- {filteredAgents.map((agent) => {
573
- return (
574
- <DropdownMenuItem
575
- key={agent.name}
576
- label={agent.name}
577
- description={agent.description}
578
- icon={() => (
579
- <Avatar
580
- size="sm"
581
- emoji={agent.emoji}
582
- backgroundColor={agent.backgroundColor}
583
- />
584
- )}
585
- onClick={() => {
586
- setSelectedItem(agent.name);
587
- setSearchText("");
588
- }}
589
- truncateText
590
- />
591
- );
592
- })}
593
- </ScrollArea>
615
+ {filteredAgents.map((agent) => {
616
+ return (
617
+ <DropdownMenuItem
618
+ key={agent.name}
619
+ label={agent.name}
620
+ description={agent.description}
621
+ icon={() => (
622
+ <Avatar
623
+ size="sm"
624
+ emoji={agent.emoji}
625
+ backgroundColor={agent.backgroundColor}
626
+ />
627
+ )}
628
+ onClick={() => {
629
+ setSelectedItem(agent.name);
630
+ setSearchText("");
631
+ }}
632
+ truncateText
633
+ />
634
+ );
635
+ })}
594
636
  </DropdownMenuContent>
595
637
  </DropdownMenu>
596
638
  <DropdownMenu open={openToolsets} onOpenChange={setOpenToolsets}>
@@ -602,36 +644,36 @@ function AttachFileDemo() {
602
644
  size="sm"
603
645
  />
604
646
  </DropdownMenuTrigger>
605
- <DropdownMenuContent className="s-w-[380px]">
606
- <div className="s-flex s-gap-1.5 s-p-1.5">
607
- <SearchInput
647
+ <DropdownMenuContent
648
+ className="s-h-96 s-w-[380px]"
649
+ dropdownHeaders={
650
+ <DropdownMenuSearchbar
608
651
  ref={toolsetsSearchInputRef}
609
652
  name="search"
610
653
  onChange={() => {}}
611
654
  onKeyDown={() => {}}
612
655
  placeholder="Search Tools"
613
656
  value=""
657
+ button={<Button icon={PlusIcon} label="Add MCP Server" />}
614
658
  />
615
- <Button icon={PlusIcon} label="Add MCP Server" />
616
- </div>
659
+ }
660
+ >
617
661
  <DropdownMenuSeparator />
618
- <ScrollArea className="s-h-[380px]">
619
- {filteredToolsetList.map((toolset) => {
620
- return (
621
- <DropdownMenuItem
622
- key={toolset.name}
623
- label={toolset.name}
624
- description={toolset.description}
625
- icon={() => <Avatar size="sm" icon={toolset.icon} />}
626
- onClick={() => {
627
- setSelectedItem(toolset.name);
628
- setSearchText("");
629
- }}
630
- truncateText
631
- />
632
- );
633
- })}
634
- </ScrollArea>
662
+ {filteredToolsetList.map((toolset) => {
663
+ return (
664
+ <DropdownMenuItem
665
+ key={toolset.name}
666
+ label={toolset.name}
667
+ description={toolset.description}
668
+ icon={() => <Avatar size="sm" icon={toolset.icon} />}
669
+ onClick={() => {
670
+ setSelectedItem(toolset.name);
671
+ setSearchText("");
672
+ }}
673
+ truncateText
674
+ />
675
+ );
676
+ })}
635
677
  </DropdownMenuContent>
636
678
  </DropdownMenu>
637
679
  </div>
@@ -17,6 +17,8 @@ import {
17
17
  DustIcon,
18
18
  EyeIcon,
19
19
  FolderIcon,
20
+ HistoryIcon,
21
+ Icon,
20
22
  IconButton,
21
23
  PlusCircleIcon,
22
24
  Tree,
@@ -41,7 +43,7 @@ export const TreeExample = () => {
41
43
  return (
42
44
  <div className="s-flex s-flex-col s-gap-10">
43
45
  <div className="s-flex s-gap-10">
44
- <div className="s-flex s-w-44 s-flex-col s-gap-3">
46
+ <div className="s-flex s-flex-col s-gap-3">
45
47
  <div className="s-text-xl">Tree</div>
46
48
  <div>
47
49
  <Tree>
@@ -131,6 +133,21 @@ export const TreeExample = () => {
131
133
  </>
132
134
  }
133
135
  />
136
+
137
+ <Tree.Item
138
+ label="t"
139
+ visual={DocumentIcon}
140
+ type="leaf"
141
+ actions={
142
+ <div className="s-flex s-grow s-flex-row s-items-center s-justify-between">
143
+ <Button size="mini" variant="outline" icon={EyeIcon} />
144
+ <div className="s-flex s-flex-row s-items-center s-gap-1 s-text-sm s-text-muted-foreground">
145
+ <Icon visual={HistoryIcon} size="xs" />
146
+ 1y
147
+ </div>
148
+ </div>
149
+ }
150
+ />
134
151
  </Tree>
135
152
  </Tree.Item>
136
153
  <Tree.Item