@nospt/plugin-dev-ai-hub 0.1.0 → 0.2.1
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/dev/index.tsx +17 -217
- package/dist/api/DevAiHubClient.esm.js +2 -0
- package/dist/api/DevAiHubClient.esm.js.map +1 -1
- package/dist/components/AssetCard/AssetCard.esm.js +60 -134
- package/dist/components/AssetCard/AssetCard.esm.js.map +1 -1
- package/dist/components/AssetCard/AssetCard.module.css.esm.js +8 -0
- package/dist/components/AssetCard/AssetCard.module.css.esm.js.map +1 -0
- package/dist/components/AssetDetailPanel/AssetDetailPanel.esm.js +175 -281
- package/dist/components/AssetDetailPanel/AssetDetailPanel.esm.js.map +1 -1
- package/dist/components/AssetDetailPanel/AssetDetailPanel.module.css.esm.js +8 -0
- package/dist/components/AssetDetailPanel/AssetDetailPanel.module.css.esm.js.map +1 -0
- package/dist/components/AssetFilters/AssetFilters.esm.js +94 -134
- package/dist/components/AssetFilters/AssetFilters.esm.js.map +1 -1
- package/dist/components/AssetFilters/AssetFilters.module.css.esm.js +8 -0
- package/dist/components/AssetFilters/AssetFilters.module.css.esm.js.map +1 -0
- package/dist/components/AssetInstallDialog/AssetInstallDialog.esm.js +70 -126
- package/dist/components/AssetInstallDialog/AssetInstallDialog.esm.js.map +1 -1
- package/dist/components/AssetInstallDialog/AssetInstallDialog.module.css.esm.js +8 -0
- package/dist/components/AssetInstallDialog/AssetInstallDialog.module.css.esm.js.map +1 -0
- package/dist/components/DevAiHubPage/DevAiHubPage.esm.js +64 -189
- package/dist/components/DevAiHubPage/DevAiHubPage.esm.js.map +1 -1
- package/dist/components/DevAiHubPage/DevAiHubPage.module.css.esm.js +8 -0
- package/dist/components/DevAiHubPage/DevAiHubPage.module.css.esm.js.map +1 -0
- package/dist/components/McpConfigPage/McpConfigPage.esm.js +200 -0
- package/dist/components/McpConfigPage/McpConfigPage.esm.js.map +1 -0
- package/dist/components/McpConfigPage/McpConfigPage.module.css.esm.js +8 -0
- package/dist/components/McpConfigPage/McpConfigPage.module.css.esm.js.map +1 -0
- package/dist/components/McpConfigPage/index.esm.js +6 -0
- package/dist/components/McpConfigPage/index.esm.js.map +1 -0
- package/dist/components/ToolIcon/ToolIcon.esm.js +25 -13
- package/dist/components/ToolIcon/ToolIcon.esm.js.map +1 -1
- package/dist/index.d.ts +10 -5
- package/dist/index.esm.js +1 -1
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +29 -0
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -0
- package/dist/plugin.esm.js +24 -6
- package/dist/plugin.esm.js.map +1 -1
- package/dist/routes.esm.js +2 -1
- package/dist/routes.esm.js.map +1 -1
- package/package.json +24 -14
- package/package.json-prepack +24 -14
- package/src/components/AssetCard/AssetCard.module.css +153 -0
- package/src/components/AssetCard/AssetCard.tsx +79 -148
- package/src/components/AssetDetailPanel/AssetDetailPanel.module.css +207 -0
- package/src/components/AssetDetailPanel/AssetDetailPanel.tsx +228 -292
- package/src/components/AssetFilters/AssetFilters.module.css +67 -0
- package/src/components/AssetFilters/AssetFilters.tsx +136 -178
- package/src/components/AssetInstallDialog/AssetInstallDialog.module.css +72 -0
- package/src/components/AssetInstallDialog/AssetInstallDialog.tsx +95 -135
- package/src/components/DevAiHubPage/DevAiHubPage.module.css +105 -0
- package/src/components/DevAiHubPage/DevAiHubPage.tsx +73 -222
- package/src/components/McpConfigDialog/McpConfigDialog.module.css +111 -0
- package/src/components/McpConfigDialog/McpConfigDialog.tsx +178 -208
- package/src/components/McpConfigPage/McpConfigPage.module.css +121 -0
- package/src/components/McpConfigPage/McpConfigPage.tsx +242 -0
- package/src/components/McpConfigPage/index.ts +1 -0
- package/src/components/ToolIcon/ToolIcon.tsx +31 -15
- package/src/css-modules.d.ts +4 -0
- package/src/index.ts +1 -1
- package/src/plugin.tsx +23 -3
- package/src/routes.ts +1 -0
- package/tests/e2e/.auth.json +14 -0
- package/tests/e2e/asset-detail.spec.ts +90 -0
- package/tests/e2e/asset-filtering.spec.ts +145 -0
- package/tests/e2e/asset-installation.spec.ts +74 -0
- package/tests/e2e/dev-ai-hub-page.spec.ts +89 -0
- package/tests/e2e/fixtures/base.ts +61 -0
- package/tests/e2e/fixtures/mock-api.ts +221 -0
- package/tests/e2e/mcp-config.spec.ts +88 -0
- package/dist/components/McpConfigDialog/McpConfigDialog.esm.js +0 -274
- package/dist/components/McpConfigDialog/McpConfigDialog.esm.js.map +0 -1
|
@@ -1,24 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { useState } from 'react';
|
|
3
|
-
import Box from '@
|
|
4
|
-
import
|
|
5
|
-
import Button from '@mui/material/Button';
|
|
6
|
-
import CircularProgress from '@mui/material/CircularProgress';
|
|
7
|
-
import Dialog from '@mui/material/Dialog';
|
|
8
|
-
import DialogActions from '@mui/material/DialogActions';
|
|
9
|
-
import DialogContent from '@mui/material/DialogContent';
|
|
10
|
-
import DialogTitle from '@mui/material/DialogTitle';
|
|
11
|
-
import Tooltip from '@mui/material/Tooltip';
|
|
12
|
-
import Typography from '@mui/material/Typography';
|
|
13
|
-
import ContentCopyIcon from '@mui/icons-material/ContentCopy';
|
|
14
|
-
import DownloadIcon from '@mui/icons-material/Download';
|
|
15
|
-
import CheckIcon from '@mui/icons-material/Check';
|
|
16
|
-
import FolderZipIcon from '@mui/icons-material/FolderZip';
|
|
3
|
+
import { DialogTrigger, Dialog, DialogHeader, Text, DialogBody, Flex, Skeleton, Box, TagGroup, Tag, TooltipTrigger, Button, Tooltip, DialogFooter } from '@backstage/ui';
|
|
4
|
+
import { RiFolderZipLine, RiCheckLine, RiFileCopyLine, RiDownloadLine } from '@remixicon/react';
|
|
17
5
|
import { getInstallPathsForAsset } from '@nospt/plugin-dev-ai-hub-common';
|
|
18
6
|
import { useApi } from '@backstage/core-plugin-api';
|
|
19
7
|
import { devAiHubApiRef } from '../../api/DevAiHubClient.esm.js';
|
|
20
8
|
import { useAssetDetail } from '../../hooks/index.esm.js';
|
|
21
9
|
import { ToolIcon } from '../ToolIcon/ToolIcon.esm.js';
|
|
10
|
+
import styles from './AssetInstallDialog.module.css.esm.js';
|
|
22
11
|
|
|
23
12
|
const TOOL_LABELS = {
|
|
24
13
|
"claude-code": "Claude Code",
|
|
@@ -70,124 +59,79 @@ function AssetInstallDialog({ assetId, onClose }) {
|
|
|
70
59
|
installPath: asset.installPath,
|
|
71
60
|
installPaths: asset.installPaths
|
|
72
61
|
}) : {};
|
|
73
|
-
return /* @__PURE__ */
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
{
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
children: [
|
|
93
|
-
/* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 1, mb: 1 }, children: [
|
|
94
|
-
/* @__PURE__ */ jsx(FolderZipIcon, { sx: { fontSize: "1rem", color: "info.main" } }),
|
|
95
|
-
/* @__PURE__ */ jsx(Typography, { variant: "subtitle2", fontWeight: 700, color: "info.main", children: "Bundled skill \u2014 downloads as .zip" })
|
|
62
|
+
return /* @__PURE__ */ jsx(DialogTrigger, { children: /* @__PURE__ */ jsxs(
|
|
63
|
+
Dialog,
|
|
64
|
+
{
|
|
65
|
+
isOpen: !!assetId,
|
|
66
|
+
isDismissable: true,
|
|
67
|
+
onOpenChange: (open) => {
|
|
68
|
+
if (!open) handleClose();
|
|
69
|
+
},
|
|
70
|
+
children: [
|
|
71
|
+
/* @__PURE__ */ jsxs(DialogHeader, { children: [
|
|
72
|
+
asset ? `Install: ${asset.name}` : "Install",
|
|
73
|
+
/* @__PURE__ */ jsx(Text, { variant: "body-small", color: "secondary", className: styles.subtitle, children: "Copy the content and place the file at the path shown for your tool." })
|
|
74
|
+
] }),
|
|
75
|
+
/* @__PURE__ */ jsx(DialogBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", style: { gap: "var(--bui-space-3)" }, children: [
|
|
76
|
+
loading && /* @__PURE__ */ jsx(Flex, { className: styles.loadingContainer, children: /* @__PURE__ */ jsx(Skeleton, { style: { width: "100%", height: 80 } }) }),
|
|
77
|
+
!loading && asset && isZipSkill && /* @__PURE__ */ jsxs(Box, { className: styles.zipInfo, children: [
|
|
78
|
+
/* @__PURE__ */ jsxs(Flex, { className: styles.zipHeader, children: [
|
|
79
|
+
/* @__PURE__ */ jsx(RiFolderZipLine, { size: 16, style: { color: "var(--bui-fg-info)" } }),
|
|
80
|
+
/* @__PURE__ */ jsx(Text, { variant: "body-small", weight: "bold", style: { color: "var(--bui-fg-info)" }, children: "Bundled skill \u2014 downloads as .zip" })
|
|
96
81
|
] }),
|
|
97
|
-
/* @__PURE__ */ jsxs(
|
|
82
|
+
/* @__PURE__ */ jsxs(Text, { variant: "body-x-small", color: "secondary", style: { display: "block", marginBottom: "var(--bui-space-2)" }, children: [
|
|
98
83
|
"This skill includes resource files alongside ",
|
|
99
84
|
/* @__PURE__ */ jsx("code", { children: "SKILL.md" }),
|
|
100
85
|
". Extract the zip and place all files in the skill directory."
|
|
101
86
|
] }),
|
|
102
|
-
/* @__PURE__ */
|
|
103
|
-
/* @__PURE__ */ jsx(
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
)
|
|
111
|
-
resourcePaths.map((p) => /* @__PURE__ */ jsx(
|
|
112
|
-
Chip,
|
|
113
|
-
{
|
|
114
|
-
label: p,
|
|
115
|
-
size: "small",
|
|
116
|
-
variant: "outlined",
|
|
117
|
-
sx: { fontFamily: "monospace", fontSize: "0.7rem", height: 20 }
|
|
118
|
-
},
|
|
119
|
-
p
|
|
120
|
-
))
|
|
121
|
-
] })
|
|
122
|
-
]
|
|
123
|
-
}
|
|
124
|
-
),
|
|
125
|
-
!loading && asset && Object.entries(installPaths).map(([tool, installPath]) => /* @__PURE__ */ jsxs(
|
|
126
|
-
Box,
|
|
127
|
-
{
|
|
128
|
-
sx: {
|
|
129
|
-
border: "1px solid",
|
|
130
|
-
borderColor: "divider",
|
|
131
|
-
borderRadius: 2,
|
|
132
|
-
p: 1.5
|
|
133
|
-
},
|
|
134
|
-
children: [
|
|
135
|
-
/* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 1, mb: 1 }, children: [
|
|
136
|
-
/* @__PURE__ */ jsx(ToolIcon, { tool, sx: { fontSize: "1rem" } }),
|
|
137
|
-
/* @__PURE__ */ jsx(Typography, { variant: "subtitle2", fontWeight: 700, children: TOOL_LABELS[tool] ?? tool })
|
|
87
|
+
/* @__PURE__ */ jsx(TagGroup, { "aria-label": "Bundled files", children: /* @__PURE__ */ jsxs(Flex, { className: styles.zipFiles, children: [
|
|
88
|
+
/* @__PURE__ */ jsx(Tag, { id: "skill-md", size: "small", className: styles.monoTag, children: "SKILL.md" }),
|
|
89
|
+
resourcePaths.map((p) => /* @__PURE__ */ jsx(Tag, { id: p, size: "small", className: styles.monoTag, children: p }, p))
|
|
90
|
+
] }) })
|
|
91
|
+
] }),
|
|
92
|
+
!loading && asset && Object.entries(installPaths).map(([tool, installPath]) => /* @__PURE__ */ jsxs(Box, { className: styles.toolSection, children: [
|
|
93
|
+
/* @__PURE__ */ jsxs(Flex, { className: styles.toolHeader, children: [
|
|
94
|
+
/* @__PURE__ */ jsx(ToolIcon, { tool, size: 16 }),
|
|
95
|
+
/* @__PURE__ */ jsx(Text, { variant: "body-small", weight: "bold", children: TOOL_LABELS[tool] ?? tool })
|
|
138
96
|
] }),
|
|
139
|
-
/* @__PURE__ */ jsx(
|
|
140
|
-
/* @__PURE__ */ jsx(
|
|
141
|
-
|
|
142
|
-
{
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}
|
|
171
|
-
) }),
|
|
172
|
-
/* @__PURE__ */ jsx(Tooltip, { title: isZipSkill ? "Download as .zip with all bundled files" : "Download file with correct name", children: /* @__PURE__ */ jsx(
|
|
173
|
-
Button,
|
|
174
|
-
{
|
|
175
|
-
size: "small",
|
|
176
|
-
variant: "outlined",
|
|
177
|
-
startIcon: isZipSkill ? /* @__PURE__ */ jsx(FolderZipIcon, {}) : /* @__PURE__ */ jsx(DownloadIcon, {}),
|
|
178
|
-
onClick: () => handleDownload(tool, installPath),
|
|
179
|
-
sx: { flex: 1 },
|
|
180
|
-
children: isZipSkill ? "Download .zip" : "Download"
|
|
181
|
-
}
|
|
182
|
-
) })
|
|
97
|
+
/* @__PURE__ */ jsx(Text, { variant: "body-x-small", color: "secondary", style: { display: "block", marginBottom: "var(--bui-space-1)" }, children: "Install path" }),
|
|
98
|
+
/* @__PURE__ */ jsx(Box, { className: styles.installPathBox, children: installPath }),
|
|
99
|
+
/* @__PURE__ */ jsxs(Flex, { className: styles.toolActions, children: [
|
|
100
|
+
/* @__PURE__ */ jsxs(TooltipTrigger, { children: [
|
|
101
|
+
/* @__PURE__ */ jsxs(
|
|
102
|
+
Button,
|
|
103
|
+
{
|
|
104
|
+
variant: "secondary",
|
|
105
|
+
onClick: () => handleCopy(tool),
|
|
106
|
+
children: [
|
|
107
|
+
copiedTool === tool ? /* @__PURE__ */ jsx(RiCheckLine, { size: 14 }) : /* @__PURE__ */ jsx(RiFileCopyLine, { size: 14 }),
|
|
108
|
+
copiedTool === tool ? "Copied!" : "Copy Content"
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
),
|
|
112
|
+
/* @__PURE__ */ jsx(Tooltip, { children: copiedTool === tool ? "Copied!" : "Copy markdown content" })
|
|
113
|
+
] }),
|
|
114
|
+
/* @__PURE__ */ jsxs(TooltipTrigger, { children: [
|
|
115
|
+
/* @__PURE__ */ jsxs(
|
|
116
|
+
Button,
|
|
117
|
+
{
|
|
118
|
+
variant: "secondary",
|
|
119
|
+
onClick: () => handleDownload(tool, installPath),
|
|
120
|
+
children: [
|
|
121
|
+
isZipSkill ? /* @__PURE__ */ jsx(RiFolderZipLine, { size: 14 }) : /* @__PURE__ */ jsx(RiDownloadLine, { size: 14 }),
|
|
122
|
+
isZipSkill ? "Download .zip" : "Download"
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
),
|
|
126
|
+
/* @__PURE__ */ jsx(Tooltip, { children: isZipSkill ? "Download as .zip with all bundled files" : "Download file with correct name" })
|
|
127
|
+
] })
|
|
183
128
|
] })
|
|
184
|
-
]
|
|
185
|
-
},
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
] });
|
|
129
|
+
] }, tool))
|
|
130
|
+
] }) }),
|
|
131
|
+
/* @__PURE__ */ jsx(DialogFooter, { children: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "secondary", slot: "close", children: "Close" }) })
|
|
132
|
+
]
|
|
133
|
+
}
|
|
134
|
+
) });
|
|
191
135
|
}
|
|
192
136
|
|
|
193
137
|
export { AssetInstallDialog };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetInstallDialog.esm.js","sources":["../../../src/components/AssetInstallDialog/AssetInstallDialog.tsx"],"sourcesContent":["import { useState } from 'react';\nimport Box from '@mui/material/Box';\nimport Chip from '@mui/material/Chip';\nimport Button from '@mui/material/Button';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport DownloadIcon from '@mui/icons-material/Download';\nimport CheckIcon from '@mui/icons-material/Check';\nimport FolderZipIcon from '@mui/icons-material/FolderZip';\nimport type { AiTool } from '@nospt/plugin-dev-ai-hub-common';\nimport { getInstallPathsForAsset } from '@nospt/plugin-dev-ai-hub-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { devAiHubApiRef } from '../../api/DevAiHubClient';\nimport { useAssetDetail } from '../../hooks';\nimport { ToolIcon } from '../ToolIcon';\n\nconst TOOL_LABELS: Record<string, string> = {\n 'claude-code': 'Claude Code',\n 'github-copilot': 'GitHub Copilot',\n 'google-gemini': 'Google Gemini',\n 'cursor': 'Cursor',\n};\n\ninterface AssetInstallDialogProps {\n assetId: string | null;\n onClose: () => void;\n}\n\nexport function AssetInstallDialog({ assetId, onClose }: AssetInstallDialogProps) {\n const [copiedTool, setCopiedTool] = useState<string | null>(null);\n const api = useApi(devAiHubApiRef);\n const { asset, loading } = useAssetDetail(assetId);\n\n const handleClose = () => {\n onClose();\n setCopiedTool(null);\n };\n\n const handleCopy = (tool: string) => {\n if (!asset) return;\n navigator.clipboard.writeText(asset.content).then(() => {\n setCopiedTool(tool);\n setTimeout(() => setCopiedTool(null), 2000);\n });\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const resourcePaths = asset?.resourcesContent\n ? Object.keys(asset.resourcesContent)\n : [];\n const isZipSkill = asset?.type === 'skill' && resourcePaths.length > 0;\n\n const handleDownload = async (_tool: string, installPath: string) => {\n if (!asset) return;\n if (isZipSkill) {\n const url = await api.getDownloadUrl(asset.id);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${asset.name.replace(/\\s+/g, '-').toLowerCase()}.zip`;\n a.click();\n } else {\n const filename = installPath.split('/').pop() ?? `${asset.name}.md`;\n const blob = new Blob([asset.content], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const installPaths = asset\n ? getInstallPathsForAsset(asset.type, asset.tools, asset.name, {\n installPath: asset.installPath,\n installPaths: asset.installPaths,\n })\n : {};\n\n return (\n <Dialog open={!!assetId} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle sx={{ pb: 1 }}>\n {asset ? `Install: ${asset.name}` : 'Install'}\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 0.5, fontWeight: 400 }}>\n Copy the content and place the file at the path shown for your tool.\n </Typography>\n </DialogTitle>\n\n <DialogContent sx={{ display: 'flex', flexDirection: 'column', gap: 1.5, pt: '8px !important' }}>\n {loading && (\n <Box sx={{ display: 'flex', justifyContent: 'center', py: 3 }}>\n <CircularProgress />\n </Box>\n )}\n\n {!loading && asset && isZipSkill && (\n <Box\n sx={{\n border: '1px solid',\n borderColor: 'info.main',\n borderRadius: 2,\n p: 1.5,\n backgroundColor: 'info.main',\n backgroundImage: 'none',\n bgcolor: theme => `${theme.palette.info.main}12`,\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <FolderZipIcon sx={{ fontSize: '1rem', color: 'info.main' }} />\n <Typography variant=\"subtitle2\" fontWeight={700} color=\"info.main\">\n Bundled skill — downloads as .zip\n </Typography>\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mb: 1 }}>\n This skill includes resource files alongside <code>SKILL.md</code>.\n Extract the zip and place all files in the skill directory.\n </Typography>\n <Box sx={{ display: 'flex', gap: 0.5, flexWrap: 'wrap' }}>\n <Chip\n label=\"SKILL.md\"\n size=\"small\"\n sx={{ fontFamily: 'monospace', fontSize: '0.7rem', height: 20 }}\n />\n {resourcePaths.map(p => (\n <Chip\n key={p}\n label={p}\n size=\"small\"\n variant=\"outlined\"\n sx={{ fontFamily: 'monospace', fontSize: '0.7rem', height: 20 }}\n />\n ))}\n </Box>\n </Box>\n )}\n\n {!loading && asset && Object.entries(installPaths).map(([tool, installPath]) => (\n <Box\n key={tool}\n sx={{\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 2,\n p: 1.5,\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <ToolIcon tool={tool as AiTool} sx={{ fontSize: '1rem' }} />\n <Typography variant=\"subtitle2\" fontWeight={700}>\n {TOOL_LABELS[tool] ?? tool}\n </Typography>\n </Box>\n\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mb: 0.5 }}>\n Install path\n </Typography>\n <Box\n sx={{\n bgcolor: 'action.hover',\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 1,\n px: 1.5,\n py: 0.75,\n fontFamily: 'monospace',\n fontSize: '0.78rem',\n color: 'text.primary',\n wordBreak: 'break-all',\n mb: 1.25,\n }}\n >\n {installPath}\n </Box>\n\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Tooltip title={copiedTool === tool ? 'Copied!' : 'Copy markdown content'}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n startIcon={copiedTool === tool ? <CheckIcon /> : <ContentCopyIcon />}\n onClick={() => handleCopy(tool)}\n color={copiedTool === tool ? 'success' : 'primary'}\n sx={{ flex: 1 }}\n >\n {copiedTool === tool ? 'Copied!' : 'Copy Content'}\n </Button>\n </Tooltip>\n <Tooltip title={isZipSkill ? 'Download as .zip with all bundled files' : 'Download file with correct name'}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n startIcon={isZipSkill ? <FolderZipIcon /> : <DownloadIcon />}\n onClick={() => handleDownload(tool, installPath)}\n sx={{ flex: 1 }}\n >\n {isZipSkill ? 'Download .zip' : 'Download'}\n </Button>\n </Tooltip>\n </Box>\n </Box>\n ))}\n </DialogContent>\n\n <DialogActions>\n <Button onClick={handleClose}>Close</Button>\n </DialogActions>\n </Dialog>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssetInstallDialog.esm.js","sources":["../../../src/components/AssetInstallDialog/AssetInstallDialog.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Box, Flex, Text, Button, Tag, TagGroup, Skeleton,\n Dialog, DialogTrigger, DialogHeader, DialogBody, DialogFooter,\n Tooltip, TooltipTrigger,\n} from '@backstage/ui';\nimport { RiFileCopyLine, RiDownloadLine, RiCheckLine, RiFolderZipLine } from '@remixicon/react';\nimport type { AiTool } from '@nospt/plugin-dev-ai-hub-common';\nimport { getInstallPathsForAsset } from '@nospt/plugin-dev-ai-hub-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { devAiHubApiRef } from '../../api/DevAiHubClient';\nimport { useAssetDetail } from '../../hooks';\nimport { ToolIcon } from '../ToolIcon';\nimport styles from './AssetInstallDialog.module.css';\n\nconst TOOL_LABELS: Record<string, string> = {\n 'claude-code': 'Claude Code',\n 'github-copilot': 'GitHub Copilot',\n 'google-gemini': 'Google Gemini',\n 'cursor': 'Cursor',\n};\n\ninterface AssetInstallDialogProps {\n assetId: string | null;\n onClose: () => void;\n}\n\nexport function AssetInstallDialog({ assetId, onClose }: AssetInstallDialogProps) {\n const [copiedTool, setCopiedTool] = useState<string | null>(null);\n const api = useApi(devAiHubApiRef);\n const { asset, loading } = useAssetDetail(assetId);\n\n const handleClose = () => {\n onClose();\n setCopiedTool(null);\n };\n\n const handleCopy = (tool: string) => {\n if (!asset) return;\n navigator.clipboard.writeText(asset.content).then(() => {\n setCopiedTool(tool);\n setTimeout(() => setCopiedTool(null), 2000);\n });\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const resourcePaths = asset?.resourcesContent\n ? Object.keys(asset.resourcesContent)\n : [];\n const isZipSkill = asset?.type === 'skill' && resourcePaths.length > 0;\n\n const handleDownload = async (_tool: string, installPath: string) => {\n if (!asset) return;\n if (isZipSkill) {\n const url = await api.getDownloadUrl(asset.id);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${asset.name.replace(/\\s+/g, '-').toLowerCase()}.zip`;\n a.click();\n } else {\n const filename = installPath.split('/').pop() ?? `${asset.name}.md`;\n const blob = new Blob([asset.content], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const installPaths = asset\n ? getInstallPathsForAsset(asset.type, asset.tools, asset.name, {\n installPath: asset.installPath,\n installPaths: asset.installPaths,\n })\n : {};\n\n return (\n <DialogTrigger>\n <Dialog\n isOpen={!!assetId}\n isDismissable\n onOpenChange={open => { if (!open) handleClose(); }}\n >\n <DialogHeader>\n {asset ? `Install: ${asset.name}` : 'Install'}\n <Text variant=\"body-small\" color=\"secondary\" className={styles.subtitle}>\n Copy the content and place the file at the path shown for your tool.\n </Text>\n </DialogHeader>\n\n <DialogBody>\n <Flex direction=\"column\" style={{ gap: 'var(--bui-space-3)' }}>\n {loading && (\n <Flex className={styles.loadingContainer}>\n <Skeleton style={{ width: '100%', height: 80 }} />\n </Flex>\n )}\n\n {!loading && asset && isZipSkill && (\n <Box className={styles.zipInfo}>\n <Flex className={styles.zipHeader}>\n <RiFolderZipLine size={16} style={{ color: 'var(--bui-fg-info)' }} />\n <Text variant=\"body-small\" weight=\"bold\" style={{ color: 'var(--bui-fg-info)' }}>\n Bundled skill — downloads as .zip\n </Text>\n </Flex>\n <Text variant=\"body-x-small\" color=\"secondary\" style={{ display: 'block', marginBottom: 'var(--bui-space-2)' }}>\n This skill includes resource files alongside <code>SKILL.md</code>.\n Extract the zip and place all files in the skill directory.\n </Text>\n <TagGroup aria-label=\"Bundled files\">\n <Flex className={styles.zipFiles}>\n <Tag id=\"skill-md\" size=\"small\" className={styles.monoTag}>SKILL.md</Tag>\n {resourcePaths.map(p => (\n <Tag key={p} id={p} size=\"small\" className={styles.monoTag}>{p}</Tag>\n ))}\n </Flex>\n </TagGroup>\n </Box>\n )}\n\n {!loading && asset && Object.entries(installPaths).map(([tool, installPath]) => (\n <Box key={tool} className={styles.toolSection}>\n <Flex className={styles.toolHeader}>\n <ToolIcon tool={tool as AiTool} size={16} />\n <Text variant=\"body-small\" weight=\"bold\">\n {TOOL_LABELS[tool] ?? tool}\n </Text>\n </Flex>\n\n <Text variant=\"body-x-small\" color=\"secondary\" style={{ display: 'block', marginBottom: 'var(--bui-space-1)' }}>\n Install path\n </Text>\n <Box className={styles.installPathBox}>\n {installPath}\n </Box>\n\n <Flex className={styles.toolActions}>\n <TooltipTrigger>\n <Button\n variant=\"secondary\"\n onClick={() => handleCopy(tool)}\n >\n {copiedTool === tool ? <RiCheckLine size={14} /> : <RiFileCopyLine size={14} />}\n {copiedTool === tool ? 'Copied!' : 'Copy Content'}\n </Button>\n <Tooltip>{copiedTool === tool ? 'Copied!' : 'Copy markdown content'}</Tooltip>\n </TooltipTrigger>\n <TooltipTrigger>\n <Button\n variant=\"secondary\"\n onClick={() => handleDownload(tool, installPath)}\n >\n {isZipSkill ? <RiFolderZipLine size={14} /> : <RiDownloadLine size={14} />}\n {isZipSkill ? 'Download .zip' : 'Download'}\n </Button>\n <Tooltip>{isZipSkill ? 'Download as .zip with all bundled files' : 'Download file with correct name'}</Tooltip>\n </TooltipTrigger>\n </Flex>\n </Box>\n ))}\n </Flex>\n </DialogBody>\n\n <DialogFooter>\n <Button onClick={handleClose} variant=\"secondary\" slot=\"close\">\n Close\n </Button>\n </DialogFooter>\n </Dialog>\n </DialogTrigger>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAeA,MAAM,WAAA,GAAsC;AAAA,EAC1C,aAAA,EAAkB,aAAA;AAAA,EAClB,gBAAA,EAAkB,gBAAA;AAAA,EAClB,eAAA,EAAkB,eAAA;AAAA,EAClB,QAAA,EAAkB;AACpB,CAAA;AAOO,SAAS,kBAAA,CAAmB,EAAE,OAAA,EAAS,OAAA,EAAQ,EAA4B;AAChF,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,GAAA,GAAM,OAAO,cAAc,CAAA;AACjC,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,eAAe,OAAO,CAAA;AAEjD,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,OAAA,EAAQ;AACR,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAiB;AACnC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,SAAA,CAAU,UAAU,SAAA,CAAU,KAAA,CAAM,OAAO,CAAA,CAAE,KAAK,MAAM;AACtD,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,UAAA,CAAW,MAAM,aAAA,CAAc,IAAI,CAAA,EAAG,GAAI,CAAA;AAAA,IAC5C,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,OAAO,gBAAA,GACzB,MAAA,CAAO,KAAK,KAAA,CAAM,gBAAgB,IAClC,EAAC;AACL,EAAA,MAAM,UAAA,GAAa,KAAA,EAAO,IAAA,KAAS,OAAA,IAAW,cAAc,MAAA,GAAS,CAAA;AAErE,EAAA,MAAM,cAAA,GAAiB,OAAO,KAAA,EAAe,WAAA,KAAwB;AACnE,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,cAAA,CAAe,MAAM,EAAE,CAAA;AAC7C,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,MAAA,CAAA,CAAE,QAAA,GAAW,GAAG,KAAA,CAAM,IAAA,CAAK,QAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,WAAA,EAAa,CAAA,IAAA,CAAA;AAC7D,MAAA,CAAA,CAAE,KAAA,EAAM;AAAA,IACV,CAAA,MAAO;AACL,MAAA,MAAM,QAAA,GAAW,YAAY,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI,IAAK,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,GAAA,CAAA;AAC9D,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,KAAA,CAAM,OAAO,CAAA,EAAG,EAAE,IAAA,EAAM,eAAA,EAAiB,CAAA;AAChE,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,MAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,MAAA,CAAA,CAAE,KAAA,EAAM;AACR,MAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,IACzB;AACA,IAAA,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,QACjB,uBAAA,CAAwB,KAAA,CAAM,MAAM,KAAA,CAAM,KAAA,EAAO,MAAM,IAAA,EAAM;AAAA,IAC3D,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,cAAc,KAAA,CAAM;AAAA,GACrB,IACD,EAAC;AAEL,EAAA,2BACG,aAAA,EAAA,EACC,QAAA,kBAAA,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAQ,CAAC,CAAC,OAAA;AAAA,MACV,aAAA,EAAa,IAAA;AAAA,MACb,cAAc,CAAA,IAAA,KAAQ;AAAE,QAAA,IAAI,CAAC,MAAM,WAAA,EAAY;AAAA,MAAG,CAAA;AAAA,MAElD,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,YAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,KAAA,GAAQ,CAAA,SAAA,EAAY,KAAA,CAAM,IAAI,CAAA,CAAA,GAAK,SAAA;AAAA,0BACpC,GAAA,CAAC,QAAK,OAAA,EAAQ,YAAA,EAAa,OAAM,WAAA,EAAY,SAAA,EAAW,MAAA,CAAO,QAAA,EAAU,QAAA,EAAA,sEAAA,EAEzE;AAAA,SAAA,EACF,CAAA;AAAA,wBAEA,GAAA,CAAC,UAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,UAAS,KAAA,EAAO,EAAE,GAAA,EAAK,oBAAA,EAAqB,EACzD,QAAA,EAAA;AAAA,UAAA,OAAA,oBACC,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,kBACtB,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,EAAA,IAAM,CAAA,EAClD,CAAA;AAAA,UAGD,CAAC,WAAW,KAAA,IAAS,UAAA,yBACnB,GAAA,EAAA,EAAI,SAAA,EAAW,OAAO,OAAA,EACrB,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,SAAA,EACtB,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,mBAAgB,IAAA,EAAM,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,sBAAqB,EAAG,CAAA;AAAA,8BACnE,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,YAAA,EAAa,MAAA,EAAO,MAAA,EAAO,KAAA,EAAO,EAAE,KAAA,EAAO,oBAAA,EAAqB,EAAG,QAAA,EAAA,wCAAA,EAEjF;AAAA,aAAA,EACF,CAAA;AAAA,4BACA,IAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,cAAA,EAAe,KAAA,EAAM,WAAA,EAAY,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,EAAS,YAAA,EAAc,oBAAA,EAAqB,EAAG,QAAA,EAAA;AAAA,cAAA,+CAAA;AAAA,8BACjE,GAAA,CAAC,UAAK,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,cAAO;AAAA,aAAA,EAEpE,CAAA;AAAA,4BACA,GAAA,CAAC,YAAS,YAAA,EAAW,eAAA,EACnB,+BAAC,IAAA,EAAA,EAAK,SAAA,EAAW,OAAO,QAAA,EACtB,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,GAAA,EAAA,EAAI,IAAG,UAAA,EAAW,IAAA,EAAK,SAAQ,SAAA,EAAW,MAAA,CAAO,SAAS,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,cAClE,aAAA,CAAc,GAAA,CAAI,CAAA,CAAA,qBACjB,GAAA,CAAC,OAAY,EAAA,EAAI,CAAA,EAAG,IAAA,EAAK,OAAA,EAAQ,SAAA,EAAW,MAAA,CAAO,OAAA,EAAU,QAAA,EAAA,CAAA,EAAA,EAAnD,CAAqD,CAChE;AAAA,aAAA,EACH,CAAA,EACF;AAAA,WAAA,EACF,CAAA;AAAA,UAGD,CAAC,OAAA,IAAW,KAAA,IAAS,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,MAAM,WAAW,CAAA,0BACvE,GAAA,EAAA,EAAe,SAAA,EAAW,OAAO,WAAA,EAChC,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,UAAA,EACtB,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAsB,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,8BAC1C,GAAA,CAAC,QAAK,OAAA,EAAQ,YAAA,EAAa,QAAO,MAAA,EAC/B,QAAA,EAAA,WAAA,CAAY,IAAI,CAAA,IAAK,IAAA,EACxB;AAAA,aAAA,EACF,CAAA;AAAA,4BAEA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,cAAA,EAAe,KAAA,EAAM,WAAA,EAAY,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,EAAS,YAAA,EAAc,oBAAA,IAAwB,QAAA,EAAA,cAAA,EAEhH,CAAA;AAAA,4BACA,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,gBACpB,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,4BAEA,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,WAAA,EACtB,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,cAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAA,IAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAQ,WAAA;AAAA,oBACR,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,oBAE7B,QAAA,EAAA;AAAA,sBAAA,UAAA,KAAe,IAAA,uBAAQ,WAAA,EAAA,EAAY,IAAA,EAAM,IAAI,CAAA,mBAAK,GAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,sBAC5E,UAAA,KAAe,OAAO,SAAA,GAAY;AAAA;AAAA;AAAA,iBACrC;AAAA,gCACA,GAAA,CAAC,OAAA,EAAA,EAAS,QAAA,EAAA,UAAA,KAAe,IAAA,GAAO,YAAY,uBAAA,EAAwB;AAAA,eAAA,EACtE,CAAA;AAAA,mCACC,cAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAA,IAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAQ,WAAA;AAAA,oBACR,OAAA,EAAS,MAAM,cAAA,CAAe,IAAA,EAAM,WAAW,CAAA;AAAA,oBAE9C,QAAA,EAAA;AAAA,sBAAA,UAAA,mBAAa,GAAA,CAAC,mBAAgB,IAAA,EAAM,EAAA,EAAI,oBAAK,GAAA,CAAC,cAAA,EAAA,EAAe,MAAM,EAAA,EAAI,CAAA;AAAA,sBACvE,aAAa,eAAA,GAAkB;AAAA;AAAA;AAAA,iBAClC;AAAA,gCACA,GAAA,CAAC,OAAA,EAAA,EAAS,QAAA,EAAA,UAAA,GAAa,yCAAA,GAA4C,iCAAA,EAAkC;AAAA,eAAA,EACvG;AAAA,aAAA,EACF;AAAA,WAAA,EAAA,EApCQ,IAqCV,CACD;AAAA,SAAA,EACH,CAAA,EACF,CAAA;AAAA,wBAEA,GAAA,CAAC,YAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAS,WAAA,EAAa,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,OAAA,EAAQ,QAAA,EAAA,OAAA,EAE/D,CAAA,EACF;AAAA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
|
|
2
|
+
|
|
3
|
+
var css_248z = "@layer components {\n .AssetInstallDialog_subtitle__b31679eacf {\n margin-top: var(--bui-space-1);\n font-weight: 400;\n }\n\n .AssetInstallDialog_loadingContainer__b31679eacf {\n display: flex;\n justify-content: center;\n padding: var(--bui-space-6) 0;\n }\n\n .AssetInstallDialog_zipInfo__b31679eacf {\n border: 1px solid #00D2D3;\n border-radius: var(--bui-radius-2);\n padding: var(--bui-space-3);\n background-color: color-mix(in srgb, #00D2D3 7%, transparent);\n }\n\n .AssetInstallDialog_zipHeader__b31679eacf {\n display: flex;\n align-items: center;\n gap: var(--bui-space-2);\n margin-bottom: var(--bui-space-2);\n }\n\n .AssetInstallDialog_zipFiles__b31679eacf {\n display: flex;\n gap: var(--bui-space-1);\n flex-wrap: wrap;\n }\n\n .AssetInstallDialog_monoTag__b31679eacf {\n font-family: monospace;\n font-size: 0.7rem;\n height: 20px;\n }\n\n .AssetInstallDialog_toolSection__b31679eacf {\n border: 1px solid var(--bui-border-1);\n border-radius: var(--bui-radius-2);\n padding: var(--bui-space-3);\n }\n\n .AssetInstallDialog_toolHeader__b31679eacf {\n display: flex;\n align-items: center;\n gap: var(--bui-space-2);\n margin-bottom: var(--bui-space-2);\n }\n\n .AssetInstallDialog_installPathBox__b31679eacf {\n background-color: var(--bui-bg-neutral-1-hover);\n border: 1px solid var(--bui-border-1);\n border-radius: var(--bui-radius-2);\n padding: var(--bui-space-2) var(--bui-space-3);\n font-family: monospace;\n font-size: 0.78rem;\n color: var(--bui-fg-primary);\n word-break: break-all;\n margin-bottom: 10px;\n }\n\n .AssetInstallDialog_toolActions__b31679eacf {\n display: flex;\n gap: var(--bui-space-2);\n }\n\n .AssetInstallDialog_toolActions__b31679eacf > * {\n flex: 1;\n }\n}\n";
|
|
4
|
+
var styles = {"subtitle":"AssetInstallDialog_subtitle__b31679eacf","loadingContainer":"AssetInstallDialog_loadingContainer__b31679eacf","zipInfo":"AssetInstallDialog_zipInfo__b31679eacf","zipHeader":"AssetInstallDialog_zipHeader__b31679eacf","zipFiles":"AssetInstallDialog_zipFiles__b31679eacf","monoTag":"AssetInstallDialog_monoTag__b31679eacf","toolSection":"AssetInstallDialog_toolSection__b31679eacf","toolHeader":"AssetInstallDialog_toolHeader__b31679eacf","installPathBox":"AssetInstallDialog_installPathBox__b31679eacf","toolActions":"AssetInstallDialog_toolActions__b31679eacf"};
|
|
5
|
+
styleInject(css_248z);
|
|
6
|
+
|
|
7
|
+
export { styles as default };
|
|
8
|
+
//# sourceMappingURL=AssetInstallDialog.module.css.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssetInstallDialog.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|