wuhp commited on
Commit
15bdbe0
·
verified ·
1 Parent(s): 98a5e80

Update components/Sidebar.tsx

Browse files
Files changed (1) hide show
  1. components/Sidebar.tsx +109 -37
components/Sidebar.tsx CHANGED
@@ -1,7 +1,8 @@
1
- import React from 'react';
 
2
  import { LAYER_DEFINITIONS } from '../constants';
3
  import { LayerType } from '../types';
4
- import { Box, Sparkles, LayoutTemplate, Circle } from 'lucide-react';
5
 
6
  interface SidebarProps {
7
  onOpenAIBuilder: () => void;
@@ -10,24 +11,40 @@ interface SidebarProps {
10
  }
11
 
12
  const Sidebar: React.FC<SidebarProps> = ({ onOpenAIBuilder, onSelectTemplate, isConnected }) => {
 
 
13
  const onDragStart = (event: React.DragEvent, layerType: LayerType) => {
14
  event.dataTransfer.setData('application/reactflow', layerType);
15
  event.dataTransfer.effectAllowed = 'move';
16
  };
17
 
18
  const categories = Array.from(new Set(Object.values(LAYER_DEFINITIONS).map(l => l.category)));
19
- const categoryOrder = ['Core', 'Convolution', 'Recurrent', 'Transformer', 'Normalization', 'Utility'];
20
- categories.sort((a, b) => categoryOrder.indexOf(a) - categoryOrder.indexOf(b));
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
  return (
23
  <aside className="w-64 bg-slate-900 border-r border-slate-800 flex flex-col h-full z-10">
24
- <div className="p-4 border-b border-slate-800 bg-slate-900">
25
- <h1 className="text-xl font-bold bg-gradient-to-r from-blue-400 to-violet-400 bg-clip-text text-transparent">
26
- Architecture Agents
27
- </h1>
28
- <p className="text-xs text-slate-500 mt-1">AI-Powered Model Builder</p>
 
 
29
 
30
- <div className="mt-4 grid grid-cols-2 gap-2">
31
  <button
32
  onClick={onOpenAIBuilder}
33
  className="flex flex-col items-center justify-center p-2 bg-purple-500/10 hover:bg-purple-500/20 border border-purple-500/30 rounded-lg text-purple-300 transition-colors group"
@@ -43,39 +60,94 @@ const Sidebar: React.FC<SidebarProps> = ({ onOpenAIBuilder, onSelectTemplate, is
43
  <span className="text-[10px] font-bold">Templates</span>
44
  </button>
45
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  </div>
47
 
48
  <div className="flex-1 overflow-y-auto p-4 space-y-6 scrollbar-thin scrollbar-thumb-slate-700">
49
- {categories.map(category => (
50
- <div key={category}>
51
- <h3 className="text-xs font-semibold text-slate-500 uppercase tracking-widest mb-3 flex items-center gap-2">
52
- {category}
53
- <div className="h-px flex-1 bg-slate-800"></div>
 
54
  </h3>
55
- <div className="grid grid-cols-1 gap-2">
56
- {Object.values(LAYER_DEFINITIONS)
57
- .filter(l => l.category === category)
58
- .map(layer => (
59
- <div
60
- key={layer.type}
61
- className="bg-slate-800 hover:bg-slate-750 p-3 rounded border border-slate-700 cursor-grab active:cursor-grabbing transition-colors group relative overflow-hidden"
62
- onDragStart={(event) => onDragStart(event, layer.type)}
63
- draggable
64
- >
65
- <div className="flex items-center gap-3 relative z-10">
66
- <div className={`p-1.5 rounded transition-colors group-hover:bg-slate-900 bg-slate-900/50`}>
67
- <Box size={14} className="text-slate-400 group-hover:text-blue-400" />
68
- </div>
69
- <div>
70
- <div className="text-sm font-medium text-slate-200 group-hover:text-white">{layer.label}</div>
71
- <div className="text-xs text-slate-500 leading-tight group-hover:text-slate-400">{layer.description}</div>
72
- </div>
73
  </div>
74
  </div>
75
- ))}
76
- </div>
 
 
 
 
 
77
  </div>
78
- ))}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  </div>
80
 
81
  <div className="p-4 border-t border-slate-800 text-[10px] text-slate-500 text-center flex items-center justify-center gap-2">
@@ -86,4 +158,4 @@ const Sidebar: React.FC<SidebarProps> = ({ onOpenAIBuilder, onSelectTemplate, is
86
  );
87
  };
88
 
89
- export default Sidebar;
 
1
+
2
+ import React, { useState } from 'react';
3
  import { LAYER_DEFINITIONS } from '../constants';
4
  import { LayerType } from '../types';
5
+ import { Box, Sparkles, LayoutTemplate, Circle, Search, X } from 'lucide-react';
6
 
7
  interface SidebarProps {
8
  onOpenAIBuilder: () => void;
 
11
  }
12
 
13
  const Sidebar: React.FC<SidebarProps> = ({ onOpenAIBuilder, onSelectTemplate, isConnected }) => {
14
+ const [searchQuery, setSearchQuery] = useState('');
15
+
16
  const onDragStart = (event: React.DragEvent, layerType: LayerType) => {
17
  event.dataTransfer.setData('application/reactflow', layerType);
18
  event.dataTransfer.effectAllowed = 'move';
19
  };
20
 
21
  const categories = Array.from(new Set(Object.values(LAYER_DEFINITIONS).map(l => l.category)));
22
+ const categoryOrder = ['Core', 'Convolution', 'Recurrent', 'Transformer', 'Normalization', 'GenAI', 'Utility', 'Merge'];
23
+ categories.sort((a, b) => {
24
+ const idxA = categoryOrder.indexOf(a);
25
+ const idxB = categoryOrder.indexOf(b);
26
+ if (idxA === -1) return 1;
27
+ if (idxB === -1) return -1;
28
+ return idxA - idxB;
29
+ });
30
+
31
+ const filteredLayers = Object.values(LAYER_DEFINITIONS).filter(layer =>
32
+ layer.label.toLowerCase().includes(searchQuery.toLowerCase()) ||
33
+ layer.description.toLowerCase().includes(searchQuery.toLowerCase()) ||
34
+ layer.type.toLowerCase().includes(searchQuery.toLowerCase())
35
+ );
36
 
37
  return (
38
  <aside className="w-64 bg-slate-900 border-r border-slate-800 flex flex-col h-full z-10">
39
+ <div className="p-4 border-b border-slate-800 bg-slate-900 space-y-4">
40
+ <div>
41
+ <h1 className="text-xl font-bold bg-gradient-to-r from-blue-400 to-violet-400 bg-clip-text text-transparent">
42
+ Architecture Agents
43
+ </h1>
44
+ <p className="text-xs text-slate-500 mt-1">AI-Powered Model Builder</p>
45
+ </div>
46
 
47
+ <div className="grid grid-cols-2 gap-2">
48
  <button
49
  onClick={onOpenAIBuilder}
50
  className="flex flex-col items-center justify-center p-2 bg-purple-500/10 hover:bg-purple-500/20 border border-purple-500/30 rounded-lg text-purple-300 transition-colors group"
 
60
  <span className="text-[10px] font-bold">Templates</span>
61
  </button>
62
  </div>
63
+
64
+ {/* Search Bar */}
65
+ <div className="relative">
66
+ <Search className="absolute left-3 top-2.5 text-slate-500" size={14} />
67
+ <input
68
+ type="text"
69
+ placeholder="Search layers..."
70
+ className="w-full bg-slate-950 border border-slate-700 rounded-lg pl-9 pr-8 py-2 text-xs text-slate-200 focus:outline-none focus:border-blue-500 transition-colors placeholder-slate-600"
71
+ value={searchQuery}
72
+ onChange={(e) => setSearchQuery(e.target.value)}
73
+ />
74
+ {searchQuery && (
75
+ <button
76
+ onClick={() => setSearchQuery('')}
77
+ className="absolute right-2 top-2 text-slate-500 hover:text-slate-300"
78
+ >
79
+ <X size={14} />
80
+ </button>
81
+ )}
82
+ </div>
83
  </div>
84
 
85
  <div className="flex-1 overflow-y-auto p-4 space-y-6 scrollbar-thin scrollbar-thumb-slate-700">
86
+
87
+ {searchQuery ? (
88
+ // Search Results View
89
+ <div className="space-y-2">
90
+ <h3 className="text-xs font-semibold text-slate-500 uppercase tracking-widest mb-3">
91
+ Search Results ({filteredLayers.length})
92
  </h3>
93
+ {filteredLayers.length > 0 ? (
94
+ filteredLayers.map(layer => (
95
+ <div
96
+ key={layer.type}
97
+ className="bg-slate-800 hover:bg-slate-750 p-3 rounded border border-slate-700 cursor-grab active:cursor-grabbing transition-colors group relative overflow-hidden"
98
+ onDragStart={(event) => onDragStart(event, layer.type)}
99
+ draggable
100
+ >
101
+ <div className="flex items-center gap-3 relative z-10">
102
+ <div className={`p-1.5 rounded transition-colors group-hover:bg-slate-900 bg-slate-900/50`}>
103
+ <Box size={14} className="text-slate-400 group-hover:text-blue-400" />
104
+ </div>
105
+ <div>
106
+ <div className="text-sm font-medium text-slate-200 group-hover:text-white">{layer.label}</div>
107
+ <div className="text-xs text-slate-500 leading-tight group-hover:text-slate-400 line-clamp-2">{layer.description}</div>
 
 
 
108
  </div>
109
  </div>
110
+ </div>
111
+ ))
112
+ ) : (
113
+ <div className="text-center text-slate-500 py-8 text-xs italic">
114
+ No layers found matching "{searchQuery}"
115
+ </div>
116
+ )}
117
  </div>
118
+ ) : (
119
+ // Categorized View
120
+ categories.map(category => (
121
+ <div key={category}>
122
+ <h3 className="text-xs font-semibold text-slate-500 uppercase tracking-widest mb-3 flex items-center gap-2">
123
+ {category}
124
+ <div className="h-px flex-1 bg-slate-800"></div>
125
+ </h3>
126
+ <div className="grid grid-cols-1 gap-2">
127
+ {Object.values(LAYER_DEFINITIONS)
128
+ .filter(l => l.category === category)
129
+ .map(layer => (
130
+ <div
131
+ key={layer.type}
132
+ className="bg-slate-800 hover:bg-slate-750 p-3 rounded border border-slate-700 cursor-grab active:cursor-grabbing transition-colors group relative overflow-hidden"
133
+ onDragStart={(event) => onDragStart(event, layer.type)}
134
+ draggable
135
+ >
136
+ <div className="flex items-center gap-3 relative z-10">
137
+ <div className={`p-1.5 rounded transition-colors group-hover:bg-slate-900 bg-slate-900/50`}>
138
+ <Box size={14} className="text-slate-400 group-hover:text-blue-400" />
139
+ </div>
140
+ <div>
141
+ <div className="text-sm font-medium text-slate-200 group-hover:text-white">{layer.label}</div>
142
+ <div className="text-xs text-slate-500 leading-tight group-hover:text-slate-400">{layer.description}</div>
143
+ </div>
144
+ </div>
145
+ </div>
146
+ ))}
147
+ </div>
148
+ </div>
149
+ ))
150
+ )}
151
  </div>
152
 
153
  <div className="p-4 border-t border-slate-800 text-[10px] text-slate-500 text-center flex items-center justify-center gap-2">
 
158
  );
159
  };
160
 
161
+ export default Sidebar;