@sheetxl/sdk 0.8.0-beta.17 → 0.8.0-beta.18

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 (110) hide show
  1. package/browser/esm/{CAjITJT3eLst9Rhi.mjs → -P0fym6eh9hn9row.mjs} +2 -2
  2. package/browser/esm/{CFywn1iiD35nNNUP.mjs → -nOfWMHdlTb9ShjF.mjs} +9 -9
  3. package/browser/esm/{Byp_bvP9G-tN6hcz.mjs → 0Mw5Ew_7tAiWgc5J.mjs} +14 -14
  4. package/browser/esm/{CHByUyHFA3ESf7DX.mjs → 1ktaHvjuYL6stU4C.mjs} +1 -1
  5. package/browser/esm/{CVV4xqwD8gIjYj1E.mjs → B3ifnlsuky2L9HmB.mjs} +33 -33
  6. package/browser/esm/{WR3-xqcK1gF3ewAR.mjs → B67q5ZrwyKvm3d6W.mjs} +3 -3
  7. package/browser/esm/{DTXsi--x2wgqgwtf.mjs → BQSd_URWugiyNoNj.mjs} +2 -2
  8. package/browser/esm/{C0o6WpBojS7XhV5m.mjs → BWHHWC6H2JgG11Kq.mjs} +2 -2
  9. package/browser/esm/{BlkstmZEklk6Y1QD.mjs → BYbb2weYQCb_7KI3.mjs} +21 -21
  10. package/browser/esm/{DJTEQZiR9IFTuN_4.mjs → B_hrmyuWaH5VIFpV.mjs} +2 -2
  11. package/browser/esm/{O970I8lbI7okqG7N.mjs → Bql31KGUYo0SCMwZ.mjs} +392 -392
  12. package/browser/esm/{YwDdO4YwcIE4OB0D.mjs → BtVpErObXYKJCwHG.mjs} +1 -1
  13. package/browser/esm/{B-Q1-7RgSnA75J32.mjs → By7_c19Kv2YQaDVF.mjs} +475 -475
  14. package/browser/esm/{taTjDyUIIxq2eClH.mjs → C6M_XM08QtHuaInQ.mjs} +3 -3
  15. package/browser/esm/{DDNerAeet8uDYKhf.mjs → CBHwju4PYiv85_jD.mjs} +2 -2
  16. package/browser/esm/{Dx_dZ7jrw5Hxeoot.mjs → CJhYhZtsey3OnWKd.mjs} +1 -1
  17. package/browser/esm/{DnMFW_oKYQxRjP1l.mjs → CQlxAbhdxgfu0ERF.mjs} +1 -1
  18. package/browser/esm/{CLT3qGy_brDIwbYd.mjs → CVXOtvee4oFImGyR.mjs} +504 -504
  19. package/browser/esm/{Dlk1kRgkiBIpUxd9.mjs → CXQLYHAhE5MLKxZ4.mjs} +37 -37
  20. package/browser/esm/{jotvQFBWO2jXAhWx.mjs → CZiJYw94Yt7xslXS.mjs} +1 -1
  21. package/browser/esm/{aYpwVCDSwMUuz147.mjs → ChRUNekYurtOtrP1.mjs} +113 -113
  22. package/browser/esm/{JmmPE8Vsj85wdV8H.mjs → CnobgPLHEsTPTFY5.mjs} +1 -1
  23. package/browser/esm/{DGUOlgm1_WFmf_xO.mjs → CxNnMvwtOf76r7yY.mjs} +1 -1
  24. package/browser/esm/{DW3kFc5t4Wnh5E9S.mjs → CzmmdfrOYDUGx-Yh.mjs} +1 -1
  25. package/browser/esm/{XHhDDWrJiZJgWxPM.mjs → D2P43UD6TGSXErhr.mjs} +2 -2
  26. package/browser/esm/{DrmOaEx6CQ91zBsP.mjs → DH8NuKmZAC9EaqwP.mjs} +18 -18
  27. package/browser/esm/{DUB6Oj_aiV3f8s5_.mjs → DJuiV0Y8olnwuqB-.mjs} +21 -21
  28. package/browser/esm/{DkmqFp_-iUIy_l3D.mjs → DKFaQ2QOyUPCk0sD.mjs} +3 -3
  29. package/browser/esm/{BI6NwRrdLCbPdz6f.mjs → DLR8g1DkooIBl8S1.mjs} +2 -2
  30. package/browser/esm/{DsWDvmky7CgzX_7W.mjs → DNAXbbB8DGE2xeHy.mjs} +2 -2
  31. package/browser/esm/{BY_-BTa5h6HnnZ1W.mjs → DQTUUXcERWI4l0to.mjs} +2 -2
  32. package/browser/esm/{DJrnSjYjFxJvpQiH.mjs → DpFowFtk9AeU-89B.mjs} +1 -1
  33. package/browser/esm/{Dy0TAi9WafVT8eke.mjs → DyRVg5YJn7voOO6z.mjs} +2 -2
  34. package/browser/esm/{qNv1x-Ny9TPbvZzj.mjs → Pn5Jc-47dk16sYQ4.mjs} +1 -1
  35. package/browser/esm/{CWkaF7gYWCkW7vDA.mjs → _WWjW2f-YW-AVqAL.mjs} +1 -1
  36. package/browser/esm/{gQzj95vSMXdKhpWf.mjs → _lh_Rr5SwLthmbmu.mjs} +7797 -5857
  37. package/browser/esm/index.mjs +367 -366
  38. package/browser/esm/{yudASWe8CWXYcGt3.mjs → mecFApGwMvcIzlpd.mjs} +36 -36
  39. package/browser/esm/{mufbL88lyIKJEWyP.mjs → n4LOSiYtWTzqQa4w.mjs} +661 -661
  40. package/{node/esm/Cle-_21jebWv_-D4.mjs → browser/esm/tJB0V8fKbukOYt9U.mjs} +2 -2
  41. package/browser/esm/{BWNQcQyx8wt6huOq.mjs → yRhetuEQfV7moa4B.mjs} +1 -1
  42. package/browser/esm/{BuKA3E-Ev8Dp5W2I.mjs → ybFoQ6IijUJnBeCF.mjs} +1 -1
  43. package/node/esm/{Yo7_havHbr9VL8R4.mjs → 0313aQKBU4DE3v2j.mjs} +1 -1
  44. package/node/esm/{DfrxGbxxowFmm3SF.mjs → 3gjEEXV2aSt7cKeD.mjs} +1 -1
  45. package/node/esm/{NnrDjio_xwTBs05n.mjs → 3smtwEJ0ASF0tKBY.mjs} +2 -2
  46. package/node/esm/{cRz94rkuvDrA8mr9.mjs → 4k3KKByrUw2Wr2TX.mjs} +1 -1
  47. package/node/esm/{jqBKdf9DG54xqpaw.mjs → 90jp-mCVEr43zZTj.mjs} +2 -2
  48. package/node/esm/{OCrS6pBT6lGRu82d.mjs → BAEmzj0gb8Cbgz7p.mjs} +3293 -3293
  49. package/node/esm/{CIxb44vA81H9lRip.mjs → BBC5dL9bXzOrQDGY.mjs} +1 -1
  50. package/node/esm/{7ZwdVIsOdcziHpMD.mjs → BV0cJ_YP_0qzJuPt.mjs} +180 -180
  51. package/node/esm/{DxnBYzOueAKEqaQT.mjs → BcxcYoF_4GFL7Zkl.mjs} +15 -15
  52. package/node/esm/{BwyoLlHutolJw7OW.mjs → BesaVk0x7UyfLDk2.mjs} +1 -1
  53. package/node/esm/{ClJJC8tBpgsqHwdn.mjs → C-LmDC9oNcbENOK1.mjs} +1 -1
  54. package/node/esm/{BSlFO0_8UZ38gfeE.mjs → CDkUQn5AwYGomlsT.mjs} +36 -36
  55. package/node/esm/{CjCqcGyCYGkaMQI9.mjs → CE4I5qfVmUBf7mED.mjs} +1 -1
  56. package/node/esm/{DgsBYF3xbjgx9Mzp.mjs → CO0UDgbkHGwyTfev.mjs} +1 -1
  57. package/node/esm/{DfbVTAhNutxM74E8.mjs → CTWihjVB5uFX7U4j.mjs} +2 -2
  58. package/node/esm/{-q1xF3_2jmk3QHIY.mjs → CUNaLYCntlclipWu.mjs} +497 -497
  59. package/node/esm/{BhosJbKOPgbJSZMY.mjs → CY9JqXFJTt5pGhC3.mjs} +1 -1
  60. package/node/esm/{B6BQYUDRxbRnzca4.mjs → C_Sqy290v4uzyi1E.mjs} +3 -3
  61. package/node/esm/{BoLecFnIxhYKGor-.mjs → Cf-cK3yPe9bjK6o2.mjs} +561 -561
  62. package/node/esm/{Cb1-r2RCxcJZB6fM.mjs → CpvUwhAeDmdEpdR-.mjs} +10018 -8039
  63. package/{browser/esm/DCs7bk-yx0UhCvQ4.mjs → node/esm/Crhg3srH-O5sJERh.mjs} +2 -2
  64. package/node/esm/{M3jahkTgfUxGyeZv.mjs → Cx2U91jhiTDz600y.mjs} +116 -116
  65. package/node/esm/{BQko-9y6mf2oQK7u.mjs → CyWWKan_uk4dHZ6P.mjs} +1 -1
  66. package/node/esm/{Bgy7uWJVGwkN7AlD.mjs → D48MjKzkj37XsVm1.mjs} +2 -2
  67. package/node/esm/{XhDjStxKy-dd3WKa.mjs → D7c0zfLVoG7EEln5.mjs} +43 -43
  68. package/node/esm/{CIlH2fSEpdYBZwUA.mjs → D8J4JmOPwG_Yr2GD.mjs} +1 -1
  69. package/node/esm/{oGGVbqahqfK45-Uz.mjs → D91qb21TrJX98Rw8.mjs} +3 -3
  70. package/node/esm/{btVWSwUwMjM0J5fS.mjs → D9D2NyyKbWXpTj5I.mjs} +2 -2
  71. package/node/esm/{DCSJKgcCQzOV-dMJ.mjs → DBF7pIpitcmhi65H.mjs} +2 -2
  72. package/node/esm/{CDgUHRW6vSASfqNr.mjs → DLPVrV723TSxkXqL.mjs} +1 -1
  73. package/node/esm/{DTkV7IK2_ODMJAP5.mjs → DWsnb-a-9dfRn5jJ.mjs} +24 -24
  74. package/node/esm/{DCaLNIs-_4Y6hJ8S.mjs → Dj1pybJRqeZiP1Z6.mjs} +1 -1
  75. package/node/esm/{BBUVvO9Ma1RzbKux.mjs → DtNJOImWtsXVrQps.mjs} +2 -2
  76. package/node/esm/{zh6vcRzFqdV1aYh5.mjs → DxROQlX1KHLb9tHS.mjs} +1 -1
  77. package/node/esm/{B8MYgBe4XICBSROW.mjs → dp4LxzOEkfTbVX_1.mjs} +21 -21
  78. package/node/esm/{CHS84ZGEoH6aeHsZ.mjs → ee_DgHTffiVTOiU2.mjs} +21 -21
  79. package/node/esm/{fwfAgq8qIADcHmY4.mjs → fMFapG4AGMQKX8c5.mjs} +33 -33
  80. package/node/esm/index.mjs +545 -544
  81. package/node/esm/{nxxwAZZF8NsdErJW.mjs → jmElgIMAkpc2Ab1m.mjs} +1 -1
  82. package/node/esm/{D51xu0rubo34Ppeg.mjs → yVJ2lEYZob1gwiRZ.mjs} +14 -14
  83. package/package.json +6 -6
  84. package/resources/locales/de/model.msg.json +15 -0
  85. package/resources/locales/en/model.msg.json +15 -0
  86. package/types/scripting-api.json +11445 -11299
  87. package/types/scripting-enums.json +22 -1
  88. package/types/scripting.d.ts +623 -0
  89. package/types/src/address/index.d.ts +2 -0
  90. package/types/src/anomalies/_Anomalies.d.ts +34 -0
  91. package/types/src/anomalies/_CompletenessChecks.d.ts +32 -0
  92. package/types/src/cell/ICell.d.ts +36 -1
  93. package/types/src/cellRange/ICellRange.d.ts +106 -0
  94. package/types/src/index.d.ts +1 -0
  95. package/types/src/license/runtime.browser.d.ts +3 -1
  96. package/types/src/sheet/IWorksheet.d.ts +17 -0
  97. package/types/src/sheet/SheetCell.d.ts +3 -0
  98. package/types/src/sheet/SheetRange.d.ts +6 -0
  99. package/types/src/sheet/Worksheet.d.ts +103 -1
  100. package/types/src/sheet/_ListenerAnchor.d.ts +14 -0
  101. package/types/src/sheet/_SheetStateTypes.d.ts +13 -0
  102. package/types/src/sparkline/ISparklineGroup.d.ts +338 -0
  103. package/types/src/sparkline/ISparklineGroupCollection.d.ts +68 -0
  104. package/types/src/sparkline/SparklineGroup.d.ts +271 -0
  105. package/types/src/sparkline/SparklineGroupCollection.d.ts +25 -0
  106. package/types/src/sparkline/SparklineRanges.d.ts +195 -0
  107. package/types/src/sparkline/index.d.ts +4 -0
  108. package/types/src/sparkline/layout/SparklineLayout.d.ts +71 -0
  109. package/types/src/sparkline/layout/_layoutSparkline.d.ts +42 -0
  110. package/types/src/sparkline/layout/index.d.ts +2 -0
