@veluai/velu 0.2.13 → 0.2.15

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.
Files changed (109) hide show
  1. package/README.md +80 -80
  2. package/dist/cli.js +37 -37
  3. package/package.json +64 -64
  4. package/runtime/velu-ui/base.css +320 -320
  5. package/runtime/velu-ui/components/Accordion.jsx +64 -64
  6. package/runtime/velu-ui/components/ApiClient.jsx +207 -207
  7. package/runtime/velu-ui/components/ApiField.jsx +87 -87
  8. package/runtime/velu-ui/components/ApiPath.jsx +63 -63
  9. package/runtime/velu-ui/components/ApiReferencePage.jsx +384 -384
  10. package/runtime/velu-ui/components/ApiSamples.jsx +36 -36
  11. package/runtime/velu-ui/components/ApiSidebar.jsx +122 -122
  12. package/runtime/velu-ui/components/AskBar.jsx +71 -71
  13. package/runtime/velu-ui/components/Callout.jsx +114 -114
  14. package/runtime/velu-ui/components/Card.jsx +131 -131
  15. package/runtime/velu-ui/components/Chatbot.jsx +885 -885
  16. package/runtime/velu-ui/components/CodeBlock.jsx +375 -375
  17. package/runtime/velu-ui/components/Columns.jsx +56 -56
  18. package/runtime/velu-ui/components/ContextMenu.jsx +298 -273
  19. package/runtime/velu-ui/components/ErrorCard.jsx +138 -138
  20. package/runtime/velu-ui/components/Field.jsx +81 -81
  21. package/runtime/velu-ui/components/Image.jsx +163 -163
  22. package/runtime/velu-ui/components/Logo.jsx +31 -31
  23. package/runtime/velu-ui/components/MethodBadge.jsx +31 -31
  24. package/runtime/velu-ui/components/NavSelect.jsx +108 -108
  25. package/runtime/velu-ui/components/NotFound.jsx +63 -63
  26. package/runtime/velu-ui/components/PageFeedback.jsx +219 -219
  27. package/runtime/velu-ui/components/PageFooter.jsx +145 -145
  28. package/runtime/velu-ui/components/PageHeader.jsx +422 -422
  29. package/runtime/velu-ui/components/PageNav.jsx +77 -77
  30. package/runtime/velu-ui/components/PoweredBy.jsx +51 -51
  31. package/runtime/velu-ui/components/Prompt.jsx +115 -115
  32. package/runtime/velu-ui/components/Search.jsx +460 -460
  33. package/runtime/velu-ui/components/Sidebar.jsx +254 -254
  34. package/runtime/velu-ui/components/SocialLinks.jsx +90 -90
  35. package/runtime/velu-ui/components/Steps.jsx +65 -65
  36. package/runtime/velu-ui/components/ThemeToggle.jsx +48 -48
  37. package/runtime/velu-ui/components/Toc.jsx +537 -537
  38. package/runtime/velu-ui/components/TocBar.jsx +195 -195
  39. package/runtime/velu-ui/components/Tree.jsx +87 -87
  40. package/runtime/velu-ui/components/TryItBar.jsx +102 -102
  41. package/runtime/velu-ui/components/accordion.css +92 -92
  42. package/runtime/velu-ui/components/api-page.css +208 -208
  43. package/runtime/velu-ui/components/api.css +635 -635
  44. package/runtime/velu-ui/components/ask-bar.css +94 -94
  45. package/runtime/velu-ui/components/card.css +105 -105
  46. package/runtime/velu-ui/components/chatbot.css +622 -622
  47. package/runtime/velu-ui/components/code-block.css +263 -263
  48. package/runtime/velu-ui/components/context-menu.css +173 -173
  49. package/runtime/velu-ui/components/docs-layout.css +822 -822
  50. package/runtime/velu-ui/components/field.css +82 -82
  51. package/runtime/velu-ui/components/image.css +237 -237
  52. package/runtime/velu-ui/components/nav-select.css +157 -157
  53. package/runtime/velu-ui/components/not-found.css +94 -94
  54. package/runtime/velu-ui/components/page-feedback.css +241 -241
  55. package/runtime/velu-ui/components/page-footer.css +130 -130
  56. package/runtime/velu-ui/components/page-header.css +558 -558
  57. package/runtime/velu-ui/components/page-nav.css +50 -50
  58. package/runtime/velu-ui/components/powered-by.css +92 -92
  59. package/runtime/velu-ui/components/prompt.css +99 -99
  60. package/runtime/velu-ui/components/search.css +307 -307
  61. package/runtime/velu-ui/components/sidebar.css +205 -205
  62. package/runtime/velu-ui/components/steps.css +77 -77
  63. package/runtime/velu-ui/components/theme-toggle.css +102 -102
  64. package/runtime/velu-ui/components/toc-bar.css +234 -234
  65. package/runtime/velu-ui/components/tree.css +49 -49
  66. package/runtime/velu-ui/index.js +54 -54
  67. package/runtime/velu-ui/lib/api-send.js +92 -92
  68. package/runtime/velu-ui/lib/brand-icons.jsx +103 -103
  69. package/runtime/velu-ui/lib/component-schemas.js +100 -100
  70. package/runtime/velu-ui/lib/copyText.js +64 -64
  71. package/runtime/velu-ui/lib/docs-assistant.js +250 -250
  72. package/runtime/velu-ui/lib/lang-icons.jsx +147 -147
  73. package/runtime/velu-ui/lib/pagefind.js +113 -113
  74. package/runtime/velu-ui/lib/prism-langs.js +957 -957
  75. package/runtime/velu-ui/lib/prism-loader.js +74 -74
  76. package/runtime/velu-ui/lib/resolveIcon.jsx +29 -29
  77. package/runtime/velu-ui/lib/scrollIntoNearestView.js +66 -66
  78. package/runtime/velu-ui/mdx-components.jsx +105 -105
  79. package/runtime/velu-ui/primitives/Cluster.jsx +49 -49
  80. package/runtime/velu-ui/primitives/Stack.jsx +63 -63
  81. package/runtime/velu-ui/primitives/Switcher.jsx +57 -57
  82. package/runtime/velu-ui/primitives/stack.css +3 -3
  83. package/runtime/velu-ui/primitives/switcher.css +25 -25
  84. package/runtime/velu-ui/styles.css +46 -46
  85. package/runtime/velu-ui/tokens.css +4 -4
  86. package/schema/velu.schema.json +423 -423
  87. package/src/lib/extract-mdx-error.js +170 -170
  88. package/src/lib/issues.js +159 -159
  89. package/src/lib/known-components.js +34 -34
  90. package/src/navigation.js +443 -443
  91. package/src/runtime/App.jsx +1669 -1668
  92. package/src/runtime/ErrorBoundary.jsx +54 -54
  93. package/src/runtime/client-entry.jsx +22 -22
  94. package/src/runtime/server-entry.jsx +16 -16
  95. package/src/template.html +48 -48
  96. package/templates/starter/ai-tools/claude-code.mdx +26 -26
  97. package/templates/starter/ai-tools/cursor.mdx +17 -17
  98. package/templates/starter/api-reference/introduction.mdx +43 -43
  99. package/templates/starter/development.mdx +19 -19
  100. package/templates/starter/essentials/code.mdx +29 -29
  101. package/templates/starter/essentials/images.mdx +29 -29
  102. package/templates/starter/essentials/markdown.mdx +25 -25
  103. package/templates/starter/essentials/navigation.mdx +39 -39
  104. package/templates/starter/essentials/settings.mdx +30 -30
  105. package/templates/starter/favicon.svg +6 -6
  106. package/templates/starter/index.mdx +31 -31
  107. package/templates/starter/openapi.json +160 -160
  108. package/templates/starter/quickstart.mdx +31 -31
  109. package/templates/starter/velu.json +41 -41
