@svgrid/enterprise 3.0.1 → 3.0.3

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 (445) hide show
  1. package/LICENSE +94 -24
  2. package/README.md +36 -4
  3. package/dist/SvAdvancedFilter.svelte +1 -1
  4. package/dist/SvAlertsManager.svelte +2 -1
  5. package/dist/SvBoard.svelte +2 -1
  6. package/dist/SvExportMenu.svelte +4 -1
  7. package/dist/SvExportMenu.svelte.d.ts +0 -13
  8. package/dist/SvExpressionEditor.svelte +3 -3
  9. package/dist/SvFormulaBar.svelte +680 -0
  10. package/dist/SvFormulaBar.svelte.d.ts +69 -0
  11. package/dist/SvGridAlerts.svelte +49 -9
  12. package/dist/SvGridBoard.svelte +13 -8
  13. package/dist/SvGridBulkEditDrawer.svelte +26 -2
  14. package/dist/SvGridEditPanel.svelte +3 -0
  15. package/dist/SvGridScheduler.svelte +69 -40
  16. package/dist/SvGridSelectionBar.svelte +10 -3
  17. package/dist/SvPivotDesigner.svelte +263 -54
  18. package/dist/SvPivotDesigner.svelte.d.ts +27 -20
  19. package/dist/SvRibbonIcon.svelte +46 -0
  20. package/dist/SvRibbonIcon.svelte.d.ts +17 -0
  21. package/dist/SvSchemaChart.svelte +4 -2
  22. package/dist/SvSheet.svelte +7914 -0
  23. package/dist/SvSheet.svelte.d.ts +215 -0
  24. package/dist/SvSheetChartSetup.svelte +151 -0
  25. package/dist/SvSheetChartSetup.svelte.d.ts +18 -0
  26. package/dist/SvSheetComment.svelte +283 -0
  27. package/dist/SvSheetComment.svelte.d.ts +22 -0
  28. package/dist/SvSheetConditionalFormat.svelte +159 -0
  29. package/dist/SvSheetConditionalFormat.svelte.d.ts +14 -0
  30. package/dist/SvSheetDataValidation.svelte +273 -0
  31. package/dist/SvSheetDataValidation.svelte.d.ts +14 -0
  32. package/dist/SvSheetEditRanges.svelte +217 -0
  33. package/dist/SvSheetEditRanges.svelte.d.ts +15 -0
  34. package/dist/SvSheetErrors.svelte +125 -0
  35. package/dist/SvSheetErrors.svelte.d.ts +20 -0
  36. package/dist/SvSheetEvaluate.svelte +133 -0
  37. package/dist/SvSheetEvaluate.svelte.d.ts +15 -0
  38. package/dist/SvSheetFilterMenu.svelte +320 -0
  39. package/dist/SvSheetFilterMenu.svelte.d.ts +22 -0
  40. package/dist/SvSheetFindReplace.svelte +132 -0
  41. package/dist/SvSheetFindReplace.svelte.d.ts +10 -0
  42. package/dist/SvSheetFormatCells.svelte +465 -0
  43. package/dist/SvSheetFormatCells.svelte.d.ts +17 -0
  44. package/dist/SvSheetGoalSeek.svelte +145 -0
  45. package/dist/SvSheetGoalSeek.svelte.d.ts +12 -0
  46. package/dist/SvSheetInsertFunction.svelte +149 -0
  47. package/dist/SvSheetInsertFunction.svelte.d.ts +8 -0
  48. package/dist/SvSheetIteration.svelte +81 -0
  49. package/dist/SvSheetIteration.svelte.d.ts +10 -0
  50. package/dist/SvSheetLink.svelte +99 -0
  51. package/dist/SvSheetLink.svelte.d.ts +17 -0
  52. package/dist/SvSheetListPicker.svelte +91 -0
  53. package/dist/SvSheetListPicker.svelte.d.ts +10 -0
  54. package/dist/SvSheetManageRules.svelte +187 -0
  55. package/dist/SvSheetManageRules.svelte.d.ts +16 -0
  56. package/dist/SvSheetNameManager.svelte +227 -0
  57. package/dist/SvSheetNameManager.svelte.d.ts +11 -0
  58. package/dist/SvSheetPageSetup.svelte +159 -0
  59. package/dist/SvSheetPageSetup.svelte.d.ts +13 -0
  60. package/dist/SvSheetPasteSpecial.svelte +107 -0
  61. package/dist/SvSheetPasteSpecial.svelte.d.ts +12 -0
  62. package/dist/SvSheetPivot.svelte +220 -0
  63. package/dist/SvSheetPivot.svelte.d.ts +21 -0
  64. package/dist/SvSheetProtectSheet.svelte +81 -0
  65. package/dist/SvSheetProtectSheet.svelte.d.ts +11 -0
  66. package/dist/SvSheetRemoveDuplicates.svelte +152 -0
  67. package/dist/SvSheetRemoveDuplicates.svelte.d.ts +12 -0
  68. package/dist/SvSheetRibbon.svelte +1254 -0
  69. package/dist/SvSheetRibbon.svelte.d.ts +34 -0
  70. package/dist/SvSheetSizeDialog.svelte +60 -0
  71. package/dist/SvSheetSizeDialog.svelte.d.ts +11 -0
  72. package/dist/SvSheetSort.svelte +218 -0
  73. package/dist/SvSheetSort.svelte.d.ts +28 -0
  74. package/dist/SvSheetSparklines.svelte +135 -0
  75. package/dist/SvSheetSparklines.svelte.d.ts +14 -0
  76. package/dist/SvSheetTable.svelte +160 -0
  77. package/dist/SvSheetTable.svelte.d.ts +24 -0
  78. package/dist/SvSheetTabs.svelte +571 -0
  79. package/dist/SvSheetTabs.svelte.d.ts +50 -0
  80. package/dist/SvSheetTabs.test-harness.svelte.d.ts +17 -0
  81. package/dist/SvSheetTabs.test-harness.svelte.js +22 -0
  82. package/dist/SvSheetTextToColumns.svelte +172 -0
  83. package/dist/SvSheetTextToColumns.svelte.d.ts +13 -0
  84. package/dist/SvSheetValidationAlert.svelte +85 -0
  85. package/dist/SvSheetValidationAlert.svelte.d.ts +15 -0
  86. package/dist/advanced-filter-enable.js +1 -1
  87. package/dist/alerts/alert-engine.d.ts +6 -0
  88. package/dist/alerts/alert-engine.js +21 -4
  89. package/dist/alerts/alert-formats.js +2 -0
  90. package/dist/alerts/alert-types.d.ts +1 -1
  91. package/dist/alerts.d.ts +1 -1
  92. package/dist/alerts.js +2 -2
  93. package/dist/board.js +2 -2
  94. package/dist/bulk-edit.d.ts +3 -1
  95. package/dist/bulk-edit.js +1 -1
  96. package/dist/cdn/svgrid-enterprise.svelte-external.js +43538 -6539
  97. package/dist/designer/assets/GridMenus-8gTNssgV.js +8 -0
  98. package/dist/designer/assets/SvChartMenu-BDoeqGz6.js +1 -0
  99. package/dist/designer/assets/SvChartMenu-BYO9cYdy.css +1 -0
  100. package/dist/designer/assets/SvDateRangeInput-BBRzrQeg.js +1 -0
  101. package/dist/designer/assets/SvDateTimePicker-DCPg7WGN.js +1 -0
  102. package/dist/designer/assets/SvGridCellEditor-DMoWJjEI.js +4 -0
  103. package/dist/designer/assets/SvGridChart-BgLuPO7I.css +1 -0
  104. package/dist/designer/assets/SvGridChart-Cy1ATrWh.js +3 -0
  105. package/dist/designer/assets/SvGridChartBuilder-08YWWeqY.css +1 -0
  106. package/dist/designer/assets/SvGridChartBuilder-eQ3mn0L9.js +1 -0
  107. package/dist/designer/assets/SvGridChartPanel-4Pc8y5yO.css +1 -0
  108. package/dist/designer/assets/SvGridChartPanel-CATdVc9X.js +4 -0
  109. package/dist/designer/assets/{SvGridChartView-DUc-1RUf.css → SvGridChartView-7msfnWZT.css} +1 -1
  110. package/dist/designer/assets/SvGridChartView-CmsZtCED.js +1 -0
  111. package/dist/designer/assets/SvGridDropdown-Cjz0H-fI.js +1 -0
  112. package/dist/designer/assets/SvListBox-BDS66lmZ.js +110 -0
  113. package/dist/designer/assets/SvMenuList-DJ47ba1h.css +1 -0
  114. package/dist/designer/assets/SvMenuList-Dgq2D5VN.js +1 -0
  115. package/dist/designer/assets/SvTabs-2mHC6oaz.js +1 -0
  116. package/dist/designer/assets/SvTabs-DKmwb5p1.css +1 -0
  117. package/dist/designer/assets/cell-formatting-BbubJTVz.js +1 -0
  118. package/dist/designer/assets/chart-Cn7MnNqA.js +1 -0
  119. package/dist/designer/assets/chart-export-B6bkQ3X8.js +11 -0
  120. package/dist/designer/assets/chart-export-pdf-BbA28-gt.js +11 -0
  121. package/dist/designer/assets/chart-panel-messages-Dz7PTIqT.js +1 -0
  122. package/dist/designer/assets/chart-summary-BD1qYB2R.js +1 -0
  123. package/dist/designer/assets/chart-trend-B8xr5LuD.js +1 -0
  124. package/dist/designer/assets/chart-validate-BMqM-qkF.js +1 -0
  125. package/dist/designer/assets/column-resize-BYDzR1Ve.js +1 -0
  126. package/dist/designer/assets/date-format-B8JbEtIG.js +1 -0
  127. package/dist/designer/assets/date-format-DKS-z0xS.css +1 -0
  128. package/dist/designer/assets/{dismissable-BO547MH9.js → dismissable-ChWRPkoa.js} +1 -1
  129. package/dist/designer/assets/editor-contract-Bpoa7A5g.js +1 -0
  130. package/dist/designer/assets/{export-format-D-eP4b2l.js → export-format-DGckmgKr.js} +1 -1
  131. package/dist/designer/assets/focus-trap-V2-6Fy9I.js +1 -0
  132. package/dist/designer/assets/{index-C_a9Cj8Y.js → index-D5bVbuzI.js} +318 -315
  133. package/dist/designer/assets/index-_JVFxt02.css +1 -0
  134. package/dist/designer/assets/list-option-BP_dWS66.js +1 -0
  135. package/dist/designer/assets/row-resize-BInFWCpr.js +1 -0
  136. package/dist/designer/assets/server-block-cache-CXJKkJpy.js +1 -0
  137. package/dist/designer/assets/src-CITpcm6b.js +1 -0
  138. package/dist/designer/assets/src-DUQ4xE3x.js +58 -0
  139. package/dist/designer/assets/validate-C3B8QKsM.js +1 -0
  140. package/dist/designer/index.html +29 -19
  141. package/dist/export-pdf.d.ts +164 -0
  142. package/dist/export-pdf.js +346 -15
  143. package/dist/export.js +25 -10
  144. package/dist/gantt/SvGridGantt.svelte +2890 -0
  145. package/dist/gantt/SvGridGantt.svelte.d.ts +30 -0
  146. package/dist/gantt/gantt-config.d.ts +73 -0
  147. package/dist/gantt/gantt-config.js +1 -0
  148. package/dist/gantt/gantt-critical-path.d.ts +67 -0
  149. package/dist/gantt/gantt-critical-path.js +207 -0
  150. package/dist/gantt/gantt-model.d.ts +257 -0
  151. package/dist/gantt/gantt-model.js +651 -0
  152. package/dist/gantt/gantt-resources.d.ts +59 -0
  153. package/dist/gantt/gantt-resources.js +71 -0
  154. package/dist/gantt/gantt.d.ts +7 -0
  155. package/dist/gantt/gantt.js +36 -0
  156. package/dist/gantt/index.d.ts +15 -0
  157. package/dist/gantt/index.js +22 -0
  158. package/dist/gantt/timeline-arrows.d.ts +102 -0
  159. package/dist/gantt/timeline-arrows.js +181 -0
  160. package/dist/import.d.ts +2 -2
  161. package/dist/import.js +1 -1
  162. package/dist/index.d.ts +93 -3
  163. package/dist/index.js +107 -3
  164. package/dist/install.js +13 -1
  165. package/dist/license-core.d.ts +17 -1
  166. package/dist/license-core.js +16 -5
  167. package/dist/license.d.ts +18 -2
  168. package/dist/license.js +71 -6
  169. package/dist/node/studio.js +203 -9
  170. package/dist/pivot-chart.d.ts +25 -1
  171. package/dist/pivot-chart.js +25 -69
  172. package/dist/pivot-enable.js +2 -2
  173. package/dist/scheduler-dependencies.d.ts +35 -0
  174. package/dist/scheduler-dependencies.js +36 -1
  175. package/dist/scheduler.js +2 -2
  176. package/dist/selection-bar.js +2 -2
  177. package/dist/server/SvGroupCell.svelte +213 -0
  178. package/dist/server/SvGroupCell.svelte.d.ts +62 -0
  179. package/dist/server/SvRowGroupPanel.svelte +322 -0
  180. package/dist/server/SvRowGroupPanel.svelte.d.ts +37 -0
  181. package/dist/server/enable.d.ts +17 -0
  182. package/dist/server/enable.js +49 -0
  183. package/dist/server/index.d.ts +22 -0
  184. package/dist/server/index.js +24 -0
  185. package/dist/server/messages.d.ts +45 -0
  186. package/dist/server/messages.js +35 -0
  187. package/dist/server/server-group-model.d.ts +104 -0
  188. package/dist/server/server-group-model.js +272 -0
  189. package/dist/server/server-pivot.d.ts +46 -0
  190. package/dist/server/server-pivot.js +57 -0
  191. package/dist/server/server-row-model.d.ts +547 -0
  192. package/dist/server/server-row-model.js +1551 -0
  193. package/dist/server/server-selection.d.ts +99 -0
  194. package/dist/server/server-selection.js +215 -0
  195. package/dist/server/svgrid-adapter.d.ts +155 -0
  196. package/dist/server/svgrid-adapter.js +202 -0
  197. package/dist/sheet/address.d.ts +43 -0
  198. package/dist/sheet/address.js +81 -0
  199. package/dist/sheet/ast.d.ts +138 -0
  200. package/dist/sheet/ast.js +70 -0
  201. package/dist/sheet/auto-filter.d.ts +120 -0
  202. package/dist/sheet/auto-filter.js +295 -0
  203. package/dist/sheet/autocomplete.d.ts +51 -0
  204. package/dist/sheet/autocomplete.js +248 -0
  205. package/dist/sheet/cell-images.d.ts +39 -0
  206. package/dist/sheet/cell-images.js +90 -0
  207. package/dist/sheet/cell-types.d.ts +58 -0
  208. package/dist/sheet/cell-types.js +96 -0
  209. package/dist/sheet/coerce.d.ts +71 -0
  210. package/dist/sheet/coerce.js +289 -0
  211. package/dist/sheet/commands.d.ts +89 -0
  212. package/dist/sheet/commands.js +230 -0
  213. package/dist/sheet/comments.d.ts +63 -0
  214. package/dist/sheet/comments.js +131 -0
  215. package/dist/sheet/conditional-formats.d.ts +167 -0
  216. package/dist/sheet/conditional-formats.js +341 -0
  217. package/dist/sheet/csv.d.ts +32 -0
  218. package/dist/sheet/csv.js +158 -0
  219. package/dist/sheet/culture.d.ts +87 -0
  220. package/dist/sheet/culture.js +247 -0
  221. package/dist/sheet/delta.d.ts +102 -0
  222. package/dist/sheet/delta.js +203 -0
  223. package/dist/sheet/deps.d.ts +104 -0
  224. package/dist/sheet/deps.js +274 -0
  225. package/dist/sheet/document.d.ts +252 -0
  226. package/dist/sheet/document.js +465 -0
  227. package/dist/sheet/edit-keys.d.ts +14 -0
  228. package/dist/sheet/edit-keys.js +40 -0
  229. package/dist/sheet/engine.d.ts +67 -0
  230. package/dist/sheet/engine.js +19 -0
  231. package/dist/sheet/entry.d.ts +35 -0
  232. package/dist/sheet/entry.js +226 -0
  233. package/dist/sheet/error-check.d.ts +49 -0
  234. package/dist/sheet/error-check.js +83 -0
  235. package/dist/sheet/evaluate-steps.d.ts +48 -0
  236. package/dist/sheet/evaluate-steps.js +196 -0
  237. package/dist/sheet/evaluate.d.ts +128 -0
  238. package/dist/sheet/evaluate.js +1049 -0
  239. package/dist/sheet/filter-files.d.ts +37 -0
  240. package/dist/sheet/filter-files.js +465 -0
  241. package/dist/sheet/find-replace.d.ts +62 -0
  242. package/dist/sheet/find-replace.js +152 -0
  243. package/dist/sheet/format-store.d.ts +114 -0
  244. package/dist/sheet/format-store.js +243 -0
  245. package/dist/sheet/freeze.d.ts +54 -0
  246. package/dist/sheet/freeze.js +58 -0
  247. package/dist/sheet/from-rows.d.ts +14 -0
  248. package/dist/sheet/from-rows.js +50 -0
  249. package/dist/sheet/function-catalog.d.ts +10 -0
  250. package/dist/sheet/function-catalog.js +385 -0
  251. package/dist/sheet/functions.d.ts +28 -0
  252. package/dist/sheet/functions.js +634 -0
  253. package/dist/sheet/goal-seek.d.ts +73 -0
  254. package/dist/sheet/goal-seek.js +153 -0
  255. package/dist/sheet/index.d.ts +80 -0
  256. package/dist/sheet/index.js +80 -0
  257. package/dist/sheet/links.d.ts +57 -0
  258. package/dist/sheet/links.js +174 -0
  259. package/dist/sheet/merges.d.ts +71 -0
  260. package/dist/sheet/merges.js +137 -0
  261. package/dist/sheet/messages.d.ts +778 -0
  262. package/dist/sheet/messages.js +806 -0
  263. package/dist/sheet/names.d.ts +31 -0
  264. package/dist/sheet/names.js +87 -0
  265. package/dist/sheet/navigate.d.ts +52 -0
  266. package/dist/sheet/navigate.js +135 -0
  267. package/dist/sheet/number-format.d.ts +110 -0
  268. package/dist/sheet/number-format.js +905 -0
  269. package/dist/sheet/objects.d.ts +106 -0
  270. package/dist/sheet/objects.js +149 -0
  271. package/dist/sheet/ods-document.d.ts +44 -0
  272. package/dist/sheet/ods-document.js +1275 -0
  273. package/dist/sheet/open-file.d.ts +26 -0
  274. package/dist/sheet/open-file.js +56 -0
  275. package/dist/sheet/outline.d.ts +82 -0
  276. package/dist/sheet/outline.js +228 -0
  277. package/dist/sheet/packs/array.d.ts +16 -0
  278. package/dist/sheet/packs/array.js +172 -0
  279. package/dist/sheet/packs/database.d.ts +42 -0
  280. package/dist/sheet/packs/database.js +142 -0
  281. package/dist/sheet/packs/engineering.d.ts +2 -0
  282. package/dist/sheet/packs/engineering.js +296 -0
  283. package/dist/sheet/packs/financial.d.ts +5 -0
  284. package/dist/sheet/packs/financial.js +220 -0
  285. package/dist/sheet/packs/math-stats.d.ts +2 -0
  286. package/dist/sheet/packs/math-stats.js +372 -0
  287. package/dist/sheet/packs/special.d.ts +44 -0
  288. package/dist/sheet/packs/special.js +187 -0
  289. package/dist/sheet/packs/stats-dist.d.ts +2 -0
  290. package/dist/sheet/packs/stats-dist.js +785 -0
  291. package/dist/sheet/packs/text-date.d.ts +2 -0
  292. package/dist/sheet/packs/text-date.js +332 -0
  293. package/dist/sheet/packs/trig.d.ts +2 -0
  294. package/dist/sheet/packs/trig.js +73 -0
  295. package/dist/sheet/page-setup.d.ts +73 -0
  296. package/dist/sheet/page-setup.js +73 -0
  297. package/dist/sheet/palette.d.ts +19 -0
  298. package/dist/sheet/palette.js +84 -0
  299. package/dist/sheet/parse.d.ts +13 -0
  300. package/dist/sheet/parse.js +140 -0
  301. package/dist/sheet/paste-special.d.ts +186 -0
  302. package/dist/sheet/paste-special.js +601 -0
  303. package/dist/sheet/pivot-range.d.ts +160 -0
  304. package/dist/sheet/pivot-range.js +333 -0
  305. package/dist/sheet/presence.d.ts +73 -0
  306. package/dist/sheet/presence.js +79 -0
  307. package/dist/sheet/print.d.ts +104 -0
  308. package/dist/sheet/print.js +169 -0
  309. package/dist/sheet/protection.d.ts +75 -0
  310. package/dist/sheet/protection.js +101 -0
  311. package/dist/sheet/rects.d.ts +45 -0
  312. package/dist/sheet/rects.js +112 -0
  313. package/dist/sheet/refs.d.ts +130 -0
  314. package/dist/sheet/refs.js +413 -0
  315. package/dist/sheet/ribbon-icons.d.ts +31 -0
  316. package/dist/sheet/ribbon-icons.js +536 -0
  317. package/dist/sheet/ribbon.d.ts +173 -0
  318. package/dist/sheet/ribbon.js +1054 -0
  319. package/dist/sheet/sheet-kinds.d.ts +74 -0
  320. package/dist/sheet/sheet-kinds.js +91 -0
  321. package/dist/sheet/shortcuts.d.ts +174 -0
  322. package/dist/sheet/shortcuts.js +674 -0
  323. package/dist/sheet/sort.d.ts +51 -0
  324. package/dist/sheet/sort.js +107 -0
  325. package/dist/sheet/sparklines.d.ts +111 -0
  326. package/dist/sheet/sparklines.js +204 -0
  327. package/dist/sheet/structure.d.ts +87 -0
  328. package/dist/sheet/structure.js +166 -0
  329. package/dist/sheet/table-styles.d.ts +74 -0
  330. package/dist/sheet/table-styles.js +152 -0
  331. package/dist/sheet/tables.d.ts +89 -0
  332. package/dist/sheet/tables.js +178 -0
  333. package/dist/sheet/tokenize.d.ts +71 -0
  334. package/dist/sheet/tokenize.js +355 -0
  335. package/dist/sheet/transforms.d.ts +76 -0
  336. package/dist/sheet/transforms.js +154 -0
  337. package/dist/sheet/validation.d.ts +108 -0
  338. package/dist/sheet/validation.js +278 -0
  339. package/dist/sheet/workbook.d.ts +217 -0
  340. package/dist/sheet/workbook.js +1120 -0
  341. package/dist/sheet/xls-cfb.d.ts +32 -0
  342. package/dist/sheet/xls-cfb.js +290 -0
  343. package/dist/sheet/xls-document.d.ts +10 -0
  344. package/dist/sheet/xls-document.js +1243 -0
  345. package/dist/sheet/xls-formula.d.ts +40 -0
  346. package/dist/sheet/xls-formula.js +569 -0
  347. package/dist/sheet/xlsx-document.d.ts +108 -0
  348. package/dist/sheet/xlsx-document.js +1849 -0
  349. package/dist/sheet/xlsx-drawing.d.ts +99 -0
  350. package/dist/sheet/xlsx-drawing.js +420 -0
  351. package/dist/sheet-enable.d.ts +6 -0
  352. package/dist/sheet-enable.js +45 -0
  353. package/dist/sheet-text.d.ts +7 -0
  354. package/dist/sheet-text.js +29 -0
  355. package/dist/sources/auth-supabase.js +2 -2
  356. package/dist/sources/realtime-supabase.js +2 -2
  357. package/dist/sources/rest.d.ts +6 -2
  358. package/dist/sources/rest.js +42 -7
  359. package/dist/sources/supabase.d.ts +10 -1
  360. package/dist/sources/supabase.js +73 -40
  361. package/dist/studio/emit-project.js +14 -1
  362. package/dist/studio/index.js +1 -1
  363. package/dist/studio/project.d.ts +11 -2
  364. package/dist/studio/project.js +5 -2
  365. package/dist/studio/ui-components.generated.js +170 -3
  366. package/dist/sveltekit/in-memory.d.ts +2 -2
  367. package/dist/sveltekit/in-memory.js +125 -4
  368. package/dist/sveltekit/index.d.ts +1 -1
  369. package/dist/sveltekit/index.js +1 -1
  370. package/dist/sveltekit/query-plan.d.ts +50 -4
  371. package/dist/sveltekit/query-plan.js +25 -3
  372. package/dist/sveltekit/sql-source.d.ts +6 -0
  373. package/dist/sveltekit/sql-source.js +34 -6
  374. package/dist/sveltekit/sql.d.ts +31 -0
  375. package/dist/sveltekit/sql.js +135 -25
  376. package/dist/sveltekit/transport.d.ts +10 -2
  377. package/dist/sveltekit/transport.js +30 -6
  378. package/dist/upgrade-prompt.d.ts +1 -1
  379. package/dist/version.d.ts +1 -1
  380. package/dist/version.js +1 -1
  381. package/dist/watermark.js +35 -2
  382. package/dist/wc/GridMenus-By9vPuq0.js +1088 -0
  383. package/dist/wc/SvChartMenu-CQNrQGT2.js +308 -0
  384. package/dist/wc/SvDateRangeInput-DR6m7bSM.js +199 -0
  385. package/dist/wc/SvDateTimePicker-D-vRnaMo.js +771 -0
  386. package/dist/wc/SvField-B_kurx_P.js +149 -0
  387. package/dist/wc/SvGrid.helpers-BdVDtjUm.js +135 -0
  388. package/dist/wc/SvGridCellEditor-Bnf1Kr5C.js +560 -0
  389. package/dist/wc/SvGridChart-BqUJh2pG.js +3572 -0
  390. package/dist/wc/SvGridChartBuilder-CGycC5cn.js +988 -0
  391. package/dist/wc/SvGridChartPanel-CRnizsHD.js +1746 -0
  392. package/dist/wc/SvGridChartView-D1pa_xMy.js +47 -0
  393. package/dist/wc/SvGridDropdown-45WsObLL.js +259 -0
  394. package/dist/wc/SvModal-DrfOYYyX.js +189 -0
  395. package/dist/wc/cell-formatting-CBfgahv1.js +86 -0
  396. package/dist/wc/chart-6OXlybVT.js +4341 -0
  397. package/dist/wc/chart-export-CeSADGfi.js +135 -0
  398. package/dist/wc/chart-export-pdf-BGko7MER.js +104 -0
  399. package/dist/wc/chart-summary-2m3ia1-n.js +137 -0
  400. package/dist/wc/chart-trend-CQOQtTMl.js +50 -0
  401. package/dist/wc/chart-validate-CD6ptiwg.js +180 -0
  402. package/dist/wc/client-DQIzjDBG.js +3064 -0
  403. package/dist/wc/column-resize-DUPgynvc.js +101 -0
  404. package/dist/wc/date-format-DS-z_h9v.js +1130 -0
  405. package/dist/wc/dismissable-CQ6XFXsk.js +45 -0
  406. package/dist/wc/editor-contract-peBDxir_.js +22 -0
  407. package/dist/wc/editor-registry-DxGKqcvx.js +24 -0
  408. package/dist/wc/focus-trap-Dbb2tJxb.js +65 -0
  409. package/dist/wc/list-option-DrRyivWp.js +82 -0
  410. package/dist/wc/popover-WsGlvtQv.js +69 -0
  411. package/dist/wc/positioning-BiKLfu1E.js +112 -0
  412. package/dist/wc/react.d.ts +41 -0
  413. package/dist/wc/react.js +90 -0
  414. package/dist/wc/rolldown-runtime-Dy4uBu1J.js +11 -0
  415. package/dist/wc/row-drag-touch-CycRR65n.js +93 -0
  416. package/dist/wc/row-resize-limG_N1z.js +111 -0
  417. package/dist/wc/sv-sheet-element.d.ts +97 -0
  418. package/dist/wc/sv-sheet-element.js +44213 -0
  419. package/dist/wc/svelte-virtualizer.svelte-CXtQy2TQ.js +530 -0
  420. package/dist/wc/validate-BqDthkNr.js +88 -0
  421. package/dist/wc/vue.d.ts +31 -0
  422. package/dist/wc/vue.js +75 -0
  423. package/package.json +36 -6
  424. package/dist/designer/assets/GridMenus-B1JtIN21.js +0 -8
  425. package/dist/designer/assets/SvDateRangeInput-CjO7nn_x.js +0 -1
  426. package/dist/designer/assets/SvDateTimePicker-ByBD_ov6.js +0 -1
  427. package/dist/designer/assets/SvField-YDLipR6O.css +0 -1
  428. package/dist/designer/assets/SvField-cj1PFNgZ.js +0 -1
  429. package/dist/designer/assets/SvGridCellEditor-0W1L2hJ1.js +0 -2
  430. package/dist/designer/assets/SvGridChart-DBOR4xcz.js +0 -2
  431. package/dist/designer/assets/SvGridChart-fkMWeh1J.css +0 -1
  432. package/dist/designer/assets/SvGridChartPanel-symrhNnR.js +0 -11
  433. package/dist/designer/assets/SvGridChartView-BmRxq6mU.js +0 -1
  434. package/dist/designer/assets/SvGridDropdown-Bb3HH2Aj.js +0 -1
  435. package/dist/designer/assets/SvListBox-1oUF6Iav.js +0 -110
  436. package/dist/designer/assets/cell-formatting-wr5wm7US.js +0 -1
  437. package/dist/designer/assets/chart-DXFganU8.js +0 -1
  438. package/dist/designer/assets/column-resize-C_inr5zT.js +0 -1
  439. package/dist/designer/assets/date-format-DGagAqRc.css +0 -1
  440. package/dist/designer/assets/date-format-onlYDsrY.js +0 -1
  441. package/dist/designer/assets/easing-zaypKrr0.js +0 -3
  442. package/dist/designer/assets/index-k2stW6L8.css +0 -1
  443. package/dist/designer/assets/row-resize-B0FWHcNr.js +0 -1
  444. package/dist/designer/assets/src-D9p27OGC.js +0 -58
  445. package/dist/designer/assets/validate-h-aslRV9.js +0 -1