@@ -29,6 +29,8 @@ export declare namespace AddressUtils {
29
29
  const refToRun: <T = any>(ref: IRange.JSONReference<T>, isColumn: boolean) => RunCoordValue<T> | null;
30
30
  /** {@inheritDoc runToRef} */
31
31
  const runsToRefs: <T = any>(runs: readonly Readonly<RunCoordValue<T>>[], isColumn: boolean) => IRange.JSONReferenceEntry<T>[];
32
+ /** Splits an address list at its `,` separators, skipping those in a quoted sheet name or brackets. */
33
+ const splitAddressList: (address: string) => string[];
32
34
  /** {@inheritDoc refToRun} */
33
35
  const refsToRuns: <T = any>(refs: readonly IRange.JSONReference<T>[], isColumn: boolean) => RunCoordValue<T>[];
34
36
  }
@@ -38,6 +38,8 @@ export interface AnomalySource extends RoleSource {
38
38
  readonly isProtected: boolean;
39
39
  /** The font colors the workbook's other sheets write their roles in ({@link roleColorsOf}). */
40
40
  readonly workbookRoleColors: () => ReadonlySet<string>;
41
+ /** The cells of this sheet the workbook's other sheets' formulas read ({@link foreignReadsOf}). */
42
+ readonly workbookReads: () => ISpatialQuery<unknown>;
41
43
  }
