@ricsam/formula-engine 0.0.16 → 0.0.17

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 (41) hide show
  1. package/dist/cjs/core/autofill-utils.cjs +73 -35
  2. package/dist/cjs/core/autofill-utils.cjs.map +3 -3
  3. package/dist/cjs/core/cell-mover.cjs +178 -0
  4. package/dist/cjs/core/cell-mover.cjs.map +10 -0
  5. package/dist/cjs/core/engine.cjs +105 -13
  6. package/dist/cjs/core/engine.cjs.map +3 -3
  7. package/dist/cjs/core/managers/copy-manager.cjs +337 -82
  8. package/dist/cjs/core/managers/copy-manager.cjs.map +3 -3
  9. package/dist/cjs/core/managers/reference-manager.cjs +124 -0
  10. package/dist/cjs/core/managers/reference-manager.cjs.map +10 -0
  11. package/dist/cjs/core/managers/style-manager.cjs +115 -147
  12. package/dist/cjs/core/managers/style-manager.cjs.map +3 -3
  13. package/dist/cjs/core/managers/workbook-manager.cjs +87 -3
  14. package/dist/cjs/core/managers/workbook-manager.cjs.map +3 -3
  15. package/dist/cjs/core/types.cjs.map +2 -2
  16. package/dist/cjs/package.json +1 -1
  17. package/dist/mjs/core/autofill-utils.mjs +73 -35
  18. package/dist/mjs/core/autofill-utils.mjs.map +3 -3
  19. package/dist/mjs/core/cell-mover.mjs +148 -0
  20. package/dist/mjs/core/cell-mover.mjs.map +10 -0
  21. package/dist/mjs/core/engine.mjs +105 -13
  22. package/dist/mjs/core/engine.mjs.map +3 -3
  23. package/dist/mjs/core/managers/copy-manager.mjs +339 -82
  24. package/dist/mjs/core/managers/copy-manager.mjs.map +3 -3
  25. package/dist/mjs/core/managers/reference-manager.mjs +93 -0
  26. package/dist/mjs/core/managers/reference-manager.mjs.map +10 -0
  27. package/dist/mjs/core/managers/style-manager.mjs +115 -147
  28. package/dist/mjs/core/managers/style-manager.mjs.map +3 -3
  29. package/dist/mjs/core/managers/workbook-manager.mjs +87 -3
  30. package/dist/mjs/core/managers/workbook-manager.mjs.map +3 -3
  31. package/dist/mjs/core/types.mjs.map +2 -2
  32. package/dist/mjs/package.json +1 -1
  33. package/dist/types/core/autofill-utils.d.ts +4 -0
  34. package/dist/types/core/cell-mover.d.ts +63 -0
  35. package/dist/types/core/engine.d.ts +123 -9
  36. package/dist/types/core/managers/copy-manager.d.ts +47 -2
  37. package/dist/types/core/managers/reference-manager.d.ts +54 -0
  38. package/dist/types/core/managers/style-manager.d.ts +6 -6
  39. package/dist/types/core/managers/workbook-manager.d.ts +39 -1
  40. package/dist/types/core/types.d.ts +52 -11
  41. package/package.json +1 -1
@@ -22,14 +22,14 @@ class StyleManager {
22
22
  this.conditionalStyles.push(style);
23
23
  }
