📝 docs(vscode): 提交调用树弹框原型
This commit is contained in:
1 parent
b463706d1f
commit
6e8be1447a
7 files changed
+9852
No files matched your search
+771
@@ -0,0 +1,771 @@
|
|||||||
|
// 调用树原型。颜色:代码阅读暗色种类色(codeReader.css)叠在 VS Code Dark Modern 的编辑器底上。
|
||||||
|
// 要确认的事:点函数或类卡片右上角,调用树用弹框盖在预览上,预览不换掉。通向当前块的路径亮着;多棵树在弹框里切换。
|
||||||
|
|
||||||
|
const UI = "Noto Sans SC";
|
||||||
|
const MONO = "Menlo";
|
||||||
|
|
||||||
|
const C = {
|
||||||
|
bg: "#1F1F1F",
|
||||||
|
side: "#181818",
|
||||||
|
fg: "#CCCCCC",
|
||||||
|
muted: "#9D9D9D",
|
||||||
|
dim: "#6E6E6E",
|
||||||
|
line: "#2B2B2B",
|
||||||
|
guide: "#3C3C3C",
|
||||||
|
tab: "#181818",
|
||||||
|
selected: "#04395E",
|
||||||
|
chip: "#313131",
|
||||||
|
chipLine: "#3C3C3C",
|
||||||
|
focus: "#007FD4",
|
||||||
|
badge: "#0078D4",
|
||||||
|
white: "#FFFFFF",
|
||||||
|
ink: "#1F1F1F",
|
||||||
|
};
|
||||||
|
|
||||||
|
// 函数种类 #DCDCAA、类种类 #4EC9B0,按阅读器卡片的 7% 底、35% 边,当前块加到 14% 底、实色边。
|
||||||
|
const FN = { bg: "#2C2C29", bd: "#616150", hot: "#3A3A32", ink: "#DCDCAA" };
|
||||||
|
const CLS = { bg: "#222B29", bd: "#305A52", hot: "#263733", ink: "#4EC9B0" };
|
||||||
|
|
||||||
|
const solid = (color) => [{ type: "solid", color }];
|
||||||
|
|
||||||
|
const TREES = [
|
||||||
|
{ label: "读取用户资料", count: 2 },
|
||||||
|
{ label: "导出通讯录", count: 1 },
|
||||||
|
{ label: "夜间对账", count: 1 },
|
||||||
|
];
|
||||||
|
|
||||||
|
const PHONE = {
|
||||||
|
name: "GET /users/me",
|
||||||
|
icon: "route",
|
||||||
|
desc: "入口",
|
||||||
|
loc: "routes/user.py",
|
||||||
|
on: true,
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: "get_profile",
|
||||||
|
icon: "braces",
|
||||||
|
desc: "读取当前用户",
|
||||||
|
loc: "services/user.py",
|
||||||
|
on: true,
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: "serialize_user",
|
||||||
|
icon: "braces",
|
||||||
|
desc: "写成接口响应",
|
||||||
|
loc: "services/user.py",
|
||||||
|
on: true,
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: "mask_phone",
|
||||||
|
icon: "braces",
|
||||||
|
desc: "手机号打星",
|
||||||
|
loc: "utils/phone.py:28",
|
||||||
|
on: true,
|
||||||
|
current: true,
|
||||||
|
},
|
||||||
|
{ folded: "另外 1 处调用" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "load_user",
|
||||||
|
icon: "braces",
|
||||||
|
desc: "从库里取出用户",
|
||||||
|
loc: "services/user.py",
|
||||||
|
on: true,
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: "mask_phone",
|
||||||
|
icon: "braces",
|
||||||
|
desc: "手机号打星",
|
||||||
|
loc: "utils/phone.py:28",
|
||||||
|
on: true,
|
||||||
|
current: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{ folded: "另外 2 处调用" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
const ORDER = {
|
||||||
|
name: "POST /orders",
|
||||||
|
icon: "route",
|
||||||
|
desc: "入口",
|
||||||
|
loc: "routes/order.py",
|
||||||
|
on: true,
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: "create_order",
|
||||||
|
icon: "braces",
|
||||||
|
desc: "创建一笔订单",
|
||||||
|
loc: "billing/order.py",
|
||||||
|
on: true,
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: "新建 OrderService",
|
||||||
|
icon: "box",
|
||||||
|
desc: "进入这个类",
|
||||||
|
loc: "billing/order.py:40",
|
||||||
|
on: true,
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: "OrderService",
|
||||||
|
icon: "box",
|
||||||
|
desc: "订单结算",
|
||||||
|
loc: "billing/order.py:14",
|
||||||
|
on: true,
|
||||||
|
current: true,
|
||||||
|
children: [{ folded: "4 个方法不在这条路径上" }],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
const SINGLE = {
|
||||||
|
name: "夜间对账",
|
||||||
|
icon: "route",
|
||||||
|
desc: "入口",
|
||||||
|
loc: "jobs/audit.py",
|
||||||
|
on: true,
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: "run_audit",
|
||||||
|
icon: "braces",
|
||||||
|
desc: "跑一遍对账",
|
||||||
|
loc: "jobs/audit.py",
|
||||||
|
on: true,
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: "mask_phone",
|
||||||
|
icon: "braces",
|
||||||
|
desc: "手机号打星",
|
||||||
|
loc: "utils/phone.py:28",
|
||||||
|
on: true,
|
||||||
|
current: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
function text(parent, content, opts) {
|
||||||
|
return I(parent, Object.assign({
|
||||||
|
type: "text",
|
||||||
|
content,
|
||||||
|
fontFamily: UI,
|
||||||
|
fontSize: 13,
|
||||||
|
fontWeight: 400,
|
||||||
|
fill: solid(C.fg),
|
||||||
|
textGrowth: "auto",
|
||||||
|
lineHeight: 1.3,
|
||||||
|
}, opts));
|
||||||
|
}
|
||||||
|
|
||||||
|
function icon(parent, name, color) {
|
||||||
|
return I(parent, {
|
||||||
|
type: "icon_font",
|
||||||
|
iconFontName: name,
|
||||||
|
width: 14,
|
||||||
|
height: 14,
|
||||||
|
fill: solid(color),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function tool(parent, name, badge, on) {
|
||||||
|
const props = {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
width: "fit_content",
|
||||||
|
height: 20,
|
||||||
|
padding: [0, 4],
|
||||||
|
gap: 1,
|
||||||
|
alignItems: "center",
|
||||||
|
cornerRadius: 4,
|
||||||
|
};
|
||||||
|
if (on) props.fill = solid(C.selected);
|
||||||
|
const btn = I(parent, props);
|
||||||
|
icon(btn, name, on ? C.white : C.muted);
|
||||||
|
if (badge) {
|
||||||
|
const mark = I(btn, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
width: 14,
|
||||||
|
height: 14,
|
||||||
|
cornerRadius: 7,
|
||||||
|
alignItems: "center",
|
||||||
|
justifyContent: "center",
|
||||||
|
fill: solid(C.badge),
|
||||||
|
});
|
||||||
|
text(mark, badge, { fontSize: 9, fontWeight: 700, fill: solid(C.white) });
|
||||||
|
}
|
||||||
|
return btn;
|
||||||
|
}
|
||||||
|
|
||||||
|
function nodeRow(parent, node, depth, tone) {
|
||||||
|
const row = I(parent, {
|
||||||
|
type: "frame",
|
||||||
|
name: node.folded || node.name,
|
||||||
|
layout: "horizontal",
|
||||||
|
width: "fill_container",
|
||||||
|
height: "fit_content",
|
||||||
|
padding: [0, 0, 0, depth * 22],
|
||||||
|
gap: 8,
|
||||||
|
alignItems: "center",
|
||||||
|
});
|
||||||
|
I(row, {
|
||||||
|
type: "rectangle",
|
||||||
|
width: 2,
|
||||||
|
height: node.folded ? 16 : 44,
|
||||||
|
cornerRadius: 1,
|
||||||
|
fill: solid(node.on ? tone.ink : C.guide),
|
||||||
|
});
|
||||||
|
if (node.folded) {
|
||||||
|
text(row, node.folded, { fontSize: 12, fill: solid(C.dim) });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const card = I(row, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "vertical",
|
||||||
|
width: "fill_container",
|
||||||
|
height: "fit_content",
|
||||||
|
padding: [7, 10],
|
||||||
|
gap: 2,
|
||||||
|
cornerRadius: 8,
|
||||||
|
fill: solid(node.current ? tone.hot : tone.bg),
|
||||||
|
stroke: {
|
||||||
|
thickness: 1,
|
||||||
|
align: "inside",
|
||||||
|
fill: solid(node.current ? tone.ink : tone.bd),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const top = I(card, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
width: "fill_container",
|
||||||
|
height: "fit_content",
|
||||||
|
gap: 8,
|
||||||
|
alignItems: "center",
|
||||||
|
});
|
||||||
|
icon(top, node.icon, tone.ink);
|
||||||
|
text(top, node.name, { fontFamily: MONO, fontSize: 13, fontWeight: 600, fill: solid(tone.ink) });
|
||||||
|
I(top, { type: "frame", width: "fill_container", height: 1 });
|
||||||
|
if (node.current) {
|
||||||
|
const pill = I(top, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
height: 18,
|
||||||
|
padding: [0, 6],
|
||||||
|
cornerRadius: 9,
|
||||||
|
alignItems: "center",
|
||||||
|
fill: solid(tone.ink),
|
||||||
|
});
|
||||||
|
text(pill, "当前", { fontSize: 11, fontWeight: 600, fill: solid(C.ink) });
|
||||||
|
}
|
||||||
|
const sub = I(card, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
width: "fill_container",
|
||||||
|
height: "fit_content",
|
||||||
|
gap: 8,
|
||||||
|
alignItems: "center",
|
||||||
|
});
|
||||||
|
text(sub, node.desc, { fontSize: 12, fill: solid(C.muted) });
|
||||||
|
text(sub, node.loc, { fontFamily: MONO, fontSize: 11, fill: solid(C.dim) });
|
||||||
|
}
|
||||||
|
|
||||||
|
function walk(parent, node, depth, tone) {
|
||||||
|
nodeRow(parent, node, depth, tone);
|
||||||
|
for (const child of node.children || []) walk(parent, child, depth + 1, tone);
|
||||||
|
}
|
||||||
|
|
||||||
|
function editor(parent, spec) {
|
||||||
|
const shell = I(parent, {
|
||||||
|
type: "frame",
|
||||||
|
x: spec.x,
|
||||||
|
y: spec.y,
|
||||||
|
layout: "horizontal",
|
||||||
|
width: spec.width,
|
||||||
|
height: spec.height,
|
||||||
|
fill: solid(C.bg),
|
||||||
|
clipContent: true,
|
||||||
|
});
|
||||||
|
if (spec.sideWidth) {
|
||||||
|
const side = I(shell, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "vertical",
|
||||||
|
width: spec.sideWidth,
|
||||||
|
height: "fill_container",
|
||||||
|
fill: solid(C.side),
|
||||||
|
});
|
||||||
|
const sideHead = I(side, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
width: "fill_container",
|
||||||
|
height: 35,
|
||||||
|
padding: [0, 12],
|
||||||
|
alignItems: "center",
|
||||||
|
});
|
||||||
|
text(sideHead, "资源管理器", { fontSize: 11, fill: solid(C.muted) });
|
||||||
|
for (const file of spec.files) fileRow(side, file.label, file.depth, file.on);
|
||||||
|
}
|
||||||
|
const main = I(shell, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "vertical",
|
||||||
|
width: "fill_container",
|
||||||
|
height: "fill_container",
|
||||||
|
fill: solid(C.bg),
|
||||||
|
});
|
||||||
|
const tabs = I(main, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
width: "fill_container",
|
||||||
|
height: 35,
|
||||||
|
padding: [0, 0, 0, 8],
|
||||||
|
alignItems: "end",
|
||||||
|
fill: solid(C.tab),
|
||||||
|
});
|
||||||
|
const tab = I(tabs, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
height: 35,
|
||||||
|
padding: [0, 12],
|
||||||
|
gap: 8,
|
||||||
|
alignItems: "center",
|
||||||
|
fill: solid(C.bg),
|
||||||
|
});
|
||||||
|
text(tab, spec.tab, { fontSize: 13 });
|
||||||
|
icon(tab, "x", C.dim);
|
||||||
|
I(main, { type: "rectangle", width: "fill_container", height: 1, fill: solid(C.line) });
|
||||||
|
const page = I(main, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "vertical",
|
||||||
|
width: "fill_container",
|
||||||
|
height: "fit_content",
|
||||||
|
padding: 16,
|
||||||
|
gap: 8,
|
||||||
|
});
|
||||||
|
for (const card of spec.cards) readerCard(page, card);
|
||||||
|
}
|
||||||
|
|
||||||
|
function dialogBody(dialog, spec) {
|
||||||
|
const bar = I(dialog, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
width: "fill_container",
|
||||||
|
height: 44,
|
||||||
|
padding: [0, 14],
|
||||||
|
gap: 8,
|
||||||
|
alignItems: "center",
|
||||||
|
fill: solid("#2D2D2D"),
|
||||||
|
});
|
||||||
|
text(bar, "调用树", { fontSize: 13, fontWeight: 600 });
|
||||||
|
text(bar, spec.symbol, { fontFamily: MONO, fontSize: 13, fontWeight: 600, fill: solid(spec.tone.ink) });
|
||||||
|
text(bar, spec.where, { fontFamily: MONO, fontSize: 11, fill: solid(C.dim) });
|
||||||
|
I(bar, { type: "frame", width: "fill_container", height: 1 });
|
||||||
|
icon(bar, "x", C.muted);
|
||||||
|
I(dialog, { type: "rectangle", width: "fill_container", height: 1, fill: solid(C.line) });
|
||||||
|
if (spec.chips) {
|
||||||
|
const chips = I(dialog, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
width: "fill_container",
|
||||||
|
height: "fit_content",
|
||||||
|
padding: [12, 16, 4, 16],
|
||||||
|
gap: 8,
|
||||||
|
alignItems: "center",
|
||||||
|
});
|
||||||
|
for (const chip of spec.chips) {
|
||||||
|
const box = I(chips, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
height: 28,
|
||||||
|
padding: [0, 10],
|
||||||
|
gap: 6,
|
||||||
|
alignItems: "center",
|
||||||
|
cornerRadius: 6,
|
||||||
|
fill: solid(chip.on ? C.selected : C.chip),
|
||||||
|
stroke: { thickness: 1, align: "inside", fill: solid(chip.on ? C.focus : C.chipLine) },
|
||||||
|
});
|
||||||
|
text(box, chip.label, { fontSize: 12, fontWeight: chip.on ? 600 : 400, fill: solid(chip.on ? C.white : C.fg) });
|
||||||
|
text(box, chip.count + " 处", { fontSize: 11, fill: solid(chip.on ? "#9CDCFF" : C.dim) });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const body = I(dialog, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "vertical",
|
||||||
|
width: "fill_container",
|
||||||
|
height: "fit_content",
|
||||||
|
padding: [12, 16, 20, 16],
|
||||||
|
gap: 6,
|
||||||
|
});
|
||||||
|
walk(body, spec.tree, 0, spec.tone);
|
||||||
|
}
|
||||||
|
|
||||||
|
function treeBoard(spec) {
|
||||||
|
const editorW = spec.width - spec.sideWidth;
|
||||||
|
const stageH = spec.height - 36;
|
||||||
|
const root = I(null, {
|
||||||
|
type: "frame",
|
||||||
|
name: spec.name,
|
||||||
|
x: spec.x,
|
||||||
|
y: 0,
|
||||||
|
layout: "horizontal",
|
||||||
|
width: spec.width,
|
||||||
|
height: spec.height,
|
||||||
|
fill: solid(C.bg),
|
||||||
|
clipContent: true,
|
||||||
|
});
|
||||||
|
if (spec.sideWidth) {
|
||||||
|
const side = I(root, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "vertical",
|
||||||
|
width: spec.sideWidth,
|
||||||
|
height: "fill_container",
|
||||||
|
fill: solid(C.side),
|
||||||
|
});
|
||||||
|
const sideHead = I(side, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
width: "fill_container",
|
||||||
|
height: 35,
|
||||||
|
padding: [0, 12],
|
||||||
|
alignItems: "center",
|
||||||
|
});
|
||||||
|
text(sideHead, "资源管理器", { fontSize: 11, fill: solid(C.muted) });
|
||||||
|
for (const file of spec.files) fileRow(side, file.label, file.depth, file.on);
|
||||||
|
}
|
||||||
|
const main = I(root, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "vertical",
|
||||||
|
width: "fill_container",
|
||||||
|
height: "fill_container",
|
||||||
|
fill: solid(C.bg),
|
||||||
|
});
|
||||||
|
const tabs = I(main, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
width: "fill_container",
|
||||||
|
height: 35,
|
||||||
|
padding: [0, 0, 0, 8],
|
||||||
|
alignItems: "end",
|
||||||
|
fill: solid(C.tab),
|
||||||
|
});
|
||||||
|
const tab = I(tabs, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
height: 35,
|
||||||
|
padding: [0, 12],
|
||||||
|
gap: 8,
|
||||||
|
alignItems: "center",
|
||||||
|
fill: solid(C.bg),
|
||||||
|
});
|
||||||
|
text(tab, spec.tab, { fontSize: 13 });
|
||||||
|
icon(tab, "x", C.dim);
|
||||||
|
I(main, { type: "rectangle", width: "fill_container", height: 1, fill: solid(C.line) });
|
||||||
|
const stage = I(main, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "none",
|
||||||
|
width: "fill_container",
|
||||||
|
height: stageH,
|
||||||
|
fill: solid(C.bg),
|
||||||
|
});
|
||||||
|
const dialog = I(stage, {
|
||||||
|
type: "frame",
|
||||||
|
name: "弹框",
|
||||||
|
x: spec.dialogX,
|
||||||
|
y: spec.dialogY,
|
||||||
|
layout: "vertical",
|
||||||
|
width: spec.dialogW,
|
||||||
|
height: "fit_content",
|
||||||
|
cornerRadius: 8,
|
||||||
|
clipContent: true,
|
||||||
|
fill: solid("#252526"),
|
||||||
|
stroke: { thickness: 1, align: "inside", fill: solid("#454545") },
|
||||||
|
effects: [{ type: "shadow", offsetX: 0, offsetY: 16, blur: 40, color: "rgba(0,0,0,0.5)" }],
|
||||||
|
});
|
||||||
|
dialogBody(dialog, spec);
|
||||||
|
I(stage, {
|
||||||
|
type: "rectangle",
|
||||||
|
name: "遮罩",
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
width: editorW,
|
||||||
|
height: stageH,
|
||||||
|
fill: solid("#000000"),
|
||||||
|
opacity: 0.55,
|
||||||
|
});
|
||||||
|
const page = I(stage, {
|
||||||
|
type: "frame",
|
||||||
|
x: 16,
|
||||||
|
y: 16,
|
||||||
|
layout: "vertical",
|
||||||
|
width: editorW - 32,
|
||||||
|
height: "fit_content",
|
||||||
|
gap: 8,
|
||||||
|
});
|
||||||
|
for (const card of spec.cards) readerCard(page, card);
|
||||||
|
return root;
|
||||||
|
}
|
||||||
|
|
||||||
|
function readerCard(parent, spec) {
|
||||||
|
const card = I(parent, {
|
||||||
|
type: "frame",
|
||||||
|
name: spec.symbol,
|
||||||
|
layout: "horizontal",
|
||||||
|
width: "fill_container",
|
||||||
|
height: "fit_content",
|
||||||
|
padding: [8, 10, 8, 8],
|
||||||
|
gap: 8,
|
||||||
|
alignItems: "start",
|
||||||
|
cornerRadius: 8,
|
||||||
|
fill: solid(spec.tone.bg),
|
||||||
|
stroke: { thickness: 1, align: "inside", fill: solid(spec.tone.bd) },
|
||||||
|
});
|
||||||
|
icon(card, "chevron-down", C.muted);
|
||||||
|
icon(card, spec.icon, spec.tone.ink);
|
||||||
|
const body = I(card, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "vertical",
|
||||||
|
width: "fill_container",
|
||||||
|
height: "fit_content",
|
||||||
|
gap: 4,
|
||||||
|
});
|
||||||
|
text(body, spec.symbol, { fontFamily: MONO, fontSize: 13, fontWeight: 600, fill: solid(spec.tone.ink) });
|
||||||
|
text(body, spec.desc, { fontSize: 13, fill: solid(C.fg) });
|
||||||
|
text(body, spec.loc, { fontFamily: MONO, fontSize: 11, fill: solid(C.dim) });
|
||||||
|
const tools = I(card, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
width: "fit_content",
|
||||||
|
height: 20,
|
||||||
|
gap: 2,
|
||||||
|
alignItems: "center",
|
||||||
|
});
|
||||||
|
tool(tools, "message-square-text");
|
||||||
|
tool(tools, "sparkles");
|
||||||
|
tool(tools, "pencil");
|
||||||
|
tool(tools, "git-branch", spec.badge, spec.open);
|
||||||
|
}
|
||||||
|
|
||||||
|
function fileRow(parent, label, depth, on) {
|
||||||
|
const row = I(parent, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
width: "fill_container",
|
||||||
|
height: 26,
|
||||||
|
padding: [0, 8, 0, 8 + depth * 14],
|
||||||
|
gap: 6,
|
||||||
|
alignItems: "center",
|
||||||
|
fill: solid(on ? C.selected : C.side),
|
||||||
|
});
|
||||||
|
text(row, label, { fontSize: 13, fill: solid(on ? C.white : C.fg) });
|
||||||
|
}
|
||||||
|
|
||||||
|
function readerBoard() {
|
||||||
|
const root = I(null, {
|
||||||
|
type: "frame",
|
||||||
|
name: "代码阅读 · 卡片入口",
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
layout: "horizontal",
|
||||||
|
width: 1040,
|
||||||
|
height: 220,
|
||||||
|
fill: solid(C.bg),
|
||||||
|
clipContent: true,
|
||||||
|
});
|
||||||
|
const side = I(root, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "vertical",
|
||||||
|
width: 220,
|
||||||
|
height: "fill_container",
|
||||||
|
fill: solid(C.side),
|
||||||
|
});
|
||||||
|
const sideHead = I(side, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
width: "fill_container",
|
||||||
|
height: 35,
|
||||||
|
padding: [0, 12],
|
||||||
|
alignItems: "center",
|
||||||
|
});
|
||||||
|
text(sideHead, "资源管理器", { fontSize: 11, fill: solid(C.muted) });
|
||||||
|
fileRow(side, "superwork", 0, false);
|
||||||
|
fileRow(side, "routes", 1, false);
|
||||||
|
fileRow(side, "services", 1, false);
|
||||||
|
fileRow(side, "utils", 1, false);
|
||||||
|
fileRow(side, "phone.py", 2, true);
|
||||||
|
|
||||||
|
const main = I(root, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "vertical",
|
||||||
|
width: "fill_container",
|
||||||
|
height: "fit_content",
|
||||||
|
fill: solid(C.bg),
|
||||||
|
});
|
||||||
|
const tabs = I(main, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
width: "fill_container",
|
||||||
|
height: 35,
|
||||||
|
padding: [0, 0, 0, 8],
|
||||||
|
alignItems: "end",
|
||||||
|
fill: solid(C.tab),
|
||||||
|
});
|
||||||
|
const tab = I(tabs, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "horizontal",
|
||||||
|
height: 35,
|
||||||
|
padding: [0, 12],
|
||||||
|
gap: 8,
|
||||||
|
alignItems: "center",
|
||||||
|
fill: solid(C.bg),
|
||||||
|
});
|
||||||
|
text(tab, "phone.py", { fontSize: 13 });
|
||||||
|
icon(tab, "x", C.dim);
|
||||||
|
I(main, { type: "rectangle", width: "fill_container", height: 1, fill: solid(C.line) });
|
||||||
|
const page = I(main, {
|
||||||
|
type: "frame",
|
||||||
|
layout: "vertical",
|
||||||
|
width: "fill_container",
|
||||||
|
height: "fit_content",
|
||||||
|
padding: 16,
|
||||||
|
gap: 8,
|
||||||
|
});
|
||||||
|
readerCard(page, {
|
||||||
|
symbol: "mask_phone",
|
||||||
|
icon: "braces",
|
||||||
|
desc: "把手机号中间四位换成星号",
|
||||||
|
loc: "utils/phone.py:28",
|
||||||
|
tone: FN,
|
||||||
|
badge: "3",
|
||||||
|
});
|
||||||
|
readerCard(page, {
|
||||||
|
symbol: "mask_email",
|
||||||
|
icon: "braces",
|
||||||
|
desc: "把邮箱用户名打成星号",
|
||||||
|
loc: "utils/phone.py:41",
|
||||||
|
tone: FN,
|
||||||
|
badge: "1",
|
||||||
|
});
|
||||||
|
return root;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PHONE_FILES = [
|
||||||
|
{ label: "superwork", depth: 0 },
|
||||||
|
{ label: "routes", depth: 1 },
|
||||||
|
{ label: "services", depth: 1 },
|
||||||
|
{ label: "utils", depth: 1 },
|
||||||
|
{ label: "phone.py", depth: 2, on: true },
|
||||||
|
];
|
||||||
|
const PHONE_CARDS = [
|
||||||
|
{
|
||||||
|
symbol: "mask_phone",
|
||||||
|
icon: "braces",
|
||||||
|
desc: "把手机号中间四位换成星号",
|
||||||
|
loc: "utils/phone.py:28",
|
||||||
|
tone: FN,
|
||||||
|
badge: "3",
|
||||||
|
open: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
symbol: "mask_email",
|
||||||
|
icon: "braces",
|
||||||
|
desc: "把邮箱用户名打成星号",
|
||||||
|
loc: "utils/phone.py:41",
|
||||||
|
tone: FN,
|
||||||
|
badge: "1",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
readerBoard();
|
||||||
|
treeBoard({
|
||||||
|
name: "调用树 · 弹框,多棵",
|
||||||
|
x: 1120,
|
||||||
|
width: 1040,
|
||||||
|
height: 720,
|
||||||
|
sideWidth: 220,
|
||||||
|
dialogX: 28,
|
||||||
|
dialogY: 28,
|
||||||
|
dialogW: 764,
|
||||||
|
tab: "phone.py",
|
||||||
|
files: PHONE_FILES,
|
||||||
|
cards: PHONE_CARDS,
|
||||||
|
symbol: "mask_phone",
|
||||||
|
where: "utils/phone.py:28",
|
||||||
|
tone: FN,
|
||||||
|
chips: TREES.map((tree, index) => Object.assign({ on: index === 0 }, tree)),
|
||||||
|
tree: PHONE,
|
||||||
|
});
|
||||||
|
treeBoard({
|
||||||
|
name: "调用树 · 弹框,类",
|
||||||
|
x: 2240,
|
||||||
|
width: 1040,
|
||||||
|
height: 640,
|
||||||
|
sideWidth: 220,
|
||||||
|
dialogX: 28,
|
||||||
|
dialogY: 28,
|
||||||
|
dialogW: 764,
|
||||||
|
tab: "order.py",
|
||||||
|
files: [
|
||||||
|
{ label: "superwork", depth: 0 },
|
||||||
|
{ label: "billing", depth: 1 },
|
||||||
|
{ label: "order.py", depth: 2, on: true },
|
||||||
|
],
|
||||||
|
cards: [{
|
||||||
|
symbol: "OrderService",
|
||||||
|
icon: "box",
|
||||||
|
desc: "订单结算",
|
||||||
|
loc: "billing/order.py:14",
|
||||||
|
tone: CLS,
|
||||||
|
badge: "2",
|
||||||
|
open: true,
|
||||||
|
}],
|
||||||
|
symbol: "OrderService",
|
||||||
|
where: "billing/order.py:14",
|
||||||
|
tone: CLS,
|
||||||
|
chips: [
|
||||||
|
{ label: "创建订单", count: 1, on: true },
|
||||||
|
{ label: "补开发票", count: 1, on: false },
|
||||||
|
],
|
||||||
|
tree: ORDER,
|
||||||
|
});
|
||||||
|
treeBoard({
|
||||||
|
name: "调用树 · 弹框,只有一棵",
|
||||||
|
x: 3360,
|
||||||
|
width: 1040,
|
||||||
|
height: 560,
|
||||||
|
sideWidth: 220,
|
||||||
|
dialogX: 28,
|
||||||
|
dialogY: 28,
|
||||||
|
dialogW: 764,
|
||||||
|
tab: "phone.py",
|
||||||
|
files: PHONE_FILES,
|
||||||
|
cards: PHONE_CARDS,
|
||||||
|
symbol: "mask_phone",
|
||||||
|
where: "utils/phone.py:28",
|
||||||
|
tone: FN,
|
||||||
|
tree: SINGLE,
|
||||||
|
});
|
||||||
|
treeBoard({
|
||||||
|
name: "调用树 · 弹框,窄窗口",
|
||||||
|
x: 4480,
|
||||||
|
width: 640,
|
||||||
|
height: 720,
|
||||||
|
sideWidth: 0,
|
||||||
|
dialogX: 20,
|
||||||
|
dialogY: 20,
|
||||||
|
dialogW: 600,
|
||||||
|
tab: "phone.py",
|
||||||
|
files: [],
|
||||||
|
cards: PHONE_CARDS,
|
||||||
|
symbol: "mask_phone",
|
||||||
|
where: "utils/phone.py:28",
|
||||||
|
tone: FN,
|
||||||
|
chips: TREES.map((tree, index) => Object.assign({ on: index === 0 }, tree)),
|
||||||
|
tree: PHONE,
|
||||||
|
});
|
||||||
File diff suppressed because it is too large.
Load diff
Binary file not shown.
|
After Width: | Height: | Size: 63 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 147 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 113 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 82 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 121 KiB |
Reference in new issue
Block a user