42
44
  type Rect = IRange.Coords;
43
45
  /** @internal */
@@ -89,6 +91,32 @@ export interface FormulaRegion {
89
91
  /** The formula in R1C1, which is what agrees between two cells of one run. */
90
92
  readonly r1c1: string;
91
93
  }
94
+ /** @internal */
95
+ export declare class _FormatKeys {
96
+ private readonly _styles;
97
+ private readonly _normal;
98
+ private readonly _named;
99
+ constructor(_styles: IStyleCollection);
100
+ keyOf(props: Readonly<ICellStyle.Properties> | null, part: 'font' | 'fill' | 'numberFormat' | 'alignment'): string;
101
+ /**
102
+ * The font color a cell claims, as `#RRGGBB`: its own, else its named style's, else the Normal
103
+ * style's. A theme color resolves through the workbook's theme, so an unformatted cell and one
104
+ * authored in the theme's text color are one key.
105
+ */
106
+ fontColorOf(props: Readonly<ICellStyle.Properties> | null): string;
107
+ private _toHex;
108
+ private readonly _hex;
109
+ private _namedProps;
110
+ }
111
+ /**
112
+ * The cells of `target` that the formulas of `others` read, as rectangles: what `unreferencedInput`
113
+ * subtracts from a sheet's own unread inputs. A filled formula region is read at its first and
114
+ * last cells and the two references' bounding box is taken, which overstates a diagonal fill and
115
+ * never understates. With the engine off there is no compiler for a detached formula, and a
116
+ * region whose formula is not compiled reads nothing.
117
+ * @internal
118
+ */
119
+ export declare function foreignReadsOf(target: IWorksheet, others: readonly IWorksheet[]): ISpatialMap<boolean>;
92
120
  /**
93
121
  * The role layer (`ICellRange.Feature.Role`): the kind layer refined by what a formula reads and
94
122
  * by who reads a cell. Typed cells are `label` (nothing reads them) or `input` (something does); a
@@ -105,5 +133,11 @@ export declare function buildRoles(source: RoleSource): ISpatialMap<ICell.Role>;
105
133
  * @internal
106
134
  */
107
135
  export declare function roleColorsOf(source: AnomalySource): ReadonlySet<string>;
136
+ /** The parts of `rects` that none of `held` covers. @internal */
137
+ export declare function minusHeld(rects: readonly Rect[], held: readonly Rect[]): Rect[];
138
+ /** @internal */
139
+ export declare const intersect: (a: Rect, b: Rect) => Rect | null;
140
+ /** The parts of `rects` inside `bounds`. @internal */
141
+ export declare const clipAll: (rects: readonly Rect[], bounds: Rect) => Rect[];
108
142
  export {};
109
143
  //# sourceMappingURL=_Anomalies.d.ts.map
@@ -0,0 +1,32 @@
1
+ import { ISpatialMap } from '../collections';
2
+ import { AnomalySource, _Findings, _FormatKeys } from './_Anomalies';
3
+ /**
4
+ * `unreferencedInput`: a typed number (or date) beside a label that no formula in the workbook
5
+ * reads — `Tax rate 21%` where nothing computes a tax. The role layer says what this sheet's
6
+ * formulas read, and what the other sheets read (`workbookReads`) is subtracted too. A labeled
7
+ * line fires only when none of its typed numbers is read anywhere: a historical row whose last
8
+ * period feeds a forecast is data in use, not an assumption left out. A line of three or more
9
+ * numbers at a constant step (years, period counts) is a header and never fires. One finding per
10
+ * labeled line, by its row label, else its column label, ranked down by the cells it holds: a
11
+ * lone cell is an assumption, a twelve-cell row is data.
12
+ */
13
+ export declare function checkUnreferencedInput(source: AnomalySource, findings: _Findings): void;
14
+ /**
15
+ * `rowGap`: a labeled row with nothing where its block or its header has columns — the line of a
16
+ * schedule left out, its first period, or a whole period never built. The label is the row's
17
+ * first filled cell when it is text. A block is a run of filled rows with no blank row between
18
+ * (one spacer row still joins); its columns are every column, past the label, that any other row
19
+ * of the block fills, so a first-period column that only the block's last line fills still counts.
20
+ * The nearest header row above (text, dates or a numeric series past its first cell, no formula)
21
+ * adds its columns, so a period the header names and no row fills is a gap too; a row with no
22
+ * header above it (a title, a note) has no periods and never fires. `missing` of `of`
23
+ * says how much of the row is empty: a row with some of those cells filled is a line with a period
24
+ * left out and ranks in full, an empty row at half; a column only the header supplies ranks at
25
+ * two thirds (`header`, the period's label, says so). A label in a font neither neighbor's label
26
+ * shares reads as a heading (`labelFont: 'own'`) and ranks at a third: a heading has nothing to
27
+ * its right by design.
28
+ */
29
+ export declare function checkRowGap(source: AnomalySource, formats: _FormatKeys, findings: _Findings): void;
30
+ /** @internal */
31
+ export type { ISpatialMap };
32
+ //# sourceMappingURL=_CompletenessChecks.d.ts.map
@@ -3,8 +3,9 @@ import { Size, Rectangle, Bounds } from '@sheetxl/utils';
3
3
  import { ITypes } from '../type';
4
4
  import { ITextFrame, TextRotation, TextStacked, IRichText } from '../text';
5
5
  import { NumberFormat } from '../numFmt';
6
- import { IConditionalFormat } from '../conditionalFormat/IConditionalFormat';
6
+ import { IConditionalFormat } from '../conditionalFormat';
7
7
  import { ICellControl } from '../cellControl';
8
+ import { ISparklineGroup } from '../sparkline';
8
9
  import { IHyperlink } from '../hyperlink';
9
10
  import { IComment } from '../comment';
10
11
  import { ICellStyle } from '../style';
