ooxml-core 0.19.0 → 0.21.0

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 (328) hide show
  1. package/README.md +21 -43
  2. package/dist/automation/index.cjs +195 -193
  3. package/dist/automation/index.mjs +195 -193
  4. package/dist/chart/axis-nice.d.ts +97 -0
  5. package/dist/chart/axis-nice.d.ts.map +1 -0
  6. package/dist/chart/histogram-binning.d.ts +40 -0
  7. package/dist/chart/histogram-binning.d.ts.map +1 -0
  8. package/dist/chart/index.cjs +167 -0
  9. package/dist/chart/index.d.ts +2 -0
  10. package/dist/chart/index.d.ts.map +1 -1
  11. package/dist/chart/index.mjs +162 -1
  12. package/dist/diagram/index.cjs +2 -1
  13. package/dist/diagram/index.mjs +2 -1
  14. package/dist/docx/attr-units.d.ts +11 -0
  15. package/dist/docx/attr-units.d.ts.map +1 -0
  16. package/dist/docx/block-parser.d.ts.map +1 -1
  17. package/dist/docx/case-transform.d.ts +9 -0
  18. package/dist/docx/case-transform.d.ts.map +1 -0
  19. package/dist/docx/embedded.cjs +2 -1
  20. package/dist/docx/embedded.mjs +2 -1
  21. package/dist/docx/index.cjs +289 -3
  22. package/dist/docx/index.d.ts +5 -0
  23. package/dist/docx/index.d.ts.map +1 -1
  24. package/dist/docx/index.mjs +269 -4
  25. package/dist/docx/layout/adapter.d.ts.map +1 -1
  26. package/dist/docx/layout/table-layout.d.ts.map +1 -1
  27. package/dist/docx/load/index.cjs +2 -1
  28. package/dist/docx/load/index.mjs +2 -1
  29. package/dist/docx/page-setup-model.d.ts +29 -0
  30. package/dist/docx/page-setup-model.d.ts.map +1 -0
  31. package/dist/docx/page-size.d.ts +11 -0
  32. package/dist/docx/page-size.d.ts.map +1 -0
  33. package/dist/docx/parse.d.ts.map +1 -1
  34. package/dist/docx/section-edit.d.ts +19 -0
  35. package/dist/docx/section-edit.d.ts.map +1 -0
  36. package/dist/docx/tab-stops.d.ts.map +1 -1
  37. package/dist/docx/ui/backstage-focus.d.ts +6 -0
  38. package/dist/docx/ui/backstage-focus.d.ts.map +1 -0
  39. package/dist/docx/ui/break-note-schema.d.ts +11 -0
  40. package/dist/docx/ui/break-note-schema.d.ts.map +1 -0
  41. package/dist/docx/ui/collaboration-authority.d.ts +31 -0
  42. package/dist/docx/ui/collaboration-authority.d.ts.map +1 -0
  43. package/dist/docx/ui/collaboration-identity.d.ts +8 -0
  44. package/dist/docx/ui/collaboration-identity.d.ts.map +1 -0
  45. package/dist/docx/ui/collaboration-protocol.d.ts +25 -0
  46. package/dist/docx/ui/collaboration-protocol.d.ts.map +1 -0
  47. package/dist/docx/ui/collaboration.d.ts +30 -0
  48. package/dist/docx/ui/collaboration.d.ts.map +1 -0
  49. package/dist/docx/ui/defined.d.ts +3 -0
  50. package/dist/docx/ui/defined.d.ts.map +1 -0
  51. package/dist/docx/ui/dirty-state.d.ts +9 -0
  52. package/dist/docx/ui/dirty-state.d.ts.map +1 -0
  53. package/dist/docx/ui/field-guard.d.ts +21 -0
  54. package/dist/docx/ui/field-guard.d.ts.map +1 -0
  55. package/dist/docx/ui/header-footer-history.d.ts +15 -0
  56. package/dist/docx/ui/header-footer-history.d.ts.map +1 -0
  57. package/dist/docx/ui/index.cjs +2380 -0
  58. package/dist/docx/ui/index.d.ts +30 -0
  59. package/dist/docx/ui/index.d.ts.map +1 -0
  60. package/dist/docx/ui/index.mjs +2317 -0
  61. package/dist/docx/ui/inline-content-schema.d.ts +15 -0
  62. package/dist/docx/ui/inline-content-schema.d.ts.map +1 -0
  63. package/dist/docx/ui/ligature-style.d.ts +4 -0
  64. package/dist/docx/ui/ligature-style.d.ts.map +1 -0
  65. package/dist/docx/ui/node-numbering.d.ts +8 -0
  66. package/dist/docx/ui/node-numbering.d.ts.map +1 -0
  67. package/dist/docx/ui/review-schema.d.ts +90 -0
  68. package/dist/docx/ui/review-schema.d.ts.map +1 -0
  69. package/dist/docx/ui/ribbon-action-ids.d.ts +26 -0
  70. package/dist/docx/ui/ribbon-action-ids.d.ts.map +1 -0
  71. package/dist/docx/ui/ribbon-colors.d.ts +3 -0
  72. package/dist/docx/ui/ribbon-colors.d.ts.map +1 -0
  73. package/dist/docx/ui/ribbon-legacy-labels.d.ts +6 -0
  74. package/dist/docx/ui/ribbon-legacy-labels.d.ts.map +1 -0
  75. package/dist/docx/ui/run-compare.d.ts +5 -0
  76. package/dist/docx/ui/run-compare.d.ts.map +1 -0
  77. package/dist/docx/ui/run-extra-mark.d.ts +17 -0
  78. package/dist/docx/ui/run-extra-mark.d.ts.map +1 -0
  79. package/dist/docx/ui/schema-marks.d.ts +273 -0
  80. package/dist/docx/ui/schema-marks.d.ts.map +1 -0
  81. package/dist/docx/ui/smartart-theme.d.ts +21 -0
  82. package/dist/docx/ui/smartart-theme.d.ts.map +1 -0
  83. package/dist/docx/ui/table-render.d.ts +24 -0
  84. package/dist/docx/ui/table-render.d.ts.map +1 -0
  85. package/dist/docx/ui/table-visuals.d.ts +3 -0
  86. package/dist/docx/ui/table-visuals.d.ts.map +1 -0
  87. package/dist/docx/ui/theme/css-vars.d.ts +6 -0
  88. package/dist/docx/ui/theme/css-vars.d.ts.map +1 -0
  89. package/dist/docx/ui/theme/defaults.d.ts +12 -0
  90. package/dist/docx/ui/theme/defaults.d.ts.map +1 -0
  91. package/dist/docx/ui/theme/element.d.ts +9 -0
  92. package/dist/docx/ui/theme/element.d.ts.map +1 -0
  93. package/dist/docx/ui/theme/index.d.ts +5 -0
  94. package/dist/docx/ui/theme/index.d.ts.map +1 -0
  95. package/dist/docx/ui/theme/types.d.ts +42 -0
  96. package/dist/docx/ui/theme/types.d.ts.map +1 -0
  97. package/dist/docx/ui/word-count.d.ts +3 -0
  98. package/dist/docx/ui/word-count.d.ts.map +1 -0
  99. package/dist/docx/ui/zoom-fit.d.ts +16 -0
  100. package/dist/docx/ui/zoom-fit.d.ts.map +1 -0
  101. package/dist/docx/validate-paragraph.d.ts.map +1 -1
  102. package/dist/index.cjs +169 -1
  103. package/dist/index.mjs +169 -1
  104. package/dist/math/index.cjs +2 -1
  105. package/dist/math/index.mjs +2 -1
  106. package/dist/opc/index.cjs +2 -1
  107. package/dist/opc/index.mjs +2 -1
  108. package/dist/pptx/automation/index.cjs +1572 -863
  109. package/dist/pptx/automation/index.d.ts +4 -3
  110. package/dist/pptx/automation/index.d.ts.map +1 -1
  111. package/dist/pptx/automation/index.mjs +1572 -863
  112. package/dist/pptx/chunks/color-ref-BM66NGFP.d.ts +42 -0
  113. package/dist/pptx/chunks/color-ref-BM66NGFP.d.ts.map +1 -0
  114. package/dist/pptx/chunks/{index-D0yGoLyw.d.ts → index-CcQTCBnT.d.ts} +63 -479
  115. package/dist/pptx/chunks/index-CcQTCBnT.d.ts.map +1 -0
  116. package/dist/pptx/chunks/{index-BtBj3VG1.d.ts → index-DHoPgFcH.d.ts} +529 -11
  117. package/dist/pptx/chunks/index-DHoPgFcH.d.ts.map +1 -0
  118. package/dist/pptx/chunks/{text-operations-GuisjlbR.d.ts → text-operations-BzdehTeY.d.ts} +50 -51
  119. package/dist/pptx/chunks/text-operations-BzdehTeY.d.ts.map +1 -0
  120. package/dist/pptx/cli/index.cjs +1204 -489
  121. package/dist/pptx/cli/index.d.ts +1 -1
  122. package/dist/pptx/cli/index.mjs +1204 -489
  123. package/dist/pptx/converter/index.cjs +8 -5
  124. package/dist/pptx/converter/index.d.ts +1 -1
  125. package/dist/pptx/converter/index.mjs +8 -5
  126. package/dist/pptx/index.cjs +1699 -989
  127. package/dist/pptx/index.d.ts +5 -4
  128. package/dist/pptx/index.mjs +1698 -990
  129. package/dist/pptx/ui/index.cjs +510 -0
  130. package/dist/pptx/ui/index.d.ts +80 -0
  131. package/dist/pptx/ui/index.d.ts.map +1 -0
  132. package/dist/pptx/ui/index.mjs +499 -0
  133. package/dist/visio/index.cjs +2 -1
  134. package/dist/visio/index.mjs +2 -1
  135. package/dist/visio/ui/contract.d.ts +33 -0
  136. package/dist/visio/ui/contract.d.ts.map +1 -0
  137. package/dist/visio/ui/demo-document.d.ts +4 -0
  138. package/dist/visio/ui/demo-document.d.ts.map +1 -0
  139. package/dist/visio/ui/diagnostics.d.ts +10 -0
  140. package/dist/visio/ui/diagnostics.d.ts.map +1 -0
  141. package/dist/visio/ui/document-history.d.ts +43 -0
  142. package/dist/visio/ui/document-history.d.ts.map +1 -0
  143. package/dist/visio/ui/document-text-search.d.ts +45 -0
  144. package/dist/visio/ui/document-text-search.d.ts.map +1 -0
  145. package/dist/visio/ui/edit-commands.d.ts +4 -0
  146. package/dist/visio/ui/edit-commands.d.ts.map +1 -0
  147. package/dist/visio/ui/edit-error.d.ts +5 -0
  148. package/dist/visio/ui/edit-error.d.ts.map +1 -0
  149. package/dist/visio/ui/foreign-vector-budget.d.ts +25 -0
  150. package/dist/visio/ui/foreign-vector-budget.d.ts.map +1 -0
  151. package/dist/visio/ui/index.cjs +1523 -0
  152. package/dist/visio/ui/index.d.ts +12 -0
  153. package/dist/visio/ui/index.d.ts.map +1 -0
  154. package/dist/visio/ui/index.mjs +1498 -0
  155. package/dist/visio/ui/scene-details.d.ts +8 -0
  156. package/dist/visio/ui/scene-details.d.ts.map +1 -0
  157. package/dist/visio/ui/scene-validation.d.ts +5 -0
  158. package/dist/visio/ui/scene-validation.d.ts.map +1 -0
  159. package/dist/visio/ui/snapshot-scene.d.ts +9 -0
  160. package/dist/visio/ui/snapshot-scene.d.ts.map +1 -0
  161. package/dist/xlsx/index.cjs +100 -98
  162. package/dist/xlsx/index.mjs +100 -98
  163. package/dist/xlsx/load/index.cjs +68 -66
  164. package/dist/xlsx/load/index.mjs +68 -66
  165. package/dist/xlsx/ui/backstage/templates.d.ts +16 -0
  166. package/dist/xlsx/ui/backstage/templates.d.ts.map +1 -0
  167. package/dist/xlsx/ui/commands/alignment.d.ts +4 -0
  168. package/dist/xlsx/ui/commands/alignment.d.ts.map +1 -0
  169. package/dist/xlsx/ui/commands/cells.d.ts +3 -0
  170. package/dist/xlsx/ui/commands/cells.d.ts.map +1 -0
  171. package/dist/xlsx/ui/commands/cf-presets.d.ts +15 -0
  172. package/dist/xlsx/ui/commands/cf-presets.d.ts.map +1 -0
  173. package/dist/xlsx/ui/commands/clipboard.d.ts +22 -0
  174. package/dist/xlsx/ui/commands/clipboard.d.ts.map +1 -0
  175. package/dist/xlsx/ui/commands/contextual.d.ts +13 -0
  176. package/dist/xlsx/ui/commands/contextual.d.ts.map +1 -0
  177. package/dist/xlsx/ui/commands/data.d.ts +3 -0
  178. package/dist/xlsx/ui/commands/data.d.ts.map +1 -0
  179. package/dist/xlsx/ui/commands/editing.d.ts +13 -0
  180. package/dist/xlsx/ui/commands/editing.d.ts.map +1 -0
  181. package/dist/xlsx/ui/commands/font.d.ts +21 -0
  182. package/dist/xlsx/ui/commands/font.d.ts.map +1 -0
  183. package/dist/xlsx/ui/commands/formulas.d.ts +15 -0
  184. package/dist/xlsx/ui/commands/formulas.d.ts.map +1 -0
  185. package/dist/xlsx/ui/commands/i18n/core-features.d.ts +3 -0
  186. package/dist/xlsx/ui/commands/i18n/core-features.d.ts.map +1 -0
  187. package/dist/xlsx/ui/commands/i18n/format-cells.d.ts +3 -0
  188. package/dist/xlsx/ui/commands/i18n/format-cells.d.ts.map +1 -0
  189. package/dist/xlsx/ui/commands/i18n/index.d.ts +4 -0
  190. package/dist/xlsx/ui/commands/i18n/index.d.ts.map +1 -0
  191. package/dist/xlsx/ui/commands/i18n/messages.d.ts +3 -0
  192. package/dist/xlsx/ui/commands/i18n/messages.d.ts.map +1 -0
  193. package/dist/xlsx/ui/commands/i18n/navigation.d.ts +3 -0
  194. package/dist/xlsx/ui/commands/i18n/navigation.d.ts.map +1 -0
  195. package/dist/xlsx/ui/commands/i18n/ribbon-home.d.ts +3 -0
  196. package/dist/xlsx/ui/commands/i18n/ribbon-home.d.ts.map +1 -0
  197. package/dist/xlsx/ui/commands/i18n/ribbon-tabs.d.ts +3 -0
  198. package/dist/xlsx/ui/commands/i18n/ribbon-tabs.d.ts.map +1 -0
  199. package/dist/xlsx/ui/commands/i18n/rules.d.ts +3 -0
  200. package/dist/xlsx/ui/commands/i18n/rules.d.ts.map +1 -0
  201. package/dist/xlsx/ui/commands/i18n/tools.d.ts +3 -0
  202. package/dist/xlsx/ui/commands/i18n/tools.d.ts.map +1 -0
  203. package/dist/xlsx/ui/commands/i18n/types.d.ts +5 -0
  204. package/dist/xlsx/ui/commands/i18n/types.d.ts.map +1 -0
  205. package/dist/xlsx/ui/commands/icons.d.ts +4 -0
  206. package/dist/xlsx/ui/commands/icons.d.ts.map +1 -0
  207. package/dist/xlsx/ui/commands/number.d.ts +11 -0
  208. package/dist/xlsx/ui/commands/number.d.ts.map +1 -0
  209. package/dist/xlsx/ui/commands/page-layout.d.ts +10 -0
  210. package/dist/xlsx/ui/commands/page-layout.d.ts.map +1 -0
  211. package/dist/xlsx/ui/commands/select-special.d.ts +12 -0
  212. package/dist/xlsx/ui/commands/select-special.d.ts.map +1 -0
  213. package/dist/xlsx/ui/commands/sort-filter.d.ts +3 -0
  214. package/dist/xlsx/ui/commands/sort-filter.d.ts.map +1 -0
  215. package/dist/xlsx/ui/commands/style-presets.d.ts +21 -0
  216. package/dist/xlsx/ui/commands/style-presets.d.ts.map +1 -0
  217. package/dist/xlsx/ui/commands/util.d.ts +59 -0
  218. package/dist/xlsx/ui/commands/util.d.ts.map +1 -0
  219. package/dist/xlsx/ui/commands.d.ts +36 -0
  220. package/dist/xlsx/ui/commands.d.ts.map +1 -0
  221. package/dist/xlsx/ui/context-menu/items.d.ts +36 -0
  222. package/dist/xlsx/ui/context-menu/items.d.ts.map +1 -0
  223. package/dist/xlsx/ui/context.d.ts +65 -0
  224. package/dist/xlsx/ui/context.d.ts.map +1 -0
  225. package/dist/xlsx/ui/dialogs/format-cells/number-categories.d.ts +28 -0
  226. package/dist/xlsx/ui/dialogs/format-cells/number-categories.d.ts.map +1 -0
  227. package/dist/xlsx/ui/dialogs/format-cells/types.d.ts +40 -0
  228. package/dist/xlsx/ui/dialogs/format-cells/types.d.ts.map +1 -0
  229. package/dist/xlsx/ui/dialogs/insert-chart-model.d.ts +9 -0
  230. package/dist/xlsx/ui/dialogs/insert-chart-model.d.ts.map +1 -0
  231. package/dist/xlsx/ui/dialogs.d.ts +9 -0
  232. package/dist/xlsx/ui/dialogs.d.ts.map +1 -0
  233. package/dist/xlsx/ui/dirty-state.d.ts +9 -0
  234. package/dist/xlsx/ui/dirty-state.d.ts.map +1 -0
  235. package/dist/xlsx/ui/formula-bar/name-resolve.d.ts +23 -0
  236. package/dist/xlsx/ui/formula-bar/name-resolve.d.ts.map +1 -0
  237. package/dist/xlsx/ui/grid/cell-items.d.ts +42 -0
  238. package/dist/xlsx/ui/grid/cell-items.d.ts.map +1 -0
  239. package/dist/xlsx/ui/grid/cell-paint.d.ts +26 -0
  240. package/dist/xlsx/ui/grid/cell-paint.d.ts.map +1 -0
  241. package/dist/xlsx/ui/grid/edit-bridge.d.ts +47 -0
  242. package/dist/xlsx/ui/grid/edit-bridge.d.ts.map +1 -0
  243. package/dist/xlsx/ui/grid/geometry.d.ts +76 -0
  244. package/dist/xlsx/ui/grid/geometry.d.ts.map +1 -0
  245. package/dist/xlsx/ui/grid/icon-sets.d.ts +3 -0
  246. package/dist/xlsx/ui/grid/icon-sets.d.ts.map +1 -0
  247. package/dist/xlsx/ui/grid/number-fit.d.ts +3 -0
  248. package/dist/xlsx/ui/grid/number-fit.d.ts.map +1 -0
  249. package/dist/xlsx/ui/grid/selection-ops.d.ts +32 -0
  250. package/dist/xlsx/ui/grid/selection-ops.d.ts.map +1 -0
  251. package/dist/xlsx/ui/grid/view-cache.d.ts +15 -0
  252. package/dist/xlsx/ui/grid/view-cache.d.ts.map +1 -0
  253. package/dist/xlsx/ui/index.cjs +28484 -0
  254. package/dist/xlsx/ui/index.d.ts +56 -0
  255. package/dist/xlsx/ui/index.d.ts.map +1 -0
  256. package/dist/xlsx/ui/index.mjs +28290 -0
  257. package/dist/xlsx/ui/locales/de/commands.d.ts +2 -0
  258. package/dist/xlsx/ui/locales/de/commands.d.ts.map +1 -0
  259. package/dist/xlsx/ui/locales/de/grid.d.ts +2 -0
  260. package/dist/xlsx/ui/locales/de/grid.d.ts.map +1 -0
  261. package/dist/xlsx/ui/locales/de/index.d.ts +2 -0
  262. package/dist/xlsx/ui/locales/de/index.d.ts.map +1 -0
  263. package/dist/xlsx/ui/locales/de/shell.d.ts +2 -0
  264. package/dist/xlsx/ui/locales/de/shell.d.ts.map +1 -0
  265. package/dist/xlsx/ui/locales/en/commands.d.ts +2 -0
  266. package/dist/xlsx/ui/locales/en/commands.d.ts.map +1 -0
  267. package/dist/xlsx/ui/locales/en/grid.d.ts +2 -0
  268. package/dist/xlsx/ui/locales/en/grid.d.ts.map +1 -0
  269. package/dist/xlsx/ui/locales/en/index.d.ts +2 -0
  270. package/dist/xlsx/ui/locales/en/index.d.ts.map +1 -0
  271. package/dist/xlsx/ui/locales/en/shell.d.ts +2 -0
  272. package/dist/xlsx/ui/locales/en/shell.d.ts.map +1 -0
  273. package/dist/xlsx/ui/locales/es/commands.d.ts +2 -0
  274. package/dist/xlsx/ui/locales/es/commands.d.ts.map +1 -0
  275. package/dist/xlsx/ui/locales/es/grid.d.ts +2 -0
  276. package/dist/xlsx/ui/locales/es/grid.d.ts.map +1 -0
  277. package/dist/xlsx/ui/locales/es/index.d.ts +2 -0
  278. package/dist/xlsx/ui/locales/es/index.d.ts.map +1 -0
  279. package/dist/xlsx/ui/locales/es/shell.d.ts +2 -0
  280. package/dist/xlsx/ui/locales/es/shell.d.ts.map +1 -0
  281. package/dist/xlsx/ui/locales/fr/commands.d.ts +2 -0
  282. package/dist/xlsx/ui/locales/fr/commands.d.ts.map +1 -0
  283. package/dist/xlsx/ui/locales/fr/grid.d.ts +2 -0
  284. package/dist/xlsx/ui/locales/fr/grid.d.ts.map +1 -0
  285. package/dist/xlsx/ui/locales/fr/index.d.ts +2 -0
  286. package/dist/xlsx/ui/locales/fr/index.d.ts.map +1 -0
  287. package/dist/xlsx/ui/locales/fr/shell.d.ts +2 -0
  288. package/dist/xlsx/ui/locales/fr/shell.d.ts.map +1 -0
  289. package/dist/xlsx/ui/locales/merge.d.ts +7 -0
  290. package/dist/xlsx/ui/locales/merge.d.ts.map +1 -0
  291. package/dist/xlsx/ui/locales/zh-CN/commands.d.ts +2 -0
  292. package/dist/xlsx/ui/locales/zh-CN/commands.d.ts.map +1 -0
  293. package/dist/xlsx/ui/locales/zh-CN/grid.d.ts +2 -0
  294. package/dist/xlsx/ui/locales/zh-CN/grid.d.ts.map +1 -0
  295. package/dist/xlsx/ui/locales/zh-CN/index.d.ts +2 -0
  296. package/dist/xlsx/ui/locales/zh-CN/index.d.ts.map +1 -0
  297. package/dist/xlsx/ui/locales/zh-CN/shell.d.ts +2 -0
  298. package/dist/xlsx/ui/locales/zh-CN/shell.d.ts.map +1 -0
  299. package/dist/xlsx/ui/localization.d.ts +23 -0
  300. package/dist/xlsx/ui/localization.d.ts.map +1 -0
  301. package/dist/xlsx/ui/ribbon/icon-paths.d.ts +9 -0
  302. package/dist/xlsx/ui/ribbon/icon-paths.d.ts.map +1 -0
  303. package/dist/xlsx/ui/ribbon/parts.d.ts +88 -0
  304. package/dist/xlsx/ui/ribbon/parts.d.ts.map +1 -0
  305. package/dist/xlsx/ui/ribbon/tab-api.d.ts +21 -0
  306. package/dist/xlsx/ui/ribbon/tab-api.d.ts.map +1 -0
  307. package/dist/xlsx/ui/ribbon/tabs/review-view.d.ts +5 -0
  308. package/dist/xlsx/ui/ribbon/tabs/review-view.d.ts.map +1 -0
  309. package/dist/xlsx/ui/ribbon/tabs/theme-palette.d.ts +8 -0
  310. package/dist/xlsx/ui/ribbon/tabs/theme-palette.d.ts.map +1 -0
  311. package/dist/xlsx/ui/ribbon/tell-me.d.ts +16 -0
  312. package/dist/xlsx/ui/ribbon/tell-me.d.ts.map +1 -0
  313. package/dist/xlsx/ui/selection.d.ts +34 -0
  314. package/dist/xlsx/ui/selection.d.ts.map +1 -0
  315. package/dist/xlsx/ui/theme/css-vars.d.ts +6 -0
  316. package/dist/xlsx/ui/theme/css-vars.d.ts.map +1 -0
  317. package/dist/xlsx/ui/theme/defaults.d.ts +6 -0
  318. package/dist/xlsx/ui/theme/defaults.d.ts.map +1 -0
  319. package/dist/xlsx/ui/theme/element.d.ts +9 -0
  320. package/dist/xlsx/ui/theme/element.d.ts.map +1 -0
  321. package/dist/xlsx/ui/theme/types.d.ts +54 -0
  322. package/dist/xlsx/ui/theme/types.d.ts.map +1 -0
  323. package/dist/xml/index.cjs +2 -1
  324. package/dist/xml/index.mjs +2 -1
  325. package/package.json +42 -4
  326. package/dist/pptx/chunks/index-BtBj3VG1.d.ts.map +0 -1
  327. package/dist/pptx/chunks/index-D0yGoLyw.d.ts.map +0 -1
  328. package/dist/pptx/chunks/text-operations-GuisjlbR.d.ts.map +0 -1
