@pagent-libs/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/README.md +32 -0
  2. package/dist/canvas/cell-renderer.d.ts +45 -0
  3. package/dist/canvas/cell-renderer.d.ts.map +1 -0
  4. package/dist/canvas/grid-renderer.d.ts +29 -0
  5. package/dist/canvas/grid-renderer.d.ts.map +1 -0
  6. package/dist/canvas/header-renderer.d.ts +58 -0
  7. package/dist/canvas/header-renderer.d.ts.map +1 -0
  8. package/dist/canvas/hit-testing.d.ts +81 -0
  9. package/dist/canvas/hit-testing.d.ts.map +1 -0
  10. package/dist/canvas/index.d.ts +9 -0
  11. package/dist/canvas/index.d.ts.map +1 -0
  12. package/dist/canvas/renderer.d.ts +140 -0
  13. package/dist/canvas/renderer.d.ts.map +1 -0
  14. package/dist/canvas/selection-renderer.d.ts +55 -0
  15. package/dist/canvas/selection-renderer.d.ts.map +1 -0
  16. package/dist/canvas/text-renderer.d.ts +49 -0
  17. package/dist/canvas/text-renderer.d.ts.map +1 -0
  18. package/dist/canvas/types.d.ts +200 -0
  19. package/dist/canvas/types.d.ts.map +1 -0
  20. package/dist/collaboration/firebase-provider.d.ts +13 -0
  21. package/dist/collaboration/firebase-provider.d.ts.map +1 -0
  22. package/dist/collaboration/index.d.ts +3 -0
  23. package/dist/collaboration/index.d.ts.map +1 -0
  24. package/dist/collaboration/types.d.ts +34 -0
  25. package/dist/collaboration/types.d.ts.map +1 -0
  26. package/dist/event-emitter.d.ts +13 -0
  27. package/dist/event-emitter.d.ts.map +1 -0
  28. package/dist/export/csv.d.ts +5 -0
  29. package/dist/export/csv.d.ts.map +1 -0
  30. package/dist/export/index.d.ts +2 -0
  31. package/dist/export/index.d.ts.map +1 -0
  32. package/dist/features/filter.d.ts +58 -0
  33. package/dist/features/filter.d.ts.map +1 -0
  34. package/dist/features/freeze.d.ts +86 -0
  35. package/dist/features/freeze.d.ts.map +1 -0
  36. package/dist/features/index.d.ts +4 -0
  37. package/dist/features/index.d.ts.map +1 -0
  38. package/dist/features/sort.d.ts +15 -0
  39. package/dist/features/sort.d.ts.map +1 -0
  40. package/dist/format-pool.d.ts +17 -0
  41. package/dist/format-pool.d.ts.map +1 -0
  42. package/dist/formula-graph.d.ts +12 -0
  43. package/dist/formula-graph.d.ts.map +1 -0
  44. package/dist/formula-parser/cell-reference.d.ts +7 -0
  45. package/dist/formula-parser/cell-reference.d.ts.map +1 -0
  46. package/dist/formula-parser/formula-adjust.d.ts +13 -0
  47. package/dist/formula-parser/formula-adjust.d.ts.map +1 -0
  48. package/dist/formula-parser/formula-ranges.d.ts +22 -0
  49. package/dist/formula-parser/formula-ranges.d.ts.map +1 -0
  50. package/dist/formula-parser/index.d.ts +6 -0
  51. package/dist/formula-parser/index.d.ts.map +1 -0
  52. package/dist/formula-parser/parser.d.ts +18 -0
  53. package/dist/formula-parser/parser.d.ts.map +1 -0
  54. package/dist/formula-parser/types.d.ts +33 -0
  55. package/dist/formula-parser/types.d.ts.map +1 -0
  56. package/dist/index.d.ts +15 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.esm.js +5823 -0
  59. package/dist/index.esm.js.map +1 -0
  60. package/dist/index.js +5885 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/sheet.d.ts +119 -0
  63. package/dist/sheet.d.ts.map +1 -0
  64. package/dist/style-pool.d.ts +17 -0
  65. package/dist/style-pool.d.ts.map +1 -0
  66. package/dist/types.d.ts +260 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/utils/cell-key.d.ts +7 -0
  69. package/dist/utils/cell-key.d.ts.map +1 -0
  70. package/dist/utils/format-utils.d.ts +75 -0
  71. package/dist/utils/format-utils.d.ts.map +1 -0
  72. package/dist/utils/range.d.ts +13 -0
  73. package/dist/utils/range.d.ts.map +1 -0
  74. package/dist/workbook.d.ts +155 -0
  75. package/dist/workbook.d.ts.map +1 -0
  76. package/package.json +46 -0
  77. package/src/canvas/cell-renderer.ts +181 -0
  78. package/src/canvas/grid-renderer.ts +238 -0
  79. package/src/canvas/header-renderer.ts +402 -0
  80. package/src/canvas/hit-testing.ts +537 -0
  81. package/src/canvas/index.ts +16 -0
  82. package/src/canvas/renderer.ts +1056 -0
  83. package/src/canvas/selection-renderer.ts +604 -0
  84. package/src/canvas/text-renderer.ts +321 -0
  85. package/src/canvas/types.ts +289 -0
  86. package/src/collaboration/firebase-provider.ts +48 -0
  87. package/src/collaboration/index.ts +5 -0
  88. package/src/collaboration/types.ts +38 -0
  89. package/src/event-emitter.ts +73 -0
  90. package/src/export/csv.ts +101 -0
  91. package/src/export/index.ts +4 -0
  92. package/src/features/filter.ts +231 -0
  93. package/src/features/freeze.ts +271 -0
  94. package/src/features/index.ts +5 -0
  95. package/src/features/sort.ts +282 -0
  96. package/src/format-pool.ts +61 -0
  97. package/src/formula-graph.ts +84 -0
  98. package/src/formula-parser/cell-reference.ts +99 -0
  99. package/src/formula-parser/formula-adjust.ts +129 -0
  100. package/src/formula-parser/formula-ranges.ts +159 -0
  101. package/src/formula-parser/index.ts +8 -0
  102. package/src/formula-parser/parser.ts +438 -0
  103. package/src/formula-parser/types.ts +39 -0
  104. package/src/index.ts +25 -0
  105. package/src/sheet.ts +502 -0
  106. package/src/style-pool.ts +62 -0
  107. package/src/types.ts +291 -0
  108. package/src/utils/cell-key.ts +19 -0
  109. package/src/utils/format-utils.ts +515 -0
  110. package/src/utils/range.ts +53 -0
  111. package/src/workbook.ts +1031 -0
