@rowsncolumns/spreadsheet-state 28.0.74 → 28.0.76

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 (253) hide show
  1. package/dist/cjs/api/anchored-objects.d.ts +66 -0
  2. package/dist/cjs/api/anchored-objects.d.ts.map +1 -0
  3. package/dist/cjs/api/anchored-objects.js +259 -0
  4. package/dist/cjs/api/datatype.d.ts.map +1 -1
  5. package/dist/cjs/api/datatype.js +8 -1
  6. package/dist/cjs/api/dependency.d.ts +13 -2
  7. package/dist/cjs/api/dependency.d.ts.map +1 -1
  8. package/dist/cjs/api/dependency.js +11 -5
  9. package/dist/cjs/api/fill-series-spec.d.ts +35 -0
  10. package/dist/cjs/api/fill-series-spec.d.ts.map +1 -0
  11. package/dist/cjs/api/fill-series-spec.js +164 -0
  12. package/dist/cjs/api/fill.d.ts +95 -3
  13. package/dist/cjs/api/fill.d.ts.map +1 -1
  14. package/dist/cjs/api/fill.js +1186 -418
  15. package/dist/cjs/api/formula.d.ts +61 -4
  16. package/dist/cjs/api/formula.d.ts.map +1 -1
  17. package/dist/cjs/api/formula.js +250 -61
  18. package/dist/cjs/api/immer-utils.d.ts.map +1 -1
  19. package/dist/cjs/api/immer-utils.js +20 -15
  20. package/dist/cjs/api/intl.d.ts.map +1 -1
  21. package/dist/cjs/api/merges.d.ts +8 -0
  22. package/dist/cjs/api/merges.d.ts.map +1 -1
  23. package/dist/cjs/api/merges.js +64 -1
  24. package/dist/cjs/api/named-range-structural.d.ts +62 -0
  25. package/dist/cjs/api/named-range-structural.d.ts.map +1 -0
  26. package/dist/cjs/api/named-range-structural.js +197 -0
  27. package/dist/cjs/api/paint-format.d.ts +15 -1
  28. package/dist/cjs/api/paint-format.d.ts.map +1 -1
  29. package/dist/cjs/api/paint-format.js +69 -10
  30. package/dist/cjs/api/range-rule-helpers.d.ts +45 -1
  31. package/dist/cjs/api/range-rule-helpers.d.ts.map +1 -1
  32. package/dist/cjs/api/range-rule-helpers.js +159 -6
  33. package/dist/cjs/api/structural-formula-update.d.ts.map +1 -1
  34. package/dist/cjs/api/structural-formula-update.js +24 -6
  35. package/dist/cjs/api/structural-guards.d.ts +78 -0
  36. package/dist/cjs/api/structural-guards.d.ts.map +1 -0
  37. package/dist/cjs/api/structural-guards.js +202 -0
  38. package/dist/cjs/api/structural-table-refs.d.ts +94 -0
  39. package/dist/cjs/api/structural-table-refs.d.ts.map +1 -0
  40. package/dist/cjs/api/structural-table-refs.js +313 -0
  41. package/dist/cjs/commands.d.ts +11 -1
  42. package/dist/cjs/commands.d.ts.map +1 -1
  43. package/dist/cjs/constants.d.ts +25 -0
  44. package/dist/cjs/constants.d.ts.map +1 -0
  45. package/dist/cjs/constants.js +26 -0
  46. package/dist/cjs/hooks/use-calculation-worker.d.ts.map +1 -1
  47. package/dist/cjs/hooks/use-calculation-worker.js +64 -6
  48. package/dist/cjs/hooks/use-calculation.d.ts +8 -1
  49. package/dist/cjs/hooks/use-calculation.d.ts.map +1 -1
  50. package/dist/cjs/hooks/use-calculation.js +15 -0
  51. package/dist/cjs/hooks/use-on-calculation-success.d.ts +7 -0
  52. package/dist/cjs/hooks/use-on-calculation-success.d.ts.map +1 -1
  53. package/dist/cjs/hooks/use-on-calculation-success.js +7 -1
  54. package/dist/cjs/hooks/use-on-delete-cells-shift-left.d.ts +13 -3
  55. package/dist/cjs/hooks/use-on-delete-cells-shift-left.d.ts.map +1 -1
  56. package/dist/cjs/hooks/use-on-delete-cells-shift-left.js +27 -2
  57. package/dist/cjs/hooks/use-on-delete-cells-shift-up.d.ts +13 -3
  58. package/dist/cjs/hooks/use-on-delete-cells-shift-up.d.ts.map +1 -1
  59. package/dist/cjs/hooks/use-on-delete-cells-shift-up.js +27 -2
  60. package/dist/cjs/hooks/use-on-delete-column.d.ts +13 -4
  61. package/dist/cjs/hooks/use-on-delete-column.d.ts.map +1 -1
  62. package/dist/cjs/hooks/use-on-delete-column.js +14 -2
  63. package/dist/cjs/hooks/use-on-delete-row.d.ts +13 -4
  64. package/dist/cjs/hooks/use-on-delete-row.d.ts.map +1 -1
  65. package/dist/cjs/hooks/use-on-delete-row.js +14 -2
  66. package/dist/cjs/hooks/use-on-fill.d.ts +13 -4
  67. package/dist/cjs/hooks/use-on-fill.d.ts.map +1 -1
  68. package/dist/cjs/hooks/use-on-fill.js +28 -7
  69. package/dist/cjs/hooks/use-on-insert-cells-shift-down.d.ts +13 -3
  70. package/dist/cjs/hooks/use-on-insert-cells-shift-down.d.ts.map +1 -1
  71. package/dist/cjs/hooks/use-on-insert-cells-shift-down.js +27 -2
  72. package/dist/cjs/hooks/use-on-insert-cells-shift-right.d.ts +13 -3
  73. package/dist/cjs/hooks/use-on-insert-cells-shift-right.d.ts.map +1 -1
  74. package/dist/cjs/hooks/use-on-insert-cells-shift-right.js +27 -2
  75. package/dist/cjs/hooks/use-on-insert-column.d.ts +10 -3
  76. package/dist/cjs/hooks/use-on-insert-column.d.ts.map +1 -1
  77. package/dist/cjs/hooks/use-on-insert-column.js +33 -7
  78. package/dist/cjs/hooks/use-on-insert-row.d.ts +10 -3
  79. package/dist/cjs/hooks/use-on-insert-row.d.ts.map +1 -1
  80. package/dist/cjs/hooks/use-on-insert-row.js +32 -7
  81. package/dist/cjs/hooks/use-paint-format.d.ts.map +1 -1
  82. package/dist/cjs/hooks/use-paint-format.js +10 -7
  83. package/dist/cjs/hooks/use-spreadsheet-state.d.ts +3 -3
  84. package/dist/cjs/hooks/use-spreadsheet-state.d.ts.map +1 -1
  85. package/dist/cjs/hooks/use-spreadsheet-state.js +73 -16
  86. package/dist/cjs/hooks/use-structured-reference.d.ts.map +1 -1
  87. package/dist/cjs/hooks/use-structured-reference.js +10 -6
  88. package/dist/cjs/index.d.ts +3 -0
  89. package/dist/cjs/index.d.ts.map +1 -1
  90. package/dist/cjs/index.js +3 -0
  91. package/dist/cjs/interface/apply-fill.d.ts +3 -3
  92. package/dist/cjs/interface/apply-fill.d.ts.map +1 -1
  93. package/dist/cjs/interface/apply-fill.js +100 -53
  94. package/dist/cjs/interface/calculation-interface.d.ts +9 -0
  95. package/dist/cjs/interface/calculation-interface.d.ts.map +1 -1
  96. package/dist/cjs/interface/calculation-interface.js +31 -2
  97. package/dist/cjs/interface/delete-cells-shift-left.d.ts +8 -1
  98. package/dist/cjs/interface/delete-cells-shift-left.d.ts.map +1 -1
  99. package/dist/cjs/interface/delete-cells-shift-left.js +158 -80
  100. package/dist/cjs/interface/delete-cells-shift-up.d.ts +9 -1
  101. package/dist/cjs/interface/delete-cells-shift-up.d.ts.map +1 -1
  102. package/dist/cjs/interface/delete-cells-shift-up.js +155 -73
  103. package/dist/cjs/interface/delete-column.d.ts +1 -1
  104. package/dist/cjs/interface/delete-column.d.ts.map +1 -1
  105. package/dist/cjs/interface/delete-column.js +90 -31
  106. package/dist/cjs/interface/delete-row.d.ts +1 -1
  107. package/dist/cjs/interface/delete-row.d.ts.map +1 -1
  108. package/dist/cjs/interface/delete-row.js +85 -26
  109. package/dist/cjs/interface/insert-cells-shift-down.d.ts +10 -1
  110. package/dist/cjs/interface/insert-cells-shift-down.d.ts.map +1 -1
  111. package/dist/cjs/interface/insert-cells-shift-down.js +147 -52
  112. package/dist/cjs/interface/insert-cells-shift-right.d.ts +10 -1
  113. package/dist/cjs/interface/insert-cells-shift-right.d.ts.map +1 -1
  114. package/dist/cjs/interface/insert-cells-shift-right.js +154 -58
  115. package/dist/cjs/interface/insert-column.d.ts +1 -1
  116. package/dist/cjs/interface/insert-column.d.ts.map +1 -1
  117. package/dist/cjs/interface/insert-column.js +46 -8
  118. package/dist/cjs/interface/insert-row.d.ts +1 -1
  119. package/dist/cjs/interface/insert-row.d.ts.map +1 -1
  120. package/dist/cjs/interface/insert-row.js +47 -10
  121. package/dist/cjs/interface/spreadsheet-interface.d.ts +1 -1
  122. package/dist/cjs/interface/spreadsheet-interface.d.ts.map +1 -1
  123. package/dist/cjs/interface/spreadsheet-interface.js +33 -0
  124. package/dist/cjs/sheet-cell.d.ts.map +1 -1
  125. package/dist/cjs/sheet-cell.js +30 -6
  126. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  127. package/dist/esm/api/anchored-objects.d.ts +66 -0
  128. package/dist/esm/api/anchored-objects.d.ts.map +1 -0
  129. package/dist/esm/api/anchored-objects.js +212 -0
  130. package/dist/esm/api/datatype.d.ts.map +1 -1
  131. package/dist/esm/api/datatype.js +8 -1
  132. package/dist/esm/api/dependency.d.ts +13 -2
  133. package/dist/esm/api/dependency.d.ts.map +1 -1
  134. package/dist/esm/api/dependency.js +10 -4
  135. package/dist/esm/api/fill-series-spec.d.ts +35 -0
  136. package/dist/esm/api/fill-series-spec.d.ts.map +1 -0
  137. package/dist/esm/api/fill-series-spec.js +160 -0
  138. package/dist/esm/api/fill.d.ts +95 -3
  139. package/dist/esm/api/fill.d.ts.map +1 -1
  140. package/dist/esm/api/fill.js +1158 -418
  141. package/dist/esm/api/formula.d.ts +61 -4
  142. package/dist/esm/api/formula.d.ts.map +1 -1
  143. package/dist/esm/api/formula.js +238 -60
  144. package/dist/esm/api/immer-utils.d.ts.map +1 -1
  145. package/dist/esm/api/immer-utils.js +20 -15
  146. package/dist/esm/api/intl.d.ts.map +1 -1
  147. package/dist/esm/api/merges.d.ts +8 -0
  148. package/dist/esm/api/merges.d.ts.map +1 -1
  149. package/dist/esm/api/merges.js +51 -0
  150. package/dist/esm/api/named-range-structural.d.ts +62 -0
  151. package/dist/esm/api/named-range-structural.d.ts.map +1 -0
  152. package/dist/esm/api/named-range-structural.js +176 -0
  153. package/dist/esm/api/paint-format.d.ts +15 -1
  154. package/dist/esm/api/paint-format.d.ts.map +1 -1
  155. package/dist/esm/api/paint-format.js +46 -1
  156. package/dist/esm/api/range-rule-helpers.d.ts +45 -1
  157. package/dist/esm/api/range-rule-helpers.d.ts.map +1 -1
  158. package/dist/esm/api/range-rule-helpers.js +153 -1
  159. package/dist/esm/api/structural-formula-update.d.ts.map +1 -1
  160. package/dist/esm/api/structural-formula-update.js +24 -6
  161. package/dist/esm/api/structural-guards.d.ts +78 -0
  162. package/dist/esm/api/structural-guards.d.ts.map +1 -0
  163. package/dist/esm/api/structural-guards.js +186 -0
  164. package/dist/esm/api/structural-table-refs.d.ts +94 -0
  165. package/dist/esm/api/structural-table-refs.d.ts.map +1 -0
  166. package/dist/esm/api/structural-table-refs.js +219 -0
  167. package/dist/esm/commands.d.ts +11 -1
  168. package/dist/esm/commands.d.ts.map +1 -1
  169. package/dist/esm/constants.d.ts +25 -0
  170. package/dist/esm/constants.d.ts.map +1 -0
  171. package/dist/esm/constants.js +26 -0
  172. package/dist/esm/hooks/use-calculation-worker.d.ts.map +1 -1
  173. package/dist/esm/hooks/use-calculation-worker.js +45 -0
  174. package/dist/esm/hooks/use-calculation.d.ts +8 -1
  175. package/dist/esm/hooks/use-calculation.d.ts.map +1 -1
  176. package/dist/esm/hooks/use-calculation.js +15 -0
  177. package/dist/esm/hooks/use-on-calculation-success.d.ts +7 -0
  178. package/dist/esm/hooks/use-on-calculation-success.d.ts.map +1 -1
  179. package/dist/esm/hooks/use-on-calculation-success.js +7 -1
  180. package/dist/esm/hooks/use-on-delete-cells-shift-left.d.ts +13 -3
  181. package/dist/esm/hooks/use-on-delete-cells-shift-left.d.ts.map +1 -1
  182. package/dist/esm/hooks/use-on-delete-cells-shift-left.js +26 -2
  183. package/dist/esm/hooks/use-on-delete-cells-shift-up.d.ts +13 -3
  184. package/dist/esm/hooks/use-on-delete-cells-shift-up.d.ts.map +1 -1
  185. package/dist/esm/hooks/use-on-delete-cells-shift-up.js +26 -2
  186. package/dist/esm/hooks/use-on-delete-column.d.ts +13 -4
  187. package/dist/esm/hooks/use-on-delete-column.d.ts.map +1 -1
  188. package/dist/esm/hooks/use-on-delete-column.js +14 -2
  189. package/dist/esm/hooks/use-on-delete-row.d.ts +13 -4
  190. package/dist/esm/hooks/use-on-delete-row.d.ts.map +1 -1
  191. package/dist/esm/hooks/use-on-delete-row.js +14 -2
  192. package/dist/esm/hooks/use-on-fill.d.ts +13 -4
  193. package/dist/esm/hooks/use-on-fill.d.ts.map +1 -1
  194. package/dist/esm/hooks/use-on-fill.js +24 -4
  195. package/dist/esm/hooks/use-on-insert-cells-shift-down.d.ts +13 -3
  196. package/dist/esm/hooks/use-on-insert-cells-shift-down.d.ts.map +1 -1
  197. package/dist/esm/hooks/use-on-insert-cells-shift-down.js +26 -2
  198. package/dist/esm/hooks/use-on-insert-cells-shift-right.d.ts +13 -3
  199. package/dist/esm/hooks/use-on-insert-cells-shift-right.d.ts.map +1 -1
  200. package/dist/esm/hooks/use-on-insert-cells-shift-right.js +26 -2
  201. package/dist/esm/hooks/use-on-insert-column.d.ts +10 -3
  202. package/dist/esm/hooks/use-on-insert-column.d.ts.map +1 -1
  203. package/dist/esm/hooks/use-on-insert-column.js +33 -7
  204. package/dist/esm/hooks/use-on-insert-row.d.ts +10 -3
  205. package/dist/esm/hooks/use-on-insert-row.d.ts.map +1 -1
  206. package/dist/esm/hooks/use-on-insert-row.js +32 -7
  207. package/dist/esm/hooks/use-paint-format.d.ts.map +1 -1
  208. package/dist/esm/hooks/use-paint-format.js +10 -7
  209. package/dist/esm/hooks/use-spreadsheet-state.d.ts +3 -3
  210. package/dist/esm/hooks/use-spreadsheet-state.d.ts.map +1 -1
  211. package/dist/esm/hooks/use-spreadsheet-state.js +73 -16
  212. package/dist/esm/hooks/use-structured-reference.d.ts.map +1 -1
  213. package/dist/esm/hooks/use-structured-reference.js +10 -6
  214. package/dist/esm/index.d.ts +3 -0
  215. package/dist/esm/index.d.ts.map +1 -1
  216. package/dist/esm/index.js +3 -0
  217. package/dist/esm/interface/apply-fill.d.ts +3 -3
  218. package/dist/esm/interface/apply-fill.d.ts.map +1 -1
  219. package/dist/esm/interface/apply-fill.js +93 -48
  220. package/dist/esm/interface/calculation-interface.d.ts +9 -0
  221. package/dist/esm/interface/calculation-interface.d.ts.map +1 -1
  222. package/dist/esm/interface/calculation-interface.js +33 -2
  223. package/dist/esm/interface/delete-cells-shift-left.d.ts +8 -1
  224. package/dist/esm/interface/delete-cells-shift-left.d.ts.map +1 -1
  225. package/dist/esm/interface/delete-cells-shift-left.js +135 -59
  226. package/dist/esm/interface/delete-cells-shift-up.d.ts +9 -1
  227. package/dist/esm/interface/delete-cells-shift-up.d.ts.map +1 -1
  228. package/dist/esm/interface/delete-cells-shift-up.js +133 -53
  229. package/dist/esm/interface/delete-column.d.ts +1 -1
  230. package/dist/esm/interface/delete-column.d.ts.map +1 -1
  231. package/dist/esm/interface/delete-column.js +80 -11
  232. package/dist/esm/interface/delete-row.d.ts +1 -1
  233. package/dist/esm/interface/delete-row.d.ts.map +1 -1
  234. package/dist/esm/interface/delete-row.js +81 -11
  235. package/dist/esm/interface/insert-cells-shift-down.d.ts +10 -1
  236. package/dist/esm/interface/insert-cells-shift-down.d.ts.map +1 -1
  237. package/dist/esm/interface/insert-cells-shift-down.js +116 -47
  238. package/dist/esm/interface/insert-cells-shift-right.d.ts +10 -1
  239. package/dist/esm/interface/insert-cells-shift-right.d.ts.map +1 -1
  240. package/dist/esm/interface/insert-cells-shift-right.js +120 -51
  241. package/dist/esm/interface/insert-column.d.ts +1 -1
  242. package/dist/esm/interface/insert-column.d.ts.map +1 -1
  243. package/dist/esm/interface/insert-column.js +46 -8
  244. package/dist/esm/interface/insert-row.d.ts +1 -1
  245. package/dist/esm/interface/insert-row.d.ts.map +1 -1
  246. package/dist/esm/interface/insert-row.js +47 -10
  247. package/dist/esm/interface/spreadsheet-interface.d.ts +1 -1
  248. package/dist/esm/interface/spreadsheet-interface.d.ts.map +1 -1
  249. package/dist/esm/interface/spreadsheet-interface.js +29 -0
  250. package/dist/esm/sheet-cell.d.ts.map +1 -1
  251. package/dist/esm/sheet-cell.js +30 -6
  252. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  253. package/package.json +17 -17