@@ -1,54 +1,54 @@
1
- export { default as Stack } from './primitives/Stack.jsx';
2
- export { default as Switcher } from './primitives/Switcher.jsx';
3
- export { default as Cluster } from './primitives/Cluster.jsx';
4
- export { default as ThemeToggle } from './components/ThemeToggle.jsx';
5
- export { default as Sidebar } from './components/Sidebar.jsx';
6
- export { default as NavSelect } from './components/NavSelect.jsx';
7
- export { default as ContextMenu } from './components/ContextMenu.jsx';
8
- export { default as Toc } from './components/Toc.jsx';
9
- export { default as TocBar } from './components/TocBar.jsx';
10
- export { default as Callout } from './components/Callout.jsx';
11
- export { default as ErrorCard } from './components/ErrorCard.jsx';
12
- export { default as Logo } from './components/Logo.jsx';
13
- export { default as SocialLinks } from './components/SocialLinks.jsx';
14
- export {
15
- default as Accordion,
16
- AccordionGroup,
17
- } from './components/Accordion.jsx';
18
- export { default as Card, CardGroup } from './components/Card.jsx';
19
- export { default as Columns } from './components/Columns.jsx';
20
- export { default as Field } from './components/Field.jsx';
21
- export { default as Prompt } from './components/Prompt.jsx';
22
- export { default as Steps, Step } from './components/Steps.jsx';
23
- export { default as Tree, Folder, File } from './components/Tree.jsx';
24
- export { default as MethodBadge } from './components/MethodBadge.jsx';
25
- export { default as ApiPath } from './components/ApiPath.jsx';
26
- export { default as TryItBar } from './components/TryItBar.jsx';
27
- export { default as ApiField } from './components/ApiField.jsx';
28
- export { default as ApiClient } from './components/ApiClient.jsx';
29
- export { default as ApiSidebar } from './components/ApiSidebar.jsx';
30
- export { default as ApiReferencePage } from './components/ApiReferencePage.jsx';
31
- export { default as ApiSamples } from './components/ApiSamples.jsx';
32
- export { default as NotFound } from './components/NotFound.jsx';
33
- export { default as AskBar } from './components/AskBar.jsx';
34
- export { default as Chatbot } from './components/Chatbot.jsx';
35
- export { default as PageFeedback } from './components/PageFeedback.jsx';
36
- export { default as PageNav } from './components/PageNav.jsx';
37
- export { default as PageFooter } from './components/PageFooter.jsx';
38
- export { default as PoweredBy } from './components/PoweredBy.jsx';
39
- export { default as resolveIcon } from './lib/resolveIcon.jsx';
40
- export {
41
- default as PageHeader,
42
- VeluMark,
43
- } from './components/PageHeader.jsx';
44
- export { default as Search } from './components/Search.jsx';
45
- export { default as pagefindSearch } from './lib/pagefind.js';
46
- export { createDocsAssistant } from './lib/docs-assistant.js';
47
- export { default as Image } from './components/Image.jsx';
48
- export {
49
- default as CodeBlock,
50
- CodeGroup,
51
- } from './components/CodeBlock.jsx';
52
- export {
53
- default as defaultMdxComponents,
54
- } from './mdx-components.jsx';
1
+ export { default as Stack } from './primitives/Stack.jsx';
2
+ export { default as Switcher } from './primitives/Switcher.jsx';
3
+ export { default as Cluster } from './primitives/Cluster.jsx';
4
+ export { default as ThemeToggle } from './components/ThemeToggle.jsx';
5
+ export { default as Sidebar } from './components/Sidebar.jsx';
6
+ export { default as NavSelect } from './components/NavSelect.jsx';
7
+ export { default as ContextMenu } from './components/ContextMenu.jsx';
8
+ export { default as Toc } from './components/Toc.jsx';
9
+ export { default as TocBar } from './components/TocBar.jsx';
10
+ export { default as Callout } from './components/Callout.jsx';
11
+ export { default as ErrorCard } from './components/ErrorCard.jsx';
12
+ export { default as Logo } from './components/Logo.jsx';
13
+ export { default as SocialLinks } from './components/SocialLinks.jsx';
14
+ export {
15
+ default as Accordion,
16
+ AccordionGroup,
17
+ } from './components/Accordion.jsx';
18
+ export { default as Card, CardGroup } from './components/Card.jsx';
19
+ export { default as Columns } from './components/Columns.jsx';
20
+ export { default as Field } from './components/Field.jsx';
21
+ export { default as Prompt } from './components/Prompt.jsx';
22
+ export { default as Steps, Step } from './components/Steps.jsx';
23
+ export { default as Tree, Folder, File } from './components/Tree.jsx';
24
+ export { default as MethodBadge } from './components/MethodBadge.jsx';
25
+ export { default as ApiPath } from './components/ApiPath.jsx';
26
+ export { default as TryItBar } from './components/TryItBar.jsx';
27
+ export { default as ApiField } from './components/ApiField.jsx';
28
+ export { default as ApiClient } from './components/ApiClient.jsx';
29
+ export { default as ApiSidebar } from './components/ApiSidebar.jsx';
30
+ export { default as ApiReferencePage } from './components/ApiReferencePage.jsx';
31
+ export { default as ApiSamples } from './components/ApiSamples.jsx';
32
+ export { default as NotFound } from './components/NotFound.jsx';
33
+ export { default as AskBar } from './components/AskBar.jsx';
34
+ export { default as Chatbot } from './components/Chatbot.jsx';
35
+ export { default as PageFeedback } from './components/PageFeedback.jsx';
36
+ export { default as PageNav } from './components/PageNav.jsx';
37
+ export { default as PageFooter } from './components/PageFooter.jsx';
38
+ export { default as PoweredBy } from './components/PoweredBy.jsx';
39
+ export { default as resolveIcon } from './lib/resolveIcon.jsx';
40
+ export {
41
+ default as PageHeader,
42
+ VeluMark,
43
+ } from './components/PageHeader.jsx';
44
+ export { default as Search } from './components/Search.jsx';
45
+ export { default as pagefindSearch } from './lib/pagefind.js';
46
+ export { createDocsAssistant } from './lib/docs-assistant.js';
47
+ export { default as Image } from './components/Image.jsx';
48
+ export {
49
+ default as CodeBlock,
50
+ CodeGroup,
51
+ } from './components/CodeBlock.jsx';
52
+ export {
53
+ default as defaultMdxComponents,
54
+ } from './mdx-components.jsx';
@@ -1,92 +1,92 @@
1
- // Build and send a "Try It" request from the playground field values.
2
- //
3
- // By default the request goes through the dev server's proxy
4
- // (/@velu-api-proxy) so it isn't blocked by CORS — the proxy forwards it
5
- // server-side and returns { status, statusText, headers, body }. Set the
6
- // project's api.playground.proxy to false to send straight from the browser.
7
-
8
- const PROXY_URL = '/@velu-api-proxy';
9
- const BODY_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
10
-
11
- // Compose the concrete request (url + headers + body) from the operation and
12
- // the user-entered values: { auth, path, query, header } maps + bodyText.
13
- function buildRequest({ operation, server, values, bodyText }) {
14
- const v = values || {};
15
- let path = operation.path.replace(/\{([^}]+)\}/g, (m, name) => {
16
- const val = v.path?.[name];
17
- return val ? encodeURIComponent(val) : m; // leave {name} if unfilled
18
- });
19
-
20
- const query = Object.entries(v.query || {}).filter(([, val]) => val !== '' && val != null);
21
- const qs = query.map(([k, val]) => `${encodeURIComponent(k)}=${encodeURIComponent(val)}`).join('&');
22
- const base = (server || '').replace(/\/+$/, '');
23
- const url = `${base}${path}${qs ? `?${qs}` : ''}`;
24
-
25
- const headers = {};
26
- for (const a of operation.auth || []) {
27
- const val = v.auth?.[a.name];
28
- if (val) headers[a.name] = a.prefix ? `${a.prefix} ${val}` : val;
29
- }
30
- for (const [k, val] of Object.entries(v.header || {})) {
31
- if (val !== '' && val != null) headers[k] = val;
32
- }
33
-
34
- let body = null;
35
- if (operation.body && BODY_METHODS.has(operation.method)) {
36
- body = bodyText || '';
37
- if (body && !headers['Content-Type']) headers['Content-Type'] = operation.body.contentType || 'application/json';
38
- }
39
-
40
- return { method: operation.method, url, headers, body };
41
- }
42
-
43
- async function readBody(res) {
44
- const text = await res.text();
45
- const ct = res.headers.get('content-type') || '';
46
- if (/json/i.test(ct)) {
47
- try {
48
- return JSON.parse(text);
49
- } catch {
50
- /* fall through to raw text */
51
- }
52
- }
53
- return text;
54
- }
55
-
56
- export async function sendApiRequest({ operation, server, proxy = true, values, bodyText }) {
57
- const req = buildRequest({ operation, server, values, bodyText });
58
-
59
- if (proxy) {
60
- const res = await fetch(PROXY_URL, {
61
- method: 'POST',
62
- headers: { 'Content-Type': 'application/json' },
63
- body: JSON.stringify(req),
64
- });
65
- // The proxy returns the upstream result as JSON.
66
- const payload = await res.json().catch(() => ({}));
67
- if (payload && payload.error) return { error: payload.error };
68
- return {
69
- status: payload.status,
70
- statusText: payload.statusText || '',
71
- headers: payload.headers || {},
72
- body: payload.body,
73
- };
74
- }
75
-
76
- // Direct browser fetch (subject to CORS).
77
- const res = await fetch(req.url, {
78
- method: req.method,
79
- headers: req.headers,
80
- body: req.body || undefined,
81
- });
82
- const headers = {};
83
- res.headers.forEach((val, key) => {
84
- headers[key] = val;
85
- });
86
- return {
87
- status: res.status,
88
- statusText: res.statusText,
89
- headers,
90
- body: await readBody(res),
91
- };
92
- }
1
+ // Build and send a "Try It" request from the playground field values.
2
+ //
3
+ // By default the request goes through the dev server's proxy
4
+ // (/@velu-api-proxy) so it isn't blocked by CORS — the proxy forwards it
5
+ // server-side and returns { status, statusText, headers, body }. Set the
6
+ // project's api.playground.proxy to false to send straight from the browser.
7
+
8
+ const PROXY_URL = '/@velu-api-proxy';
9
+ const BODY_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
10
+
11
+ // Compose the concrete request (url + headers + body) from the operation and
12
+ // the user-entered values: { auth, path, query, header } maps + bodyText.
13
+ function buildRequest({ operation, server, values, bodyText }) {
14
+ const v = values || {};
15
+ let path = operation.path.replace(/\{([^}]+)\}/g, (m, name) => {
16
+ const val = v.path?.[name];
17
+ return val ? encodeURIComponent(val) : m; // leave {name} if unfilled
18
+ });
19
+
20
+ const query = Object.entries(v.query || {}).filter(([, val]) => val !== '' && val != null);
21
+ const qs = query.map(([k, val]) => `${encodeURIComponent(k)}=${encodeURIComponent(val)}`).join('&');
22
+ const base = (server || '').replace(/\/+$/, '');
23
+ const url = `${base}${path}${qs ? `?${qs}` : ''}`;
24
+
25
+ const headers = {};
26
+ for (const a of operation.auth || []) {
27
+ const val = v.auth?.[a.name];
28
+ if (val) headers[a.name] = a.prefix ? `${a.prefix} ${val}` : val;
29
+ }
30
+ for (const [k, val] of Object.entries(v.header || {})) {
31
+ if (val !== '' && val != null) headers[k] = val;
32
+ }
33
+
34
+ let body = null;
35
+ if (operation.body && BODY_METHODS.has(operation.method)) {
36
+ body = bodyText || '';
37
+ if (body && !headers['Content-Type']) headers['Content-Type'] = operation.body.contentType || 'application/json';
38
+ }
39
+
40
+ return { method: operation.method, url, headers, body };
41
+ }
42
+
43
+ async function readBody(res) {
44
+ const text = await res.text();
45
+ const ct = res.headers.get('content-type') || '';
46
+ if (/json/i.test(ct)) {
47
+ try {
48
+ return JSON.parse(text);
49
+ } catch {
50
+ /* fall through to raw text */
51
+ }
52
+ }
53
+ return text;
54
+ }
55
+
56
+ export async function sendApiRequest({ operation, server, proxy = true, values, bodyText }) {
57
+ const req = buildRequest({ operation, server, values, bodyText });
58
+
59
+ if (proxy) {
60
+ const res = await fetch(PROXY_URL, {
61
+ method: 'POST',
62
+ headers: { 'Content-Type': 'application/json' },
63
+ body: JSON.stringify(req),
64
+ });
65
+ // The proxy returns the upstream result as JSON.
66
+ const payload = await res.json().catch(() => ({}));
67
+ if (payload && payload.error) return { error: payload.error };
68
+ return {
69
+ status: payload.status,
70
+ statusText: payload.statusText || '',
71
+ headers: payload.headers || {},
72
+ body: payload.body,
73
+ };
74
+ }
75
+
76
+ // Direct browser fetch (subject to CORS).
77
+ const res = await fetch(req.url, {
78
+ method: req.method,
79
+ headers: req.headers,
80
+ body: req.body || undefined,
81
+ });
82
+ const headers = {};
83
+ res.headers.forEach((val, key) => {
84
+ headers[key] = val;
85
+ });
86
+ return {
87
+ status: res.status,
88
+ statusText: res.statusText,
89
+ headers,
90
+ body: await readBody(res),
91
+ };
92
+ }
@@ -1,103 +1,103 @@
1
- import React from 'react';
2
-
3
- /**
4
- * Brand glyphs for the contextual menu's "Open in <tool>" / "Connect to <IDE>"
5
- * actions. Sourced from svgl.app and inlined (the project inlines icons as JSX,
6
- * like lucide — no SVG loader). Each takes a `size` prop, mirroring lucide's
7
- * icon API so they're drop-in in the menu.
8
- *
9
- * ALL marks use `currentColor` so the icon column reads as one uniform set:
10
- * muted/grey at rest, accent on hover (matching the lucide icons beside them).
11
- * The brand glyphs keep their distinctive shapes; only the fill follows the
12
- * menu's text/hover color across light + dark.
13
- */
14
-
15
- export function MarkdownIcon({ size = '1em', ...rest }) {
16
- return (
17
- <svg width={size} height={size} viewBox="0 0 208 128" fill="none" aria-hidden="true" {...rest}>
18
- <path
19
- fill="none"
20
- stroke="currentColor"
21
- strokeWidth="10"
22
- d="M15 5h178a10 10 0 0 1 10 10v98a10 10 0 0 1-10 10H15a10 10 0 0 1-10-10V15A10 10 0 0 1 15 5z"
23
- />
24
- <path
25
- fill="currentColor"
26
- d="M30 98V30h20l20 25 20-25h20v68H90V59L70 84 50 59v39H30zm125 0-30-33h20V30h20v35h20l-30 33z"
27
- />
28
- </svg>
29
- );
30
- }
31
-
32
- export function OpenAIIcon({ size = '1em', ...rest }) {
33
- return (
34
- <svg width={size} height={size} viewBox="0 0 256 260" fill="currentColor" aria-hidden="true" {...rest}>
35
- <path d="M239.184 106.203a64.716 64.716 0 0 0-5.576-53.103C219.452 28.459 191 15.784 163.213 21.74A65.586 65.586 0 0 0 52.096 45.22a64.716 64.716 0 0 0-43.23 31.36c-14.31 24.602-11.061 55.634 8.033 76.74a64.665 64.665 0 0 0 5.525 53.102c14.174 24.65 42.644 37.324 70.446 31.36a64.72 64.72 0 0 0 48.754 21.744c28.481.025 53.714-18.361 62.414-45.481a64.767 64.767 0 0 0 43.229-31.36c14.137-24.558 10.875-55.423-8.083-76.483Zm-97.56 136.338a48.397 48.397 0 0 1-31.105-11.255l1.535-.87 51.67-29.825a8.595 8.595 0 0 0 4.247-7.367v-72.85l21.845 12.636c.218.111.37.32.409.563v60.367c-.056 26.818-21.783 48.545-48.601 48.601Zm-104.466-44.61a48.345 48.345 0 0 1-5.781-32.589l1.534.921 51.722 29.826a8.339 8.339 0 0 0 8.441 0l63.181-36.425v25.221a.87.87 0 0 1-.358.665l-52.335 30.184c-23.257 13.398-52.97 5.431-66.404-17.803ZM23.549 85.38a48.499 48.499 0 0 1 25.58-21.333v61.39a8.288 8.288 0 0 0 4.195 7.316l62.874 36.272-21.845 12.636a.819.819 0 0 1-.767 0L41.353 151.53c-23.211-13.454-31.171-43.144-17.804-66.405v.256Zm179.466 41.695-63.08-36.63L161.73 77.86a.819.819 0 0 1 .768 0l52.233 30.184a48.6 48.6 0 0 1-7.316 87.635v-61.391a8.544 8.544 0 0 0-4.4-7.213Zm21.742-32.69-1.535-.922-51.619-30.081a8.39 8.39 0 0 0-8.492 0L99.98 99.808V74.587a.716.716 0 0 1 .307-.665l52.233-30.133a48.652 48.652 0 0 1 72.236 50.391v.205ZM88.061 139.097l-21.845-12.585a.87.87 0 0 1-.41-.614V65.685a48.652 48.652 0 0 1 79.757-37.346l-1.535.87-51.67 29.825a8.595 8.595 0 0 0-4.246 7.367l-.051 72.697Zm11.868-25.58 28.138-16.217 28.188 16.218v32.434l-28.086 16.218-28.188-16.218-.052-32.434Z" />
36
- </svg>
37
- );
38
- }
39
-
40
- export function ClaudeIcon({ size = '1em', ...rest }) {
41
- return (
42
- <svg width={size} height={size} viewBox="0 0 256 257" aria-hidden="true" {...rest}>
43
- <path fill="currentColor" d="m50.228 170.321 50.357-28.257.843-2.463-.843-1.361h-2.462l-8.426-.518-28.775-.778-24.952-1.037-24.175-1.296-6.092-1.297L0 125.796l.583-3.759 5.12-3.434 7.324.648 16.202 1.101 24.304 1.685 17.629 1.037 26.118 2.722h4.148l.583-1.685-1.426-1.037-1.101-1.037-25.147-17.045-27.22-18.017-14.258-10.37-7.713-5.25-3.888-4.925-1.685-10.758 7-7.713 9.397.649 2.398.648 9.527 7.323 20.35 15.75L94.817 91.9l3.889 3.24 1.555-1.102.195-.777-1.75-2.917-14.453-26.118-15.425-26.572-6.87-11.018-1.814-6.61c-.648-2.723-1.102-4.991-1.102-7.778l7.972-10.823L71.42 0 82.05 1.426l4.472 3.888 6.61 15.101 10.694 23.786 16.591 32.34 4.861 9.592 2.592 8.879.973 2.722h1.685v-1.556l1.36-18.211 2.528-22.36 2.463-28.776.843-8.1 4.018-9.722 7.971-5.25 6.222 2.981 5.12 7.324-.713 4.73-3.046 19.768-5.962 30.98-3.889 20.739h2.268l2.593-2.593 10.499-13.934 17.628-22.036 7.778-8.749 9.073-9.657 5.833-4.601h11.018l8.1 12.055-3.628 12.443-11.342 14.388-9.398 12.184-13.48 18.147-8.426 14.518.778 1.166 2.01-.194 30.46-6.481 16.462-2.982 19.637-3.37 8.88 4.148.971 4.213-3.5 8.62-20.998 5.184-24.628 4.926-36.682 8.685-.454.324.519.648 16.526 1.555 7.065.389h17.304l32.21 2.398 8.426 5.574 5.055 6.805-.843 5.184-12.962 6.611-17.498-4.148-40.83-9.721-14-3.5h-1.944v1.167l11.666 11.406 21.387 19.314 26.767 24.887 1.36 6.157-3.434 4.86-3.63-.518-23.526-17.693-9.073-7.972-20.545-17.304h-1.36v1.814l4.73 6.935 25.017 37.59 1.296 11.536-1.814 3.76-6.481 2.268-7.13-1.297-14.647-20.544-15.1-23.138-12.185-20.739-1.49.843-7.194 77.448-3.37 3.953-7.778 2.981-6.48-4.925-3.436-7.972 3.435-15.749 4.148-20.544 3.37-16.333 3.046-20.285 1.815-6.74-.13-.454-1.49.194-15.295 20.999-23.267 31.433-18.406 19.702-4.407 1.75-7.648-3.954.713-7.064 4.277-6.286 25.47-32.405 15.36-20.092 9.917-11.6-.065-1.686h-.583L44.07 198.125l-12.055 1.555-5.185-4.86.648-7.972 2.463-2.593 20.35-13.999-.064.065Z" />
44
- </svg>
45
- );
46
- }
47
-
48
- export function PerplexityIcon({ size = '1em', ...rest }) {
49
- return (
50
- <svg width={size} height={size} viewBox="0 0 48 48" fill="none" aria-hidden="true" {...rest}>
51
- <g stroke="currentColor" strokeLinecap="round" strokeLinejoin="round">
52
- <path d="M24 4.5v39M13.73 16.573v-9.99L24 16.573m0 14.5L13.73 41.417V27.01L24 16.573m0 0l10.27-9.99v9.99" />
53
- <path d="M13.73 31.396H9.44V16.573h29.12v14.823h-4.29" />
54
- <path d="M24 16.573L34.27 27.01v14.407L24 31.073" />
55
- </g>
56
- </svg>
57
- );
58
- }
59
-
60
- export function CursorIcon({ size = '1em', ...rest }) {
61
- return (
62
- <svg width={size} height={size} viewBox="0 0 466.73 532.09" fill="currentColor" aria-hidden="true" {...rest}>
63
- <path d="M457.43,125.94L244.42,2.96c-6.84-3.95-15.28-3.95-22.12,0L9.3,125.94c-5.75,3.32-9.3,9.46-9.3,16.11v247.99c0,6.65,3.55,12.79,9.3,16.11l213.01,122.98c6.84,3.95,15.28,3.95,22.12,0l213.01-122.98c5.75-3.32,9.3-9.46,9.3-16.11v-247.99c0-6.65-3.55-12.79-9.3-16.11h-.01ZM444.05,151.99l-205.63,356.16c-1.39,2.4-5.06,1.42-5.06-1.36v-233.21c0-4.66-2.49-8.97-6.53-11.31L24.87,145.67c-2.4-1.39-1.42-5.06,1.36-5.06h411.26c5.84,0,9.49,6.33,6.57,11.39h-.01Z" />
64
- </svg>
65
- );
66
- }
67
-
68
- export function VscodeIcon({ size = '1em', ...rest }) {
69
- return (
70
- <svg width={size} height={size} viewBox="0 0 100 100" fill="none" aria-hidden="true" {...rest}>
71
- <mask
72
- id="velu-vsc-mask"
73
- width="100"
74
- height="100"
75
- x="0"
76
- y="0"
77
- maskUnits="userSpaceOnUse"
78
- style={{ maskType: 'alpha' }}
79
- >
80
- <path
81
- fill="#fff"
82
- fillRule="evenodd"
83
- clipRule="evenodd"
84
- d="M70.912 99.317a6.223 6.223 0 0 0 4.96-.19l20.589-9.907A6.25 6.25 0 0 0 100 83.587V16.413a6.25 6.25 0 0 0-3.54-5.632L75.874.874a6.226 6.226 0 0 0-7.104 1.21L29.355 38.04 12.187 25.01a4.162 4.162 0 0 0-5.318.236l-5.506 5.009a4.168 4.168 0 0 0-.004 6.162L16.247 50 1.36 63.583a4.168 4.168 0 0 0 .004 6.162l5.506 5.01a4.162 4.162 0 0 0 5.318.236l17.168-13.032L68.77 97.917a6.217 6.217 0 0 0 2.143 1.4ZM75.015 27.3 45.11 50l29.906 22.701V27.3Z"
85
- />
86
- </mask>
87
- <g mask="url(#velu-vsc-mask)">
88
- <path
89
- fill="currentColor"
90
- d="M96.461 10.796 75.857.876a6.23 6.23 0 0 0-7.107 1.207l-67.451 61.5a4.167 4.167 0 0 0 .004 6.162l5.51 5.009a4.167 4.167 0 0 0 5.32.236l81.228-61.62c2.725-2.067 6.639-.124 6.639 3.297v-.24a6.25 6.25 0 0 0-3.539-5.63Z"
91
- />
92
- <path
93
- fill="currentColor"
94
- d="m96.461 89.204-20.604 9.92a6.229 6.229 0 0 1-7.107-1.207l-67.451-61.5a4.167 4.167 0 0 1 .004-6.162l5.51-5.009a4.167 4.167 0 0 1 5.32-.236l81.228 61.62c2.725 2.067 6.639.124 6.639-3.297v.24a6.25 6.25 0 0 1-3.539 5.63Z"
95
- />
96
- <path
97
- fill="currentColor"
98
- d="M75.858 99.126a6.232 6.232 0 0 1-7.108-1.21c2.306 2.307 6.25.674 6.25-2.588V4.672c0-3.262-3.944-4.895-6.25-2.589a6.232 6.232 0 0 1 7.108-1.21l20.6 9.908A6.25 6.25 0 0 1 100 16.413v67.174a6.25 6.25 0 0 1-3.541 5.633l-20.601 9.906Z"
99
- />
100
- </g>
101
- </svg>
102
- );
103
- }
1
+ import React from 'react';
2
+
3
+ /**
4
+ * Brand glyphs for the contextual menu's "Open in <tool>" / "Connect to <IDE>"
5
+ * actions. Sourced from svgl.app and inlined (the project inlines icons as JSX,
6
+ * like lucide — no SVG loader). Each takes a `size` prop, mirroring lucide's
7
+ * icon API so they're drop-in in the menu.
8
+ *
9
+ * ALL marks use `currentColor` so the icon column reads as one uniform set:
10
+ * muted/grey at rest, accent on hover (matching the lucide icons beside them).
11
+ * The brand glyphs keep their distinctive shapes; only the fill follows the
12
+ * menu's text/hover color across light + dark.
13
+ */
14
+
15
+ export function MarkdownIcon({ size = '1em', ...rest }) {
16
+ return (
17
+ <svg width={size} height={size} viewBox="0 0 208 128" fill="none" aria-hidden="true" {...rest}>
18
+ <path
19
+ fill="none"
20
+ stroke="currentColor"
21
+ strokeWidth="10"
22
+ d="M15 5h178a10 10 0 0 1 10 10v98a10 10 0 0 1-10 10H15a10 10 0 0 1-10-10V15A10 10 0 0 1 15 5z"
23
+ />
24
+ <path
25
+ fill="currentColor"
26
+ d="M30 98V30h20l20 25 20-25h20v68H90V59L70 84 50 59v39H30zm125 0-30-33h20V30h20v35h20l-30 33z"
27
+ />
28
+ </svg>
29
+ );
30
+ }
31
+
32
+ export function OpenAIIcon({ size = '1em', ...rest }) {
33
+ return (
34
+ <svg width={size} height={size} viewBox="0 0 256 260" fill="currentColor" aria-hidden="true" {...rest}>
35
+ <path d="M239.184 106.203a64.716 64.716 0 0 0-5.576-53.103C219.452 28.459 191 15.784 163.213 21.74A65.586 65.586 0 0 0 52.096 45.22a64.716 64.716 0 0 0-43.23 31.36c-14.31 24.602-11.061 55.634 8.033 76.74a64.665 64.665 0 0 0 5.525 53.102c14.174 24.65 42.644 37.324 70.446 31.36a64.72 64.72 0 0 0 48.754 21.744c28.481.025 53.714-18.361 62.414-45.481a64.767 64.767 0 0 0 43.229-31.36c14.137-24.558 10.875-55.423-8.083-76.483Zm-97.56 136.338a48.397 48.397 0 0 1-31.105-11.255l1.535-.87 51.67-29.825a8.595 8.595 0 0 0 4.247-7.367v-72.85l21.845 12.636c.218.111.37.32.409.563v60.367c-.056 26.818-21.783 48.545-48.601 48.601Zm-104.466-44.61a48.345 48.345 0 0 1-5.781-32.589l1.534.921 51.722 29.826a8.339 8.339 0 0 0 8.441 0l63.181-36.425v25.221a.87.87 0 0 1-.358.665l-52.335 30.184c-23.257 13.398-52.97 5.431-66.404-17.803ZM23.549 85.38a48.499 48.499 0 0 1 25.58-21.333v61.39a8.288 8.288 0 0 0 4.195 7.316l62.874 36.272-21.845 12.636a.819.819 0 0 1-.767 0L41.353 151.53c-23.211-13.454-31.171-43.144-17.804-66.405v.256Zm179.466 41.695-63.08-36.63L161.73 77.86a.819.819 0 0 1 .768 0l52.233 30.184a48.6 48.6 0 0 1-7.316 87.635v-61.391a8.544 8.544 0 0 0-4.4-7.213Zm21.742-32.69-1.535-.922-51.619-30.081a8.39 8.39 0 0 0-8.492 0L99.98 99.808V74.587a.716.716 0 0 1 .307-.665l52.233-30.133a48.652 48.652 0 0 1 72.236 50.391v.205ZM88.061 139.097l-21.845-12.585a.87.87 0 0 1-.41-.614V65.685a48.652 48.652 0 0 1 79.757-37.346l-1.535.87-51.67 29.825a8.595 8.595 0 0 0-4.246 7.367l-.051 72.697Zm11.868-25.58 28.138-16.217 28.188 16.218v32.434l-28.086 16.218-28.188-16.218-.052-32.434Z" />
36
+ </svg>
37
+ );
38
+ }
39
+
40
+ export function ClaudeIcon({ size = '1em', ...rest }) {
41
+ return (
42
+ <svg width={size} height={size} viewBox="0 0 256 257" aria-hidden="true" {...rest}>
43
+ <path fill="currentColor" d="m50.228 170.321 50.357-28.257.843-2.463-.843-1.361h-2.462l-8.426-.518-28.775-.778-24.952-1.037-24.175-1.296-6.092-1.297L0 125.796l.583-3.759 5.12-3.434 7.324.648 16.202 1.101 24.304 1.685 17.629 1.037 26.118 2.722h4.148l.583-1.685-1.426-1.037-1.101-1.037-25.147-17.045-27.22-18.017-14.258-10.37-7.713-5.25-3.888-4.925-1.685-10.758 7-7.713 9.397.649 2.398.648 9.527 7.323 20.35 15.75L94.817 91.9l3.889 3.24 1.555-1.102.195-.777-1.75-2.917-14.453-26.118-15.425-26.572-6.87-11.018-1.814-6.61c-.648-2.723-1.102-4.991-1.102-7.778l7.972-10.823L71.42 0 82.05 1.426l4.472 3.888 6.61 15.101 10.694 23.786 16.591 32.34 4.861 9.592 2.592 8.879.973 2.722h1.685v-1.556l1.36-18.211 2.528-22.36 2.463-28.776.843-8.1 4.018-9.722 7.971-5.25 6.222 2.981 5.12 7.324-.713 4.73-3.046 19.768-5.962 30.98-3.889 20.739h2.268l2.593-2.593 10.499-13.934 17.628-22.036 7.778-8.749 9.073-9.657 5.833-4.601h11.018l8.1 12.055-3.628 12.443-11.342 14.388-9.398 12.184-13.48 18.147-8.426 14.518.778 1.166 2.01-.194 30.46-6.481 16.462-2.982 19.637-3.37 8.88 4.148.971 4.213-3.5 8.62-20.998 5.184-24.628 4.926-36.682 8.685-.454.324.519.648 16.526 1.555 7.065.389h17.304l32.21 2.398 8.426 5.574 5.055 6.805-.843 5.184-12.962 6.611-17.498-4.148-40.83-9.721-14-3.5h-1.944v1.167l11.666 11.406 21.387 19.314 26.767 24.887 1.36 6.157-3.434 4.86-3.63-.518-23.526-17.693-9.073-7.972-20.545-17.304h-1.36v1.814l4.73 6.935 25.017 37.59 1.296 11.536-1.814 3.76-6.481 2.268-7.13-1.297-14.647-20.544-15.1-23.138-12.185-20.739-1.49.843-7.194 77.448-3.37 3.953-7.778 2.981-6.48-4.925-3.436-7.972 3.435-15.749 4.148-20.544 3.37-16.333 3.046-20.285 1.815-6.74-.13-.454-1.49.194-15.295 20.999-23.267 31.433-18.406 19.702-4.407 1.75-7.648-3.954.713-7.064 4.277-6.286 25.47-32.405 15.36-20.092 9.917-11.6-.065-1.686h-.583L44.07 198.125l-12.055 1.555-5.185-4.86.648-7.972 2.463-2.593 20.35-13.999-.064.065Z" />
44
+ </svg>
45
+ );
46
+ }
47
+
48
+ export function PerplexityIcon({ size = '1em', ...rest }) {
49
+ return (
50
+ <svg width={size} height={size} viewBox="0 0 48 48" fill="none" aria-hidden="true" {...rest}>
51
+ <g stroke="currentColor" strokeLinecap="round" strokeLinejoin="round">
52
+ <path d="M24 4.5v39M13.73 16.573v-9.99L24 16.573m0 14.5L13.73 41.417V27.01L24 16.573m0 0l10.27-9.99v9.99" />
53
+ <path d="M13.73 31.396H9.44V16.573h29.12v14.823h-4.29" />
54
+ <path d="M24 16.573L34.27 27.01v14.407L24 31.073" />
55
+ </g>
56
+ </svg>
57
+ );
58
+ }
59
+
60
+ export function CursorIcon({ size = '1em', ...rest }) {
61
+ return (
62
+ <svg width={size} height={size} viewBox="0 0 466.73 532.09" fill="currentColor" aria-hidden="true" {...rest}>
63
+ <path d="M457.43,125.94L244.42,2.96c-6.84-3.95-15.28-3.95-22.12,0L9.3,125.94c-5.75,3.32-9.3,9.46-9.3,16.11v247.99c0,6.65,3.55,12.79,9.3,16.11l213.01,122.98c6.84,3.95,15.28,3.95,22.12,0l213.01-122.98c5.75-3.32,9.3-9.46,9.3-16.11v-247.99c0-6.65-3.55-12.79-9.3-16.11h-.01ZM444.05,151.99l-205.63,356.16c-1.39,2.4-5.06,1.42-5.06-1.36v-233.21c0-4.66-2.49-8.97-6.53-11.31L24.87,145.67c-2.4-1.39-1.42-5.06,1.36-5.06h411.26c5.84,0,9.49,6.33,6.57,11.39h-.01Z" />
64
+ </svg>
65
+ );
66
+ }
67
+
68
+ export function VscodeIcon({ size = '1em', ...rest }) {
69
+ return (
70
+ <svg width={size} height={size} viewBox="0 0 100 100" fill="none" aria-hidden="true" {...rest}>
71
+ <mask
72
+ id="velu-vsc-mask"
73
+ width="100"
74
+ height="100"
75
+ x="0"
76
+ y="0"
77
+ maskUnits="userSpaceOnUse"
78
+ style={{ maskType: 'alpha' }}
79
+ >
80
+ <path
81
+ fill="#fff"
82
+ fillRule="evenodd"
83
+ clipRule="evenodd"
84
+ d="M70.912 99.317a6.223 6.223 0 0 0 4.96-.19l20.589-9.907A6.25 6.25 0 0 0 100 83.587V16.413a6.25 6.25 0 0 0-3.54-5.632L75.874.874a6.226 6.226 0 0 0-7.104 1.21L29.355 38.04 12.187 25.01a4.162 4.162 0 0 0-5.318.236l-5.506 5.009a4.168 4.168 0 0 0-.004 6.162L16.247 50 1.36 63.583a4.168 4.168 0 0 0 .004 6.162l5.506 5.01a4.162 4.162 0 0 0 5.318.236l17.168-13.032L68.77 97.917a6.217 6.217 0 0 0 2.143 1.4ZM75.015 27.3 45.11 50l29.906 22.701V27.3Z"
85
+ />
86
+ </mask>
87
+ <g mask="url(#velu-vsc-mask)">
88
+ <path
89
+ fill="currentColor"
90
+ d="M96.461 10.796 75.857.876a6.23 6.23 0 0 0-7.107 1.207l-67.451 61.5a4.167 4.167 0 0 0 .004 6.162l5.51 5.009a4.167 4.167 0 0 0 5.32.236l81.228-61.62c2.725-2.067 6.639-.124 6.639 3.297v-.24a6.25 6.25 0 0 0-3.539-5.63Z"
91
+ />
92
+ <path
93
+ fill="currentColor"
94
+ d="m96.461 89.204-20.604 9.92a6.229 6.229 0 0 1-7.107-1.207l-67.451-61.5a4.167 4.167 0 0 1 .004-6.162l5.51-5.009a4.167 4.167 0 0 1 5.32-.236l81.228 61.62c2.725 2.067 6.639.124 6.639-3.297v.24a6.25 6.25 0 0 1-3.539 5.63Z"
95
+ />
96
+ <path
97
+ fill="currentColor"
98
+ d="M75.858 99.126a6.232 6.232 0 0 1-7.108-1.21c2.306 2.307 6.25.674 6.25-2.588V4.672c0-3.262-3.944-4.895-6.25-2.589a6.232 6.232 0 0 1 7.108-1.21l20.6 9.908A6.25 6.25 0 0 1 100 16.413v67.174a6.25 6.25 0 0 1-3.541 5.633l-20.601 9.906Z"
99
+ />
100
+ </g>
101
+ </svg>
102
+ );
103
+ }