@veltra/desktop 1.7.12 → 1.7.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/batch-edit/batch-edit-form.js +9 -3
- package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
- package/dist/components/batch-edit/batch-edit-list.js +2 -1
- package/dist/components/batch-edit/batch-edit-list.js.map +1 -1
- package/dist/components/batch-edit/batch-edit.js +57 -30
- package/dist/components/batch-edit/batch-edit.js.map +1 -1
- package/dist/components/batch-edit/helper.d.ts +1 -2
- package/dist/components/batch-edit/style.d.ts +1 -0
- package/dist/components/batch-edit/style.js +1 -0
- package/dist/components/batch-edit/style2.css +14 -0
- package/dist/components/batch-edit/use-dialog-effect.js +20 -0
- package/dist/components/batch-edit/use-dialog-effect.js.map +1 -0
- package/dist/components/batch-edit/use-edit-state.js +22 -3
- package/dist/components/batch-edit/use-edit-state.js.map +1 -1
- package/dist/components/batch-edit/use-handlers.js +5 -0
- package/dist/components/batch-edit/use-handlers.js.map +1 -1
- package/dist/components/batch-edit/use-shortcut-key.js +5 -2
- package/dist/components/batch-edit/use-shortcut-key.js.map +1 -1
- package/dist/components/condition-editor/core/evaluator.d.ts +4 -5
- package/dist/components/contextmenu/api.d.ts +1 -2
- package/dist/components/contextmenu/di.d.ts +2 -3
- package/dist/components/file-viewer/file-viewer.js +21 -14
- package/dist/components/file-viewer/file-viewer.js.map +1 -1
- package/dist/components/file-viewer/helper.js +2 -0
- package/dist/components/file-viewer/helper.js.map +1 -1
- package/dist/components/file-viewer/previewers/ofd-previewer.js +196 -0
- package/dist/components/file-viewer/previewers/ofd-previewer.js.map +1 -0
- package/dist/components/file-viewer/style2.css +27 -0
- package/dist/components/loading/directive.d.ts +1 -2
- package/dist/components/message/message.d.ts +1 -2
- package/dist/components/message-confirm/message-confirm.d.ts +1 -2
- package/dist/components/notification/notification.d.ts +1 -2
- package/dist/components/table/node/col.js +19 -0
- package/dist/components/table/node/col.js.map +1 -1
- package/dist/components/table/table-cell.js +2 -0
- package/dist/components/table/table-cell.js.map +1 -1
- package/dist/components/table/table-foot.js +2 -0
- package/dist/components/table/table-foot.js.map +1 -1
- package/dist/components/table/table-head.js +1 -0
- package/dist/components/table/table-head.js.map +1 -1
- package/dist/components/table/table-row.js +2 -0
- package/dist/components/table/table-row.js.map +1 -1
- package/dist/components/table/use-columns.d.ts +1 -2
- package/dist/components/table-editor/style2.css +23 -3
- package/dist/components/table-editor/table-editor.js +213 -63
- package/dist/components/table-editor/table-editor.js.map +1 -1
- package/dist/components/tip/style2.css +63 -0
- package/dist/components/tip/tip.js +6 -1
- package/dist/components/tip/tip.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/install.d.ts +3 -3
- package/dist/packages/ofd-core/dist/color.js +69 -0
- package/dist/packages/ofd-core/dist/color.js.map +1 -0
- package/dist/packages/ofd-core/dist/ctm.js +55 -0
- package/dist/packages/ofd-core/dist/ctm.js.map +1 -0
- package/dist/packages/ofd-core/dist/error.js +14 -0
- package/dist/packages/ofd-core/dist/error.js.map +1 -0
- package/dist/packages/ofd-core/dist/font.js +384 -0
- package/dist/packages/ofd-core/dist/font.js.map +1 -0
- package/dist/packages/ofd-core/dist/index.js +6 -0
- package/dist/packages/ofd-core/dist/number.js +13 -0
- package/dist/packages/ofd-core/dist/number.js.map +1 -0
- package/dist/packages/ofd-core/dist/page-objects.js +181 -0
- package/dist/packages/ofd-core/dist/page-objects.js.map +1 -0
- package/dist/packages/ofd-core/dist/parse.js +65 -0
- package/dist/packages/ofd-core/dist/parse.js.map +1 -0
- package/dist/packages/ofd-core/dist/render.js +361 -0
- package/dist/packages/ofd-core/dist/render.js.map +1 -0
- package/dist/packages/ofd-core/dist/xml.js +199 -0
- package/dist/packages/ofd-core/dist/xml.js.map +1 -0
- package/dist/packages/ofd-core/dist/zip.js +93 -0
- package/dist/packages/ofd-core/dist/zip.js.map +1 -0
- package/dist/style.d.ts +1 -1
- package/dist/style.js +1 -1
- package/dist/types/action.d.ts +7 -8
- package/dist/types/animation.d.ts +4 -5
- package/dist/types/auto-complete.d.ts +4 -5
- package/dist/types/badge.d.ts +4 -5
- package/dist/types/batch-edit.d.ts +15 -10
- package/dist/types/breadcrumb.d.ts +6 -7
- package/dist/types/button.d.ts +5 -6
- package/dist/types/calendar.d.ts +7 -8
- package/dist/types/card.d.ts +7 -8
- package/dist/types/cascade.d.ts +6 -7
- package/dist/types/check-tag.d.ts +4 -5
- package/dist/types/checkbox-group.d.ts +3 -4
- package/dist/types/checkbox.d.ts +5 -6
- package/dist/types/code-editor.d.ts +5 -6
- package/dist/types/collapse.d.ts +6 -7
- package/dist/types/condition-editor.d.ts +11 -12
- package/dist/types/contextmenu.d.ts +5 -6
- package/dist/types/css-transition.d.ts +4 -5
- package/dist/types/date-panel.d.ts +3 -4
- package/dist/types/date-picker.d.ts +5 -6
- package/dist/types/date-range-picker.d.ts +6 -7
- package/dist/types/dialog.d.ts +5 -6
- package/dist/types/drawer.d.ts +6 -7
- package/dist/types/dropdown.d.ts +4 -5
- package/dist/types/dual-nav.d.ts +6 -7
- package/dist/types/empty.d.ts +4 -5
- package/dist/types/expression-editor.d.ts +6 -7
- package/dist/types/file-picker.d.ts +4 -5
- package/dist/types/file-viewer.d.ts +6 -7
- package/dist/types/float-button.d.ts +5 -6
- package/dist/types/form-item.d.ts +3 -4
- package/dist/types/form.d.ts +4 -5
- package/dist/types/gantt-chart.d.ts +4 -5
- package/dist/types/grid-input.d.ts +4 -5
- package/dist/types/grid.d.ts +7 -8
- package/dist/types/group-input.d.ts +4 -5
- package/dist/types/group-nav.d.ts +3 -4
- package/dist/types/icon.d.ts +3 -4
- package/dist/types/image-cropper.d.ts +9 -10
- package/dist/types/index.d.ts +4 -4
- package/dist/types/input.d.ts +4 -5
- package/dist/types/layout.d.ts +4 -5
- package/dist/types/list.d.ts +4 -5
- package/dist/types/loading.d.ts +5 -6
- package/dist/types/message-confirm.d.ts +8 -9
- package/dist/types/message.d.ts +8 -9
- package/dist/types/multi-auto-complete.d.ts +4 -5
- package/dist/types/multi-select.d.ts +4 -5
- package/dist/types/multi-tree-select.d.ts +4 -5
- package/dist/types/nav.d.ts +5 -6
- package/dist/types/node-render.d.ts +2 -3
- package/dist/types/notification.d.ts +8 -9
- package/dist/types/number-input.d.ts +3 -4
- package/dist/types/number-range-input.d.ts +4 -5
- package/dist/types/number.d.ts +3 -4
- package/dist/types/paginator.d.ts +4 -5
- package/dist/types/palette.d.ts +7 -8
- package/dist/types/password-input.d.ts +4 -5
- package/dist/types/pop-confirm.d.ts +4 -5
- package/dist/types/pop.d.ts +4 -5
- package/dist/types/progress-nodes.d.ts +4 -5
- package/dist/types/progress.d.ts +4 -5
- package/dist/types/quick-batch-edit.d.ts +4 -5
- package/dist/types/radio-group.d.ts +4 -5
- package/dist/types/radio.d.ts +4 -5
- package/dist/types/rich-text-editor.d.ts +6 -7
- package/dist/types/scroll.d.ts +5 -6
- package/dist/types/segment.d.ts +5 -6
- package/dist/types/select.d.ts +4 -5
- package/dist/types/slider.d.ts +4 -5
- package/dist/types/steps.d.ts +5 -6
- package/dist/types/switch.d.ts +4 -5
- package/dist/types/table-editor.d.ts +30 -10
- package/dist/types/table.d.ts +23 -13
- package/dist/types/tabs.d.ts +13 -14
- package/dist/types/tag.d.ts +3 -4
- package/dist/types/text-editor.d.ts +5 -6
- package/dist/types/text.d.ts +4 -5
- package/dist/types/textarea.d.ts +4 -5
- package/dist/types/theme.d.ts +3 -4
- package/dist/types/tip.d.ts +11 -8
- package/dist/types/tree-select.d.ts +4 -5
- package/dist/types/tree.d.ts +6 -6
- package/dist/types/watermark.d.ts +4 -5
- package/package.json +8 -7
- package/src/components/batch-edit/__test__/batch-edit.test.ts +191 -4
- package/src/components/batch-edit/batch-edit-form.vue +17 -3
- package/src/components/batch-edit/batch-edit-list.vue +2 -1
- package/src/components/batch-edit/batch-edit.vue +22 -4
- package/src/components/batch-edit/style.scss +20 -0
- package/src/components/batch-edit/style.ts +1 -0
- package/src/components/batch-edit/use-dialog-effect.ts +9 -3
- package/src/components/batch-edit/use-edit-state.ts +32 -4
- package/src/components/batch-edit/use-handlers.ts +10 -0
- package/src/components/batch-edit/use-shortcut-key.ts +6 -2
- package/src/components/file-viewer/__test__/helper.test.ts +13 -0
- package/src/components/file-viewer/file-viewer.vue +23 -16
- package/src/components/file-viewer/helper.ts +2 -0
- package/src/components/file-viewer/previewers/ofd-previewer.vue +216 -0
- package/src/components/file-viewer/style.scss +33 -0
- package/src/components/table/__test__/column-style.test.ts +67 -0
- package/src/components/table/node/col.ts +30 -1
- package/src/components/table/table-cell.vue +7 -2
- package/src/components/table/table-foot.vue +2 -0
- package/src/components/table/table-head.tsx +1 -0
- package/src/components/table/table-row.tsx +2 -0
- package/src/components/table-editor/__test__/table-editor.test.ts +471 -0
- package/src/components/table-editor/style.scss +42 -4
- package/src/components/table-editor/table-editor.vue +265 -38
- package/src/components/tip/style.scss +15 -0
- package/src/components/tip/tip.vue +1 -1
- package/src/types/batch-edit.ts +6 -0
- package/src/types/file-viewer.ts +1 -1
- package/src/types/table-editor.ts +29 -7
- package/src/types/table.ts +12 -0
- package/src/types/tip.ts +6 -1
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { OfdParseError } from "./error.js";
|
|
2
|
+
import { parseNumberList } from "./ctm.js";
|
|
3
|
+
import { parseOfdColor } from "./color.js";
|
|
4
|
+
//#region ../ofd-core/dist/xml.js
|
|
5
|
+
function childElements(element) {
|
|
6
|
+
const out = [];
|
|
7
|
+
for (let i = 0; i < element.childNodes.length; i++) {
|
|
8
|
+
const node = element.childNodes[i];
|
|
9
|
+
if (node && node.nodeType === 1) out.push(node);
|
|
10
|
+
}
|
|
11
|
+
return out;
|
|
12
|
+
}
|
|
13
|
+
function localNameOf(element) {
|
|
14
|
+
if (element.localName) return element.localName;
|
|
15
|
+
const tag = element.nodeName;
|
|
16
|
+
return tag.includes(":") ? tag.slice(tag.indexOf(":") + 1) : tag;
|
|
17
|
+
}
|
|
18
|
+
function childrenNamed(element, name) {
|
|
19
|
+
return childElements(element).filter((child) => localNameOf(child) === name);
|
|
20
|
+
}
|
|
21
|
+
function firstChildNamed(element, name) {
|
|
22
|
+
return childrenNamed(element, name)[0] ?? null;
|
|
23
|
+
}
|
|
24
|
+
function childText(element, name) {
|
|
25
|
+
return firstChildNamed(element, name)?.textContent ?? null;
|
|
26
|
+
}
|
|
27
|
+
function normalizedText(value) {
|
|
28
|
+
const text = value?.trim();
|
|
29
|
+
return text ? text : null;
|
|
30
|
+
}
|
|
31
|
+
function parseXml(xml, source) {
|
|
32
|
+
let doc;
|
|
33
|
+
try {
|
|
34
|
+
doc = new DOMParser().parseFromString(xml, "application/xml");
|
|
35
|
+
} catch (cause) {
|
|
36
|
+
throw new OfdParseError("invalid-xml", `${source} 不是合法的 XML`, { cause });
|
|
37
|
+
}
|
|
38
|
+
if (doc.getElementsByTagName("parsererror").length > 0) throw new OfdParseError("invalid-xml", `${source} 不是合法的 XML`);
|
|
39
|
+
return doc;
|
|
40
|
+
}
|
|
41
|
+
function rootElementOf(doc, names, source) {
|
|
42
|
+
const expected = typeof names === "string" ? [names] : names;
|
|
43
|
+
const root = doc.documentElement;
|
|
44
|
+
const lowered = expected.map((name) => name.toLowerCase());
|
|
45
|
+
if (!root || !lowered.includes(localNameOf(root).toLowerCase())) throw new OfdParseError("invalid-structure", `${source} 根节点不是 ${expected.join(" / ")}`);
|
|
46
|
+
return root;
|
|
47
|
+
}
|
|
48
|
+
/** 解析 OFD.xml:每个 DocBody 产出一条入口,支持多文档容器 */
|
|
49
|
+
function parseOfdRoot(xml, source = "OFD.xml") {
|
|
50
|
+
return childrenNamed(rootElementOf(parseXml(xml, source), "Ofd", source), "DocBody").map((body) => {
|
|
51
|
+
const docRoot = normalizedText(childText(body, "DocRoot"));
|
|
52
|
+
if (!docRoot) throw new OfdParseError("invalid-structure", `${source} 中 DocBody 缺少 DocRoot`);
|
|
53
|
+
const info = firstChildNamed(body, "DocInfo");
|
|
54
|
+
return {
|
|
55
|
+
docRoot,
|
|
56
|
+
info: {
|
|
57
|
+
docId: info ? normalizedText(childText(info, "DocID")) : null,
|
|
58
|
+
title: info ? normalizedText(childText(info, "Title")) : null
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/** 解析 Document.xml:默认页尺寸、公共资源引用、模板页声明、页面树 */
|
|
64
|
+
function parseDocumentXml(xml, source) {
|
|
65
|
+
const root = rootElementOf(parseXml(xml, source), "Document", source);
|
|
66
|
+
const commonData = firstChildNamed(root, "CommonData");
|
|
67
|
+
const pages = firstChildNamed(root, "Pages");
|
|
68
|
+
return {
|
|
69
|
+
pageSize: commonData ? parsePageSize(commonData) ?? physicalBoxSize(commonData, "PageArea") : null,
|
|
70
|
+
resLocation: resDeclarationLocation(root, commonData, "DocumentRes"),
|
|
71
|
+
publicResLocation: resDeclarationLocation(root, commonData, "PublicRes"),
|
|
72
|
+
templates: commonData ? childrenNamed(commonData, "TemplatePage").map((template) => ({
|
|
73
|
+
id: template.getAttribute("ID"),
|
|
74
|
+
location: normalizedText(template.getAttribute("BaseLoc") ?? template.textContent)
|
|
75
|
+
})) : [],
|
|
76
|
+
pageLocations: pages ? childrenNamed(pages, "Page").map((page) => normalizedText(page.getAttribute("BaseLoc"))).filter((value) => value !== null) : []
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 资源声明路径兼容两种产出形态:声明元素挂在 Document 根或 CommonData 下,
|
|
81
|
+
* 路径写在 ResLoc 属性或元素文本中(WPS / 数科 / 数电发票产出均为文本形态)。
|
|
82
|
+
*/
|
|
83
|
+
function resDeclarationLocation(root, commonData, name) {
|
|
84
|
+
const node = firstChildNamed(root, name) ?? (commonData && firstChildNamed(commonData, name));
|
|
85
|
+
if (!node) return null;
|
|
86
|
+
return normalizedText(node.getAttribute("ResLoc")) ?? normalizedText(node.textContent);
|
|
87
|
+
}
|
|
88
|
+
/** 物理盒尺寸兜底("x y w h" 取宽高);主流生成器以 PhysicalBox 代替 PageWidth/PageHeight */
|
|
89
|
+
function physicalBoxSize(scope, wrapper) {
|
|
90
|
+
const container = firstChildNamed(scope, wrapper);
|
|
91
|
+
const box = container ? firstChildNamed(container, "PhysicalBox") : null;
|
|
92
|
+
const numbers = parseNumberList(box?.textContent ?? null);
|
|
93
|
+
return numbers.length === 4 ? {
|
|
94
|
+
width: numbers[2],
|
|
95
|
+
height: numbers[3]
|
|
96
|
+
} : null;
|
|
97
|
+
}
|
|
98
|
+
/** 解析 DocumentRes.xml / PublicRes.xml:字体、多媒体资源与绘制参数声明 */
|
|
99
|
+
function parseDocumentRes(xml, source) {
|
|
100
|
+
const root = rootElementOf(parseXml(xml, source), "Res", source);
|
|
101
|
+
const baseLoc = normalizedText(root.getAttribute("BaseLoc"));
|
|
102
|
+
const fonts = [];
|
|
103
|
+
const medias = [];
|
|
104
|
+
const drawParams = [];
|
|
105
|
+
for (const group of childrenNamed(root, "Fonts")) for (const font of childrenNamed(group, "Font")) {
|
|
106
|
+
const id = font.getAttribute("ID");
|
|
107
|
+
if (id !== null) fonts.push({
|
|
108
|
+
id,
|
|
109
|
+
fontName: normalizedText(font.getAttribute("FontName")),
|
|
110
|
+
fontFile: fontFileLocation(baseLoc, font)
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
for (const group of childrenNamed(root, "MultiMedias")) for (const media of childrenNamed(group, "MultiMedia")) {
|
|
114
|
+
const id = media.getAttribute("ID");
|
|
115
|
+
if (id !== null) medias.push({
|
|
116
|
+
id,
|
|
117
|
+
type: media.getAttribute("Type"),
|
|
118
|
+
location: normalizedText(media.getAttribute("ResLoc")) ?? mediaFileLocation(baseLoc, media)
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
for (const group of childrenNamed(root, "DrawParams")) for (const param of childrenNamed(group, "DrawParam")) {
|
|
122
|
+
const id = param.getAttribute("ID");
|
|
123
|
+
if (id !== null) drawParams.push({
|
|
124
|
+
id,
|
|
125
|
+
lineWidth: parseNumber(param.getAttribute("LineWidth")),
|
|
126
|
+
relative: normalizedText(param.getAttribute("Relative")),
|
|
127
|
+
fillColor: declaredColor(param, "FillColor"),
|
|
128
|
+
strokeColor: declaredColor(param, "StrokeColor")
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
fonts,
|
|
133
|
+
medias,
|
|
134
|
+
drawParams
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/** DrawParam 子元素颜色:<FillColor Value="128 0 0"/> 按 Value 属性解析 */
|
|
138
|
+
function declaredColor(param, name) {
|
|
139
|
+
return parseOfdColor(firstChildNamed(param, name)?.getAttribute("Value") ?? null);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 字体文件位置:FontFile 兼容属性与子元素两种声明(新版数电发票实证为子元素),
|
|
143
|
+
* 路径相对资源声明根的 BaseLoc 解析,未声明 BaseLoc 时相对文档根。
|
|
144
|
+
*/
|
|
145
|
+
function fontFileLocation(baseLoc, font) {
|
|
146
|
+
const file = normalizedText(font.getAttribute("FontFile")) ?? normalizedText(childText(font, "FontFile"));
|
|
147
|
+
return file === null ? null : joinZipPath(baseLoc ?? "", file);
|
|
148
|
+
}
|
|
149
|
+
/** 媒体位置兜底:MediaFile 子元素声明文件名,相对资源声明根的 BaseLoc 解析 */
|
|
150
|
+
function mediaFileLocation(baseLoc, media) {
|
|
151
|
+
const file = normalizedText(firstChildNamed(media, "MediaFile")?.textContent ?? null);
|
|
152
|
+
return file === null ? null : joinZipPath(baseLoc ?? "", file);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* 拼接并规范化容器内路径:去空段与 './',统一 '/' 分隔(页面定位、图片资源定位共用)。
|
|
156
|
+
* 段以 '/' 开头时按容器绝对路径处理(个别产出在相对文档根的位置写绝对路径)。
|
|
157
|
+
*/
|
|
158
|
+
function joinZipPath(...segments) {
|
|
159
|
+
const parts = [];
|
|
160
|
+
for (const segment of segments) {
|
|
161
|
+
if (segment.startsWith("/")) parts.length = 0;
|
|
162
|
+
for (const piece of segment.split("/")) if (piece !== "" && piece !== ".") parts.push(piece);
|
|
163
|
+
}
|
|
164
|
+
return parts.join("/");
|
|
165
|
+
}
|
|
166
|
+
/** 解析 Page.xml:页面尺寸覆盖与图层声明 */
|
|
167
|
+
function parsePageXml(xml, source) {
|
|
168
|
+
const root = rootElementOf(parseXml(xml, source), "Page", source);
|
|
169
|
+
const commonData = firstChildNamed(root, "CommonData");
|
|
170
|
+
const layerParent = firstChildNamed(root, "Content") ?? root;
|
|
171
|
+
return {
|
|
172
|
+
size: (commonData ? parsePageSize(commonData) ?? physicalBoxSize(commonData, "PageArea") : null) ?? physicalBoxSize(root, "Area"),
|
|
173
|
+
layers: childrenNamed(layerParent, "Layer").map((layer) => ({
|
|
174
|
+
id: layer.getAttribute("ID"),
|
|
175
|
+
type: parseLayerType(layer.getAttribute("Type"))
|
|
176
|
+
}))
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function parsePageSize(commonData) {
|
|
180
|
+
const width = parseNumber(childText(commonData, "PageWidth"));
|
|
181
|
+
const height = parseNumber(childText(commonData, "PageHeight"));
|
|
182
|
+
return width !== null && height !== null ? {
|
|
183
|
+
width,
|
|
184
|
+
height
|
|
185
|
+
} : null;
|
|
186
|
+
}
|
|
187
|
+
function parseNumber(value) {
|
|
188
|
+
if (value === null || value.trim() === "") return null;
|
|
189
|
+
const parsed = Number(value);
|
|
190
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
191
|
+
}
|
|
192
|
+
function parseLayerType(value) {
|
|
193
|
+
const lowered = value?.toLowerCase();
|
|
194
|
+
return lowered === "background" || lowered === "body" || lowered === "foreground" || lowered === "annotation" ? lowered : null;
|
|
195
|
+
}
|
|
196
|
+
//#endregion
|
|
197
|
+
export { childElements, childrenNamed, firstChildNamed, joinZipPath, localNameOf, parseDocumentRes, parseDocumentXml, parseLayerType, parseOfdRoot, parsePageXml, parseXml, rootElementOf };
|
|
198
|
+
|
|
199
|
+
//# sourceMappingURL=xml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml.js","names":[],"sources":["../../../../../ofd-core/dist/xml.js"],"sourcesContent":["import { OfdParseError } from \"./error.js\";\nimport { parseNumberList } from \"./ctm.js\";\nimport { parseOfdColor } from \"./color.js\";\n//#region src/xml.ts\nfunction childElements(element) {\n\tconst out = [];\n\tfor (let i = 0; i < element.childNodes.length; i++) {\n\t\tconst node = element.childNodes[i];\n\t\tif (node && node.nodeType === 1) out.push(node);\n\t}\n\treturn out;\n}\nfunction localNameOf(element) {\n\tif (element.localName) return element.localName;\n\tconst tag = element.nodeName;\n\treturn tag.includes(\":\") ? tag.slice(tag.indexOf(\":\") + 1) : tag;\n}\nfunction childrenNamed(element, name) {\n\treturn childElements(element).filter((child) => localNameOf(child) === name);\n}\nfunction firstChildNamed(element, name) {\n\treturn childrenNamed(element, name)[0] ?? null;\n}\nfunction childText(element, name) {\n\treturn firstChildNamed(element, name)?.textContent ?? null;\n}\nfunction normalizedText(value) {\n\tconst text = value?.trim();\n\treturn text ? text : null;\n}\nfunction parseXml(xml, source) {\n\tlet doc;\n\ttry {\n\t\tdoc = new DOMParser().parseFromString(xml, \"application/xml\");\n\t} catch (cause) {\n\t\tthrow new OfdParseError(\"invalid-xml\", `${source} 不是合法的 XML`, { cause });\n\t}\n\tif (doc.getElementsByTagName(\"parsererror\").length > 0) throw new OfdParseError(\"invalid-xml\", `${source} 不是合法的 XML`);\n\treturn doc;\n}\nfunction rootElementOf(doc, names, source) {\n\tconst expected = typeof names === \"string\" ? [names] : names;\n\tconst root = doc.documentElement;\n\tconst lowered = expected.map((name) => name.toLowerCase());\n\tif (!root || !lowered.includes(localNameOf(root).toLowerCase())) throw new OfdParseError(\"invalid-structure\", `${source} 根节点不是 ${expected.join(\" / \")}`);\n\treturn root;\n}\n/** 解析 OFD.xml:每个 DocBody 产出一条入口,支持多文档容器 */\nfunction parseOfdRoot(xml, source = \"OFD.xml\") {\n\treturn childrenNamed(rootElementOf(parseXml(xml, source), \"Ofd\", source), \"DocBody\").map((body) => {\n\t\tconst docRoot = normalizedText(childText(body, \"DocRoot\"));\n\t\tif (!docRoot) throw new OfdParseError(\"invalid-structure\", `${source} 中 DocBody 缺少 DocRoot`);\n\t\tconst info = firstChildNamed(body, \"DocInfo\");\n\t\treturn {\n\t\t\tdocRoot,\n\t\t\tinfo: {\n\t\t\t\tdocId: info ? normalizedText(childText(info, \"DocID\")) : null,\n\t\t\t\ttitle: info ? normalizedText(childText(info, \"Title\")) : null\n\t\t\t}\n\t\t};\n\t});\n}\n/** 解析 Document.xml:默认页尺寸、公共资源引用、模板页声明、页面树 */\nfunction parseDocumentXml(xml, source) {\n\tconst root = rootElementOf(parseXml(xml, source), \"Document\", source);\n\tconst commonData = firstChildNamed(root, \"CommonData\");\n\tconst pages = firstChildNamed(root, \"Pages\");\n\treturn {\n\t\tpageSize: commonData ? parsePageSize(commonData) ?? physicalBoxSize(commonData, \"PageArea\") : null,\n\t\tresLocation: resDeclarationLocation(root, commonData, \"DocumentRes\"),\n\t\tpublicResLocation: resDeclarationLocation(root, commonData, \"PublicRes\"),\n\t\ttemplates: commonData ? childrenNamed(commonData, \"TemplatePage\").map((template) => ({\n\t\t\tid: template.getAttribute(\"ID\"),\n\t\t\tlocation: normalizedText(template.getAttribute(\"BaseLoc\") ?? template.textContent)\n\t\t})) : [],\n\t\tpageLocations: pages ? childrenNamed(pages, \"Page\").map((page) => normalizedText(page.getAttribute(\"BaseLoc\"))).filter((value) => value !== null) : []\n\t};\n}\n/**\n* 资源声明路径兼容两种产出形态:声明元素挂在 Document 根或 CommonData 下,\n* 路径写在 ResLoc 属性或元素文本中(WPS / 数科 / 数电发票产出均为文本形态)。\n*/\nfunction resDeclarationLocation(root, commonData, name) {\n\tconst node = firstChildNamed(root, name) ?? (commonData && firstChildNamed(commonData, name));\n\tif (!node) return null;\n\treturn normalizedText(node.getAttribute(\"ResLoc\")) ?? normalizedText(node.textContent);\n}\n/** 物理盒尺寸兜底(\"x y w h\" 取宽高);主流生成器以 PhysicalBox 代替 PageWidth/PageHeight */\nfunction physicalBoxSize(scope, wrapper) {\n\tconst container = firstChildNamed(scope, wrapper);\n\tconst box = container ? firstChildNamed(container, \"PhysicalBox\") : null;\n\tconst numbers = parseNumberList(box?.textContent ?? null);\n\treturn numbers.length === 4 ? {\n\t\twidth: numbers[2],\n\t\theight: numbers[3]\n\t} : null;\n}\n/** 解析 DocumentRes.xml / PublicRes.xml:字体、多媒体资源与绘制参数声明 */\nfunction parseDocumentRes(xml, source) {\n\tconst root = rootElementOf(parseXml(xml, source), \"Res\", source);\n\tconst baseLoc = normalizedText(root.getAttribute(\"BaseLoc\"));\n\tconst fonts = [];\n\tconst medias = [];\n\tconst drawParams = [];\n\tfor (const group of childrenNamed(root, \"Fonts\")) for (const font of childrenNamed(group, \"Font\")) {\n\t\tconst id = font.getAttribute(\"ID\");\n\t\tif (id !== null) fonts.push({\n\t\t\tid,\n\t\t\tfontName: normalizedText(font.getAttribute(\"FontName\")),\n\t\t\tfontFile: fontFileLocation(baseLoc, font)\n\t\t});\n\t}\n\tfor (const group of childrenNamed(root, \"MultiMedias\")) for (const media of childrenNamed(group, \"MultiMedia\")) {\n\t\tconst id = media.getAttribute(\"ID\");\n\t\tif (id !== null) medias.push({\n\t\t\tid,\n\t\t\ttype: media.getAttribute(\"Type\"),\n\t\t\tlocation: normalizedText(media.getAttribute(\"ResLoc\")) ?? mediaFileLocation(baseLoc, media)\n\t\t});\n\t}\n\tfor (const group of childrenNamed(root, \"DrawParams\")) for (const param of childrenNamed(group, \"DrawParam\")) {\n\t\tconst id = param.getAttribute(\"ID\");\n\t\tif (id !== null) drawParams.push({\n\t\t\tid,\n\t\t\tlineWidth: parseNumber(param.getAttribute(\"LineWidth\")),\n\t\t\trelative: normalizedText(param.getAttribute(\"Relative\")),\n\t\t\tfillColor: declaredColor(param, \"FillColor\"),\n\t\t\tstrokeColor: declaredColor(param, \"StrokeColor\")\n\t\t});\n\t}\n\treturn {\n\t\tfonts,\n\t\tmedias,\n\t\tdrawParams\n\t};\n}\n/** DrawParam 子元素颜色:<FillColor Value=\"128 0 0\"/> 按 Value 属性解析 */\nfunction declaredColor(param, name) {\n\treturn parseOfdColor(firstChildNamed(param, name)?.getAttribute(\"Value\") ?? null);\n}\n/**\n* 字体文件位置:FontFile 兼容属性与子元素两种声明(新版数电发票实证为子元素),\n* 路径相对资源声明根的 BaseLoc 解析,未声明 BaseLoc 时相对文档根。\n*/\nfunction fontFileLocation(baseLoc, font) {\n\tconst file = normalizedText(font.getAttribute(\"FontFile\")) ?? normalizedText(childText(font, \"FontFile\"));\n\treturn file === null ? null : joinZipPath(baseLoc ?? \"\", file);\n}\n/** 媒体位置兜底:MediaFile 子元素声明文件名,相对资源声明根的 BaseLoc 解析 */\nfunction mediaFileLocation(baseLoc, media) {\n\tconst file = normalizedText(firstChildNamed(media, \"MediaFile\")?.textContent ?? null);\n\treturn file === null ? null : joinZipPath(baseLoc ?? \"\", file);\n}\n/**\n* 拼接并规范化容器内路径:去空段与 './',统一 '/' 分隔(页面定位、图片资源定位共用)。\n* 段以 '/' 开头时按容器绝对路径处理(个别产出在相对文档根的位置写绝对路径)。\n*/\nfunction joinZipPath(...segments) {\n\tconst parts = [];\n\tfor (const segment of segments) {\n\t\tif (segment.startsWith(\"/\")) parts.length = 0;\n\t\tfor (const piece of segment.split(\"/\")) if (piece !== \"\" && piece !== \".\") parts.push(piece);\n\t}\n\treturn parts.join(\"/\");\n}\n/** 解析 Page.xml:页面尺寸覆盖与图层声明 */\nfunction parsePageXml(xml, source) {\n\tconst root = rootElementOf(parseXml(xml, source), \"Page\", source);\n\tconst commonData = firstChildNamed(root, \"CommonData\");\n\tconst layerParent = firstChildNamed(root, \"Content\") ?? root;\n\treturn {\n\t\tsize: (commonData ? parsePageSize(commonData) ?? physicalBoxSize(commonData, \"PageArea\") : null) ?? physicalBoxSize(root, \"Area\"),\n\t\tlayers: childrenNamed(layerParent, \"Layer\").map((layer) => ({\n\t\t\tid: layer.getAttribute(\"ID\"),\n\t\t\ttype: parseLayerType(layer.getAttribute(\"Type\"))\n\t\t}))\n\t};\n}\nfunction parsePageSize(commonData) {\n\tconst width = parseNumber(childText(commonData, \"PageWidth\"));\n\tconst height = parseNumber(childText(commonData, \"PageHeight\"));\n\treturn width !== null && height !== null ? {\n\t\twidth,\n\t\theight\n\t} : null;\n}\nfunction parseNumber(value) {\n\tif (value === null || value.trim() === \"\") return null;\n\tconst parsed = Number(value);\n\treturn Number.isFinite(parsed) ? parsed : null;\n}\nfunction parseLayerType(value) {\n\tconst lowered = value?.toLowerCase();\n\treturn lowered === \"background\" || lowered === \"body\" || lowered === \"foreground\" || lowered === \"annotation\" ? lowered : null;\n}\n//#endregion\nexport { childElements, childrenNamed, firstChildNamed, joinZipPath, localNameOf, parseDocumentRes, parseDocumentXml, parseLayerType, parseOfdRoot, parsePageXml, parseXml, rootElementOf };\n\n//# sourceMappingURL=xml.js.map"],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { OfdParseError } from "./error.js";
|
|
2
|
+
//#region ../ofd-core/dist/zip.js
|
|
3
|
+
const EOCD_SIGNATURE = 101010256;
|
|
4
|
+
const CEN_SIGNATURE = 33639248;
|
|
5
|
+
const LOC_SIGNATURE = 67324752;
|
|
6
|
+
const EOCD_LENGTH = 22;
|
|
7
|
+
const CEN_HEADER_LENGTH = 46;
|
|
8
|
+
const LOC_HEADER_LENGTH = 30;
|
|
9
|
+
/** EOCD 注释区最大长度,找 EOCD 时最多向前扫这么多字节 */
|
|
10
|
+
const EOCD_COMMENT_MAX = 65535;
|
|
11
|
+
const STORED_METHOD = 0;
|
|
12
|
+
const DEFLATE_METHOD = 8;
|
|
13
|
+
/** 解析 ZIP 结构(EOCD / 中央目录);条目数据在 read 时才解压 */
|
|
14
|
+
function openOfdZip(data) {
|
|
15
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
16
|
+
const eocdOffset = findEocdOffset(data);
|
|
17
|
+
const records = parseCentralDirectory(data, view, eocdOffset, view.getUint16(eocdOffset + 10, true));
|
|
18
|
+
const byName = new Map(records.map((record) => [record.name.toLowerCase(), record]));
|
|
19
|
+
return {
|
|
20
|
+
entries: records,
|
|
21
|
+
has: (name) => byName.has(name.toLowerCase()),
|
|
22
|
+
read: (name) => readEntry(data, view, byName.get(name.toLowerCase()), name),
|
|
23
|
+
text: async (name) => new TextDecoder().decode(await readEntry(data, view, byName.get(name.toLowerCase()), name))
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function findEocdOffset(data) {
|
|
27
|
+
const minStart = Math.max(0, data.length - EOCD_LENGTH - EOCD_COMMENT_MAX);
|
|
28
|
+
for (let offset = data.length - EOCD_LENGTH; offset >= minStart; offset--) if (readU32(data, offset) === EOCD_SIGNATURE) return offset;
|
|
29
|
+
throw new OfdParseError("not-zip", "未找到 ZIP End of Central Directory,输入不是合法的 ZIP 容器");
|
|
30
|
+
}
|
|
31
|
+
function parseCentralDirectory(data, view, eocdOffset, entryCount) {
|
|
32
|
+
let offset = view.getUint32(eocdOffset + 16, true);
|
|
33
|
+
const records = [];
|
|
34
|
+
for (let index = 0; index < entryCount; index++) {
|
|
35
|
+
if (offset + CEN_HEADER_LENGTH > data.length) throw new OfdParseError("truncated", `中央目录第 ${index} 个条目越界,数据被截断`);
|
|
36
|
+
if (view.getUint32(offset, true) !== CEN_SIGNATURE) throw new OfdParseError("bad-central-directory", `中央目录第 ${index} 个条目签名不合法`);
|
|
37
|
+
const method = view.getUint16(offset + 10, true);
|
|
38
|
+
const compressedSize = view.getUint32(offset + 20, true);
|
|
39
|
+
const size = view.getUint32(offset + 24, true);
|
|
40
|
+
const nameLength = view.getUint16(offset + 28, true);
|
|
41
|
+
const extraLength = view.getUint16(offset + 30, true);
|
|
42
|
+
const commentLength = view.getUint16(offset + 32, true);
|
|
43
|
+
const localHeaderOffset = view.getUint32(offset + 42, true);
|
|
44
|
+
const recordLength = CEN_HEADER_LENGTH + nameLength + extraLength + commentLength;
|
|
45
|
+
if (offset + recordLength > data.length) throw new OfdParseError("truncated", `中央目录第 ${index} 个条目不完整,数据被截断`);
|
|
46
|
+
const name = new TextDecoder().decode(data.subarray(offset + CEN_HEADER_LENGTH, offset + CEN_HEADER_LENGTH + nameLength));
|
|
47
|
+
records.push({
|
|
48
|
+
name,
|
|
49
|
+
method,
|
|
50
|
+
compressedSize,
|
|
51
|
+
size,
|
|
52
|
+
localHeaderOffset
|
|
53
|
+
});
|
|
54
|
+
offset += recordLength;
|
|
55
|
+
}
|
|
56
|
+
return records;
|
|
57
|
+
}
|
|
58
|
+
function readEntry(data, view, record, name) {
|
|
59
|
+
if (!record) throw new OfdParseError("missing-entry", `容器中不存在条目 ${name}`);
|
|
60
|
+
const start = entryDataStart(data, view, record);
|
|
61
|
+
const compressed = data.subarray(start, start + record.compressedSize);
|
|
62
|
+
if (record.method === STORED_METHOD) return Promise.resolve(compressed);
|
|
63
|
+
if (record.method === DEFLATE_METHOD) return inflateRaw(compressed, name);
|
|
64
|
+
return Promise.reject(new OfdParseError("unsupported-compression", `条目 ${name} 使用不支持的压缩方法 ${record.method}`));
|
|
65
|
+
}
|
|
66
|
+
/** 定位条目数据起点:跳过本地文件头(长度以本地头声明的为准) */
|
|
67
|
+
function entryDataStart(data, view, record) {
|
|
68
|
+
const offset = record.localHeaderOffset;
|
|
69
|
+
if (offset + LOC_HEADER_LENGTH > data.length) throw new OfdParseError("truncated", `条目 ${record.name} 的本地文件头越界`);
|
|
70
|
+
if (view.getUint32(offset, true) !== LOC_SIGNATURE) throw new OfdParseError("bad-local-header", `条目 ${record.name} 的本地文件头签名不合法`);
|
|
71
|
+
const start = offset + LOC_HEADER_LENGTH + view.getUint16(offset + 26, true) + view.getUint16(offset + 28, true);
|
|
72
|
+
if (start + record.compressedSize > data.length) throw new OfdParseError("truncated", `条目 ${record.name} 的数据被截断`);
|
|
73
|
+
return start;
|
|
74
|
+
}
|
|
75
|
+
/** 用原生 DecompressionStream 解压 deflate-raw 数据 */
|
|
76
|
+
async function inflateRaw(compressed, name) {
|
|
77
|
+
try {
|
|
78
|
+
const stream = new ReadableStream({ start(controller) {
|
|
79
|
+
controller.enqueue(compressed);
|
|
80
|
+
controller.close();
|
|
81
|
+
} }).pipeThrough(new DecompressionStream("deflate-raw"));
|
|
82
|
+
return new Uint8Array(await new Response(stream).arrayBuffer());
|
|
83
|
+
} catch (cause) {
|
|
84
|
+
throw new OfdParseError("truncated", `条目 ${name} 的 deflate 数据无法解压`, { cause });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function readU32(data, offset) {
|
|
88
|
+
return (data[offset + 3] << 24 | data[offset + 2] << 16 | data[offset + 1] << 8 | data[offset]) >>> 0;
|
|
89
|
+
}
|
|
90
|
+
//#endregion
|
|
91
|
+
export { openOfdZip };
|
|
92
|
+
|
|
93
|
+
//# sourceMappingURL=zip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip.js","names":[],"sources":["../../../../../ofd-core/dist/zip.js"],"sourcesContent":["import { OfdParseError } from \"./error.js\";\n//#region src/zip.ts\nconst EOCD_SIGNATURE = 101010256;\nconst CEN_SIGNATURE = 33639248;\nconst LOC_SIGNATURE = 67324752;\nconst EOCD_LENGTH = 22;\nconst CEN_HEADER_LENGTH = 46;\nconst LOC_HEADER_LENGTH = 30;\n/** EOCD 注释区最大长度,找 EOCD 时最多向前扫这么多字节 */\nconst EOCD_COMMENT_MAX = 65535;\nconst STORED_METHOD = 0;\nconst DEFLATE_METHOD = 8;\n/** 解析 ZIP 结构(EOCD / 中央目录);条目数据在 read 时才解压 */\nfunction openOfdZip(data) {\n\tconst view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\tconst eocdOffset = findEocdOffset(data);\n\tconst records = parseCentralDirectory(data, view, eocdOffset, view.getUint16(eocdOffset + 10, true));\n\tconst byName = new Map(records.map((record) => [record.name.toLowerCase(), record]));\n\treturn {\n\t\tentries: records,\n\t\thas: (name) => byName.has(name.toLowerCase()),\n\t\tread: (name) => readEntry(data, view, byName.get(name.toLowerCase()), name),\n\t\ttext: async (name) => new TextDecoder().decode(await readEntry(data, view, byName.get(name.toLowerCase()), name))\n\t};\n}\nfunction findEocdOffset(data) {\n\tconst minStart = Math.max(0, data.length - EOCD_LENGTH - EOCD_COMMENT_MAX);\n\tfor (let offset = data.length - EOCD_LENGTH; offset >= minStart; offset--) if (readU32(data, offset) === EOCD_SIGNATURE) return offset;\n\tthrow new OfdParseError(\"not-zip\", \"未找到 ZIP End of Central Directory,输入不是合法的 ZIP 容器\");\n}\nfunction parseCentralDirectory(data, view, eocdOffset, entryCount) {\n\tlet offset = view.getUint32(eocdOffset + 16, true);\n\tconst records = [];\n\tfor (let index = 0; index < entryCount; index++) {\n\t\tif (offset + CEN_HEADER_LENGTH > data.length) throw new OfdParseError(\"truncated\", `中央目录第 ${index} 个条目越界,数据被截断`);\n\t\tif (view.getUint32(offset, true) !== CEN_SIGNATURE) throw new OfdParseError(\"bad-central-directory\", `中央目录第 ${index} 个条目签名不合法`);\n\t\tconst method = view.getUint16(offset + 10, true);\n\t\tconst compressedSize = view.getUint32(offset + 20, true);\n\t\tconst size = view.getUint32(offset + 24, true);\n\t\tconst nameLength = view.getUint16(offset + 28, true);\n\t\tconst extraLength = view.getUint16(offset + 30, true);\n\t\tconst commentLength = view.getUint16(offset + 32, true);\n\t\tconst localHeaderOffset = view.getUint32(offset + 42, true);\n\t\tconst recordLength = CEN_HEADER_LENGTH + nameLength + extraLength + commentLength;\n\t\tif (offset + recordLength > data.length) throw new OfdParseError(\"truncated\", `中央目录第 ${index} 个条目不完整,数据被截断`);\n\t\tconst name = new TextDecoder().decode(data.subarray(offset + CEN_HEADER_LENGTH, offset + CEN_HEADER_LENGTH + nameLength));\n\t\trecords.push({\n\t\t\tname,\n\t\t\tmethod,\n\t\t\tcompressedSize,\n\t\t\tsize,\n\t\t\tlocalHeaderOffset\n\t\t});\n\t\toffset += recordLength;\n\t}\n\treturn records;\n}\nfunction readEntry(data, view, record, name) {\n\tif (!record) throw new OfdParseError(\"missing-entry\", `容器中不存在条目 ${name}`);\n\tconst start = entryDataStart(data, view, record);\n\tconst compressed = data.subarray(start, start + record.compressedSize);\n\tif (record.method === STORED_METHOD) return Promise.resolve(compressed);\n\tif (record.method === DEFLATE_METHOD) return inflateRaw(compressed, name);\n\treturn Promise.reject(new OfdParseError(\"unsupported-compression\", `条目 ${name} 使用不支持的压缩方法 ${record.method}`));\n}\n/** 定位条目数据起点:跳过本地文件头(长度以本地头声明的为准) */\nfunction entryDataStart(data, view, record) {\n\tconst offset = record.localHeaderOffset;\n\tif (offset + LOC_HEADER_LENGTH > data.length) throw new OfdParseError(\"truncated\", `条目 ${record.name} 的本地文件头越界`);\n\tif (view.getUint32(offset, true) !== LOC_SIGNATURE) throw new OfdParseError(\"bad-local-header\", `条目 ${record.name} 的本地文件头签名不合法`);\n\tconst start = offset + LOC_HEADER_LENGTH + view.getUint16(offset + 26, true) + view.getUint16(offset + 28, true);\n\tif (start + record.compressedSize > data.length) throw new OfdParseError(\"truncated\", `条目 ${record.name} 的数据被截断`);\n\treturn start;\n}\n/** 用原生 DecompressionStream 解压 deflate-raw 数据 */\nasync function inflateRaw(compressed, name) {\n\ttry {\n\t\tconst stream = new ReadableStream({ start(controller) {\n\t\t\tcontroller.enqueue(compressed);\n\t\t\tcontroller.close();\n\t\t} }).pipeThrough(new DecompressionStream(\"deflate-raw\"));\n\t\treturn new Uint8Array(await new Response(stream).arrayBuffer());\n\t} catch (cause) {\n\t\tthrow new OfdParseError(\"truncated\", `条目 ${name} 的 deflate 数据无法解压`, { cause });\n\t}\n}\nfunction readU32(data, offset) {\n\treturn (data[offset + 3] << 24 | data[offset + 2] << 16 | data[offset + 1] << 8 | data[offset]) >>> 0;\n}\n//#endregion\nexport { openOfdZip };\n\n//# sourceMappingURL=zip.js.map"],"mappings":";;AAEA,MAAM,iBAAiB;AACvB,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM,cAAc;AACpB,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;;AAE1B,MAAM,mBAAmB;AACzB,MAAM,gBAAgB;AACtB,MAAM,iBAAiB;;AAEvB,SAAS,WAAW,MAAM;CACzB,MAAM,OAAO,IAAI,SAAS,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;CACvE,MAAM,aAAa,eAAe,IAAI;CACtC,MAAM,UAAU,sBAAsB,MAAM,MAAM,YAAY,KAAK,UAAU,aAAa,IAAI,IAAI,CAAC;CACnG,MAAM,SAAS,IAAI,IAAI,QAAQ,KAAK,WAAW,CAAC,OAAO,KAAK,YAAY,GAAG,MAAM,CAAC,CAAC;CACnF,OAAO;EACN,SAAS;EACT,MAAM,SAAS,OAAO,IAAI,KAAK,YAAY,CAAC;EAC5C,OAAO,SAAS,UAAU,MAAM,MAAM,OAAO,IAAI,KAAK,YAAY,CAAC,GAAG,IAAI;EAC1E,MAAM,OAAO,SAAS,IAAI,YAAY,CAAC,CAAC,OAAO,MAAM,UAAU,MAAM,MAAM,OAAO,IAAI,KAAK,YAAY,CAAC,GAAG,IAAI,CAAC;CACjH;AACD;AACA,SAAS,eAAe,MAAM;CAC7B,MAAM,WAAW,KAAK,IAAI,GAAG,KAAK,SAAS,cAAc,gBAAgB;CACzE,KAAK,IAAI,SAAS,KAAK,SAAS,aAAa,UAAU,UAAU,UAAU,IAAI,QAAQ,MAAM,MAAM,MAAM,gBAAgB,OAAO;CAChI,MAAM,IAAI,cAAc,WAAW,iDAAiD;AACrF;AACA,SAAS,sBAAsB,MAAM,MAAM,YAAY,YAAY;CAClE,IAAI,SAAS,KAAK,UAAU,aAAa,IAAI,IAAI;CACjD,MAAM,UAAU,CAAC;CACjB,KAAK,IAAI,QAAQ,GAAG,QAAQ,YAAY,SAAS;EAChD,IAAI,SAAS,oBAAoB,KAAK,QAAQ,MAAM,IAAI,cAAc,aAAa,SAAS,MAAM,aAAa;EAC/G,IAAI,KAAK,UAAU,QAAQ,IAAI,MAAM,eAAe,MAAM,IAAI,cAAc,yBAAyB,SAAS,MAAM,UAAU;EAC9H,MAAM,SAAS,KAAK,UAAU,SAAS,IAAI,IAAI;EAC/C,MAAM,iBAAiB,KAAK,UAAU,SAAS,IAAI,IAAI;EACvD,MAAM,OAAO,KAAK,UAAU,SAAS,IAAI,IAAI;EAC7C,MAAM,aAAa,KAAK,UAAU,SAAS,IAAI,IAAI;EACnD,MAAM,cAAc,KAAK,UAAU,SAAS,IAAI,IAAI;EACpD,MAAM,gBAAgB,KAAK,UAAU,SAAS,IAAI,IAAI;EACtD,MAAM,oBAAoB,KAAK,UAAU,SAAS,IAAI,IAAI;EAC1D,MAAM,eAAe,oBAAoB,aAAa,cAAc;EACpE,IAAI,SAAS,eAAe,KAAK,QAAQ,MAAM,IAAI,cAAc,aAAa,SAAS,MAAM,cAAc;EAC3G,MAAM,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,SAAS,SAAS,mBAAmB,SAAS,oBAAoB,UAAU,CAAC;EACxH,QAAQ,KAAK;GACZ;GACA;GACA;GACA;GACA;EACD,CAAC;EACD,UAAU;CACX;CACA,OAAO;AACR;AACA,SAAS,UAAU,MAAM,MAAM,QAAQ,MAAM;CAC5C,IAAI,CAAC,QAAQ,MAAM,IAAI,cAAc,iBAAiB,YAAY,MAAM;CACxE,MAAM,QAAQ,eAAe,MAAM,MAAM,MAAM;CAC/C,MAAM,aAAa,KAAK,SAAS,OAAO,QAAQ,OAAO,cAAc;CACrE,IAAI,OAAO,WAAW,eAAe,OAAO,QAAQ,QAAQ,UAAU;CACtE,IAAI,OAAO,WAAW,gBAAgB,OAAO,WAAW,YAAY,IAAI;CACxE,OAAO,QAAQ,OAAO,IAAI,cAAc,2BAA2B,MAAM,KAAK,cAAc,OAAO,QAAQ,CAAC;AAC7G;;AAEA,SAAS,eAAe,MAAM,MAAM,QAAQ;CAC3C,MAAM,SAAS,OAAO;CACtB,IAAI,SAAS,oBAAoB,KAAK,QAAQ,MAAM,IAAI,cAAc,aAAa,MAAM,OAAO,KAAK,UAAU;CAC/G,IAAI,KAAK,UAAU,QAAQ,IAAI,MAAM,eAAe,MAAM,IAAI,cAAc,oBAAoB,MAAM,OAAO,KAAK,aAAa;CAC/H,MAAM,QAAQ,SAAS,oBAAoB,KAAK,UAAU,SAAS,IAAI,IAAI,IAAI,KAAK,UAAU,SAAS,IAAI,IAAI;CAC/G,IAAI,QAAQ,OAAO,iBAAiB,KAAK,QAAQ,MAAM,IAAI,cAAc,aAAa,MAAM,OAAO,KAAK,QAAQ;CAChH,OAAO;AACR;;AAEA,eAAe,WAAW,YAAY,MAAM;CAC3C,IAAI;EACH,MAAM,SAAS,IAAI,eAAe,EAAE,MAAM,YAAY;GACrD,WAAW,QAAQ,UAAU;GAC7B,WAAW,MAAM;EAClB,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,oBAAoB,aAAa,CAAC;EACvD,OAAO,IAAI,WAAW,MAAM,IAAI,SAAS,MAAM,CAAC,CAAC,YAAY,CAAC;CAC/D,SAAS,OAAO;EACf,MAAM,IAAI,cAAc,aAAa,MAAM,KAAK,oBAAoB,EAAE,MAAM,CAAC;CAC9E;AACD;AACA,SAAS,QAAQ,MAAM,QAAQ;CAC9B,QAAQ,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,MAAM,IAAI,KAAK,aAAa;AACrG"}
|
package/dist/style.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import "./components/action/style.js";
|
|
|
4
4
|
import "./components/dropdown/style.js";
|
|
5
5
|
import "./components/input/style.js";
|
|
6
6
|
import "./components/auto-complete/style.js";
|
|
7
|
+
import "./components/dialog/style.js";
|
|
7
8
|
import "./components/checkbox/style.js";
|
|
8
9
|
import "./components/radio/style.js";
|
|
9
10
|
import "./components/table/style.js";
|
|
@@ -16,7 +17,6 @@ import "./components/condition-editor/style.js";
|
|
|
16
17
|
import "./components/contextmenu/style.js";
|
|
17
18
|
import "./components/date-picker/style.js";
|
|
18
19
|
import "./components/date-range-picker/style.js";
|
|
19
|
-
import "./components/dialog/style.js";
|
|
20
20
|
import "./components/drawer/style.js";
|
|
21
21
|
import "./components/dual-nav/style.js";
|
|
22
22
|
import "./components/float-button/style.js";
|
package/dist/style.js
CHANGED
|
@@ -9,6 +9,7 @@ import "./components/input/style.js";
|
|
|
9
9
|
import "./components/tag/style.js";
|
|
10
10
|
import "./components/auto-complete/style.js";
|
|
11
11
|
import "./components/badge/style.js";
|
|
12
|
+
import "./components/dialog/style.js";
|
|
12
13
|
import "./components/form-item/style.js";
|
|
13
14
|
import "./components/grid/style.js";
|
|
14
15
|
import "./components/form/style.js";
|
|
@@ -34,7 +35,6 @@ import "./components/contextmenu/style.js";
|
|
|
34
35
|
import "./components/date-panel/style.js";
|
|
35
36
|
import "./components/date-picker/style.js";
|
|
36
37
|
import "./components/date-range-picker/style.js";
|
|
37
|
-
import "./components/dialog/style.js";
|
|
38
38
|
import "./components/drawer/style.js";
|
|
39
39
|
import "./components/file-picker/style.js";
|
|
40
40
|
import "./components/file-viewer/style.js";
|
package/dist/types/action.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { ButtonProps } from "./button.js";
|
|
|
2
2
|
import { ColorType, DeconstructValue } from "@veltra/utils";
|
|
3
3
|
//#region src/types/action.d.ts
|
|
4
4
|
/** 操作组件属性 */
|
|
5
|
-
interface ActionProps extends ButtonProps {
|
|
5
|
+
export interface ActionProps extends ButtonProps {
|
|
6
6
|
/**
|
|
7
7
|
* 是否需要确认:true 时点击只弹确认气泡(UPopConfirm),点气泡里的「确认」才触发 `run`
|
|
8
8
|
* @default false
|
|
@@ -17,7 +17,7 @@ interface ActionProps extends ButtonProps {
|
|
|
17
17
|
inDropdown?: boolean;
|
|
18
18
|
}
|
|
19
19
|
/** 操作组组件属性 */
|
|
20
|
-
interface ActionGroupProps {
|
|
20
|
+
export interface ActionGroupProps {
|
|
21
21
|
/** 是否加载中 */
|
|
22
22
|
loading?: boolean;
|
|
23
23
|
/**
|
|
@@ -47,17 +47,16 @@ interface ActionGroupProps {
|
|
|
47
47
|
type?: ColorType;
|
|
48
48
|
}
|
|
49
49
|
/** 操作组件定义的事件 */
|
|
50
|
-
interface ActionEmits {
|
|
50
|
+
export interface ActionEmits {
|
|
51
51
|
(e: 'run'): void;
|
|
52
52
|
}
|
|
53
53
|
/** 操作组件暴露的属性和方法(组件内部使用) */
|
|
54
|
-
interface _ActionExposed {}
|
|
55
|
-
interface _ActionGroupExposed {
|
|
54
|
+
export interface _ActionExposed {}
|
|
55
|
+
export interface _ActionGroupExposed {
|
|
56
56
|
closeTip: () => void;
|
|
57
57
|
}
|
|
58
58
|
/** 操作组件暴露的属性和方法(组件外部使用, 引用的值会被自动解构) */
|
|
59
|
-
type ActionExposed = DeconstructValue<_ActionExposed>;
|
|
60
|
-
type ActionGroupExposed = DeconstructValue<_ActionGroupExposed>;
|
|
59
|
+
export type ActionExposed = DeconstructValue<_ActionExposed>;
|
|
60
|
+
export type ActionGroupExposed = DeconstructValue<_ActionGroupExposed>;
|
|
61
61
|
//#endregion
|
|
62
|
-
export { ActionEmits, ActionExposed, ActionGroupExposed, ActionGroupProps, ActionProps, _ActionExposed, _ActionGroupExposed };
|
|
63
62
|
//# sourceMappingURL=action.d.ts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DeconstructValue } from "@veltra/utils";
|
|
2
2
|
//#region src/types/animation.d.ts
|
|
3
3
|
/** 动画组件属性 */
|
|
4
|
-
interface AnimationProps {
|
|
4
|
+
export interface AnimationProps {
|
|
5
5
|
/**
|
|
6
6
|
* 标签元素
|
|
7
7
|
* @default 'div'
|
|
@@ -10,13 +10,12 @@ interface AnimationProps {
|
|
|
10
10
|
inView?: Record<string, any>;
|
|
11
11
|
}
|
|
12
12
|
/** 动画组件定义的事件 */
|
|
13
|
-
interface AnimationEmits {
|
|
13
|
+
export interface AnimationEmits {
|
|
14
14
|
(e: 'update:modelValue', value: string): void;
|
|
15
15
|
}
|
|
16
16
|
/** 动画组件暴露的属性和方法(组件内部使用) */
|
|
17
|
-
interface _AnimationExposed {}
|
|
17
|
+
export interface _AnimationExposed {}
|
|
18
18
|
/** 动画组件暴露的属性和方法(组件外部使用, 引用的值会被自动解构) */
|
|
19
|
-
type AnimationExposed = DeconstructValue<_AnimationExposed>;
|
|
19
|
+
export type AnimationExposed = DeconstructValue<_AnimationExposed>;
|
|
20
20
|
//#endregion
|
|
21
|
-
export { AnimationEmits, AnimationExposed, AnimationProps, _AnimationExposed };
|
|
22
21
|
//# sourceMappingURL=animation.d.ts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DeconstructValue, FormComponentProps } from "@veltra/utils";
|
|
2
2
|
//#region src/types/auto-complete.d.ts
|
|
3
3
|
/** 自动补全组件组件属性 */
|
|
4
|
-
interface AutoCompleteProps extends FormComponentProps {
|
|
4
|
+
export interface AutoCompleteProps extends FormComponentProps {
|
|
5
5
|
modelValue?: string;
|
|
6
6
|
/** 占位符 */
|
|
7
7
|
placeholder?: string;
|
|
@@ -13,17 +13,16 @@ interface AutoCompleteProps extends FormComponentProps {
|
|
|
13
13
|
allowCustom?: boolean;
|
|
14
14
|
}
|
|
15
15
|
/** 自动补全组件组件定义的事件 */
|
|
16
|
-
interface AutoCompleteEmits {
|
|
16
|
+
export interface AutoCompleteEmits {
|
|
17
17
|
(e: 'update:modelValue', value: string): void;
|
|
18
18
|
(e: 'select', value: string): void;
|
|
19
19
|
}
|
|
20
20
|
/** 自动补全组件组件暴露的属性和方法(组件内部使用) */
|
|
21
|
-
interface _AutoCompleteExposed {
|
|
21
|
+
export interface _AutoCompleteExposed {
|
|
22
22
|
open: () => void;
|
|
23
23
|
close: () => void;
|
|
24
24
|
}
|
|
25
25
|
/** 自动补全组件组件暴露的属性和方法(组件外部使用, 引用的值会被自动解构) */
|
|
26
|
-
type AutoCompleteExposed = DeconstructValue<_AutoCompleteExposed>;
|
|
26
|
+
export type AutoCompleteExposed = DeconstructValue<_AutoCompleteExposed>;
|
|
27
27
|
//#endregion
|
|
28
|
-
export { AutoCompleteEmits, AutoCompleteExposed, AutoCompleteProps, _AutoCompleteExposed };
|
|
29
28
|
//# sourceMappingURL=auto-complete.d.ts.map
|
package/dist/types/badge.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ColorType, ComponentProps, DeconstructValue } from "@veltra/utils";
|
|
2
2
|
//#region src/types/badge.d.ts
|
|
3
3
|
/** 徽章组件属性 */
|
|
4
|
-
interface BadgeProps extends ComponentProps {
|
|
4
|
+
export interface BadgeProps extends ComponentProps {
|
|
5
5
|
/** 显示值 */
|
|
6
6
|
value?: number | string;
|
|
7
7
|
/** 类别 */
|
|
@@ -16,13 +16,12 @@ interface BadgeProps extends ComponentProps {
|
|
|
16
16
|
dot?: boolean;
|
|
17
17
|
}
|
|
18
18
|
/** 徽章组件定义的事件 */
|
|
19
|
-
interface BadgeEmits {
|
|
19
|
+
export interface BadgeEmits {
|
|
20
20
|
(e: 'update:modelValue', value: string): void;
|
|
21
21
|
}
|
|
22
22
|
/** 徽章组件暴露的属性和方法(组件内部使用) */
|
|
23
|
-
interface _BadgeExposed {}
|
|
23
|
+
export interface _BadgeExposed {}
|
|
24
24
|
/** 徽章组件暴露的属性和方法(组件外部使用, 引用的值会被自动解构) */
|
|
25
|
-
type BadgeExposed = DeconstructValue<_BadgeExposed>;
|
|
25
|
+
export type BadgeExposed = DeconstructValue<_BadgeExposed>;
|
|
26
26
|
//#endregion
|
|
27
|
-
export { BadgeEmits, BadgeExposed, BadgeProps, _BadgeExposed };
|
|
28
27
|
//# sourceMappingURL=badge.d.ts.map
|
|
@@ -3,11 +3,11 @@ import { TableColumn, TableColumnSlotsScope, TableEmits, TableProps, TableRow }
|
|
|
3
3
|
import { DeconstructValue } from "@veltra/utils";
|
|
4
4
|
//#region src/types/batch-edit.d.ts
|
|
5
5
|
/** 批量编辑列 */
|
|
6
|
-
interface BatchEditColumn extends TableColumn {}
|
|
7
|
-
type BatchEditFeature = 'create' | 'update' | 'delete' | 'view' | 'createChild';
|
|
8
|
-
type BatchEditFormStatus = 'hidden';
|
|
6
|
+
export interface BatchEditColumn extends TableColumn {}
|
|
7
|
+
export type BatchEditFeature = 'create' | 'update' | 'delete' | 'view' | 'createChild';
|
|
8
|
+
export type BatchEditFormStatus = 'hidden';
|
|
9
9
|
/** 批量编辑状态 */
|
|
10
|
-
interface BatchEditStates {
|
|
10
|
+
export interface BatchEditStates {
|
|
11
11
|
/** 层级 */
|
|
12
12
|
depth: number;
|
|
13
13
|
/** 表单可见性 */
|
|
@@ -24,7 +24,7 @@ interface BatchEditStates {
|
|
|
24
24
|
indexPath: number[];
|
|
25
25
|
}
|
|
26
26
|
/** 批量编辑组件属性 */
|
|
27
|
-
interface BatchEditProps extends TableProps {
|
|
27
|
+
export interface BatchEditProps extends TableProps {
|
|
28
28
|
/**
|
|
29
29
|
* 表单数据
|
|
30
30
|
* @description 与右侧 UForm 绑定的 reactive 对象
|
|
@@ -38,6 +38,12 @@ interface BatchEditProps extends TableProps {
|
|
|
38
38
|
cols?: string | [string, string];
|
|
39
39
|
/** 只读模式 */
|
|
40
40
|
readonly?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* 表单交互模式
|
|
43
|
+
* @description `'panel'`:右侧面板(默认);`'dialog'`:编辑 / 新增 / 查看 / 添加子级时以弹框呈现表单
|
|
44
|
+
* @default 'panel'
|
|
45
|
+
*/
|
|
46
|
+
formMode?: 'panel' | 'dialog';
|
|
41
47
|
/**
|
|
42
48
|
* 开启快速编辑
|
|
43
49
|
* @description 开启后,编辑行时表单实时写回 `row.data`(经 `model` 中转),且不调用 `saveMethod`
|
|
@@ -98,7 +104,7 @@ interface BatchEditProps extends TableProps {
|
|
|
98
104
|
actionsProps?: Partial<Record<BatchEditFeature, ActionProps>>;
|
|
99
105
|
}
|
|
100
106
|
/** 批量编辑组件定义的事件 */
|
|
101
|
-
interface BatchEditEmits extends TableEmits {
|
|
107
|
+
export interface BatchEditEmits extends TableEmits {
|
|
102
108
|
/** 更新数据 */
|
|
103
109
|
(e: 'update:data', value: Record<string, any>[]): void;
|
|
104
110
|
/** 点击底部「新增一行」 */
|
|
@@ -110,7 +116,7 @@ interface BatchEditEmits extends TableEmits {
|
|
|
110
116
|
/** 点击「添加子级」,参数为父级行 */
|
|
111
117
|
(e: 'create-child', row: TableRow): void;
|
|
112
118
|
}
|
|
113
|
-
type BatchEditSlots = {
|
|
119
|
+
export type BatchEditSlots = {
|
|
114
120
|
form?: (props: {
|
|
115
121
|
/** 当前编辑的层级 */
|
|
116
122
|
depth?: number;
|
|
@@ -130,9 +136,8 @@ type BatchEditSlots = {
|
|
|
130
136
|
[key: `column:${string}`]: (props: TableColumnSlotsScope) => any;
|
|
131
137
|
}>;
|
|
132
138
|
/** 批量编辑组件暴露的属性和方法(组件内部使用) */
|
|
133
|
-
interface _BatchEditExposed {}
|
|
139
|
+
export interface _BatchEditExposed {}
|
|
134
140
|
/** 批量编辑组件暴露的属性和方法(组件外部使用, 引用的值会被自动解构) */
|
|
135
|
-
type BatchEditExposed = DeconstructValue<_BatchEditExposed>;
|
|
141
|
+
export type BatchEditExposed = DeconstructValue<_BatchEditExposed>;
|
|
136
142
|
//#endregion
|
|
137
|
-
export { BatchEditColumn, BatchEditEmits, BatchEditExposed, BatchEditFeature, BatchEditFormStatus, BatchEditProps, BatchEditSlots, BatchEditStates, _BatchEditExposed };
|
|
138
143
|
//# sourceMappingURL=batch-edit.d.ts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ComponentSize, DeconstructValue } from "@veltra/utils";
|
|
2
2
|
//#region src/types/breadcrumb.d.ts
|
|
3
3
|
/** 面包屑单项 */
|
|
4
|
-
interface BreadcrumbItem {
|
|
4
|
+
export interface BreadcrumbItem {
|
|
5
5
|
/** 展示文案 */
|
|
6
6
|
title: string;
|
|
7
7
|
/** 存在时渲染为 `<a>`,由浏览器处理导航 */
|
|
@@ -10,7 +10,7 @@ interface BreadcrumbItem {
|
|
|
10
10
|
disabled?: boolean;
|
|
11
11
|
}
|
|
12
12
|
/** 面包屑组件属性 */
|
|
13
|
-
interface BreadcrumbProps {
|
|
13
|
+
export interface BreadcrumbProps {
|
|
14
14
|
/** 路径项,顺序为从一级到末级 */
|
|
15
15
|
items: BreadcrumbItem[];
|
|
16
16
|
/** 尺寸 */
|
|
@@ -22,21 +22,20 @@ interface BreadcrumbProps {
|
|
|
22
22
|
lastLinked?: boolean;
|
|
23
23
|
}
|
|
24
24
|
/** `item` 插槽作用域 */
|
|
25
|
-
interface BreadcrumbSlotScope {
|
|
25
|
+
export interface BreadcrumbSlotScope {
|
|
26
26
|
item: BreadcrumbItem;
|
|
27
27
|
index: number;
|
|
28
28
|
isLast: boolean;
|
|
29
29
|
}
|
|
30
30
|
/** 面包屑组件事件 */
|
|
31
|
-
interface BreadcrumbEmits {
|
|
31
|
+
export interface BreadcrumbEmits {
|
|
32
32
|
/**
|
|
33
33
|
* 可交互项(无 `href` 的链式项)被点击时触发;有 `href` 时不触发(走原生导航)
|
|
34
34
|
*/
|
|
35
35
|
(e: 'click', item: BreadcrumbItem, index: number, ev: Event): void;
|
|
36
36
|
}
|
|
37
37
|
/** @internal */
|
|
38
|
-
interface _BreadcrumbExposed {}
|
|
39
|
-
type BreadcrumbExposed = DeconstructValue<_BreadcrumbExposed>;
|
|
38
|
+
export interface _BreadcrumbExposed {}
|
|
39
|
+
export type BreadcrumbExposed = DeconstructValue<_BreadcrumbExposed>;
|
|
40
40
|
//#endregion
|
|
41
|
-
export { BreadcrumbEmits, BreadcrumbExposed, BreadcrumbItem, BreadcrumbProps, BreadcrumbSlotScope, _BreadcrumbExposed };
|
|
42
41
|
//# sourceMappingURL=breadcrumb.d.ts.map
|
package/dist/types/button.d.ts
CHANGED
|
@@ -2,13 +2,13 @@ import { Component, ShallowRef } from "vue";
|
|
|
2
2
|
import { ColorType, ComponentProps, DeconstructValue } from "@veltra/utils";
|
|
3
3
|
//#region src/types/button.d.ts
|
|
4
4
|
/** 按钮类型 */
|
|
5
|
-
type ButtonType = ColorType;
|
|
5
|
+
export type ButtonType = ColorType;
|
|
6
6
|
/**
|
|
7
7
|
* 按钮属性类型
|
|
8
8
|
* @description 组件不注入默认 `aria-label`:可访问名来自默认插槽文本,
|
|
9
9
|
* 或你自己传入的 `aria-label`(透传到根元素);只有图标的按钮必须自行传 `aria-label`
|
|
10
10
|
*/
|
|
11
|
-
interface ButtonProps extends ComponentProps {
|
|
11
|
+
export interface ButtonProps extends ComponentProps {
|
|
12
12
|
/** 按钮类型 */
|
|
13
13
|
type?: ButtonType;
|
|
14
14
|
/** 是否以文本形式展示 */
|
|
@@ -32,16 +32,15 @@ interface ButtonProps extends ComponentProps {
|
|
|
32
32
|
/** 事件是否传播(冒泡或者捕获) */
|
|
33
33
|
propagate?: boolean;
|
|
34
34
|
}
|
|
35
|
-
interface ButtonEmits {
|
|
35
|
+
export interface ButtonEmits {
|
|
36
36
|
/** 点击事件 */
|
|
37
37
|
(name: 'click', e: MouseEvent): void;
|
|
38
38
|
}
|
|
39
39
|
/** 在组件内部引用 */
|
|
40
|
-
interface _ButtonExposed {
|
|
40
|
+
export interface _ButtonExposed {
|
|
41
41
|
el: ShallowRef<HTMLButtonElement | undefined>;
|
|
42
42
|
}
|
|
43
43
|
/** 按钮暴露的属性和方法 */
|
|
44
|
-
type ButtonExposed = DeconstructValue<_ButtonExposed>;
|
|
44
|
+
export type ButtonExposed = DeconstructValue<_ButtonExposed>;
|
|
45
45
|
//#endregion
|
|
46
|
-
export { ButtonEmits, ButtonExposed, ButtonProps, ButtonType, _ButtonExposed };
|
|
47
46
|
//# sourceMappingURL=button.d.ts.map
|