@@ -0,0 +1,601 @@
1
+ /**
2
+ * Paste Special, and the HTML clipboard round-trip that makes it worth having.
3
+ *
4
+ * The grid's clipboard is TSV only: `writeText` out, `readText` in. That is
5
+ * fine for values and loses everything else, so a trip through Excel drops
6
+ * every format, every formula and every merge. Excel itself writes both
7
+ * `text/plain` and `text/html`, and reads the HTML back when it is there.
8
+ * Matching that is what makes the grid part of someone's workflow rather than
9
+ * an island.
10
+ *
11
+ * The HTML is a plain `<table>`, which is what Excel, Sheets, Numbers and
12
+ * every web app already understand. Formats ride on inline styles they all
13
+ * read (with Excel's `mso-number-format` beside them so Excel keeps the
14
+ * number format too), the number behind a formatted display rides in
15
+ * Excel's `x:num`, and the formula travels in a `data-formula` attribute
16
+ * they all ignore, so a paste into Excel keeps the look while a paste back
17
+ * into the grid keeps the formula.
18
+ *
19
+ * Reading goes the other way: Excel's `<style>` classes, `x:fmla` and
20
+ * `x:num`, and Sheets' `data-sheets-*` attributes all come through, so a
21
+ * block copied from either arrives with its values, formulas and formats.
22
+ */
23
+ import { translateFormula, transposeFormula } from './refs.js';
24
+ import { parseFormula } from './parse.js';
25
+ import { visit } from './ast.js';
26
+ import { entryToStyle } from './format-store.js';
27
+ const esc = (s) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
28
+ /**
29
+ * A number format the way Excel writes it in `mso-number-format`: quoted,
30
+ * every literal escaped with a backslash and a double quote as `\0022`.
31
+ * Excel reads the property back from inline styles, which is how a paste
32
+ * into it keeps `#,##0.00` rather than guessing a format from the text.
33
+ */
34
+ export function msoNumberFormat(code) {
35
+ const body = code
36
+ .replace(/\\/g, '\\\\')
37
+ .replace(/"/g, '\\0022')
38
+ .replace(/([^A-Za-z0-9 \\])/g, '\\$1');
39
+ return `"${body}"`;
40
+ }
41
+ /**
42
+ * Serialise a grid to the two clipboard flavours.
43
+ *
44
+ * The marker class is how `parseClipboardHtml` knows a paste came from a grid
45
+ * and can trust the `data-formula` attributes; HTML from anywhere else is
46
+ * read for text and styles only.
47
+ */
48
+ export function buildClipboardPayload(grid,
49
+ /** Where the copy came from, so a pasted formula knows how far it moved.
50
+ * Omit for a synthetic payload; references then paste unshifted. */
51
+ origin) {
52
+ const text = grid.map((row) => row.map((cell) => cell.text).join('\t')).join('\n');
53
+ const rows = grid.map((row) => {
54
+ const cells = row.map((cell) => {
55
+ const numFmt = cell.format?.numFmt;
56
+ const style = [entryToStyle(cell.format), numFmt ? `mso-number-format:${msoNumberFormat(numFmt)}` : '']
57
+ .filter(Boolean)
58
+ .join(';');
59
+ const numeric = cell.value !== undefined && cell.value !== '' && Number.isFinite(Number(cell.value));
60
+ const attrs = [
61
+ style ? ` style="${esc(style)}"` : '',
62
+ numeric ? ` x:num="${esc(cell.value)}"` : '',
63
+ cell.formula ? ` data-formula="${esc(cell.formula)}"` : '',
64
+ numFmt ? ` data-numfmt="${esc(numFmt)}"` : '',
65
+ ].join('');
66
+ return `<td${attrs}>${esc(cell.text)}</td>`;
67
+ });
68
+ return `<tr>${cells.join('')}</tr>`;
69
+ });
70
+ const originAttr = origin
71
+ ? ` data-origin="${origin.row} ${origin.col}"`
72
+ : '';
73
+ // The x: namespace is Excel's; declaring it is what makes Excel read x:num.
74
+ const html = `<table class="svgrid-clipboard" xmlns:x="urn:schemas-microsoft-com:office:excel"${originAttr}><tbody>` +
75
+ rows.join('') + '</tbody></table>';
76
+ return { text, html };
77
+ }
78
+ const R1C1_REF = /\bR(?:\[(-?\d+)\]|(\d+))?C(?:\[(-?\d+)\]|(\d+))?(?![A-Za-z0-9_(])/g;
79
+ /** Whether a formula is written in R1C1, as Google Sheets writes them. */
80
+ export function isR1C1(formula) {
81
+ R1C1_REF.lastIndex = 0;
82
+ const outside = formula.replace(/"[^"]*"|'[^']*'/g, (m) => ' '.repeat(m.length));
83
+ return R1C1_REF.test(outside);
84
+ }
85
+ /**
86
+ * An R1C1 formula as A1, for the cell it lands in. `R[-1]C` is the cell
87
+ * above wherever the formula sits, `R2C3` is $C$2 anywhere, and a bare
88
+ * `RC` is the cell itself. Quoted strings and sheet names pass through.
89
+ */
90
+ export function r1c1ToA1(formula, row, col) {
91
+ const letters = (index) => {
92
+ let n = index + 1;
93
+ let out = '';
94
+ while (n > 0) {
95
+ const rem = (n - 1) % 26;
96
+ out = String.fromCharCode(65 + rem) + out;
97
+ n = Math.floor((n - 1) / 26);
98
+ }
99
+ return out;
100
+ };
101
+ const convert = (chunk) => chunk.replace(R1C1_REF, (m, rRel, rAbs, cRel, cAbs) => {
102
+ const r = rAbs !== undefined ? Number(rAbs) - 1 : row + Number(rRel ?? 0);
103
+ const c = cAbs !== undefined ? Number(cAbs) - 1 : col + Number(cRel ?? 0);
104
+ if (r < 0 || c < 0)
105
+ return m;
106
+ return `${cAbs !== undefined ? '$' : ''}${letters(c)}${rAbs !== undefined ? '$' : ''}${r + 1}`;
107
+ });
108
+ // Convert only the text between quotes.
109
+ let out = '';
110
+ let start = 0;
111
+ const quoted = /"[^"]*"|'[^']*'/g;
112
+ let m;
113
+ while ((m = quoted.exec(formula))) {
114
+ out += convert(formula.slice(start, m.index)) + m[0];
115
+ start = m.index + m[0].length;
116
+ }
117
+ return out + convert(formula.slice(start));
118
+ }
119
+ /** Parse a TSV clipboard into a grid of text-only cells. */
120
+ export function parseClipboardText(text) {
121
+ const lines = text.replace(/\r\n/g, '\n').split('\n');
122
+ if (lines.length > 0 && lines[lines.length - 1] === '')
123
+ lines.pop();
124
+ return lines.map((line) => line.split('\t').map((cellText) => ({ text: cellText })));
125
+ }
126
+ /**
127
+ * The declarations of a style string, last one wins as in CSS, with quoted
128
+ * values kept whole (a number format carries ';' between its sections).
129
+ * `background-color` folds into `background` so the two spellings override
130
+ * each other in order.
131
+ */
132
+ function declarationsOf(style) {
133
+ const out = new Map();
134
+ let quote = null;
135
+ let start = 0;
136
+ const take = (part) => {
137
+ const i = part.indexOf(':');
138
+ if (i < 0)
139
+ return;
140
+ let prop = part.slice(0, i).trim().toLowerCase();
141
+ if (prop === 'background-color')
142
+ prop = 'background';
143
+ if (prop)
144
+ out.set(prop, part.slice(i + 1).trim());
145
+ };
146
+ for (let i = 0; i < style.length; i += 1) {
147
+ const ch = style[i];
148
+ if (quote) {
149
+ if (ch === quote)
150
+ quote = null;
151
+ }
152
+ else if (ch === '"' || ch === "'") {
153
+ quote = ch;
154
+ }
155
+ else if (ch === ';') {
156
+ take(style.slice(start, i));
157
+ start = i + 1;
158
+ }
159
+ }
160
+ take(style.slice(start));
161
+ return out;
162
+ }
163
+ const AUTOMATIC_COLOR = /^(?:windowtext|black|#000|#000000)$/i;
164
+ const STYLE_TO_ENTRY = {
165
+ 'font-weight': (v, into) => {
166
+ if (/^(?:bold|bolder|[6-9]00)$/i.test(v))
167
+ into.bold = true;
168
+ else
169
+ delete into.bold;
170
+ },
171
+ 'font-style': (v, into) => {
172
+ if (/^(?:italic|oblique)$/i.test(v))
173
+ into.italic = true;
174
+ else
175
+ delete into.italic;
176
+ },
177
+ 'text-decoration': (v, into) => {
178
+ if (/underline/i.test(v))
179
+ into.underline = true;
180
+ else
181
+ delete into.underline;
182
+ if (/line-through/i.test(v))
183
+ into.strike = true;
184
+ else
185
+ delete into.strike;
186
+ },
187
+ color: (v, into) => {
188
+ // Excel writes the automatic colour as windowtext (or black in older
189
+ // builds); that is "no colour set", not a black override.
190
+ if (AUTOMATIC_COLOR.test(v))
191
+ delete into.color;
192
+ else
193
+ into.color = v;
194
+ },
195
+ background: (v, into) => {
196
+ if (/^(?:transparent|none|auto)$/i.test(v))
197
+ delete into.fill;
198
+ else
199
+ into.fill = v;
200
+ },
201
+ 'text-align': (v, into) => {
202
+ if (/^(?:left|center|right)$/i.test(v))
203
+ into.align = v.toLowerCase();
204
+ else
205
+ delete into.align;
206
+ },
207
+ 'font-family': (v, into) => {
208
+ // The first family, unquoted; Excel writes "Aptos Narrow", sans-serif.
209
+ const first = v.split(',')[0].trim().replace(/^["']|["']$/g, '');
210
+ if (first)
211
+ into.fontFamily = first;
212
+ },
213
+ 'font-size': (v, into) => {
214
+ const m = /^([\d.]+)(pt|px)$/i.exec(v);
215
+ if (!m)
216
+ return;
217
+ const n = Number(m[1]);
218
+ if (!Number.isFinite(n) || n <= 0)
219
+ return;
220
+ into.fontSize = m[2].toLowerCase() === 'pt' ? Math.round((n * 96) / 72) : Math.round(n);
221
+ },
222
+ 'white-space': (v, into) => {
223
+ if (/^(?:pre-wrap|normal|pre-line)$/i.test(v))
224
+ into.wrap = true;
225
+ else
226
+ delete into.wrap;
227
+ },
228
+ };
229
+ /**
230
+ * Excel's `mso-number-format` as our number format. Excel escapes the
231
+ * literal characters of a code (`0\.00`), and names a few formats rather
232
+ * than spelling them; the names map to the codes Excel shows for them.
233
+ */
234
+ const MSO_NAMED_FORMATS = {
235
+ general: undefined,
236
+ 'general number': undefined,
237
+ standard: '#,##0.00',
238
+ fixed: '0.00',
239
+ percent: '0.00%',
240
+ currency: '$#,##0.00',
241
+ scientific: '0.00E+00',
242
+ 'short date': 'm/d/yyyy',
243
+ 'medium date': 'd-mmm-yy',
244
+ 'long date': 'dddd, mmmm d, yyyy',
245
+ 'short time': 'h:mm',
246
+ 'medium time': 'h:mm AM/PM',
247
+ 'long time': 'h:mm:ss AM/PM',
248
+ '@': '@',
249
+ };
250
+ export function numFmtFromMso(value) {
251
+ const raw = value.trim().replace(/^["']|["']$/g, '');
252
+ if (!raw)
253
+ return undefined;
254
+ const named = MSO_NAMED_FORMATS[raw.toLowerCase()];
255
+ if (raw.toLowerCase() in MSO_NAMED_FORMATS)
256
+ return named;
257
+ // Excel escapes every literal (\# \, \. \@) and writes a double quote as
258
+ // \0022; our codes take the literals plain.
259
+ return raw.replace(/\\0022/g, '"').replace(/\\([^A-Za-z0-9])/g, '$1');
260
+ }
261
+ function entryFromStyle(style, numFmt) {
262
+ const into = {};
263
+ if (style) {
264
+ for (const [prop, value] of declarationsOf(style)) {
265
+ if (prop === 'mso-number-format') {
266
+ if (numFmt !== null)
267
+ continue;
268
+ const code = numFmtFromMso(value);
269
+ if (code)
270
+ into.numFmt = code;
271
+ else
272
+ delete into.numFmt;
273
+ }
274
+ else {
275
+ STYLE_TO_ENTRY[prop]?.(value, into);
276
+ }
277
+ }
278
+ }
279
+ if (numFmt)
280
+ into.numFmt = numFmt;
281
+ return Object.keys(into).length > 0 ? into : undefined;
282
+ }
283
+ /**
284
+ * The class rules of a clipboard document. Excel puts every cell's format in
285
+ * a `<style>` block keyed by `class="xl65"`, one rule per class, and only
286
+ * the odd override inline; the declarations are merged under the inline
287
+ * style so the inline one wins where both speak.
288
+ */
289
+ function classStyles(doc) {
290
+ const out = new Map();
291
+ for (const styleEl of doc.querySelectorAll('style')) {
292
+ const css = styleEl.textContent ?? '';
293
+ const rule = /([^{}]+)\{([^{}]*)\}/g;
294
+ let m;
295
+ while ((m = rule.exec(css))) {
296
+ const declarations = m[2].replace(/\s+/g, ' ').trim();
297
+ for (const selector of m[1].split(',')) {
298
+ const cls = /\.([\w-]+)\s*$/.exec(selector.trim());
299
+ if (cls)
300
+ out.set(cls[1], (out.get(cls[1]) ? out.get(cls[1]) + ';' : '') + declarations);
301
+ }
302
+ }
303
+ }
304
+ return out;
305
+ }
306
+ /** The formula a cell carries, whichever spreadsheet wrote the HTML. */
307
+ function formulaOf(td) {
308
+ const own = td.getAttribute('data-formula');
309
+ if (own)
310
+ return own;
311
+ const excel = td.getAttribute('x:fmla');
312
+ if (excel)
313
+ return excel.startsWith('=') ? excel : `=${excel}`;
314
+ const sheets = td.getAttribute('data-sheets-formula');
315
+ if (sheets)
316
+ return sheets.startsWith('=') ? sheets : `=${sheets}`;
317
+ return undefined;
318
+ }
319
+ /** The raw value behind a formatted display, when the source wrote one. */
320
+ function rawValueOf(td) {
321
+ const excel = td.getAttribute('x:num');
322
+ if (excel !== null && excel !== '' && Number.isFinite(Number(excel)))
323
+ return excel;
324
+ const sheets = td.getAttribute('data-sheets-value');
325
+ if (sheets) {
326
+ try {
327
+ const parsed = JSON.parse(sheets);
328
+ if (typeof parsed['3'] === 'number')
329
+ return String(parsed['3']);
330
+ if (typeof parsed['2'] === 'string')
331
+ return parsed['2'];
332
+ if (typeof parsed['4'] === 'boolean')
333
+ return parsed['4'] ? 'TRUE' : 'FALSE';
334
+ }
335
+ catch {
336
+ // Not JSON: the display text stands.
337
+ }
338
+ }
339
+ return undefined;
340
+ }
341
+ /** Google Sheets' number format, when the cell carries one. */
342
+ function sheetsNumFmt(td) {
343
+ const raw = td.getAttribute('data-sheets-numberformat');
344
+ if (!raw)
345
+ return null;
346
+ try {
347
+ const parsed = JSON.parse(raw);
348
+ return typeof parsed['2'] === 'string' ? parsed['2'] : null;
349
+ }
350
+ catch {
351
+ return null;
352
+ }
353
+ }
354
+ /**
355
+ * Parse clipboard HTML into a grid.
356
+ *
357
+ * Uses DOMParser rather than a regex: clipboard HTML from Excel is full of
358
+ * conditional comments, namespaced tags and unclosed elements, and a parser
359
+ * that already handles all of that ships in the browser.
360
+ *
361
+ * Returns null when the HTML holds no table, so the caller falls back to TSV.
362
+ */
363
+ export function readClipboardOrigin(html) {
364
+ if (typeof DOMParser === 'undefined')
365
+ return null;
366
+ try {
367
+ const table = new DOMParser().parseFromString(html, 'text/html').querySelector('table');
368
+ const raw = table?.getAttribute('data-origin');
369
+ if (!raw)
370
+ return null;
371
+ const [row, col] = raw.split(' ').map(Number);
372
+ return Number.isFinite(row) && Number.isFinite(col)
373
+ ? { row: row, col: col }
374
+ : null;
375
+ }
376
+ catch {
377
+ return null;
378
+ }
379
+ }
380
+ export function parseClipboardHtml(html) {
381
+ if (typeof DOMParser === 'undefined')
382
+ return null;
383
+ let doc;
384
+ try {
385
+ doc = new DOMParser().parseFromString(html, 'text/html');
386
+ }
387
+ catch {
388
+ return null;
389
+ }
390
+ const table = doc.querySelector('table');
391
+ if (!table)
392
+ return null;
393
+ const classes = classStyles(doc);
394
+ const grid = [];
395
+ for (const tr of table.querySelectorAll('tr')) {
396
+ const row = [];
397
+ for (const td of tr.querySelectorAll('td, th')) {
398
+ const formula = formulaOf(td);
399
+ const fromClasses = (td.getAttribute('class') ?? '')
400
+ .split(/\s+/)
401
+ .map((c) => classes.get(c))
402
+ .filter((c) => !!c);
403
+ const style = [...fromClasses, td.getAttribute('style') ?? ''].filter(Boolean).join(';');
404
+ const raw = rawValueOf(td);
405
+ row.push({
406
+ // textContent rather than innerText: this document is never rendered,
407
+ // so innerText would be empty. A source that wrote the raw value
408
+ // beside a formatted display (Excel's x:num, Sheets' data-sheets-value)
409
+ // pastes the value; the format carries the look.
410
+ text: raw ?? (td.textContent ?? '').replace(/ /g, ' ').trim(),
411
+ ...(formula ? { formula } : {}),
412
+ ...(() => {
413
+ const entry = entryFromStyle(style || null, td.getAttribute('data-numfmt') ?? sheetsNumFmt(td));
414
+ return entry ? { format: entry } : {};
415
+ })(),
416
+ });
417
+ }
418
+ if (row.length > 0)
419
+ grid.push(row);
420
+ }
421
+ return grid.length > 0 ? grid : null;
422
+ }
423
+ /** Read whichever flavour is richer. */
424
+ export function parseClipboard(payload) {
425
+ if (payload.html) {
426
+ const fromHtml = parseClipboardHtml(payload.html);
427
+ if (fromHtml)
428
+ return fromHtml;
429
+ }
430
+ return parseClipboardText(payload.text ?? '');
431
+ }
432
+ function transposeGrid(grid) {
433
+ const rows = grid.length;
434
+ const cols = Math.max(0, ...grid.map((r) => r.length));
435
+ const out = [];
436
+ for (let c = 0; c < cols; c += 1) {
437
+ const row = [];
438
+ for (let r = 0; r < rows; r += 1)
439
+ row.push(grid[r]?.[c] ?? { text: '' });
440
+ out.push(row);
441
+ }
442
+ return out;
443
+ }
444
+ function arithmetic(existing, incoming, op) {
445
+ const a = Number(existing);
446
+ const b = Number(incoming);
447
+ if (!Number.isFinite(a) || !Number.isFinite(b))
448
+ return null;
449
+ switch (op) {
450
+ case 'add': return a + b;
451
+ case 'subtract': return a - b;
452
+ case 'multiply': return a * b;
453
+ // Excel gives #DIV/0! here; the caller writes the error, so report null
454
+ // and let it decide rather than inventing a zero.
455
+ case 'divide': return b === 0 ? null : a / b;
456
+ default: return null;
457
+ }
458
+ }
459
+ /**
460
+ * Decide what lands in one cell. Pure, so the whole option matrix is testable
461
+ * without a clipboard or a grid.
462
+ *
463
+ * `offset` is how far the destination sits from where the source was copied,
464
+ * which is what lets a pasted formula shift its relative references. `at`
465
+ * is the destination itself, which an R1C1 formula (Google Sheets writes
466
+ * them so) needs to become A1; it then needs no offset, being relative to
467
+ * wherever it lands.
468
+ */
469
+ export function resolvePasteCell(source, existing, opts, offset = { rows: 0, cols: 0 }, at,
470
+ /** Where the cell came from and lands, for a transposed paste: its
471
+ * relative references are turned rather than shifted. */
472
+ turn) {
473
+ if (!source)
474
+ return { kind: 'skip' };
475
+ const what = opts.what ?? 'all';
476
+ const operation = opts.operation ?? 'none';
477
+ if (opts.skipBlanks && source.text === '' && !source.formula)
478
+ return { kind: 'skip' };
479
+ if (what === 'formats')
480
+ return { kind: 'format', format: source.format };
481
+ // Arithmetic ignores formats and formulas: Excel operates on values.
482
+ if (operation !== 'none') {
483
+ const result = arithmetic(existing, source.text, operation);
484
+ return result === null ? { kind: 'skip' } : { kind: 'value', value: String(result) };
485
+ }
486
+ const wantsFormula = what === 'all' || what === 'formulas';
487
+ const value = wantsFormula && source.formula
488
+ ? at && isR1C1(source.formula)
489
+ ? r1c1ToA1(source.formula, at.row, at.col)
490
+ : turn
491
+ ? String(transposeFormula(source.formula, turn.source, turn.dest))
492
+ : String(translateFormula(source.formula, offset.rows, offset.cols))
493
+ : source.text;
494
+ if (what === 'values' || what === 'formulas')
495
+ return { kind: 'value', value };
496
+ return { kind: 'both', value, format: source.format };
497
+ }
498
+ /**
499
+ * A block from another application says nothing about where it was copied
500
+ * from, and Excel's formulas come in A1 as written: `=B2*C2` beside a
501
+ * price and a quantity. Pasted anywhere but A1 with no shift, that formula
502
+ * reads the wrong cells. What CAN be known is whether the block is
503
+ * self-contained: with the block read as if copied from A1, a formula whose
504
+ * every reference falls inside the block (a totals column, a running sum,
505
+ * the blocks people copy) is kept and moves with the paste from that A1;
506
+ * one that reaches outside is pasted as its value, which is right wherever
507
+ * the block lands. R1C1 formulas (Google Sheets) are left alone: they are
508
+ * resolved against the cell they land in.
509
+ */
510
+ export function anchorForeignFormulas(grid) {
511
+ const rows = grid.length;
512
+ const cols = Math.max(0, ...grid.map((r) => r.length));
513
+ let anchored = false;
514
+ const out = grid.map((row) => row.map((cell) => {
515
+ if (!cell.formula || isR1C1(cell.formula))
516
+ return cell;
517
+ let inside = true;
518
+ try {
519
+ visit(parseFormula(cell.formula), (n) => {
520
+ // A defined name or a table reference belongs to the source
521
+ // workbook; a sheet-qualified reference is outside by definition.
522
+ if (n.k === 'name' || n.k === 'table')
523
+ inside = false;
524
+ if (n.k === 'ref') {
525
+ if (n.ref.sheet || n.ref.row === null || n.ref.row >= rows || n.ref.col >= cols)
526
+ inside = false;
527
+ }
528
+ if (n.k === 'range') {
529
+ if (n.from.sheet || n.to.sheet)
530
+ inside = false;
531
+ const r2 = Math.max(n.from.row ?? rows, n.to.row ?? rows);
532
+ if (r2 >= rows || Math.max(n.from.col, n.to.col) >= cols)
533
+ inside = false;
534
+ }
535
+ });
536
+ }
537
+ catch {
538
+ inside = false;
539
+ }
540
+ if (!inside) {
541
+ const { formula: _dropped, ...rest } = cell;
542
+ return rest;
543
+ }
544
+ anchored = true;
545
+ return cell;
546
+ }));
547
+ return { grid: out, origin: anchored ? { row: 0, col: 0 } : null };
548
+ }
549
+ /**
550
+ * Where each source cell lands.
551
+ *
552
+ * The reference offset is the same for every cell, not per-cell: source and
553
+ * destination both advance together as the grid is walked, so the shift is
554
+ * just `destination - origin`. Computing it per cell is how you end up
555
+ * translating by the destination's absolute position, which is wrong
556
+ * everywhere except the top-left corner.
557
+ *
558
+ * With no `origin` the offset is zero. That is right rather than lazy: a
559
+ * formula pasted in from another application has no position in this sheet to
560
+ * have moved from.
561
+ *
562
+ * `fill` is the selection's size. A block that fits it a whole number of
563
+ * times is repeated over it, as Excel repeats a copied cell across a
564
+ * selected range (or two copied rows over six selected ones); each repeat
565
+ * gets its own offset, so a repeated formula points where a hand-copied one
566
+ * would. Otherwise the block lands at the destination and keeps its shape.
567
+ */
568
+ export function planPaste(grid, destination, opts = {}, origin, fill) {
569
+ const shaped = opts.transpose ? transposeGrid(grid) : grid;
570
+ const height = shaped.length;
571
+ const width = shaped.reduce((max, row) => Math.max(max, row.length), 0);
572
+ const repeats = fill && height > 0 && width > 0
573
+ && fill.rows % height === 0 && fill.cols % width === 0
574
+ && (fill.rows > height || fill.cols > width)
575
+ ? { rows: fill.rows / height, cols: fill.cols / width }
576
+ : { rows: 1, cols: 1 };
577
+ const out = [];
578
+ for (let tr = 0; tr < repeats.rows; tr += 1) {
579
+ for (let tc = 0; tc < repeats.cols; tc += 1) {
580
+ const corner = { row: destination.row + tr * height, col: destination.col + tc * width };
581
+ // A transposed paste turns each formula's references instead of
582
+ // shifting them (see `transposeFormula`); the offset is for the rest.
583
+ const offset = origin && !opts.transpose
584
+ ? { rows: corner.row - origin.row, cols: corner.col - origin.col }
585
+ : { rows: 0, cols: 0 };
586
+ for (let r = 0; r < shaped.length; r += 1) {
587
+ const row = shaped[r] ?? [];
588
+ for (let c = 0; c < row.length; c += 1) {
589
+ const source = row[c];
590
+ if (!source)
591
+ continue;
592
+ const dest = { row: corner.row + r, col: corner.col + c };
593
+ // In the turned grid, (r, c) came from (c, r) of the block.
594
+ const turn = opts.transpose && origin ? { source: { row: origin.row + c, col: origin.col + r }, dest } : undefined;
595
+ out.push({ ...dest, source, offset, ...(turn ? { turn } : {}) });
596
+ }
597
+ }
598
+ }
599
+ }
600
+ return out;
601
+ }