zubin-grid 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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 yotamos5699
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
Binary file
@@ -0,0 +1,20 @@
1
+ import type { Grid, GridPosition } from "./grid.js";
2
+ import type { GridHead } from "./head.js";
3
+ export type Subscriber = () => void;
4
+ type CellInitializer<TCell> = () => TCell | Promise<TCell>;
5
+ export type Updater<TValue> = TValue | ((currentValue: TValue) => TValue);
6
+ export interface Cell<TCell> {
7
+ get: () => TCell;
8
+ set: (newValue: TCell) => void;
9
+ subscribe: (callback: Subscriber) => () => void;
10
+ _subscribers: () => number;
11
+ }
12
+ export declare function cell<TCell>(initialValue: TCell | CellInitializer<TCell>): Cell<TCell>;
13
+ export declare function useCell<TCell>(currentCell: Cell<TCell>): readonly [TCell, (newValue: TCell) => void];
14
+ export declare function useCell<TCell, TRowId extends string, TColumnId extends string, TRowHead extends GridHead<TRowId>, TColumnHead extends GridHead<TColumnId>>(currentGrid: Grid<TCell, TRowId, TColumnId, TRowHead, TColumnHead>, position: GridPosition<TColumnId, TRowId>): readonly [TCell, (newValue: TCell) => void];
15
+ export declare function useCell<TCell, TRowId extends string, TColumnId extends string, TRowHead extends GridHead<TRowId>, TColumnHead extends GridHead<TColumnId>>(currentGrid: Grid<TCell, TRowId, TColumnId, TRowHead, TColumnHead>, rowId: TRowId, columnId: TColumnId): readonly [TCell, (newValue: TCell) => void];
16
+ export declare function useCellValue<TCell>(currentCell: Cell<TCell>): TCell;
17
+ export declare function useCellValue<TCell, TRowId extends string, TColumnId extends string, TRowHead extends GridHead<TRowId>, TColumnHead extends GridHead<TColumnId>>(currentGrid: Grid<TCell, TRowId, TColumnId, TRowHead, TColumnHead>, position: GridPosition<TColumnId, TRowId>): TCell;
18
+ export declare function useCellValue<TCell, TRowId extends string, TColumnId extends string, TRowHead extends GridHead<TRowId>, TColumnHead extends GridHead<TColumnId>>(currentGrid: Grid<TCell, TRowId, TColumnId, TRowHead, TColumnHead>, rowId: TRowId, columnId: TColumnId): TCell;
19
+ export {};
20
+ //# sourceMappingURL=cell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell.d.ts","sourceRoot":"","sources":["../../core/cell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { useCallback, useSyncExternalStore } from "react";
2
+ export function cell(initialValue) {
3
+ let value = typeof initialValue === "function" ? null : initialValue;
4
+ const subscribers = new Set();
5
+ const notifySubscribers = () => {
6
+ subscribers.forEach((callback) => callback());
7
+ };
8
+ const initializeValue = async () => {
9
+ if (typeof initialValue !== "function")
10
+ return;
11
+ value = await initialValue();
12
+ notifySubscribers();
13
+ };
14
+ void initializeValue();
15
+ return {
16
+ get: () => value,
17
+ set: (newValue) => {
18
+ value = newValue;
19
+ notifySubscribers();
20
+ },
21
+ subscribe: (callback) => {
22
+ subscribers.add(callback);
23
+ return () => {
24
+ subscribers.delete(callback);
25
+ };
26
+ },
27
+ _subscribers: () => subscribers.size,
28
+ };
29
+ }
30
+ export function useCell(cellOrGrid, rowIdOrPosition, columnId) {
31
+ const { rowId: resolvedRowId, columnId: resolvedColumnId } = Array.isArray(rowIdOrPosition)
32
+ ? {
33
+ rowId: rowIdOrPosition[1],
34
+ columnId: rowIdOrPosition[0],
35
+ }
36
+ : {
37
+ rowId: rowIdOrPosition,
38
+ columnId,
39
+ };
40
+ const currentCell = resolveCell(cellOrGrid, resolvedRowId, resolvedColumnId);
41
+ const subscribe = useCallback((callback) => currentCell.subscribe(callback), [currentCell]);
42
+ const getSnapshot = useCallback(() => currentCell.get(), [currentCell]);
43
+ const setValue = isGrid(cellOrGrid) && resolvedRowId !== undefined && resolvedColumnId !== undefined
44
+ ? (newValue) => cellOrGrid.setValue(resolvedRowId, resolvedColumnId, newValue)
45
+ : currentCell.set;
46
+ return [useSyncExternalStore(subscribe, getSnapshot), setValue];
47
+ }
48
+ export function useCellValue(cellOrGrid, rowIdOrPosition, columnId) {
49
+ const { rowId: resolvedRowId, columnId: resolvedColumnId } = Array.isArray(rowIdOrPosition)
50
+ ? {
51
+ rowId: rowIdOrPosition[1],
52
+ columnId: rowIdOrPosition[0],
53
+ }
54
+ : {
55
+ rowId: rowIdOrPosition,
56
+ columnId,
57
+ };
58
+ const currentCell = resolveCell(cellOrGrid, resolvedRowId, resolvedColumnId);
59
+ const subscribe = useCallback((callback) => currentCell.subscribe(callback), [currentCell]);
60
+ const getSnapshot = useCallback(() => currentCell.get(), [currentCell]);
61
+ return useSyncExternalStore(subscribe, getSnapshot);
62
+ }
63
+ function resolveCell(cellOrGrid, rowId, columnId) {
64
+ if (!isGrid(cellOrGrid)) {
65
+ return cellOrGrid;
66
+ }
67
+ if (!rowId || !columnId) {
68
+ throw new Error("Grid cell hooks require both rowId and columnId.");
69
+ }
70
+ return cellOrGrid.getCell(rowId, columnId);
71
+ }
72
+ function isGrid(value) {
73
+ return "getCell" in value;
74
+ }
75
+ //# sourceMappingURL=cell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell.js","sourceRoot":"","sources":["../../core/cell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { Cell, Subscriber, Updater } from "./cell.js";
2
+ import type { GridHead, GridHeadId, GridHeadInput, ResolvedGridHead } from "./head.js";
3
+ import type { GridAxisCell, GridAxisTailUpdater, GridTailState } from "./tail.js";
4
+ export interface GridOptions<TRowHeadInput extends GridHeadInput, TColumnHeadInput extends GridHeadInput> {
5
+ rowHeaders: readonly TRowHeadInput[];
6
+ colHeaders: readonly TColumnHeadInput[];
7
+ }
8
+ export type GridPosition<TColumnId extends string = string, TRowId extends string = string> = readonly [columnId: TColumnId, rowId: TRowId];
9
+ export type GridRows<TColumnId extends string = string, TRowId extends string = string> = readonly (readonly GridPosition<TColumnId, TRowId>[])[];
10
+ type GridRecord = Record<string, unknown>;
11
+ export type GridCollectionInput<THead extends GridRecord, THeadIdKey extends keyof THead & string, TCell extends GridRecord, TCellKey extends keyof TCell & string> = readonly [heads: readonly THead[], headIdKey: THeadIdKey, cellKey: TCellKey];
12
+ export interface GridCollectionOptions<TCell extends GridRecord, TRowHead extends GridRecord, TColumnHead extends GridRecord, TRowHeadIdKey extends keyof TRowHead & string, TColumnHeadIdKey extends keyof TColumnHead & string, TRowCellKey extends keyof TCell & string, TColumnCellKey extends keyof TCell & string> {
13
+ rowHeaders: GridCollectionInput<TRowHead, TRowHeadIdKey, TCell, TRowCellKey>;
14
+ colHeaders: GridCollectionInput<TColumnHead, TColumnHeadIdKey, TCell, TColumnCellKey>;
15
+ }
16
+ export interface Grid<TCell, TRowId extends string = string, TColumnId extends string = string, TRowHead extends GridHead<TRowId> = GridHead<TRowId>, TColumnHead extends GridHead<TColumnId> = GridHead<TColumnId>> {
17
+ readonly rowHeaders: readonly TRowId[];
18
+ readonly colHeaders: readonly TColumnId[];
19
+ getCell: (rowId: TRowId, columnId: TColumnId) => Cell<TCell>;
20
+ getValue: (rowId: TRowId, columnId: TColumnId) => TCell;
21
+ setValue: (rowId: TRowId, columnId: TColumnId, newValue: TCell) => void;
22
+ hasCell: (rowId: TRowId, columnId: TColumnId) => boolean;
23
+ getRowHead: (rowId: TRowId) => TRowHead;
24
+ getColumnHead: (columnId: TColumnId) => TColumnHead;
25
+ updateRowHead: (rowId: TRowId, nextRowHead: Updater<TRowHead>) => void;
26
+ updateColumnHead: (columnId: TColumnId, nextColumnHead: Updater<TColumnHead>) => void;
27
+ subscribeRowHead: (rowId: TRowId, callback: Subscriber) => () => void;
28
+ subscribeColumnHead: (columnId: TColumnId, callback: Subscriber) => () => void;
29
+ getRowCells: (rowId: TRowId) => readonly GridAxisCell<TCell, TRowId, TColumnId>[];
30
+ getColumnCells: (columnId: TColumnId) => readonly GridAxisCell<TCell, TRowId, TColumnId>[];
31
+ getRowTailState: <TTail>(rowId: TRowId) => GridTailState<TTail>;
32
+ getColumnTailState: <TTail>(columnId: TColumnId) => GridTailState<TTail>;
33
+ getRowTail: <TTail>(rowId: TRowId) => TTail | null;
34
+ getColumnTail: <TTail>(columnId: TColumnId) => TTail | null;
35
+ updateRowTail: (rowId: TRowId, nextRowTail: Updater<unknown | null>) => void;
36
+ updateColumnTail: (columnId: TColumnId, nextColumnTail: Updater<unknown | null>) => void;
37
+ subscribeRowTail: (rowId: TRowId, callback: Subscriber) => () => void;
38
+ subscribeColumnTail: (columnId: TColumnId, callback: Subscriber) => () => void;
39
+ registerRowTail: <TTail>(rowId: TRowId, onRowUpdate: GridAxisTailUpdater<TCell, TRowId, TColumnId, TTail>) => () => void;
40
+ registerColumnTail: <TTail>(columnId: TColumnId, onColumnUpdate: GridAxisTailUpdater<TCell, TRowId, TColumnId, TTail>) => () => void;
41
+ recomputeRowTail: (rowId: TRowId) => void;
42
+ recomputeColumnTail: (columnId: TColumnId) => void;
43
+ }
44
+ export interface GridAxisIds<TRowId extends string, TColumnId extends string> {
45
+ rows: readonly TRowId[];
46
+ cols: readonly TColumnId[];
47
+ reorderRow: (activeRowId: TRowId | string, overRowId: TRowId | string) => boolean;
48
+ reorderColumn: (activeColumnId: TColumnId | string, overColumnId: TColumnId | string) => boolean;
49
+ }
50
+ export declare function grid<TCell, TRowHeadInput extends GridHeadInput, TColumnHeadInput extends GridHeadInput>(cells: Cell<TCell>[][], { colHeaders, rowHeaders }: GridOptions<TRowHeadInput, TColumnHeadInput>): Grid<TCell, GridHeadId<TRowHeadInput>, GridHeadId<TColumnHeadInput>, ResolvedGridHead<TRowHeadInput>, ResolvedGridHead<TColumnHeadInput>>;
51
+ export declare function grid<TCell extends GridRecord, TRowHead extends GridRecord, TColumnHead extends GridRecord, TRowHeadIdKey extends keyof TRowHead & string, TColumnHeadIdKey extends keyof TColumnHead & string, TRowCellKey extends keyof TCell & string, TColumnCellKey extends keyof TCell & string>(cells: readonly (TCell & Record<TRowCellKey, Extract<TRowHead[TRowHeadIdKey], string>> & Record<TColumnCellKey, Extract<TColumnHead[TColumnHeadIdKey], string>>)[], { rowHeaders, colHeaders, }: GridCollectionOptions<TCell, TRowHead, TColumnHead, TRowHeadIdKey, TColumnHeadIdKey, TRowCellKey, TColumnCellKey>): Grid<TCell & Record<TRowCellKey, Extract<TRowHead[TRowHeadIdKey], string>> & Record<TColumnCellKey, Extract<TColumnHead[TColumnHeadIdKey], string>>, Extract<TRowHead[TRowHeadIdKey], string>, Extract<TColumnHead[TColumnHeadIdKey], string>, TRowHead & GridHead<Extract<TRowHead[TRowHeadIdKey], string>>, TColumnHead & GridHead<Extract<TColumnHead[TColumnHeadIdKey], string>>>;
52
+ export declare function createGridKey(rowId: string, columnId: string): string;
53
+ export declare function useGrid<TCell, TRowId extends string, TColumnId extends string, TRowHead extends GridHead<TRowId>, TColumnHead extends GridHead<TColumnId>>(currentGrid: Grid<TCell, TRowId, TColumnId, TRowHead, TColumnHead>): GridAxisIds<TRowId, TColumnId>;
54
+ export {};
55
+ //# sourceMappingURL=grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../core/grid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,308 @@
1
+ import { cell } from "./cell.js";
2
+ import { assertHeadId, createHeadCellMap, createHeadOrderIndex, getHeadCell, getOrderedHeads, normalizeGridHeads, } from "./head.js";
3
+ import { createTailCellMap, getTailCell, setTailCellResult } from "./tail.js";
4
+ export function grid(cells, options) {
5
+ if (isCollectionGridOptions(options)) {
6
+ const [rowSource, rowHeadIdKey, rowCellKey] = options.rowHeaders;
7
+ const [columnSource, columnHeadIdKey, columnCellKey] = options.colHeaders;
8
+ const normalizedRowHeads = normalizeCollectionHeads(rowSource, rowHeadIdKey);
9
+ const normalizedColumnHeads = normalizeCollectionHeads(columnSource, columnHeadIdKey);
10
+ return createGridStore(createGridCellsFromRecords(cells, normalizedRowHeads, normalizedColumnHeads, rowCellKey, columnCellKey), normalizedRowHeads, normalizedColumnHeads);
11
+ }
12
+ const { colHeaders, rowHeaders } = options;
13
+ return createGridStore(cells, normalizeGridHeads(rowHeaders), normalizeGridHeads(colHeaders));
14
+ }
15
+ function createGridStore(cells, normalizedRowHeads, normalizedColumnHeads) {
16
+ if (cells.length !== normalizedRowHeads.length) {
17
+ throw new Error(`Grid row count mismatch: received ${cells.length} rows for ${normalizedRowHeads.length} row headers.`);
18
+ }
19
+ const rowHeadOrder = createHeadOrderIndex(normalizedRowHeads);
20
+ const columnHeadOrder = createHeadOrderIndex(normalizedColumnHeads);
21
+ const rowHeadCells = createHeadCellMap(normalizedRowHeads);
22
+ const columnHeadCells = createHeadCellMap(normalizedColumnHeads);
23
+ const rowTailCells = createTailCellMap(normalizedRowHeads);
24
+ const columnTailCells = createTailCellMap(normalizedColumnHeads);
25
+ const rowTailUpdaters = new Map();
26
+ const columnTailUpdaters = new Map();
27
+ const cellsMap = new Map();
28
+ const getOrderedRowHeads = () => getOrderedHeads(rowHeadCells, rowHeadOrder);
29
+ const getOrderedColumnHeads = () => getOrderedHeads(columnHeadCells, columnHeadOrder);
30
+ const getCell = (rowId, columnId) => {
31
+ const currentCell = cellsMap.get(createGridKey(rowId, columnId));
32
+ if (!currentCell) {
33
+ throw new Error(`Missing cell for row "${rowId}" and column "${columnId}".`);
34
+ }
35
+ return currentCell;
36
+ };
37
+ const createAxisCellSnapshot = (rowId, columnId) => {
38
+ const currentCell = getCell(rowId, columnId);
39
+ return {
40
+ id: createGridKey(rowId, columnId),
41
+ rowId,
42
+ columnId,
43
+ value: currentCell.get(),
44
+ cell: currentCell,
45
+ };
46
+ };
47
+ const getRowCells = (rowId) => getOrderedColumnHeads().map((columnHead) => createAxisCellSnapshot(rowId, columnHead.id));
48
+ const getColumnCells = (columnId) => getOrderedRowHeads().map((rowHead) => createAxisCellSnapshot(rowHead.id, columnId));
49
+ const recomputeRowTail = (rowId) => {
50
+ const onRowUpdate = rowTailUpdaters.get(rowId);
51
+ if (!onRowUpdate)
52
+ return;
53
+ setTailCellResult(getTailCell(rowTailCells, rowId, "row"), onRowUpdate(getRowCells(rowId)));
54
+ };
55
+ const recomputeColumnTail = (columnId) => {
56
+ const onColumnUpdate = columnTailUpdaters.get(columnId);
57
+ if (!onColumnUpdate)
58
+ return;
59
+ setTailCellResult(getTailCell(columnTailCells, columnId, "column"), onColumnUpdate(getColumnCells(columnId)));
60
+ };
61
+ const recomputeAllRowTails = () => {
62
+ getOrderedRowHeads().forEach((rowHead) => {
63
+ recomputeRowTail(rowHead.id);
64
+ });
65
+ };
66
+ const recomputeAllColumnTails = () => {
67
+ getOrderedColumnHeads().forEach((columnHead) => {
68
+ recomputeColumnTail(columnHead.id);
69
+ });
70
+ };
71
+ cells.forEach((row, rowIndex) => {
72
+ const rowId = normalizedRowHeads[rowIndex].id;
73
+ if (row.length !== normalizedColumnHeads.length) {
74
+ throw new Error(`Grid column count mismatch on row ${rowIndex}: received ${row.length} cells for ${normalizedColumnHeads.length} column headers.`);
75
+ }
76
+ row.forEach((currentCell, columnIndex) => {
77
+ const columnId = normalizedColumnHeads[columnIndex].id;
78
+ cellsMap.set(createGridKey(rowId, columnId), currentCell);
79
+ currentCell.subscribe(() => {
80
+ recomputeRowTail(rowId);
81
+ recomputeColumnTail(columnId);
82
+ });
83
+ });
84
+ });
85
+ const getRowHead = (rowId) => getHeadCell(rowHeadCells, rowId, "row").get();
86
+ const getColumnHead = (columnId) => getHeadCell(columnHeadCells, columnId, "column").get();
87
+ const updateRowHead = (rowId, nextRowHead) => {
88
+ const currentHeadCell = getHeadCell(rowHeadCells, rowId, "row");
89
+ const currentHead = currentHeadCell.get();
90
+ const resolvedHead = resolveUpdater(nextRowHead, currentHead);
91
+ assertHeadId("row", rowId, resolvedHead.id);
92
+ currentHeadCell.set(resolvedHead);
93
+ if (currentHead.order !== resolvedHead.order) {
94
+ recomputeAllColumnTails();
95
+ }
96
+ };
97
+ const updateColumnHead = (columnId, nextColumnHead) => {
98
+ const currentHeadCell = getHeadCell(columnHeadCells, columnId, "column");
99
+ const currentHead = currentHeadCell.get();
100
+ const resolvedHead = resolveUpdater(nextColumnHead, currentHead);
101
+ assertHeadId("column", columnId, resolvedHead.id);
102
+ currentHeadCell.set(resolvedHead);
103
+ if (currentHead.order !== resolvedHead.order) {
104
+ recomputeAllRowTails();
105
+ }
106
+ };
107
+ function getRowTail(rowId) {
108
+ const tailState = getTailCell(rowTailCells, rowId, "row").get();
109
+ return tailState.isReactive ? tailState.value : null;
110
+ }
111
+ function getColumnTail(columnId) {
112
+ const tailState = getTailCell(columnTailCells, columnId, "column").get();
113
+ return tailState.isReactive ? tailState.value : null;
114
+ }
115
+ function getRowTailState(rowId) {
116
+ return getTailCell(rowTailCells, rowId, "row").get();
117
+ }
118
+ function getColumnTailState(columnId) {
119
+ return getTailCell(columnTailCells, columnId, "column").get();
120
+ }
121
+ const updateRowTail = (rowId, nextRowTail) => {
122
+ const currentTailCell = getTailCell(rowTailCells, rowId, "row");
123
+ const currentTailState = currentTailCell.get();
124
+ const currentTailValue = currentTailState.isReactive ? currentTailState.value : null;
125
+ setTailCellResult(currentTailCell, resolveUpdater(nextRowTail, currentTailValue));
126
+ };
127
+ const updateColumnTail = (columnId, nextColumnTail) => {
128
+ const currentTailCell = getTailCell(columnTailCells, columnId, "column");
129
+ const currentTailState = currentTailCell.get();
130
+ const currentTailValue = currentTailState.isReactive ? currentTailState.value : null;
131
+ setTailCellResult(currentTailCell, resolveUpdater(nextColumnTail, currentTailValue));
132
+ };
133
+ function registerRowTail(rowId, onRowUpdate) {
134
+ rowTailUpdaters.set(rowId, onRowUpdate);
135
+ recomputeRowTail(rowId);
136
+ return () => {
137
+ if (rowTailUpdaters.get(rowId) === onRowUpdate) {
138
+ rowTailUpdaters.delete(rowId);
139
+ }
140
+ };
141
+ }
142
+ function registerColumnTail(columnId, onColumnUpdate) {
143
+ columnTailUpdaters.set(columnId, onColumnUpdate);
144
+ recomputeColumnTail(columnId);
145
+ return () => {
146
+ if (columnTailUpdaters.get(columnId) === onColumnUpdate) {
147
+ columnTailUpdaters.delete(columnId);
148
+ }
149
+ };
150
+ }
151
+ return {
152
+ get rowHeaders() {
153
+ return getOrderedRowHeads().map((rowHead) => rowHead.id);
154
+ },
155
+ get colHeaders() {
156
+ return getOrderedColumnHeads().map((columnHead) => columnHead.id);
157
+ },
158
+ getCell,
159
+ getValue: (rowId, columnId) => getCell(rowId, columnId).get(),
160
+ setValue: (rowId, columnId, newValue) => {
161
+ getCell(rowId, columnId).set(newValue);
162
+ },
163
+ hasCell: (rowId, columnId) => cellsMap.has(createGridKey(rowId, columnId)),
164
+ getRowHead,
165
+ getColumnHead,
166
+ updateRowHead,
167
+ updateColumnHead,
168
+ subscribeRowHead: (rowId, callback) => getHeadCell(rowHeadCells, rowId, "row").subscribe(callback),
169
+ subscribeColumnHead: (columnId, callback) => getHeadCell(columnHeadCells, columnId, "column").subscribe(callback),
170
+ getRowCells,
171
+ getColumnCells,
172
+ getRowTailState,
173
+ getColumnTailState,
174
+ getRowTail,
175
+ getColumnTail,
176
+ updateRowTail,
177
+ updateColumnTail,
178
+ subscribeRowTail: (rowId, callback) => getTailCell(rowTailCells, rowId, "row").subscribe(callback),
179
+ subscribeColumnTail: (columnId, callback) => getTailCell(columnTailCells, columnId, "column").subscribe(callback),
180
+ registerRowTail,
181
+ registerColumnTail,
182
+ recomputeRowTail,
183
+ recomputeColumnTail,
184
+ };
185
+ }
186
+ function resolveUpdater(nextValue, currentValue) {
187
+ return typeof nextValue === "function"
188
+ ? nextValue(currentValue)
189
+ : nextValue;
190
+ }
191
+ export function createGridKey(rowId, columnId) {
192
+ return `${rowId}:${columnId}`;
193
+ }
194
+ export function useGrid(currentGrid) {
195
+ return {
196
+ rows: currentGrid.rowHeaders,
197
+ cols: currentGrid.colHeaders,
198
+ reorderRow: (activeRowId, overRowId) => {
199
+ const nextOrderedRowIds = reorderAxisIds(currentGrid.rowHeaders, activeRowId, overRowId);
200
+ if (nextOrderedRowIds === currentGrid.rowHeaders) {
201
+ return false;
202
+ }
203
+ nextOrderedRowIds.forEach((rowId, index) => {
204
+ currentGrid.updateRowHead(rowId, (currentHead) => {
205
+ return currentHead.order === index
206
+ ? currentHead
207
+ : {
208
+ ...currentHead,
209
+ order: index,
210
+ };
211
+ });
212
+ });
213
+ return true;
214
+ },
215
+ reorderColumn: (activeColumnId, overColumnId) => {
216
+ const nextOrderedColumnIds = reorderAxisIds(currentGrid.colHeaders, activeColumnId, overColumnId);
217
+ if (nextOrderedColumnIds === currentGrid.colHeaders) {
218
+ return false;
219
+ }
220
+ nextOrderedColumnIds.forEach((columnId, index) => {
221
+ currentGrid.updateColumnHead(columnId, (currentHead) => {
222
+ return currentHead.order === index
223
+ ? currentHead
224
+ : {
225
+ ...currentHead,
226
+ order: index,
227
+ };
228
+ });
229
+ });
230
+ return true;
231
+ },
232
+ };
233
+ }
234
+ function isCollectionGridOptions(value) {
235
+ if (!value || typeof value !== "object") {
236
+ return false;
237
+ }
238
+ const rowHeaders = "rowHeaders" in value ? value.rowHeaders : null;
239
+ const colHeaders = "colHeaders" in value ? value.colHeaders : null;
240
+ return isCollectionInput(rowHeaders) && isCollectionInput(colHeaders);
241
+ }
242
+ function isCollectionInput(value) {
243
+ return (Array.isArray(value) &&
244
+ value.length === 3 &&
245
+ Array.isArray(value[0]) &&
246
+ typeof value[1] === "string" &&
247
+ typeof value[2] === "string");
248
+ }
249
+ function normalizeCollectionHeads(heads, idKey) {
250
+ return heads.map((head, index) => {
251
+ const id = head[idKey];
252
+ if (typeof id !== "string") {
253
+ throw new Error(`Grid header key "${String(idKey)}" must resolve to a string id.`);
254
+ }
255
+ return {
256
+ ...head,
257
+ id,
258
+ label: readGridHeadLabel(head, id),
259
+ order: typeof head.order === "number" ? head.order : index,
260
+ };
261
+ });
262
+ }
263
+ function createGridCellsFromRecords(cells, rowHeads, columnHeads, rowCellKey, columnCellKey) {
264
+ const cellsMap = new Map();
265
+ cells.forEach((currentCell) => {
266
+ const rowId = currentCell[rowCellKey];
267
+ const columnId = currentCell[columnCellKey];
268
+ if (typeof rowId !== "string" || typeof columnId !== "string") {
269
+ throw new Error(`Grid cell keys "${String(rowCellKey)}" and "${String(columnCellKey)}" must resolve to string ids.`);
270
+ }
271
+ const gridKey = createGridKey(rowId, columnId);
272
+ if (cellsMap.has(gridKey)) {
273
+ throw new Error(`Duplicate cell for row "${rowId}" and column "${columnId}".`);
274
+ }
275
+ cellsMap.set(gridKey, currentCell);
276
+ });
277
+ return rowHeads.map((rowHead) => columnHeads.map((columnHead) => {
278
+ const currentCell = cellsMap.get(createGridKey(rowHead.id, columnHead.id));
279
+ if (!currentCell) {
280
+ throw new Error(`Missing cell for row "${rowHead.id}" and column "${columnHead.id}".`);
281
+ }
282
+ return cell(currentCell);
283
+ }));
284
+ }
285
+ function readGridHeadLabel(head, id) {
286
+ const label = head.label;
287
+ if (typeof label === "string") {
288
+ return label;
289
+ }
290
+ const name = head.name;
291
+ if (typeof name === "string") {
292
+ return name;
293
+ }
294
+ return id;
295
+ }
296
+ function reorderAxisIds(items, activeId, overId) {
297
+ const fromIndex = items.findIndex((item) => item === activeId);
298
+ const toIndex = items.findIndex((item) => item === overId);
299
+ if (fromIndex === -1 || toIndex === -1 || fromIndex === toIndex) {
300
+ return items;
301
+ }
302
+ const nextItems = items.slice();
303
+ const movedItem = nextItems[fromIndex];
304
+ nextItems.splice(fromIndex, 1);
305
+ nextItems.splice(toIndex, 0, movedItem);
306
+ return nextItems;
307
+ }
308
+ //# sourceMappingURL=grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.js","sourceRoot":"","sources":["../../core/grid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { Cell, Updater } from "./cell.js";
2
+ import type { Grid, GridPosition } from "./grid.js";
3
+ export interface GridHead<TId extends string = string> {
4
+ id: TId;
5
+ label: string;
6
+ order: number;
7
+ }
8
+ export type GridHeadObject<TId extends string = string> = {
9
+ id: TId;
10
+ label: string;
11
+ order?: number;
12
+ };
13
+ export type GridHeadInput<TId extends string = string> = TId | GridHeadObject<TId>;
14
+ export type GridHeadId<THeadInput extends GridHeadInput> = THeadInput extends string ? THeadInput : THeadInput extends GridHeadObject<infer TId> ? TId : never;
15
+ export type NormalizedGridHead<THeadInput extends GridHeadInput> = THeadInput extends string ? GridHead<THeadInput> : THeadInput extends GridHeadObject<infer TId> ? Omit<THeadInput, "order"> & GridHead<TId> : never;
16
+ export type ResolvedGridHead<THeadInput extends GridHeadInput> = NormalizedGridHead<THeadInput> & GridHead<GridHeadId<THeadInput>>;
17
+ export interface GridHeadHookResult<THead extends GridHead<string>> {
18
+ head: THead;
19
+ setHead: (nextHead: Updater<THead>) => void;
20
+ updateLabel: (label: string) => void;
21
+ updateOrder: (order: number) => void;
22
+ }
23
+ export declare function useRowHead<TCell, TRowId extends string, TColumnId extends string, TRowHead extends GridHead<TRowId>, TColumnHead extends GridHead<TColumnId>>(currentGrid: Grid<TCell, TRowId, TColumnId, TRowHead, TColumnHead>, position: GridPosition<TColumnId, TRowId>): GridHeadHookResult<TRowHead>;
24
+ export declare function useRowHead<TCell, TRowId extends string, TColumnId extends string, TRowHead extends GridHead<TRowId>, TColumnHead extends GridHead<TColumnId>>(currentGrid: Grid<TCell, TRowId, TColumnId, TRowHead, TColumnHead>, rowId: TRowId): GridHeadHookResult<TRowHead>;
25
+ export declare function useColumnHead<TCell, TRowId extends string, TColumnId extends string, TRowHead extends GridHead<TRowId>, TColumnHead extends GridHead<TColumnId>>(currentGrid: Grid<TCell, TRowId, TColumnId, TRowHead, TColumnHead>, position: GridPosition<TColumnId, TRowId>): GridHeadHookResult<TColumnHead>;
26
+ export declare function useColumnHead<TCell, TRowId extends string, TColumnId extends string, TRowHead extends GridHead<TRowId>, TColumnHead extends GridHead<TColumnId>>(currentGrid: Grid<TCell, TRowId, TColumnId, TRowHead, TColumnHead>, columnId: TColumnId): GridHeadHookResult<TColumnHead>;
27
+ export declare const useColHead: typeof useColumnHead;
28
+ export declare function normalizeGridHeads<THeadInput extends GridHeadInput>(heads: readonly THeadInput[]): readonly ResolvedGridHead<THeadInput>[];
29
+ export declare function createHeadCellMap<TId extends string, THead extends GridHead<TId>>(heads: readonly THead[]): Map<TId, Cell<THead>>;
30
+ export declare function createHeadOrderIndex<TId extends string, THead extends GridHead<TId>>(heads: readonly THead[]): Map<TId, number>;
31
+ export declare function getOrderedHeads<TId extends string, THead extends GridHead<TId>>(headCells: Map<TId, Cell<THead>>, fallbackOrder: Map<TId, number>): THead[];
32
+ export declare function getHeadCell<TId extends string, THead extends GridHead<TId>>(headCells: Map<TId, Cell<THead>>, id: TId, axis: "row" | "column"): Cell<THead>;
33
+ export declare function assertHeadId(axis: "row" | "column", expectedId: string, nextId: string): void;
34
+ //# sourceMappingURL=head.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../../core/head.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ import { useCallback, useSyncExternalStore } from "react";
2
+ import { cell } from "./cell.js";
3
+ export function useRowHead(currentGrid, rowIdOrPosition) {
4
+ const resolvedRowId = Array.isArray(rowIdOrPosition)
5
+ ? rowIdOrPosition[1]
6
+ : rowIdOrPosition;
7
+ const subscribe = useCallback((callback) => currentGrid.subscribeRowHead(resolvedRowId, callback), [currentGrid, resolvedRowId]);
8
+ const getSnapshot = useCallback(() => currentGrid.getRowHead(resolvedRowId), [currentGrid, resolvedRowId]);
9
+ const head = useSyncExternalStore(subscribe, getSnapshot);
10
+ const setHead = useCallback((nextHead) => {
11
+ currentGrid.updateRowHead(resolvedRowId, nextHead);
12
+ }, [currentGrid, resolvedRowId]);
13
+ const updateLabel = useCallback((label) => {
14
+ currentGrid.updateRowHead(resolvedRowId, (currentHead) => ({
15
+ ...currentHead,
16
+ label,
17
+ }));
18
+ }, [currentGrid, resolvedRowId]);
19
+ const updateOrder = useCallback((order) => {
20
+ currentGrid.updateRowHead(resolvedRowId, (currentHead) => ({
21
+ ...currentHead,
22
+ order,
23
+ }));
24
+ }, [currentGrid, resolvedRowId]);
25
+ return {
26
+ head,
27
+ setHead,
28
+ updateLabel,
29
+ updateOrder,
30
+ };
31
+ }
32
+ export function useColumnHead(currentGrid, columnIdOrPosition) {
33
+ const resolvedColumnId = Array.isArray(columnIdOrPosition)
34
+ ? columnIdOrPosition[0]
35
+ : columnIdOrPosition;
36
+ const subscribe = useCallback((callback) => currentGrid.subscribeColumnHead(resolvedColumnId, callback), [currentGrid, resolvedColumnId]);
37
+ const getSnapshot = useCallback(() => currentGrid.getColumnHead(resolvedColumnId), [currentGrid, resolvedColumnId]);
38
+ const head = useSyncExternalStore(subscribe, getSnapshot);
39
+ const setHead = useCallback((nextHead) => {
40
+ currentGrid.updateColumnHead(resolvedColumnId, nextHead);
41
+ }, [currentGrid, resolvedColumnId]);
42
+ const updateLabel = useCallback((label) => {
43
+ currentGrid.updateColumnHead(resolvedColumnId, (currentHead) => ({
44
+ ...currentHead,
45
+ label,
46
+ }));
47
+ }, [currentGrid, resolvedColumnId]);
48
+ const updateOrder = useCallback((order) => {
49
+ currentGrid.updateColumnHead(resolvedColumnId, (currentHead) => ({
50
+ ...currentHead,
51
+ order,
52
+ }));
53
+ }, [currentGrid, resolvedColumnId]);
54
+ return {
55
+ head,
56
+ setHead,
57
+ updateLabel,
58
+ updateOrder,
59
+ };
60
+ }
61
+ export const useColHead = useColumnHead;
62
+ export function normalizeGridHeads(heads) {
63
+ return heads.map((head, index) => normalizeGridHead(head, index));
64
+ }
65
+ export function createHeadCellMap(heads) {
66
+ return new Map(heads.map((head) => [head.id, cell(head)]));
67
+ }
68
+ export function createHeadOrderIndex(heads) {
69
+ return new Map(heads.map((head, index) => [head.id, index]));
70
+ }
71
+ export function getOrderedHeads(headCells, fallbackOrder) {
72
+ return [...headCells.values()]
73
+ .map((headCell) => headCell.get())
74
+ .sort((leftHead, rightHead) => {
75
+ return (leftHead.order - rightHead.order ||
76
+ (fallbackOrder.get(leftHead.id) ?? 0) - (fallbackOrder.get(rightHead.id) ?? 0));
77
+ });
78
+ }
79
+ export function getHeadCell(headCells, id, axis) {
80
+ const currentHeadCell = headCells.get(id);
81
+ if (!currentHeadCell) {
82
+ throw new Error(`Missing ${axis} header "${id}".`);
83
+ }
84
+ return currentHeadCell;
85
+ }
86
+ export function assertHeadId(axis, expectedId, nextId) {
87
+ if (expectedId === nextId)
88
+ return;
89
+ throw new Error(`${axis === "row" ? "Row" : "Column"} header ids cannot change from "${expectedId}" to "${nextId}".`);
90
+ }
91
+ function normalizeGridHead(head, index) {
92
+ if (typeof head === "string") {
93
+ return {
94
+ id: head,
95
+ label: head,
96
+ order: index,
97
+ };
98
+ }
99
+ const objectHead = head;
100
+ return {
101
+ ...objectHead,
102
+ order: objectHead.order ?? index,
103
+ };
104
+ }
105
+ //# sourceMappingURL=head.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"head.js","sourceRoot":"","sources":["../../core/head.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { Cell } from "./cell.js";
2
+ import type { Grid, GridPosition } from "./grid.js";
3
+ import type { GridHead } from "./head.js";
4
+ export interface GridAxisCell<TCell, TRowId extends string, TColumnId extends string> {
5
+ id: string;
6
+ rowId: TRowId;
7
+ columnId: TColumnId;
8
+ value: TCell;
9
+ cell: Cell<TCell>;
10
+ }
11
+ export type GridAxisTailUpdater<TCell, TRowId extends string, TColumnId extends string, TTail> = (cells: readonly GridAxisCell<TCell, TRowId, TColumnId>[]) => TTail;
12
+ export interface GridTailState<TTail = unknown> {
13
+ isReactive: boolean;
14
+ value: TTail | null;
15
+ }
16
+ type GridTailHookValue<TTail> = [TTail] extends [void] ? void : TTail | undefined;
17
+ export declare function useRowTail<TCell, TRowId extends string, TColumnId extends string, TRowHead extends GridHead<TRowId>, TColumnHead extends GridHead<TColumnId>, TTail = void>(currentGrid: Grid<TCell, TRowId, TColumnId, TRowHead, TColumnHead>, position: GridPosition<TColumnId, TRowId>, onRowUpdate?: GridAxisTailUpdater<TCell, TRowId, TColumnId, TTail>): GridTailHookValue<TTail>;
18
+ export declare function useRowTail<TCell, TRowId extends string, TColumnId extends string, TRowHead extends GridHead<TRowId>, TColumnHead extends GridHead<TColumnId>, TTail = void>(currentGrid: Grid<TCell, TRowId, TColumnId, TRowHead, TColumnHead>, rowId: TRowId, onRowUpdate?: GridAxisTailUpdater<TCell, TRowId, TColumnId, TTail>): GridTailHookValue<TTail>;
19
+ export declare function useColumnTail<TCell, TRowId extends string, TColumnId extends string, TRowHead extends GridHead<TRowId>, TColumnHead extends GridHead<TColumnId>, TTail = void>(currentGrid: Grid<TCell, TRowId, TColumnId, TRowHead, TColumnHead>, position: GridPosition<TColumnId, TRowId>, onColumnUpdate?: GridAxisTailUpdater<TCell, TRowId, TColumnId, TTail>): GridTailHookValue<TTail>;
20
+ export declare function useColumnTail<TCell, TRowId extends string, TColumnId extends string, TRowHead extends GridHead<TRowId>, TColumnHead extends GridHead<TColumnId>, TTail = void>(currentGrid: Grid<TCell, TRowId, TColumnId, TRowHead, TColumnHead>, columnId: TColumnId, onColumnUpdate?: GridAxisTailUpdater<TCell, TRowId, TColumnId, TTail>): GridTailHookValue<TTail>;
21
+ export declare function createTailCellMap<TId extends string>(heads: readonly GridHead<TId>[]): Map<TId, Cell<GridTailState<unknown>>>;
22
+ export declare function getTailCell<TId extends string>(tailCells: Map<TId, Cell<GridTailState<unknown>>>, id: TId, axis: "row" | "column"): Cell<GridTailState<unknown>>;
23
+ export declare function setTailCellResult(tailCell: Cell<GridTailState<unknown>>, nextValue: unknown): void;
24
+ export declare function readReactiveTailValue<TTail>(tailState: GridTailState<TTail>): TTail | null | undefined;
25
+ export {};
26
+ //# sourceMappingURL=tail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tail.d.ts","sourceRoot":"","sources":["../../core/tail.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,WAAW,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,WAAW,YAAY,CAAC,KAAK,EAAE,MAAM,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM;IAClF,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;CACnB;AAED,MAAM,MAAM,mBAAmB,CAC7B,KAAK,EACL,MAAM,SAAS,MAAM,EACrB,SAAS,SAAS,MAAM,EACxB,KAAK,IACH,CAAC,KAAK,EAAE,SAAS,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC;AAExE,MAAM,WAAW,aAAa,CAAC,KAAK,GAAG,OAAO;IAC5C,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED,KAAK,iBAAiB,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,SAAS,CAAC;AAElF,wBAAgB,UAAU,CACxB,KAAK,EACL,MAAM,SAAS,MAAM,EACrB,SAAS,SAAS,MAAM,EACxB,QAAQ,SAAS,QAAQ,CAAC,MAAM,CAAC,EACjC,WAAW,SAAS,QAAQ,CAAC,SAAS,CAAC,EACvC,KAAK,GAAG,IAAI,EAEZ,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,EAClE,QAAQ,EAAE,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,EACzC,WAAW,CAAC,EAAE,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,GACjE,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAC5B,wBAAgB,UAAU,CACxB,KAAK,EACL,MAAM,SAAS,MAAM,EACrB,SAAS,SAAS,MAAM,EACxB,QAAQ,SAAS,QAAQ,CAAC,MAAM,CAAC,EACjC,WAAW,SAAS,QAAQ,CAAC,SAAS,CAAC,EACvC,KAAK,GAAG,IAAI,EAEZ,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,EAClE,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,GACjE,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAoC5B,wBAAgB,aAAa,CAC3B,KAAK,EACL,MAAM,SAAS,MAAM,EACrB,SAAS,SAAS,MAAM,EACxB,QAAQ,SAAS,QAAQ,CAAC,MAAM,CAAC,EACjC,WAAW,SAAS,QAAQ,CAAC,SAAS,CAAC,EACvC,KAAK,GAAG,IAAI,EAEZ,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,EAClE,QAAQ,EAAE,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,EACzC,cAAc,CAAC,EAAE,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,GACpE,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAC5B,wBAAgB,aAAa,CAC3B,KAAK,EACL,MAAM,SAAS,MAAM,EACrB,SAAS,SAAS,MAAM,EACxB,QAAQ,SAAS,QAAQ,CAAC,MAAM,CAAC,EACjC,WAAW,SAAS,QAAQ,CAAC,SAAS,CAAC,EACvC,KAAK,GAAG,IAAI,EAEZ,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,EAClE,QAAQ,EAAE,SAAS,EACnB,cAAc,CAAC,EAAE,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,GACpE,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAoC5B,wBAAgB,iBAAiB,CAAC,GAAG,SAAS,MAAM,EAAE,KAAK,EAAE,SAAS,QAAQ,CAAC,GAAG,CAAC,EAAE,0CAIpF;AAED,wBAAgB,WAAW,CAAC,GAAG,SAAS,MAAM,EAC5C,SAAS,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EACjD,EAAE,EAAE,GAAG,EACP,IAAI,EAAE,KAAK,GAAG,QAAQ,gCASvB;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,EACtC,SAAS,EAAE,OAAO,QAUnB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,EAAE,aAAa,CAAC,KAAK,CAAC,4BAE3E"}
@@ -0,0 +1,67 @@
1
+ import { useCallback, useEffect, useSyncExternalStore } from "react";
2
+ import { cell } from "./cell.js";
3
+ export function useRowTail(currentGrid, rowIdOrPosition, onRowUpdate) {
4
+ const resolvedRowId = Array.isArray(rowIdOrPosition)
5
+ ? rowIdOrPosition[1]
6
+ : rowIdOrPosition;
7
+ useEffect(() => {
8
+ if (!onRowUpdate)
9
+ return;
10
+ return currentGrid.registerRowTail(resolvedRowId, onRowUpdate);
11
+ }, [currentGrid, resolvedRowId, onRowUpdate]);
12
+ const subscribe = useCallback((callback) => currentGrid.subscribeRowTail(resolvedRowId, callback), [currentGrid, resolvedRowId]);
13
+ const getSnapshot = useCallback(() => readReactiveTailValue(currentGrid.getRowTailState(resolvedRowId)), [currentGrid, resolvedRowId]);
14
+ const tail = useSyncExternalStore(subscribe, getSnapshot);
15
+ return tail;
16
+ }
17
+ export function useColumnTail(currentGrid, columnIdOrPosition, onColumnUpdate) {
18
+ const resolvedColumnId = Array.isArray(columnIdOrPosition)
19
+ ? columnIdOrPosition[0]
20
+ : columnIdOrPosition;
21
+ useEffect(() => {
22
+ if (!onColumnUpdate)
23
+ return;
24
+ return currentGrid.registerColumnTail(resolvedColumnId, onColumnUpdate);
25
+ }, [currentGrid, resolvedColumnId, onColumnUpdate]);
26
+ const subscribe = useCallback((callback) => currentGrid.subscribeColumnTail(resolvedColumnId, callback), [currentGrid, resolvedColumnId]);
27
+ const getSnapshot = useCallback(() => readReactiveTailValue(currentGrid.getColumnTailState(resolvedColumnId)), [currentGrid, resolvedColumnId]);
28
+ const tail = useSyncExternalStore(subscribe, getSnapshot);
29
+ return tail;
30
+ }
31
+ export function createTailCellMap(heads) {
32
+ return new Map(heads.map((head) => [head.id, cell(createTailState())]));
33
+ }
34
+ export function getTailCell(tailCells, id, axis) {
35
+ const currentTailCell = tailCells.get(id);
36
+ if (!currentTailCell) {
37
+ throw new Error(`Missing ${axis} tail "${id}".`);
38
+ }
39
+ return currentTailCell;
40
+ }
41
+ export function setTailCellResult(tailCell, nextValue) {
42
+ const currentTailState = tailCell.get();
43
+ const nextTailState = createTailState(nextValue);
44
+ if (isSameTailState(currentTailState, nextTailState)) {
45
+ return;
46
+ }
47
+ tailCell.set(nextTailState);
48
+ }
49
+ export function readReactiveTailValue(tailState) {
50
+ return tailState.isReactive ? tailState.value : undefined;
51
+ }
52
+ function createTailState(value) {
53
+ return value === undefined
54
+ ? {
55
+ isReactive: false,
56
+ value: null,
57
+ }
58
+ : {
59
+ isReactive: true,
60
+ value,
61
+ };
62
+ }
63
+ function isSameTailState(leftTailState, rightTailState) {
64
+ return (leftTailState.isReactive === rightTailState.isReactive &&
65
+ Object.is(leftTailState.value, rightTailState.value));
66
+ }
67
+ //# sourceMappingURL=tail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tail.js","sourceRoot":"","sources":["../../core/tail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { cell, useCell, useCellValue } from "./core/cell.js";
2
+ export type { Cell, Subscriber, Updater } from "./core/cell.js";
3
+ export { createGridKey, grid, useGrid } from "./core/grid.js";
4
+ export type { Grid, GridAxisIds, GridCollectionInput, GridCollectionOptions, GridOptions, GridPosition, GridRows, } from "./core/grid.js";
5
+ export { assertHeadId, createHeadCellMap, createHeadOrderIndex, getHeadCell, getOrderedHeads, normalizeGridHeads, useColHead, useColumnHead, useRowHead, } from "./core/head.js";
6
+ export type { GridHead, GridHeadHookResult, GridHeadId, GridHeadInput, GridHeadObject, NormalizedGridHead, ResolvedGridHead, } from "./core/head.js";
7
+ export { createTailCellMap, getTailCell, readReactiveTailValue, setTailCellResult, useColumnTail, useRowTail, } from "./core/tail.js";
8
+ export type { GridAxisCell, GridAxisTailUpdater, GridTailState } from "./core/tail.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9D,YAAY,EACV,IAAI,EACJ,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EACrB,WAAW,EACX,YAAY,EACZ,QAAQ,GACT,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,QAAQ,EACR,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { cell, useCell, useCellValue } from "./core/cell.js";
2
+ export { createGridKey, grid, useGrid } from "./core/grid.js";
3
+ export { assertHeadId, createHeadCellMap, createHeadOrderIndex, getHeadCell, getOrderedHeads, normalizeGridHeads, useColHead, useColumnHead, useRowHead, } from "./core/head.js";
4
+ export { createTailCellMap, getTailCell, readReactiveTailValue, setTailCellResult, useColumnTail, useRowTail, } from "./core/tail.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG7D,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAW9D,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,UAAU,GACX,MAAM,gBAAgB,CAAC;AAWxB,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,UAAU,GACX,MAAM,gBAAgB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "zubin-grid",
3
+ "version": "0.1.0",
4
+ "description": "A lightweight grid state manager for React and TypeScript.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./cell": {
15
+ "types": "./dist/core/cell.d.ts",
16
+ "import": "./dist/core/cell.js"
17
+ },
18
+ "./grid": {
19
+ "types": "./dist/core/grid.d.ts",
20
+ "import": "./dist/core/grid.js"
21
+ },
22
+ "./head": {
23
+ "types": "./dist/core/head.d.ts",
24
+ "import": "./dist/core/head.js"
25
+ },
26
+ "./tail": {
27
+ "types": "./dist/core/tail.d.ts",
28
+ "import": "./dist/core/tail.js"
29
+ },
30
+ "./package.json": "./package.json"
31
+ },
32
+ "files": [
33
+ "dist",
34
+ "LICENSE",
35
+ "README.md"
36
+ ],
37
+ "sideEffects": false,
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "scripts": {
42
+ "build": "tsc -p tsconfig.json",
43
+ "check": "tsc -p tsconfig.json --noEmit",
44
+ "pack:check": "npm pack --dry-run",
45
+ "prepublishOnly": "npm run build"
46
+ },
47
+ "keywords": [
48
+ "grid",
49
+ "state-manager",
50
+ "react",
51
+ "typescript",
52
+ "hooks"
53
+ ],
54
+ "peerDependencies": {
55
+ "react": ">=18"
56
+ },
57
+ "devDependencies": {
58
+ "@types/react": "^18.3.12",
59
+ "react": "^18.3.1",
60
+ "typescript": "^5.8.3"
61
+ },
62
+ "license": "MIT",
63
+ "repository": {
64
+ "type": "git",
65
+ "url": "git+https://github.com/yotamos5699/zubin-grid.git"
66
+ },
67
+ "bugs": {
68
+ "url": "https://github.com/yotamos5699/zubin-grid/issues"
69
+ },
70
+ "homepage": "https://github.com/yotamos5699/zubin-grid#readme"
71
+ }