@aiready/components 0.13.5 → 0.13.7

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.
@@ -0,0 +1,55 @@
1
+ import React from 'react';
2
+ import {
3
+ PACKAGE_BOUNDARY_FILL,
4
+ PACKAGE_BOUNDARY_STROKE,
5
+ PACKAGE_BOUNDARY_STROKE_WIDTH,
6
+ PACKAGE_BOUNDARY_DASH,
7
+ PACKAGE_LABEL_COLOR,
8
+ PACKAGE_LABEL_FONT_SIZE,
9
+ } from './constants';
10
+
11
+ interface PackageBoundariesProps {
12
+ packageBounds: Record<string, { x: number; y: number; r: number }>;
13
+ }
14
+
15
+ /**
16
+ * Renders the circular boundaries and labels for package groups in the force-directed graph.
17
+ *
18
+ * @lastUpdated 2026-03-18
19
+ */
20
+ export const PackageBoundaries: React.FC<PackageBoundariesProps> = ({
21
+ packageBounds,
22
+ }) => {
23
+ if (!packageBounds || Object.keys(packageBounds).length === 0) return null;
24
+
25
+ return (
26
+ <g className="package-boundaries" pointerEvents="none">
27
+ {Object.entries(packageBounds).map(([pid, b]) => (
28
+ <g key={pid}>
29
+ <circle
30
+ cx={b.x}
31
+ cy={b.y}
32
+ r={b.r}
33
+ fill={PACKAGE_BOUNDARY_FILL}
34
+ stroke={PACKAGE_BOUNDARY_STROKE}
35
+ strokeWidth={PACKAGE_BOUNDARY_STROKE_WIDTH}
36
+ strokeDasharray={PACKAGE_BOUNDARY_DASH}
37
+ opacity={0.9}
38
+ />
39
+ <text
40
+ x={b.x}
41
+ y={Math.max(12, b.y - b.r + 14)}
42
+ fill={PACKAGE_LABEL_COLOR}
43
+ fontSize={PACKAGE_LABEL_FONT_SIZE}
44
+ textAnchor="middle"
45
+ pointerEvents="none"
46
+ >
47
+ {pid.replace(/^pkg:/, '')}
48
+ </text>
49
+ </g>
50
+ ))}
51
+ </g>
52
+ );
53
+ };
54
+
55
+ PackageBoundaries.displayName = 'PackageBoundaries';
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Default visual constants for the ForceDirectedGraph component.
3
+ */
4
+ export const DEFAULT_NODE_COLOR = '#64748b';
5
+ export const DEFAULT_NODE_SIZE = 10;
6
+ export const DEFAULT_LINK_COLOR = '#94a3b8';
7
+ export const DEFAULT_LINK_WIDTH = 1;
8
+
9
+ /**
10
+ * Layout and interaction thresholds.
11
+ */
12
+ export const CIRCULAR_LAYOUT_RADIUS_RATIO = 0.35;
13
+ export const FIT_VIEW_PADDING = 40;
14
+ export const ZOOM_MIN_SCALE = 0.1;
15
+ export const ZOOM_MAX_SCALE = 10;
16
+
17
+ /**
18
+ * Transition and animation durations.
19
+ */
20
+ export const TRANSITION_DURATION_MS = 300;
21
+
22
+ /**
23
+ * Package boundary styling.
24
+ */
25
+ export const PACKAGE_BOUNDARY_FILL = 'rgba(148,163,184,0.06)';
26
+ export const PACKAGE_BOUNDARY_STROKE = '#475569';
27
+ export const PACKAGE_BOUNDARY_STROKE_WIDTH = 2;
28
+ export const PACKAGE_BOUNDARY_DASH = '6 6';
29
+ export const PACKAGE_LABEL_FONT_SIZE = 11;
30
+ export const PACKAGE_LABEL_COLOR = '#475569';
@@ -0,0 +1,87 @@
1
+ import { useEffect } from 'react';
2
+ import * as d3 from 'd3';
3
+ import { GraphNode } from './types';
4
+
5
+ /**
6
+ * Hook for managing D3 zoom behavior on an SVG element.
7
+ */
8
+ export function useGraphZoom(
9
+ svgRef: React.RefObject<SVGSVGElement | null>,
10
+ gRef: React.RefObject<SVGGElement | null>,
11
+ enableZoom: boolean,
12
+ setTransform: (transform: { k: number; x: number; y: number }) => void,
13
+ transformRef: React.MutableRefObject<{ k: number; x: number; y: number }>
14
+ ) {
15
+ useEffect(() => {
16
+ if (!enableZoom || !svgRef.current || !gRef.current) return;
17
+
18
+ const svg = d3.select(svgRef.current);
19
+ const g = d3.select(gRef.current);
20
+
21
+ const zoom = (d3 as any)
22
+ .zoom()
23
+ .scaleExtent([0.1, 10])
24
+ .on('zoom', (event: any) => {
25
+ g.attr('transform', event.transform);
26
+ transformRef.current = event.transform;
27
+ setTransform(event.transform);
28
+ });
29
+
30
+ svg.call(zoom);
31
+
32
+ return () => {
33
+ svg.on('.zoom', null);
34
+ };
35
+ }, [enableZoom, svgRef, gRef, setTransform, transformRef]);
36
+ }
37
+
38
+ /**
39
+ * Hook for managing window-level drag events for smooth node dragging.
40
+ */
41
+ export function useWindowDrag(
42
+ enableDrag: boolean,
43
+ svgRef: React.RefObject<SVGSVGElement | null>,
44
+ transformRef: React.MutableRefObject<{ k: number; x: number; y: number }>,
45
+ dragActiveRef: React.MutableRefObject<boolean>,
46
+ dragNodeRef: React.MutableRefObject<GraphNode | null>,
47
+ onDragEnd: () => void
48
+ ) {
49
+ useEffect(() => {
50
+ if (!enableDrag) return;
51
+
52
+ const handleWindowMove = (event: MouseEvent) => {
53
+ if (!dragActiveRef.current || !dragNodeRef.current) return;
54
+ const svg = svgRef.current;
55
+ if (!svg) return;
56
+ const rect = svg.getBoundingClientRect();
57
+ const t: any = transformRef.current;
58
+ const x = (event.clientX - rect.left - t.x) / t.k;
59
+ const y = (event.clientY - rect.top - t.y) / t.k;
60
+ dragNodeRef.current.fx = x;
61
+ dragNodeRef.current.fy = y;
62
+ };
63
+
64
+ const handleWindowUp = () => {
65
+ if (!dragActiveRef.current) return;
66
+ onDragEnd();
67
+ dragNodeRef.current = null;
68
+ dragActiveRef.current = false;
69
+ };
70
+
71
+ const handleWindowLeave = (event: MouseEvent) => {
72
+ if (event.relatedTarget === null) handleWindowUp();
73
+ };
74
+
75
+ window.addEventListener('mousemove', handleWindowMove);
76
+ window.addEventListener('mouseup', handleWindowUp);
77
+ window.addEventListener('mouseout', handleWindowLeave);
78
+ window.addEventListener('blur', handleWindowUp);
79
+
80
+ return () => {
81
+ window.removeEventListener('mousemove', handleWindowMove);
82
+ window.removeEventListener('mouseup', handleWindowUp);
83
+ window.removeEventListener('mouseout', handleWindowLeave);
84
+ window.removeEventListener('blur', handleWindowUp);
85
+ };
86
+ }, [enableDrag, svgRef, transformRef, dragActiveRef, dragNodeRef, onDragEnd]);
87
+ }
@@ -0,0 +1,93 @@
1
+ import { GraphNode } from './types';
2
+ import { CIRCULAR_LAYOUT_RADIUS_RATIO } from './constants';
3
+
4
+ /**
5
+ * Calculates node positions for a circular layout.
6
+ *
7
+ * @param nodes - Array of dependency nodes.
8
+ * @param width - Canvas width.
9
+ * @param height - Canvas height.
10
+ * @lastUpdated 2026-03-18
11
+ */
12
+ export function applyCircularLayout(
13
+ nodes: GraphNode[],
14
+ width: number,
15
+ height: number
16
+ ): void {
17
+ const centerX = width / 2;
18
+ const centerY = height / 2;
19
+ const radius = Math.min(width, height) * CIRCULAR_LAYOUT_RADIUS_RATIO;
20
+
21
+ nodes.forEach((node, i) => {
22
+ const angle = (2 * Math.PI * i) / nodes.length;
23
+ node.fx = centerX + Math.cos(angle) * radius;
24
+ node.fy = centerY + Math.sin(angle) * radius;
25
+ node.x = node.fx;
26
+ node.y = node.fy;
27
+ });
28
+ }
29
+
30
+ /**
31
+ * Calculates node positions for a hierarchical layout by grouping packages.
32
+ *
33
+ * @param nodes - Array of dependency nodes.
34
+ * @param width - Canvas width.
35
+ * @param height - Canvas height.
36
+ * @lastUpdated 2026-03-18
37
+ */
38
+ export function applyHierarchicalLayout(
39
+ nodes: GraphNode[],
40
+ width: number,
41
+ height: number
42
+ ): void {
43
+ const groups = new Map<string, GraphNode[]>();
44
+ nodes.forEach((n: any) => {
45
+ const key = n.packageGroup || n.group || 'root';
46
+ if (!groups.has(key)) groups.set(key, []);
47
+ groups.get(key)!.push(n);
48
+ });
49
+
50
+ const groupArray = Array.from(groups.entries());
51
+ const cols = Math.ceil(Math.sqrt(groupArray.length));
52
+ const groupSpacingX = (width * 0.8) / cols;
53
+ const groupSpacingY = (height * 0.8) / Math.ceil(groupArray.length / cols);
54
+
55
+ groupArray.forEach(([groupKey, groupNodes], gi) => {
56
+ const col = gi % cols;
57
+ const row = Math.floor(gi / cols);
58
+ const groupX = (col + 0.5) * groupSpacingX;
59
+ const groupY = (row + 0.5) * groupSpacingY;
60
+
61
+ if (groupKey.startsWith('pkg:') || groupKey === groupKey) {
62
+ groupNodes.forEach((n, ni) => {
63
+ const angle = (2 * Math.PI * ni) / groupNodes.length;
64
+ const r = Math.min(80, 20 + groupNodes.length * 8);
65
+ n.fx = groupX + Math.cos(angle) * r;
66
+ n.fy = groupY + Math.sin(angle) * r;
67
+ n.x = n.fx;
68
+ n.y = n.fy;
69
+ });
70
+ }
71
+ });
72
+ }
73
+
74
+ /**
75
+ * Calculates initial random positions for nodes in a force-directed layout.
76
+ *
77
+ * @param nodes - Array of dependency nodes.
78
+ * @param width - Canvas width.
79
+ * @param height - Canvas height.
80
+ * @lastUpdated 2026-03-18
81
+ */
82
+ export function applyInitialForceLayout(
83
+ nodes: GraphNode[],
84
+ width: number,
85
+ height: number
86
+ ): void {
87
+ nodes.forEach((node) => {
88
+ if (node.fx === undefined || node.fx === null) {
89
+ node.x = Math.random() * width;
90
+ node.y = Math.random() * height;
91
+ }
92
+ });
93
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Props for the IconBase component.
3
+ */
4
+ export interface IconBaseProps extends React.SVGProps<SVGSVGElement> {
5
+ /** Additional CSS classes for styling. Defaults to w-6 h-6. */
6
+ className?: string;
7
+ /** The child elements (paths, circles, etc.) of the SVG. */
8
+ children?: React.ReactNode;
9
+ /** Viewbox of the icon. Defaults to "0 0 24 24". */
10
+ viewBox?: string;
11
+ }
12
+
13
+ /**
14
+ * A shared base component for all icons to reduce code duplication
15
+ * and improve AI signal clarity.
16
+ *
17
+ * @param props - Icon properties and SVG attributes.
18
+ * @returns A standardized SVG icon element.
19
+ */
20
+ export const IconBase = ({
21
+ className = 'w-6 h-6',
22
+ children,
23
+ viewBox = '0 0 24 24',
24
+ ...props
25
+ }: IconBaseProps) => {
26
+ return (
27
+ <svg
28
+ viewBox={viewBox}
29
+ fill="none"
30
+ stroke="currentColor"
31
+ className={className}
32
+ {...props}
33
+ xmlns="http://www.w3.org/2000/svg"
34
+ >
35
+ {children}
36
+ </svg>
37
+ );
38
+ };
@@ -0,0 +1,367 @@
1
+ import { IconBase, IconBaseProps } from './IconBase';
2
+
3
+ export function AlertCircleIcon(props: IconBaseProps) {
4
+ return (
5
+ <IconBase
6
+ strokeWidth="2"
7
+ strokeLinecap="round"
8
+ strokeLinejoin="round"
9
+ {...props}
10
+ >
11
+ <circle cx="12" cy="12" r="10" />
12
+ <line x1="12" y1="8" x2="12" y2="12" />
13
+ <line x1="12" y1="16" x2="12.01" y2="16" />
14
+ </IconBase>
15
+ );
16
+ }
17
+
18
+ export function AlertTriangleIcon(props: IconBaseProps) {
19
+ return (
20
+ <IconBase
21
+ strokeWidth="2"
22
+ strokeLinecap="round"
23
+ strokeLinejoin="round"
24
+ {...props}
25
+ >
26
+ <path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z" />
27
+ <line x1="12" y1="9" x2="12" y2="13" />
28
+ <line x1="12" y1="17" x2="12.01" y2="17" />
29
+ </IconBase>
30
+ );
31
+ }
32
+
33
+ export function ArrowRightIcon(props: IconBaseProps) {
34
+ return (
35
+ <IconBase
36
+ strokeWidth="2"
37
+ strokeLinecap="round"
38
+ strokeLinejoin="round"
39
+ {...props}
40
+ >
41
+ <line x1="5" y1="12" x2="19" y2="12" />
42
+ <polyline points="12 5 19 12 12 19" />
43
+ </IconBase>
44
+ );
45
+ }
46
+
47
+ export function BrainIcon(props: IconBaseProps) {
48
+ return (
49
+ <IconBase
50
+ strokeWidth="2"
51
+ strokeLinecap="round"
52
+ strokeLinejoin="round"
53
+ {...props}
54
+ >
55
+ <path d="M9.5 2A2.5 2.5 0 0 1 12 4.5v15a2.5 2.5 0 0 1-4.96.44 2.5 2.5 0 0 1-2.74-3.41A2.5 2.5 0 0 1 2 14c0-1.5 1-2 1-2s-1-.5-1-2a2.5 2.5 0 0 1 2.3-2.48A2.5 2.5 0 0 1 7 5.5a2.5 2.5 0 0 1 2.5-3.5z" />
56
+ <path d="M14.5 2A2.5 2.5 0 0 0 12 4.5v15a2.5 2.5 0 0 0 4.96.44 2.5 2.5 0 0 0 2.74-3.41A2.5 2.5 0 0 0 22 14c0-1.5-1-2-1-2s1-.5 1-2a2.5 2.5 0 0 0-2.3-2.48A2.5 2.5 0 0 0 17 5.5a2.5 2.5 0 0 0-2.5-3.5z" />
57
+ </IconBase>
58
+ );
59
+ }
60
+
61
+ export function ChartIcon(props: IconBaseProps) {
62
+ return (
63
+ <IconBase {...props}>
64
+ <rect x="3" y="3" width="18" height="18" rx="2" strokeWidth="1.2" />
65
+ <rect x="7" y="11" width="2" height="6" fill="currentColor" />
66
+ <rect x="11" y="8" width="2" height="9" fill="currentColor" />
67
+ <rect x="15" y="5" width="2" height="12" fill="currentColor" />
68
+ </IconBase>
69
+ );
70
+ }
71
+
72
+ export function ClockIcon(props: IconBaseProps) {
73
+ return (
74
+ <IconBase
75
+ strokeWidth="2"
76
+ strokeLinecap="round"
77
+ strokeLinejoin="round"
78
+ {...props}
79
+ >
80
+ <circle cx="12" cy="12" r="10" />
81
+ <polyline points="12 6 12 12 16 14" />
82
+ </IconBase>
83
+ );
84
+ }
85
+
86
+ export function FileIcon(props: IconBaseProps) {
87
+ return (
88
+ <IconBase
89
+ strokeWidth="2"
90
+ strokeLinecap="round"
91
+ strokeLinejoin="round"
92
+ {...props}
93
+ >
94
+ <path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z" />
95
+ <polyline points="14 2 14 8 20 8" />
96
+ </IconBase>
97
+ );
98
+ }
99
+
100
+ export function HammerIcon(props: IconBaseProps) {
101
+ return (
102
+ <IconBase
103
+ strokeWidth="2"
104
+ strokeLinecap="round"
105
+ strokeLinejoin="round"
106
+ {...props}
107
+ >
108
+ <path d="M18.42 13.59L7.46 2.63a1 1 0 0 0-1.42 0l-4.7 4.7a1 1 0 0 0 0 1.42L11 18.23l1.07-1.07-1.41-1.41 1.42-1.42 1.41 1.41 1.41-1.41-1.41-1.41 1.42-1.42 1.41 1.41 2-2z" />
109
+ <path d="M13 18l6 6" />
110
+ </IconBase>
111
+ );
112
+ }
113
+
114
+ export function InfoIcon(props: IconBaseProps) {
115
+ return (
116
+ <IconBase
117
+ strokeWidth="2"
118
+ strokeLinecap="round"
119
+ strokeLinejoin="round"
120
+ {...props}
121
+ >
122
+ <circle cx="12" cy="12" r="10" />
123
+ <line x1="12" y1="16" x2="12" y2="12" />
124
+ <line x1="12" y1="8" x2="12.01" y2="8" />
125
+ </IconBase>
126
+ );
127
+ }
128
+
129
+ export function PlayIcon(props: IconBaseProps) {
130
+ return (
131
+ <IconBase
132
+ strokeWidth="2"
133
+ strokeLinecap="round"
134
+ strokeLinejoin="round"
135
+ {...props}
136
+ >
137
+ <polygon points="5 3 19 12 5 21 5 3" />
138
+ </IconBase>
139
+ );
140
+ }
141
+
142
+ export function RefreshCwIcon(props: IconBaseProps) {
143
+ return (
144
+ <IconBase
145
+ strokeWidth="2"
146
+ strokeLinecap="round"
147
+ strokeLinejoin="round"
148
+ {...props}
149
+ >
150
+ <path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8" />
151
+ <path d="M21 3v5h-5" />
152
+ <path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16" />
153
+ <path d="M3 21v-5h5" />
154
+ </IconBase>
155
+ );
156
+ }
157
+
158
+ export function RobotIcon(props: IconBaseProps) {
159
+ return (
160
+ <IconBase {...props}>
161
+ <rect x="3" y="7" width="18" height="11" rx="2" strokeWidth="1.2" />
162
+ <rect x="7" y="10" width="2" height="2" fill="currentColor" />
163
+ <rect x="15" y="10" width="2" height="2" fill="currentColor" />
164
+ <path d="M9 3v2M15 3v2" strokeWidth="1.2" strokeLinecap="round" />
165
+ </IconBase>
166
+ );
167
+ }
168
+
169
+ export function RocketIcon(props: IconBaseProps) {
170
+ return (
171
+ <IconBase {...props}>
172
+ <path
173
+ d="M12 2c1.5 0 3 1 3 1s1.2 1.8 1.2 4.2c0 2.4-1.2 5-3.6 7.4-2.4 2.4-5 3.6-7.4 3.6C3.8 18.2 2 17 2 17S3 15.5 3 14c0-2.1 1.5-3.6 1.5-3.6S7.5 9 9 9c2.4 0 3-7 3-7z"
174
+ strokeWidth="0"
175
+ fill="currentColor"
176
+ />
177
+ <path
178
+ d="M14 10c.8.8 2 2 3 3"
179
+ strokeWidth="1.5"
180
+ strokeLinecap="round"
181
+ strokeLinejoin="round"
182
+ />
183
+ </IconBase>
184
+ );
185
+ }
186
+
187
+ export function SaveIcon(props: IconBaseProps) {
188
+ return (
189
+ <IconBase
190
+ strokeWidth="2"
191
+ strokeLinecap="round"
192
+ strokeLinejoin="round"
193
+ {...props}
194
+ >
195
+ <path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z" />
196
+ <polyline points="17 21 17 13 7 13 7 21" />
197
+ <polyline points="7 3 7 8 15 8" />
198
+ </IconBase>
199
+ );
200
+ }
201
+
202
+ export function SettingsIcon(props: IconBaseProps) {
203
+ return (
204
+ <IconBase
205
+ strokeWidth="2"
206
+ strokeLinecap="round"
207
+ strokeLinejoin="round"
208
+ {...props}
209
+ >
210
+ <path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.38a2 2 0 0 0-.73-2.73l-.15-.1a2 2 0 0 1-1-1.72v-.51a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z" />
211
+ <circle cx="12" cy="12" r="3" />
212
+ </IconBase>
213
+ );
214
+ }
215
+
216
+ export function ShieldCheckIcon(props: IconBaseProps) {
217
+ return (
218
+ <IconBase
219
+ strokeWidth="2"
220
+ strokeLinecap="round"
221
+ strokeLinejoin="round"
222
+ {...props}
223
+ >
224
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
225
+ <path d="M9 12l2 2 4-4" />
226
+ </IconBase>
227
+ );
228
+ }
229
+
230
+ export function ShieldIcon(props: IconBaseProps) {
231
+ return (
232
+ <IconBase
233
+ strokeWidth="2"
234
+ strokeLinecap="round"
235
+ strokeLinejoin="round"
236
+ {...props}
237
+ >
238
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
239
+ </IconBase>
240
+ );
241
+ }
242
+
243
+ export function TargetIcon(props: IconBaseProps) {
244
+ return (
245
+ <IconBase {...props}>
246
+ <circle cx="12" cy="12" r="10" strokeWidth="1.2" />
247
+ <circle cx="12" cy="12" r="5" fill="currentColor" />
248
+ <path
249
+ d="M22 12h-3M5 12H2M12 2v3M12 19v3"
250
+ strokeWidth="1.2"
251
+ strokeLinecap="round"
252
+ />
253
+ </IconBase>
254
+ );
255
+ }
256
+
257
+ export function TerminalIcon(props: IconBaseProps) {
258
+ return (
259
+ <IconBase
260
+ strokeWidth="2"
261
+ strokeLinecap="round"
262
+ strokeLinejoin="round"
263
+ {...props}
264
+ >
265
+ <polyline points="4 17 10 11 4 5" />
266
+ <line x1="12" y1="19" x2="20" y2="19" />
267
+ </IconBase>
268
+ );
269
+ }
270
+
271
+ export function TrashIcon(props: IconBaseProps) {
272
+ return (
273
+ <IconBase
274
+ strokeWidth="2"
275
+ strokeLinecap="round"
276
+ strokeLinejoin="round"
277
+ {...props}
278
+ >
279
+ <polyline points="3 6 5 6 21 6" />
280
+ <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" />
281
+ </IconBase>
282
+ );
283
+ }
284
+
285
+ export function TrendingUpIcon(props: IconBaseProps) {
286
+ return (
287
+ <IconBase
288
+ strokeWidth="2"
289
+ strokeLinecap="round"
290
+ strokeLinejoin="round"
291
+ {...props}
292
+ >
293
+ <polyline points="23 6 13.5 15.5 8.5 10.5 1 18" />
294
+ <polyline points="17 6 23 6 23 12" />
295
+ </IconBase>
296
+ );
297
+ }
298
+
299
+ export function UploadIcon(props: IconBaseProps) {
300
+ return (
301
+ <IconBase
302
+ strokeWidth="2"
303
+ strokeLinecap="round"
304
+ strokeLinejoin="round"
305
+ {...props}
306
+ >
307
+ <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v4" />
308
+ <polyline points="17 8 12 3 7 8" />
309
+ <line x1="12" y1="3" x2="12" y2="15" />
310
+ </IconBase>
311
+ );
312
+ }
313
+
314
+ export function WalletIcon(props: IconBaseProps) {
315
+ return (
316
+ <IconBase
317
+ strokeWidth="2"
318
+ strokeLinecap="round"
319
+ strokeLinejoin="round"
320
+ {...props}
321
+ >
322
+ <path d="M21 12V7a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-1" />
323
+ <path d="M16 12h5" />
324
+ <circle cx="16" cy="12" r="1" />
325
+ </IconBase>
326
+ );
327
+ }
328
+
329
+ export function ZapIcon(props: IconBaseProps) {
330
+ return (
331
+ <IconBase
332
+ strokeWidth="2"
333
+ strokeLinecap="round"
334
+ strokeLinejoin="round"
335
+ {...props}
336
+ >
337
+ <polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2" />
338
+ </IconBase>
339
+ );
340
+ }
341
+
342
+ export default {
343
+ AlertCircleIcon,
344
+ AlertTriangleIcon,
345
+ ArrowRightIcon,
346
+ BrainIcon,
347
+ ChartIcon,
348
+ ClockIcon,
349
+ FileIcon,
350
+ HammerIcon,
351
+ InfoIcon,
352
+ PlayIcon,
353
+ RefreshCwIcon,
354
+ RobotIcon,
355
+ RocketIcon,
356
+ SaveIcon,
357
+ SettingsIcon,
358
+ ShieldCheckIcon,
359
+ ShieldIcon,
360
+ TargetIcon,
361
+ TerminalIcon,
362
+ TrashIcon,
363
+ TrendingUpIcon,
364
+ UploadIcon,
365
+ WalletIcon,
366
+ ZapIcon,
367
+ };