@@ -0,0 +1,97 @@
1
+ /**
2
+ * PowerPoint's automatic value-axis scale.
3
+ *
4
+ * A chart that declares no `c:min` / `c:max` / `c:majorUnit` leaves the bounds
5
+ * to the application, and PowerPoint does NOT simply run the axis to the largest
6
+ * data point. It anchors the axis at zero, pads the data, then rounds out to a
7
+ * round number and labels it in round steps. The reporter's deck (issue #132)
8
+ * shows the difference plainly: a percentage chart whose bars top out at 52%
9
+ * gets `0% 20% 40% 60%` from PowerPoint and got `0% 10% 21% 31% 42% 52%` here,
10
+ * because the axis ran to the data maximum and was then divided into five.
11
+ *
12
+ * The rules, from Microsoft's documented automatic-scaling behaviour:
13
+ *
14
+ * - **Zero anchor.** With all-positive data, the axis starts at zero unless the
15
+ * smallest value is at least 5/6 of the largest, in which case the data
16
+ * occupies a narrow band high up and a zero-anchored axis would flatten it.
17
+ * All-negative data mirrors this, ending at zero.
18
+ * - **Headroom.** The far end is pushed out by 5% of the data span so the
19
+ * tallest bar does not touch the top of the plot.
20
+ * - **Round steps.** The major unit is the first "nice" number (1, 2, 2.5 or 5
21
+ * times a power of ten) at or above `span / targetIntervals`, and the bounds
22
+ * are then snapped outwards to whole multiples of it.
23
+ *
24
+ * The snap is what makes the interval count differ from `targetIntervals`:
25
+ * rounding 0.544 up to a multiple of 0.2 lands on 0.6, which is three steps, not
26
+ * four. That is the intent, and it is why PowerPoint's axes read in round
27
+ * numbers while an evenly-divided one does not.
28
+ */
29
+ /** A resolved automatic axis scale. */
30
+ export interface NiceAxisBounds {
31
+ min: number;
32
+ max: number;
33
+ /** Step between major gridlines; `max - min` is always a whole multiple. */
34
+ majorUnit: number;
35
+ }
36
+ /**
37
+ * How many gridline intervals PowerPoint's automatic value-axis scale aims
38
+ * for, given the chart's plot-area height in the "px" unit `computePlotLayout`
39
+ * returns (96 px/inch; see `PX_PER_POINT` above).
40
+ *
41
+ * This is NOT a universal constant (see this module's original doc comment,
42
+ * which admitted as much: "matches the axes PowerPoint draws for a chart of
43
+ * ORDINARY height"): a short chart gets fewer, coarser gridlines than a tall
44
+ * one, up to a point, because PowerPoint only has room to label so many
45
+ * without the axis text crowding.
46
+ *
47
+ * Measured via PowerPoint COM automation (`New-Object -ComObject
48
+ * PowerPoint.Application`, `Shapes.AddChart2`, reading back
49
+ * `chart.Axes(2).MinimumScale/.MaximumScale/.MajorUnit`): building a fresh
50
+ * clustered-column chart at increasing shape heights with the SAME 8-point,
51
+ * single-category data (values 1.2-3.2, the exact case reported against this
52
+ * engine, which this engine rendered 0-4 while PowerPoint drew 0-3.5):
53
+ *
54
+ * | chart height | plot height | PowerPoint axis | gridlines |
55
+ * |--------------|-------------|------------------|-----------|
56
+ * | 100pt | ~33pt | 0 to 5, unit 5 | 1 |
57
+ * | 150pt | ~83pt | 0 to 4, unit 1 | 4 |
58
+ * | 200pt | ~133pt | 0 to 3.5, unit 0.5 | 7 |
59
+ * | 300pt | ~233pt | 0 to 3.5, unit 0.5 | 7 |
60
+ * | 1000pt | ~933pt | 0 to 3.5, unit 0.5 | 7 (unchanged) |
61
+ *
62
+ * Cross-checked against two more datasets (0-52 and 0-9) at the same set of
63
+ * heights to separate "the target interval count" from "which nice-number
64
+ * bucket a particular span happens to round into": PowerPoint never asked for
65
+ * more than about 10 intervals even at a 1000pt-tall chart, it only asks for
66
+ * FEWER on a plot area too short to fit that many labels. That saturation
67
+ * (not a straight line) is why this is clamped at the top, not just scaled.
68
+ *
69
+ * Modelled as one gridline interval per ~20pt of plot height (roughly one
70
+ * axis-label line plus padding), clamped to `[1, 10]`. This will not be exact
71
+ * for every data range: the actual PowerPoint algorithm also nudges the count
72
+ * by how the span happens to snap to a nice number (see the module doc
73
+ * comment), which this simplified model does not attempt to reproduce. It is
74
+ * a large improvement over hard-coding the short-chart answer (4) for every
75
+ * chart regardless of size, which is the bug this was added to fix.
76
+ */
77
+ export declare function axisTargetIntervals(plotHeightPx: number): number;
78
+ /** The smallest nice step at or above `value`. */
79
+ export declare function niceAxisStep(value: number): number;
80
+ /**
81
+ * Resolve the automatic bounds and major unit for a value axis.
82
+ *
83
+ * @param dataMin Smallest plotted value.
84
+ * @param dataMax Largest plotted value.
85
+ * @param targetIntervals Roughly how many gridline steps to aim for. The snap to
86
+ * a round unit means the result is usually one fewer. Defaults to 4 only
87
+ * when the caller has no idea how tall the chart's plot area is; pass
88
+ * {@link axisTargetIntervals}`(plotHeightPx)` instead whenever that height is
89
+ * known; see that function's doc comment for why a fixed constant undershot
90
+ * real PowerPoint on any chart of ordinary-or-larger size.
91
+ * @param headroom Fraction of the data span added beyond the far end. 2D
92
+ * charts get PowerPoint's 5%; a right-angle-axes 3D bar chart gets none
93
+ * (its axis on data topping out at exactly 5 ends at 5, see
94
+ * `chart-3d-oblique-layout.ts`).
95
+ */
96
+ export declare function niceValueAxisBounds(dataMin: number, dataMax: number, targetIntervals?: number, headroom?: number): NiceAxisBounds;
97
+ //# sourceMappingURL=axis-nice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axis-nice.d.ts","sourceRoot":"","sources":["../../src/chart/axis-nice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,uCAAuC;AACvC,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAC;CAClB;AAwCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAOhE;AAED,kDAAkD;AAClD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASlD;AAUD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,eAAe,SAA2B,EAC1C,QAAQ,SAAW,GACjB,cAAc,CA6ChB"}
@@ -0,0 +1,40 @@
1
+ /** The `cx:layoutPr/cx:binning` properties that drive numeric binning. */
2
+ export interface HistogramOptions {
3
+ binSize?: number | undefined;
4
+ binCount?: number | undefined;
5
+ intervalClosed?: 'l' | 'r' | undefined;
6
+ underflow?: number | 'auto' | undefined;
7
+ overflow?: number | 'auto' | undefined;
8
+ }
9
+ /** Formats a bin edge for a label. */
10
+ export type HistogramValueFormatter = (value: number) => string;
11
+ export interface HistogramBin {
12
+ value: number;
13
+ label: string;
14
+ sourceIndices: number[];
15
+ }
16
+ /**
17
+ * Excel/PowerPoint's automatic histogram bin count when the author specifies
18
+ * neither `binSize` nor `binCount` (Scott's normal reference rule: bin width
19
+ * = 3.49 * sample standard deviation * n^(-1/3), then the count needed to
20
+ * span the data at that width). COM-verified against charts-com.pptx slide
21
+ * 30 / chartEx5.xml: 76 raw values spanning 1-24 (sample sd ~4.898) gave
22
+ * PowerPoint's own 6 bins of width 4 each; Scott's rule on the same data
23
+ * gives a raw width of ~4.035, which needs exactly 6 bins to span the range,
24
+ * matching PowerPoint bin-for-bin. The previous `ceil(sqrt(n))` fallback
25
+ * gave 9 bins on the same data, visibly narrower than PowerPoint's own.
26
+ */
27
+ export declare function scottBinCount(values: ReadonlyArray<number>, min: number, max: number): number;
28
+ /** Bin raw observations according to ChartEx binning properties. */
29
+ export declare function computeHistogramBins(values: ReadonlyArray<number>, options: HistogramOptions, format?: HistogramValueFormatter): HistogramBin[];
30
+ /**
31
+ * Aggregate raw observations by their (repeated) category label instead of by
32
+ * numeric value range: `cx:layoutPr/cx:aggregation` (COM-verified against
33
+ * charts-com.pptx slide 31 / chartEx6.xml) means the source rows are
34
+ * CATEGORICAL, one row per occurrence, with the value column carrying a
35
+ * constant `1` so summing it counts occurrences per category. Summing
36
+ * (rather than literally counting rows) also does the right thing for a
37
+ * dataset that authors a real numeric measure per row instead of a bare `1`.
38
+ */
39
+ export declare function aggregateByCategory(values: ReadonlyArray<number>, rawCategories: ReadonlyArray<string>): HistogramBin[];
40
+ //# sourceMappingURL=histogram-binning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"histogram-binning.d.ts","sourceRoot":"","sources":["../../src/chart/histogram-binning.ts"],"names":[],"mappings":"AASA,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,cAAc,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,sCAAsC;AACtC,MAAM,MAAM,uBAAuB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AAEhE,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,EAAE,CAAC;CACxB;AAaD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAa7F;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,OAAO,EAAE,gBAAgB,EACzB,MAAM,GAAE,uBAAgC,GACtC,YAAY,EAAE,CA8EhB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,GAClC,YAAY,EAAE,CAUhB"}
@@ -219,11 +219,178 @@ function computeStackedSeriesPlots(seriesValues, catCount, percent) {
219
219
  });