@@ -367,6 +368,15 @@ export interface ICell {
367
368
  * checkbox cell holding `2` has a control and draws `2`.
368
369
  */
369
370
  getControl(): ICellControl | null;
371
+ /**
372
+ * Returns the cell's sparkline, or `null` when it has none.
373
+ *
374
+ * @remarks
375
+ * The sparkline is the cell's view of its group: what it draws
376
+ * ({@link ISparklineGroup.ISparkline.getDataRange}) and how ({@link ISparklineGroup.ISparkline.getGroup}).
377
+ * A cell has at most one. It is drawn over the cell's value, which it leaves as it is.
378
+ */
379
+ getSparkline(): ISparklineGroup.ISparkline | null;
370
380
  /**
371
381
  * Returns `true` if the cell contains a value.
372
382
  *
@@ -779,6 +789,14 @@ export declare namespace ICell {
779
789
  * `range.getDataValidation().clear()`.
780
790
  */
781
791
  readonly DataValidations: "dataValidations";
792
+ /**
793
+ * Represents the sparklines drawn in the cells.
794
+ * @remarks
795
+ * A clear takes the cells out of their sparkline groups; a group left with no cell is
796
+ * deleted. Excel's Sparkline > Clear. Clear Contents and Clear Formats leave a sparkline, as in
797
+ * Excel; Clear All removes it.
798
+ */
799
+ readonly Sparklines: "sparklines";
782
800
  };
783
801
  type Content = typeof Content[keyof typeof Content];
784
802
  /**
@@ -888,6 +906,10 @@ export declare namespace ICell {
888
906
  readonly TwinBlockDivergence: "twinBlockDivergence";
889
907
  /** A typed number an order of magnitude or more off the numbers typed in its format on the sheet. */
890
908
  readonly ScaleOutlier: "scaleOutlier";
909
+ /** A typed number beside a label that no formula in the workbook reads: an assumption the model never uses. */
910
+ readonly UnreferencedInput: "unreferencedInput";
911
+ /** A labeled row with nothing where the rows above and below hold values: a line left out, or a period of it. */
912
+ readonly RowGap: "rowGap";
891
913
  /** A constant typed into a formula — a number, a string or a boolean — and how often the workbook types it. */
892
914
  readonly ConstantFrequency: "constantFrequency";
893
915
  };
