@yoka-ui/ui 1.0.6 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/@Docs-yoka/exports.generated.md +3 -3
- package/README.md +6 -6
- package/dist/es/assets/image/skills.zip +0 -0
- package/dist/es/business/Empty/index.js.map +1 -1
- package/dist/es/business/YkCharts/Area.d.ts +18 -0
- package/dist/es/business/YkCharts/Area.js +336 -0
- package/dist/es/business/YkCharts/Area.js.map +7 -0
- package/dist/es/business/YkCharts/Bar.d.ts +21 -0
- package/dist/es/business/YkCharts/Bar.js +316 -0
- package/dist/es/business/YkCharts/Bar.js.map +7 -0
- package/dist/es/business/YkCharts/BarProperty.d.ts +21 -0
- package/dist/es/business/YkCharts/BarProperty.js +357 -0
- package/dist/es/business/YkCharts/BarProperty.js.map +7 -0
- package/dist/es/business/YkCharts/BarTotal.d.ts +21 -0
- package/dist/es/business/YkCharts/BarTotal.js +288 -0
- package/dist/es/business/YkCharts/BarTotal.js.map +7 -0
- package/dist/es/business/YkCharts/Line.d.ts +21 -0
- package/dist/es/business/YkCharts/Line.js +342 -0
- package/dist/es/business/YkCharts/Line.js.map +7 -0
- package/dist/es/business/YkCharts/Pie.d.ts +19 -0
- package/dist/es/business/YkCharts/Pie.js +107 -0
- package/dist/es/business/YkCharts/Pie.js.map +7 -0
- package/dist/es/business/YkCharts/PieProperty.d.ts +18 -0
- package/dist/es/business/YkCharts/PieProperty.js +180 -0
- package/dist/es/business/YkCharts/PieProperty.js.map +7 -0
- package/dist/es/business/YkCharts/Pies.d.ts +26 -0
- package/dist/es/business/YkCharts/Pies.js +348 -0
- package/dist/es/business/YkCharts/Pies.js.map +7 -0
- package/dist/es/business/YkCharts/constants.d.ts +1 -0
- package/dist/es/business/YkCharts/constants.js +47 -0
- package/dist/es/business/YkCharts/constants.js.map +7 -0
- package/dist/es/business/YkCharts/hooks.d.ts +4 -0
- package/dist/es/business/YkCharts/hooks.js +37 -0
- package/dist/es/business/YkCharts/hooks.js.map +7 -0
- package/dist/es/business/YkCharts/index.d.ts +9 -0
- package/dist/es/business/YkCharts/index.js +20 -0
- package/dist/es/business/YkCharts/index.js.map +7 -0
- package/dist/es/business/YkCharts/index.module.less +164 -0
- package/dist/es/business/YkCharts/tooltip.less +92 -0
- package/dist/es/business/YkCharts/transformData.js +16 -0
- package/dist/es/business/YkCharts/transformData.js.map +7 -0
- package/dist/es/business/YkCharts/typing.d.ts +74 -0
- package/dist/es/business/YkCharts/typing.js +1 -0
- package/dist/es/business/YkCharts/typing.js.map +7 -0
- package/dist/es/business/YkCharts/utils.d.ts +4 -0
- package/dist/es/business/YkCharts/utils.js +109 -0
- package/dist/es/business/YkCharts/utils.js.map +7 -0
- package/dist/es/business/YkCharts/variables.less +13 -0
- package/dist/es/components/YKMarkdown/index.d.ts +11 -0
- package/dist/es/components/YKMarkdown/index.js +236 -0
- package/dist/es/components/YKMarkdown/index.js.map +7 -0
- package/dist/es/components/YKMarkdown/index.module.less +83 -0
- package/dist/es/components/YkDateRangePicker/YkDateRangePicker.mdx +3 -3
- package/dist/es/creative/GlassSegmentedRadio/index.d.ts +1 -1
- package/dist/es/creative/SkillsWriter/index.d.ts +3 -0
- package/dist/es/creative/SkillsWriter/index.js +191 -0
- package/dist/es/creative/SkillsWriter/index.js.map +7 -0
- package/dist/es/creative/SkillsWriter/index.module.less +21 -0
- package/dist/es/index.less +6 -1
- package/dist/es/utils/ykStorybookDoc.d.ts +15 -0
- package/dist/es/utils/ykStorybookDoc.js +24 -2
- package/dist/es/utils/ykStorybookDoc.js.map +2 -2
- package/dist/lib/assets/image/skills.zip +0 -0
- package/dist/lib/business/Empty/index.js.map +1 -1
- package/dist/lib/business/YkCharts/Area.d.ts +18 -0
- package/dist/lib/business/YkCharts/Area.js +346 -0
- package/dist/lib/business/YkCharts/Area.js.map +7 -0
- package/dist/lib/business/YkCharts/Bar.d.ts +21 -0
- package/dist/lib/business/YkCharts/Bar.js +323 -0
- package/dist/lib/business/YkCharts/Bar.js.map +7 -0
- package/dist/lib/business/YkCharts/BarProperty.d.ts +21 -0
- package/dist/lib/business/YkCharts/BarProperty.js +370 -0
- package/dist/lib/business/YkCharts/BarProperty.js.map +7 -0
- package/dist/lib/business/YkCharts/BarTotal.d.ts +21 -0
- package/dist/lib/business/YkCharts/BarTotal.js +295 -0
- package/dist/lib/business/YkCharts/BarTotal.js.map +7 -0
- package/dist/lib/business/YkCharts/Line.d.ts +21 -0
- package/dist/lib/business/YkCharts/Line.js +349 -0
- package/dist/lib/business/YkCharts/Line.js.map +7 -0
- package/dist/lib/business/YkCharts/Pie.d.ts +19 -0
- package/dist/lib/business/YkCharts/Pie.js +117 -0
- package/dist/lib/business/YkCharts/Pie.js.map +7 -0
- package/dist/lib/business/YkCharts/PieProperty.d.ts +18 -0
- package/dist/lib/business/YkCharts/PieProperty.js +193 -0
- package/dist/lib/business/YkCharts/PieProperty.js.map +7 -0
- package/dist/lib/business/YkCharts/Pies.d.ts +26 -0
- package/dist/lib/business/YkCharts/Pies.js +337 -0
- package/dist/lib/business/YkCharts/Pies.js.map +7 -0
- package/dist/lib/business/YkCharts/constants.d.ts +1 -0
- package/dist/lib/business/YkCharts/constants.js +71 -0
- package/dist/lib/business/YkCharts/constants.js.map +7 -0
- package/dist/lib/business/YkCharts/hooks.d.ts +4 -0
- package/dist/lib/business/YkCharts/hooks.js +62 -0
- package/dist/lib/business/YkCharts/hooks.js.map +7 -0
- package/dist/lib/business/YkCharts/index.d.ts +9 -0
- package/dist/lib/business/YkCharts/index.js +61 -0
- package/dist/lib/business/YkCharts/index.js.map +7 -0
- package/dist/lib/business/YkCharts/index.module.less +164 -0
- package/dist/lib/business/YkCharts/tooltip.less +92 -0
- package/dist/lib/business/YkCharts/transformData.js +40 -0
- package/dist/lib/business/YkCharts/transformData.js.map +7 -0
- package/dist/lib/business/YkCharts/typing.d.ts +74 -0
- package/dist/lib/business/YkCharts/typing.js +18 -0
- package/dist/lib/business/YkCharts/typing.js.map +7 -0
- package/dist/lib/business/YkCharts/utils.d.ts +4 -0
- package/dist/lib/business/YkCharts/utils.js +143 -0
- package/dist/lib/business/YkCharts/utils.js.map +7 -0
- package/dist/lib/business/YkCharts/variables.less +13 -0
- package/dist/lib/components/YKMarkdown/index.d.ts +11 -0
- package/dist/lib/components/YKMarkdown/index.js +188 -0
- package/dist/lib/components/YKMarkdown/index.js.map +7 -0
- package/dist/lib/components/YKMarkdown/index.module.less +83 -0
- package/dist/lib/components/YkDateRangePicker/YkDateRangePicker.mdx +3 -3
- package/dist/lib/creative/GlassSegmentedRadio/index.d.ts +1 -1
- package/dist/lib/creative/SkillsWriter/index.d.ts +3 -0
- package/dist/lib/creative/SkillsWriter/index.js +200 -0
- package/dist/lib/creative/SkillsWriter/index.js.map +7 -0
- package/dist/lib/creative/SkillsWriter/index.module.less +21 -0
- package/dist/lib/index.less +6 -1
- package/dist/lib/utils/ykStorybookDoc.d.ts +15 -0
- package/dist/lib/utils/ykStorybookDoc.js +23 -1
- package/dist/lib/utils/ykStorybookDoc.js.map +2 -2
- package/package.json +152 -143
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
|
|
29
|
+
// src/creative/SkillsWriter/index.tsx
|
|
30
|
+
var SkillsWriter_exports = {};
|
|
31
|
+
__export(SkillsWriter_exports, {
|
|
32
|
+
default: () => SkillsWriter_default
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(SkillsWriter_exports);
|
|
35
|
+
var import_icons = require("@ant-design/icons");
|
|
36
|
+
var import_antd = require("antd");
|
|
37
|
+
var import_jszip = __toESM(require("jszip"));
|
|
38
|
+
var import_react = __toESM(require("react"));
|
|
39
|
+
var import_index_module = __toESM(require("./index.module.less"));
|
|
40
|
+
var { Text, Title } = import_antd.Typography;
|
|
41
|
+
var { Group: CheckboxGroup } = import_antd.Checkbox;
|
|
42
|
+
var skillsOptions = [
|
|
43
|
+
{
|
|
44
|
+
id: "traue",
|
|
45
|
+
path: ".trae/skills/",
|
|
46
|
+
label: "Traue",
|
|
47
|
+
description: "Traue IDE 的 skills 插件目录"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: "cursor",
|
|
51
|
+
path: ".cursor/skills/",
|
|
52
|
+
label: "Cursor",
|
|
53
|
+
description: "Cursor IDE 的 skills 插件目录"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: "codebuddy",
|
|
57
|
+
path: ".codebuddy/skills/",
|
|
58
|
+
label: "CodeBuddy",
|
|
59
|
+
description: "CodeBuddy 的 skills 插件目录"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: "claudeCode",
|
|
63
|
+
path: ".claude/skills/",
|
|
64
|
+
label: "Claude Code",
|
|
65
|
+
description: "Claude Code 的 skills 插件目录"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: "qwenCode",
|
|
69
|
+
path: ".qwen/skills/",
|
|
70
|
+
label: "Qwen Code",
|
|
71
|
+
description: "Qwen Code 的 skills 插件目录"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: "openAICodex",
|
|
75
|
+
path: ".codex/skills/",
|
|
76
|
+
label: "OpenAI Codex",
|
|
77
|
+
description: "OpenAI Codex 的 skills 插件目录"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: "standard",
|
|
81
|
+
path: ".skills/",
|
|
82
|
+
label: "标准目录",
|
|
83
|
+
description: "标准 skills 配置目录"
|
|
84
|
+
}
|
|
85
|
+
];
|
|
86
|
+
var SkillsWriter = () => {
|
|
87
|
+
const [selectedIds, setSelectedIds] = (0, import_react.useState)([]);
|
|
88
|
+
const [loading, setLoading] = (0, import_react.useState)(false);
|
|
89
|
+
const isSupported = typeof window !== "undefined" && "showDirectoryPicker" in window;
|
|
90
|
+
const handleCheckboxChange = (checkedIds) => {
|
|
91
|
+
setSelectedIds(checkedIds);
|
|
92
|
+
};
|
|
93
|
+
const selectedSkills = skillsOptions.filter((opt) => selectedIds.includes(opt.id));
|
|
94
|
+
const createDirectoryHandle = async (baseHandle, pathParts) => {
|
|
95
|
+
let currentHandle = baseHandle;
|
|
96
|
+
for (const part of pathParts) {
|
|
97
|
+
try {
|
|
98
|
+
currentHandle = await currentHandle.getDirectoryHandle(part, { create: true });
|
|
99
|
+
} catch {
|
|
100
|
+
currentHandle = await currentHandle.getDirectoryHandle(part);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return currentHandle;
|
|
104
|
+
};
|
|
105
|
+
const writeFile = async (handle, filePath, content) => {
|
|
106
|
+
const pathParts = filePath.split("/").filter((p) => p);
|
|
107
|
+
const fileName = pathParts.pop();
|
|
108
|
+
const dirHandle = await createDirectoryHandle(handle, pathParts);
|
|
109
|
+
const fileHandle = await dirHandle.getFileHandle(fileName, { create: true });
|
|
110
|
+
const writable = await fileHandle.createWritable();
|
|
111
|
+
await writable.write(content);
|
|
112
|
+
await writable.close();
|
|
113
|
+
};
|
|
114
|
+
const downloadAndExtractSkills = async () => {
|
|
115
|
+
if (selectedSkills.length === 0) {
|
|
116
|
+
import_antd.message.error("请至少选择一个工具");
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (!("showDirectoryPicker" in window)) {
|
|
120
|
+
import_antd.message.error("当前浏览器不支持目录选择器");
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
const handle = await window.showDirectoryPicker();
|
|
125
|
+
setLoading(true);
|
|
126
|
+
const response = await fetch("/skills.zip");
|
|
127
|
+
if (!response.ok) {
|
|
128
|
+
throw new Error("下载失败,请稍后重试");
|
|
129
|
+
}
|
|
130
|
+
const blob = await response.blob();
|
|
131
|
+
const zip = await import_jszip.default.loadAsync(blob);
|
|
132
|
+
const selectedPaths = selectedSkills.map((s) => s.path);
|
|
133
|
+
const skillsFolderEntry = Object.entries(zip.files).find(
|
|
134
|
+
([path]) => path === "yoka-ui" || path.startsWith("yoka-ui/")
|
|
135
|
+
);
|
|
136
|
+
if (!skillsFolderEntry) {
|
|
137
|
+
throw new Error("压缩包中未找到 yoka-ui 目录");
|
|
138
|
+
}
|
|
139
|
+
let totalCount = 0;
|
|
140
|
+
for (const selectedPath of selectedPaths) {
|
|
141
|
+
const normalizedPath = selectedPath.replace(/^\//, "").replace(/\/$/, "");
|
|
142
|
+
const pathParts = normalizedPath.split("/");
|
|
143
|
+
let currentHandle = handle;
|
|
144
|
+
for (const part of pathParts) {
|
|
145
|
+
try {
|
|
146
|
+
currentHandle = await currentHandle.getDirectoryHandle(part, { create: true });
|
|
147
|
+
} catch {
|
|
148
|
+
currentHandle = await currentHandle.getDirectoryHandle(part);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
let skillsHandle;
|
|
152
|
+
try {
|
|
153
|
+
skillsHandle = await currentHandle.getDirectoryHandle("yoka-ui", { create: true });
|
|
154
|
+
} catch {
|
|
155
|
+
skillsHandle = await currentHandle.getDirectoryHandle("yoka-ui");
|
|
156
|
+
}
|
|
157
|
+
for (const [filePath, zipEntry] of Object.entries(zip.files)) {
|
|
158
|
+
if (filePath.startsWith("yoka-ui/")) {
|
|
159
|
+
const relativePath = filePath.replace("yoka-ui/", "");
|
|
160
|
+
if (!zipEntry.dir && relativePath) {
|
|
161
|
+
const content = await zipEntry.async("uint8array");
|
|
162
|
+
await writeFile(skillsHandle, relativePath, content);
|
|
163
|
+
totalCount++;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
import_antd.message.success(`成功添加 ${totalCount} 个文件到项目`);
|
|
169
|
+
} catch (err) {
|
|
170
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
171
|
+
} else {
|
|
172
|
+
console.error("添加到项目失败:", err);
|
|
173
|
+
import_antd.message.error(err instanceof Error ? err.message : "添加到项目失败");
|
|
174
|
+
}
|
|
175
|
+
} finally {
|
|
176
|
+
setLoading(false);
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
return /* @__PURE__ */ import_react.default.createElement("div", { className: import_index_module.default.skillsWriter }, /* @__PURE__ */ import_react.default.createElement(import_antd.Card, { className: import_index_module.default.card }, /* @__PURE__ */ import_react.default.createElement("div", { className: import_index_module.default.header }, /* @__PURE__ */ import_react.default.createElement(import_icons.CloudDownloadOutlined, { style: { fontSize: 20, color: "#1890ff" } }), /* @__PURE__ */ import_react.default.createElement(Title, { level: 5, style: { margin: 0, fontSize: 20, fontWeight: 600 } }, "Skills 同步工具")), /* @__PURE__ */ import_react.default.createElement(Text, { type: "secondary", style: { display: "block", marginBottom: 16 } }, "将 YokaUI Skills 同步到本地 IDE 的插件目录中"), /* @__PURE__ */ import_react.default.createElement(
|
|
180
|
+
CheckboxGroup,
|
|
181
|
+
{
|
|
182
|
+
value: selectedIds,
|
|
183
|
+
onChange: (values) => handleCheckboxChange(values),
|
|
184
|
+
style: { display: "flex", flexDirection: "column", gap: 8 }
|
|
185
|
+
},
|
|
186
|
+
skillsOptions.map((option) => /* @__PURE__ */ import_react.default.createElement(import_antd.Checkbox, { key: option.id, value: option.id, style: { alignItems: "flex-start" } }, /* @__PURE__ */ import_react.default.createElement("div", { style: { display: "flex", flexDirection: "column" } }, /* @__PURE__ */ import_react.default.createElement(import_antd.Space, null, /* @__PURE__ */ import_react.default.createElement(Text, { strong: true }, option.label), /* @__PURE__ */ import_react.default.createElement(Text, { type: "secondary", style: { fontSize: 12 } }, "(", option.path, ")")), /* @__PURE__ */ import_react.default.createElement(Text, { type: "secondary", style: { fontSize: 12, marginTop: 2 } }, option.description))))
|
|
187
|
+
), /* @__PURE__ */ import_react.default.createElement("div", { className: import_index_module.default.actions }, /* @__PURE__ */ import_react.default.createElement(import_antd.Space, { direction: "vertical", style: { width: "100%" } }, /* @__PURE__ */ import_react.default.createElement(import_antd.Space, null, /* @__PURE__ */ import_react.default.createElement(
|
|
188
|
+
import_antd.Button,
|
|
189
|
+
{
|
|
190
|
+
type: "primary",
|
|
191
|
+
icon: /* @__PURE__ */ import_react.default.createElement(import_icons.FolderOpenOutlined, null),
|
|
192
|
+
onClick: downloadAndExtractSkills,
|
|
193
|
+
loading,
|
|
194
|
+
disabled: selectedSkills.length === 0 || !isSupported
|
|
195
|
+
},
|
|
196
|
+
"同步到本地"
|
|
197
|
+
), !isSupported && /* @__PURE__ */ import_react.default.createElement(Text, { type: "warning", style: { fontSize: 12 } }, "需要 HTTPS 或 localhost 环境,请手动下载")), /* @__PURE__ */ import_react.default.createElement(import_antd.Space, null, /* @__PURE__ */ import_react.default.createElement(import_antd.Button, { icon: /* @__PURE__ */ import_react.default.createElement(import_icons.CloudDownloadOutlined, null), href: "/skills.zip", download: true }, "手动下载 skills.zip"), /* @__PURE__ */ import_react.default.createElement(Text, { type: "secondary", style: { fontSize: 12 } }, "解压到对应工具的 skills 目录"))))));
|
|
198
|
+
};
|
|
199
|
+
var SkillsWriter_default = SkillsWriter;
|
|
200
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/creative/SkillsWriter/index.tsx"],
|
|
4
|
+
"sourcesContent": ["import { CloudDownloadOutlined, FolderOpenOutlined } from '@ant-design/icons';\nimport { Button, Card, Checkbox, message, Space, Typography } from 'antd';\nimport JSZip from 'jszip';\nimport React, { useState } from 'react';\nimport styles from './index.module.less';\n\nconst { Text, Title } = Typography;\nconst { Group: CheckboxGroup } = Checkbox;\n\n// 确认支持 skills 的工具及其路径\nconst skillsOptions = [\n {\n id: 'traue',\n path: '.trae/skills/',\n label: 'Traue',\n description: 'Traue IDE 的 skills 插件目录',\n },\n {\n id: 'cursor',\n path: '.cursor/skills/',\n label: 'Cursor',\n description: 'Cursor IDE 的 skills 插件目录',\n },\n {\n id: 'codebuddy',\n path: '.codebuddy/skills/',\n label: 'CodeBuddy',\n description: 'CodeBuddy 的 skills 插件目录',\n },\n {\n id: 'claudeCode',\n path: '.claude/skills/',\n label: 'Claude Code',\n description: 'Claude Code 的 skills 插件目录',\n },\n {\n id: 'qwenCode',\n path: '.qwen/skills/',\n label: 'Qwen Code',\n description: 'Qwen Code 的 skills 插件目录',\n },\n {\n id: 'openAICodex',\n path: '.codex/skills/',\n label: 'OpenAI Codex',\n description: 'OpenAI Codex 的 skills 插件目录',\n },\n {\n id: 'standard',\n path: '.skills/',\n label: '标准目录',\n description: '标准 skills 配置目录',\n },\n];\n\nconst SkillsWriter: React.FC = () => {\n const [selectedIds, setSelectedIds] = useState<string[]>([]);\n const [loading, setLoading] = useState(false);\n\n const isSupported = typeof window !== 'undefined' && 'showDirectoryPicker' in window;\n\n const handleCheckboxChange = (checkedIds: string[]) => {\n setSelectedIds(checkedIds);\n };\n\n const selectedSkills = skillsOptions.filter((opt) => selectedIds.includes(opt.id));\n\n // 递归创建目录\n const createDirectoryHandle = async (baseHandle: FileSystemDirectoryHandle, pathParts: string[]) => {\n let currentHandle = baseHandle;\n for (const part of pathParts) {\n try {\n currentHandle = await currentHandle.getDirectoryHandle(part, { create: true });\n } catch {\n currentHandle = await currentHandle.getDirectoryHandle(part);\n }\n }\n return currentHandle;\n };\n\n // 递归写入文件\n const writeFile = async (handle: FileSystemDirectoryHandle, filePath: string, content: Uint8Array) => {\n const pathParts = filePath.split('/').filter((p) => p);\n const fileName = pathParts.pop()!;\n const dirHandle = await createDirectoryHandle(handle, pathParts);\n const fileHandle = await dirHandle.getFileHandle(fileName, { create: true });\n const writable = await fileHandle.createWritable();\n await writable.write(content as BufferSource);\n await writable.close();\n };\n\n // 下载并解压 skills.zip\n const downloadAndExtractSkills = async () => {\n if (selectedSkills.length === 0) {\n message.error('请至少选择一个工具');\n return;\n }\n\n // 检查是否支持目录选择器\n if (!('showDirectoryPicker' in window)) {\n message.error('当前浏览器不支持目录选择器');\n return;\n }\n\n try {\n // 1. 先让用户选择目录\n const handle = await (window as Window & { showDirectoryPicker?: () => Promise<FileSystemDirectoryHandle> })\n .showDirectoryPicker!();\n\n // 2. 用户选择目录后开始处理\n setLoading(true);\n\n // 3. 下载 skills.zip\n const response = await fetch('/skills.zip');\n if (!response.ok) {\n throw new Error('下载失败,请稍后重试');\n }\n const blob = await response.blob();\n\n // 4. 解压 zip 文件,把 skills/yoka-ui 文件夹写入到用户选择的路径下\n const zip = await JSZip.loadAsync(blob);\n\n // 获取用户选择的路径列表\n const selectedPaths = selectedSkills.map((s) => s.path);\n\n // 找到 zip 中的 yoka-ui 文件夹\n const skillsFolderEntry = Object.entries(zip.files).find(\n ([path]) => path === 'yoka-ui' || path.startsWith('yoka-ui/'),\n );\n\n if (!skillsFolderEntry) {\n throw new Error('压缩包中未找到 yoka-ui 目录');\n }\n\n // 对每个用户选择的路径,创建 yoka-ui 文件夹并写入内容\n let totalCount = 0;\n\n for (const selectedPath of selectedPaths) {\n // 在用户选择的路径下创建 yoka-ui 文件夹\n const normalizedPath = selectedPath.replace(/^\\//, '').replace(/\\/$/, '');\n const pathParts = normalizedPath.split('/');\n\n let currentHandle = handle;\n for (const part of pathParts) {\n try {\n currentHandle = await currentHandle.getDirectoryHandle(part, { create: true });\n } catch {\n currentHandle = await currentHandle.getDirectoryHandle(part);\n }\n }\n\n // 创建 yoka-ui 文件夹\n let skillsHandle: FileSystemDirectoryHandle;\n try {\n skillsHandle = await currentHandle.getDirectoryHandle('yoka-ui', { create: true });\n } catch {\n skillsHandle = await currentHandle.getDirectoryHandle('yoka-ui');\n }\n\n // 遍历 zip 中 yoka-ui 文件夹下的所有文件\n for (const [filePath, zipEntry] of Object.entries(zip.files)) {\n if (filePath.startsWith('yoka-ui/')) {\n const relativePath = filePath.replace('yoka-ui/', '');\n\n if (!zipEntry.dir && relativePath) {\n // 写入文件\n const content = await zipEntry.async('uint8array');\n await writeFile(skillsHandle, relativePath, content);\n totalCount++;\n }\n }\n }\n }\n\n message.success(`成功添加 ${totalCount} 个文件到项目`);\n } catch (err: unknown) {\n if (err instanceof Error && err.name === 'AbortError') {\n // 用户取消选择,不显示任何消息\n } else {\n console.error('添加到项目失败:', err);\n message.error(err instanceof Error ? err.message : '添加到项目失败');\n }\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className={styles.skillsWriter}>\n <Card className={styles.card}>\n <div className={styles.header}>\n <CloudDownloadOutlined style={{ fontSize: 20, color: '#1890ff' }} />\n <Title level={5} style={{ margin: 0, fontSize: 20, fontWeight: 600 }}>\n Skills 同步工具\n </Title>\n </div>\n\n <Text type='secondary' style={{ display: 'block', marginBottom: 16 }}>\n 将 YokaUI Skills 同步到本地 IDE 的插件目录中\n </Text>\n\n <CheckboxGroup\n value={selectedIds}\n onChange={(values) => handleCheckboxChange(values as string[])}\n style={{ display: 'flex', flexDirection: 'column', gap: 8 }}\n >\n {skillsOptions.map((option) => (\n <Checkbox key={option.id} value={option.id} style={{ alignItems: 'flex-start' }}>\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n <Space>\n <Text strong>{option.label}</Text>\n <Text type='secondary' style={{ fontSize: 12 }}>\n ({option.path})\n </Text>\n </Space>\n <Text type='secondary' style={{ fontSize: 12, marginTop: 2 }}>\n {option.description}\n </Text>\n </div>\n </Checkbox>\n ))}\n </CheckboxGroup>\n\n <div className={styles.actions}>\n <Space direction='vertical' style={{ width: '100%' }}>\n <Space>\n <Button\n type='primary'\n icon={<FolderOpenOutlined />}\n onClick={downloadAndExtractSkills}\n loading={loading}\n disabled={selectedSkills.length === 0 || !isSupported}\n >\n 同步到本地\n </Button>\n {!isSupported && (\n <Text type='warning' style={{ fontSize: 12 }}>\n 需要 HTTPS 或 localhost 环境,请手动下载\n </Text>\n )}\n </Space>\n <Space>\n <Button icon={<CloudDownloadOutlined />} href='/skills.zip' download>\n 手动下载 skills.zip\n </Button>\n <Text type='secondary' style={{ fontSize: 12 }}>\n 解压到对应工具的 skills 目录\n </Text>\n </Space>\n </Space>\n </div>\n </Card>\n </div>\n );\n};\n\nexport default SkillsWriter;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["JSZip", "React", "styles"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
.skillsWriter {
|
|
2
|
+
margin: 24px 0;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.card {
|
|
6
|
+
border-radius: 8px;
|
|
7
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.header {
|
|
11
|
+
display: flex;
|
|
12
|
+
align-items: center;
|
|
13
|
+
gap: 8px;
|
|
14
|
+
margin-bottom: 16px;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.actions {
|
|
18
|
+
margin-top: 24px;
|
|
19
|
+
padding-top: 16px;
|
|
20
|
+
border-top: 1px solid #f0f0f0;
|
|
21
|
+
}
|
package/dist/lib/index.less
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
// 自动聚合的样式文件
|
|
8
|
-
@import "../../src/Themes/TableTheme/index.less";
|
|
9
8
|
@import "../../src/assets/less/ant-reset.less";
|
|
10
9
|
@import "../../src/assets/less/index.less";
|
|
11
10
|
@import "../../src/assets/less/variables.less";
|
|
@@ -14,6 +13,9 @@
|
|
|
14
13
|
@import "../../src/business/ModCommonFilter/components/FilterButton/index.module.less";
|
|
15
14
|
@import "../../src/business/ModCommonFilter/components/PopoverContent/index.module.less";
|
|
16
15
|
@import "../../src/business/ModCommonFilter/index.module.less";
|
|
16
|
+
@import "../../src/business/YkCharts/index.module.less";
|
|
17
|
+
@import "../../src/business/YkCharts/tooltip.less";
|
|
18
|
+
@import "../../src/business/YkCharts/variables.less";
|
|
17
19
|
@import "../../src/business/YkLoginModule/styles.module.less";
|
|
18
20
|
@import "../../src/business/YkPorjectSelect/index.module.less";
|
|
19
21
|
@import "../../src/business/YkSqlEdit/code-mirror-custom.module.less";
|
|
@@ -23,13 +25,16 @@
|
|
|
23
25
|
@import "../../src/components/TreeTransfer/components/TreeTransferPanel/index.less";
|
|
24
26
|
@import "../../src/components/TreeTransfer/index.less";
|
|
25
27
|
@import "../../src/components/YkDateRangePicker/index.module.less";
|
|
28
|
+
@import "../../src/components/YKMarkdown/index.module.less";
|
|
26
29
|
@import "../../src/components/YkRangeDateWithVS/index.module.less";
|
|
27
30
|
@import "../../src/components/YkRangeTimeWithRecent/index.module.less";
|
|
28
31
|
@import "../../src/creative/ArcCheckbox/index.module.less";
|
|
29
32
|
@import "../../src/creative/ButtonRadioWithInfo/index.less";
|
|
30
33
|
@import "../../src/creative/ButtonWithProgress/index.less";
|
|
31
34
|
@import "../../src/creative/GlassSegmentedRadio/index.module.less";
|
|
35
|
+
@import "../../src/creative/SkillsWriter/index.module.less";
|
|
32
36
|
@import "../../src/layout/YkDrawer/index.module.less";
|
|
37
|
+
@import "../../src/Themes/TableTheme/index.less";
|
|
33
38
|
@import "../../src/ui/LogicOperator/index.module.less";
|
|
34
39
|
@import "../../src/ui/YkCard/index.module.less";
|
|
35
40
|
@import "../../src/ui/YkCheckbox/index.module.less";
|
|
@@ -13,5 +13,20 @@ export type YkStoryDocInput = {
|
|
|
13
13
|
* 组件特有备注(交互、API、Story 限制等);环境类说明由函数自动追加。
|
|
14
14
|
*/
|
|
15
15
|
notes?: string[];
|
|
16
|
+
/**
|
|
17
|
+
* 代码示例数组,每个示例包含标题和代码。
|
|
18
|
+
* 将在文档中以 ```tsx 代码块形式展示。
|
|
19
|
+
*/
|
|
20
|
+
examples?: YkStoryDocExample[];
|
|
21
|
+
};
|
|
22
|
+
/** 代码示例类型 */
|
|
23
|
+
export type YkStoryDocExample = {
|
|
24
|
+
/** 示例标题 */
|
|
25
|
+
title?: string;
|
|
26
|
+
/** 代码示例内容(tsx 代码块) */
|
|
27
|
+
code: string;
|
|
16
28
|
};
|
|
29
|
+
/**
|
|
30
|
+
* 生成完整的 Storybook 文档字符串
|
|
31
|
+
*/
|
|
17
32
|
export declare function ykStoryDoc(input: YkStoryDocInput): string;
|
|
@@ -23,16 +23,38 @@ __export(ykStorybookDoc_exports, {
|
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(ykStorybookDoc_exports);
|
|
25
25
|
var YK_STORYBOOK_PLATFORM_NOTE = "业务侧使用 `@yoka-ui/ui` 时需保证 React 18、与库一致的 Ant Design 5;入口引入 Ant Design 全局样式(可与库一致使用 `antd/dist/reset.css`),并引入 `@yoka-ui/ui/dist/index.less`(以 README 为准)。";
|
|
26
|
+
function formatExamples(examples) {
|
|
27
|
+
if (!examples || examples.length === 0) {
|
|
28
|
+
return "";
|
|
29
|
+
}
|
|
30
|
+
return examples.map((example) => {
|
|
31
|
+
const title = example.title ? `### ${example.title}
|
|
32
|
+
|
|
33
|
+
` : "";
|
|
34
|
+
return `${title}\`\`\`tsx
|
|
35
|
+
${example.code}
|
|
36
|
+
\`\`\``;
|
|
37
|
+
}).join("\n\n");
|
|
38
|
+
}
|
|
26
39
|
function ykStoryDoc(input) {
|
|
27
40
|
const deps = input.dependencies.length > 0 ? input.dependencies.join("、") : "`react`、`antd`(具体见源码 import)";
|
|
28
41
|
const extra = (input.notes ?? []).filter(Boolean);
|
|
29
42
|
const remarks = [...extra, YK_STORYBOOK_PLATFORM_NOTE];
|
|
30
|
-
|
|
43
|
+
const baseDoc = `**描述**:${input.summary}
|
|
31
44
|
|
|
32
45
|
**依赖**:${deps}
|
|
33
46
|
|
|
34
47
|
**备注**:
|
|
35
48
|
${remarks.map((line) => `- ${line}`).join("\n")}`;
|
|
49
|
+
const examplesStr = formatExamples(input.examples ?? []);
|
|
50
|
+
if (examplesStr) {
|
|
51
|
+
return `${baseDoc}
|
|
52
|
+
|
|
53
|
+
## 代码示例
|
|
54
|
+
|
|
55
|
+
${examplesStr}`;
|
|
56
|
+
}
|
|
57
|
+
return baseDoc;
|
|
36
58
|
}
|
|
37
59
|
// Annotate the CommonJS export names for ESM import in node:
|
|
38
60
|
0 && (module.exports = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/utils/ykStorybookDoc.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Storybook Autodocs 统一文案:**描述** / **依赖** / **备注**。\n * 用于各 `*.stories.tsx` 的 `meta.parameters.docs.description.component`。\n */\nexport type YkStoryDocInput = {\n /** 一句话概括组件用途(建议以句号结尾) */\n summary: string;\n /**\n * 运行时主要依赖:`npm 包(用到的子模块)` 或 `本库 · 模块名`\n */\n dependencies: string[];\n /**\n * 组件特有备注(交互、API、Story 限制等);环境类说明由函数自动追加。\n */\n notes?: string[];\n};\n\nconst YK_STORYBOOK_PLATFORM_NOTE =\n '业务侧使用 `@yoka-ui/ui` 时需保证 React 18、与库一致的 Ant Design 5;入口引入 Ant Design 全局样式(可与库一致使用 `antd/dist/reset.css`),并引入 `@yoka-ui/ui/dist/index.less`(以 README 为准)。';\n\nexport function ykStoryDoc(input: YkStoryDocInput): string {\n const deps = input.dependencies.length > 0 ? input.dependencies.join('、') : '`react`、`antd`(具体见源码 import)';\n\n const extra = (input.notes ?? []).filter(Boolean);\n const remarks = [...extra, YK_STORYBOOK_PLATFORM_NOTE];\n\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["/**\n * Storybook Autodocs 统一文案:**描述** / **依赖** / **备注**。\n * 用于各 `*.stories.tsx` 的 `meta.parameters.docs.description.component`。\n */\nexport type YkStoryDocInput = {\n /** 一句话概括组件用途(建议以句号结尾) */\n summary: string;\n /**\n * 运行时主要依赖:`npm 包(用到的子模块)` 或 `本库 · 模块名`\n */\n dependencies: string[];\n /**\n * 组件特有备注(交互、API、Story 限制等);环境类说明由函数自动追加。\n */\n notes?: string[];\n /**\n * 代码示例数组,每个示例包含标题和代码。\n * 将在文档中以 ```tsx 代码块形式展示。\n */\n examples?: YkStoryDocExample[];\n};\n\n/** 代码示例类型 */\nexport type YkStoryDocExample = {\n /** 示例标题 */\n title?: string;\n /** 代码示例内容(tsx 代码块) */\n code: string;\n};\n\nconst YK_STORYBOOK_PLATFORM_NOTE =\n '业务侧使用 `@yoka-ui/ui` 时需保证 React 18、与库一致的 Ant Design 5;入口引入 Ant Design 全局样式(可与库一致使用 `antd/dist/reset.css`),并引入 `@yoka-ui/ui/dist/index.less`(以 README 为准)。';\n\n/**\n * 生成代码示例的 Markdown 格式字符串\n */\nfunction formatExamples(examples: YkStoryDocExample[]): string {\n if (!examples || examples.length === 0) {\n return '';\n }\n\n return examples\n .map((example) => {\n const title = example.title ? `### ${example.title}\\n\\n` : '';\n return `${title}\\`\\`\\`tsx\\n${example.code}\\n\\`\\`\\``;\n })\n .join('\\n\\n');\n}\n\n/**\n * 生成完整的 Storybook 文档字符串\n */\nexport function ykStoryDoc(input: YkStoryDocInput): string {\n const deps = input.dependencies.length > 0 ? input.dependencies.join('、') : '`react`、`antd`(具体见源码 import)';\n\n const extra = (input.notes ?? []).filter(Boolean);\n const remarks = [...extra, YK_STORYBOOK_PLATFORM_NOTE];\n\n const baseDoc = `**描述**:${input.summary}\\n\\n**依赖**:${deps}\\n\\n**备注**:\\n${remarks.map((line) => `- ${line}`).join('\\n')}`;\n\n // 如果有代码示例,添加到文档末尾\n const examplesStr = formatExamples(input.examples ?? []);\n if (examplesStr) {\n return `${baseDoc}\\n\\n## 代码示例\\n\\n${examplesStr}`;\n }\n\n return baseDoc;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BA,IAAM,6BACJ;AAKF,SAAS,eAAe,UAAuC;AAC7D,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,SAAO,SACJ,IAAI,CAAC,YAAY;AAChB,UAAM,QAAQ,QAAQ,QAAQ,OAAO,QAAQ;AAAA;AAAA,IAAc;AAC3D,WAAO,GAAG;AAAA,EAAmB,QAAQ;AAAA;AAAA,EACvC,CAAC,EACA,KAAK,MAAM;AAChB;AAKO,SAAS,WAAW,OAAgC;AACzD,QAAM,OAAO,MAAM,aAAa,SAAS,IAAI,MAAM,aAAa,KAAK,GAAG,IAAI;AAE5E,QAAM,SAAS,MAAM,SAAS,CAAC,GAAG,OAAO,OAAO;AAChD,QAAM,UAAU,CAAC,GAAG,OAAO,0BAA0B;AAErD,QAAM,UAAU,UAAU,MAAM;AAAA;AAAA,SAAqB;AAAA;AAAA;AAAA,EAAoB,QAAQ,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE,KAAK,IAAI;AAGrH,QAAM,cAAc,eAAe,MAAM,YAAY,CAAC,CAAC;AACvD,MAAI,aAAa;AACf,WAAO,GAAG;AAAA;AAAA;AAAA;AAAA,EAAyB;AAAA,EACrC;AAEA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|