220
220
  }
221
221
 
222
+ // src/chart/axis-nice.ts
223
+ var NICE_STEPS = [1, 2, 2.5, 5, 10];
224
+ var HEADROOM = 0.05;
225
+ var POINTS_PER_GRIDLINE = 20;
226
+ var MIN_TARGET_INTERVALS = 1;
227
+ var MAX_TARGET_INTERVALS = 10;
228
+ var PX_PER_POINT = 4 / 3;
229
+ var DEFAULT_TARGET_INTERVALS = 4;
230
+ var ZERO_ANCHOR_RATIO = 5 / 6;
231
+ function axisTargetIntervals(plotHeightPx) {
232
+ if (!Number.isFinite(plotHeightPx) || plotHeightPx <= 0) {
233
+ return DEFAULT_TARGET_INTERVALS;
234
+ }
235
+ const plotHeightPt = plotHeightPx / PX_PER_POINT;
236
+ const raw = Math.round(plotHeightPt / POINTS_PER_GRIDLINE);
237
+ return Math.min(MAX_TARGET_INTERVALS, Math.max(MIN_TARGET_INTERVALS, raw));
238
+ }
239
+ function niceAxisStep(value) {
240
+ if (!Number.isFinite(value) || value <= 0) {
241
+ return 1;
242
+ }
243
+ const exponent = Math.floor(Math.log10(value));
244
+ const power = 10 ** exponent;
245
+ const mantissa = value / power;
246
+ const step = NICE_STEPS.find((candidate) => mantissa <= candidate + 1e-12) ?? 10;
247
+ return step * power;
248
+ }
249
+ function snap(value, unit, direction) {
250
+ const scaled = value / unit;
251
+ const rounded = direction === "up" ? Math.ceil(scaled - 1e-9) : Math.floor(scaled + 1e-9);
252
+ return rounded * unit;
253
+ }
254
+ function niceValueAxisBounds(dataMin, dataMax, targetIntervals = DEFAULT_TARGET_INTERVALS, headroom = HEADROOM) {
255
+ if (!Number.isFinite(dataMin) || !Number.isFinite(dataMax)) {
256
+ return { min: 0, max: 1, majorUnit: 0.5 };
257
+ }
258
+ const low = Math.min(dataMin, dataMax);
259
+ const high = Math.max(dataMin, dataMax);
260
+ const intervals = Math.max(1, Math.round(targetIntervals));
261
+ if (low === high) {
262
+ if (low === 0) {
263
+ return { min: 0, max: 1, majorUnit: 1 / intervals };
264
+ }
265
+ const unit2 = niceAxisStep(Math.abs(low) / intervals);
266
+ return low > 0 ? { min: 0, max: snap(low, unit2, "up") || unit2, majorUnit: unit2 } : { min: snap(low, unit2, "down"), max: 0, majorUnit: unit2 };
267
+ }
268
+ const dataSpan = high - low;
269
+ const padding = dataSpan * headroom;
270
+ let paddedMin;
271
+ let paddedMax;
272
+ if (low >= 0) {
273
+ paddedMin = low < high * ZERO_ANCHOR_RATIO ? 0 : low - padding;
274
+ paddedMax = high + padding;
275
+ } else if (high <= 0) {
276
+ paddedMax = high > low * ZERO_ANCHOR_RATIO ? 0 : high + padding;
277
+ paddedMin = low - padding;
278
+ } else {
279
+ paddedMin = low - padding;
280
+ paddedMax = high + padding;
281
+ }
282
+ const unit = niceAxisStep((paddedMax - paddedMin) / intervals);
283
+ const min = paddedMin === 0 ? 0 : snap(paddedMin, unit, "down");
284
+ let max = paddedMax === 0 ? 0 : snap(paddedMax, unit, "up");
285
+ if (max <= min) {
286
+ max = min + unit;
287
+ }
288
+ return { min, max, majorUnit: unit };
289
+ }
290
+
291
+ // src/chart/histogram-binning.ts
292
+ function binLabel(lower, upper, closed, format) {
293
+ return closed === "r" ? `(${format(lower)}, ${format(upper)}]` : `[${format(lower)}, ${format(upper)})`;
294
+ }
295
+ function scottBinCount(values, min, max) {
296
+ if (values.length < 2 || max <= min) {
297
+ return 1;
298
+ }
299
+ const mean = values.reduce((sum, value) => sum + value, 0) / values.length;
300
+ const variance = values.reduce((sum, value) => sum + (value - mean) ** 2, 0) / (values.length - 1);
301
+ const sd = Math.sqrt(variance);
302
+ if (!(sd > 0)) {
303
+ return 1;
304
+ }
305
+ const width = 3.49 * sd * values.length ** (-1 / 3);
306
+ return Math.max(1, Math.ceil((max - min) / width));
307
+ }
308
+ function computeHistogramBins(values, options, format = String) {
309
+ const closed = options.intervalClosed ?? "l";
310
+ const finite = values.map((value, sourceIndex) => ({ value, sourceIndex })).filter((item) => Number.isFinite(item.value));
311
+ if (finite.length === 0) {
312
+ return [];
313
+ }
314
+ const underflow = typeof options.underflow === "number" ? options.underflow : void 0;
315
+ const overflow = typeof options.overflow === "number" ? options.overflow : void 0;
316
+ const under = underflow === void 0 ? [] : finite.filter(
317
+ (item) => closed === "r" ? item.value <= underflow : item.value < underflow
318
+ );
319
+ const over = overflow === void 0 ? [] : finite.filter((item) => closed === "l" ? item.value >= overflow : item.value > overflow);
320
+ const regular = finite.filter((item) => !under.includes(item) && !over.includes(item));
321
+ const result = [];
322
+ if (underflow !== void 0) {
323
+ result.push({
324
+ value: under.length,
325
+ label: `${closed === "r" ? "\u2264" : "<"} ${format(underflow)}`,
326
+ sourceIndices: under.map((item) => item.sourceIndex)
327
+ });
328
+ }
329
+ if (regular.length > 0) {
330
+ const min = Math.min(...regular.map((item) => item.value));
331
+ const max = Math.max(...regular.map((item) => item.value));
332
+ const requestedSize = options.binSize && options.binSize > 0 ? options.binSize : void 0;
333
+ const requestedCount = options.binCount && options.binCount > 0 ? options.binCount : void 0;
334
+ const start = requestedSize ? Math.floor(min / requestedSize) * requestedSize : min;
335
+ const count = requestedSize ? Math.max(
336
+ closed === "l" ? Math.floor((max - start) / requestedSize) + 1 : Math.ceil((max - start) / requestedSize),
337
+ 1
338
+ ) : Math.max(
339
+ requestedCount ?? scottBinCount(
340
+ regular.map((item) => item.value),
341
+ min,
342
+ max
343
+ ),
344
+ 1
345
+ );
346
+ const width = requestedSize ?? Math.max((max - start) / count, 1);
347
+ const bins = Array.from({ length: count }, (_, index) => ({
348
+ value: 0,
349
+ label: binLabel(start + index * width, start + (index + 1) * width, closed, format),
350
+ sourceIndices: []
351
+ }));
352
+ for (const item of regular) {
353
+ const rawIndex = closed === "r" ? Math.ceil((item.value - start) / width) - 1 : Math.floor((item.value - start) / width);
354
+ const index = Math.max(0, Math.min(rawIndex, bins.length - 1));
355
+ const bin = bins[index];
356
+ if (!bin) continue;
357
+ bin.value += 1;
358
+ bin.sourceIndices.push(item.sourceIndex);
359
+ }
360
+ result.push(...bins);
361
+ }
362
+ if (overflow !== void 0) {
363
+ result.push({
364
+ value: over.length,
365
+ label: `${closed === "l" ? "\u2265" : ">"} ${format(overflow)}`,
366
+ sourceIndices: over.map((item) => item.sourceIndex)
367
+ });
368
+ }
369
+ return result;
370
+ }
371
+ function aggregateByCategory(values, rawCategories) {
372
+ const { uniqueCategories, rowIndexesByCategory } = groupRowsByCategory(rawCategories);
373
+ return uniqueCategories.map((label) => {
374
+ const rows = rowIndexesByCategory.get(label) ?? [];
375
+ return {
376
+ value: rows.reduce((sum, row) => sum + (values[row] ?? 0), 0),
377
+ label,
378
+ sourceIndices: rows
379
+ };
380
+ });
381
+ }
382
+
383
+ exports.aggregateByCategory = aggregateByCategory;
384
+ exports.axisTargetIntervals = axisTargetIntervals;
222
385
  exports.computeBoxStats = computeBoxStats;