@@ -927,6 +949,8 @@ export declare namespace ICell {
927
949
  * | `literalMatchesInput` | `literal`, the number as the formula types it; `inputAt`, the nearest typed number of that value no formula reads; `label` / `labelAt`, that input's label, when it has one; `matches`, the places the value is typed unread |
928
950
  * | `twinBlockDivergence` | `part` (`'literal'` / `'sign'`); for a literal, `literal` and `expected`, this formula's number and its twins'; for a sign, `term` of `terms`, the term that differs, `references`, how many the shape holds, and `sign`, how this formula adds it; `twins`, how many formulas carry the other side; `twinAt`, one of them |
929
951
  * | `scaleOutlier` | `format` (`'percent'`); `times`, the power of ten the value is off by; `typical`, the median of the sheet's typed numbers in that format; `of`, how many there are |
952
+ * | `unreferencedInput` | `label` / `labelAt`, the line's label; `cells`, the typed numbers on the line nothing reads; `value`, the number as shown, for a line of one cell |
953
+ * | `rowGap` | `label` / `labelAt`, the row's label; `missing` of `of`, the empty cells among those filled in both neighbor rows; `kind` (`'cells'`, some of the row is filled; `'row'`, none of it); `above` / `aboveAt` and `below` / `belowAt`, the neighbor rows' labels, where text; `labelFont: 'own'` when neither neighbor's label shares the label's font |
930
954
  * | `constantFrequency` | `kind` (`'number'`, `'string'`, `'boolean'`); `value`, a number without its sign; `uses`, the places in the workbook that type it; `of`, the workbook's constant uses |
931
955
  *
932
956
  * **Runs.** `formula`, `hardcodeInRun` and `styleBreak` are one rule over different layers of
@@ -982,6 +1006,17 @@ export declare namespace ICell {
982
1006
  * places in the workbook type it (`uses`) and of how many constant uses (`of`). The rarer the
983
1007
  * constant, the higher it ranks. A finding's `uses` and `of` change when another sheet changes.
984
1008
  *
1009
+ * **What is left out.** `unreferencedInput` reads the typed numbers beside a label that no
1010
+ * formula on any sheet reads: an assumption the model never uses, which in a model being built
1011
+ * is the item still to build. A labeled line fires only when none of its numbers is read, so a
1012
+ * historical row whose last period feeds a forecast is data in use; a line of numbers at one
1013
+ * step (years) is a header. The rank is divided by the line's cells: a lone cell is an
1014
+ * assumption, a long row is data. `rowGap` reads a labeled row against the rows above and
1015
+ * below it (within one spacer row): the cells filled in both neighbors and empty here are the
1016
+ * line left out, or its missing periods. A row that is partly filled ranks in full, an empty row
1017
+ * at half, and a row whose label is in a font neither neighbor shares (a heading) at a third.
1018
+ * Both findings change when another sheet starts or stops reading the cell.
1019
+ *
985
1020
  * A label's position is absolute (`R12C3`), since it stays put whichever cell of a region reads
986
1021
  * it; its text is the one read at the region's first cell.
987
1022
  */
@@ -21,6 +21,7 @@ import { IDataValidation, IDataValidationCollection } from '../dataValidation';
21
21
  import { IConditionalFormat, IConditionalFormatCollection } from '../conditionalFormat';
22
22
  import { IProtectedRange, IProtectedRangeCollection } from '../protectedRange';
23
23
  import { ICellControl, ICellControlCollection } from '../cellControl';
24
+ import { ISparklineGroup, ISparklineGroupCollection } from '../sparkline';
24
25
  import { ICellRanges } from './ICellRanges';
25
26
  import { ICellRegions } from './ICellRegion';
26
27
  import { ICellHeaderRange } from './ICellHeaderRange';
@@ -131,6 +132,53 @@ export interface ICellRange {
131
132
  * by {@link clear} of formats, and carried by a paste of formats.
132
133
  */
133
134
  setControl(control: ICellControl.JSON | null, options?: ITransaction.OperationOptions): this;
135
+ /**
136
+ * Draws a sparkline in each cell of the range, from its share of `data`, as one new group; `null`
137
+ * removes the cells' sparklines.
138
+ *
139
+ * @param data The cells the sparklines draw: one area, on this sheet when not qualified, or a
140
+ * defined name for one (read as the cells it names now, as Excel does).
141
+ * @param properties How they draw. A new group starts as Excel's does: empty cells as gaps,
142
+ * Excel's colors, and negative points colored for win/loss.
143
+ * @returns The new group, or `null` for a removal.
144
+ *
145
+ * @remarks
146
+ * Excel's Insert > Sparklines, and VBA's `Range.SparklineGroups.Add(Type, SourceData)`. The range
147
+ * is the location: one cell, or one row or one column of cells. The cells pair with the data as
148
+ * Excel pairs them:
149
+ * - One cell draws all of `data`, which must be one row or one column.
150
+ * - A column of cells draws a row of `data` each, its first cell the first row: `F2:F4` over
151
+ * `A2:E4` draws `A2:E2`, `A3:E3`, `A4:E4`.
152
+ * - A row of cells draws a column each, the same way.
153
+ *
154
+ * Refused, as Excel refuses them: a location of several rows and columns, data that is a union
155
+ * or a table's structured reference, two-dimensional data for one cell, and data whose rows or
156
+ * columns do not number the cells. Also refused: a row of cells over data that only pairs by
157
+ * rows, which Excel draws a row each, transposed.
158
+ *
159
+ * A cell has one sparkline, so the cells leave any group they were in. Sparklines are drawn over
160
+ * the cells' values, which stay; refused on a protected sheet unless formatting cells is allowed.
161
+ *
162
+ * @example
163
+ * ```ts
164
+ * sheet.getRange('F2:F4').setSparkline('A2:E4', { type: 'column', high: true });
165
+ * sheet.getRange('F2:F4').setSparkline(null);
166
+ * ```
167
+ */
168
+ /**
169
+ * Returns the {@link ISparklineGroup}s with a sparkline in the range.
170
+ *
171
+ * @param options The filters of {@link ISparklineGroupCollection.getItems} without `address`;
172
+ * this range is the address.
173
+ *
174
+ * @remarks
175
+ * See {@link getConditionalFormats} for the overlap and one-entry-per-item rules, which are the
176
+ * same for every ranged item lookup. The groups, never one entry per sparkline: a column of a
177
+ * million sparklines is one group. Ask a cell for its own with {@link ICell.getSparkline}.
178
+ * VBA's `Range.SparklineGroups`.
179
+ */
180
+ getSparklineGroups(options?: ICellRange.GetItemsOptions<ISparklineGroupCollection.GetItemsOptions>): ISparklineGroup[];
181
+ setSparkline(data: ICellRange.Address | null, properties?: ISparklineGroup.Modifiers, options?: ITransaction.OperationOptions): ISparklineGroup | null;
134
182
  /**
135
183
  * Returns the {@link IDataValidation}s that overlap the range, in priority order.
136
184
  *
@@ -2861,6 +2909,11 @@ export declare namespace ICellRange {
2861
2909
  * question: ask for both to split a column of checkboxes from the text cells among them.
2862
2910
  */
2863
2911
  readonly CellControl: "cellControl";
2912
+ /**
2913
+ * Cells with a sparkline ({@link IWorksheet.getSparklineGroups}). Regions group by the
2914
+ * sparkline group, so two groups side by side are two regions.
2915
+ */
2916
+ readonly Sparkline: "sparkline";
2864
2917
  /**
2865
2918
  * Cells where an error check fires — what breaks the pattern around it. Regions group by the
2866
2919
  * check and its evidence, so a filled row that breaks the same way is one region; the anchor
@@ -3187,6 +3240,18 @@ export declare namespace ICellRange {
3187
3240
  * An address rather than a range, because the cells at it now are other cells.
3188
3241
  */
3189
3242
  getPreviousAddress(): string | null;
3243
+ /**
3244
+ * The edits that changed the range's cells, in the order they were made, for an `'address'`
3245
+ * event of a listener that asked for them ({@link ListenerOptions.edits}); empty otherwise.
3246
+ *
3247
+ * @remarks
3248
+ * Where {@link getSource} says where the range landed, these say what happened to its cells on
3249
+ * the way: each band inserted or deleted, and each cut that took some of them. A listener that
3250
+ * keeps something per cell of the range - a reference, a mark - reads these to take each cell
3251
+ * through on its own. An undo or a redo restores a revision rather than repeating the edits,
3252
+ * so it has none.
3253
+ */
3254
+ getEdits(): readonly ICellRange.Edit[];
3190
3255
  /**
3191
3256
  * What happened to the range.
3192
3257
  *
@@ -3233,6 +3298,35 @@ export declare namespace ICellRange {
3233
3298
  */
3234
3299
  type Trigger = 'data' | 'address' | 'restore';
3235
3300
  }
3301
+ /**
3302
+ * One edit that changed a listened range's cells. See {@link ICellRange.Event.getEdits}.
3303
+ */
3304
+ type Edit = Edit.Shift | Edit.Move;
3305
+ namespace Edit {
3306
+ /**
3307
+ * Cells inserted or deleted: `range` is the band, and `direction` the way the cells beside it
3308
+ * shifted (`Down` or `Right` for an insert, `Up` or `Left` for a delete).
3309
+ */
3310
+ interface Shift {
3311
+ readonly type: 'shift';
3312
+ readonly range: IRange.Coords;
3313
+ readonly direction: IRange.Direction;
3314
+ }
3315
+ /**
3316
+ * Cells cut from `from` to `to`, taking all of the listened range or only some of it.
3317
+ *
3318
+ * @remarks
3319
+ * A cut to another sheet names it as `toSheet`. A listener whose whole range was cut there
3320
+ * goes with it: its source is on that sheet from then on.
3321
+ */
3322
+ interface Move {
3323
+ readonly type: 'move';
3324
+ readonly from: IRange.Coords;
3325
+ readonly to: IRange.Coords;
3326
+ /** The sheet the cells went to, when it is not the sheet they came from. */
3327
+ readonly toSheet?: IWorksheet;
3328
+ }
3329
+ }
3236
3330
  /**
3237
3331
  * Called with what changed at a listened range. See {@link ICellRange.addListener}.
3238
3332
  *
@@ -3297,6 +3391,18 @@ export declare namespace ICellRange {
3297
3391
  * @defaultValue false
3298
3392
  */
3299
3393
  ignoreAddressChanges?: boolean;
3394
+ /**
3395
+ * Whether an `'address'` event carries the edits that changed the range's cells
3396
+ * ({@link Event.getEdits}).
3397
+ *
3398
+ * @defaultValue false
3399
+ *
3400
+ * @remarks
3401
+ * With it, the listener is also told of a cut that takes only some of its cells: the range
3402
+ * itself stays (a cut moves a reference only when it takes all of it), but the cells it
3403
+ * names were moved, and the event says where.
3404
+ */
3405
+ edits?: boolean;
3300
3406
  /**
3301
3407
  * How the listened range follows rows and columns inserted or deleted around it.
3302
3408
  *
@@ -52,6 +52,7 @@ export * from './dataValidation';
52
52
  export * from './conditionalFormat';
53
53
  export * from './protectedRange';
54
54
  export * from './cellControl';
55
+ export * from './sparkline';
55
56
  export * from './slicer';
56
57
  export * from './table';
57
58
  export { Table } from './table/Table';
@@ -18,7 +18,9 @@ export declare function getHostDetails(): Promise<HostDetails>;
18
18
  * does — no watermark, the evaluation period, then its grace — so the line is the host, not the
19
19
  * product, and nothing has to declare it. Plain `http:` is web too: an intranet site is still a
20
20
  * site, and the cheapest bypass there could be is "serve it over http". Outside a window (a worker
21
- * without a location, node under test) there is no page to classify, and it stays web.
21
+ * without a location, node under test) there is no page to classify, and it stays web. The one
22
+ * `http` page that is not a site is the screenshot page ({@link SCREENSHOT_HOST}), on that exact
23
+ * scheme and host; it is not a dev environment, so a key served to it is still checked in full.
22
24
  */
23
25
  export declare function isWebPage(): Promise<boolean>;
24
26
  /**
@@ -24,6 +24,7 @@ import { IDataValidation, IDataValidationCollection } from '../dataValidation';
24
24
  import { IConditionalFormat, IConditionalFormatCollection } from '../conditionalFormat';
25
25
  import { IProtectedRange, IProtectedRangeCollection } from '../protectedRange';
26
26
  import { ICellControl, ICellControlCollection } from '../cellControl';
27
+ import { ISparklineGroup, ISparklineGroupCollection } from '../sparkline';
27
28
  import { IModule, IModuleCollection } from '../scripting';
28
29
  import { IChartCollection } from '../chart';
29
30
  import { INamedCollection } from '../named';
@@ -230,6 +231,14 @@ export interface IWorksheet extends ISheet, ITransaction.ITransactional, IListen
230
231
  * {@link ICellRange.setControl} and {@link ICellRange.getControls}.
231
232
  */
232
233
  getCellControls(): ICellControlCollection;
234
+ /**
235
+ * Returns the sparkline groups on this sheet.
236
+ *
237
+ * @remarks
238
+ * A sparkline is a small chart drawn in a cell, over its value. Each group shares one type and
239
+ * one set of properties across its sparklines.
240
+ */
241
+ getSparklineGroups(): ISparklineGroupCollection;
233
242
  /**
234
243
  * Returns the comments and notes on this sheet.
235
244
  *
@@ -1019,6 +1028,10 @@ export declare namespace IWorksheet {
1019
1028
  * Always accompanied by the coarse {@link onStyleChange}: a control is a format.
1020
1029
  */
1021
1030
  onCellControlsChange?(source: IWorksheet): void;
1031
+ /**
1032
+ * Called when a sparkline group is added, removed or re-anchored.
1033
+ */
1034
+ onSparklineGroupsChange?(source: IWorksheet): void;
1022
1035
  /**
1023
1036
  * Called when a comment is added, removed, edited, resolved, replied to or re-anchored.
1024
1037
  *
@@ -1463,6 +1476,10 @@ export declare namespace IWorksheet {
1463
1476
  validationSettings?: IDataValidationCollection.Settings;
1464
1477
  protectedRanges?: IRange.JSONReference<IProtectedRange.JSON>[];
1465
1478
  cellControls?: IRange.JSONReference<ICellControl.JSON>[];
1479
+ /**
1480
+ * The sparkline groups. Each group's ranges pair by position with the areas of its `data`.
1481
+ */
1482
+ sparklineGroups?: IRange.JSONReference<ISparklineGroup.JSON>[];
1466
1483
  movables?: IMovable.JSON[];
1467
1484
  /**
1468
1485
  * The sheet's VBA code name. Absent when it has none.
@@ -20,6 +20,7 @@ import { CellStyleUpdater } from './style/SheetCellStyle';
20
20
  import { ICalcGrid } from '../calculation/grid';
21
21
  import { IConditionalFormat } from '../conditionalFormat';
22
22
  import { ICellControl } from '../cellControl/ICellControl';
23
+ import { ISparklineGroup } from '../sparkline/ISparklineGroup';
23
24
  import { PivotLabelInset } from '../pivot/_PivotControls';
24
25
  /**
25
26
  * CellModifiers with all functions removed and all properties set and a type.
@@ -238,6 +239,8 @@ export declare class SheetCell implements ICell {
238
239
  getConditionalDecorations(): Readonly<IConditionalFormat.Decorations>;
239
240
  /** {@inheritDoc ICell.getControl} */
240
241
  getControl(): ICellControl | null;
242
+ /** {@inheritDoc ICell.getSparkline} */
243
+ getSparkline(): ISparklineGroup.ISparkline | null;
241
244
  /** {@inheritDoc ICell.getProtection} */
242
245
  getProtection(): ICellProtection;
243
246
  /** {@inheritDoc ICell.getTextOverflow} */
@@ -3,6 +3,8 @@ import { Size, RunCoords } from '@sheetxl/utils';
3
3
  import { ITransaction } from '../transaction';
4
4
  import { IListener } from '../listener';
5
5
  import { ICell } from '../cell';
6
+ import { ISparklineGroup } from '../sparkline/ISparklineGroup';
7
+ import { ISparklineGroupCollection } from '../sparkline/ISparklineGroupCollection';
6
8
  import { ICellRange, ICellRegions, ICellRanges, ICellHeaderRange } from '../cellRange';
7
9
  import { IComment, ICommentCollection } from '../comment';
8
10
  import { ICellStyle } from '../style';
@@ -348,6 +350,10 @@ export declare class SheetRange implements ICellRange {
348
350
  getControls(options?: ICellRange.GetItemsOptions<ICellControlCollection.GetItemsOptions>): ICellControl[];
349
351
  /** {@inheritDoc ICellRange.setControl} */
350
352
  setControl(control: ICellControl.JSON | null, options?: ITransaction.OperationOptions): this;
353
+ /** {@inheritDoc ICellRange.getSparklineGroups} */
354
+ getSparklineGroups(options?: ICellRange.GetItemsOptions<ISparklineGroupCollection.GetItemsOptions>): ISparklineGroup[];
355
+ /** {@inheritDoc ICellRange.setSparkline} */
356
+ setSparkline(data: ICellRange.Address | null, properties?: ISparklineGroup.Modifiers, options?: ITransaction.OperationOptions): ISparklineGroup | null;
351
357
  /** {@inheritDoc ICellRange.getDataValidations} */
352
358
  getDataValidations(options?: ICellRange.GetItemsOptions<IDataValidationCollection.GetItemsOptions>): IDataValidation[];
353
359
  /** {@inheritDoc ICellRange.getComments} */
@@ -50,6 +50,8 @@ import { IDataValidationCollection, IDataValidation } from '../dataValidation';
50
50
  import { DataValidation } from '../dataValidation/DataValidation';
51
51
  import { ProtectedRange } from '../protectedRange/ProtectedRange';
52
52
  import { CellControl } from '../cellControl/CellControl';
53
+ import { ISparklineGroup, ISparklineGroupCollection } from '../sparkline';
54
+ import { SparklineGroup } from '../sparkline/SparklineGroup';
53
55
  import { Comment } from '../comment/Comment';
54
56
  import { NoteMovable } from '../comment/NoteMovable';
55
57
  import { NoteLayout } from '../comment/_NoteBox';
@@ -81,6 +83,7 @@ import { ICalculation } from '../calculation';
81
83
  import { ICalcGrid } from '../calculation/grid';
82
84
  import { SpillEntry } from '../calculation/spatial';
83
85
  import { SheetCellOptions } from './SheetCell';
86
+ import * as SparklineRanges from '../sparkline/SparklineRanges';
84
87
  import * as _SheetFilterUtils from './_SheetFilterUtils';
85
88
  /** The font colors a workbook writes its roles in, and a key that compares by content. */
86
89
  interface WorkbookRoleColors {
@@ -228,6 +231,7 @@ export declare class Worksheet implements IWorksheet {
228
231
  protected _dataValidations: IDataValidationCollection;
229
232
  protected _protectedRanges: IProtectedRangeCollection;
230
233
  protected _cellControls: ICellControlCollection;
234
+ protected _sparklineGroups: ISparklineGroupCollection;
231
235
  protected _comments: ICommentCollection;
232
236
  protected _movables: IMovableCollection;
233
237
  protected _charts: IChartCollection;
@@ -406,6 +410,7 @@ export declare class Worksheet implements IWorksheet {
406
410
  filteredTables: () => ITable[];
407
411
  setHyperlinks: (ranges: readonly ISpatialMap.Entry<IHyperlink.Update>[], defaultUpdate?: IHyperlink.Update, options?: ITransaction.OperationOptions) => void;
408
412
  setCellControl: (address: ICellRanges.Address, control: ICellControl.JSON | null, options?: ITransaction.OperationOptions) => ICellControl | null;
413
+ setSparkline: (address: ICellRanges.Address, data: ICellRange.Address, modifiers?: ISparklineGroup.Modifiers | null, options?: ITransaction.OperationOptions) => ISparklineGroup;
409
414
  setErrorIgnored: (ranges: readonly IRange.Coords[], check: ICell.ErrorCheck, ignored: boolean, options?: ITransaction.OperationOptions) => void;
410
415
  setComments: (ranges: readonly ISpatialMap.Entry<IComment.Update>[], comments?: IComment.Update | IComment.JSON, options?: ITransaction.OperationOptions) => void;
411
416
  getBoundsAtCoords: (coords: IRange.Coords) => Bounds;
@@ -431,6 +436,7 @@ export declare class Worksheet implements IWorksheet {
431
436
  formulas: unknown;
432
437
  epoch: number;
433
438
  roleColors: string;
439
+ reads: unknown;
434
440
  findings: AnomalyFindings;
435
441
  } | null;
436
442
  /**
@@ -440,6 +446,19 @@ export declare class Worksheet implements IWorksheet {
440
446
  * @internal
441
447
  */
442
448
  protected _getAnomalyFindings(roleColors?: WorkbookRoleColors): AnomalyFindings;
449
+ /** The cells of this sheet the other sheets read, and the formulas they were read from; see {@link _getForeignReads}. */
450
+ protected _foreignReads: {
451
+ sheets: readonly Worksheet[];
452
+ formulas: readonly unknown[];
453
+ map: ISpatialMap<boolean>;
454
+ } | null;
455
+ /**
456
+ * The cells of this sheet that the workbook's other sheets' formulas read, the reads
457
+ * `unreferencedInput` subtracts. Derived from the other sheets' formula partitions and kept
458
+ * until one of them changes.
459
+ * @internal
460
+ */
461
+ protected _getForeignReads(): ISpatialMap<boolean>;
443
462
  /** This worksheet and the workbook's others, very hidden included. */
444
463
  protected _getWorkbookSheets(): Worksheet[];
445
464
  /** The workbook's role colors and the sheets' sets they were the union of; see {@link _getWorkbookRoleColors}. */
@@ -547,6 +566,7 @@ export declare class Worksheet implements IWorksheet {
547
566
  assertContentEditable: (ranges: readonly IRange.Coords[], viaRanges?: boolean) => boolean;
548
567
  isMoveRuled: () => boolean;
549
568
  getDefaultShiftAxis: (coords?: IRange.Coords) => IRange.Axis;
569
+ getName: () => string;
550
570
  processLayoutChange: () => void;
551
571
  /** The movables' by-model index as a shift left it, or `null` if the shift moved none. */
552
572
  takeShiftedMovableModels: () => Map<IMovable, ISpatialMap.Entry<MovableEntry>> | null;
@@ -670,6 +690,7 @@ export declare class Worksheet implements IWorksheet {
670
690
  filteredTables: () => ITable[];
671
691
  setHyperlinks: (ranges: readonly ISpatialMap.Entry<IHyperlink.Update>[], defaultUpdate?: IHyperlink.Update, options?: ITransaction.OperationOptions) => void;
672
692
  setCellControl: (address: ICellRanges.Address, control: ICellControl.JSON | null, options?: ITransaction.OperationOptions) => ICellControl | null;
693
+ setSparkline: (address: ICellRanges.Address, data: ICellRange.Address, modifiers?: ISparklineGroup.Modifiers | null, options?: ITransaction.OperationOptions) => ISparklineGroup;
673
694
  setErrorIgnored: (ranges: readonly IRange.Coords[], check: ICell.ErrorCheck, ignored: boolean, options?: ITransaction.OperationOptions) => void;
674
695
  setComments: (ranges: readonly ISpatialMap.Entry<IComment.Update>[], comments?: IComment.Update | IComment.JSON, options?: ITransaction.OperationOptions) => void;
675
696
  getBoundsAtCoords: (coords: IRange.Coords) => Bounds;
@@ -1276,6 +1297,26 @@ export declare class Worksheet implements IWorksheet {
1276
1297
  node: ListenerAnchor;
1277
1298
  remove: IListener.Remove;
1278
1299
  };
1300
+ /**
1301
+ * Removes a listener's node and its callback, with the twins a cut to another sheet made of it.
1302
+ * @internal
1303
+ */
1304
+ protected _dropListenerEntry(entry: ListenerNodeEntry): void;
1305
+ /**
1306
+ * After a cut of `from` on this sheet to `to` on `sheetTo`: a listener whose ranges the cut
1307
+ * encloses goes with them, as a twin node on `sheetTo` written in the cut's commit (so undo and
1308
+ * redo carry both sheets' maps together, and the twin that is not in a snapshot stays quiet). One
1309
+ * the cut takes only part of stays, and is told the move if it asked for the edits. A sparkline
1310
+ * group whose data the cut took reads it on `sheetTo`.
1311
+ * @internal
1312
+ */
1313
+ protected _moveReferencesToSheet(sheetTo: Worksheet, from: IRange.Coords, to: IRange.Coords): void;
1314
+ /**
1315
+ * A listener from `fromSheet`, its ranges cut here to `coords`: a node in this sheet's map, in the
1316
+ * current commit, delivering to the same callback. Its first delivery is the move.
1317
+ * @internal
1318
+ */
1319
+ protected _adoptListenerNode(entry: ListenerNodeEntry, coords: readonly IRange.Coords[], previous: readonly IRange.Coords[], from: IRange.Coords, to: IRange.Coords, fromSheet: Worksheet): ListenerNodeEntry;
1279
1320
  /**
1280
1321
  * Register a watch: an expression kept evaluated over a range.
1281
1322
  *
@@ -1475,6 +1516,8 @@ export declare class Worksheet implements IWorksheet {
1475
1516
  /** {@inheritDoc Sheet._notifyConditionalFormatsChange} @internal */
1476
1517
  protected _notifyCellControlsChange(): void;
1477
1518
  /** {@inheritDoc Sheet._notifyConditionalFormatsChange} @internal */
1519
+ protected _notifySparklineGroupsChange(): void;
1520
+ /** {@inheritDoc Sheet._notifyConditionalFormatsChange} @internal */
1478
1521
  protected _notifyCommentsChange(): void;
1479
1522
  /**
1480
1523
  * Presents one of the sheet's own events as a collection's `onCollectionChange`, and the
@@ -1485,7 +1528,7 @@ export declare class Worksheet implements IWorksheet {
1485
1528
  * it. Forwarding, rather than a second emitter, is what keeps the two from drifting apart.
1486
1529
  * @internal
1487
1530
  */
1488
- protected _forwardCollectionListeners(key: 'onTablesChange' | 'onConditionalFormatsChange' | 'onDataValidationsChange' | 'onProtectedRangesChange' | 'onCellControlsChange' | 'onCommentsChange', collection: () => ICollection<any>): (listeners: ICollection.IListeners, options?: IListener.Options) => IListener.Remove;
1531
+ protected _forwardCollectionListeners(key: 'onTablesChange' | 'onConditionalFormatsChange' | 'onDataValidationsChange' | 'onProtectedRangesChange' | 'onCellControlsChange' | 'onSparklineGroupsChange' | 'onCommentsChange', collection: () => ICollection<any>): (listeners: ICollection.IListeners, options?: IListener.Options) => IListener.Remove;
1489
1532
  /** {@inheritDoc IWorksheet.addListeners} */
1490
1533
  addListeners(listeners: IWorksheet.IListeners, options?: IListener.Options): IListener.Remove;
1491
1534
  /** @internal */
@@ -2055,6 +2098,8 @@ export declare class Worksheet implements IWorksheet {
2055
2098
  getProtectedRanges(): IProtectedRangeCollection;
2056
2099
  /** {@inheritDoc IWorksheet.getCellControls} */
2057
2100
  getCellControls(): ICellControlCollection;
2101
+ /** {@inheritDoc IWorksheet.getSparklineGroups} */
2102
+ getSparklineGroups(): ISparklineGroupCollection;
2058
2103
  /** {@inheritDoc IWorksheet.getComments} */
2059
2104
  getComments(): ICommentCollection;
2060
2105
  /** @deprecated Use {@link IWorksheet.getConditionalFormats} */
@@ -2130,6 +2175,49 @@ export declare class Worksheet implements IWorksheet {
2130
2175
  * @internal
2131
2176
  */
2132
2177
  protected _addCellControl(address: ICellRanges.Address, control: ICellControl.JSON, options?: ITransaction.OperationOptions): ICellControl;
2178
+ /**
2179
+ * Adds a sparkline group over `ranges`, each a location and the data its cells read, taking
2180
+ * those cells out of any group they were in: a cell has one sparkline.
2181
+ * @internal
2182
+ */
2183
+ _addSparklineGroup(ranges: readonly SparklineRanges.SparklineRange[], properties: Readonly<ISparklineGroup.Properties>, options?: ITransaction.OperationOptions): ISparklineGroup | null;
2184
+ /**
2185
+ * Draws a sparkline in each cell of `address` from its share of `data`, as one new group: the
2186
+ * write behind `ICellRange.setSparkline` and `ISparklineGroupCollection.add`. Pairs and refuses as
2187
+ * Excel's `SparklineGroups.Add` does (`SparklineRanges.pairData`).
2188
+ * @internal
2189
+ */
2190
+ protected _setSparkline(address: ICellRanges.Address, data: ICellRange.Address, modifiers?: ISparklineGroup.Modifiers | null, options?: ITransaction.OperationOptions): ISparklineGroup;
2191
+ private _refuseSparklinePairing;
2192
+ /** The prefix data on `range`'s sheet is written with: none for this sheet. */
2193
+ private _sparklinePrefix;
2194
+ /**
2195
+ * Gives `group` new cells, new data or both, as Excel's Edit Sparklines dialog does: the write
2196
+ * behind `ISparklineGroup.setRanges` and `setDataRanges`. Pairs as `SparklineRanges.pairAreas`; the
2197
+ * new cells leave any other group they were in. One undo entry.
2198
+ * @internal
2199
+ */
2200
+ protected _modifySparklineGroup(group: SparklineGroup, location: ICellRanges.Address | null, data: ICellRanges.Address | null, options?: ITransaction.OperationOptions): void;
2201
+ /**
2202
+ * The areas `data` names, each one area as {@link _sparklineDataRange} reads it: a union is
2203
+ * split at its commas, each area on its own sheet.
2204
+ */
2205
+ private _sparklineDataAreas;
2206
+ /**
2207
+ * The one area `data` names: bare on this sheet, qualified on its sheet, a defined name as the
2208
+ * cells it names now. Refuses what Excel's `Add` refuses: a union and a table's structured
2209
+ * reference.
2210
+ */
2211
+ private _sparklineDataRange;
2212
+ /**
2213
+ * Puts one group over `coords`, each reading `data` (paired by position, as the JSON states
2214
+ * them), taking those cells out of any group they were in.
2215
+ *
2216
+ * @param ruled Whether the cells' protection allowance has already ruled, so the commit-time
2217
+ * check is skipped.
2218
+ * @internal
2219
+ */
2220
+ private _putSparklineGroup;
2133
2221
  /**
2134
2222
  * Makes `control` the control of every cell of `address`, or removes the cells' controls when
2135
2223
  * it is `null`. The write behind `ICellRange.setControl` and `ICellControlCollection.add`.
@@ -2279,6 +2367,11 @@ export declare class Worksheet implements IWorksheet {
2279
2367
  protected _createProtectedRanges(protectedRanges: IAnchoredMap<IProtectedRange, IProtectedRange.JSON>, key: keyof State, refs: IRange.JSONReference<IProtectedRange.JSON>[], createModel: (options: ProtectedRange.ConstructorOptions) => IProtectedRange, addListeners?: (model: IProtectedRange) => IListener.Remove): IAnchoredMap<IProtectedRange, IProtectedRange.JSON>;
2280
2368
  /** @internal */
2281
2369
  protected _createCellControls(cellControls: IAnchoredMap<ICellControl, ICellControl.JSON>, key: keyof State, refs: IRange.JSONReference<ICellControl.JSON>[], createModel: (options: CellControl.ConstructorOptions) => ICellControl): IAnchoredMap<ICellControl, ICellControl.JSON>;
2370
+ /**
2371
+ * Loads sparkline groups into their anchored map.
2372
+ * @internal
2373
+ */
2374
+ protected _createSparklineGroups(sparklineGroups: IAnchoredMap<ISparklineGroup, ISparklineGroup.JSON>, refs: IRange.JSONReference<ISparklineGroup.JSON>[]): IAnchoredMap<ISparklineGroup, ISparklineGroup.JSON>;
2282
2375
  /**
2283
2376
  * Loads the pivot tables into their anchored map, each anchored where its part says it sits.
2284
2377
  * The map moves and deletes them with structural edits; the grid's spill of a table rules on
@@ -2397,6 +2490,8 @@ interface RangeEventOptions extends NotifierOptions {
2397
2490
  * @defaultValue `#REF!`
2398
2491
  */
2399
2492
  invalidError?: string;
2493
+ /** The edits an `'address'` event carries, for a listener that asked for them. */
2494
+ edits?: readonly ICellRange.Edit[];
2400
2495
  }
2401
2496
  interface ListenerNodeEntry {
2402
2497
  node: ListenerAnchor;
@@ -2417,6 +2512,13 @@ interface ListenerNodeEntry {
2417
2512
  watch?: WatchAnchor.Handlers;
2418
2513
  /** The batch a participant was added through: it is told as each step of that batch is made. */
2419
2514
  batch?: BatchHandle | null;
2515
+ /** The same listener on other sheets, made by cuts that took its ranges there (and back). */
2516
+ twins?: {
2517
+ sheet: Worksheet;
2518
+ entry: ListenerNodeEntry;
2519
+ }[];
2520
+ /** Removed: its callback is gone, and so are its twins'. */
2521
+ dropped?: boolean;
2420
2522
  }
2421
2523
  /**
2422
2524
  * A run of formula cells with the references they inherit a number format from, relative to the