@sampleapp.ai/sdk 1.0.29 → 1.0.31
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/components/guardian/app-layout-no-sidebar.js +8 -0
- package/dist/components/guardian/ask-ai-view.js +249 -0
- package/dist/components/guardian/code-focus-section.d.ts +41 -0
- package/dist/components/guardian/code-focus-section.js +174 -0
- package/dist/components/guardian/context/guardian-context.js +94 -0
- package/dist/components/guardian/context/vm-context.js +28 -0
- package/dist/components/guardian/default-guide-view.js +34 -0
- package/dist/components/guardian/demo/guardian-demo.js +35 -0
- package/dist/components/guardian/demo/left-view/toggle.js +28 -0
- package/dist/components/guardian/demo/left-view.js +49 -0
- package/dist/components/guardian/guardian-component.js +79 -0
- package/dist/components/guardian/guardian-demo.js +35 -0
- package/dist/components/guardian/guardian-home.d.ts +4 -0
- package/dist/components/guardian/guardian-home.js +61 -0
- package/dist/components/guardian/guardian-playground.js +45 -0
- package/dist/components/guardian/guardian-style-wrapper.js +29 -0
- package/dist/components/guardian/guardian-upload-spec.d.ts +14 -0
- package/dist/components/guardian/guardian-upload-spec.js +160 -0
- package/dist/components/guardian/header/glassmorphic-combobox.d.ts +15 -0
- package/dist/components/guardian/header/glassmorphic-combobox.js +30 -0
- package/dist/components/guardian/header.js +61 -0
- package/dist/components/guardian/hooks/use-frame-messages.js +65 -0
- package/dist/components/guardian/hooks/use-frame-params.js +44 -0
- package/dist/components/guardian/hooks/use-sandbox-url-loader.js +101 -0
- package/dist/components/guardian/ide/browser.js +538 -0
- package/dist/components/guardian/index.js +8 -0
- package/dist/components/guardian/layout/app-layout-no-sidebar.js +8 -0
- package/dist/components/guardian/layout/header/glassmorphic-combobox.js +48 -0
- package/dist/components/guardian/layout/header.js +63 -0
- package/dist/components/guardian/right-view/code-view.js +56 -0
- package/dist/components/guardian/right-view/pill-file-selector.js +233 -0
- package/dist/components/guardian/right-view/preview-control-bar.js +25 -0
- package/dist/components/guardian/right-view/right-panel-view.js +38 -0
- package/dist/components/guardian/right-view/right-top-down-view.js +289 -0
- package/dist/components/guardian/right-view/right-view.js +28 -0
- package/dist/components/guardian/right-view/simplified-editor.js +234 -0
- package/dist/components/guardian/types/ide-types.js +162 -0
- package/dist/components/guardian/types.js +3 -0
- package/dist/components/guardian/ui/ai-loader.js +48 -0
- package/dist/components/guardian/ui/badge.js +24 -0
- package/dist/components/guardian/ui/button.js +45 -0
- package/dist/components/guardian/ui/command.js +63 -0
- package/dist/components/guardian/ui/console-with-app.js +17 -0
- package/dist/components/guardian/ui/dialog.js +57 -0
- package/dist/components/guardian/ui/dropdown-menu.js +82 -0
- package/dist/components/guardian/ui/markdown.js +57 -0
- package/dist/components/guardian/ui/popover.js +25 -0
- package/dist/components/guardian/ui/tooltip.js +25 -0
- package/dist/components/guardian/utils.js +88 -0
- package/dist/components/guardian/zip-to-codebase.js +246 -0
- package/dist/components/guardian/zip-to-filetree.js +284 -0
- package/dist/components/icons.js +22 -0
- package/dist/components/sandbox/Sandbox.js +88 -0
- package/dist/components/sandbox/SandboxHome.js +141 -0
- package/dist/components/sandbox/api.js +84 -0
- package/dist/components/sandbox/guardian/app-layout-no-sidebar.js +11 -0
- package/dist/components/sandbox/guardian/ask-ai-view.js +249 -0
- package/dist/components/sandbox/guardian/code-focus-section.js +174 -0
- package/dist/components/sandbox/guardian/context/guardian-context.js +94 -0
- package/dist/components/sandbox/guardian/context/vm-context.js +28 -0
- package/dist/components/sandbox/guardian/default-guide-view.js +34 -0
- package/dist/components/sandbox/guardian/demo/guardian-demo.js +35 -0
- package/dist/components/sandbox/guardian/demo/left-view/toggle.js +28 -0
- package/dist/components/sandbox/guardian/demo/left-view.js +70 -0
- package/dist/components/sandbox/guardian/guardian-component.js +99 -0
- package/dist/components/sandbox/guardian/guardian-demo.js +35 -0
- package/dist/components/sandbox/guardian/guardian-home.d.ts +4 -0
- package/dist/components/sandbox/guardian/guardian-home.js +61 -0
- package/dist/components/sandbox/guardian/guardian-playground.js +45 -0
- package/dist/components/sandbox/guardian/guardian-style-wrapper.js +47 -0
- package/dist/components/sandbox/guardian/guardian-upload-spec.d.ts +14 -0
- package/dist/components/sandbox/guardian/guardian-upload-spec.js +160 -0
- package/dist/components/sandbox/guardian/header/glassmorphic-combobox.js +30 -0
- package/dist/components/sandbox/guardian/header.js +61 -0
- package/dist/components/sandbox/guardian/hooks/use-frame-messages.js +65 -0
- package/dist/components/sandbox/guardian/hooks/use-frame-params.js +44 -0
- package/dist/components/sandbox/guardian/hooks/use-sandbox-url-loader.js +125 -0
- package/dist/components/sandbox/guardian/ide/browser.js +538 -0
- package/dist/components/sandbox/guardian/index.js +8 -0
- package/dist/components/sandbox/guardian/right-view/code-view.js +60 -0
- package/dist/components/sandbox/guardian/right-view/pill-file-selector.js +246 -0
- package/dist/components/sandbox/guardian/right-view/preview-control-bar.js +25 -0
- package/dist/components/sandbox/guardian/right-view/right-panel-view.js +51 -0
- package/dist/components/sandbox/guardian/right-view/right-top-down-view.js +281 -0
- package/dist/components/sandbox/guardian/right-view/right-view.js +28 -0
- package/dist/components/sandbox/guardian/right-view/simplified-editor.js +234 -0
- package/dist/components/sandbox/guardian/types/ide-types.js +162 -0
- package/dist/components/sandbox/guardian/types.js +3 -0
- package/dist/components/sandbox/guardian/ui/ai-loader.js +91 -0
- package/dist/components/sandbox/guardian/ui/badge.js +24 -0
- package/dist/components/sandbox/guardian/ui/button.js +45 -0
- package/dist/components/sandbox/guardian/ui/command.js +63 -0
- package/dist/components/sandbox/guardian/ui/console-with-app.js +17 -0
- package/dist/components/sandbox/guardian/ui/dialog.js +57 -0
- package/dist/components/sandbox/guardian/ui/download-and-open-buttons.js +117 -0
- package/dist/components/sandbox/guardian/ui/dropdown-menu.js +82 -0
- package/dist/components/sandbox/guardian/ui/markdown/accordion-group/accordion.js +62 -0
- package/dist/components/sandbox/guardian/ui/markdown/accordion-group.js +23 -0
- package/dist/components/sandbox/guardian/ui/markdown/callout/callout-check.js +4 -0
- package/dist/components/sandbox/guardian/ui/markdown/callout/callout-error.js +4 -0
- package/dist/components/sandbox/guardian/ui/markdown/callout/callout-info.js +4 -0
- package/dist/components/sandbox/guardian/ui/markdown/callout/callout-note.js +4 -0
- package/dist/components/sandbox/guardian/ui/markdown/callout/callout-tip.js +4 -0
- package/dist/components/sandbox/guardian/ui/markdown/callout/callout-warning.js +4 -0
- package/dist/components/sandbox/guardian/ui/markdown/callout/shared/callout.js +9 -0
- package/dist/components/sandbox/guardian/ui/markdown/callout/shared/types.js +1 -0
- package/dist/components/sandbox/guardian/ui/markdown/card-group/card.js +18 -0
- package/dist/components/sandbox/guardian/ui/markdown/card-group.js +25 -0
- package/dist/components/sandbox/guardian/ui/markdown/code-group/code-block.js +54 -0
- package/dist/components/sandbox/guardian/ui/markdown/code-group.js +101 -0
- package/dist/components/sandbox/guardian/ui/markdown/icon.js +31 -0
- package/dist/components/sandbox/guardian/ui/markdown.js +791 -0
- package/dist/components/sandbox/guardian/ui/popover.js +25 -0
- package/dist/components/sandbox/guardian/ui/tooltip.js +25 -0
- package/dist/components/sandbox/guardian/utils.js +89 -0
- package/dist/components/sandbox/guardian/zip-to-codebase.js +259 -0
- package/dist/components/sandbox/guardian/zip-to-filetree.js +284 -0
- package/dist/components/sandbox/index.js +4 -0
- package/dist/components/sandbox/sandbox-control-bar.js +91 -0
- package/dist/components/sandbox/sandbox-header.js +52 -0
- package/dist/components/sandbox/sandbox-home/SandboxCard.js +65 -0
- package/dist/components/sandbox/sandbox-home/SandboxHome.js +115 -0
- package/dist/components/sandbox/sandbox-home/SearchBar.js +12 -0
- package/dist/components/sandbox/sandbox-home/index.js +3 -0
- package/dist/components/sandbox/sandbox-left-panel.js +248 -0
- package/dist/components/sandbox/sandbox-loading.js +48 -0
- package/dist/components/sandbox/sandbox-right-panel.js +247 -0
- package/dist/components/sandbox/types.js +1 -0
- package/dist/components/sandbox.js +32 -0
- package/dist/components/tailwind-example.js +46 -0
- package/dist/components/ui/skeleton.js +18 -0
- package/dist/index.d.ts +32 -103
- package/dist/index.es.js +90529 -423
- package/dist/index.js +13 -2
- package/dist/index.standalone.js +61 -53
- package/dist/index.standalone.umd.js +17 -24
- package/dist/lib/api-client.example.js +60 -0
- package/dist/lib/api-client.js +140 -0
- package/dist/lib/generated-css.js +4 -0
- package/dist/lib/inject-styles.js +42 -0
- package/dist/lib/shadow-dom-wrapper.js +42 -0
- package/dist/lib/utils.js +5 -0
- package/dist/sdk.css +1 -1
- package/dist/tailwind.css +1 -0
- package/package.json +41 -9
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// Types for IDE context compatibility
|
|
2
|
+
export var Framework;
|
|
3
|
+
(function (Framework) {
|
|
4
|
+
// DJANGO = "django",
|
|
5
|
+
Framework["FLASK"] = "flask";
|
|
6
|
+
Framework["EXPRESS"] = "express";
|
|
7
|
+
Framework["NEXTJS_YARN"] = "nextjsy";
|
|
8
|
+
Framework["VITE"] = "vite";
|
|
9
|
+
Framework["NEXTJS"] = "nextjs";
|
|
10
|
+
Framework["FASTAPI"] = "fastapi";
|
|
11
|
+
Framework["FASTMCP"] = "fastmcp";
|
|
12
|
+
})(Framework || (Framework = {}));
|
|
13
|
+
export const FrameworkLabel = {
|
|
14
|
+
[Framework.FLASK]: "Flask",
|
|
15
|
+
[Framework.VITE]: "Vite",
|
|
16
|
+
[Framework.NEXTJS]: "Next.js",
|
|
17
|
+
[Framework.NEXTJS_YARN]: "Next.js (Yarn)",
|
|
18
|
+
[Framework.EXPRESS]: "Express",
|
|
19
|
+
[Framework.FASTAPI]: "FastAPI",
|
|
20
|
+
[Framework.FASTMCP]: "FastMCP",
|
|
21
|
+
};
|
|
22
|
+
export var CodeLanguage;
|
|
23
|
+
(function (CodeLanguage) {
|
|
24
|
+
// Web/Frontend Languages
|
|
25
|
+
CodeLanguage["JAVASCRIPT"] = "javascript";
|
|
26
|
+
CodeLanguage["TYPESCRIPT"] = "typescript";
|
|
27
|
+
CodeLanguage["HTML"] = "html";
|
|
28
|
+
CodeLanguage["CSS"] = "css";
|
|
29
|
+
CodeLanguage["SCSS"] = "scss";
|
|
30
|
+
CodeLanguage["MARKDOWN"] = "markdown";
|
|
31
|
+
CodeLanguage["TOML"] = "toml";
|
|
32
|
+
CodeLanguage["C"] = "c";
|
|
33
|
+
CodeLanguage["DOCKERFILE"] = "dockerfile";
|
|
34
|
+
// Backend Languages
|
|
35
|
+
CodeLanguage["PYTHON"] = "python";
|
|
36
|
+
CodeLanguage["JAVA"] = "java";
|
|
37
|
+
CodeLanguage["CSHARP"] = "csharp";
|
|
38
|
+
CodeLanguage["CPP"] = "cpp";
|
|
39
|
+
CodeLanguage["RUBY"] = "ruby";
|
|
40
|
+
CodeLanguage["GO"] = "go";
|
|
41
|
+
CodeLanguage["RUST"] = "rust";
|
|
42
|
+
CodeLanguage["SWIFT"] = "swift";
|
|
43
|
+
CodeLanguage["KOTLIN"] = "kotlin";
|
|
44
|
+
CodeLanguage["PHP"] = "php";
|
|
45
|
+
// System/Shell Languages
|
|
46
|
+
CodeLanguage["BASH"] = "bash";
|
|
47
|
+
CodeLanguage["POWERSHELL"] = "powershell";
|
|
48
|
+
// Database Languages
|
|
49
|
+
CodeLanguage["SQL"] = "sql";
|
|
50
|
+
CodeLanguage["PLSQL"] = "plsql";
|
|
51
|
+
// Markup/Config Languages
|
|
52
|
+
CodeLanguage["XML"] = "xml";
|
|
53
|
+
CodeLanguage["YAML"] = "yaml";
|
|
54
|
+
// Other Languages
|
|
55
|
+
CodeLanguage["R"] = "r";
|
|
56
|
+
CodeLanguage["SCALA"] = "scala";
|
|
57
|
+
CodeLanguage["PERL"] = "perl";
|
|
58
|
+
CodeLanguage["HASKELL"] = "haskell";
|
|
59
|
+
CodeLanguage["MATLAB"] = "matlab";
|
|
60
|
+
CodeLanguage["ASSEMBLY"] = "assembly";
|
|
61
|
+
CodeLanguage["DART"] = "dart";
|
|
62
|
+
CodeLanguage["ELIXIR"] = "elixir";
|
|
63
|
+
CodeLanguage["LUA"] = "lua";
|
|
64
|
+
CodeLanguage["OBJECTIVEC"] = "objectivec";
|
|
65
|
+
CodeLanguage["TEXT"] = "text";
|
|
66
|
+
CodeLanguage["JSON"] = "json";
|
|
67
|
+
})(CodeLanguage || (CodeLanguage = {}));
|
|
68
|
+
// Map file extensions to CodeLanguage enum
|
|
69
|
+
export function filePathToCodeLanguage(filePath) {
|
|
70
|
+
var _a;
|
|
71
|
+
const ext = (_a = filePath.split(".").pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
|
|
72
|
+
if (!ext) {
|
|
73
|
+
return CodeLanguage.TEXT;
|
|
74
|
+
}
|
|
75
|
+
switch (ext.replace(/^\./, "").toLowerCase()) {
|
|
76
|
+
case "js":
|
|
77
|
+
case "jsx":
|
|
78
|
+
return CodeLanguage.JAVASCRIPT;
|
|
79
|
+
case "ts":
|
|
80
|
+
case "tsx":
|
|
81
|
+
return CodeLanguage.TYPESCRIPT;
|
|
82
|
+
case "html":
|
|
83
|
+
return CodeLanguage.HTML;
|
|
84
|
+
case "css":
|
|
85
|
+
return CodeLanguage.CSS;
|
|
86
|
+
case "scss":
|
|
87
|
+
case "sass":
|
|
88
|
+
return CodeLanguage.SCSS;
|
|
89
|
+
case "py":
|
|
90
|
+
return CodeLanguage.PYTHON;
|
|
91
|
+
case "java":
|
|
92
|
+
return CodeLanguage.JAVA;
|
|
93
|
+
case "cs":
|
|
94
|
+
return CodeLanguage.CSHARP;
|
|
95
|
+
case "cpp":
|
|
96
|
+
case "cc":
|
|
97
|
+
case "cxx":
|
|
98
|
+
return CodeLanguage.CPP;
|
|
99
|
+
case "c":
|
|
100
|
+
return CodeLanguage.C;
|
|
101
|
+
case "rb":
|
|
102
|
+
return CodeLanguage.RUBY;
|
|
103
|
+
case "go":
|
|
104
|
+
return CodeLanguage.GO;
|
|
105
|
+
case "rs":
|
|
106
|
+
return CodeLanguage.RUST;
|
|
107
|
+
case "swift":
|
|
108
|
+
return CodeLanguage.SWIFT;
|
|
109
|
+
case "kt":
|
|
110
|
+
return CodeLanguage.KOTLIN;
|
|
111
|
+
case "php":
|
|
112
|
+
return CodeLanguage.PHP;
|
|
113
|
+
case "sh":
|
|
114
|
+
case "bash":
|
|
115
|
+
return CodeLanguage.BASH;
|
|
116
|
+
case "ps1":
|
|
117
|
+
return CodeLanguage.POWERSHELL;
|
|
118
|
+
case "sql":
|
|
119
|
+
return CodeLanguage.SQL;
|
|
120
|
+
case "plsql":
|
|
121
|
+
return CodeLanguage.PLSQL;
|
|
122
|
+
case "xml":
|
|
123
|
+
return CodeLanguage.XML;
|
|
124
|
+
case "yaml":
|
|
125
|
+
case "yml":
|
|
126
|
+
return CodeLanguage.YAML;
|
|
127
|
+
case "r":
|
|
128
|
+
return CodeLanguage.R;
|
|
129
|
+
case "scala":
|
|
130
|
+
return CodeLanguage.SCALA;
|
|
131
|
+
case "pl":
|
|
132
|
+
return CodeLanguage.PERL;
|
|
133
|
+
case "hs":
|
|
134
|
+
return CodeLanguage.HASKELL;
|
|
135
|
+
case "m":
|
|
136
|
+
return CodeLanguage.MATLAB;
|
|
137
|
+
case "s":
|
|
138
|
+
case "asm":
|
|
139
|
+
return CodeLanguage.ASSEMBLY;
|
|
140
|
+
case "dart":
|
|
141
|
+
return CodeLanguage.DART;
|
|
142
|
+
case "ex":
|
|
143
|
+
case "exs":
|
|
144
|
+
return CodeLanguage.ELIXIR;
|
|
145
|
+
case "lua":
|
|
146
|
+
return CodeLanguage.LUA;
|
|
147
|
+
case "m":
|
|
148
|
+
case "mm":
|
|
149
|
+
return CodeLanguage.OBJECTIVEC;
|
|
150
|
+
case "md":
|
|
151
|
+
case "markdown":
|
|
152
|
+
return CodeLanguage.MARKDOWN;
|
|
153
|
+
case "json":
|
|
154
|
+
return CodeLanguage.JSON;
|
|
155
|
+
case "toml":
|
|
156
|
+
return CodeLanguage.TOML;
|
|
157
|
+
case "dockerfile":
|
|
158
|
+
return CodeLanguage.DOCKERFILE;
|
|
159
|
+
default:
|
|
160
|
+
return CodeLanguage.TEXT;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
// Helper to convert hex to RGB
|
|
3
|
+
function hexToRgb(hex) {
|
|
4
|
+
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
5
|
+
return result
|
|
6
|
+
? {
|
|
7
|
+
r: parseInt(result[1], 16),
|
|
8
|
+
g: parseInt(result[2], 16),
|
|
9
|
+
b: parseInt(result[3], 16),
|
|
10
|
+
}
|
|
11
|
+
: null;
|
|
12
|
+
}
|
|
13
|
+
// Helper to darken a color
|
|
14
|
+
function darkenColor(hex, percent) {
|
|
15
|
+
const rgb = hexToRgb(hex);
|
|
16
|
+
if (!rgb)
|
|
17
|
+
return hex;
|
|
18
|
+
const factor = 1 - percent / 100;
|
|
19
|
+
const r = Math.round(rgb.r * factor);
|
|
20
|
+
const g = Math.round(rgb.g * factor);
|
|
21
|
+
const b = Math.round(rgb.b * factor);
|
|
22
|
+
return `rgb(${r}, ${g}, ${b})`;
|
|
23
|
+
}
|
|
24
|
+
export const Component = ({ size = 180, text = "Generating", fullScreen = true, themeColor = "#3b82f6", // Default blue
|
|
25
|
+
}) => {
|
|
26
|
+
const letters = text.split("");
|
|
27
|
+
// Generate color variants from themeColor
|
|
28
|
+
const rgb = hexToRgb(themeColor);
|
|
29
|
+
const colorDark = darkenColor(themeColor, 60);
|
|
30
|
+
const colorMid = darkenColor(themeColor, 40);
|
|
31
|
+
const colorLight = darkenColor(themeColor, 20);
|
|
32
|
+
const rgbaGlow = rgb
|
|
33
|
+
? `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.3)`
|
|
34
|
+
: "rgba(59, 130, 246, 0.3)";
|
|
35
|
+
// Generate gradient colors for dark mode
|
|
36
|
+
const gradientFrom = darkenColor(themeColor, 30);
|
|
37
|
+
return (React.createElement("div", { className: [
|
|
38
|
+
"flex items-center justify-center",
|
|
39
|
+
fullScreen ? "fixed inset-0 z-50" : "w-full h-full",
|
|
40
|
+
].join(" "), style: {
|
|
41
|
+
background: `linear-gradient(to bottom, ${gradientFrom}, #0f172a, black)`,
|
|
42
|
+
} },
|
|
43
|
+
React.createElement("div", { className: "relative flex items-center justify-center font-inter select-none", style: { width: size, height: size } },
|
|
44
|
+
letters.map((letter, index) => {
|
|
45
|
+
// Preserve visual spacing for spaces by using a non‑breaking space
|
|
46
|
+
const displayChar = letter === " " ? "\u00A0" : letter;
|
|
47
|
+
return (React.createElement("span", { key: `${letter}-${index}`, className: "inline-block text-white opacity-40 animate-loaderLetter", style: { animationDelay: `${index * 0.1}s` } }, displayChar));
|
|
48
|
+
}),
|
|
49
|
+
React.createElement("div", { className: "absolute inset-0 rounded-full animate-loaderCircle", style: {
|
|
50
|
+
// @ts-ignore - CSS custom property
|
|
51
|
+
"--loader-color-dark": colorDark,
|
|
52
|
+
"--loader-color-mid": colorMid,
|
|
53
|
+
"--loader-color-light": colorLight,
|
|
54
|
+
"--loader-color-glow": rgbaGlow,
|
|
55
|
+
} })),
|
|
56
|
+
React.createElement("style", null, `
|
|
57
|
+
@keyframes loaderCircle {
|
|
58
|
+
0% {
|
|
59
|
+
transform: rotate(90deg);
|
|
60
|
+
box-shadow: 0 6px 12px 0 var(--loader-color-dark) inset,
|
|
61
|
+
0 12px 18px 0 var(--loader-color-mid) inset,
|
|
62
|
+
0 36px 36px 0 var(--loader-color-light) inset,
|
|
63
|
+
0 0 3px 1.2px var(--loader-color-glow),
|
|
64
|
+
0 0 0 0 var(--loader-color-glow);
|
|
65
|
+
}
|
|
66
|
+
100% {
|
|
67
|
+
transform: rotate(450deg);
|
|
68
|
+
box-shadow: 0 6px 12px 0 var(--loader-color-dark) inset,
|
|
69
|
+
0 12px 18px 0 var(--loader-color-mid) inset,
|
|
70
|
+
0 36px 36px 0 var(--loader-color-light) inset,
|
|
71
|
+
0 0 3px 1.2px var(--loader-color-glow),
|
|
72
|
+
0 0 0 0 var(--loader-color-glow);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
@keyframes loaderLetter {
|
|
76
|
+
0%,
|
|
77
|
+
100% {
|
|
78
|
+
opacity: 0.4;
|
|
79
|
+
}
|
|
80
|
+
50% {
|
|
81
|
+
opacity: 1;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
.animate-loaderCircle {
|
|
85
|
+
animation: loaderCircle 2s linear infinite;
|
|
86
|
+
}
|
|
87
|
+
.animate-loaderLetter {
|
|
88
|
+
animation: loaderLetter 1.5s ease-in-out infinite;
|
|
89
|
+
}
|
|
90
|
+
`)));
|
|
91
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import * as React from "react";
|
|
13
|
+
import { cn } from "../../../../lib/utils";
|
|
14
|
+
function Badge(_a) {
|
|
15
|
+
var { className, variant = "default" } = _a, props = __rest(_a, ["className", "variant"]);
|
|
16
|
+
const variantStyles = {
|
|
17
|
+
default: "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",
|
|
18
|
+
secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
19
|
+
destructive: "border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",
|
|
20
|
+
outline: "text-foreground",
|
|
21
|
+
};
|
|
22
|
+
return (React.createElement("div", Object.assign({ className: cn("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", variantStyles[variant], className) }, props)));
|
|
23
|
+
}
|
|
24
|
+
export { Badge };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import * as React from "react";
|
|
13
|
+
import { Slot } from "@radix-ui/react-slot";
|
|
14
|
+
import { cva } from "class-variance-authority";
|
|
15
|
+
import { cn } from "../../../../lib/utils";
|
|
16
|
+
const buttonVariants = cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-5 [&_svg]:shrink-0", {
|
|
17
|
+
variants: {
|
|
18
|
+
variant: {
|
|
19
|
+
default: "bg-primary text-primary-foreground shadow hover:bg-primary/90",
|
|
20
|
+
destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
|
|
21
|
+
outline: "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
|
|
22
|
+
secondary: "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/70",
|
|
23
|
+
ghost: "hover:bg-accent hover:text-accent-foreground",
|
|
24
|
+
link: "text-primary underline-offset-4 hover:underline",
|
|
25
|
+
ghostOutline: "border border-secondary shadow-sm hover:bg-accent hover:text-accent-foreground text-muted-foreground hover:text-foreground",
|
|
26
|
+
},
|
|
27
|
+
size: {
|
|
28
|
+
default: "h-9 px-4 py-2",
|
|
29
|
+
sm: "h-8 rounded-md px-3 text-xs",
|
|
30
|
+
lg: "h-10 rounded-md px-8",
|
|
31
|
+
icon: "h-8 w-8",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
defaultVariants: {
|
|
35
|
+
variant: "default",
|
|
36
|
+
size: "default",
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
const Button = React.forwardRef((_a, ref) => {
|
|
40
|
+
var { className, variant, size, asChild = false } = _a, props = __rest(_a, ["className", "variant", "size", "asChild"]);
|
|
41
|
+
const Comp = asChild ? Slot : "button";
|
|
42
|
+
return (React.createElement(Comp, Object.assign({ className: cn(buttonVariants({ variant, size, className })), ref: ref }, props)));
|
|
43
|
+
});
|
|
44
|
+
Button.displayName = "Button";
|
|
45
|
+
export { Button, buttonVariants };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
import * as React from "react";
|
|
14
|
+
import { Command as CommandPrimitive } from "cmdk";
|
|
15
|
+
import { Search } from "lucide-react";
|
|
16
|
+
import { cn } from "../../../../lib/utils";
|
|
17
|
+
import { Dialog, DialogContent } from "./dialog";
|
|
18
|
+
const Command = React.forwardRef((_a, ref) => {
|
|
19
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
20
|
+
return (React.createElement(CommandPrimitive, Object.assign({ ref: ref, className: cn("flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground", className) }, props)));
|
|
21
|
+
});
|
|
22
|
+
Command.displayName = CommandPrimitive.displayName;
|
|
23
|
+
const CommandDialog = (_a) => {
|
|
24
|
+
var { children } = _a, props = __rest(_a, ["children"]);
|
|
25
|
+
return (React.createElement(Dialog, Object.assign({}, props),
|
|
26
|
+
React.createElement(DialogContent, { className: "overflow-hidden p-0" },
|
|
27
|
+
React.createElement(Command, { className: "[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5" }, children))));
|
|
28
|
+
};
|
|
29
|
+
const CommandInput = React.forwardRef((_a, ref) => {
|
|
30
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
31
|
+
return (React.createElement("div", { className: "flex items-center border-b px-3", "cmdk-input-wrapper": "" },
|
|
32
|
+
React.createElement(Search, { className: "mr-2 h-4 w-4 shrink-0 opacity-50" }),
|
|
33
|
+
React.createElement(CommandPrimitive.Input, Object.assign({ ref: ref, className: cn("flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50", className) }, props))));
|
|
34
|
+
});
|
|
35
|
+
CommandInput.displayName = CommandPrimitive.Input.displayName;
|
|
36
|
+
const CommandList = React.forwardRef((_a, ref) => {
|
|
37
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
38
|
+
return (React.createElement(CommandPrimitive.List, Object.assign({ ref: ref, className: cn("max-h-[300px] overflow-y-auto overflow-x-hidden", className) }, props)));
|
|
39
|
+
});
|
|
40
|
+
CommandList.displayName = CommandPrimitive.List.displayName;
|
|
41
|
+
const CommandEmpty = React.forwardRef((props, ref) => (React.createElement(CommandPrimitive.Empty, Object.assign({ ref: ref, className: "py-6 text-center text-sm" }, props))));
|
|
42
|
+
CommandEmpty.displayName = CommandPrimitive.Empty.displayName;
|
|
43
|
+
const CommandGroup = React.forwardRef((_a, ref) => {
|
|
44
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
45
|
+
return (React.createElement(CommandPrimitive.Group, Object.assign({ ref: ref, className: cn("overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground", className) }, props)));
|
|
46
|
+
});
|
|
47
|
+
CommandGroup.displayName = CommandPrimitive.Group.displayName;
|
|
48
|
+
const CommandSeparator = React.forwardRef((_a, ref) => {
|
|
49
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
50
|
+
return (React.createElement(CommandPrimitive.Separator, Object.assign({ ref: ref, className: cn("-mx-1 h-px bg-border", className) }, props)));
|
|
51
|
+
});
|
|
52
|
+
CommandSeparator.displayName = CommandPrimitive.Separator.displayName;
|
|
53
|
+
const CommandItem = React.forwardRef((_a, ref) => {
|
|
54
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
55
|
+
return (React.createElement(CommandPrimitive.Item, Object.assign({ ref: ref, className: cn("relative flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", className) }, props)));
|
|
56
|
+
});
|
|
57
|
+
CommandItem.displayName = CommandPrimitive.Item.displayName;
|
|
58
|
+
const CommandShortcut = (_a) => {
|
|
59
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
60
|
+
return (React.createElement("span", Object.assign({ className: cn("ml-auto text-xs tracking-widest text-muted-foreground", className) }, props)));
|
|
61
|
+
};
|
|
62
|
+
CommandShortcut.displayName = "CommandShortcut";
|
|
63
|
+
export { Command, CommandDialog, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandShortcut, CommandSeparator, };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels";
|
|
4
|
+
import { cn } from "../../../../lib/utils";
|
|
5
|
+
export default function ConsoleWithApp({ containerClassName, console, app, }) {
|
|
6
|
+
return (React.createElement("div", { className: cn("w-full h-full max-w-full max-h-full min-h-0 min-w-0 overflow-hidden", containerClassName) },
|
|
7
|
+
React.createElement(PanelGroup, { direction: "horizontal", className: "w-full h-full" },
|
|
8
|
+
React.createElement(Panel, { defaultSize: 37, minSize: 20, order: 1 },
|
|
9
|
+
React.createElement("div", { className: "h-full w-full" },
|
|
10
|
+
React.createElement("div", { className: "flex-1 flex flex-col min-h-0 h-full" }, console))),
|
|
11
|
+
React.createElement(PanelResizeHandle, { className: "w-0 relative group flex-shrink-0" },
|
|
12
|
+
React.createElement("div", { className: "absolute inset-y-0 left-1/2 -translate-x-1/2 w-2 -ml-0.5 group-hover:bg-blue-400/20 transition-colors flex justify-center items-center" },
|
|
13
|
+
React.createElement("div", { className: "h-full w-px bg-border group-hover:bg-blue-400 transition-colors" }))),
|
|
14
|
+
React.createElement(Panel, { defaultSize: 63, minSize: 40, order: 2 },
|
|
15
|
+
React.createElement("div", { className: "h-full w-full" },
|
|
16
|
+
React.createElement("div", { className: "flex-1 flex flex-col min-h-0 h-full" }, app))))));
|
|
17
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
import * as React from "react";
|
|
14
|
+
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
|
15
|
+
import { X } from "lucide-react";
|
|
16
|
+
import { cn } from "../../../../lib/utils";
|
|
17
|
+
const Dialog = DialogPrimitive.Root;
|
|
18
|
+
const DialogTrigger = DialogPrimitive.Trigger;
|
|
19
|
+
const DialogPortal = DialogPrimitive.Portal;
|
|
20
|
+
const DialogClose = DialogPrimitive.Close;
|
|
21
|
+
const DialogOverlay = React.forwardRef((_a, ref) => {
|
|
22
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
23
|
+
return (React.createElement(DialogPrimitive.Overlay, Object.assign({ ref: ref, className: cn("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", className) }, props)));
|
|
24
|
+
});
|
|
25
|
+
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
|
26
|
+
const DialogContent = React.forwardRef((_a, ref) => {
|
|
27
|
+
var { className, children } = _a, props = __rest(_a, ["className", "children"]);
|
|
28
|
+
return (React.createElement(DialogPortal, null,
|
|
29
|
+
React.createElement(DialogOverlay, null),
|
|
30
|
+
React.createElement(DialogPrimitive.Content, Object.assign({ ref: ref, className: cn("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg", className) }, props),
|
|
31
|
+
children,
|
|
32
|
+
React.createElement(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground" },
|
|
33
|
+
React.createElement(X, { className: "h-4 w-4" }),
|
|
34
|
+
React.createElement("span", { className: "sr-only" }, "Close")))));
|
|
35
|
+
});
|
|
36
|
+
DialogContent.displayName = DialogPrimitive.Content.displayName;
|
|
37
|
+
const DialogHeader = (_a) => {
|
|
38
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
39
|
+
return (React.createElement("div", Object.assign({ className: cn("flex flex-col space-y-1.5 text-center sm:text-left", className) }, props)));
|
|
40
|
+
};
|
|
41
|
+
DialogHeader.displayName = "DialogHeader";
|
|
42
|
+
const DialogFooter = (_a) => {
|
|
43
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
44
|
+
return (React.createElement("div", Object.assign({ className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className) }, props)));
|
|
45
|
+
};
|
|
46
|
+
DialogFooter.displayName = "DialogFooter";
|
|
47
|
+
const DialogTitle = React.forwardRef((_a, ref) => {
|
|
48
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
49
|
+
return (React.createElement(DialogPrimitive.Title, Object.assign({ ref: ref, className: cn("text-lg font-semibold leading-none tracking-tight", className) }, props)));
|
|
50
|
+
});
|
|
51
|
+
DialogTitle.displayName = DialogPrimitive.Title.displayName;
|
|
52
|
+
const DialogDescription = React.forwardRef((_a, ref) => {
|
|
53
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
54
|
+
return (React.createElement(DialogPrimitive.Description, Object.assign({ ref: ref, className: cn("text-sm text-muted-foreground", className) }, props)));
|
|
55
|
+
});
|
|
56
|
+
DialogDescription.displayName = DialogPrimitive.Description.displayName;
|
|
57
|
+
export { Dialog, DialogPortal, DialogOverlay, DialogClose, DialogTrigger, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription, };
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { DownloadIcon, Check, Copy } from "lucide-react";
|
|
4
|
+
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from "./dialog";
|
|
5
|
+
import vscodeLogo from "../../../../assets/vscode.png";
|
|
6
|
+
import { extractContainerIdFromUrl } from "../../../../lib/api-client";
|
|
7
|
+
// VSCode logo component using imported asset
|
|
8
|
+
function VSCodeLogo({ className }) {
|
|
9
|
+
return (React.createElement("img", { src: vscodeLogo, alt: "VSCode", width: 20, height: 20, className: className }));
|
|
10
|
+
}
|
|
11
|
+
export const DownloadAndOpenButtons = ({ downloadUrl, themeColor, gitUrl, browserUrl, }) => {
|
|
12
|
+
const [isModalOpen, setIsModalOpen] = React.useState(false);
|
|
13
|
+
const [hasCopied, setHasCopied] = React.useState(false);
|
|
14
|
+
// Extract container ID from browserUrl and build download URL (same as Download Code button)
|
|
15
|
+
const containerDownloadUrl = React.useMemo(() => {
|
|
16
|
+
if (!browserUrl)
|
|
17
|
+
return null;
|
|
18
|
+
const containerId = extractContainerIdFromUrl(browserUrl);
|
|
19
|
+
if (!containerId)
|
|
20
|
+
return null;
|
|
21
|
+
const baseUrl = process.env.BASE_API_URL || "https://api.sampleapp.ai";
|
|
22
|
+
return `${baseUrl}/api/v1/sdk/download-code?container_id=${encodeURIComponent(containerId)}`;
|
|
23
|
+
}, [browserUrl]);
|
|
24
|
+
// Normalize the download path to work with public directory (fallback for static files)
|
|
25
|
+
const normalizedDownloadUrl = React.useMemo(() => {
|
|
26
|
+
let normalizedPath = downloadUrl;
|
|
27
|
+
if (normalizedPath.startsWith("/public/")) {
|
|
28
|
+
normalizedPath = normalizedPath.slice("/public".length);
|
|
29
|
+
}
|
|
30
|
+
if (!normalizedPath.startsWith("/")) {
|
|
31
|
+
normalizedPath = "/" + normalizedPath;
|
|
32
|
+
}
|
|
33
|
+
return normalizedPath;
|
|
34
|
+
}, [downloadUrl]);
|
|
35
|
+
// Use container-based download URL if available, otherwise fall back to static file
|
|
36
|
+
const finalDownloadUrl = containerDownloadUrl || normalizedDownloadUrl;
|
|
37
|
+
// Build the npx command using the static API route
|
|
38
|
+
// Use default MAIN_APP_URL for SDK (can be overridden via env)
|
|
39
|
+
const MAIN_APP_URL = typeof window !== "undefined" && window.SAMPLEAPP_MAIN_URL
|
|
40
|
+
? window.SAMPLEAPP_MAIN_URL
|
|
41
|
+
: "https://sampleapp.ai";
|
|
42
|
+
const npxCommand = React.useMemo(() => {
|
|
43
|
+
// If using container-based download, we can't generate a static npx command
|
|
44
|
+
// Use the container download URL instead
|
|
45
|
+
if (containerDownloadUrl) {
|
|
46
|
+
return `npx sampleappai add "${containerDownloadUrl}"`;
|
|
47
|
+
}
|
|
48
|
+
// Remove .zip extension and leading slash for the API path
|
|
49
|
+
let apiPath = normalizedDownloadUrl;
|
|
50
|
+
if (apiPath.startsWith("/")) {
|
|
51
|
+
apiPath = apiPath.slice(1);
|
|
52
|
+
}
|
|
53
|
+
if (apiPath.endsWith(".zip")) {
|
|
54
|
+
apiPath = apiPath.slice(0, -4);
|
|
55
|
+
}
|
|
56
|
+
return `npx sampleappai add "${MAIN_APP_URL}/api/code/static/${apiPath}"`;
|
|
57
|
+
}, [containerDownloadUrl, normalizedDownloadUrl, MAIN_APP_URL]);
|
|
58
|
+
const handleDownload = () => {
|
|
59
|
+
window.open(finalDownloadUrl, "_blank");
|
|
60
|
+
};
|
|
61
|
+
const handleOpenInVSCode = () => {
|
|
62
|
+
if (gitUrl) {
|
|
63
|
+
try {
|
|
64
|
+
window.location.href = `vscode://vscode.git/clone?url=${gitUrl}`;
|
|
65
|
+
}
|
|
66
|
+
catch (_a) {
|
|
67
|
+
// Silently fail if vscode:// protocol isn't registered
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
setIsModalOpen(true);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const handleCopyCommand = async () => {
|
|
75
|
+
await navigator.clipboard.writeText(npxCommand);
|
|
76
|
+
setHasCopied(true);
|
|
77
|
+
setTimeout(() => setHasCopied(false), 2000);
|
|
78
|
+
};
|
|
79
|
+
const handleOpenVSCode = () => {
|
|
80
|
+
try {
|
|
81
|
+
window.location.href = "vscode://";
|
|
82
|
+
}
|
|
83
|
+
catch (_a) {
|
|
84
|
+
// Silently fail if vscode:// protocol isn't registered
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
return (React.createElement(React.Fragment, null,
|
|
88
|
+
React.createElement("div", { className: "flex items-center gap-2" },
|
|
89
|
+
React.createElement("button", { type: "button", className: "inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-md !text-white transition-all hover:opacity-90 active:scale-[0.98]", style: { backgroundColor: themeColor }, onClick: handleDownload },
|
|
90
|
+
React.createElement(DownloadIcon, { className: "w-3.5 h-3.5 !text-white" }),
|
|
91
|
+
"Download example"),
|
|
92
|
+
React.createElement("button", { type: "button", className: "inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-md border transition-all hover:opacity-90 active:scale-[0.98] bg-zinc-900 dark:bg-zinc-800 border-zinc-700 dark:border-zinc-700 !text-white", onClick: handleOpenInVSCode },
|
|
93
|
+
React.createElement(VSCodeLogo, { className: "w-3.5 h-3.5" }),
|
|
94
|
+
"Integrate in VS Code")),
|
|
95
|
+
React.createElement(Dialog, { open: isModalOpen, onOpenChange: setIsModalOpen },
|
|
96
|
+
React.createElement(DialogContent, { className: "max-w-[90vw] sm:max-w-md w-full" },
|
|
97
|
+
React.createElement(DialogHeader, null,
|
|
98
|
+
React.createElement(DialogTitle, { className: "flex items-center gap-2" },
|
|
99
|
+
React.createElement(VSCodeLogo, { className: "w-5 h-5" }),
|
|
100
|
+
"Add to VS Code"),
|
|
101
|
+
React.createElement(DialogDescription, null, "Copy the command and paste it in VSCode terminal")),
|
|
102
|
+
React.createElement("div", { className: "flex flex-col gap-4 py-2 overflow-hidden" },
|
|
103
|
+
React.createElement("div", { className: "flex flex-col gap-2 overflow-hidden" },
|
|
104
|
+
React.createElement("div", { className: "flex items-center gap-2" },
|
|
105
|
+
React.createElement("div", { className: "flex-shrink-0 w-5 h-5 rounded-full flex items-center justify-center text-[10px] font-bold text-white", style: { backgroundColor: themeColor } }, "1"),
|
|
106
|
+
React.createElement("p", { className: "text-sm font-medium" }, "Copy this command")),
|
|
107
|
+
React.createElement("div", { className: "flex items-center gap-2 overflow-hidden" },
|
|
108
|
+
React.createElement("code", { className: "flex-1 bg-zinc-100 dark:bg-zinc-800 px-3 py-2.5 rounded-md text-xs font-mono truncate block max-w-[calc(100%-3rem)]" }, npxCommand.replace("http://localhost:3000", "https://sampleapp.ai")),
|
|
109
|
+
React.createElement("button", { type: "button", onClick: handleCopyCommand, className: "flex-shrink-0 p-2 rounded-md hover:bg-zinc-100 dark:hover:bg-zinc-700 transition-colors border border-zinc-200 dark:border-zinc-700" }, hasCopied ? (React.createElement(Check, { className: "w-4 h-4 text-green-500" })) : (React.createElement(Copy, { className: "w-4 h-4 text-muted-foreground" }))))),
|
|
110
|
+
React.createElement("div", { className: "flex flex-col gap-2" },
|
|
111
|
+
React.createElement("div", { className: "flex items-center gap-2" },
|
|
112
|
+
React.createElement("div", { className: "flex-shrink-0 w-5 h-5 rounded-full flex items-center justify-center text-[10px] font-bold text-white", style: { backgroundColor: themeColor } }, "2"),
|
|
113
|
+
React.createElement("p", { className: "text-sm font-medium" }, "Open VSCode and paste in terminal")),
|
|
114
|
+
React.createElement("button", { type: "button", onClick: handleOpenVSCode, className: "w-full inline-flex items-center justify-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md text-white transition-all hover:opacity-90 active:scale-[0.99]", style: { backgroundColor: themeColor } },
|
|
115
|
+
React.createElement(VSCodeLogo, { className: "w-4 h-4" }),
|
|
116
|
+
"Open VSCode")))))));
|
|
117
|
+
};
|