PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 4.9.5
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v4.9.5
4.9.5 4.9.4 4.9.3 4.9.2 4.9.1 4.9.0 4.8.2 4.8.1 4.8.0 4.7.0 4.6.2 4.6.1 4.6.0 4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 4.5.1 4.5.0 4.4.1 4.4.0 3.3.4 3.4.0 3.4.1 All 203 releases
betterdocs / react-src / admin / mcp / components / Icons.js

Icons.js in BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot 4.9.5, at react-src/admin/mcp/components/Icons.js

165 lines 9.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import React from "react";
2
3 /**
4 * Inline glyphs for the MCP page. Kept here rather than in `~betterdocs/icons`
5 * because they are specific to this screen; all of them inherit `currentColor`
6 * so they follow the token that colours their surrounding text in both light
7 * and dark mode.
8 */
9
10 /**
11 * The Model Context Protocol mark — the three nested arcs, on the protocol's own
12 * 195x195 grid. This is the glyph every MCP client shows, so a site owner
13 * recognises what this screen is before reading a word of it; the abstract
14 * sun/asterisk that stood here said nothing (ADR-054).
15 */
16 export const IconMcp = ({ size = 22 }) => (
17 <svg width={size} height={size} viewBox="0 0 195 195" fill="none" stroke="currentColor" strokeWidth="12" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
18 <path d="M25 97.85 92.88 29.97c9.37-9.37 24.57-9.37 33.94 0 9.38 9.37 9.38 24.57 0 33.94L75.56 115.18" />
19 <path d="M76.27 114.47l50.55-50.56c9.37-9.37 24.57-9.37 33.95 0 9.37 9.38 9.37 24.58 0 33.95l-61.78 61.78c-2.34 2.34-2.34 6.13 0 8.47l19.34 19.35" />
20 <path d="M109.85 46.94 59.29 97.5c-9.37 9.37-9.37 24.57 0 33.94 9.38 9.38 24.58 9.38 33.95 0l51.25-51.26" />
21 </svg>
22 );
23
24 export const IconCheck = ({ size = 14 }) => (
25 <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.6" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
26 <polyline points="20 6 9 17 4 12" />
27 </svg>
28 );
29
30 export const IconCopy = ({ size = 14 }) => (
31 <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
32 <rect x="9" y="9" width="12" height="12" rx="2" />
33 <path d="M5 15V5a2 2 0 0 1 2-2h10" />
34 </svg>
35 );
36
37 export const IconRefresh = ({ size = 14 }) => (
38 <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
39 <path d="M21 12a9 9 0 1 1-2.6-6.4" />
40 <polyline points="21 3 21 9 15 9" />
41 </svg>
42 );
43
44 export const IconPlay = ({ size = 14 }) => (
45 <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
46 <polygon points="6 3 20 12 6 21 6 3" />
47 </svg>
48 );
49
50 export const IconTrash = ({ size = 15 }) => (
51 <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
52 <path d="M3 6h18M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" />
53 </svg>
54 );
55
56 export const IconPlug = ({ size = 18 }) => (
57 <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
58 <path d="M9 2v6M15 2v6M6 8h12v3a6 6 0 0 1-12 0V8ZM12 17v5" />
59 </svg>
60 );
61
62 /**
63 * The KPI tiles' marks (ADR-062). `IconPlug` and `IconCode` above serve the
64 * first two tiles; these two are the grid and the clock.
65 */
66 export const IconGrid = ({ size = 14 }) => (
67 <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
68 <rect x="3" y="3" width="7" height="7" rx="1.5" />
69 <rect x="14" y="3" width="7" height="7" rx="1.5" />
70 <rect x="3" y="14" width="7" height="7" rx="1.5" />
71 <rect x="14" y="14" width="7" height="7" rx="1.5" />
72 </svg>
73 );
74
75 export const IconClock = ({ size = 14 }) => (
76 <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
77 <circle cx="12" cy="12" r="9" />
78 <polyline points="12 7 12 12 15.5 14" />
79 </svg>
80 );
81
82 /**
83 * The note beside a token-mode payload. Informational, not a warning triangle:
84 * using the connection token is a supported choice, only a narrower one.
85 */
86 export const IconInfo = ({ size = 14 }) => (
87 <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
88 <circle cx="12" cy="12" r="10" />
89 <path d="M12 16v-4M12 8h.01" />
90 </svg>
91 );
92
93 export const IconExternal = ({ size = 13 }) => (
94 <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.9" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
95 <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />
96 <polyline points="15 3 21 3 21 9" />
97 <line x1="10" y1="14" x2="21" y2="3" />
98 </svg>
99 );
100
101 export const IconChevron = ({ open = false, size = 14 }) => (
102 <svg
103 width={size}
104 height={size}
105 viewBox="0 0 24 24"
106 fill="none"
107 stroke="currentColor"
108 strokeWidth="2"
109 strokeLinecap="round"
110 strokeLinejoin="round"
111 aria-hidden="true"
112 style={{ transform: open ? "rotate(180deg)" : "none", transition: "transform .15s" }}
113 >
114 <polyline points="6 9 12 15 18 9" />
115 </svg>
116 );
117
118 /* ---------------------------------------------------------- client marks */
119
120 /**
121 * The marks of the clients the cards offer, in two kinds.
122 *
123 * `IconClaude` and `IconOpenAI` are the vendors' own published logo files, used
124 * exactly as published — path, viewBox and fill unchanged — each keeping its own
125 * colour on a white tile, which is why neither uses `currentColor` (ADR-066).
126 * Do not recolour, re-draw or re-grid them: an approximation of somebody else's
127 * logo is precisely what that decision exists to undo.
128 *
129 * The rest are ours, on the shared 24-unit grid, and inherit `currentColor` so
130 * the card sets the accent. `MCPManager::client_mark()` carries the same five
131 * marks for the consent screen: change one and change both.
132 */
133 export const IconClaude = ({ size = 18 }) => (
134 <svg width={size} height={size} viewBox="0 0 100 100" fill="hsl(14.8, 63.1%, 59.6%)" aria-hidden="true">
135 <path d="m19.6 66.5 19.7-11 .3-1-.3-.5h-1l-3.3-.2-11.2-.3L14 53l-9.5-.5-2.4-.5L0 49l.2-1.5 2-1.3 2.9.2 6.3.5 9.5.6 6.9.4L38 49.1h1.6l.2-.7-.5-.4-.4-.4L29 41l-10.6-7-5.6-4.1-3-2-1.5-2-.6-4.2 2.7-3 3.7.3.9.2 3.7 2.9 8 6.1L37 36l1.5 1.2.6-.4.1-.3-.7-1.1L33 25l-6-10.4-2.7-4.3-.7-2.6c-.3-1-.4-2-.4-3l3-4.2L28 0l4.2.6L33.8 2l2.6 6 4.1 9.3L47 29.9l2 3.8 1 3.4.3 1h.7v-.5l.5-7.2 1-8.7 1-11.2.3-3.2 1.6-3.8 3-2L61 2.6l2 2.9-.3 1.8-1.1 7.7L59 27.1l-1.5 8.2h.9l1-1.1 4.1-5.4 6.9-8.6 3-3.5L77 13l2.3-1.8h4.3l3.1 4.7-1.4 4.9-4.4 5.6-3.7 4.7-5.3 7.1-3.2 5.7.3.4h.7l12-2.6 6.4-1.1 7.6-1.3 3.5 1.6.4 1.6-1.4 3.4-8.2 2-9.6 2-14.3 3.3-.2.1.2.3 6.4.6 2.8.2h6.8l12.6 1 3.3 2 1.9 2.7-.3 2-5.1 2.6-6.8-1.6-16-3.8-5.4-1.3h-.8v.4l4.6 4.5 8.3 7.5L89 80.1l.5 2.4-1.3 2-1.4-.2-9.2-7-3.6-3-8-6.8h-.5v.7l1.8 2.7 9.8 14.7.5 4.5-.7 1.4-2.6 1-2.7-.6-5.8-8-6-9-4.7-8.2-.5.4-2.9 30.2-1.3 1.5-3 1.2-2.5-2-1.4-3 1.4-6.2 1.6-8 1.3-6.4 1.2-7.9.7-2.6v-.2H49L43 72l-9 12.3-7.2 7.6-1.7.7-3-1.5.3-2.8L24 86l10-12.8 6-7.9 4-4.6-.1-.5h-.3L17.2 77.4l-4.7.6-2-2 .2-3 1-1 8-5.5Z" />
136 </svg>
137 );
138
139 export const IconChatGpt = ({ size = 18 }) => (
140 <svg width={size} height={size} viewBox="0 0 320 320" fill="#000000" aria-hidden="true">
141 <path d="m297.06 130.97c7.26-21.79 4.76-45.66-6.85-65.48-17.46-30.4-52.56-46.04-86.84-38.68-15.25-17.18-37.16-26.95-60.13-26.81-35.04-.08-66.13 22.48-76.91 55.82-22.51 4.61-41.94 18.7-53.31 38.67-17.59 30.32-13.58 68.54 9.92 94.54-7.26 21.79-4.76 45.66 6.85 65.48 17.46 30.4 52.56 46.04 86.84 38.68 15.24 17.18 37.16 26.95 60.13 26.8 35.06.09 66.16-22.49 76.94-55.86 22.51-4.61 41.94-18.7 53.31-38.67 17.57-30.32 13.55-68.51-9.94-94.51zm-120.28 168.11c-14.03.02-27.62-4.89-38.39-13.88.49-.26 1.34-.73 1.89-1.07l63.72-36.8c3.26-1.85 5.26-5.32 5.24-9.07v-89.83l26.93 15.55c.29.14.48.42.52.74v74.39c-.04 33.08-26.83 59.9-59.91 59.97zm-128.84-55.03c-7.03-12.14-9.56-26.37-7.15-40.18.47.28 1.3.79 1.89 1.13l63.72 36.8c3.23 1.89 7.23 1.89 10.47 0l77.79-44.92v31.1c.02.32-.13.63-.38.83l-64.41 37.19c-28.69 16.52-65.33 6.7-81.92-21.95zm-16.77-139.09c7-12.16 18.05-21.46 31.21-26.29 0 .55-.03 1.52-.03 2.2v73.61c-.02 3.74 1.98 7.21 5.23 9.06l77.79 44.91-26.93 15.55c-.27.18-.61.21-.91.08l-64.42-37.22c-28.63-16.58-38.45-53.21-21.95-81.89zm221.26 51.49-77.79-44.92 26.93-15.54c.27-.18.61-.21.91-.08l64.42 37.19c28.68 16.57 38.51 53.26 21.94 81.94-7.01 12.14-18.05 21.44-31.2 26.28v-75.81c.03-3.74-1.96-7.2-5.2-9.06zm26.8-40.34c-.47-.29-1.3-.79-1.89-1.13l-63.72-36.8c-3.23-1.89-7.23-1.89-10.47 0l-77.79 44.92v-31.1c-.02-.32.13-.63.38-.83l64.41-37.16c28.69-16.55 65.37-6.7 81.91 22 6.99 12.12 9.52 26.31 7.15 40.1zm-168.51 55.43-26.94-15.55c-.29-.14-.48-.42-.52-.74v-74.39c.02-33.12 26.89-59.96 60.01-59.94 14.01 0 27.57 4.92 38.34 13.88-.49.26-1.33.73-1.89 1.07l-63.72 36.8c-3.26 1.85-5.26 5.31-5.24 9.06l-.04 89.79zm14.63-31.54 34.65-20.01 34.65 20v40.01l-34.65 20-34.65-20z" />
142 </svg>
143 );
144
145 // The same closed arrow, filled rather than stroked: on a solid tile it knocks
146 // out as a glyph, not as a hairline outline.
147 export const IconCursor = ({ size = 18 }) => (
148 <svg width={size} height={size} viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
149 <path d="M4 3l16 7-6.6 2.4L11 20 4 3z" />
150 </svg>
151 );
152
153 export const IconCode = ({ size = 18 }) => (
154 <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
155 <polyline points="16 18 22 12 16 6" />
156 <polyline points="8 6 2 12 8 18" />
157 </svg>
158 );
159
160 export const IconSpark = ({ size = 18 }) => (
161 <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
162 <path d="M12 3v18M3 12h18M6.3 6.3l11.4 11.4M17.7 6.3L6.3 17.7" />
163 </svg>
164 );
165