@web-ppt/edit-core 0.5.0-beta.1 → 0.5.0-beta.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.
Files changed (367) hide show
  1. package/CHANGELOG.md +188 -0
  2. package/README.md +165 -22
  3. package/dist/alt-text.d.ts +5 -0
  4. package/dist/appearance/index.d.ts +12 -0
  5. package/dist/appearance/materialize.d.ts +4 -0
  6. package/dist/appearance/types.d.ts +26 -0
  7. package/dist/appearance/values.d.ts +9 -0
  8. package/dist/appearance.js +301 -0
  9. package/dist/cfb/index.d.ts +5 -0
  10. package/dist/cfb/read.d.ts +16 -0
  11. package/dist/cfb/write.d.ts +3 -0
  12. package/dist/cfb.js +208 -0
  13. package/dist/change-classification.d.ts +3 -3
  14. package/dist/chart/category-binding.d.ts +4 -0
  15. package/dist/chart/category-commands.d.ts +23 -0
  16. package/dist/chart/category-levels.d.ts +14 -0
  17. package/dist/chart/category-matrix.d.ts +2 -0
  18. package/dist/chart/category-value.d.ts +2 -0
  19. package/dist/chart/category-workbook.d.ts +13 -0
  20. package/dist/chart/commands.d.ts +28 -0
  21. package/dist/chart/context.d.ts +12 -0
  22. package/dist/chart/dataset-merge.d.ts +5 -0
  23. package/dist/chart/formula.d.ts +13 -0
  24. package/dist/chart/identity-frames.d.ts +4 -0
  25. package/dist/chart/identity-scopes.d.ts +6 -0
  26. package/dist/chart/identity.d.ts +24 -0
  27. package/dist/chart/index.d.ts +8 -0
  28. package/dist/chart/limits.d.ts +6 -0
  29. package/dist/chart/locator.d.ts +4 -0
  30. package/dist/chart/materialize.d.ts +7 -0
  31. package/dist/chart/ordering.d.ts +9 -0
  32. package/dist/chart/part-graph.d.ts +5 -0
  33. package/dist/chart/patch-validation.d.ts +3 -0
  34. package/dist/chart/plot-kinds.d.ts +2 -0
  35. package/dist/chart/projection.d.ts +8 -0
  36. package/dist/chart/save.d.ts +4 -0
  37. package/dist/chart/shared-added-plan.d.ts +19 -0
  38. package/dist/chart/shared-added-records.d.ts +8 -0
  39. package/dist/chart/shared-address.d.ts +5 -0
  40. package/dist/chart/shared-allocate.d.ts +7 -0
  41. package/dist/chart/shared-cache-codec.d.ts +5 -0
  42. package/dist/chart/shared-cache-identities.d.ts +3 -0
  43. package/dist/chart/shared-cache-migration.d.ts +7 -0
  44. package/dist/chart/shared-cache-save.d.ts +3 -0
  45. package/dist/chart/shared-cache-scopes.d.ts +13 -0
  46. package/dist/chart/shared-cache.d.ts +11 -0
  47. package/dist/chart/shared-category.d.ts +4 -0
  48. package/dist/chart/shared-cell.d.ts +9 -0
  49. package/dist/chart/shared-family.d.ts +26 -0
  50. package/dist/chart/shared-fields.d.ts +18 -0
  51. package/dist/chart/shared-graph.d.ts +19 -0
  52. package/dist/chart/shared-growth-space.d.ts +5 -0
  53. package/dist/chart/shared-inserted-cells.d.ts +14 -0
  54. package/dist/chart/shared-inserted-command.d.ts +7 -0
  55. package/dist/chart/shared-inserted-layout.d.ts +16 -0
  56. package/dist/chart/shared-inserted-project.d.ts +14 -0
  57. package/dist/chart/shared-inserted-records.d.ts +16 -0
  58. package/dist/chart/shared-inserted-save.d.ts +6 -0
  59. package/dist/chart/shared-joint-command.d.ts +9 -0
  60. package/dist/chart/shared-joint-records.d.ts +9 -0
  61. package/dist/chart/shared-record-axis.d.ts +25 -0
  62. package/dist/chart/shared-record-remove.d.ts +13 -0
  63. package/dist/chart/shared-record-stage.d.ts +2 -0
  64. package/dist/chart/shared-records.d.ts +2 -0
  65. package/dist/chart/shared-rows.d.ts +17 -0
  66. package/dist/chart/shared-runtime.d.ts +19 -0
  67. package/dist/chart/shared-save-plan.d.ts +4 -0
  68. package/dist/chart/shared-save.d.ts +3 -0
  69. package/dist/chart/shared-series.d.ts +6 -0
  70. package/dist/chart/shared-source-cache.d.ts +4 -0
  71. package/dist/chart/shared-topology.d.ts +9 -0
  72. package/dist/chart/shared-unresolved.d.ts +3 -0
  73. package/dist/chart/shared-validation.d.ts +6 -0
  74. package/dist/chart/shared-workbook-source.d.ts +6 -0
  75. package/dist/chart/shared-xy-command.d.ts +7 -0
  76. package/dist/chart/shared-xy-family.d.ts +16 -0
  77. package/dist/chart/shared-xy-project.d.ts +6 -0
  78. package/dist/chart/shared-xy-records.d.ts +23 -0
  79. package/dist/chart/shared-xy-save.d.ts +5 -0
  80. package/dist/chart/shared-xy-source.d.ts +39 -0
  81. package/dist/chart/shared.d.ts +13 -0
  82. package/dist/chart/source.d.ts +11 -0
  83. package/dist/chart/types.d.ts +86 -0
  84. package/dist/chart/validation.d.ts +24 -0
  85. package/dist/chart/workbook-range.d.ts +16 -0
  86. package/dist/chart/workbook-read.d.ts +7 -0
  87. package/dist/chart/workbook-write.d.ts +9 -0
  88. package/dist/chart/workbook.d.ts +25 -0
  89. package/dist/chart/xml-data.d.ts +14 -0
  90. package/dist/chart/xml-namespaces.d.ts +16 -0
  91. package/dist/chart-design/index.d.ts +10 -0
  92. package/dist/chart-design/types.d.ts +11 -0
  93. package/dist/chart-design/xml.d.ts +2 -0
  94. package/dist/chart-design.js +361 -0
  95. package/dist/chart-ex/index.d.ts +15 -0
  96. package/dist/chart-ex/workbook.d.ts +6 -0
  97. package/dist/chart-ex/xml.d.ts +14 -0
  98. package/dist/chart-ex.js +457 -0
  99. package/dist/chart-shared/index.d.ts +12 -0
  100. package/dist/chart-shared.js +1 -0
  101. package/dist/chart.js +1 -0
  102. package/dist/clipboard-links-GuPtqr1z.js +778 -0
  103. package/dist/clipboard-package.d.ts +4 -0
  104. package/dist/clipboard-source.d.ts +6 -2
  105. package/dist/clipboard-trees.d.ts +9 -0
  106. package/dist/collaboration-identity.d.ts +3 -0
  107. package/dist/commands/add-slide-identity.d.ts +4 -0
  108. package/dist/commands/bullet-image-resource.d.ts +11 -0
  109. package/dist/commands/clear-format.d.ts +4 -0
  110. package/dist/commands/common-object-slide-patch.d.ts +4 -0
  111. package/dist/commands/common-object-slide-types.d.ts +68 -0
  112. package/dist/commands/convert-to-custom-geometry.d.ts +4 -0
  113. package/dist/commands/direct-format-patches.d.ts +11 -5
  114. package/dist/commands/distribute-elements.d.ts +4 -0
  115. package/dist/commands/edit-table-grid.d.ts +10 -0
  116. package/dist/commands/element-alt-text.d.ts +8 -0
  117. package/dist/commands/element-arrangement.d.ts +17 -0
  118. package/dist/commands/element-effects.d.ts +1 -1
  119. package/dist/commands/element-fill.d.ts +1 -1
  120. package/dist/commands/element-geometry.d.ts +9 -0
  121. package/dist/commands/element-hierarchy.d.ts +6 -0
  122. package/dist/commands/element-image-content.d.ts +2 -2
  123. package/dist/commands/element-link.d.ts +1 -1
  124. package/dist/commands/element-name.d.ts +1 -1
  125. package/dist/commands/element-stroke.d.ts +1 -1
  126. package/dist/commands/element-table-style.d.ts +5 -0
  127. package/dist/commands/element-text.d.ts +1 -1
  128. package/dist/commands/element-transform.d.ts +2 -2
  129. package/dist/commands/frame-decomposition.d.ts +10 -0
  130. package/dist/commands/generated-creation-defaults.d.ts +4 -0
  131. package/dist/commands/geometry-types.d.ts +44 -0
  132. package/dist/commands/group-types.d.ts +24 -0
  133. package/dist/commands/group.d.ts +4 -0
  134. package/dist/commands/hierarchy-record.d.ts +5 -0
  135. package/dist/commands/image-resource.d.ts +8 -1
  136. package/dist/commands/insertion-host.d.ts +16 -0
  137. package/dist/commands/insertion-rect.d.ts +2 -0
  138. package/dist/commands/layout-property.d.ts +7 -0
  139. package/dist/commands/master-property.d.ts +5 -0
  140. package/dist/commands/master-text-style-types.d.ts +27 -0
  141. package/dist/commands/master-text-style.d.ts +7 -0
  142. package/dist/commands/paste-resources.d.ts +9 -5
  143. package/dist/commands/patch-apply.d.ts +3 -0
  144. package/dist/commands/patch-count.d.ts +1 -0
  145. package/dist/commands/patch-invalidation.d.ts +4 -0
  146. package/dist/commands/patch-stage.d.ts +4 -0
  147. package/dist/commands/patch.d.ts +4 -0
  148. package/dist/commands/record-clone.d.ts +3 -0
  149. package/dist/commands/record-override.d.ts +5 -0
  150. package/dist/commands/replace-image.d.ts +6 -1
  151. package/dist/commands/sections.d.ts +10 -0
  152. package/dist/commands/set-geometry.d.ts +4 -0
  153. package/dist/commands/set-preset.d.ts +5 -0
  154. package/dist/commands/set-table-style.d.ts +3 -0
  155. package/dist/commands/slide-property-types.d.ts +55 -5
  156. package/dist/commands/slide-size.d.ts +7 -0
  157. package/dist/commands/spid.d.ts +2 -1
  158. package/dist/commands/table-grid-patch.d.ts +12 -0
  159. package/dist/commands/table-style-types.d.ts +28 -0
  160. package/dist/commands/text-target.d.ts +3 -2
  161. package/dist/commands/theme-types.d.ts +47 -0
  162. package/dist/commands/theme.d.ts +9 -0
  163. package/dist/commands/types.d.ts +219 -17
  164. package/dist/commands/ungroup-source.d.ts +3 -0
  165. package/dist/commands/ungroup.d.ts +4 -0
  166. package/dist/comments/index.d.ts +35 -0
  167. package/dist/comments/save.d.ts +3 -0
  168. package/dist/comments/state.d.ts +10 -0
  169. package/dist/comments/xml.d.ts +12 -0
  170. package/dist/comments.js +782 -0
  171. package/dist/common-object-slide-types.d.ts +34 -0
  172. package/dist/custom-geometry-path.d.ts +3 -0
  173. package/dist/custom-geometry.d.ts +12 -0
  174. package/dist/data-validation.d.ts +1 -1
  175. package/dist/describe/budget.d.ts +3 -0
  176. package/dist/describe/index.d.ts +5 -0
  177. package/dist/describe/read.d.ts +4 -0
  178. package/dist/describe/types.d.ts +103 -0
  179. package/dist/describe.js +192 -0
  180. package/dist/design-dependencies.d.ts +8 -0
  181. package/dist/design-projection-package.d.ts +10 -0
  182. package/dist/design-target.d.ts +10 -0
  183. package/dist/design.d.ts +3 -0
  184. package/dist/document-extensions.d.ts +9 -0
  185. package/dist/document.d.ts +1 -1
  186. package/dist/dynamic-projection.d.ts +6 -0
  187. package/dist/edit-core.js +5680 -3413
  188. package/dist/editor.d.ts +19 -2
  189. package/dist/element-source.d.ts +11 -0
  190. package/dist/element-spids.d.ts +4 -0
  191. package/dist/extension-address-journal.d.ts +9 -0
  192. package/dist/extension-address-remap.d.ts +14 -0
  193. package/dist/extension-addresses.d.ts +20 -0
  194. package/dist/extension-copy-history.d.ts +7 -0
  195. package/dist/extension-copy.d.ts +16 -0
  196. package/dist/extension-migration-receipt.d.ts +34 -0
  197. package/dist/extension-recovery-context.d.ts +5 -0
  198. package/dist/extension-runtime.d.ts +64 -0
  199. package/dist/generate/comments.d.ts +3 -0
  200. package/dist/generate/compatibility-parts.d.ts +14 -0
  201. package/dist/generate/compatibility-references.d.ts +3 -0
  202. package/dist/generate/compatibility.d.ts +4 -0
  203. package/dist/generate/custom-geometry.d.ts +2 -0
  204. package/dist/generate/index.d.ts +13 -0
  205. package/dist/generate/links.d.ts +3 -0
  206. package/dist/generate/master-defaults.d.ts +4 -0
  207. package/dist/generate/materialize.d.ts +2 -0
  208. package/dist/generate/math.d.ts +3 -0
  209. package/dist/generate/media.d.ts +13 -0
  210. package/dist/generate/portable-clipboard.d.ts +4 -0
  211. package/dist/generate/projection-tree.d.ts +8 -0
  212. package/dist/generate/table.d.ts +4 -0
  213. package/dist/generate/template.d.ts +70 -0
  214. package/dist/generate/text-body.d.ts +2 -0
  215. package/dist/generate/text-effects.d.ts +5 -0
  216. package/dist/generate/text-override.d.ts +8 -0
  217. package/dist/generate/validation.d.ts +3 -0
  218. package/dist/generate/warp.d.ts +2 -0
  219. package/dist/generate.js +1464 -0
  220. package/dist/history.d.ts +11 -1
  221. package/dist/hyperlink.d.ts +2 -0
  222. package/dist/identities.d.ts +4 -0
  223. package/dist/identity-allocation.d.ts +12 -0
  224. package/dist/identity-watermark.d.ts +4 -0
  225. package/dist/image-content.d.ts +5 -2
  226. package/dist/image-resource-history.d.ts +2 -0
  227. package/dist/index-C2r7c6G6.js +714 -0
  228. package/dist/index-CYDvbiwF.js +1 -0
  229. package/dist/index.d.ts +43 -7
  230. package/dist/ink/index.d.ts +27 -0
  231. package/dist/ink/model.d.ts +4 -0
  232. package/dist/ink/save.d.ts +3 -0
  233. package/dist/ink/source.d.ts +7 -0
  234. package/dist/ink.js +324 -0
  235. package/dist/layout-assets.d.ts +3 -1
  236. package/dist/layout-projection.d.ts +19 -5
  237. package/dist/layout-state.d.ts +2 -0
  238. package/dist/layout-types.d.ts +42 -0
  239. package/dist/layout.d.ts +5 -0
  240. package/dist/lint/color.d.ts +5 -0
  241. package/dist/lint/index.d.ts +7 -0
  242. package/dist/lint/prompts.d.ts +3 -0
  243. package/dist/lint/report.d.ts +21 -0
  244. package/dist/lint/sampler-batch.d.ts +4 -0
  245. package/dist/lint/sampler-images.d.ts +2 -0
  246. package/dist/lint/sampler.d.ts +9 -0
  247. package/dist/lint/snapshot.d.ts +34 -0
  248. package/dist/lint/types.d.ts +67 -0
  249. package/dist/lint-sampler.js +187 -0
  250. package/dist/lint.js +659 -0
  251. package/dist/master-state.d.ts +3 -0
  252. package/dist/master-text-style-state.d.ts +3 -0
  253. package/dist/master-types.d.ts +55 -0
  254. package/dist/master.d.ts +5 -0
  255. package/dist/media/audio-icon.d.ts +2 -0
  256. package/dist/media/commands.d.ts +3 -0
  257. package/dist/media/index.d.ts +10 -0
  258. package/dist/media/markup.d.ts +10 -0
  259. package/dist/media/mp4-boxes.d.ts +12 -0
  260. package/dist/media/mp4-fragments.d.ts +8 -0
  261. package/dist/media/mp4-samples.d.ts +4 -0
  262. package/dist/media/mp4.d.ts +2 -0
  263. package/dist/media/poster.d.ts +2 -0
  264. package/dist/media/replace-poster.d.ts +3 -0
  265. package/dist/media/resource.d.ts +4 -0
  266. package/dist/media/source.d.ts +14 -0
  267. package/dist/media/types.d.ts +33 -0
  268. package/dist/media-properties.d.ts +4 -0
  269. package/dist/media.js +1630 -0
  270. package/dist/model-invariants-BM19JVxy.js +8980 -0
  271. package/dist/object-source.d.ts +11 -0
  272. package/dist/ole/container.d.ts +14 -0
  273. package/dist/ole/content.d.ts +94 -0
  274. package/dist/ole/index.d.ts +20 -0
  275. package/dist/ole/preview.d.ts +3 -0
  276. package/dist/ole/save.d.ts +2 -0
  277. package/dist/ole/state.d.ts +16 -0
  278. package/dist/ole.js +870 -0
  279. package/dist/opc/patch.d.ts +2 -0
  280. package/dist/opc.js +1 -1
  281. package/dist/paragraph-level.d.ts +11 -0
  282. package/dist/paragraph-property-schema.d.ts +5 -2
  283. package/dist/{patch-DO8497wO.js → patch-BwhfBbYE.js} +112 -95
  284. package/dist/patch-change.d.ts +4 -0
  285. package/dist/patch-events.d.ts +16 -0
  286. package/dist/ppt/appearance.d.ts +11 -0
  287. package/dist/ppt/binary.d.ts +20 -0
  288. package/dist/ppt/drawing.d.ts +18 -0
  289. package/dist/ppt/geometry.d.ts +4 -0
  290. package/dist/ppt/index.d.ts +12 -0
  291. package/dist/ppt/pictures.d.ts +11 -0
  292. package/dist/ppt/text.d.ts +9 -0
  293. package/dist/ppt.js +774 -0
  294. package/dist/preset-geometry.d.ts +6 -0
  295. package/dist/projection.d.ts +2 -0
  296. package/dist/query-BHLjWjnu.js +903 -0
  297. package/dist/recovery-identity.d.ts +3 -1
  298. package/dist/recovery-migrations.d.ts +3 -0
  299. package/dist/recovery.d.ts +3 -0
  300. package/dist/resize/index.d.ts +6 -0
  301. package/dist/resize/text.d.ts +4 -0
  302. package/dist/resize.js +5090 -0
  303. package/dist/retained-element-origins.d.ts +6 -0
  304. package/dist/run-property-fields.d.ts +12 -0
  305. package/dist/run-property-schema.d.ts +3 -1
  306. package/dist/run-style.d.ts +15 -0
  307. package/dist/save/alt-text.d.ts +4 -0
  308. package/dist/save/comments.d.ts +3 -0
  309. package/dist/save/effects.d.ts +2 -1
  310. package/dist/save/extension-availability.d.ts +3 -0
  311. package/dist/save/extension-elements.d.ts +26 -0
  312. package/dist/save/geometry.d.ts +5 -0
  313. package/dist/save/index.d.ts +6 -1
  314. package/dist/save/insertion.d.ts +7 -3
  315. package/dist/save/layout-properties.d.ts +4 -0
  316. package/dist/save/master-properties.d.ts +5 -0
  317. package/dist/save/notes.d.ts +2 -0
  318. package/dist/save/paragraph-overrides.d.ts +3 -0
  319. package/dist/save/run-overrides.d.ts +10 -0
  320. package/dist/save/shape-format.d.ts +3 -0
  321. package/dist/save/slide-parts.d.ts +1 -0
  322. package/dist/save/table-style-part.d.ts +11 -0
  323. package/dist/save/table.d.ts +5 -0
  324. package/dist/save/text-source-less.d.ts +6 -0
  325. package/dist/save/xfrm.d.ts +8 -2
  326. package/dist/save.js +502 -1480
  327. package/dist/sections.d.ts +8 -0
  328. package/dist/session-assets.d.ts +4 -0
  329. package/dist/slide-parts-D0o_DDhi.js +1331 -0
  330. package/dist/slide-size.d.ts +6 -0
  331. package/dist/smartart/drawing.d.ts +3 -0
  332. package/dist/smartart/index.d.ts +16 -0
  333. package/dist/smartart/model.d.ts +18 -0
  334. package/dist/smartart/save.d.ts +3 -0
  335. package/dist/smartart.js +604 -0
  336. package/dist/source-retention.d.ts +7 -0
  337. package/dist/space.d.ts +37 -0
  338. package/dist/table-cell.d.ts +7 -1
  339. package/dist/table-direct-markup.d.ts +7 -1
  340. package/dist/table-grid-projection.d.ts +6 -0
  341. package/dist/table-grid.d.ts +45 -0
  342. package/dist/table-invariants.d.ts +4 -0
  343. package/dist/table-rows.d.ts +2 -1
  344. package/dist/table-scale.d.ts +4 -0
  345. package/dist/table-style.d.ts +21 -0
  346. package/dist/templates/index.d.ts +4 -0
  347. package/dist/templates/recipes.d.ts +5 -0
  348. package/dist/templates/types.d.ts +17 -0
  349. package/dist/templates.js +543 -0
  350. package/dist/text-flatten.d.ts +6 -0
  351. package/dist/text-fragment.d.ts +5 -0
  352. package/dist/text-model.d.ts +8 -8
  353. package/dist/text-override-validation.d.ts +6 -2
  354. package/dist/text-selection.d.ts +4 -0
  355. package/dist/theme-projection.d.ts +8 -0
  356. package/dist/theme-xml.d.ts +3 -0
  357. package/dist/theme.d.ts +14 -0
  358. package/dist/types.d.ts +217 -8
  359. package/dist/xml/index.d.ts +1 -1
  360. package/dist/xml/nodes.d.ts +2 -2
  361. package/dist/xml/shape-ids.d.ts +3 -0
  362. package/dist/xml.js +19 -16
  363. package/package.json +77 -5
  364. package/schemas/describe.schema.json +479 -0
  365. package/schemas/lint.schema.json +145 -0
  366. package/dist/index-D4ZTaYOa.js +0 -706
  367. package/dist/insertion-DabLme_U.js +0 -5471