386
+ exports.computeHistogramBins = computeHistogramBins;
223
387
  exports.computeLinearRegression = computeLinearRegression;
224
388
  exports.computeRSquared = computeRSquared;
225
389
  exports.computeStackedSeriesPlots = computeStackedSeriesPlots;
226
390
  exports.fitPolynomial = fitPolynomial;
227
391
  exports.groupRowsByCategory = groupRowsByCategory;
392
+ exports.niceAxisStep = niceAxisStep;
393
+ exports.niceValueAxisBounds = niceValueAxisBounds;
228
394
  exports.resolveBlankDisplay = resolveBlankDisplay;
395
+ exports.scottBinCount = scottBinCount;
229
396
  exports.visibleRuns = visibleRuns;
@@ -3,4 +3,6 @@ export * from './regression.js';
3
3
  export * from './box-stats.js';
4
4
  export * from './blank-display.js';
5
5
  export * from './stacked-series.js';
6
+ export * from './axis-nice.js';
7
+ export * from './histogram-binning.js';
6
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chart/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chart/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC"}
@@ -217,4 +217,165 @@ function computeStackedSeriesPlots(seriesValues, catCount, percent) {
217
217
  });
218
218
  }
219
219
 
220
- export { computeBoxStats, computeLinearRegression, computeRSquared, computeStackedSeriesPlots, fitPolynomial, groupRowsByCategory, resolveBlankDisplay, visibleRuns };
220
+ // src/chart/axis-nice.ts
221
+ var NICE_STEPS = [1, 2, 2.5, 5, 10];
222
+ var HEADROOM = 0.05;
223
+ var POINTS_PER_GRIDLINE = 20;
224
+ var MIN_TARGET_INTERVALS = 1;
225
+ var MAX_TARGET_INTERVALS = 10;
226
+ var PX_PER_POINT = 4 / 3;
227
+ var DEFAULT_TARGET_INTERVALS = 4;
228
+ var ZERO_ANCHOR_RATIO = 5 / 6;
229
+ function axisTargetIntervals(plotHeightPx) {
230
+ if (!Number.isFinite(plotHeightPx) || plotHeightPx <= 0) {
231
+ return DEFAULT_TARGET_INTERVALS;
232
+ }
233
+ const plotHeightPt = plotHeightPx / PX_PER_POINT;
234
+ const raw = Math.round(plotHeightPt / POINTS_PER_GRIDLINE);
235
+ return Math.min(MAX_TARGET_INTERVALS, Math.max(MIN_TARGET_INTERVALS, raw));
236
+ }
237
+ function niceAxisStep(value) {
238
+ if (!Number.isFinite(value) || value <= 0) {
239
+ return 1;
240
+ }
241
+ const exponent = Math.floor(Math.log10(value));
242
+ const power = 10 ** exponent;
243
+ const mantissa = value / power;
244
+ const step = NICE_STEPS.find((candidate) => mantissa <= candidate + 1e-12) ?? 10;
245
+ return step * power;
246
+ }
247
+ function snap(value, unit, direction) {
248
+ const scaled = value / unit;
249
+ const rounded = direction === "up" ? Math.ceil(scaled - 1e-9) : Math.floor(scaled + 1e-9);
250
+ return rounded * unit;
251
+ }
252
+ function niceValueAxisBounds(dataMin, dataMax, targetIntervals = DEFAULT_TARGET_INTERVALS, headroom = HEADROOM) {
253
+ if (!Number.isFinite(dataMin) || !Number.isFinite(dataMax)) {
254
+ return { min: 0, max: 1, majorUnit: 0.5 };
255
+ }
256
+ const low = Math.min(dataMin, dataMax);
257
+ const high = Math.max(dataMin, dataMax);
258
+ const intervals = Math.max(1, Math.round(targetIntervals));
259
+ if (low === high) {
260
+ if (low === 0) {
261
+ return { min: 0, max: 1, majorUnit: 1 / intervals };
262
+ }
263
+ const unit2 = niceAxisStep(Math.abs(low) / intervals);
264
+ return low > 0 ? { min: 0, max: snap(low, unit2, "up") || unit2, majorUnit: unit2 } : { min: snap(low, unit2, "down"), max: 0, majorUnit: unit2 };
265
+ }
266
+ const dataSpan = high - low;
267
+ const padding = dataSpan * headroom;
268
+ let paddedMin;
269
+ let paddedMax;
270
+ if (low >= 0) {
271
+ paddedMin = low < high * ZERO_ANCHOR_RATIO ? 0 : low - padding;
272
+ paddedMax = high + padding;
273
+ } else if (high <= 0) {
274
+ paddedMax = high > low * ZERO_ANCHOR_RATIO ? 0 : high + padding;
275
+ paddedMin = low - padding;
276
+ } else {
277
+ paddedMin = low - padding;
278
+ paddedMax = high + padding;
279
+ }
280
+ const unit = niceAxisStep((paddedMax - paddedMin) / intervals);
281
+ const min = paddedMin === 0 ? 0 : snap(paddedMin, unit, "down");
282
+ let max = paddedMax === 0 ? 0 : snap(paddedMax, unit, "up");
283
+ if (max <= min) {
284
+ max = min + unit;
285
+ }
286
+ return { min, max, majorUnit: unit };
287
+ }
288
+
289
+ // src/chart/histogram-binning.ts
290
+ function binLabel(lower, upper, closed, format) {
291
+ return closed === "r" ? `(${format(lower)}, ${format(upper)}]` : `[${format(lower)}, ${format(upper)})`;
292
+ }
293
+ function scottBinCount(values, min, max) {
294
+ if (values.length < 2 || max <= min) {
295
+ return 1;
296
+ }
297
+ const mean = values.reduce((sum, value) => sum + value, 0) / values.length;
298
+ const variance = values.reduce((sum, value) => sum + (value - mean) ** 2, 0) / (values.length - 1);
299
+ const sd = Math.sqrt(variance);
300
+ if (!(sd > 0)) {
301
+ return 1;
302
+ }
303
+ const width = 3.49 * sd * values.length ** (-1 / 3);
304
+ return Math.max(1, Math.ceil((max - min) / width));
305
+ }
306
+ function computeHistogramBins(values, options, format = String) {
307
+ const closed = options.intervalClosed ?? "l";
308
+ const finite = values.map((value, sourceIndex) => ({ value, sourceIndex })).filter((item) => Number.isFinite(item.value));
309
+ if (finite.length === 0) {
310
+ return [];
311
+ }
312
+ const underflow = typeof options.underflow === "number" ? options.underflow : void 0;
313
+ const overflow = typeof options.overflow === "number" ? options.overflow : void 0;
314
+ const under = underflow === void 0 ? [] : finite.filter(
315
+ (item) => closed === "r" ? item.value <= underflow : item.value < underflow
316
+ );
317
+ const over = overflow === void 0 ? [] : finite.filter((item) => closed === "l" ? item.value >= overflow : item.value > overflow);
318
+ const regular = finite.filter((item) => !under.includes(item) && !over.includes(item));
319
+ const result = [];
320
+ if (underflow !== void 0) {
321
+ result.push({
322
+ value: under.length,
323
+ label: `${closed === "r" ? "\u2264" : "<"} ${format(underflow)}`,
324
+ sourceIndices: under.map((item) => item.sourceIndex)
325
+ });
326
+ }
327
+ if (regular.length > 0) {
328
+ const min = Math.min(...regular.map((item) => item.value));
329
+ const max = Math.max(...regular.map((item) => item.value));
330
+ const requestedSize = options.binSize && options.binSize > 0 ? options.binSize : void 0;
331
+ const requestedCount = options.binCount && options.binCount > 0 ? options.binCount : void 0;
332
+ const start = requestedSize ? Math.floor(min / requestedSize) * requestedSize : min;
333
+ const count = requestedSize ? Math.max(
334
+ closed === "l" ? Math.floor((max - start) / requestedSize) + 1 : Math.ceil((max - start) / requestedSize),
335
+ 1
336
+ ) : Math.max(
337
+ requestedCount ?? scottBinCount(
338
+ regular.map((item) => item.value),
339
+ min,
340
+ max
341
+ ),
342
+ 1
343
+ );
344
+ const width = requestedSize ?? Math.max((max - start) / count, 1);
345
+ const bins = Array.from({ length: count }, (_, index) => ({
346
+ value: 0,
347
+ label: binLabel(start + index * width, start + (index + 1) * width, closed, format),
348
+ sourceIndices: []
349
+ }));
350
+ for (const item of regular) {
351
+ const rawIndex = closed === "r" ? Math.ceil((item.value - start) / width) - 1 : Math.floor((item.value - start) / width);
352
+ const index = Math.max(0, Math.min(rawIndex, bins.length - 1));
353
+ const bin = bins[index];
354
+ if (!bin) continue;
355
+ bin.value += 1;
356
+ bin.sourceIndices.push(item.sourceIndex);
357
+ }
358
+ result.push(...bins);
359
+ }
360
+ if (overflow !== void 0) {
361
+ result.push({
362
+ value: over.length,
363
+ label: `${closed === "l" ? "\u2265" : ">"} ${format(overflow)}`,
364
+ sourceIndices: over.map((item) => item.sourceIndex)
365
+ });
366
+ }
367
+ return result;
368
+ }
369
+ function aggregateByCategory(values, rawCategories) {
370
+ const { uniqueCategories, rowIndexesByCategory } = groupRowsByCategory(rawCategories);
371
+ return uniqueCategories.map((label) => {
372
+ const rows = rowIndexesByCategory.get(label) ?? [];
373
+ return {
374
+ value: rows.reduce((sum, row) => sum + (values[row] ?? 0), 0),
375
+ label,
376
+ sourceIndices: rows
377
+ };
378
+ });
379
+ }
380
+
381
+ export { aggregateByCategory, axisTargetIntervals, computeBoxStats, computeHistogramBins, computeLinearRegression, computeRSquared, computeStackedSeriesPlots, fitPolynomial, groupRowsByCategory, niceAxisStep, niceValueAxisBounds, resolveBlankDisplay, scottBinCount, visibleRuns };
@@ -151,7 +151,8 @@ function parseXml(xml, options = {}) {
151
151
  }).parseFromString(xml, "application/xml");