package/src/types.ts ADDED
@@ -0,0 +1,291 @@
1
+ // Core types for pagent-sheets
2
+
3
+ export type CellValue = string | number | boolean | null;
4
+
5
+ export interface CellStyle {
6
+ bold?: boolean;
7
+ italic?: boolean;
8
+ fontFamily?: string;
9
+ fontSize?: number;
10
+ fontColor?: string;
11
+ backgroundColor?: string;
12
+ textAlign?: 'left' | 'center' | 'right';
13
+ verticalAlign?: 'top' | 'middle' | 'bottom';
14
+ borderTop?: string;
15
+ borderRight?: string;
16
+ borderBottom?: string;
17
+ borderLeft?: string;
18
+ textWrap?: boolean;
19
+ textDecoration?: 'none' | 'underline' | 'line-through';
20
+ }
21
+
22
+ export type FormatType =
23
+ | 'text'
24
+ | 'number'
25
+ | 'currency'
26
+ | 'accounting'
27
+ | 'percentage'
28
+ | 'scientific'
29
+ | 'fraction'
30
+ | 'date'
31
+ | 'time'
32
+ | 'datetime'
33
+ | 'duration'
34
+ | 'custom'
35
+ | undefined;
36
+
37
+ export interface CellFormat {
38
+ type?: FormatType;
39
+
40
+ // Number format options
41
+ decimalPlaces?: number; // 0-30
42
+ useThousandsSeparator?: boolean;
43
+
44
+ // Currency format options
45
+ currencyCode?: string; // USD, EUR, GBP, JPY, etc.
46
+ currencySymbolPosition?: 'prefix' | 'suffix';
47
+
48
+ // Negative number display options
49
+ negativeFormat?: 'minus' | 'parentheses' | 'red';
50
+
51
+ // Date/Time format options
52
+ dateFormat?: string; // e.g., 'MM/DD/YYYY', 'DD-MM-YYYY'
53
+ timeFormat?: string; // e.g., 'HH:mm:ss', 'h:mm AM/PM'
54
+
55
+ // Fraction format options
56
+ fractionType?: 'upToOne' | 'upToTwo' | 'upToThree' | 'asHalves' | 'asQuarters' | 'asEighths' | 'asSixteenths' | 'asTenths' | 'asHundredths';
57
+
58
+ // Duration format options
59
+ durationFormat?: 'hours' | 'minutes' | 'seconds' | 'milliseconds';
60
+
61
+ // Custom format pattern
62
+ pattern?: string; // Custom number format pattern (e.g., "#,##0.00", "0.0%")
63
+ }
64
+
65
+ export interface Cell {
66
+ value: CellValue;
67
+ formula?: string;
68
+ styleId?: string; // Reference to shared style in StylePool
69
+ formatId?: string; // Reference to shared format in FormatPool
70
+ comment?: string;
71
+ hyperlink?: string;
72
+ }
73
+
74
+ export interface Range {
75
+ startRow: number;
76
+ startCol: number;
77
+ endRow: number;
78
+ endCol: number;
79
+ }
80
+
81
+ export interface Selection {
82
+ ranges: Range[];
83
+ activeCell: { row: number; col: number };
84
+ }
85
+
86
+ export interface SortOrder {
87
+ column: number;
88
+ direction: 'asc' | 'desc';
89
+ }
90
+
91
+ export interface ColumnFilter {
92
+ column: number;
93
+ type: 'text' | 'number' | 'date';
94
+ criteria: FilterCriteria;
95
+ }
96
+
97
+ export type FilterCriteria =
98
+ | { type: 'equals'; value: string | number }
99
+ | { type: 'notEquals'; value: string | number }
100
+ | { type: 'contains'; value: string }
101
+ | { type: 'notContains'; value: string }
102
+ | { type: 'startsWith'; value: string }
103
+ | { type: 'endsWith'; value: string }
104
+ | { type: 'greaterThan'; value: number }
105
+ | { type: 'lessThan'; value: number }
106
+ | { type: 'greaterThanOrEqual'; value: number }
107
+ | { type: 'lessThanOrEqual'; value: number }
108
+ | { type: 'between'; min: number; max: number }
109
+ | { type: 'custom'; values: Set<string | number> }; // For multi-select
110
+
111
+ export interface SheetConfig {
112
+ defaultRowHeight?: number;
113
+ defaultColWidth?: number;
114
+ rowHeights?: Map<number, number>;
115
+ colWidths?: Map<number, number>;
116
+ hiddenRows?: Set<number>;
117
+ hiddenCols?: Set<number>;
118
+ frozenRows?: number;
119
+ frozenCols?: number;
120
+ showGridLines?: boolean;
121
+ sortOrder?: SortOrder[]; // Multi-column sort order
122
+ filters?: Map<number, ColumnFilter>; // column -> filter
123
+ }
124
+
125
+ export interface Sheet {
126
+ id: string;
127
+ name: string;
128
+ cells: Map<string, Cell>; // key: "r:c"
129
+ config: SheetConfig;
130
+ rowCount: number;
131
+ colCount: number;
132
+
133
+ getCell(row: number, col: number): Cell | undefined;
134
+ setCell(row: number, col: number, cell: Partial<Cell>): void;
135
+ deleteCell(row: number, col: number): void;
136
+ getCellValue(row: number, col: number): unknown;
137
+ setCellValue(row: number, col: number, value: unknown): void;
138
+ getRange(range: Range): Map<string, Cell>;
139
+ setRange(range: Range, cells: Map<string, Cell> | Cell[][]): void;
140
+ clearRange(range: Range): void;
141
+ getRowHeight(row: number): number;
142
+ setRowHeight(row: number, height: number): void;
143
+ getColWidth(col: number): number;
144
+ setColWidth(col: number, width: number): void;
145
+ insertRows(startRow: number, count: number): void;
146
+ deleteRows(startRow: number, count: number): void;
147
+ insertCols(startCol: number, count: number): void;
148
+ deleteCols(startCol: number, count: number): void;
149
+ isRowHidden(row: number): boolean;
150
+ hideRow(row: number): void;
151
+ showRow(row: number): void;
152
+ isColHidden(col: number): boolean;
153
+ hideCol(col: number): void;
154
+ showCol(col: number): void;
155
+ getHiddenColsAdjacent(col: number): { before: number[]; after: number[] };
156
+ getHiddenRowsAdjacent(row: number): { above: number[]; below: number[] };
157
+ showColsInRange(startCol: number, endCol: number): void;
158
+ showRowsInRange(startRow: number, endRow: number): void;
159
+ getFrozenRows(): number;
160
+ setFrozenRows(count: number): void;
161
+ getFrozenCols(): number;
162
+ setFrozenCols(count: number): void;
163
+ setFreeze(rows: number, cols: number): void;
164
+ clearFreeze(): void;
165
+ hasFrozenPanes(): boolean;
166
+ setSortOrder(sortOrder: SortOrder[]): void;
167
+ getSortOrder(): SortOrder[];
168
+ clearSort(): void;
169
+ hasSort(): boolean;
170
+ setFilter(column: number, filter: ColumnFilter): void;
171
+ clearFilter(column: number): void;
172
+ getFilters(): Map<number, ColumnFilter>;
173
+ hasFilter(column: number): boolean;
174
+ clearAllFilters(): void;
175
+
176
+ }
177
+
178
+ export interface Workbook {
179
+ id: string;
180
+ name: string;
181
+ sheets: Map<string, Sheet>;
182
+ activeSheetId: string;
183
+ defaultRowHeight: number;
184
+ defaultColWidth: number;
185
+
186
+ // Undo/Redo
187
+ recordHistory(): void;
188
+ undo(): boolean;
189
+ redo(): boolean;
190
+ canUndo(): boolean;
191
+ canRedo(): boolean;
192
+
193
+ // Sorting
194
+ setSortOrder(sortOrder: SortOrder[], sheetId?: string): void;
195
+ getSortOrder(sheetId?: string): SortOrder[];
196
+ clearSort(sheetId?: string): void;
197
+ sortSheet(sheetId?: string): void;
198
+
199
+ // Filtering
200
+ setFilter(column: number, filter: ColumnFilter, sheetId?: string): void;
201
+ clearFilter(column: number, sheetId?: string): void;
202
+ getFilters(sheetId?: string): Map<number, ColumnFilter>;
203
+ clearAllFilters(sheetId?: string): void;
204
+
205
+ // Data serialization/deserialization
206
+ getData(): WorkbookData;
207
+ setData(data: WorkbookData): void;
208
+ }
209
+
210
+ export interface StylePool {
211
+ styles: Map<string, CellStyle>;
212
+ getOrCreate(style: CellStyle): string;
213
+ get(styleId: string): CellStyle | undefined;
214
+ getAllStyles(): Map<string, CellStyle>;
215
+ }
216
+
217
+ export interface FormatPool {
218
+ getOrCreate(format: CellFormat): string;
219
+ get(formatId: string): CellFormat | undefined;
220
+ getAllFormats(): Map<string, CellFormat>;
221
+ }
222
+
223
+ // Workbook data serialization interfaces
224
+ export interface WorkbookData {
225
+ id: string;
226
+ name: string;
227
+ activeSheetId: string;
228
+ defaultRowHeight: number;
229
+ defaultColWidth: number;
230
+ stylePool: Record<string, CellStyle>; // styleId -> style object
231
+ formatPool?: Record<string, CellFormat>; // formatId -> format object (optional for backward compatibility)
232
+ sheets: SheetData[];
233
+ selection?: Selection; // Optional UI state
234
+ }
235
+
236
+ export interface SheetData {
237
+ id: string;
238
+ name: string;
239
+ cells: Array<{ key: string; cell: Cell }>; // key format: "row:col"
240
+ config: {
241
+ defaultRowHeight?: number;
242
+ defaultColWidth?: number;
243
+ rowHeights?: Array<[number, number]>; // [row, height] pairs
244
+ colWidths?: Array<[number, number]>; // [col, width] pairs
245
+ hiddenRows?: number[];
246
+ hiddenCols?: number[];
247
+ frozenRows?: number;
248
+ frozenCols?: number;
249
+ showGridLines?: boolean;
250
+ sortOrder?: SortOrder[];
251
+ filters?: Array<[number, ColumnFilter]>; // [column, filter] pairs
252
+ };
253
+ rowCount: number;
254
+ colCount: number;
255
+ }
256
+
257
+ export interface FormulaNode {
258
+ cellKey: string;
259
+ formula: string;
260
+ dependencies: Set<string>; // cellKeys this formula depends on
261
+ dependents: Set<string>; // cellKeys that depend on this formula
262
+ cachedValue?: CellValue;
263
+ isDirty: boolean;
264
+ }
265
+
266
+ export interface FormulaGraph {
267
+ nodes: Map<string, FormulaNode>;
268
+ addFormula(cellKey: string, formula: string, dependencies: Set<string>): void;
269
+ removeFormula(cellKey: string): void;
270
+ getDependents(cellKey: string): Set<string>;
271
+ getDependencies(cellKey: string): Set<string>;
272
+ invalidate(cellKey: string): void;
273
+ getDirtyCells(): Set<string>;
274
+ }
275
+
276
+ export type EventType =
277
+ | 'cellChange'
278
+ | 'cellSelection'
279
+ | 'sheetChange'
280
+ | 'sheetAdd'
281
+ | 'sheetDelete'
282
+ | 'sheetRename'
283
+ | 'workbookChange';
284
+
285
+ export interface EventData {
286
+ type: EventType;
287
+ payload: unknown;
288
+ }
289
+
290
+ export type EventHandler = (data: EventData) => void;
291
+
@@ -0,0 +1,19 @@
1
+ // Utility functions for cell key management
2
+
3
+ export function getCellKey(row: number, col: number): string {
4
+ return `${row}:${col}`;
5
+ }
6
+
7
+ export function parseCellKey(key: string): { row: number; col: number } {
8
+ const [row, col] = key.split(':').map(Number);
9
+ return { row, col };
10
+ }
11
+
12
+ export function isValidCellKey(key: string): boolean {
13
+ const parts = key.split(':');
14
+ if (parts.length !== 2) return false;
15
+ const row = Number(parts[0]);
16
+ const col = Number(parts[1]);
17
+ return !isNaN(row) && !isNaN(col) && row >= 0 && col >= 0;
18
+ }
19
+