@@ -4,4 +4,12 @@ export declare const shrinkMergesOnRowDelete: (merges: GridRange[], deleteStart:
4
4
  export declare const shrinkMergesOnColumnDelete: (merges: GridRange[], deleteStart: number, deleteCount: number) => GridRange[];
5
5
  export declare const expandMergesOnRowInsert: (merges: GridRange[], insertIndex: number, count: number) => GridRange[];
6
6
  export declare const expandMergesOnColumnInsert: (merges: GridRange[], insertIndex: number, count: number) => GridRange[];
7
+ /**
8
+ * Merges that travel with an insert/delete-cells shift: a merge wholly inside the shifted band
9
+ * (rows `>= start` in the band's columns for a vertical shift; columns `>= start` in its rows for a
10
+ * horizontal one) moves by `count`; on a delete, a merge wholly inside the deleted block is dropped
11
+ * with it. Merges the band only partially covers are refused upstream (`findTornMerge`) — this
12
+ * helper never tears one, it leaves anything outside the band untouched.
13
+ */
14
+ export declare const shiftMergesInBand: (merges: GridRange[] | undefined | null, axis: "row" | "column", start: number, count: number, insert: boolean, spanStart: number, spanEnd: number) => GridRange[] | null | undefined;
7
15
  //# sourceMappingURL=merges.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"merges.d.ts","sourceRoot":"","sources":["../../../api/merges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAY5D,eAAO,MAAM,eAAe,GAC1B,aAAa,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,EAC3C,IAAI,eAAe,GAAG,YAAY,GAAG,eAAe,GAAG,YAAY,EACnE,gBAAgB,MAAM,EACtB,cAAS,EACT,YAAY,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,mCA2DzC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,aAAa,MAAM,gBA8CpB,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,aAAa,MAAM,gBA8CpB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,OAAO,MAAM,gBAyBd,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,OAAO,MAAM,gBAyBd,CAAC"}
1
+ {"version":3,"file":"merges.d.ts","sourceRoot":"","sources":["../../../api/merges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAY5D,eAAO,MAAM,eAAe,GAC1B,aAAa,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,EAC3C,IAAI,eAAe,GAAG,YAAY,GAAG,eAAe,GAAG,YAAY,EACnE,gBAAgB,MAAM,EACtB,cAAS,EACT,YAAY,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,mCA2DzC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,aAAa,MAAM,gBA8CpB,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,aAAa,MAAM,gBA8CpB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,OAAO,MAAM,gBAyBd,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,OAAO,MAAM,gBAyBd,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,EACtC,MAAM,KAAK,GAAG,QAAQ,EACtB,OAAO,MAAM,EACb,OAAO,MAAM,EACb,QAAQ,OAAO,EACf,WAAW,MAAM,EACjB,SAAS,MAAM,mCAkDhB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { __assign } from "tslib";
1
+ import { __assign, __values } from "tslib";
2
2
  /**
3
3
  * Move merged cells when user is inserts, deletes row and columns
4
4
  * @param mergedCells
@@ -132,3 +132,66 @@ export var expandMergesOnColumnInsert = function (merges, insertIndex, count) {
132
132
  })
133
133
  .filter(function (merge) { return !isSingleCellMerge(merge); });
134
134
  };
135
+ /**
136
+ * Merges that travel with an insert/delete-cells shift: a merge wholly inside the shifted band
137
+ * (rows `>= start` in the band's columns for a vertical shift; columns `>= start` in its rows for a
138
+ * horizontal one) moves by `count`; on a delete, a merge wholly inside the deleted block is dropped
139
+ * with it. Merges the band only partially covers are refused upstream (`findTornMerge`) — this
140
+ * helper never tears one, it leaves anything outside the band untouched.
141
+ */
142
+ export var shiftMergesInBand = function (merges, axis, start, count, insert, spanStart, spanEnd) {
143
+ var e_1, _a;
144
+ if (!merges || count <= 0) {
145
+ return merges;
146
+ }
147
+ var deletedEnd = start + count - 1;
148
+ var inSpan = axis === "row"
149
+ ? function (merge) {
150
+ return merge.startColumnIndex >= spanStart && merge.endColumnIndex <= spanEnd;
151
+ }
152
+ : function (merge) {
153
+ return merge.startRowIndex >= spanStart && merge.endRowIndex <= spanEnd;
154
+ };
155
+ var lineStart = function (merge) {
156
+ return axis === "row" ? merge.startRowIndex : merge.startColumnIndex;
157
+ };
158
+ var lineEnd = function (merge) {
159
+ return axis === "row" ? merge.endRowIndex : merge.endColumnIndex;
160
+ };
161
+ var moved = function (merge, delta) {
162
+ return axis === "row"
163
+ ? __assign(__assign({}, merge), { startRowIndex: merge.startRowIndex + delta, endRowIndex: merge.endRowIndex + delta }) : __assign(__assign({}, merge), { startColumnIndex: merge.startColumnIndex + delta, endColumnIndex: merge.endColumnIndex + delta });
164
+ };
165
+ var next = [];
166
+ try {
167
+ for (var merges_1 = __values(merges), merges_1_1 = merges_1.next(); !merges_1_1.done; merges_1_1 = merges_1.next()) {
168
+ var merge = merges_1_1.value;
169
+ if (!inSpan(merge) || lineStart(merge) < start) {
170
+ next.push(merge);
171
+ continue;
172
+ }
173
+ if (insert) {
174
+ next.push(moved(merge, count));
175
+ continue;
176
+ }
177
+ if (lineEnd(merge) <= deletedEnd) {
178
+ // Wholly inside the deleted block — removed with it.
179
+ continue;
180
+ }
181
+ if (lineStart(merge) > deletedEnd) {
182
+ next.push(moved(merge, -count));
183
+ continue;
184
+ }
185
+ // Straddles the deleted block's edge: refused upstream; never tear it here.
186
+ next.push(merge);
187
+ }
188
+ }
189
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
190
+ finally {
191
+ try {
192
+ if (merges_1_1 && !merges_1_1.done && (_a = merges_1.return)) _a.call(merges_1);
193
+ }
194
+ finally { if (e_1) throw e_1.error; }
195
+ }
196
+ return next;
197
+ };
@@ -0,0 +1,62 @@
1
+ import type { NamedRange, SheetPrintSettings } from "@rowsncolumns/spreadsheet";
2
+ import type { WritableDraft } from "immer";
3
+ export type StructuralAxis = "row" | "column";
4
+ export type StructuralOp = "insert" | "delete";
5
+ /**
6
+ * The `value` a defined name carries once every cell of its range has been
7
+ * deleted. Excel keeps the name in the Name Manager as `=Sheet1!#REF!` and
8
+ * every formula that uses it evaluates to `#REF!` (not `#NAME?`), so the
9
+ * name survives with no range and this error marker as its value; the
10
+ * calculation worker's name resolver turns it into `FormulaError.REF`.
11
+ */
12
+ export declare const NAMED_RANGE_REF_ERROR = "#REF!";
13
+ export declare const isRefErrorNamedRange: (namedRange: Pick<NamedRange, "range" | "value">) => boolean;
14
+ /**
15
+ * Shift the inclusive `[start, end]` band of a defined name / print band for
16
+ * an insert or delete of `count` rows or columns at `index` (1-based).
17
+ * Excel's rule for a name's RefersTo, identical to the Rust engine's
18
+ * `shift_named_ranges`:
19
+ *
20
+ * - insert at or above the first index → the whole band shifts;
21
+ * - insert strictly inside → the band grows;
22
+ * - insert at the boundary directly below → unchanged;
23
+ * - delete wholly above → shifts back; delete overlapping → shrinks by the
24
+ * deleted indices inside the band; delete covering the band → `null`.
25
+ */
26
+ export declare const shiftNamedBand: (start: number, end: number, op: StructuralOp, index: number, count: number) => [number, number] | null;
27
+ export type NamedRangeStructuralUpdate<N extends NamedRange> = {
28
+ /** Names whose range moved, grew, or shrank. */
29
+ changed: N[];
30
+ /** Names whose whole range was deleted — kept, now `=#REF!`. */
31
+ refErrored: N[];
32
+ };
33
+ /**
34
+ * Adjust defined names for a sheet-level insert/delete on `sheetId`,
35
+ * mutating the immer `draft` in place. Only names whose `range.sheetId` is
36
+ * the edited sheet move — a name's scope (`scopeSheetId`) governs how it is
37
+ * resolved, not which sheet's edits shift it (a Sheet2-scoped name pointing
38
+ * at Sheet2!$B$4 shifts on Sheet2 edits, never on Sheet1 edits). Value
39
+ * names (`=SUM(...)*2`, `0.1`) have no grid range and pass through.
40
+ *
41
+ * A name whose entire range is deleted is NOT dropped: it keeps its entry
42
+ * with `range` cleared and `value: "#REF!"`, so `=SUM(Data)` evaluates to
43
+ * `#REF!` like Excel rather than `#NAME?`.
44
+ */
45
+ export declare const updateNamedRangesOnStructuralChange: (draft: WritableDraft<NamedRange>[], axis: StructuralAxis, op: StructuralOp, index: number, count: number, sheetId: number) => NamedRangeStructuralUpdate<WritableDraft<NamedRange>>;
46
+ /**
47
+ * Pure variant of {@link updateNamedRangesOnStructuralChange}: returns the
48
+ * adjusted list (sharing untouched entries) plus the names that changed.
49
+ */
50
+ export declare const shiftNamedRangesOnStructuralChange: <N extends NamedRange>(namedRanges: readonly N[], axis: StructuralAxis, op: StructuralOp, index: number, count: number, sheetId: number) => {
51
+ next: N[];
52
+ } & NamedRangeStructuralUpdate<N>;
53
+ /**
54
+ * `_xlnm.Print_Area` / `_xlnm.Print_Titles` are sheet-scoped defined names
55
+ * in Excel and follow the same RefersTo rule as any other name. Mutates the
56
+ * sheet's `printSettings` draft: each print-area rectangle shifts / grows /
57
+ * shrinks (a rectangle wholly deleted is removed; an emptied print area is
58
+ * cleared), and the repeated title rows / columns shift as a band along the
59
+ * edited axis (cleared when every title row / column is deleted).
60
+ */
61
+ export declare const updatePrintSettingsOnStructuralChange: (printSettings: WritableDraft<SheetPrintSettings>, axis: StructuralAxis, op: StructuralOp, index: number, count: number) => boolean;
62
+ //# sourceMappingURL=named-range-structural.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"named-range-structural.d.ts","sourceRoot":"","sources":["../../../api/named-range-structural.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EAEV,kBAAkB,EACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,CAAC;AAC9C,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/C;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,UAAU,CAAC;AAE7C,eAAO,MAAM,oBAAoB,GAC/B,YAAY,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,YACmB,CAAC;AAErE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc,GACzB,OAAO,MAAM,EACb,KAAK,MAAM,EACX,IAAI,YAAY,EAChB,OAAO,MAAM,EACb,OAAO,MAAM,KACZ,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAgBrB,CAAC;AAmBF,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,UAAU,IAAI;IAC7D,gDAAgD;IAChD,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,gEAAgE;IAChE,UAAU,EAAE,CAAC,EAAE,CAAC;CACjB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mCAAmC,GAC9C,OAAO,aAAa,CAAC,UAAU,CAAC,EAAE,EAClC,MAAM,cAAc,EACpB,IAAI,YAAY,EAChB,OAAO,MAAM,EACb,OAAO,MAAM,EACb,SAAS,MAAM,KACd,0BAA0B,CAAC,aAAa,CAAC,UAAU,CAAC,CAmBtD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kCAAkC,GAAI,CAAC,SAAS,UAAU,EACrE,aAAa,SAAS,CAAC,EAAE,EACzB,MAAM,cAAc,EACpB,IAAI,YAAY,EAChB,OAAO,MAAM,EACb,OAAO,MAAM,EACb,SAAS,MAAM,KACd;IAAE,IAAI,EAAE,CAAC,EAAE,CAAA;CAAE,GAAG,0BAA0B,CAAC,CAAC,CAsB9C,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qCAAqC,GAChD,eAAe,aAAa,CAAC,kBAAkB,CAAC,EAChD,MAAM,cAAc,EACpB,IAAI,YAAY,EAChB,OAAO,MAAM,EACb,OAAO,MAAM,KACZ,OAiDF,CAAC"}
@@ -0,0 +1,197 @@
1
+ import { __assign, __read, __values } from "tslib";
2
+ /**
3
+ * The `value` a defined name carries once every cell of its range has been
4
+ * deleted. Excel keeps the name in the Name Manager as `=Sheet1!#REF!` and
5
+ * every formula that uses it evaluates to `#REF!` (not `#NAME?`), so the
6
+ * name survives with no range and this error marker as its value; the
7
+ * calculation worker's name resolver turns it into `FormulaError.REF`.
8
+ */
9
+ export var NAMED_RANGE_REF_ERROR = "#REF!";
10
+ export var isRefErrorNamedRange = function (namedRange) { return !namedRange.range && namedRange.value === NAMED_RANGE_REF_ERROR; };
11
+ /**
12
+ * Shift the inclusive `[start, end]` band of a defined name / print band for
13
+ * an insert or delete of `count` rows or columns at `index` (1-based).
14
+ * Excel's rule for a name's RefersTo, identical to the Rust engine's
15
+ * `shift_named_ranges`:
16
+ *
17
+ * - insert at or above the first index → the whole band shifts;
18
+ * - insert strictly inside → the band grows;
19
+ * - insert at the boundary directly below → unchanged;
20
+ * - delete wholly above → shifts back; delete overlapping → shrinks by the
21
+ * deleted indices inside the band; delete covering the band → `null`.
22
+ */
23
+ export var shiftNamedBand = function (start, end, op, index, count) {
24
+ if (count <= 0)
25
+ return [start, end];
26
+ var s = Math.max(1, start);
27
+ var e = Math.max(s, end);
28
+ if (op === "insert") {
29
+ if (index <= s)
30
+ return [s + count, e + count];
31
+ if (index <= e)
32
+ return [s, e + count];
33
+ return [s, e];
34
+ }
35
+ var deleteEnd = index + count - 1;
36
+ if (deleteEnd < s)
37
+ return [s - count, e - count];
38
+ if (index > e)
39
+ return [s, e];
40
+ if (index <= s && deleteEnd >= e)
41
+ return null;
42
+ var before = Math.max(s - index, 0);
43
+ var inside = Math.min(deleteEnd, e) - Math.max(index, s) + 1;
44
+ return [s - before, e - before - inside];
45
+ };
46
+ var shiftGridRange = function (range, axis, op, index, count) {
47
+ var _a;
48
+ var _b = __read(axis === "row"
49
+ ? ["startRowIndex", "endRowIndex"]
50
+ : ["startColumnIndex", "endColumnIndex"], 2), startKey = _b[0], endKey = _b[1];
51
+ var next = shiftNamedBand(range[startKey], range[endKey], op, index, count);
52
+ if (!next)
53
+ return null;
54
+ if (next[0] === range[startKey] && next[1] === range[endKey])
55
+ return range;
56
+ return __assign(__assign({}, range), (_a = {}, _a[startKey] = next[0], _a[endKey] = next[1], _a));
57
+ };
58
+ /**
59
+ * Adjust defined names for a sheet-level insert/delete on `sheetId`,
60
+ * mutating the immer `draft` in place. Only names whose `range.sheetId` is
61
+ * the edited sheet move — a name's scope (`scopeSheetId`) governs how it is
62
+ * resolved, not which sheet's edits shift it (a Sheet2-scoped name pointing
63
+ * at Sheet2!$B$4 shifts on Sheet2 edits, never on Sheet1 edits). Value
64
+ * names (`=SUM(...)*2`, `0.1`) have no grid range and pass through.
65
+ *
66
+ * A name whose entire range is deleted is NOT dropped: it keeps its entry
67
+ * with `range` cleared and `value: "#REF!"`, so `=SUM(Data)` evaluates to
68
+ * `#REF!` like Excel rather than `#NAME?`.
69
+ */
70
+ export var updateNamedRangesOnStructuralChange = function (draft, axis, op, index, count, sheetId) {
71
+ var e_1, _a;
72
+ var changed = [];
73
+ var refErrored = [];
74
+ if (count <= 0)
75
+ return { changed: changed, refErrored: refErrored };
76
+ try {
77
+ for (var draft_1 = __values(draft), draft_1_1 = draft_1.next(); !draft_1_1.done; draft_1_1 = draft_1.next()) {
78
+ var namedRange = draft_1_1.value;
79
+ var range = namedRange.range;
80
+ if (!range || range.sheetId !== sheetId)
81
+ continue;
82
+ var next = shiftGridRange(range, axis, op, index, count);
83
+ if (next === range)
84
+ continue;
85
+ if (next === null) {
86
+ namedRange.range = undefined;
87
+ namedRange.value = NAMED_RANGE_REF_ERROR;
88
+ refErrored.push(namedRange);
89
+ continue;
90
+ }
91
+ namedRange.range = next;
92
+ changed.push(namedRange);
93
+ }
94
+ }
95
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
96
+ finally {
97
+ try {
98
+ if (draft_1_1 && !draft_1_1.done && (_a = draft_1.return)) _a.call(draft_1);
99
+ }
100
+ finally { if (e_1) throw e_1.error; }
101
+ }
102
+ return { changed: changed, refErrored: refErrored };
103
+ };
104
+ /**
105
+ * Pure variant of {@link updateNamedRangesOnStructuralChange}: returns the
106
+ * adjusted list (sharing untouched entries) plus the names that changed.
107
+ */
108
+ export var shiftNamedRangesOnStructuralChange = function (namedRanges, axis, op, index, count, sheetId) {
109
+ var changed = [];
110
+ var refErrored = [];
111
+ var next = namedRanges.map(function (namedRange) {
112
+ var range = namedRange.range;
113
+ if (!range || range.sheetId !== sheetId || count <= 0)
114
+ return namedRange;
115
+ var shifted = shiftGridRange(range, axis, op, index, count);
116
+ if (shifted === range)
117
+ return namedRange;
118
+ if (shifted === null) {
119
+ var broken = __assign(__assign({}, namedRange), { range: undefined, value: NAMED_RANGE_REF_ERROR });
120
+ refErrored.push(broken);
121
+ return broken;
122
+ }
123
+ var moved = __assign(__assign({}, namedRange), { range: shifted });
124
+ changed.push(moved);
125
+ return moved;
126
+ });
127
+ return { next: next, changed: changed, refErrored: refErrored };
128
+ };
129
+ /**
130
+ * `_xlnm.Print_Area` / `_xlnm.Print_Titles` are sheet-scoped defined names
131
+ * in Excel and follow the same RefersTo rule as any other name. Mutates the
132
+ * sheet's `printSettings` draft: each print-area rectangle shifts / grows /
133
+ * shrinks (a rectangle wholly deleted is removed; an emptied print area is
134
+ * cleared), and the repeated title rows / columns shift as a band along the
135
+ * edited axis (cleared when every title row / column is deleted).
136
+ */
137
+ export var updatePrintSettingsOnStructuralChange = function (printSettings, axis, op, index, count) {
138
+ var e_2, _a;
139
+ var _b;
140
+ if (count <= 0)
141
+ return false;
142
+ var changed = false;
143
+ if ((_b = printSettings.printArea) === null || _b === void 0 ? void 0 : _b.length) {
144
+ var nextAreas = [];
145
+ try {
146
+ for (var _c = __values(printSettings.printArea), _d = _c.next(); !_d.done; _d = _c.next()) {
147
+ var area = _d.value;
148
+ var next = shiftGridRange(area, axis, op, index, count);
149
+ if (next !== area)
150
+ changed = true;
151
+ if (next)
152
+ nextAreas.push(next);
153
+ }
154
+ }
155
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
156
+ finally {
157
+ try {
158
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
159
+ }
160
+ finally { if (e_2) throw e_2.error; }
161
+ }
162
+ if (changed) {
163
+ if (nextAreas.length) {
164
+ printSettings.printArea = nextAreas;
165
+ }
166
+ else {
167
+ delete printSettings.printArea;
168
+ }
169
+ }
170
+ }
171
+ var titles = printSettings.printTitles;
172
+ if (titles) {
173
+ var _e = __read(axis === "row" ? ["rowStart", "rowEnd"] : ["columnStart", "columnEnd"], 2), startKey = _e[0], endKey = _e[1];
174
+ var start = titles[startKey];
175
+ var end = titles[endKey];
176
+ if (start != null && end != null) {
177
+ var next = shiftNamedBand(start, end, op, index, count);
178
+ if (!next) {
179
+ delete titles[startKey];
180
+ delete titles[endKey];
181
+ changed = true;
182
+ if (titles.rowStart == null &&
183
+ titles.rowEnd == null &&
184
+ titles.columnStart == null &&
185
+ titles.columnEnd == null) {
186
+ delete printSettings.printTitles;
187
+ }
188
+ }
189
+ else if (next[0] !== start || next[1] !== end) {
190
+ titles[startKey] = next[0];
191
+ titles[endKey] = next[1];
192
+ changed = true;
193
+ }
194
+ }
195
+ }
196
+ return changed;
197
+ };
@@ -1,4 +1,4 @@
1
- import type { CellFormat, GridRange } from "@rowsncolumns/common-types";
1
+ import type { CellFormat, CellInterface, GridRange } from "@rowsncolumns/common-types";
2
2
  /**
3
3
  * Format-painter pattern shared by both engines: the captured 2-D format grid plus the
4
4
  * source block's merge configuration, re-based to the block's top-left so it can be tiled
@@ -19,6 +19,20 @@ export type PaintPattern = {
19
19
  * the selected cells, not of the cells around them).
20
20
  */
21
21
  export declare const collectPaintMerges: (merges: GridRange[] | null | undefined, source: GridRange) => GridRange[];
22
+ /**
23
+ * The block the painter captures when it is armed WITHOUT a drag selection. A plain click on a
24
+ * merged cell selects the whole merged area in Excel and Sheets, but the grid reports it as the
25
+ * anchor active cell plus an empty selection list — so the source is the merge containing the
26
+ * active cell when there is one, otherwise the single cell.
27
+ */
28
+ export declare const paintSourceForActiveCell: (merges: GridRange[] | null | undefined, activeCell: CellInterface) => GridRange;
29
+ /**
30
+ * Excel stores a merged area's style on every constituent cell, and the grid paints a merge with
31
+ * its anchor's format. Copy the anchor's captured format over the covered cells of every merge in
32
+ * the pattern (in place) so the painted target carries the fill on all of them — an unmerge at the
33
+ * target, or a partial tile that drops the merge, still leaves every cell looking as it did.
34
+ */
35
+ export declare const spreadMergeAnchorFormats: (formats: (CellFormat | null | undefined)[][], relativeMerges: GridRange[]) => void;
22
36
  /**
23
37
  * Tile a pattern's relative merges across `target` with the pattern's period (`rows` × `cols`),
24
38
  * the same way the format grid itself is tiled by the formatting applier. A merge that a partial
@@ -1 +1 @@
1
- {"version":3,"file":"paint-format.d.ts","sourceRoot":"","sources":["../../../api/paint-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAGxE;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,CAAC,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,CAAC;IAC7C,kFAAkF;IAClF,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAQF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,SAAS,EAAE,GAAG,IAAI,GAAG,SAAS,EACtC,QAAQ,SAAS,KAChB,SAAS,EAaX,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAC1B,gBAAgB,SAAS,EAAE,EAC3B,MAAM,MAAM,EACZ,MAAM,MAAM,EACZ,QAAQ,SAAS,KAChB,SAAS,EAqBX,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAC9B,aAAa,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS,GAAG,IAAI,EACvD,UAAU,MAAM,EAChB,aAAa,MAAM,KAClB,UAAU,GAAG,SACyC,CAAC;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAC5B,UAAU,UAAU,GAAG,IAAI,GAAG,SAAS,EACvC,QAAQ,UAAU,GAAG,SAAS,KAC7B,UAAU,GAAG,IAAI,GAAG,SAWtB,CAAC"}
1
+ {"version":3,"file":"paint-format.d.ts","sourceRoot":"","sources":["../../../api/paint-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,SAAS,EACV,MAAM,4BAA4B,CAAC;AAGpC;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,CAAC,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,CAAC;IAC7C,kFAAkF;IAClF,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAQF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,SAAS,EAAE,GAAG,IAAI,GAAG,SAAS,EACtC,QAAQ,SAAS,KAChB,SAAS,EAaX,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GACnC,QAAQ,SAAS,EAAE,GAAG,IAAI,GAAG,SAAS,EACtC,YAAY,aAAa,KACxB,SAkBF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GACnC,SAAS,CAAC,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,EAC5C,gBAAgB,SAAS,EAAE,KAC1B,IAYF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAC1B,gBAAgB,SAAS,EAAE,EAC3B,MAAM,MAAM,EACZ,MAAM,MAAM,EACZ,QAAQ,SAAS,KAChB,SAAS,EAqBX,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAC9B,aAAa,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS,GAAG,IAAI,EACvD,UAAU,MAAM,EAChB,aAAa,MAAM,KAClB,UAAU,GAAG,SACyC,CAAC;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAC5B,UAAU,UAAU,GAAG,IAAI,GAAG,SAAS,EACvC,QAAQ,UAAU,GAAG,SAAS,KAC7B,UAAU,GAAG,IAAI,GAAG,SAWtB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { __assign, __read, __values } from "tslib";
2
- import { cellIdentifier } from "@rowsncolumns/grid";
2
+ import { cellIdentifier, isCellWithinBounds } from "@rowsncolumns/grid";
3
3
  var rangeContains = function (outer, inner) {
4
4
  return inner.startRowIndex >= outer.startRowIndex &&
5
5
  inner.endRowIndex <= outer.endRowIndex &&
@@ -39,6 +39,65 @@ export var collectPaintMerges = function (merges, source) {
39
39
  }
40
40
  return out;
41
41
  };
42
+ /**
43
+ * The block the painter captures when it is armed WITHOUT a drag selection. A plain click on a
44
+ * merged cell selects the whole merged area in Excel and Sheets, but the grid reports it as the
45
+ * anchor active cell plus an empty selection list — so the source is the merge containing the
46
+ * active cell when there is one, otherwise the single cell.
47
+ */
48
+ export var paintSourceForActiveCell = function (merges, activeCell) {
49
+ var merge = merges === null || merges === void 0 ? void 0 : merges.find(function (candidate) {
50
+ return isCellWithinBounds(activeCell, candidate);
51
+ });
52
+ if (merge) {
53
+ return {
54
+ startRowIndex: merge.startRowIndex,
55
+ endRowIndex: merge.endRowIndex,
56
+ startColumnIndex: merge.startColumnIndex,
57
+ endColumnIndex: merge.endColumnIndex,
58
+ };
59
+ }
60
+ return {
61
+ startRowIndex: activeCell.rowIndex,
62
+ endRowIndex: activeCell.rowIndex,
63
+ startColumnIndex: activeCell.columnIndex,
64
+ endColumnIndex: activeCell.columnIndex,
65
+ };
66
+ };
67
+ /**
68
+ * Excel stores a merged area's style on every constituent cell, and the grid paints a merge with
69
+ * its anchor's format. Copy the anchor's captured format over the covered cells of every merge in
70
+ * the pattern (in place) so the painted target carries the fill on all of them — an unmerge at the
71
+ * target, or a partial tile that drops the merge, still leaves every cell looking as it did.
72
+ */
73
+ export var spreadMergeAnchorFormats = function (formats, relativeMerges) {
74
+ var e_2, _a;
75
+ var _b;
76
+ try {
77
+ for (var relativeMerges_1 = __values(relativeMerges), relativeMerges_1_1 = relativeMerges_1.next(); !relativeMerges_1_1.done; relativeMerges_1_1 = relativeMerges_1.next()) {
78
+ var merge = relativeMerges_1_1.value;
79
+ var anchor = (_b = formats[merge.startRowIndex]) === null || _b === void 0 ? void 0 : _b[merge.startColumnIndex];
80
+ for (var r = merge.startRowIndex; r <= merge.endRowIndex; r++) {
81
+ var row = formats[r];
82
+ if (!row)
83
+ continue;
84
+ for (var c = merge.startColumnIndex; c <= merge.endColumnIndex; c++) {
85
+ if (r === merge.startRowIndex && c === merge.startColumnIndex)
86
+ continue;
87
+ if (c < row.length)
88
+ row[c] = anchor;
89
+ }
90
+ }
91
+ }
92
+ }
93
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
94
+ finally {
95
+ try {
96
+ if (relativeMerges_1_1 && !relativeMerges_1_1.done && (_a = relativeMerges_1.return)) _a.call(relativeMerges_1);
97
+ }
98
+ finally { if (e_2) throw e_2.error; }
99
+ }
100
+ };
42
101
  /**
43
102
  * Tile a pattern's relative merges across `target` with the pattern's period (`rows` × `cols`),
44
103
  * the same way the format grid itself is tiled by the formatting applier. A merge that a partial
@@ -46,15 +105,15 @@ export var collectPaintMerges = function (merges, source) {
46
105
  * that the user did not drag over.
47
106
  */
48
107
  export var tilePaintMerges = function (relativeMerges, rows, cols, target) {
49
- var e_2, _a;
108
+ var e_3, _a;
50
109
  if (!relativeMerges.length || rows <= 0 || cols <= 0)
51
110
  return [];
52
111
  var out = [];
53
112
  for (var top_1 = target.startRowIndex; top_1 <= target.endRowIndex; top_1 += rows) {
54
113
  for (var left = target.startColumnIndex; left <= target.endColumnIndex; left += cols) {
55
114
  try {
56
- for (var relativeMerges_1 = (e_2 = void 0, __values(relativeMerges)), relativeMerges_1_1 = relativeMerges_1.next(); !relativeMerges_1_1.done; relativeMerges_1_1 = relativeMerges_1.next()) {
57
- var merge = relativeMerges_1_1.value;
115
+ for (var relativeMerges_2 = (e_3 = void 0, __values(relativeMerges)), relativeMerges_2_1 = relativeMerges_2.next(); !relativeMerges_2_1.done; relativeMerges_2_1 = relativeMerges_2.next()) {
116
+ var merge = relativeMerges_2_1.value;
58
117
  var placed = {
59
118
  startRowIndex: top_1 + merge.startRowIndex,
60
119
  endRowIndex: top_1 + merge.endRowIndex,
@@ -65,12 +124,12 @@ export var tilePaintMerges = function (relativeMerges, rows, cols, target) {
65
124
  out.push(placed);
66
125
  }
67
126
  }
68
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
127
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
69
128
  finally {
70
129
  try {
71
- if (relativeMerges_1_1 && !relativeMerges_1_1.done && (_a = relativeMerges_1.return)) _a.call(relativeMerges_1);
130
+ if (relativeMerges_2_1 && !relativeMerges_2_1.done && (_a = relativeMerges_2.return)) _a.call(relativeMerges_2);
72
131
  }
73
- finally { if (e_2) throw e_2.error; }
132
+ finally { if (e_3) throw e_3.error; }
74
133
  }
75
134
  }
76
135
  }
@@ -90,7 +149,7 @@ export var getBandedCellFormat = function (bandedCells, rowIndex, columnIndex) {
90
149
  * `undefined` never clobbers a banded value.
91
150
  */
92
151
  export var layerBandedFormat = function (explicit, banded) {
93
- var e_3, _a;
152
+ var e_4, _a;
94
153
  if (!banded)
95
154
  return explicit;
96
155
  var merged = __assign({}, banded);
@@ -103,12 +162,12 @@ export var layerBandedFormat = function (explicit, banded) {
103
162
  }
104
163
  }
105
164
  }
106
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
165
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
107
166
  finally {
108
167
  try {
109
168
  if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
110
169
  }
111
- finally { if (e_3) throw e_3.error; }
170
+ finally { if (e_4) throw e_4.error; }
112
171
  }
113
172
  }
114
173
  return merged;
@@ -1,17 +1,61 @@
1
1
  import type { GridRange, SheetRange } from "@rowsncolumns/common-types";
2
2
  import type { WritableDraft } from "immer";
3
3
  type RangedRuleAxis = "row" | "column";
4
+ /**
5
+ * Sheet-name lookup the rule-formula rewrite needs to scope references:
6
+ * unqualified references in a CF/DV formula resolve on the sheet the rule's
7
+ * applies-to range lives on, so only when that is the edited sheet do they
8
+ * move; `EditedSheet!`-qualified references move from any sheet.
9
+ */
10
+ export type RuleFormulaScope = {
11
+ getSheetName(sheetId: number): string;
12
+ };
13
+ export type RuleFormulaStructuralParams = {
14
+ op: "insert" | "delete";
15
+ axis: RangedRuleAxis;
16
+ /** 1-based index the rows/columns are inserted at / deleted from. */
17
+ index: number;
18
+ count: number;
19
+ /** Name of the sheet being edited. */
20
+ editedSheetName: string;
21
+ /** Name of the sheet the rule's applies-to range lives on. */
22
+ ruleSheetName: string;
23
+ /**
24
+ * How many rows/columns (along `axis`) the rule's top-left cell moved
25
+ * WITHIN the pre-edit grid because the previous top-left was deleted —
26
+ * the surviving top-left's instance formula becomes the rule text, so
27
+ * relative references are re-anchored by this delta first. 0 otherwise.
28
+ */
29
+ anchorRebase?: number;
30
+ };
31
+ /**
32
+ * Rewrite one CF / DV formula (`=…`) for a sheet-level insert or delete,
33
+ * exactly as Excel rewrites the rule text: the formula is read as if it
34
+ * were entered in the rule's top-left cell, so relative and absolute
35
+ * references alike are grid positions that shift when they sit at/after
36
+ * the edit (`=$A1>$C$10` + insert row 5 → `=$A1>$C$11`), ranges spanning
37
+ * the edit grow / shrink, and a reference inside a deleted band becomes
38
+ * `#REF!`. Returns the input unchanged when it is not a formula or when
39
+ * no reference moved.
40
+ */
41
+ export declare const shiftRuleFormulaForStructuralChange: (formula: string, { op, axis, index, count, editedSheetName, ruleSheetName, anchorRebase, }: RuleFormulaStructuralParams) => string;
4
42
  /**
5
43
  * Apply an insert or delete range adjustment to a list of rules whose
6
44
  * `ranges: SheetRange[]` field references cells. Used for tables, conditional
7
45
  * formats, data validations, etc. Mutates the immer draft in place; rules
8
46
  * whose ranges all collapse to nothing are spliced out.
9
47
  *
48
+ * When `formulaScope` is given, each rule's condition formulas
49
+ * (`booleanRule.condition.values[].userEnteredValue` for CF,
50
+ * `condition.values[].userEnteredValue` for DV — those starting with `=`)
51
+ * are rewritten as if entered in the rule's applies-to top-left cell, see
52
+ * {@link shiftRuleFormulaForStructuralChange}.
53
+ *
10
54
  * Walks `draft` from the end so splice indices don't shift mid-iteration.
11
55
  */
12
56
  export declare const updateRangedRulesOnStructuralChange: <R extends {
13
57
  ranges?: SheetRange[] | null;
14
- }>(draft: WritableDraft<R>[], op: "insert" | "delete", axis: RangedRuleAxis, index: number, count: number, sheetId: number) => void;
58
+ }>(draft: WritableDraft<R>[], op: "insert" | "delete", axis: RangedRuleAxis, index: number, count: number, sheetId: number, formulaScope?: RuleFormulaScope) => void;
15
59
  /**
16
60
  * Returns true when a sheet range has any cells in the given grid bounds.
17
61
  * Cheap pre-check used by callers to skip patch generation for sheets that
@@ -1 +1 @@
1
- {"version":3,"file":"range-rule-helpers.d.ts","sourceRoot":"","sources":["../../../api/range-rule-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,KAAK,cAAc,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEvC;;;;;;;GAOG;AACH,eAAO,MAAM,mCAAmC,GAC9C,CAAC,SAAS;IAAE,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;CAAE,EAE1C,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE,EACzB,IAAI,QAAQ,GAAG,QAAQ,EACvB,MAAM,cAAc,EACpB,OAAO,MAAM,EACb,OAAO,MAAM,EACb,SAAS,MAAM,SAkBhB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAC5B,OAAO,UAAU,EACjB,SAAS,MAAM,EACf,QAAQ,SAAS,YASlB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,MAAM,EACb,YAAY,MAAM,EAClB,WAAW,MAAM,EACjB,gBAAgB,MAAM,KACrB,MAiBF,CAAC;AAEF,KAAK,WAAW,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEpC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B,GACrC,CAAC,SAAS;IAAE,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;CAAE,EAE1C,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE,EACzB,MAAM,WAAW,EACjB,YAAY,MAAM,EAClB,WAAW,MAAM,EACjB,gBAAgB,MAAM,EACtB,SAAS,MAAM;AACf;;;;;;;;;GASG;AACH,qBAAqB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,SAkEpD,CAAC"}
1
+ {"version":3,"file":"range-rule-helpers.d.ts","sourceRoot":"","sources":["../../../api/range-rule-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,SAAS,EACT,UAAU,EACX,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAS3C,KAAK,cAAc,GAAG,KAAK,GAAG,QAAQ,CAAC;AAMvC;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACxB,IAAI,EAAE,cAAc,CAAC;IACrB,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,mCAAmC,GAC9C,SAAS,MAAM,EACf,2EAQG,2BAA2B,KAC7B,MAoHF,CAAC;AAsBF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,mCAAmC,GAC9C,CAAC,SAAS;IAAE,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;CAAE,EAE1C,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE,EACzB,IAAI,QAAQ,GAAG,QAAQ,EACvB,MAAM,cAAc,EACpB,OAAO,MAAM,EACb,OAAO,MAAM,EACb,SAAS,MAAM,EACf,eAAe,gBAAgB,SA8ChC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAC5B,OAAO,UAAU,EACjB,SAAS,MAAM,EACf,QAAQ,SAAS,YASlB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,MAAM,EACb,YAAY,MAAM,EAClB,WAAW,MAAM,EACjB,gBAAgB,MAAM,KACrB,MAiBF,CAAC;AAEF,KAAK,WAAW,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEpC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B,GACrC,CAAC,SAAS;IAAE,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;CAAE,EAE1C,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE,EACzB,MAAM,WAAW,EACjB,YAAY,MAAM,EAClB,WAAW,MAAM,EACjB,gBAAgB,MAAM,EACtB,SAAS,MAAM;AACf;;;;;;;;;GASG;AACH,qBAAqB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,SAkEpD,CAAC"}