152
152
  } catch (error) {
153
153
  throw new Error(
154
- `Invalid ${label} XML: ${error instanceof Error ? error.message : String(error)}`
154
+ `Invalid ${label} XML: ${error instanceof Error ? error.message : String(error)}`,
155
+ { cause: error }
155
156
  );
156
157
  }
157
158
  if (parseError || !parsed.documentElement)
@@ -149,7 +149,8 @@ function parseXml(xml, options = {}) {
149
149
  }).parseFromString(xml, "application/xml");
150
150
  } catch (error) {
151
151
  throw new Error(
152
- `Invalid ${label} XML: ${error instanceof Error ? error.message : String(error)}`
152
+ `Invalid ${label} XML: ${error instanceof Error ? error.message : String(error)}`,
153
+ { cause: error }
153
154
  );
154
155
  }
155
156
  if (parseError || !parsed.documentElement)
@@ -0,0 +1,11 @@
1
+ import { type SignedTwips, type Twips } from '../units/units.js';
2
+ import type { Paragraph } from './model-paragraph.js';
3
+ /** A non-negative twip attribute as `Twips`, or undefined when absent or not a valid length. */
4
+ export declare function twipsAttr(value: unknown): Twips | undefined;
5
+ /** A possibly negative twip attribute as `SignedTwips`, or undefined when absent or not finite. */
6
+ export declare function signedTwipsAttr(value: unknown): SignedTwips | undefined;
7
+ type ParagraphTwips = Pick<Paragraph, 'spacingBeforeTwips' | 'spacingAfterTwips' | 'lineSpacingTwips' | 'indentLeftTwips' | 'indentRightTwips' | 'indentStartTwips' | 'indentEndTwips' | 'firstLineTwips' | 'hangingTwips'>;
8
+ /** The paragraph's direct spacing and indent attributes as model fields; absent ones are omitted. */
9
+ export declare function paragraphTwipsFromAttrs(attrs: Record<string, unknown>): ParagraphTwips;
10
+ export {};
11
+ //# sourceMappingURL=attr-units.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attr-units.d.ts","sourceRoot":"","sources":["../../src/docx/attr-units.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,WAAW,EAAE,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKtD,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,CAI3D;AACD,mGAAmG;AACnG,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAEvE;AAED,KAAK,cAAc,GAAG,IAAI,CACzB,SAAS,EACP,oBAAoB,GACpB,mBAAmB,GACnB,kBAAkB,GAClB,iBAAiB,GACjB,kBAAkB,GAClB,kBAAkB,GAClB,gBAAgB,GAChB,gBAAgB,GAChB,cAAc,CAChB,CAAC;AACF,qGAAqG;AACrG,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAqBtF"}
@@ -1 +1 @@
1
- {"version":3,"file":"block-parser.d.ts","sourceRoot":"","sources":["../../src/docx/block-parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAY,KAAK,EAAsB,MAAM,YAAY,CAAC;AACxF,OAAO,EAON,KAAK,UAAU,EAEf,MAAM,UAAU,CAAC;AAKlB,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAsIjE,iBAAS,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CA0G/D;AAED,iBAAS,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,KAAK,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,UAAU,EACrB,QAAQ,SAAK,EACb,OAAO,CAAC,EAAE,cAAc,GACtB,KAAK,EAAE,CAcT;AAYD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"block-parser.d.ts","sourceRoot":"","sources":["../../src/docx/block-parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAY,KAAK,EAAW,MAAM,YAAY,CAAC;AAC7E,OAAO,EAMN,KAAK,UAAU,EACf,MAAM,UAAU,CAAC;AAIlB,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAsIjE,iBAAS,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CA0G/D;AAED,iBAAS,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,KAAK,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,UAAU,EACrB,QAAQ,SAAK,EACb,OAAO,CAAC,EAAE,cAAc,GACtB,KAAK,EAAE,CAcT;AAYD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type CaseMode = 'sentence' | 'lower' | 'upper' | 'title' | 'toggle';
2
+ /** Characters that make up a word, shared with the editor's caret-word lookup. */
3
+ export declare const WORD: RegExp;
4
+ /**
5
+ * Applies a Word "Change Case" mode to `text`. `atSentenceStart` says whether the text begins a
6
+ * sentence; it matters only for sentence case, which capitalises the first letter after `. ! ?`.
7
+ */
8
+ export declare function transformCase(text: string, mode: CaseMode, atSentenceStart?: boolean): string;
9
+ //# sourceMappingURL=case-transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"case-transform.d.ts","sourceRoot":"","sources":["../../src/docx/case-transform.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3E,kFAAkF;AAClF,eAAO,MAAM,IAAI,QAAoB,CAAC;AAOtC;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,UAAO,GAAG,MAAM,CAsB1F"}
@@ -37,7 +37,8 @@ function parseXml(xml, options = {}) {
37
37
  }).parseFromString(xml, "application/xml");
38
38
  } catch (error) {
39
39
  throw new Error(
40
- `Invalid ${label} XML: ${error instanceof Error ? error.message : String(error)}`
40
+ `Invalid ${label} XML: ${error instanceof Error ? error.message : String(error)}`,
41
+ { cause: error }
41
42
  );
42
43
  }
43
44
  if (parseError || !parsed.documentElement)
@@ -31,7 +31,8 @@ function parseXml(xml, options = {}) {
31
31
  }).parseFromString(xml, "application/xml");
32
32
  } catch (error) {
33
33
  throw new Error(
34
- `Invalid ${label} XML: ${error instanceof Error ? error.message : String(error)}`
34
+ `Invalid ${label} XML: ${error instanceof Error ? error.message : String(error)}`,
35
+ { cause: error }
35
36
  );
36
37
  }
37
38
  if (parseError || !parsed.documentElement)