@aiready/components 0.13.6 → 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.
- package/dist/charts/ForceDirectedGraph.js +265 -281
- package/dist/charts/ForceDirectedGraph.js.map +1 -1
- package/dist/index.d.ts +32 -77
- package/dist/index.js +428 -637
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/charts/ForceDirectedGraph.tsx +192 -393
- package/src/charts/PackageBoundaries.tsx +55 -0
- package/src/charts/constants.ts +30 -0
- package/src/charts/hooks.ts +87 -0
- package/src/charts/layout-utils.ts +93 -0
- package/src/components/icons/IconBase.tsx +38 -0
- package/src/components/icons/index.tsx +367 -0
- package/src/components/icons.tsx +3 -564
|
@@ -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
|
+
};
|