package/dist/ink.js ADDED
@@ -0,0 +1,324 @@
1
+ import { readInkData as ne, renderInkXml as ce } from "@web-ppt/core/ink-edit";
2
+ import { sourcePartBytes as S } from "@web-ppt/edit-core";
3
+ import { xmlElementChildren as I, parseXmlTree as M, createXmlElement as B, insertXmlChildUnchecked as j, removeXmlChild as F, setXmlAttribute as _, createXmlText as ue, serializeXmlTree as we, removeXmlAttribute as ge, serializeXmlTreeBytes as L } from "@web-ppt/edit-core/xml";
4
+ import "@web-ppt/edit-core/cfb";
5
+ import "fflate";
6
+ import "@web-ppt/edit-core/opc";
7
+ import { sha256 as xe } from "@web-ppt/core";
8
+ function ve(e) {
9
+ return [...xe(e)].map((t) => t.toString(16).padStart(2, "0")).join("");
10
+ }
11
+ const K = Symbol.for("@web-ppt/edit-core/extensions/v1"), ae = Symbol.for("@web-ppt/edit-core/extensions-generation/v1"), Q = Symbol.for("@web-ppt/edit-core/extensions-listeners/v1"), be = /^[a-z][a-z0-9-]{0,63}$/;
12
+ function V() {
13
+ const e = globalThis;
14
+ return e[Q] ?? (e[Q] = { documents: /* @__PURE__ */ new WeakMap(), pending: /* @__PURE__ */ new Map(), active: /* @__PURE__ */ new Set(), resolvers: /* @__PURE__ */ new WeakMap() });
15
+ }
16
+ function ye(e) {
17
+ if (!be.test(e))
18
+ throw new Error(`编辑扩展命名空间无效:${e}`);
19
+ }
20
+ function ke() {
21
+ const e = globalThis;
22
+ return e[K] ?? (e[K] = /* @__PURE__ */ new Map());
23
+ }
24
+ function Ee(e, t) {
25
+ var i;
26
+ ye(e), ke().set(e, t);
27
+ const r = globalThis;
28
+ r[ae] = (r[ae] ?? 0) + 1;
29
+ const n = new Set(V().pending.get(e));
30
+ if (t.migrate) for (const o of V().active) n.add(o);
31
+ V().pending.delete(e);
32
+ for (const o of n ?? [])
33
+ try {
34
+ o(e);
35
+ } catch (c) {
36
+ (i = globalThis.reportError) == null || i.call(globalThis, c);
37
+ }
38
+ }
39
+ const z = "http://schemas.openxmlformats.org/officeDocument/2006/relationships", E = (e, t) => {
40
+ var r;
41
+ return (r = e.attributes.find((n) => n.localName === t)) == null ? void 0 : r.value;
42
+ }, O = (e, t) => e ? I(e).filter((r) => r.localName === t) : [], W = (e, t) => O(e, t)[0], pe = (e) => e.replace(/([^/]+)$/, "_rels/$1.rels");
43
+ function fe(e, t) {
44
+ if (/[:\\?#]/.test(t)) throw new Error("嵌入文档关系必须指向包内文件");
45
+ const r = t.startsWith("/") ? [] : e.split("/").slice(0, -1);
46
+ for (const n of t.split("/"))
47
+ if (n === "..") {
48
+ if (!r.length) throw new Error("嵌入文档关系越界");
49
+ r.pop();
50
+ } else n && n !== "." && r.push(n);
51
+ return r.join("/");
52
+ }
53
+ const te = "http://www.w3.org/2003/InkML", Ne = "http://schemas.microsoft.com/office/powerpoint/2010/main";
54
+ function re(e, t) {
55
+ var x, h, m;
56
+ const r = e.elements[t], n = r == null ? void 0 : r.meta.origin;
57
+ if (!n || r.meta.editable !== "frame") return null;
58
+ let i = r.parent;
59
+ for (; e.elements[i]; ) i = e.elements[i].parent;
60
+ const o = ((h = (x = e.slides[i]) == null ? void 0 : x.creation) == null ? void 0 : h.duplicateSourcePart) ?? n.part, c = S(e, o), f = S(e, pe(o));
61
+ if (!c || !f) return null;
62
+ const l = O(M(f).root, "Relationship"), s = [M(c).root];
63
+ for (; s.length; ) {
64
+ const w = s.pop();
65
+ if (s.push(...I(w)), w.namespaceUri !== Ne || w.localName !== "contentPart") continue;
66
+ const v = W(W(w, "nvContentPartPr"), "cNvPr");
67
+ if (!v || Number(E(v, "id")) !== n.spid) continue;
68
+ const T = (m = w.attributes.find((d) => d.namespaceUri === z && d.localName === "id")) == null ? void 0 : m.value, k = l.find((d) => E(d, "Id") === T && E(d, "TargetMode") !== "External");
69
+ if (!k) return null;
70
+ const p = fe(o, E(k, "Target") ?? ""), a = S(e, p);
71
+ return a ? { host: o, part: p, xml: new TextDecoder().decode(a) } : null;
72
+ }
73
+ return null;
74
+ }
75
+ const Se = (e, t) => {
76
+ const r = [], n = [e];
77
+ for (; n.length; ) {
78
+ const i = n.pop();
79
+ i.namespaceUri === te && i.localName === t && r.push(i), n.push(...I(i).reverse());
80
+ }
81
+ return r;
82
+ };
83
+ function Y(e) {
84
+ const t = e;
85
+ if (!t || !Array.isArray(t.strokes) || !t.strokes.length || t.strokes.length > 1e3 || !t.bounds) throw new Error("墨迹笔画数量无效");
86
+ const { x: r, y: n, width: i, height: o } = t.bounds;
87
+ if (![r, n, i, o].every((s) => Number.isFinite(s) && Math.abs(s) < 1e9) || i < 0 || o < 0) throw new Error("墨迹画布无效");
88
+ const c = /* @__PURE__ */ new Set();
89
+ let f = 0;
90
+ return { strokes: t.strokes.map((s) => {
91
+ if (!s || typeof s.id != "string" || !/^[a-z_][\w.-]{0,100}$/i.test(s.id) || c.has(s.id)) throw new Error("墨迹笔画身份无效");
92
+ if (c.add(s.id), !Array.isArray(s.channels) || s.channels.length < 2 || s.channels.length > 32 || new Set(s.channels).size !== s.channels.length || !s.channels.includes("X") || !s.channels.includes("Y") || s.channels.some((h) => typeof h != "string" || !/^[A-Z][A-Z0-9_]{0,30}$/.test(h))) throw new Error("墨迹采样通道无效");
93
+ if (!Array.isArray(s.points) || s.points.length < 2 || (f += s.points.length) > 1e5) throw new Error("墨迹采样数量无效");
94
+ if (!Number.isFinite(s.width) || s.width < 0 || s.width > 1e6 || typeof s.color != "string" || !/^(?:#[\da-f]{3}(?:[\da-f]{3})?|[a-z]{1,30}|rgba?\([\d.,%\s]+\))$/i.test(s.color)) throw new Error("墨迹笔刷无效");
95
+ const x = s.points.map((h) => {
96
+ if (!h || ![h.x, h.y].every((w) => Number.isFinite(w) && Math.abs(w) < 1e9) || !Array.isArray(h.values) || h.values.length > s.channels.length || !h.values.every((w) => Number.isFinite(w) && Math.abs(w) < 1e12)) throw new Error("墨迹采样值无效");
97
+ const m = [...h.values];
98
+ return m[s.channels.indexOf("X")] = h.x, m[s.channels.indexOf("Y")] = h.y, { x: h.x, y: h.y, values: m };
99
+ });
100
+ return { id: s.id, points: x, channels: [...s.channels], color: s.color, width: s.width };
101
+ }), bounds: { x: r, y: n, width: i, height: o } };
102
+ }
103
+ function oe(e, t) {
104
+ var k;
105
+ const r = ne(e), n = M(e), i = Se(n.root, "trace"), o = new Map(r.strokes.map((p, a) => [p.id, i[a]])), c = new Set(t.strokes.map((p) => p.id)), f = /* @__PURE__ */ new Map(), l = [n.root];
106
+ for (; l.length; ) {
107
+ const p = l.pop();
108
+ for (const a of I(p))
109
+ f.set(a, p), l.push(a);
110
+ }
111
+ let s = W(n.root, "definitions");
112
+ s || (s = B("inkml:definitions", { attributes: [["xmlns:inkml", te]] }), j(n.root, s, I(n.root)[0] ?? null));
113
+ const x = /* @__PURE__ */ new Set();
114
+ for (const p of [n.root, ...f.keys()]) {
115
+ const a = (k = p.attributes.find((d) => d.name === "xml:id")) == null ? void 0 : k.value;
116
+ a && x.add(a);
117
+ }
118
+ const h = (p) => {
119
+ let a = p, d = 1;
120
+ for (; x.has(a); ) a = p + d++;
121
+ return x.add(a), a;
122
+ }, m = (p, a, d = []) => {
123
+ const N = B("inkml:" + a, { attributes: [["xmlns:inkml", te], ...d] });
124
+ return j(p, N), N;
125
+ }, w = h("webPptInkCanvas"), v = m(s, "canvas", [["xml:id", w]]), T = m(v, "traceFormat");
126
+ for (const p of ["X", "Y"]) {
127
+ const a = p === "X" ? t.bounds.x : t.bounds.y, d = p === "X" ? t.bounds.width : t.bounds.height;
128
+ m(T, "channel", [["name", p], ["type", "decimal"], ["min", String(a)], ["max", String(a + d)]]);
129
+ }
130
+ for (const [p, a] of o) c.has(p) || F(f.get(a), a);
131
+ for (const [p, a] of t.strokes.entries()) {
132
+ let d = o.get(a.id);
133
+ if (!d) {
134
+ if (x.has(a.id)) throw new Error("新增墨迹身份与原始定义冲突");
135
+ d = m(n.root, "trace", [["xml:id", a.id]]);
136
+ }
137
+ const N = h("webPptInkContext" + p), R = m(s, "context", [["xml:id", N], ["canvasRef", "#" + w]]), $ = m(R, "traceFormat");
138
+ for (const g of a.channels) m($, "channel", [["name", g], ["type", "decimal"]]);
139
+ let P = d;
140
+ for (; P; ) {
141
+ const g = E(P, "contextRef");
142
+ if (g) {
143
+ _(R, "contextRef", g);
144
+ break;
145
+ }
146
+ P = f.get(P);
147
+ }
148
+ _(d, "contextRef", "#" + N);
149
+ const U = h("webPptInkBrush" + p), G = m(s, "brush", [["xml:id", U]]);
150
+ for (const [g, X] of [["width", String(a.width)], ["height", String(a.width)], ["color", a.color]]) m(G, "brushProperty", [["name", g], ["value", X]]);
151
+ _(d, "brushRef", "#" + U);
152
+ for (const g of [...d.children]) (g.type === "text" || g.type === "cdata") && F(d, g);
153
+ j(d, ue(a.points.map((g) => a.channels.map((X, D) => "!" + (g.values[D] ?? 0)).join(" ")).join(",")));
154
+ }
155
+ return we(n);
156
+ }
157
+ const H = (e, t) => {
158
+ var r, n, i;
159
+ return (i = (n = (r = e.elements[t]) == null ? void 0 : r.ovr.extensions) == null ? void 0 : n.ink) == null ? void 0 : i.value;
160
+ };
161
+ function le(e, t, r, n, i = !1) {
162
+ const o = new Set([...r].filter((l) => /^ppt\/(ink|media)\/web-ppt-ink-/.test(l)));
163
+ for (const l of o)
164
+ n[l] = null, r.delete(l);
165
+ let c;
166
+ const f = () => {
167
+ if (!c) {
168
+ c = M(n["[Content_Types].xml"] ?? S(e, "[Content_Types].xml"));
169
+ for (const l of O(c.root, "Override")) o.has((E(l, "PartName") ?? "").slice(1)) && F(c.root, l);
170
+ }
171
+ return c;
172
+ };
173
+ for (const l of Object.values(e.elements)) {
174
+ const s = H(e, l.id);
175
+ if (!s) continue;
176
+ const x = re(e, l.id);
177
+ if (!x) throw new Error("墨迹来源丢失");
178
+ const h = oe(x.xml, Y(JSON.parse(s))), m = ve(new TextEncoder().encode(l.id)).slice(0, 16);
179
+ let w = `ppt/ink/web-ppt-ink-${m}.xml`, v = `ppt/media/web-ppt-ink-${m}.svg`, T = 1;
180
+ for (; S(e, w) && !o.has(w) || S(e, v) && !o.has(v); )
181
+ w = `ppt/ink/web-ppt-ink-${m}-${T}.xml`, v = `ppt/media/web-ppt-ink-${m}-${T++}.svg`;
182
+ let k = l.parent;
183
+ for (; e.elements[k]; ) k = e.elements[k].parent;
184
+ const p = i ? `ppt/slides/slide${e.slideOrder.indexOf(k) + 1}.xml` : x.host, a = pe(p), d = S(e, p), N = S(e, a);
185
+ i || (d && (t[p] ?? (t[p] = d)), N && (t[a] ?? (t[a] = N)));
186
+ const R = M(n[p] ?? d), $ = M(n[a] ?? N);
187
+ for (const u of O($.root, "Relationship")) E(u, "TargetMode") !== "External" && o.has(fe(p, E(u, "Target"))) && F($.root, u);
188
+ const P = (u, A) => {
189
+ let y = "webPptInk" + m, J = 1;
190
+ for (; O($.root, "Relationship").some((C) => E(C, "Id") === y); ) y = "webPptInk" + m + "_" + J++;
191
+ return j($.root, B("Relationship", { attributes: [["Id", y], ["Type", A], ["Target", "../" + u.slice(4)]] })), y;
192
+ }, U = P(w, `${z}/customXml`), G = P(v, `${z}/image`), g = [R.root], X = /* @__PURE__ */ new Map();
193
+ let D = !1;
194
+ for (; g.length; ) {
195
+ const u = g.pop();
196
+ for (const b of I(u))
197
+ X.set(b, u), g.push(b);
198
+ if (E(u, "webPptInkEdit") !== l.id) continue;
199
+ D = !0;
200
+ const A = u.attributes.find((b) => b.namespaceUri === z && b.localName === "id");
201
+ if (!A) throw new Error("墨迹数据关系丢失");
202
+ _(u, A.name, U), ge(u, "webPptInkEdit");
203
+ let y = X.get(u);
204
+ for (; y && y.localName !== "AlternateContent"; ) y = X.get(y);
205
+ const J = y && W(y, "Fallback"), C = J ? [J] : [];
206
+ for (; C.length; ) {
207
+ const b = C.pop();
208
+ if (C.push(...I(b)), b.localName === "blip") {
209
+ const se = b.attributes.find((q) => q.namespaceUri === z && q.localName === "embed");
210
+ se && _(b, se.name, G);
211
+ for (const q of O(b, "extLst")) F(b, q);
212
+ }
213
+ }
214
+ }
215
+ if (!D) throw new Error("保存找不到墨迹对象");
216
+ const ie = (u) => u.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;"), he = ce(h, l.src.w, l.src.h).map((u) => `<path transform="translate(${u.x} ${u.y})" d="${ie(u.path ?? "")}" fill="none" stroke="${ie(u.stroke.color)}" stroke-width="${u.stroke.width}" stroke-linecap="round" stroke-linejoin="round"/>`).join(""), me = `<svg xmlns="http://www.w3.org/2000/svg" width="${l.src.w}" height="${l.src.h}" viewBox="0 0 ${l.src.w} ${l.src.h}">${he}</svg>`;
217
+ n[w] = new TextEncoder().encode(h), n[v] = new TextEncoder().encode(me), r.add(w), r.add(v), n[p] = L(R), n[a] = L($);
218
+ for (const [u, A] of [[w, "application/inkml+xml"], [v, "image/svg+xml"]]) j(f().root, B("Override", { attributes: [["PartName", "/" + u], ["ContentType", A]] }));
219
+ }
220
+ o.size && f(), c && (n["[Content_Types].xml"] = L(c));
221
+ }
222
+ const Z = (e, t) => {
223
+ const r = re(e, t);
224
+ if (!r) throw new Error("对象不是可编辑墨迹");
225
+ return r;
226
+ };
227
+ function ee(e, t) {
228
+ const r = H(e, t);
229
+ return r ? Y(JSON.parse(r)) : ne(Z(e, t).xml);
230
+ }
231
+ function de(e, t, r) {
232
+ const n = Y(r);
233
+ return oe(Z(e, t).xml, n), n;
234
+ }
235
+ function $e(e, t, r) {
236
+ if (e.meta.readonly) throw new Error("文稿只读");
237
+ const n = H(e, t.id), i = t.payload === null ? void 0 : de(e, t.id, t.payload);
238
+ let o = i ? JSON.stringify(i) : void 0;
239
+ o === JSON.stringify(ne(Z(e, t.id).xml)) && (o = void 0);
240
+ const c = ["elements", t.id, "ovr", "extensions", "ink", "value"], f = (l) => l === void 0 ? { op: "del", path: c, origin: r } : { op: "set", path: c, origin: r, value: l };
241
+ return n === o ? { forward: [], inverse: [] } : { forward: [f(o)], inverse: [f(n)] };
242
+ }
243
+ Ee("ink", {
244
+ command: $e,
245
+ validatePatch(e, t) {
246
+ if (t.path[0] !== "elements" || t.path.length !== 6 || t.path[5] !== "value") throw new Error("墨迹补丁路径无效");
247
+ if (t.op === "set") {
248
+ if (typeof t.value != "string") throw new Error("墨迹补丁值无效");
249
+ de(e, t.path[1], JSON.parse(t.value));
250
+ }
251
+ },
252
+ project(e, t, r) {
253
+ const n = H(e, t);
254
+ return !n || r.kind !== "group" ? r : { ...r, children: ce(oe(Z(e, t).xml, Y(JSON.parse(n))), r.w, r.h) };
255
+ },
256
+ materialize(e, t, r, n) {
257
+ var o, c;
258
+ if (!((c = (o = t.ovr.extensions) == null ? void 0 : o.ink) != null && c.value)) return;
259
+ const i = [n.locateElementHost(e, t).host];
260
+ for (; i.length; ) {
261
+ const f = i.pop();
262
+ f.localName === "contentPart" && n.setXmlAttribute(f, "webPptInkEdit", t.id), i.push(...n.xmlElementChildren(f));
263
+ }
264
+ },
265
+ materializePackage: le,
266
+ generateParts(e, t) {
267
+ const r = { ...t };
268
+ le(e, {}, /* @__PURE__ */ new Set(), r, !0);
269
+ for (const [n, i] of Object.entries(r))
270
+ i ? t[n] = i : delete t[n];
271
+ }
272
+ });
273
+ function Re(e) {
274
+ return Object.values(e.elements).filter((t) => re(e, t.id)).map((t) => ({ id: t.id, name: t.src.name ?? "墨迹" }));
275
+ }
276
+ function Ce(e) {
277
+ const t = (n, i) => {
278
+ const o = ee(e.doc, n);
279
+ i(o), e.exec({ type: "Extension", namespace: "ink", id: n, payload: o });
280
+ }, r = (n, i) => {
281
+ const o = n.strokes.find((c) => c.id === i);
282
+ if (!o) throw new Error("笔画不存在");
283
+ return o;
284
+ };
285
+ return {
286
+ query: (n) => ee(e.doc, n),
287
+ setStyle(n, i, o) {
288
+ t(n, (c) => {
289
+ const f = r(c, i);
290
+ o.color !== void 0 && (f.color = o.color), o.width !== void 0 && (f.width = o.width);
291
+ });
292
+ },
293
+ setPoints(n, i, o) {
294
+ t(n, (c) => {
295
+ r(c, i).points = o;
296
+ });
297
+ },
298
+ translate(n, i, o, c) {
299
+ t(n, (f) => {
300
+ for (const l of r(f, i).points)
301
+ l.x += o, l.y += c;
302
+ });
303
+ },
304
+ addStroke(n, i, o, c = "ink-" + crypto.randomUUID()) {
305
+ return t(n, (f) => {
306
+ f.strokes.push({ id: c, points: i.map((l) => ({ x: l.x, y: l.y, values: [l.x, l.y, l.pressure ?? 0.5] })), channels: ["X", "Y", "F"], ...o });
307
+ }), c;
308
+ },
309
+ removeStroke(n, i) {
310
+ const o = ee(e.doc, n);
311
+ r(o, i), o.strokes.length === 1 ? e.exec({ type: "RemoveElement", id: n }) : t(n, (c) => {
312
+ c.strokes = c.strokes.filter((f) => f.id !== i);
313
+ });
314
+ },
315
+ reset(n) {
316
+ e.exec({ type: "Extension", namespace: "ink", id: n, payload: null });
317
+ }
318
+ };
319
+ }
320
+ export {
321
+ Ce as createInkEditor,
322
+ Re as listEditableInk,
323
+ ee as queryInk
324
+ };
@@ -1,4 +1,4 @@
1
- import type { Slide } from '@web-ppt/core';
1
+ import type { Slide, SlideLayoutTemplate, SlideMasterTemplate } from '@web-ppt/core';
2
2
  import type { EditDoc } from './types';
3
3
  interface LayoutAsset {
4
4
  readonly mime: string;
@@ -6,5 +6,7 @@ interface LayoutAsset {
6
6
  }
7
7
  /** 只兑现 Schema 的资源槽;普通字符串即使形似内部 token 也必须逐字保留。 */
8
8
  export declare function hydrateLayoutSlideAssets(doc: EditDoc, slide: Slide, assets: readonly LayoutAsset[]): Slide;
9
+ export declare function hydrateLayoutTemplateAssets(doc: EditDoc, layout: SlideLayoutTemplate, assets: readonly LayoutAsset[]): SlideLayoutTemplate;
10
+ export declare function hydrateMasterTemplateAssets(doc: EditDoc, master: SlideMasterTemplate, assets: readonly LayoutAsset[]): SlideMasterTemplate;
9
11
  export declare function releaseLayoutAssetCache(doc: EditDoc): void;
10
12
  export {};
@@ -1,12 +1,23 @@
1
- import type { GeomSpec, ShapeCreationDefaults, Slide, SlideElement, TableCreationDefaults, TextBody } from '@web-ppt/core';
1
+ import type { Fill, GeomSpec, ShapeCreationDefaults, Slide, SlideElement, SlideLayoutTemplate, SlideMasterTemplate, TableCreationDefaults, TextBody } from '@web-ppt/core';
2
2
  import type { EditDoc, ElementId, SlideId } from './types';
3
+ type LayoutElementResolver = (id: ElementId) => SlideElement;
4
+ /** 主题覆盖后的版式来源仍由 core 的 OOXML 继承器求值,编辑层只按来源身份对回稳定节点。 */
5
+ export declare function resolvedLayoutTemplate(doc: EditDoc, layoutId: string): SlideLayoutTemplate | null;
6
+ export declare function resolvedLayoutElementSource(doc: EditDoc, layoutId: string, record: EditDoc['elements'][string]): SlideElement | null;
7
+ export declare function resolvedMasterTemplate(doc: EditDoc, masterId: string): SlideMasterTemplate | null;
8
+ export declare function resolvedMasterElementSource(doc: EditDoc, masterId: string, record: EditDoc['elements'][string]): SlideElement | null;
3
9
  export declare function resolvedLayoutSlide(doc: EditDoc, slideId: SlideId): Slide | null;
4
10
  export declare function releaseLayoutProjectionCache(doc: EditDoc): void;
5
- export declare function changedLayout(doc: EditDoc, slideId: SlideId): import("@web-ppt/core").SlideLayoutTemplate | undefined;
11
+ export declare function changedLayout(doc: EditDoc, slideId: SlideId): import("./layout-types").LayoutRecord | undefined;
12
+ export declare function slideDesignChanged(doc: EditDoc, slideId: SlideId): boolean;
13
+ export declare function layoutShowsMaster(doc: EditDoc, layoutId: string): boolean;
14
+ export declare function effectiveLayoutBackground(doc: EditDoc, layoutId: string, resolved?: {
15
+ readonly background: Fill | null;
16
+ } | null): Fill | null;
6
17
  export declare function currentShapeDefaults(doc: EditDoc, slideId: SlideId): ShapeCreationDefaults | undefined;
7
18
  export declare function currentTableDefaults(doc: EditDoc, slideId: SlideId): TableCreationDefaults | undefined;
8
19
  /** 页面级 showMasterSp=false 必须继续压过新关系指向的版式/母版。 */
9
- export declare function projectedLayoutElements(doc: EditDoc, slideId: SlideId): SlideElement[];
20
+ export declare function projectedLayoutElements(doc: EditDoc, slideId: SlideId, resolveLayoutElement?: LayoutElementResolver): SlideElement[];
10
21
  export declare function projectionContentIds(doc: EditDoc, slideId: SlideId): ElementId[];
11
22
  /** 目标没有宿主且来源变换本来只靠旧版式继承时,保存必须把有效 frame 降级为页面直设。 */
12
23
  export declare function layoutFallbackElementIds(doc: EditDoc, slideId: SlideId): ElementId[];
@@ -16,9 +27,12 @@ export declare function layoutFallbackGeometry(record: EditDoc['elements'][strin
16
27
  export declare function projectedSlideElementIds(doc: EditDoc, slideId: SlideId): Array<ElementId | null>;
17
28
  /** 尚无 slide 内容节点的目标占位符只供 edit interaction layer 提示,不进入业务渲染。 */
18
29
  export declare function unboundLayoutPlaceholders(doc: EditDoc, slideId: SlideId): SlideElement[];
19
- export declare function rebasedElementBase(doc: EditDoc, slideId: SlideId, record: EditDoc['elements'][string]): {
30
+ export declare function rebasedElementBase(doc: EditDoc, slideId: SlideId, record: EditDoc['elements'][string], resolveLayoutElement?: LayoutElementResolver): {
20
31
  base: SlideElement;
21
32
  geom?: GeomSpec;
22
33
  };
23
34
  /** 文字命令从当前版式的重基值起步,不能把旧版式有效值烘进首次覆盖。 */
24
- export declare function rebasedTextBase(doc: EditDoc, slideId: SlideId, id: ElementId): TextBody | null;
35
+ export declare function rebasedTextBase(doc: EditDoc, slideId: SlideId, id: ElementId, resolveLayoutElement?: LayoutElementResolver): TextBody | null;
36
+ /** 列表改级必须读取九级样式目录,不能从当前段落反推相邻级别的继承值。 */
37
+ export declare function rebasedTextLevelTemplate(doc: EditDoc, slideId: SlideId, id: ElementId): TextBody | undefined;
38
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { EditDoc } from './types';
2
+ export declare function layoutHasEdits(doc: EditDoc, id: string): boolean;
@@ -0,0 +1,42 @@
1
+ import type { Fill, SlideLayoutTemplate, Transition } from '@web-ppt/core';
2
+ import type { ElementId } from './identities';
3
+ /** 设计来源必须带领域种类,调用方不能把 OPC part 冒充普通 SlideId。 */
4
+ export type LayoutDesignTarget = {
5
+ readonly kind: 'layout';
6
+ readonly id: string;
7
+ };
8
+ export type MasterDesignTarget = {
9
+ readonly kind: 'master';
10
+ readonly id: string;
11
+ };
12
+ export type DesignTarget = LayoutDesignTarget | MasterDesignTarget;
13
+ export interface LayoutOverrides {
14
+ /** 缺少字段表示来源;显式无背景使用 Fill.none。 */
15
+ background?: Exclude<Fill, {
16
+ type: 'image';
17
+ }>;
18
+ /** 缺少字段表示来源;Transition.none 表示明确关闭。 */
19
+ transition?: Transition;
20
+ }
21
+ /** 保留原目录字段以兼容新增页调用方;编辑状态只进入 children / ovr。 */
22
+ export interface LayoutRecord extends SlideLayoutTemplate {
23
+ children: ElementId[];
24
+ ovr: LayoutOverrides;
25
+ }
26
+ export interface LayoutCatalogItem {
27
+ readonly id: string;
28
+ readonly name: string;
29
+ readonly masterId: string;
30
+ readonly themeId?: string;
31
+ readonly target: LayoutDesignTarget;
32
+ }
33
+ export interface LayoutPropertyState<T> {
34
+ readonly value: T;
35
+ readonly source: T;
36
+ readonly direct: boolean;
37
+ }
38
+ /** 面板只读取求值结果与稀疏覆盖状态,不暴露可变的 LayoutRecord。 */
39
+ export interface LayoutDesignState extends LayoutCatalogItem {
40
+ readonly background: LayoutPropertyState<Fill | null>;
41
+ readonly transition: LayoutPropertyState<Transition | null>;
42
+ }
@@ -0,0 +1,5 @@
1
+ import type { Slide } from '@web-ppt/core';
2
+ import type { EditDoc, LayoutCatalogItem, LayoutDesignState, LayoutDesignTarget } from './types';
3
+ export declare function listLayouts(doc: EditDoc): LayoutCatalogItem[];
4
+ export declare function queryLayout(doc: EditDoc, target: LayoutDesignTarget): LayoutDesignState;
5
+ export declare function toLayoutCanvas(doc: EditDoc, target: LayoutDesignTarget): Slide;
@@ -0,0 +1,5 @@
1
+ import type { Fill } from '@web-ppt/core';
2
+ export declare function color(value: string): readonly [number, number, number, number];
3
+ export declare function over(fg: readonly number[], bg: readonly number[]): readonly [number, number, number, number];
4
+ export declare function contrast(fg: readonly number[], bg: readonly number[]): number;
5
+ export declare function paint(fill: Fill | null | undefined, bg: readonly number[]): readonly number[] | null;
@@ -0,0 +1,7 @@
1
+ import type { EditDoc } from '@web-ppt/edit-core';
2
+ import type { TextMeasure } from '@web-ppt/core';
3
+ import type { LayoutLintOptions, LayoutLintReport } from './types';
4
+ export { LayoutLintError, LAYOUT_CHECKS } from './types';
5
+ export type { LayoutCheck, LayoutIssue, LayoutLintOptions, LayoutLintReport, LintContext, ContrastContext, ContrastSamples } from './types';
6
+ export declare function prepareLintText(doc: EditDoc, measureText: TextMeasure): void;
7
+ export declare function lintPresentation(doc: EditDoc, options?: LayoutLintOptions): Promise<LayoutLintReport>;
@@ -0,0 +1,3 @@
1
+ import type { EditDoc } from '@web-ppt/edit-core';
2
+ import type { DescriptionElement } from '../describe/types';
3
+ export declare function promptReader(doc: EditDoc): (element: DescriptionElement) => string[];
@@ -0,0 +1,21 @@
1
+ import type { DescriptionElement } from '../describe/types';
2
+ export declare const LAYOUT_CHECKS: readonly ["text-overflow", "element-overlap", "off-canvas", "low-contrast", "missing-font", "placeholder-prompt-left", "image-distorted"];
3
+ export type LayoutCheck = typeof LAYOUT_CHECKS[number];
4
+ export interface LayoutIssue {
5
+ readonly reason: LayoutCheck;
6
+ readonly slideNumber: number;
7
+ readonly elementId: string;
8
+ readonly bounds: DescriptionElement['bounds'];
9
+ readonly cell: {
10
+ readonly row: number;
11
+ readonly column: number;
12
+ } | null;
13
+ readonly measurements: Readonly<Record<string, number | string | boolean | readonly string[]>>;
14
+ }
15
+ export interface LayoutLintReport {
16
+ readonly version: 1;
17
+ readonly checks: readonly LayoutCheck[];
18
+ readonly totalSlides: number;
19
+ readonly totalElements: number;
20
+ readonly issues: readonly LayoutIssue[];
21
+ }
@@ -0,0 +1,4 @@
1
+ import type { ContrastContext, ContrastSamples } from './types';
2
+ import type { SvgContrastSamplerOptions } from './sampler';
3
+ /** 每页只渲染完整图、无字底图和颜色标记图,避免图表密集页按 run 重复光栅化。 */
4
+ export declare function createSvgContrastSampler(options: SvgContrastSamplerOptions): (context: ContrastContext) => Promise<ContrastSamples>;
@@ -0,0 +1,2 @@
1
+ /** 遮挡形状保留 alpha、统一绘黑;图片填充与普通图片同样不能泄漏 run 标记颜色。 */
2
+ export declare function blackenImages(svg: string): string;
@@ -0,0 +1,9 @@
1
+ import type { EmbeddedFont } from '@web-ppt/core';
2
+ export interface SvgContrastSamplerOptions {
3
+ readonly rasterize: (svg: string, width: number, height: number, signal?: AbortSignal) => Promise<Uint8Array | Uint8ClampedArray>;
4
+ readonly embeddedFonts?: readonly EmbeddedFont[];
5
+ readonly fontFamily?: string;
6
+ readonly scale?: number;
7
+ readonly maxPixels?: number;
8
+ }
9
+ export { createSvgContrastSampler } from './sampler-batch';
@@ -0,0 +1,34 @@
1
+ import type { Fill, SlideElement, TextBody } from '@web-ppt/core';
2
+ import type { EditDoc } from '@web-ppt/edit-core';
3
+ export interface TextUnit {
4
+ body: TextBody;
5
+ width: number;
6
+ height: number;
7
+ fill: Fill | null;
8
+ cell: {
9
+ row: number;
10
+ column: number;
11
+ } | null;
12
+ }
13
+ export declare function textUnits(element: SlideElement): TextUnit[];
14
+ export declare function snapshot(doc: EditDoc): {
15
+ description: import("../describe").PresentationDescription;
16
+ slides: {
17
+ elements: SlideElement[];
18
+ background: Fill | null;
19
+ notes?: string;
20
+ hidden?: boolean;
21
+ layoutName?: string;
22
+ transition?: import("@web-ppt/core").Transition;
23
+ animations?: import("@web-ppt/core").AnimStep[];
24
+ comments?: import("@web-ppt/core").SlideComment[];
25
+ editInfo?: import("@web-ppt/core").SlideEditInfo;
26
+ }[];
27
+ elements: {
28
+ item: import("../describe").DescriptionElement;
29
+ raw: SlideElement;
30
+ visible: SlideElement;
31
+ rendered: SlideElement;
32
+ units: TextUnit[];
33
+ }[][];
34
+ };
@@ -0,0 +1,67 @@
1
+ import type { ImageMetadata, Paragraph, Slide, SlideElement, TextBody, TextMeasure, TextRun } from '@web-ppt/core';
2
+ import type { LayoutCheck } from './report';
3
+ export { LAYOUT_CHECKS } from './report';
4
+ export type { LayoutCheck, LayoutIssue, LayoutLintReport } from './report';
5
+ export interface LintContext {
6
+ readonly slideNumber: number;
7
+ readonly elementId: string;
8
+ readonly element: Readonly<SlideElement>;
9
+ readonly slide: Readonly<Slide>;
10
+ readonly canvas: {
11
+ readonly width: number;
12
+ readonly height: number;
13
+ readonly color: string;
14
+ };
15
+ readonly resource: (url: string) => {
16
+ readonly bytes: Uint8Array;
17
+ readonly mime: string;
18
+ } | undefined;
19
+ readonly bindings: readonly {
20
+ readonly elementId: string;
21
+ readonly element: Readonly<SlideElement>;
22
+ }[];
23
+ readonly signal?: AbortSignal;
24
+ }
25
+ export interface ContrastContext extends LintContext {
26
+ readonly body: Readonly<TextBody>;
27
+ readonly paragraph: Readonly<Paragraph>;
28
+ readonly run: Readonly<TextRun>;
29
+ readonly textIndex: number;
30
+ readonly paragraphIndex: number;
31
+ readonly runIndex: number;
32
+ }
33
+ export interface LayoutLintOptions {
34
+ readonly checks?: readonly LayoutCheck[];
35
+ readonly measureText?: TextMeasure;
36
+ readonly fonts?: {
37
+ readonly available: readonly string[];
38
+ readonly embedded: readonly string[];
39
+ };
40
+ readonly canvasColor?: string;
41
+ readonly overlapRatio?: number;
42
+ readonly imageDeviation?: number;
43
+ readonly tolerancePx?: number;
44
+ readonly maxIssues?: number;
45
+ readonly signal?: AbortSignal;
46
+ readonly onProgress?: (progress: {
47
+ completed: number;
48
+ total: number;
49
+ }) => void | Promise<void>;
50
+ readonly resolveContrast?: (context: ContrastContext) => ContrastSamples | Promise<ContrastSamples>;
51
+ readonly resolveImageMetadata?: (context: LintContext) => ImageMetadata | undefined | Promise<ImageMetadata | undefined>;
52
+ readonly resolvePlaceholderPrompts?: (context: LintContext) => readonly string[] | undefined | Promise<readonly string[] | undefined>;
53
+ }
54
+ export type ContrastSamples = readonly {
55
+ foreground: string;
56
+ background: string;
57
+ }[] | {
58
+ readonly visible: false;
59
+ };
60
+ export declare class LayoutLintError extends Error {
61
+ readonly reason: string;
62
+ readonly slideNumber: number | null;
63
+ readonly elementId: string | null;
64
+ constructor(reason: string, message: string, slideNumber?: number | null, elementId?: string | null);
65
+ }
66
+ export declare function active(signal?: AbortSignal): void;
67
+ export declare function waitFor<T>(value: T | Promise<T>, signal?: AbortSignal): Promise<T>;