24
24
  removeConditionalStyle(workbookName, index) {
25
- const workbookStyles = this.conditionalStyles.filter((style) => style.area.workbookName === workbookName);
25
+ const workbookStyles = this.conditionalStyles.filter((style) => style.areas.some((area) => area.workbookName === workbookName));
26
26
  if (index < 0 || index >= workbookStyles.length) {
27
27
  return false;
28
28
  }
29
29
  let currentIndex = 0;
30
30
  for (let i = 0;i < this.conditionalStyles.length; i++) {
31
31
  const style = this.conditionalStyles[i];
32
- if (style && style.area.workbookName === workbookName) {
32
+ if (style && style.areas.some((area) => area.workbookName === workbookName)) {
33
33
  if (currentIndex === index) {
34
34
  this.conditionalStyles.splice(i, 1);
35
35
  return true;
@@ -40,20 +40,20 @@ class StyleManager {
40
40
  return false;
41
41
  }
42
42
  getConditionalStylesIntersectingWithRange(range) {
43
- return this.conditionalStyles.filter((style) => style.area.workbookName === range.workbookName && style.area.sheetName === range.sheetName && rangesIntersect(style.area.range, range.range));
43
+ return this.conditionalStyles.filter((style) => style.areas.some((area) => area.workbookName === range.workbookName && area.sheetName === range.sheetName && rangesIntersect(area.range, range.range)));
44
44
  }
45
45
  addCellStyle(style) {
46
46
  this.cellStyles.push(style);
47
47
  }
48
48
  removeCellStyle(workbookName, index) {
49
- const workbookStyles = this.cellStyles.filter((style) => style && style.area && style.area.workbookName === workbookName);
49
+ const workbookStyles = this.cellStyles.filter((style) => style && style.areas && style.areas.some((area) => area.workbookName === workbookName));
50
50
  if (index < 0 || index >= workbookStyles.length) {
51
51
  return false;
52
52
  }
53
53
  let currentIndex = 0;
54
54
  for (let i = 0;i < this.cellStyles.length; i++) {
55
55
  const style = this.cellStyles[i];
56
- if (style && style.area && style.area.workbookName === workbookName) {
56
+ if (style && style.areas && style.areas.some((area) => area.workbookName === workbookName)) {
57
57
  if (currentIndex === index) {
58
58
  this.cellStyles.splice(i, 1);
59
59
  return true;
@@ -64,7 +64,7 @@ class StyleManager {
64
64
  return false;
65
65
  }
66
66
  getStylesIntersectingWithRange(range) {
67
- return this.cellStyles.filter((style) => style && style.area.sheetName === range.sheetName && style.area.workbookName === range.workbookName && rangesIntersect(style.area.range, range.range));
67
+ return this.cellStyles.filter((style) => style && style.areas.some((area) => area.sheetName === range.sheetName && area.workbookName === range.workbookName && rangesIntersect(area.range, range.range)));
68
68
  }
69
69
  getStyleForRange(range) {
70
70
  const intersectingStyles = this.getStylesIntersectingWithRange(range);
@@ -75,7 +75,8 @@ class StyleManager {
75
75
  return;
76
76
  }
77
77
  const style = intersectingStyles[0];
78
- if (isRangeContained(range.range, style.area.range)) {
78
+ const isContained = style.areas.some((area) => area.workbookName === range.workbookName && area.sheetName === range.sheetName && isRangeContained(range.range, area.range));
79
+ if (isContained) {
79
80
  return style;
80
81
  }
81
82
  return;
@@ -91,97 +92,69 @@ class StyleManager {
91
92
  this.cellStyles = cellStyles ? [...cellStyles] : [];
92
93
  }
93
94
  removeWorkbookStyles(workbookName) {
94
- this.conditionalStyles = this.conditionalStyles.filter((style) => style.area.workbookName !== workbookName);
95
- this.cellStyles = this.cellStyles.filter((style) => style.area.workbookName !== workbookName);
95
+ this.conditionalStyles = this.conditionalStyles.filter((style) => !style.areas.some((area) => area.workbookName === workbookName));
96
+ this.cellStyles = this.cellStyles.filter((style) => !style.areas.some((area) => area.workbookName === workbookName));
96
97
  }
97
98
  updateWorkbookName(oldName, newName) {
98
- this.conditionalStyles = this.conditionalStyles.map((style) => {
99
- if (style.area.workbookName === oldName) {
100
- return {
101
- ...style,
102
- area: {
103
- ...style.area,
104
- workbookName: newName
105
- }
106
- };
107
- }
108
- return style;
109
- });
110
- this.cellStyles = this.cellStyles.map((style) => {
111
- if (style.area.workbookName === oldName) {
112
- return {
113
- ...style,
114
- area: {
115
- ...style.area,
116
- workbookName: newName
117
- }
118
- };
119
- }
120
- return style;
121
- });
99
+ this.conditionalStyles = this.conditionalStyles.map((style) => ({
100
+ ...style,
101
+ areas: style.areas.map((area) => area.workbookName === oldName ? { ...area, workbookName: newName } : area)
102
+ }));
103
+ this.cellStyles = this.cellStyles.map((style) => ({
104
+ ...style,
105
+ areas: style.areas.map((area) => area.workbookName === oldName ? { ...area, workbookName: newName } : area)
106
+ }));
122
107
  }
123
108
  updateSheetName(workbookName, oldSheetName, newSheetName) {
124
- this.conditionalStyles = this.conditionalStyles.map((style) => {
125
- if (style.area.workbookName === workbookName && style.area.sheetName === oldSheetName) {
126
- return {
127
- ...style,
128
- area: {
129
- ...style.area,
130
- sheetName: newSheetName
131
- }
132
- };
133
- }
134
- return style;
135
- });
136
- this.cellStyles = this.cellStyles.map((style) => {
137
- if (style.area.workbookName === workbookName && style.area.sheetName === oldSheetName) {
138
- return {
139
- ...style,
140
- area: {
141
- ...style.area,
142
- sheetName: newSheetName
143
- }
144
- };
145
- }
146
- return style;
147
- });
109
+ this.conditionalStyles = this.conditionalStyles.map((style) => ({
110
+ ...style,
111
+ areas: style.areas.map((area) => area.workbookName === workbookName && area.sheetName === oldSheetName ? { ...area, sheetName: newSheetName } : area)
112
+ }));
113
+ this.cellStyles = this.cellStyles.map((style) => ({
114
+ ...style,
115
+ areas: style.areas.map((area) => area.workbookName === workbookName && area.sheetName === oldSheetName ? { ...area, sheetName: newSheetName } : area)
116
+ }));
148
117
  }
149
118
  removeSheetStyles(workbookName, sheetName) {
150
- this.conditionalStyles = this.conditionalStyles.filter((style) => !(style.area.workbookName === workbookName && style.area.sheetName === sheetName));
151
- this.cellStyles = this.cellStyles.filter((style) => !(style.area.workbookName === workbookName && style.area.sheetName === sheetName));
119
+ this.conditionalStyles = this.conditionalStyles.filter((style) => !style.areas.some((area) => area.workbookName === workbookName && area.sheetName === sheetName));
120
+ this.cellStyles = this.cellStyles.filter((style) => !style.areas.some((area) => area.workbookName === workbookName && area.sheetName === sheetName));
152
121
  }
153
122
  getCellStyle(cellAddress) {
154
123
  for (const style of this.conditionalStyles) {
155
- if (!style || !style.area) {
156
- continue;
157
- }
158
- if (style.area.sheetName !== cellAddress.sheetName || style.area.workbookName !== cellAddress.workbookName) {
124
+ if (!style || !style.areas) {
159
125
  continue;
160
126
  }
161
- if (!isCellInRange(cellAddress, style.area.range)) {
162
- continue;
163
- }
164
- if (style.condition.type === "formula") {
165
- const result = this.evaluateFormulaCondition(cellAddress, style);
166
- if (result)
167
- return result;
168
- } else {
169
- const result = this.evaluateGradientCondition(cellAddress, style);
170
- if (result)
171
- return result;
127
+ for (const area of style.areas) {
128
+ if (area.sheetName !== cellAddress.sheetName || area.workbookName !== cellAddress.workbookName) {
129
+ continue;
130
+ }
131
+ if (!isCellInRange(cellAddress, area.range)) {
132
+ continue;
133
+ }
134
+ if (style.condition.type === "formula") {
135
+ const result = this.evaluateFormulaCondition(cellAddress, style, area);
136
+ if (result)
137
+ return result;
138
+ } else {
139
+ const result = this.evaluateGradientCondition(cellAddress, style, area);
140
+ if (result)
141
+ return result;
142
+ }
172
143
  }
173
144
  }
174
145
  for (const cellStyle of this.cellStyles) {
175
- if (!cellStyle || !cellStyle.area) {
146
+ if (!cellStyle || !cellStyle.areas) {
176
147
  continue;
177
148
  }
178
- if (cellStyle.area.workbookName === cellAddress.workbookName && cellStyle.area.sheetName === cellAddress.sheetName && isCellInRange(cellAddress, cellStyle.area.range)) {
179
- return cellStyle.style;
149
+ for (const area of cellStyle.areas) {
150
+ if (area.workbookName === cellAddress.workbookName && area.sheetName === cellAddress.sheetName && isCellInRange(cellAddress, area.range)) {
151
+ return cellStyle.style;
152
+ }
180
153
  }
181
154
  }
182
155
  return;
183
156
  }
184
- evaluateFormulaCondition(cellAddress, style) {
157
+ evaluateFormulaCondition(cellAddress, style, area) {
185
158
  if (style.condition.type !== "formula") {
186
159
  return;
187
160
  }
@@ -199,7 +172,7 @@ class StyleManager {
199
172
  }
200
173
  return;
201
174
  }
202
- evaluateGradientCondition(cellAddress, style) {
175
+ evaluateGradientCondition(cellAddress, style, area) {
203
176
  if (style.condition.type !== "gradient") {
204
177
  return;
205
178
  }
@@ -212,7 +185,7 @@ class StyleManager {
212
185
  return;
213
186
  }
214
187
  const cellValue = evalResult.result.value;
215
- const { min: minValue, max: maxValue } = this.calculateGradientBounds(style, cellAddress);
188
+ const { min: minValue, max: maxValue } = this.calculateGradientBounds(style, cellAddress, area);
216
189
  if (minValue === null || maxValue === null) {
217
190
  return;
218
191
  }
@@ -228,21 +201,21 @@ class StyleManager {
228
201
  return;
229
202
  }
230
203
  }
231
- calculateGradientBounds(style, cellAddress) {
204
+ calculateGradientBounds(style, cellAddress, area) {
232
205
  if (style.condition.type !== "gradient") {
233
206
  return { min: null, max: null };
234
207
  }
235
208
  const { min: minConfig, max: maxConfig } = style.condition;
236
209
  const topLeftCell = {
237
- workbookName: style.area.workbookName,
238
- sheetName: style.area.sheetName,
239
- colIndex: style.area.range.start.col,
240
- rowIndex: style.area.range.start.row
210
+ workbookName: area.workbookName,
211
+ sheetName: area.sheetName,
212
+ colIndex: area.range.start.col,
213
+ rowIndex: area.range.start.row
241
214
  };
242
215
  let minValue = null;
243
216
  if (minConfig.type === "lowest_value") {
244
217
  try {
245
- const rangeRef = this.getRangeReference(style.area);
218
+ const rangeRef = this.getRangeReference(area);
246
219
  const result = this.evaluationManager.evaluateFormula(`=MIN(${rangeRef})`, topLeftCell);
247
220
  if (typeof result === "number") {
248
221
  minValue = result;
@@ -260,7 +233,7 @@ class StyleManager {
260
233
  let maxValue = null;
261
234
  if (maxConfig.type === "highest_value") {
262
235
  try {
263
- const rangeRef = this.getRangeReference(style.area);
236
+ const rangeRef = this.getRangeReference(area);
264
237
  const result = this.evaluationManager.evaluateFormula(`=MAX(${rangeRef})`, topLeftCell);
265
238
  if (typeof result === "number") {
266
239
  maxValue = result;
@@ -322,81 +295,76 @@ class StyleManager {
322
295
  return `[${area.workbookName}]${sheetRef}!${rangeStr}`;
323
296
  }
324
297
  clearCellStyles(range) {
325
- const newCellStyles = [];
326
- for (const cellStyle of this.cellStyles) {
327
- if (!cellStyle || !cellStyle.area) {
328
- newCellStyles.push(cellStyle);
329
- continue;
298
+ this.cellStyles = this.cellStyles.map((cellStyle) => {
299
+ if (!cellStyle || !cellStyle.areas) {
300
+ return cellStyle;
330
301
  }
331
- if (cellStyle.area.workbookName === range.workbookName && cellStyle.area.sheetName === range.sheetName && rangesIntersect(cellStyle.area.range, range.range)) {
332
- const remainingRanges = subtractRange(cellStyle.area.range, range.range);
333
- for (const remainingRange of remainingRanges) {
334
- newCellStyles.push({
335
- area: {
336
- workbookName: cellStyle.area.workbookName,
337
- sheetName: cellStyle.area.sheetName,
302
+ const newAreas = [];
303
+ for (const area of cellStyle.areas) {
304
+ if (area.workbookName === range.workbookName && area.sheetName === range.sheetName && rangesIntersect(area.range, range.range)) {
305
+ const remainingRanges = subtractRange(area.range, range.range);
306
+ for (const remainingRange of remainingRanges) {
307
+ newAreas.push({
308
+ workbookName: area.workbookName,
309
+ sheetName: area.sheetName,
338
310
  range: remainingRange
339
- },
340
- style: cellStyle.style
341
- });
311
+ });
312
+ }
313
+ } else {
314
+ newAreas.push(area);
342
315
  }
343
- } else {
344
- newCellStyles.push(cellStyle);
345
316
  }
346
- }
347
- this.cellStyles = newCellStyles;
348
- const newConditionalStyles = [];
349
- for (const conditionalStyle of this.conditionalStyles) {
350
- if (!conditionalStyle || !conditionalStyle.area) {
351
- newConditionalStyles.push(conditionalStyle);
352
- continue;
317
+ return { ...cellStyle, areas: newAreas };
318
+ }).filter((style) => style.areas.length > 0);
319
+ this.conditionalStyles = this.conditionalStyles.map((conditionalStyle) => {
320
+ if (!conditionalStyle || !conditionalStyle.areas) {
321
+ return conditionalStyle;
353
322
  }
354
- if (conditionalStyle.area.workbookName === range.workbookName && conditionalStyle.area.sheetName === range.sheetName && rangesIntersect(conditionalStyle.area.range, range.range)) {
355
- const remainingRanges = subtractRange(conditionalStyle.area.range, range.range);
356
- for (const remainingRange of remainingRanges) {
357
- newConditionalStyles.push({
358
- area: {
359
- workbookName: conditionalStyle.area.workbookName,
360
- sheetName: conditionalStyle.area.sheetName,
323
+ const newAreas = [];
324
+ for (const area of conditionalStyle.areas) {
325
+ if (area.workbookName === range.workbookName && area.sheetName === range.sheetName && rangesIntersect(area.range, range.range)) {
326
+ const remainingRanges = subtractRange(area.range, range.range);
327
+ for (const remainingRange of remainingRanges) {
328
+ newAreas.push({
329
+ workbookName: area.workbookName,
330
+ sheetName: area.sheetName,
361
331
  range: remainingRange
362
- },
363
- condition: conditionalStyle.condition
364
- });
332
+ });
333
+ }
334
+ } else {
335
+ newAreas.push(area);
365
336
  }
366
- } else {
367
- newConditionalStyles.push(conditionalStyle);
368
337
  }
369
- }
370
- this.conditionalStyles = newConditionalStyles;
338
+ return { ...conditionalStyle, areas: newAreas };
339
+ }).filter((style) => style.areas.length > 0);
371
340
  }
372
341
  clearCellStylesInRange(range) {
373
- const newCellStyles = [];
374
- for (const style of this.cellStyles) {
375
- if (style.area.workbookName !== range.workbookName || style.area.sheetName !== range.sheetName) {
376
- newCellStyles.push(style);
377
- continue;
378
- }
379
- if (!rangesIntersect(style.area.range, range.range)) {
380
- newCellStyles.push(style);
381
- continue;
382
- }
383
- const remainingRanges = subtractRange(style.area.range, range.range);
384
- for (const remainingRange of remainingRanges) {
385
- newCellStyles.push({
386
- area: {
387
- workbookName: style.area.workbookName,
388
- sheetName: style.area.sheetName,
342
+ this.cellStyles = this.cellStyles.map((style) => {
343
+ const newAreas = [];
344
+ for (const area of style.areas) {
345
+ if (area.workbookName !== range.workbookName || area.sheetName !== range.sheetName) {
346
+ newAreas.push(area);
347
+ continue;
348
+ }
349
+ if (!rangesIntersect(area.range, range.range)) {
350
+ newAreas.push(area);
351
+ continue;
352
+ }
353
+ const remainingRanges = subtractRange(area.range, range.range);
354
+ for (const remainingRange of remainingRanges) {
355
+ newAreas.push({
356
+ workbookName: area.workbookName,
357
+ sheetName: area.sheetName,
389
358
  range: remainingRange
390
- },
391
- style: style.style
392
- });
359
+ });
360
+ }
393
361
  }
394
- }
395
- this.cellStyles = newCellStyles;
362
+ return { ...style, areas: newAreas };
363
+ }).filter((style) => style.areas.length > 0);
396
364
  }
397
365
  }
398
366
  export {
399
367
  StyleManager
400
368
  };
401
369
 
402
- //# debugId=0E37CC199FCD4ED464756E2164756E21
370
+ //# debugId=7841C29C2F9909CC64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/core/managers/style-manager.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * StyleManager - Manages conditional styling for cells\n */\n\nimport type {\n CellAddress,\n CellStyle,\n ConditionalStyle,\n DirectCellStyle,\n RangeAddress,\n SerializedCellValue,\n} from \"../types.mjs\";\nimport type { WorkbookManager } from \"./workbook-manager.mjs\";\nimport type { EvaluationManager } from \"./evaluation-manager.mjs\";\nimport { isCellInRange } from \"../utils.mjs\";\nimport {\n calculateGradientFactor,\n interpolateLCH,\n lchToHex,\n} from \"../utils/color-utils.mjs\";\nimport {\n subtractRange,\n rangesIntersect,\n isRangeContained,\n} from \"../utils/range-utils.mjs\";\n\nexport class StyleManager {\n private conditionalStyles: ConditionalStyle[] = [];\n private cellStyles: DirectCellStyle[] = [];\n\n constructor(private evaluationManager: EvaluationManager) {}\n\n /**\n * Add a conditional style rule\n */\n addConditionalStyle(style: ConditionalStyle): void {\n this.conditionalStyles.push(style);\n }\n\n /**\n * Remove a conditional style rule by index for a specific workbook\n */\n removeConditionalStyle(workbookName: string, index: number): boolean {\n const workbookStyles = this.conditionalStyles.filter(\n (style) => style.area.workbookName === workbookName\n );\n if (index < 0 || index >= workbookStyles.length) {\n return false;\n }\n // Find the actual index in the full array\n let currentIndex = 0;\n for (let i = 0; i < this.conditionalStyles.length; i++) {\n const style = this.conditionalStyles[i];\n if (style && style.area.workbookName === workbookName) {\n if (currentIndex === index) {\n this.conditionalStyles.splice(i, 1);\n return true;\n }\n currentIndex++;\n }\n }\n return false;\n }\n\n /**\n * Get all conditional styles intersecting with a range\n */\n getConditionalStylesIntersectingWithRange(\n range: RangeAddress\n ): ConditionalStyle[] {\n return this.conditionalStyles.filter(\n (style) =>\n style.area.workbookName === range.workbookName &&\n style.area.sheetName === range.sheetName &&\n rangesIntersect(style.area.range, range.range)\n );\n }\n\n /**\n * Add a direct cell style rule\n */\n addCellStyle(style: DirectCellStyle): void {\n this.cellStyles.push(style);\n }\n\n /**\n * Remove a direct cell style rule by index for a specific workbook\n */\n removeCellStyle(workbookName: string, index: number): boolean {\n const workbookStyles = this.cellStyles.filter(\n (style) => style && style.area && style.area.workbookName === workbookName\n );\n if (index < 0 || index >= workbookStyles.length) {\n return false;\n }\n // Find the actual index in the full array\n let currentIndex = 0;\n for (let i = 0; i < this.cellStyles.length; i++) {\n const style = this.cellStyles[i];\n if (style && style.area && style.area.workbookName === workbookName) {\n if (currentIndex === index) {\n this.cellStyles.splice(i, 1);\n return true;\n }\n currentIndex++;\n }\n }\n return false;\n }\n\n /**\n * Get all direct cell styles intersecting with a range\n */\n getStylesIntersectingWithRange(range: RangeAddress): DirectCellStyle[] {\n return this.cellStyles.filter(\n (style) =>\n style &&\n style.area.sheetName === range.sheetName &&\n style.area.workbookName === range.workbookName &&\n rangesIntersect(style.area.range, range.range)\n );\n }\n\n /**\n * Get the style for a range if all cells in the range have the same style\n * Returns the DirectCellStyle if the range is completely contained within a single style's area\n * Returns undefined if multiple styles, partial coverage, or no styles apply\n */\n getStyleForRange(range: RangeAddress): DirectCellStyle | undefined {\n const intersectingStyles = this.getStylesIntersectingWithRange(range);\n\n // If no styles intersect, return undefined\n if (intersectingStyles.length === 0) {\n return undefined;\n }\n\n // If multiple styles intersect, return undefined (range has mixed styles)\n if (intersectingStyles.length > 1) {\n return undefined;\n }\n\n // Check if the range is completely contained within the single style's area\n const style = intersectingStyles[0]!;\n if (isRangeContained(range.range, style.area.range)) {\n return style;\n }\n\n // Range is not completely contained, return undefined\n return undefined;\n }\n\n /**\n * Get all conditional styles across all workbooks (for serialization)\n */\n getAllConditionalStyles(): ConditionalStyle[] {\n return [...this.conditionalStyles];\n }\n\n /**\n * Get all cell styles (for serialization)\n */\n getAllCellStyles(): DirectCellStyle[] {\n return [...this.cellStyles];\n }\n\n /**\n * Reset all styles (for deserialization)\n */\n resetStyles(\n conditionalStyles?: ConditionalStyle[],\n cellStyles?: DirectCellStyle[]\n ): void {\n this.conditionalStyles = conditionalStyles ? [...conditionalStyles] : [];\n this.cellStyles = cellStyles ? [...cellStyles] : [];\n }\n\n /**\n * Remove all styles for a workbook\n */\n removeWorkbookStyles(workbookName: string): void {\n this.conditionalStyles = this.conditionalStyles.filter(\n (style) => style.area.workbookName !== workbookName\n );\n this.cellStyles = this.cellStyles.filter(\n (style) => style.area.workbookName !== workbookName\n );\n }\n\n /**\n * Update workbook name in all style references\n */\n updateWorkbookName(oldName: string, newName: string): void {\n // Update conditional styles\n this.conditionalStyles = this.conditionalStyles.map((style) => {\n if (style.area.workbookName === oldName) {\n return {\n ...style,\n area: {\n ...style.area,\n workbookName: newName,\n },\n };\n }\n return style;\n });\n // Update cell styles\n this.cellStyles = this.cellStyles.map((style) => {\n if (style.area.workbookName === oldName) {\n return {\n ...style,\n area: {\n ...style.area,\n workbookName: newName,\n },\n };\n }\n return style;\n });\n }\n\n /**\n * Update sheet name in style references\n */\n updateSheetName(\n workbookName: string,\n oldSheetName: string,\n newSheetName: string\n ): void {\n // Update conditional styles\n this.conditionalStyles = this.conditionalStyles.map((style) => {\n if (\n style.area.workbookName === workbookName &&\n style.area.sheetName === oldSheetName\n ) {\n return {\n ...style,\n area: {\n ...style.area,\n sheetName: newSheetName,\n },\n };\n }\n return style;\n });\n // Update cell styles\n this.cellStyles = this.cellStyles.map((style) => {\n if (\n style.area.workbookName === workbookName &&\n style.area.sheetName === oldSheetName\n ) {\n return {\n ...style,\n area: {\n ...style.area,\n sheetName: newSheetName,\n },\n };\n }\n return style;\n });\n }\n\n /**\n * Remove styles that reference a deleted sheet\n */\n removeSheetStyles(workbookName: string, sheetName: string): void {\n this.conditionalStyles = this.conditionalStyles.filter(\n (style) =>\n !(\n style.area.workbookName === workbookName &&\n style.area.sheetName === sheetName\n )\n );\n this.cellStyles = this.cellStyles.filter(\n (style) =>\n !(\n style.area.workbookName === workbookName &&\n style.area.sheetName === sheetName\n )\n );\n }\n\n /**\n * Get the style for a specific cell\n * Returns the first matching style (first match wins)\n * Checks cellStyles first, then conditionalStyles\n */\n getCellStyle(cellAddress: CellAddress): CellStyle | undefined {\n // First check conditional styles\n for (const style of this.conditionalStyles) {\n if (!style || !style.area) {\n continue;\n }\n // Check if cell is in the style's area\n if (\n style.area.sheetName !== cellAddress.sheetName ||\n style.area.workbookName !== cellAddress.workbookName\n ) {\n continue;\n }\n\n if (!isCellInRange(cellAddress, style.area.range)) {\n continue;\n }\n\n // Cell is in area, evaluate condition\n if (style.condition.type === \"formula\") {\n const result = this.evaluateFormulaCondition(cellAddress, style);\n if (result) return result;\n } else {\n const result = this.evaluateGradientCondition(cellAddress, style);\n if (result) return result;\n }\n }\n\n // Then check direct cell styles\n for (const cellStyle of this.cellStyles) {\n if (!cellStyle || !cellStyle.area) {\n continue;\n }\n if (\n cellStyle.area.workbookName === cellAddress.workbookName &&\n cellStyle.area.sheetName === cellAddress.sheetName &&\n isCellInRange(cellAddress, cellStyle.area.range)\n ) {\n return cellStyle.style;\n }\n }\n\n return undefined;\n }\n\n /**\n * Evaluate a formula-based style condition\n */\n private evaluateFormulaCondition(\n cellAddress: CellAddress,\n style: ConditionalStyle\n ): CellStyle | undefined {\n if (style.condition.type !== \"formula\") {\n return undefined;\n }\n\n try {\n // Evaluate formula in context of the cell\n // evaluateFormula expects a full cell value (with = prefix for formulas)\n const formula = style.condition.formula.startsWith(\"=\")\n ? style.condition.formula\n : `=${style.condition.formula}`;\n\n const result = this.evaluationManager.evaluateFormula(\n formula,\n cellAddress\n );\n\n // Check if result is truthy\n const isTruthy =\n result === true ||\n result === \"TRUE\" ||\n (typeof result === \"number\" && result !== 0);\n\n if (isTruthy) {\n return {\n backgroundColor: lchToHex(style.condition.color),\n };\n }\n } catch (error) {\n // If formula evaluation fails, don't apply style\n console.warn(\"Failed to evaluate formula condition:\", error);\n }\n\n return undefined;\n }\n\n /**\n * Evaluate a gradient-based style condition\n */\n private evaluateGradientCondition(\n cellAddress: CellAddress,\n style: ConditionalStyle\n ): CellStyle | undefined {\n if (style.condition.type !== \"gradient\") {\n return undefined;\n }\n\n try {\n // Get the cell's evaluation result\n const evalResult =\n this.evaluationManager.getCellEvaluationResult(cellAddress);\n if (!evalResult || evalResult.type !== \"value\") {\n return undefined;\n }\n if (evalResult.result.type !== \"number\") {\n return undefined;\n }\n const cellValue = evalResult.result.value;\n\n // Calculate min and max values for the gradient\n const { min: minValue, max: maxValue } = this.calculateGradientBounds(\n style,\n cellAddress\n );\n\n if (minValue === null || maxValue === null) {\n return undefined;\n }\n\n // Calculate interpolation factor\n const factor = calculateGradientFactor(cellValue, minValue, maxValue);\n\n // Interpolate between min and max colors\n const minColor = style.condition.min.color;\n const maxColor = style.condition.max.color;\n const interpolatedColor = interpolateLCH(minColor, maxColor, factor);\n\n return {\n backgroundColor: lchToHex(interpolatedColor),\n };\n } catch (error) {\n console.warn(\"Failed to evaluate gradient condition:\", error);\n return undefined;\n }\n }\n\n /**\n * Calculate min and max bounds for a gradient\n */\n private calculateGradientBounds(\n style: ConditionalStyle,\n cellAddress: CellAddress\n ): { min: number | null; max: number | null } {\n if (style.condition.type !== \"gradient\") {\n return { min: null, max: null };\n }\n\n const { min: minConfig, max: maxConfig } = style.condition;\n const topLeftCell: CellAddress = {\n workbookName: style.area.workbookName,\n sheetName: style.area.sheetName,\n colIndex: style.area.range.start.col,\n rowIndex: style.area.range.start.row,\n };\n\n // Calculate min value\n let minValue: number | null = null;\n if (minConfig.type === \"lowest_value\") {\n // Evaluate MIN(range) formula directly\n try {\n const rangeRef = this.getRangeReference(style.area);\n const result = this.evaluationManager.evaluateFormula(\n `=MIN(${rangeRef})`,\n topLeftCell\n );\n if (typeof result === \"number\") {\n minValue = result;\n }\n } catch (error) {\n console.warn(\"Failed to calculate MIN:\", error);\n }\n } else {\n // Evaluate valueFormula in context of area's top-left cell\n const formula = minConfig.valueFormula.startsWith(\"=\")\n ? minConfig.valueFormula\n : `=${minConfig.valueFormula}`;\n const result = this.evaluationManager.evaluateFormula(\n formula,\n topLeftCell\n );\n if (typeof result === \"number\") {\n minValue = result;\n }\n }\n\n // Calculate max value\n let maxValue: number | null = null;\n if (maxConfig.type === \"highest_value\") {\n // Evaluate MAX(range) formula directly\n try {\n const rangeRef = this.getRangeReference(style.area);\n const result = this.evaluationManager.evaluateFormula(\n `=MAX(${rangeRef})`,\n topLeftCell\n );\n if (typeof result === \"number\") {\n maxValue = result;\n }\n } catch (error) {\n console.warn(\"Failed to calculate MAX:\", error);\n }\n } else {\n // Evaluate valueFormula in context of area's top-left cell\n const formula = maxConfig.valueFormula.startsWith(\"=\")\n ? maxConfig.valueFormula\n : `=${maxConfig.valueFormula}`;\n const result = this.evaluationManager.evaluateFormula(\n formula,\n topLeftCell\n );\n if (typeof result === \"number\") {\n maxValue = result;\n }\n }\n\n return { min: minValue, max: maxValue };\n }\n\n /**\n * Get a range reference string from a RangeAddress\n * Follows CANONICAL_RANGES.md format:\n * - Closed: A5:D10\n * - Row-bounded (col-open): A5:10\n * - Col-bounded (row-open): A5:D\n * - Open both: A5:INFINITY\n */\n private getRangeReference(area: RangeAddress): string {\n const colToLetter = (col: number): string => {\n let result = \"\";\n let c = col;\n while (c >= 0) {\n result = String.fromCharCode(65 + (c % 26)) + result;\n c = Math.floor(c / 26) - 1;\n }\n return result;\n };\n\n const startCol = colToLetter(area.range.start.col);\n const startRow = area.range.start.row + 1; // Convert to 1-based\n\n const isColInfinity = area.range.end.col.type === \"infinity\";\n const isRowInfinity = area.range.end.row.type === \"infinity\";\n\n let rangeStr: string;\n\n if (isColInfinity && isRowInfinity) {\n // Open both: A5:INFINITY\n rangeStr = `${startCol}${startRow}:INFINITY`;\n } else if (isColInfinity) {\n // Row-bounded (col-open): A5:10\n if (area.range.end.row.type === \"number\") {\n const endRow = area.range.end.row.value + 1; // Convert to 1-based\n rangeStr = `${startCol}${startRow}:${endRow}`;\n } else {\n rangeStr = `${startCol}${startRow}:INFINITY`;\n }\n } else if (isRowInfinity) {\n // Col-bounded (row-open): A5:D\n if (area.range.end.col.type === \"number\") {\n const endCol = colToLetter(area.range.end.col.value);\n rangeStr = `${startCol}${startRow}:${endCol}`;\n } else {\n rangeStr = `${startCol}${startRow}:INFINITY`;\n }\n } else {\n // Closed rectangle: A5:D10\n if (\n area.range.end.col.type === \"number\" &&\n area.range.end.row.type === \"number\"\n ) {\n const endCol = colToLetter(area.range.end.col.value);\n const endRow = area.range.end.row.value + 1; // Convert to 1-based\n rangeStr = `${startCol}${startRow}:${endCol}${endRow}`;\n } else {\n // Fallback to INFINITY if types don't match\n rangeStr = `${startCol}${startRow}:INFINITY`;\n }\n }\n\n // Quote sheet name if it contains spaces or special characters\n const needsQuotes = /[ '!]/.test(area.sheetName);\n const sheetRef = needsQuotes\n ? `'${area.sheetName.replace(/'/g, \"''\")}'`\n : area.sheetName;\n\n // Construct the full reference: [workbook]'sheet'!range\n return `[${area.workbookName}]${sheetRef}!${rangeStr}`;\n }\n\n /**\n * Clear cell styles and conditional styles for a given range\n * Adjusts existing style ranges rather than deleting them entirely\n */\n clearCellStyles(range: RangeAddress): void {\n // Process cellStyles\n const newCellStyles: DirectCellStyle[] = [];\n for (const cellStyle of this.cellStyles) {\n if (!cellStyle || !cellStyle.area) {\n newCellStyles.push(cellStyle);\n continue;\n }\n\n // Check if this style intersects with the clear range\n if (\n cellStyle.area.workbookName === range.workbookName &&\n cellStyle.area.sheetName === range.sheetName &&\n rangesIntersect(cellStyle.area.range, range.range)\n ) {\n // Subtract the clear range from this style's range\n const remainingRanges = subtractRange(\n cellStyle.area.range,\n range.range\n );\n\n // Add new styles for each remaining range\n for (const remainingRange of remainingRanges) {\n newCellStyles.push({\n area: {\n workbookName: cellStyle.area.workbookName,\n sheetName: cellStyle.area.sheetName,\n range: remainingRange,\n },\n style: cellStyle.style,\n });\n }\n } else {\n // No intersection, keep the style as-is\n newCellStyles.push(cellStyle);\n }\n }\n this.cellStyles = newCellStyles;\n\n // Process conditionalStyles\n const newConditionalStyles: ConditionalStyle[] = [];\n for (const conditionalStyle of this.conditionalStyles) {\n if (!conditionalStyle || !conditionalStyle.area) {\n newConditionalStyles.push(conditionalStyle);\n continue;\n }\n\n // Check if this style intersects with the clear range\n if (\n conditionalStyle.area.workbookName === range.workbookName &&\n conditionalStyle.area.sheetName === range.sheetName &&\n rangesIntersect(conditionalStyle.area.range, range.range)\n ) {\n // Subtract the clear range from this style's range\n const remainingRanges = subtractRange(\n conditionalStyle.area.range,\n range.range\n );\n\n // Add new styles for each remaining range\n for (const remainingRange of remainingRanges) {\n newConditionalStyles.push({\n area: {\n workbookName: conditionalStyle.area.workbookName,\n sheetName: conditionalStyle.area.sheetName,\n range: remainingRange,\n },\n condition: conditionalStyle.condition,\n });\n }\n } else {\n // No intersection, keep the style as-is\n newConditionalStyles.push(conditionalStyle);\n }\n }\n this.conditionalStyles = newConditionalStyles;\n }\n\n /**\n * Clear cell styles in a range using subtraction\n * For each intersecting style, subtract the cleared range:\n * - If style is completely contained: remove entire style\n * - If style partially overlaps: split into remaining rectangles\n * - If no intersection: keep unchanged\n * \n * This matches Excel's behavior where pasting replaces formatting\n */\n clearCellStylesInRange(range: RangeAddress): void {\n const newCellStyles: DirectCellStyle[] = [];\n\n for (const style of this.cellStyles) {\n // Skip styles from different sheets/workbooks\n if (\n style.area.workbookName !== range.workbookName ||\n style.area.sheetName !== range.sheetName\n ) {\n newCellStyles.push(style);\n continue;\n }\n\n // Check if this style intersects with the range to clear\n if (!rangesIntersect(style.area.range, range.range)) {\n // No intersection, keep the style unchanged\n newCellStyles.push(style);\n continue;\n }\n\n // Style intersects - subtract the cleared range\n const remainingRanges = subtractRange(style.area.range, range.range);\n\n // Create new style entries for each remaining range\n for (const remainingRange of remainingRanges) {\n newCellStyles.push({\n area: {\n workbookName: style.area.workbookName,\n sheetName: style.area.sheetName,\n range: remainingRange,\n },\n style: style.style, // Keep same style properties\n });\n }\n }\n\n this.cellStyles = newCellStyles;\n }\n}\n"
5
+ "/**\n * StyleManager - Manages conditional styling for cells\n */\n\nimport type {\n CellAddress,\n CellStyle,\n ConditionalStyle,\n DirectCellStyle,\n RangeAddress,\n SerializedCellValue,\n} from \"../types.mjs\";\nimport type { WorkbookManager } from \"./workbook-manager.mjs\";\nimport type { EvaluationManager } from \"./evaluation-manager.mjs\";\nimport { isCellInRange } from \"../utils.mjs\";\nimport {\n calculateGradientFactor,\n interpolateLCH,\n lchToHex,\n} from \"../utils/color-utils.mjs\";\nimport {\n subtractRange,\n rangesIntersect,\n isRangeContained,\n} from \"../utils/range-utils.mjs\";\n\nexport class StyleManager {\n private conditionalStyles: ConditionalStyle[] = [];\n private cellStyles: DirectCellStyle[] = [];\n\n constructor(private evaluationManager: EvaluationManager) {}\n\n /**\n * Add a conditional style rule\n */\n addConditionalStyle(style: ConditionalStyle): void {\n this.conditionalStyles.push(style);\n }\n\n /**\n * Remove a conditional style rule by index for a specific workbook\n */\n removeConditionalStyle(workbookName: string, index: number): boolean {\n const workbookStyles = this.conditionalStyles.filter(\n (style) => style.areas.some(area => area.workbookName === workbookName)\n );\n if (index < 0 || index >= workbookStyles.length) {\n return false;\n }\n // Find the actual index in the full array\n let currentIndex = 0;\n for (let i = 0; i < this.conditionalStyles.length; i++) {\n const style = this.conditionalStyles[i];\n if (style && style.areas.some(area => area.workbookName === workbookName)) {\n if (currentIndex === index) {\n this.conditionalStyles.splice(i, 1);\n return true;\n }\n currentIndex++;\n }\n }\n return false;\n }\n\n /**\n * Get all conditional styles intersecting with a range\n */\n getConditionalStylesIntersectingWithRange(\n range: RangeAddress\n ): ConditionalStyle[] {\n return this.conditionalStyles.filter(\n (style) =>\n style.areas.some(area =>\n area.workbookName === range.workbookName &&\n area.sheetName === range.sheetName &&\n rangesIntersect(area.range, range.range)\n )\n );\n }\n\n /**\n * Add a direct cell style rule\n */\n addCellStyle(style: DirectCellStyle): void {\n this.cellStyles.push(style);\n }\n\n /**\n * Remove a direct cell style rule by index for a specific workbook\n */\n removeCellStyle(workbookName: string, index: number): boolean {\n const workbookStyles = this.cellStyles.filter(\n (style) => style && style.areas && style.areas.some(area => area.workbookName === workbookName)\n );\n if (index < 0 || index >= workbookStyles.length) {\n return false;\n }\n // Find the actual index in the full array\n let currentIndex = 0;\n for (let i = 0; i < this.cellStyles.length; i++) {\n const style = this.cellStyles[i];\n if (style && style.areas && style.areas.some(area => area.workbookName === workbookName)) {\n if (currentIndex === index) {\n this.cellStyles.splice(i, 1);\n return true;\n }\n currentIndex++;\n }\n }\n return false;\n }\n\n /**\n * Get all direct cell styles intersecting with a range\n */\n getStylesIntersectingWithRange(range: RangeAddress): DirectCellStyle[] {\n return this.cellStyles.filter(\n (style) =>\n style &&\n style.areas.some(area =>\n area.sheetName === range.sheetName &&\n area.workbookName === range.workbookName &&\n rangesIntersect(area.range, range.range)\n )\n );\n }\n\n /**\n * Get the style for a range if all cells in the range have the same style\n * Returns the DirectCellStyle if the range is completely contained within a single style's areas\n * Returns undefined if multiple styles, partial coverage, or no styles apply\n */\n getStyleForRange(range: RangeAddress): DirectCellStyle | undefined {\n const intersectingStyles = this.getStylesIntersectingWithRange(range);\n\n // If no styles intersect, return undefined\n if (intersectingStyles.length === 0) {\n return undefined;\n }\n\n // If multiple styles intersect, return undefined (range has mixed styles)\n if (intersectingStyles.length > 1) {\n return undefined;\n }\n\n // Check if the range is completely contained within any of the single style's areas\n const style = intersectingStyles[0]!;\n const isContained = style.areas.some(area =>\n area.workbookName === range.workbookName &&\n area.sheetName === range.sheetName &&\n isRangeContained(range.range, area.range)\n );\n \n if (isContained) {\n return style;\n }\n\n // Range is not completely contained, return undefined\n return undefined;\n }\n\n /**\n * Get all conditional styles across all workbooks (for serialization)\n */\n getAllConditionalStyles(): ConditionalStyle[] {\n return [...this.conditionalStyles];\n }\n\n /**\n * Get all cell styles (for serialization)\n */\n getAllCellStyles(): DirectCellStyle[] {\n return [...this.cellStyles];\n }\n\n /**\n * Reset all styles (for deserialization)\n */\n resetStyles(\n conditionalStyles?: ConditionalStyle[],\n cellStyles?: DirectCellStyle[]\n ): void {\n this.conditionalStyles = conditionalStyles ? [...conditionalStyles] : [];\n this.cellStyles = cellStyles ? [...cellStyles] : [];\n }\n\n /**\n * Remove all styles for a workbook\n */\n removeWorkbookStyles(workbookName: string): void {\n this.conditionalStyles = this.conditionalStyles.filter(\n (style) => !style.areas.some(area => area.workbookName === workbookName)\n );\n this.cellStyles = this.cellStyles.filter(\n (style) => !style.areas.some(area => area.workbookName === workbookName)\n );\n }\n\n /**\n * Update workbook name in all style references\n */\n updateWorkbookName(oldName: string, newName: string): void {\n // Update conditional styles\n this.conditionalStyles = this.conditionalStyles.map((style) => ({\n ...style,\n areas: style.areas.map(area =>\n area.workbookName === oldName\n ? { ...area, workbookName: newName }\n : area\n )\n }));\n // Update cell styles\n this.cellStyles = this.cellStyles.map((style) => ({\n ...style,\n areas: style.areas.map(area =>\n area.workbookName === oldName\n ? { ...area, workbookName: newName }\n : area\n )\n }));\n }\n\n /**\n * Update sheet name in style references\n */\n updateSheetName(\n workbookName: string,\n oldSheetName: string,\n newSheetName: string\n ): void {\n // Update conditional styles\n this.conditionalStyles = this.conditionalStyles.map((style) => ({\n ...style,\n areas: style.areas.map(area =>\n area.workbookName === workbookName && area.sheetName === oldSheetName\n ? { ...area, sheetName: newSheetName }\n : area\n )\n }));\n // Update cell styles\n this.cellStyles = this.cellStyles.map((style) => ({\n ...style,\n areas: style.areas.map(area =>\n area.workbookName === workbookName && area.sheetName === oldSheetName\n ? { ...area, sheetName: newSheetName }\n : area\n )\n }));\n }\n\n /**\n * Remove styles that reference a deleted sheet\n */\n removeSheetStyles(workbookName: string, sheetName: string): void {\n this.conditionalStyles = this.conditionalStyles.filter(\n (style) =>\n !style.areas.some(area =>\n area.workbookName === workbookName &&\n area.sheetName === sheetName\n )\n );\n this.cellStyles = this.cellStyles.filter(\n (style) =>\n !style.areas.some(area =>\n area.workbookName === workbookName &&\n area.sheetName === sheetName\n )\n );\n }\n\n /**\n * Get the style for a specific cell\n * Returns the first matching style (first match wins)\n * Checks cellStyles first, then conditionalStyles\n */\n getCellStyle(cellAddress: CellAddress): CellStyle | undefined {\n // First check conditional styles\n for (const style of this.conditionalStyles) {\n if (!style || !style.areas) {\n continue;\n }\n \n // Check if cell is in any of the style's areas\n for (const area of style.areas) {\n if (\n area.sheetName !== cellAddress.sheetName ||\n area.workbookName !== cellAddress.workbookName\n ) {\n continue;\n }\n\n if (!isCellInRange(cellAddress, area.range)) {\n continue;\n }\n\n // Cell is in area, evaluate condition\n if (style.condition.type === \"formula\") {\n const result = this.evaluateFormulaCondition(cellAddress, style, area);\n if (result) return result;\n } else {\n const result = this.evaluateGradientCondition(cellAddress, style, area);\n if (result) return result;\n }\n }\n }\n\n // Then check direct cell styles\n for (const cellStyle of this.cellStyles) {\n if (!cellStyle || !cellStyle.areas) {\n continue;\n }\n \n for (const area of cellStyle.areas) {\n if (\n area.workbookName === cellAddress.workbookName &&\n area.sheetName === cellAddress.sheetName &&\n isCellInRange(cellAddress, area.range)\n ) {\n return cellStyle.style;\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Evaluate a formula-based style condition\n */\n private evaluateFormulaCondition(\n cellAddress: CellAddress,\n style: ConditionalStyle,\n area: RangeAddress\n ): CellStyle | undefined {\n if (style.condition.type !== \"formula\") {\n return undefined;\n }\n\n try {\n // Evaluate formula in context of the cell\n // evaluateFormula expects a full cell value (with = prefix for formulas)\n const formula = style.condition.formula.startsWith(\"=\")\n ? style.condition.formula\n : `=${style.condition.formula}`;\n\n const result = this.evaluationManager.evaluateFormula(\n formula,\n cellAddress\n );\n\n // Check if result is truthy\n const isTruthy =\n result === true ||\n result === \"TRUE\" ||\n (typeof result === \"number\" && result !== 0);\n\n if (isTruthy) {\n return {\n backgroundColor: lchToHex(style.condition.color),\n };\n }\n } catch (error) {\n // If formula evaluation fails, don't apply style\n console.warn(\"Failed to evaluate formula condition:\", error);\n }\n\n return undefined;\n }\n\n /**\n * Evaluate a gradient-based style condition\n */\n private evaluateGradientCondition(\n cellAddress: CellAddress,\n style: ConditionalStyle,\n area: RangeAddress\n ): CellStyle | undefined {\n if (style.condition.type !== \"gradient\") {\n return undefined;\n }\n\n try {\n // Get the cell's evaluation result\n const evalResult =\n this.evaluationManager.getCellEvaluationResult(cellAddress);\n if (!evalResult || evalResult.type !== \"value\") {\n return undefined;\n }\n if (evalResult.result.type !== \"number\") {\n return undefined;\n }\n const cellValue = evalResult.result.value;\n\n // Calculate min and max values for the gradient\n const { min: minValue, max: maxValue} = this.calculateGradientBounds(\n style,\n cellAddress,\n area\n );\n\n if (minValue === null || maxValue === null) {\n return undefined;\n }\n\n // Calculate interpolation factor\n const factor = calculateGradientFactor(cellValue, minValue, maxValue);\n\n // Interpolate between min and max colors\n const minColor = style.condition.min.color;\n const maxColor = style.condition.max.color;\n const interpolatedColor = interpolateLCH(minColor, maxColor, factor);\n\n return {\n backgroundColor: lchToHex(interpolatedColor),\n };\n } catch (error) {\n console.warn(\"Failed to evaluate gradient condition:\", error);\n return undefined;\n }\n }\n\n /**\n * Calculate min and max bounds for a gradient\n */\n private calculateGradientBounds(\n style: ConditionalStyle,\n cellAddress: CellAddress,\n area: RangeAddress\n ): { min: number | null; max: number | null } {\n if (style.condition.type !== \"gradient\") {\n return { min: null, max: null };\n }\n\n const { min: minConfig, max: maxConfig } = style.condition;\n const topLeftCell: CellAddress = {\n workbookName: area.workbookName,\n sheetName: area.sheetName,\n colIndex: area.range.start.col,\n rowIndex: area.range.start.row,\n };\n\n // Calculate min value\n let minValue: number | null = null;\n if (minConfig.type === \"lowest_value\") {\n // Evaluate MIN(range) formula directly\n try {\n const rangeRef = this.getRangeReference(area);\n const result = this.evaluationManager.evaluateFormula(\n `=MIN(${rangeRef})`,\n topLeftCell\n );\n if (typeof result === \"number\") {\n minValue = result;\n }\n } catch (error) {\n console.warn(\"Failed to calculate MIN:\", error);\n }\n } else {\n // Evaluate valueFormula in context of area's top-left cell\n const formula = minConfig.valueFormula.startsWith(\"=\")\n ? minConfig.valueFormula\n : `=${minConfig.valueFormula}`;\n const result = this.evaluationManager.evaluateFormula(\n formula,\n topLeftCell\n );\n if (typeof result === \"number\") {\n minValue = result;\n }\n }\n\n // Calculate max value\n let maxValue: number | null = null;\n if (maxConfig.type === \"highest_value\") {\n // Evaluate MAX(range) formula directly\n try {\n const rangeRef = this.getRangeReference(area);\n const result = this.evaluationManager.evaluateFormula(\n `=MAX(${rangeRef})`,\n topLeftCell\n );\n if (typeof result === \"number\") {\n maxValue = result;\n }\n } catch (error) {\n console.warn(\"Failed to calculate MAX:\", error);\n }\n } else {\n // Evaluate valueFormula in context of area's top-left cell\n const formula = maxConfig.valueFormula.startsWith(\"=\")\n ? maxConfig.valueFormula\n : `=${maxConfig.valueFormula}`;\n const result = this.evaluationManager.evaluateFormula(\n formula,\n topLeftCell\n );\n if (typeof result === \"number\") {\n maxValue = result;\n }\n }\n\n return { min: minValue, max: maxValue };\n }\n\n /**\n * Get a range reference string from a RangeAddress\n * Follows CANONICAL_RANGES.md format:\n * - Closed: A5:D10\n * - Row-bounded (col-open): A5:10\n * - Col-bounded (row-open): A5:D\n * - Open both: A5:INFINITY\n */\n private getRangeReference(area: RangeAddress): string {\n const colToLetter = (col: number): string => {\n let result = \"\";\n let c = col;\n while (c >= 0) {\n result = String.fromCharCode(65 + (c % 26)) + result;\n c = Math.floor(c / 26) - 1;\n }\n return result;\n };\n\n const startCol = colToLetter(area.range.start.col);\n const startRow = area.range.start.row + 1; // Convert to 1-based\n\n const isColInfinity = area.range.end.col.type === \"infinity\";\n const isRowInfinity = area.range.end.row.type === \"infinity\";\n\n let rangeStr: string;\n\n if (isColInfinity && isRowInfinity) {\n // Open both: A5:INFINITY\n rangeStr = `${startCol}${startRow}:INFINITY`;\n } else if (isColInfinity) {\n // Row-bounded (col-open): A5:10\n if (area.range.end.row.type === \"number\") {\n const endRow = area.range.end.row.value + 1; // Convert to 1-based\n rangeStr = `${startCol}${startRow}:${endRow}`;\n } else {\n rangeStr = `${startCol}${startRow}:INFINITY`;\n }\n } else if (isRowInfinity) {\n // Col-bounded (row-open): A5:D\n if (area.range.end.col.type === \"number\") {\n const endCol = colToLetter(area.range.end.col.value);\n rangeStr = `${startCol}${startRow}:${endCol}`;\n } else {\n rangeStr = `${startCol}${startRow}:INFINITY`;\n }\n } else {\n // Closed rectangle: A5:D10\n if (\n area.range.end.col.type === \"number\" &&\n area.range.end.row.type === \"number\"\n ) {\n const endCol = colToLetter(area.range.end.col.value);\n const endRow = area.range.end.row.value + 1; // Convert to 1-based\n rangeStr = `${startCol}${startRow}:${endCol}${endRow}`;\n } else {\n // Fallback to INFINITY if types don't match\n rangeStr = `${startCol}${startRow}:INFINITY`;\n }\n }\n\n // Quote sheet name if it contains spaces or special characters\n const needsQuotes = /[ '!]/.test(area.sheetName);\n const sheetRef = needsQuotes\n ? `'${area.sheetName.replace(/'/g, \"''\")}'`\n : area.sheetName;\n\n // Construct the full reference: [workbook]'sheet'!range\n return `[${area.workbookName}]${sheetRef}!${rangeStr}`;\n }\n\n /**\n * Clear cell styles and conditional styles for a given range\n * Adjusts existing style ranges rather than deleting them entirely\n */\n clearCellStyles(range: RangeAddress): void {\n // Process cellStyles - punch holes in areas\n this.cellStyles = this.cellStyles.map(cellStyle => {\n if (!cellStyle || !cellStyle.areas) {\n return cellStyle;\n }\n\n const newAreas: RangeAddress[] = [];\n \n for (const area of cellStyle.areas) {\n // Check if this area intersects with the clear range\n if (\n area.workbookName === range.workbookName &&\n area.sheetName === range.sheetName &&\n rangesIntersect(area.range, range.range)\n ) {\n // Subtract the clear range from this area\n const remainingRanges = subtractRange(area.range, range.range);\n\n // Add all remaining ranges as new areas\n for (const remainingRange of remainingRanges) {\n newAreas.push({\n workbookName: area.workbookName,\n sheetName: area.sheetName,\n range: remainingRange,\n });\n }\n } else {\n // No intersection, keep the area as-is\n newAreas.push(area);\n }\n }\n \n return { ...cellStyle, areas: newAreas };\n }).filter(style => style.areas.length > 0);\n\n // Process conditionalStyles - punch holes in areas\n this.conditionalStyles = this.conditionalStyles.map(conditionalStyle => {\n if (!conditionalStyle || !conditionalStyle.areas) {\n return conditionalStyle;\n }\n\n const newAreas: RangeAddress[] = [];\n \n for (const area of conditionalStyle.areas) {\n // Check if this area intersects with the clear range\n if (\n area.workbookName === range.workbookName &&\n area.sheetName === range.sheetName &&\n rangesIntersect(area.range, range.range)\n ) {\n // Subtract the clear range from this area\n const remainingRanges = subtractRange(area.range, range.range);\n\n // Add all remaining ranges as new areas\n for (const remainingRange of remainingRanges) {\n newAreas.push({\n workbookName: area.workbookName,\n sheetName: area.sheetName,\n range: remainingRange,\n });\n }\n } else {\n // No intersection, keep the area as-is\n newAreas.push(area);\n }\n }\n \n return { ...conditionalStyle, areas: newAreas };\n }).filter(style => style.areas.length > 0);\n }\n\n /**\n * Clear cell styles in a range using subtraction\n * For each intersecting style, subtract the cleared range from its areas:\n * - If an area is completely contained: remove that area\n * - If an area partially overlaps: split into remaining rectangles (hole punching)\n * - If no intersection: keep area unchanged\n * \n * This matches Excel's behavior where cutting/pasting creates multi-area styles\n */\n clearCellStylesInRange(range: RangeAddress): void {\n this.cellStyles = this.cellStyles.map(style => {\n const newAreas: RangeAddress[] = [];\n \n for (const area of style.areas) {\n // Skip areas from different sheets/workbooks\n if (\n area.workbookName !== range.workbookName ||\n area.sheetName !== range.sheetName\n ) {\n newAreas.push(area);\n continue;\n }\n\n // Check if this area intersects with the range to clear\n if (!rangesIntersect(area.range, range.range)) {\n // No intersection, keep the area unchanged\n newAreas.push(area);\n continue;\n }\n\n // Area intersects - subtract the cleared range (may produce multiple ranges)\n const remainingRanges = subtractRange(area.range, range.range);\n\n // Add all remaining ranges as new areas for this style\n for (const remainingRange of remainingRanges) {\n newAreas.push({\n workbookName: area.workbookName,\n sheetName: area.sheetName,\n range: remainingRange,\n });\n }\n }\n \n return { ...style, areas: newAreas };\n }).filter(style => style.areas.length > 0); // Remove styles with no areas left\n }\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "0E37CC199FCD4ED464756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "7841C29C2F9909CC64756E2164756E21",
9
9
  "names": []
10
10
  }