@dxos/react-ui-grid 0.8.3-staging.0fa589b → 0.8.4-main.03d5cd7b56
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/dist/lib/browser/index.mjs +145 -156
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/types/src/CellEditor/CellEditor.d.ts +4 -4
- package/dist/types/src/CellEditor/CellEditor.d.ts.map +1 -1
- package/dist/types/src/CellEditor/CellEditor.stories.d.ts +16 -0
- package/dist/types/src/CellEditor/CellEditor.stories.d.ts.map +1 -0
- package/dist/types/src/CellEditor/GridCellEditor.d.ts +3 -3
- package/dist/types/src/CellEditor/GridCellEditor.d.ts.map +1 -1
- package/dist/types/src/Grid/Grid.d.ts +10 -10
- package/dist/types/src/Grid/Grid.d.ts.map +1 -1
- package/dist/types/src/Grid/Grid.stories.d.ts +12 -4
- package/dist/types/src/Grid/Grid.stories.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +32 -28
- package/src/CellEditor/CellEditor.stories.tsx +88 -0
- package/src/CellEditor/CellEditor.tsx +31 -17
- package/src/CellEditor/GridCellEditor.tsx +8 -5
- package/src/Grid/Grid.stories.tsx +72 -36
- package/src/Grid/Grid.tsx +17 -14
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
//
|
|
1
|
+
// src/index.ts
|
|
2
2
|
import { defaultColSize, defaultRowSize } from "@dxos/lit-grid";
|
|
3
3
|
|
|
4
|
-
//
|
|
5
|
-
import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
|
|
6
|
-
import "@dxos/lit-grid/dx-grid.pcss";
|
|
4
|
+
// src/Grid/Grid.tsx
|
|
7
5
|
import { createComponent } from "@lit/react";
|
|
8
6
|
import { createContextScope } from "@radix-ui/react-context";
|
|
9
7
|
import { useControllableState } from "@radix-ui/react-use-controllable-state";
|
|
10
8
|
import React, { forwardRef, useCallback, useEffect, useState } from "react";
|
|
9
|
+
import "@dxos/lit-grid/dx-grid.pcss";
|
|
11
10
|
import { DxGrid as NaturalDxGrid } from "@dxos/lit-grid";
|
|
12
|
-
import { colToA1Notation, rowToA1Notation, closestCell, commentedClassName, toPlaneCellIndex, parseCellIndex, cellQuery } from "@dxos/lit-grid";
|
|
11
|
+
import { colToA1Notation, rowToA1Notation, closestCell, commentedClassName, toPlaneCellIndex, parseCellIndex, cellQuery, DxEditRequest } from "@dxos/lit-grid";
|
|
13
12
|
var DxGrid = createComponent({
|
|
14
13
|
tagName: "dx-grid",
|
|
15
14
|
elementClass: NaturalDxGrid,
|
|
@@ -29,95 +28,86 @@ var initialBox = {
|
|
|
29
28
|
var GRID_NAME = "Grid";
|
|
30
29
|
var [createGridContext, createGridScope] = createContextScope(GRID_NAME, []);
|
|
31
30
|
var [GridProvider, useGridContext] = createGridContext(GRID_NAME);
|
|
32
|
-
var GridRoot = ({ id, editing: propsEditing, defaultEditing, onEditingChange
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
}, children));
|
|
54
|
-
} finally {
|
|
55
|
-
_effect.f();
|
|
56
|
-
}
|
|
31
|
+
var GridRoot = ({ __gridScope, children, id, editing: propsEditing, defaultEditing, onEditingChange }) => {
|
|
32
|
+
const [editing = null, setEditing] = useControllableState({
|
|
33
|
+
prop: propsEditing,
|
|
34
|
+
defaultProp: defaultEditing,
|
|
35
|
+
onChange: onEditingChange
|
|
36
|
+
});
|
|
37
|
+
const [editBox, setEditBox] = useState(initialBox);
|
|
38
|
+
return /* @__PURE__ */ React.createElement(GridProvider, {
|
|
39
|
+
id,
|
|
40
|
+
editing,
|
|
41
|
+
setEditing,
|
|
42
|
+
editBox,
|
|
43
|
+
setEditBox,
|
|
44
|
+
scope: __gridScope
|
|
45
|
+
}, /* @__PURE__ */ React.createElement("div", {
|
|
46
|
+
className: "dx-grid-host",
|
|
47
|
+
style: {
|
|
48
|
+
display: "contents"
|
|
49
|
+
}
|
|
50
|
+
}, children));
|
|
57
51
|
};
|
|
58
52
|
GridRoot.displayName = GRID_NAME;
|
|
59
53
|
var GRID_CONTENT_NAME = "GridContent";
|
|
60
54
|
var GridContent = /* @__PURE__ */ forwardRef((props, forwardedRef) => {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
} else {
|
|
71
|
-
forwardedRef.current = nextDxGrid;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}, [
|
|
75
|
-
forwardedRef,
|
|
76
|
-
dxGrid
|
|
77
|
-
]);
|
|
78
|
-
useEffect(() => {
|
|
79
|
-
if (dxGrid && props.getCells) {
|
|
80
|
-
dxGrid.getCells = props.getCells;
|
|
81
|
-
dxGrid.requestUpdate("initialCells");
|
|
55
|
+
const { id, editing, setEditBox, setEditing } = useGridContext(GRID_CONTENT_NAME, props.__gridScope);
|
|
56
|
+
const [dxGrid, setDxGridInternal] = useState(null);
|
|
57
|
+
const setDxGrid = useCallback((nextDxGrid) => {
|
|
58
|
+
setDxGridInternal(nextDxGrid);
|
|
59
|
+
if (forwardedRef) {
|
|
60
|
+
if (typeof forwardedRef === "function") {
|
|
61
|
+
forwardedRef?.(nextDxGrid);
|
|
62
|
+
} else {
|
|
63
|
+
forwardedRef.current = nextDxGrid;
|
|
82
64
|
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
65
|
+
}
|
|
66
|
+
}, [
|
|
67
|
+
forwardedRef,
|
|
68
|
+
dxGrid
|
|
69
|
+
]);
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
if (dxGrid && props.getCells) {
|
|
72
|
+
dxGrid.getCells = props.getCells;
|
|
73
|
+
dxGrid.requestUpdate("initialCells");
|
|
74
|
+
}
|
|
75
|
+
}, [
|
|
76
|
+
props.getCells,
|
|
77
|
+
dxGrid
|
|
78
|
+
]);
|
|
79
|
+
const handleEdit = useCallback((event) => {
|
|
80
|
+
setEditBox(event.cellBox);
|
|
81
|
+
setEditing({
|
|
82
|
+
index: event.cellIndex,
|
|
83
|
+
cellElement: event.cellElement,
|
|
84
|
+
initialContent: event.initialContent
|
|
101
85
|
});
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
|
|
86
|
+
}, []);
|
|
87
|
+
return /* @__PURE__ */ React.createElement(DxGrid, {
|
|
88
|
+
...props,
|
|
89
|
+
gridId: id,
|
|
90
|
+
mode: editing ? "edit" : "browse",
|
|
91
|
+
onEdit: handleEdit,
|
|
92
|
+
ref: setDxGrid
|
|
93
|
+
});
|
|
105
94
|
});
|
|
106
95
|
GridContent.displayName = GRID_CONTENT_NAME;
|
|
107
|
-
var gridSeparatorInlineEnd = "[&>.dx-grid]:relative [&>.dx-grid]:after:absolute [&>.dx-grid]:after:inset-
|
|
108
|
-
var gridSeparatorBlockEnd = "[&>.dx-grid]:relative [&>.dx-grid]:before:absolute [&>.dx-grid]:before:inset-
|
|
96
|
+
var gridSeparatorInlineEnd = "[&>.dx-grid]:relative [&>.dx-grid]:after:absolute [&>.dx-grid]:after:inset-y-0 [&>.dx-grid]:after:-right-px [&>.dx-grid]:after:w-px [&>.dx-grid]:after:bg-subdued-separator";
|
|
97
|
+
var gridSeparatorBlockEnd = "[&>.dx-grid]:relative [&>.dx-grid]:before:absolute [&>.dx-grid]:before:inset-x-0 [&>.dx-grid]:before:-bottom-px [&>.dx-grid]:before:h-px [&>.dx-grid]:before:bg-subdued-separator";
|
|
109
98
|
var Grid = {
|
|
110
99
|
Root: GridRoot,
|
|
111
100
|
Content: GridContent
|
|
112
101
|
};
|
|
113
102
|
|
|
114
|
-
//
|
|
115
|
-
import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
|
|
103
|
+
// src/CellEditor/CellEditor.tsx
|
|
116
104
|
import { completionStatus } from "@codemirror/autocomplete";
|
|
117
105
|
import { EditorView, keymap } from "@codemirror/view";
|
|
118
106
|
import React2 from "react";
|
|
119
107
|
import { useThemeContext } from "@dxos/react-ui";
|
|
120
|
-
import {
|
|
108
|
+
import { useTextEditor } from "@dxos/react-ui-editor";
|
|
109
|
+
import { createBasicExtensions, createThemeExtensions, filterChars } from "@dxos/ui-editor";
|
|
110
|
+
import { mx } from "@dxos/ui-theme";
|
|
121
111
|
var editorKeys = ({ onNav, onClose }) => {
|
|
122
112
|
return keymap.of([
|
|
123
113
|
{
|
|
@@ -219,94 +209,93 @@ var editorKeys = ({ onNav, onClose }) => {
|
|
|
219
209
|
}
|
|
220
210
|
]);
|
|
221
211
|
};
|
|
222
|
-
var CellEditor = ({ value,
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
const { parentRef } = useTextEditor(() => {
|
|
227
|
-
return {
|
|
228
|
-
autoFocus,
|
|
229
|
-
initialValue: value,
|
|
230
|
-
selection: {
|
|
231
|
-
anchor: value?.length ?? 0
|
|
232
|
-
},
|
|
233
|
-
extensions: [
|
|
234
|
-
extension ?? [],
|
|
235
|
-
preventNewline,
|
|
236
|
-
EditorView.focusChangeEffect.of((state, focusing) => {
|
|
237
|
-
if (!focusing) {
|
|
238
|
-
onBlur?.(state.doc.toString());
|
|
239
|
-
}
|
|
240
|
-
return null;
|
|
241
|
-
}),
|
|
242
|
-
createBasicExtensions({
|
|
243
|
-
lineWrapping: false
|
|
244
|
-
}),
|
|
245
|
-
createThemeExtensions({
|
|
246
|
-
themeMode,
|
|
247
|
-
slots: {
|
|
248
|
-
editor: {
|
|
249
|
-
className: "[&>.cm-scroller]:scrollbar-none tabular-nums"
|
|
250
|
-
},
|
|
251
|
-
content: {
|
|
252
|
-
className: "!border !border-transparent !pli-[var(--dx-grid-cell-padding-inline)] !plb-[var(--dx-grid-cell-padding-block)]"
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
})
|
|
256
|
-
]
|
|
257
|
-
};
|
|
258
|
-
}, [
|
|
259
|
-
extension,
|
|
212
|
+
var CellEditor = ({ value, extensions, box, gridId, autoFocus, slots, onBlur }) => {
|
|
213
|
+
const { themeMode } = useThemeContext();
|
|
214
|
+
const { parentRef } = useTextEditor(() => {
|
|
215
|
+
return {
|
|
260
216
|
autoFocus,
|
|
261
|
-
value,
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
return /* @__PURE__ */ React2.createElement("div", {
|
|
265
|
-
"data-testid": "grid.cell-editor",
|
|
266
|
-
ref: parentRef,
|
|
267
|
-
className: "absolute z-[1]",
|
|
268
|
-
style: {
|
|
269
|
-
...box,
|
|
270
|
-
...{
|
|
271
|
-
"--dx-gridCellWidth": `${box?.inlineSize ?? 200}px`
|
|
272
|
-
}
|
|
217
|
+
initialValue: value,
|
|
218
|
+
selection: {
|
|
219
|
+
anchor: value?.length ?? 0
|
|
273
220
|
},
|
|
274
|
-
|
|
275
|
-
|
|
221
|
+
extensions: [
|
|
222
|
+
extensions ?? [],
|
|
223
|
+
filterChars(/[\n\r]+/),
|
|
224
|
+
EditorView.focusChangeEffect.of((state, focusing) => {
|
|
225
|
+
if (!focusing) {
|
|
226
|
+
onBlur?.(state.doc.toString());
|
|
227
|
+
}
|
|
228
|
+
return null;
|
|
229
|
+
}),
|
|
230
|
+
createBasicExtensions({
|
|
231
|
+
lineWrapping: true
|
|
232
|
+
}),
|
|
233
|
+
createThemeExtensions({
|
|
234
|
+
themeMode,
|
|
235
|
+
slots: {
|
|
236
|
+
editor: {
|
|
237
|
+
className: mx("min-w-full! w-min! !max-w-(--dx-grid-cell-editor-max-w-size) min-h-full! !max-h-(--dx-grid-cell-editor-max-h-size)", slots?.editor?.className)
|
|
238
|
+
},
|
|
239
|
+
scroller: {
|
|
240
|
+
className: mx("overflow-x-hidden! !py-[max(0,calc(var(--dx-grid-cell-editor-padding-block)-1px))] pe-0! !pl-(--dx-grid-cell-editor-padding-inline)", slots?.scroller?.className)
|
|
241
|
+
},
|
|
242
|
+
content: {
|
|
243
|
+
className: mx("break-normal!", slots?.content?.className)
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
})
|
|
247
|
+
]
|
|
248
|
+
};
|
|
249
|
+
}, [
|
|
250
|
+
extensions,
|
|
251
|
+
autoFocus,
|
|
252
|
+
value,
|
|
253
|
+
onBlur,
|
|
254
|
+
themeMode,
|
|
255
|
+
slots
|
|
256
|
+
]);
|
|
257
|
+
return /* @__PURE__ */ React2.createElement("div", {
|
|
258
|
+
"data-testid": "grid.cell-editor",
|
|
259
|
+
ref: parentRef,
|
|
260
|
+
className: "absolute z-[1] dx-grid__cell-editor",
|
|
261
|
+
style: {
|
|
262
|
+
insetInlineStart: box?.insetInlineStart ?? "0px",
|
|
263
|
+
insetBlockStart: box?.insetBlockStart ?? "0px",
|
|
264
|
+
minInlineSize: box?.inlineSize ?? "180px",
|
|
265
|
+
minBlockSize: box?.blockSize ?? "30px",
|
|
266
|
+
...{
|
|
267
|
+
"--dx-grid-cell-width": `${box?.inlineSize ?? 200}px`
|
|
276
268
|
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
269
|
+
},
|
|
270
|
+
...gridId && {
|
|
271
|
+
"data-grid": gridId
|
|
272
|
+
}
|
|
273
|
+
});
|
|
281
274
|
};
|
|
282
275
|
|
|
283
|
-
//
|
|
284
|
-
import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
|
|
276
|
+
// src/CellEditor/GridCellEditor.tsx
|
|
285
277
|
import React3, { useCallback as useCallback2 } from "react";
|
|
286
|
-
var GridCellEditor = ({
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
}) : null;
|
|
304
|
-
} finally {
|
|
305
|
-
_effect.f();
|
|
306
|
-
}
|
|
278
|
+
var GridCellEditor = ({ extensions, getCellContent, onBlur, slots, __gridScope }) => {
|
|
279
|
+
const { id, editing, setEditing, editBox } = useGridContext("GridCellEditor", __gridScope);
|
|
280
|
+
const handleBlur = useCallback2((value) => {
|
|
281
|
+
setEditing(null);
|
|
282
|
+
onBlur?.(value);
|
|
283
|
+
}, [
|
|
284
|
+
onBlur
|
|
285
|
+
]);
|
|
286
|
+
return editing ? /* @__PURE__ */ React3.createElement(CellEditor, {
|
|
287
|
+
value: editing.initialContent ?? getCellContent(editing.index),
|
|
288
|
+
autoFocus: true,
|
|
289
|
+
box: editBox,
|
|
290
|
+
onBlur: handleBlur,
|
|
291
|
+
extensions,
|
|
292
|
+
gridId: id,
|
|
293
|
+
slots
|
|
294
|
+
}) : null;
|
|
307
295
|
};
|
|
308
296
|
export {
|
|
309
297
|
CellEditor,
|
|
298
|
+
DxEditRequest,
|
|
310
299
|
Grid,
|
|
311
300
|
GridCellEditor,
|
|
312
301
|
GridContent,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/index.ts", "../../../src/Grid/Grid.tsx", "../../../src/CellEditor/CellEditor.tsx", "../../../src/CellEditor/GridCellEditor.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nexport { defaultColSize, defaultRowSize } from '@dxos/lit-grid';\n\nexport * from './Grid';\nexport * from './CellEditor';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport '@dxos/lit-grid/dx-grid.pcss';\n\nimport { createComponent, type EventName } from '@lit/react';\nimport { createContextScope, type Scope } from '@radix-ui/react-context';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, {\n type ComponentProps,\n forwardRef,\n type PropsWithChildren,\n useCallback,\n useEffect,\n useState,\n} from 'react';\n\nimport { type DxAxisResize, type DxEditRequest, type DxGridCellsSelect, DxGrid as NaturalDxGrid } from '@dxos/lit-grid';\n\ntype DxGridElement = NaturalDxGrid;\n\nconst DxGrid = createComponent({\n tagName: 'dx-grid',\n elementClass: NaturalDxGrid,\n react: React,\n events: {\n onAxisResize: 'dx-axis-resize' as EventName<DxAxisResize>,\n onEdit: 'dx-edit-request' as EventName<DxEditRequest>,\n onSelect: 'dx-grid-cells-select' as EventName<DxGridCellsSelect>,\n },\n});\n\ntype GridEditBox = DxEditRequest['cellBox'];\n\nconst initialBox = {\n insetInlineStart: 0,\n insetBlockStart: 0,\n inlineSize: 0,\n blockSize: 0,\n} satisfies GridEditBox;\n\ntype GridEditing = {\n index: DxEditRequest['cellIndex'];\n cellElement: DxEditRequest['cellElement'];\n initialContent: DxEditRequest['initialContent'];\n} | null;\n\ntype GridContextValue = {\n id: string;\n editing: GridEditing;\n setEditing: (nextEditing: GridEditing) => void;\n editBox: GridEditBox;\n setEditBox: (nextEditBox: GridEditBox) => void;\n};\n\ntype GridScopedProps<P> = P & { __gridScope?: Scope };\n\nconst GRID_NAME = 'Grid';\n\nconst [createGridContext, createGridScope] = createContextScope(GRID_NAME, []);\n\nconst [GridProvider, useGridContext] = createGridContext<GridContextValue>(GRID_NAME);\n\ntype GridRootProps = PropsWithChildren<\n { id: string } & Partial<{\n editing: GridEditing;\n defaultEditing: GridEditing;\n onEditingChange: (nextEditing: GridEditing) => void;\n }>\n>;\n\nconst GridRoot = ({\n id,\n editing: propsEditing,\n defaultEditing,\n onEditingChange,\n children,\n __gridScope,\n}: GridScopedProps<GridRootProps>) => {\n const [editing = null, setEditing] = useControllableState({\n prop: propsEditing,\n defaultProp: defaultEditing,\n onChange: onEditingChange,\n });\n const [editBox, setEditBox] = useState<GridEditBox>(initialBox);\n return (\n <GridProvider\n id={id}\n editing={editing}\n setEditing={setEditing}\n editBox={editBox}\n setEditBox={setEditBox}\n scope={__gridScope}\n >\n <div className='dx-grid-host' style={{ display: 'contents' }}>\n {children}\n </div>\n </GridProvider>\n );\n};\n\nGridRoot.displayName = GRID_NAME;\n\ntype GridContentProps = Omit<ComponentProps<typeof DxGrid>, 'onEdit'> & {\n getCells?: NaturalDxGrid['getCells'];\n activeRefs?: string;\n};\n\nconst GRID_CONTENT_NAME = 'GridContent';\n\nconst GridContent = forwardRef<NaturalDxGrid, GridScopedProps<GridContentProps>>((props, forwardedRef) => {\n const { id, editing, setEditBox, setEditing } = useGridContext(GRID_CONTENT_NAME, props.__gridScope);\n const [dxGrid, setDxGridInternal] = useState<NaturalDxGrid | null>(null);\n\n // NOTE(thure): using `useState` instead of `useRef` works with refs provided by `@lit/react` and gives us\n // a reliable dependency for `useEffect` whereas `useLayoutEffect` does not guarantee the element will be defined.\n const setDxGrid = useCallback(\n (nextDxGrid: NaturalDxGrid | null) => {\n setDxGridInternal(nextDxGrid);\n if (forwardedRef) {\n if (typeof forwardedRef === 'function') {\n forwardedRef?.(nextDxGrid);\n } else {\n forwardedRef.current = nextDxGrid;\n }\n }\n },\n [forwardedRef, dxGrid],\n );\n\n useEffect(() => {\n if (dxGrid && props.getCells) {\n dxGrid.getCells = props.getCells;\n dxGrid.requestUpdate('initialCells');\n }\n }, [props.getCells, dxGrid]);\n\n const handleEdit = useCallback((event: DxEditRequest) => {\n setEditBox(event.cellBox);\n setEditing({ index: event.cellIndex, cellElement: event.cellElement, initialContent: event.initialContent });\n }, []);\n\n return <DxGrid {...props} gridId={id} mode={editing ? 'edit' : 'browse'} onEdit={handleEdit} ref={setDxGrid} />;\n});\n\nGridContent.displayName = GRID_CONTENT_NAME;\n\n//\n// Fragments\n//\n\n// NOTE(Zan): These fragments add border to inline-end and block-end of the grid using pseudo-elements.\n// These are offset by 1px to avoid double borders in planks.\nconst gridSeparatorInlineEnd =\n '[&>.dx-grid]:relative [&>.dx-grid]:after:absolute [&>.dx-grid]:after:inset-block-0 [&>.dx-grid]:after:-inline-end-px [&>.dx-grid]:after:is-px [&>.dx-grid]:after:bg-subduedSeparator';\nconst gridSeparatorBlockEnd =\n '[&>.dx-grid]:relative [&>.dx-grid]:before:absolute [&>.dx-grid]:before:inset-inline-0 [&>.dx-grid]:before:-block-end-px [&>.dx-grid]:before:bs-px [&>.dx-grid]:before:bg-subduedSeparator';\n\n//\n// Exports\n//\n\nexport const Grid = {\n Root: GridRoot,\n Content: GridContent,\n};\n\nexport { GridRoot, GridContent, useGridContext, createGridScope, gridSeparatorInlineEnd, gridSeparatorBlockEnd };\n\nexport type { GridRootProps, GridContentProps, GridEditing, GridEditBox, GridScopedProps, DxGridElement };\n\nexport {\n colToA1Notation,\n rowToA1Notation,\n closestCell,\n commentedClassName,\n toPlaneCellIndex,\n parseCellIndex,\n cellQuery,\n} from '@dxos/lit-grid';\n\nexport type {\n DxGridRange,\n DxGridAxisMeta,\n DxAxisResize,\n DxGridCells,\n DxGridPlaneRange,\n DxGridPlaneCells,\n DxGridCellIndex,\n DxGridPlaneCellIndex,\n DxGridCellValue,\n DxGridPlane,\n DxGridPosition,\n DxGridPlanePosition,\n DxGridAxis,\n} from '@dxos/lit-grid';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { completionStatus } from '@codemirror/autocomplete';\nimport { type Extension } from '@codemirror/state';\nimport { EditorView, keymap } from '@codemirror/view';\nimport React, { type KeyboardEvent } from 'react';\n\nimport { useThemeContext } from '@dxos/react-ui';\nimport {\n type UseTextEditorProps,\n createBasicExtensions,\n createThemeExtensions,\n preventNewline,\n useTextEditor,\n} from '@dxos/react-ui-editor';\n\nimport { type GridEditBox } from '../Grid';\n\nexport type EditorKeyEvent = Pick<KeyboardEvent<HTMLInputElement>, 'key'> & { shift?: boolean };\n\nexport type EditorKeyHandler = (value: string | undefined, event: EditorKeyEvent) => void;\nexport type EditorBlurHandler = (value: string | undefined) => void;\nexport type EditorKeyOrBlurHandler = (value: string | undefined, event?: EditorKeyEvent) => void;\n\nexport type EditorKeysProps = {\n onClose: EditorKeyHandler;\n onNav?: EditorKeyHandler;\n};\n\n// TODO(Zan): Should each consumer be responsible for defining these?\nexport const editorKeys = ({ onNav, onClose }: EditorKeysProps): Extension => {\n return keymap.of([\n {\n key: 'ArrowUp',\n run: (editor) => {\n const value = editor.state.doc.toString();\n onNav?.(value, { key: 'ArrowUp' });\n return !!onNav;\n },\n },\n {\n key: 'ArrowDown',\n run: (editor) => {\n const value = editor.state.doc.toString();\n onNav?.(value, { key: 'ArrowDown' });\n return !!onNav;\n },\n },\n {\n key: 'Mod-ArrowLeft',\n run: (editor) => {\n const value = editor.state.doc.toString();\n onNav?.(value, { key: 'ArrowLeft' });\n return !!onNav;\n },\n },\n {\n key: 'Mod-ArrowRight',\n run: (editor) => {\n const value = editor.state.doc.toString();\n onNav?.(value, { key: 'ArrowRight' });\n return !!onNav;\n },\n },\n {\n key: 'Enter',\n run: (editor) => {\n if (completionStatus(editor.state)) {\n return false;\n } else {\n onClose(editor.state.doc.toString(), { key: 'Enter' });\n return true;\n }\n },\n shift: (editor) => {\n if (completionStatus(editor.state)) {\n return false;\n } else {\n onClose(editor.state.doc.toString(), { key: 'Enter', shift: true });\n return true;\n }\n },\n },\n {\n key: 'Tab',\n run: (editor) => {\n if (completionStatus(editor.state)) {\n return false;\n } else {\n onClose(editor.state.doc.toString(), { key: 'Tab' });\n return true;\n }\n },\n shift: (editor) => {\n if (completionStatus(editor.state)) {\n return false;\n } else {\n onClose(editor.state.doc.toString(), { key: 'Tab', shift: true });\n return true;\n }\n },\n },\n {\n key: 'Escape',\n run: () => {\n onClose(undefined, { key: 'Escape' });\n return true;\n },\n },\n ]);\n};\n\nexport type CellEditorProps = {\n value?: string;\n extension?: Extension;\n box?: GridEditBox;\n gridId?: string;\n} & Pick<UseTextEditorProps, 'autoFocus'> & { onBlur?: EditorBlurHandler };\n\nexport const CellEditor = ({ value, extension, autoFocus, onBlur, box, gridId }: CellEditorProps) => {\n const { themeMode } = useThemeContext();\n const { parentRef } = useTextEditor(() => {\n return {\n autoFocus,\n initialValue: value,\n selection: { anchor: value?.length ?? 0 },\n extensions: [\n extension ?? [],\n preventNewline,\n EditorView.focusChangeEffect.of((state, focusing) => {\n if (!focusing) {\n onBlur?.(state.doc.toString());\n }\n return null;\n }),\n createBasicExtensions({ lineWrapping: false }),\n createThemeExtensions({\n themeMode,\n slots: {\n editor: {\n className: '[&>.cm-scroller]:scrollbar-none tabular-nums',\n },\n content: {\n className:\n '!border !border-transparent !pli-[var(--dx-grid-cell-padding-inline)] !plb-[var(--dx-grid-cell-padding-block)]',\n },\n },\n }),\n ],\n };\n }, [extension, autoFocus, value, onBlur]);\n\n return (\n <div\n data-testid='grid.cell-editor'\n ref={parentRef}\n className='absolute z-[1]'\n style={{\n ...box,\n ...{ '--dx-gridCellWidth': `${box?.inlineSize ?? 200}px` },\n }}\n {...(gridId && { 'data-grid': gridId })}\n />\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { CellEditor, type CellEditorProps } from './CellEditor';\nimport { type GridScopedProps, useGridContext, type DxGridCellIndex } from '../Grid';\n\nexport type GridCellEditorProps = GridScopedProps<\n Pick<CellEditorProps, 'extension' | 'onBlur'> & { getCellContent: (index: DxGridCellIndex) => string | undefined }\n>;\n\nexport const GridCellEditor = ({ extension, getCellContent, onBlur, __gridScope }: GridCellEditorProps) => {\n const { id, editing, setEditing, editBox } = useGridContext('GridSheetCellEditor', __gridScope);\n\n const handleBlur = useCallback(\n (value?: string) => {\n setEditing(null);\n onBlur?.(value);\n },\n [onBlur],\n );\n\n return editing ? (\n <CellEditor\n value={editing.initialContent ?? getCellContent(editing.index)}\n autoFocus\n box={editBox}\n onBlur={handleBlur}\n extension={extension}\n gridId={id}\n />\n ) : null;\n};\n"],
|
|
5
|
-
"mappings": ";AAIA,SAASA,gBAAgBC,sBAAsB
|
|
6
|
-
"names": ["defaultColSize", "defaultRowSize", "createComponent", "createContextScope", "useControllableState", "React", "forwardRef", "useCallback", "useEffect", "useState", "DxGrid", "NaturalDxGrid", "colToA1Notation", "rowToA1Notation", "closestCell", "commentedClassName", "toPlaneCellIndex", "parseCellIndex", "cellQuery", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nexport { defaultColSize, defaultRowSize } from '@dxos/lit-grid';\n\nexport * from './Grid';\nexport * from './CellEditor';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EventName, createComponent } from '@lit/react';\nimport { type Scope, createContextScope } from '@radix-ui/react-context';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, {\n type ComponentProps,\n type PropsWithChildren,\n forwardRef,\n useCallback,\n useEffect,\n useState,\n} from 'react';\n\nimport '@dxos/lit-grid/dx-grid.pcss';\nimport { type DxAxisResize, type DxEditRequest, type DxGridCellsSelect, DxGrid as NaturalDxGrid } from '@dxos/lit-grid';\n\ntype DxGridElement = NaturalDxGrid;\n\nconst DxGrid = createComponent({\n tagName: 'dx-grid',\n elementClass: NaturalDxGrid,\n react: React,\n events: {\n onAxisResize: 'dx-axis-resize' as EventName<DxAxisResize>,\n onEdit: 'dx-edit-request' as EventName<DxEditRequest>,\n onSelect: 'dx-grid-cells-select' as EventName<DxGridCellsSelect>,\n },\n});\n\ntype GridEditBox = DxEditRequest['cellBox'];\n\nconst initialBox = {\n insetInlineStart: 0,\n insetBlockStart: 0,\n inlineSize: 0,\n blockSize: 0,\n} satisfies GridEditBox;\n\ntype GridEditing = {\n index: DxEditRequest['cellIndex'];\n cellElement: DxEditRequest['cellElement'];\n initialContent: DxEditRequest['initialContent'];\n} | null;\n\ntype GridContextValue = {\n id: string;\n editing: GridEditing;\n setEditing: (nextEditing: GridEditing) => void;\n editBox: GridEditBox;\n setEditBox: (nextEditBox: GridEditBox) => void;\n};\n\ntype GridScopedProps<P> = P & { __gridScope?: Scope };\n\nconst GRID_NAME = 'Grid';\n\nconst [createGridContext, createGridScope] = createContextScope(GRID_NAME, []);\n\nconst [GridProvider, useGridContext] = createGridContext<GridContextValue>(GRID_NAME);\n\ntype GridRootProps = PropsWithChildren<\n {\n id: string;\n } & Partial<{\n editing: GridEditing;\n defaultEditing: GridEditing;\n onEditingChange: (nextEditing: GridEditing) => void;\n }>\n>;\n\n// TODO(burdon): Make headless.\nconst GridRoot = ({\n __gridScope,\n children,\n id,\n editing: propsEditing,\n defaultEditing,\n onEditingChange,\n}: GridScopedProps<GridRootProps>) => {\n const [editing = null, setEditing] = useControllableState({\n prop: propsEditing,\n defaultProp: defaultEditing,\n onChange: onEditingChange,\n });\n const [editBox, setEditBox] = useState<GridEditBox>(initialBox);\n return (\n <GridProvider\n id={id}\n editing={editing}\n setEditing={setEditing}\n editBox={editBox}\n setEditBox={setEditBox}\n scope={__gridScope}\n >\n <div className='dx-grid-host' style={{ display: 'contents' }}>\n {children}\n </div>\n </GridProvider>\n );\n};\n\nGridRoot.displayName = GRID_NAME;\n\nconst GRID_CONTENT_NAME = 'GridContent';\n\ntype GridContentProps = Omit<ComponentProps<typeof DxGrid>, 'onEdit'> & {\n getCells?: NaturalDxGrid['getCells'];\n activeRefs?: string;\n};\n\nconst GridContent = forwardRef<NaturalDxGrid, GridScopedProps<GridContentProps>>((props, forwardedRef) => {\n const { id, editing, setEditBox, setEditing } = useGridContext(GRID_CONTENT_NAME, props.__gridScope);\n const [dxGrid, setDxGridInternal] = useState<NaturalDxGrid | null>(null);\n\n // NOTE(thure): using `useState` instead of `useRef` works with refs provided by `@lit/react` and gives us\n // a reliable dependency for `useEffect` whereas `useLayoutEffect` does not guarantee the element will be defined.\n const setDxGrid = useCallback(\n (nextDxGrid: NaturalDxGrid | null) => {\n setDxGridInternal(nextDxGrid);\n if (forwardedRef) {\n if (typeof forwardedRef === 'function') {\n forwardedRef?.(nextDxGrid);\n } else {\n forwardedRef.current = nextDxGrid;\n }\n }\n },\n [forwardedRef, dxGrid],\n );\n\n useEffect(() => {\n if (dxGrid && props.getCells) {\n dxGrid.getCells = props.getCells;\n dxGrid.requestUpdate('initialCells');\n }\n }, [props.getCells, dxGrid]);\n\n const handleEdit = useCallback((event: DxEditRequest) => {\n setEditBox(event.cellBox);\n setEditing({ index: event.cellIndex, cellElement: event.cellElement, initialContent: event.initialContent });\n }, []);\n\n return <DxGrid {...props} gridId={id} mode={editing ? 'edit' : 'browse'} onEdit={handleEdit} ref={setDxGrid} />;\n});\n\nGridContent.displayName = GRID_CONTENT_NAME;\n\n//\n// Fragments\n//\n\n// NOTE(Zan): These fragments add border to w-end and h-end of the grid using pseudo-elements.\n// These are offset by 1px to avoid double borders in planks.\nconst gridSeparatorInlineEnd =\n '[&>.dx-grid]:relative [&>.dx-grid]:after:absolute [&>.dx-grid]:after:inset-y-0 [&>.dx-grid]:after:-right-px [&>.dx-grid]:after:w-px [&>.dx-grid]:after:bg-subdued-separator';\nconst gridSeparatorBlockEnd =\n '[&>.dx-grid]:relative [&>.dx-grid]:before:absolute [&>.dx-grid]:before:inset-x-0 [&>.dx-grid]:before:-bottom-px [&>.dx-grid]:before:h-px [&>.dx-grid]:before:bg-subdued-separator';\n\n//\n// Exports\n//\n\nexport const Grid = {\n Root: GridRoot,\n Content: GridContent,\n};\n\nexport { GridRoot, GridContent, createGridScope, gridSeparatorInlineEnd, gridSeparatorBlockEnd, useGridContext };\n\nexport type { GridRootProps, GridContentProps, GridEditing, GridEditBox, GridScopedProps, DxGridElement };\n\nexport {\n colToA1Notation,\n rowToA1Notation,\n closestCell,\n commentedClassName,\n toPlaneCellIndex,\n parseCellIndex,\n cellQuery,\n DxEditRequest,\n} from '@dxos/lit-grid';\n\nexport type {\n DxGridRange,\n DxGridAxisMeta,\n DxAxisResize,\n DxGridCells,\n DxGridPlaneRange,\n DxGridPlaneCells,\n DxGridCellIndex,\n DxGridPlaneCellIndex,\n DxGridCellValue,\n DxGridPlane,\n DxGridPosition,\n DxGridPlanePosition,\n DxGridAxis,\n} from '@dxos/lit-grid';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { completionStatus } from '@codemirror/autocomplete';\nimport { type Extension } from '@codemirror/state';\nimport { EditorView, keymap } from '@codemirror/view';\nimport React, { type KeyboardEvent } from 'react';\n\nimport { useThemeContext } from '@dxos/react-ui';\nimport { type UseTextEditorProps, useTextEditor } from '@dxos/react-ui-editor';\nimport {\n type ThemeExtensionsOptions,\n createBasicExtensions,\n createThemeExtensions,\n filterChars,\n} from '@dxos/ui-editor';\nimport { mx } from '@dxos/ui-theme';\n\nimport { type GridEditBox } from '../Grid';\n\nexport type EditorKeyEvent = Pick<KeyboardEvent<HTMLInputElement>, 'key'> & { shift?: boolean };\n\nexport type EditorKeyHandler = (value: string | undefined, event: EditorKeyEvent) => void;\nexport type EditorBlurHandler = (value: string | undefined) => void;\nexport type EditorKeyOrBlurHandler = (value: string | undefined, event?: EditorKeyEvent) => void;\n\nexport type EditorKeysProps = {\n onClose: EditorKeyHandler;\n onNav?: EditorKeyHandler;\n};\n\n// TODO(Zan): Should each consumer be responsible for defining these?\nexport const editorKeys = ({ onNav, onClose }: EditorKeysProps): Extension => {\n return keymap.of([\n {\n key: 'ArrowUp',\n run: (editor) => {\n const value = editor.state.doc.toString();\n onNav?.(value, { key: 'ArrowUp' });\n return !!onNav;\n },\n },\n {\n key: 'ArrowDown',\n run: (editor) => {\n const value = editor.state.doc.toString();\n onNav?.(value, { key: 'ArrowDown' });\n return !!onNav;\n },\n },\n {\n key: 'Mod-ArrowLeft',\n run: (editor) => {\n const value = editor.state.doc.toString();\n onNav?.(value, { key: 'ArrowLeft' });\n return !!onNav;\n },\n },\n {\n key: 'Mod-ArrowRight',\n run: (editor) => {\n const value = editor.state.doc.toString();\n onNav?.(value, { key: 'ArrowRight' });\n return !!onNav;\n },\n },\n {\n key: 'Enter',\n run: (editor) => {\n if (completionStatus(editor.state)) {\n return false;\n } else {\n onClose(editor.state.doc.toString(), { key: 'Enter' });\n return true;\n }\n },\n shift: (editor) => {\n if (completionStatus(editor.state)) {\n return false;\n } else {\n onClose(editor.state.doc.toString(), { key: 'Enter', shift: true });\n return true;\n }\n },\n },\n {\n key: 'Tab',\n run: (editor) => {\n if (completionStatus(editor.state)) {\n return false;\n } else {\n onClose(editor.state.doc.toString(), { key: 'Tab' });\n return true;\n }\n },\n shift: (editor) => {\n if (completionStatus(editor.state)) {\n return false;\n } else {\n onClose(editor.state.doc.toString(), { key: 'Tab', shift: true });\n return true;\n }\n },\n },\n {\n key: 'Escape',\n run: () => {\n onClose(undefined, { key: 'Escape' });\n return true;\n },\n },\n ]);\n};\n\nexport type CellEditorProps = {\n value?: string;\n extensions?: Extension;\n box?: GridEditBox;\n gridId?: string;\n onBlur?: EditorBlurHandler;\n} & Pick<UseTextEditorProps, 'autoFocus'> &\n Pick<ThemeExtensionsOptions, 'slots'>;\n\nexport const CellEditor = ({ value, extensions, box, gridId, autoFocus, slots, onBlur }: CellEditorProps) => {\n const { themeMode } = useThemeContext();\n const { parentRef } = useTextEditor(() => {\n return {\n autoFocus,\n initialValue: value,\n selection: { anchor: value?.length ?? 0 },\n extensions: [\n extensions ?? [],\n filterChars(/[\\n\\r]+/),\n EditorView.focusChangeEffect.of((state, focusing) => {\n if (!focusing) {\n onBlur?.(state.doc.toString());\n }\n return null;\n }),\n createBasicExtensions({ lineWrapping: true }),\n createThemeExtensions({\n themeMode,\n slots: {\n editor: {\n className: mx(\n 'min-w-full! w-min! !max-w-(--dx-grid-cell-editor-max-w-size) min-h-full! !max-h-(--dx-grid-cell-editor-max-h-size)',\n slots?.editor?.className,\n ),\n },\n scroller: {\n className: mx(\n 'overflow-x-hidden! !py-[max(0,calc(var(--dx-grid-cell-editor-padding-block)-1px))] pe-0! !pl-(--dx-grid-cell-editor-padding-inline)',\n slots?.scroller?.className,\n ),\n },\n content: {\n className: mx('break-normal!', slots?.content?.className),\n },\n },\n }),\n ],\n };\n }, [extensions, autoFocus, value, onBlur, themeMode, slots]);\n\n return (\n <div\n data-testid='grid.cell-editor'\n ref={parentRef}\n className='absolute z-[1] dx-grid__cell-editor'\n style={{\n insetInlineStart: box?.insetInlineStart ?? '0px',\n insetBlockStart: box?.insetBlockStart ?? '0px',\n minInlineSize: box?.inlineSize ?? '180px',\n minBlockSize: box?.blockSize ?? '30px',\n ...{ '--dx-grid-cell-width': `${box?.inlineSize ?? 200}px` },\n }}\n {...(gridId && { 'data-grid': gridId })}\n />\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { type DxGridCellIndex, type GridScopedProps, useGridContext } from '../Grid';\nimport { CellEditor, type CellEditorProps } from './CellEditor';\n\nexport type GridCellEditorProps = GridScopedProps<\n Pick<CellEditorProps, 'extensions' | 'onBlur' | 'slots'> & {\n getCellContent: (index: DxGridCellIndex) => string | undefined;\n }\n>;\n\nexport const GridCellEditor = ({ extensions, getCellContent, onBlur, slots, __gridScope }: GridCellEditorProps) => {\n const { id, editing, setEditing, editBox } = useGridContext('GridCellEditor', __gridScope);\n\n const handleBlur = useCallback(\n (value?: string) => {\n setEditing(null);\n onBlur?.(value);\n },\n [onBlur],\n );\n\n return editing ? (\n <CellEditor\n value={editing.initialContent ?? getCellContent(editing.index)}\n autoFocus\n box={editBox}\n onBlur={handleBlur}\n extensions={extensions}\n gridId={id}\n slots={slots}\n />\n ) : null;\n};\n"],
|
|
5
|
+
"mappings": ";AAIA,SAASA,gBAAgBC,sBAAsB;;;ACA/C,SAAyBC,uBAAuB;AAChD,SAAqBC,0BAA0B;AAC/C,SAASC,4BAA4B;AACrC,OAAOC,SAGLC,YACAC,aACAC,WACAC,gBACK;AAEP,OAAO;AACP,SAAwEC,UAAUC,qBAAqB;AA6JvG,SACEC,iBACAC,iBACAC,aACAC,oBACAC,kBACAC,gBACAC,WACAC,qBACK;AAlKP,IAAMT,SAASR,gBAAgB;EAC7BkB,SAAS;EACTC,cAAcV;EACdW,OAAOjB;EACPkB,QAAQ;IACNC,cAAc;IACdC,QAAQ;IACRC,UAAU;EACZ;AACF,CAAA;AAIA,IAAMC,aAAa;EACjBC,kBAAkB;EAClBC,iBAAiB;EACjBC,YAAY;EACZC,WAAW;AACb;AAkBA,IAAMC,YAAY;AAElB,IAAM,CAACC,mBAAmBC,eAAAA,IAAmB/B,mBAAmB6B,WAAW,CAAA,CAAE;AAE7E,IAAM,CAACG,cAAcC,cAAAA,IAAkBH,kBAAoCD,SAAAA;AAa3E,IAAMK,WAAW,CAAC,EAChBC,aACAC,UACAC,IACAC,SAASC,cACTC,gBACAC,gBAAe,MACgB;AAC/B,QAAM,CAACH,UAAU,MAAMI,UAAAA,IAAczC,qBAAqB;IACxD0C,MAAMJ;IACNK,aAAaJ;IACbK,UAAUJ;EACZ,CAAA;AACA,QAAM,CAACK,SAASC,UAAAA,IAAczC,SAAsBkB,UAAAA;AACpD,SACE,sBAAA,cAACQ,cAAAA;IACCK;IACAC;IACAI;IACAI;IACAC;IACAC,OAAOb;KAEP,sBAAA,cAACc,OAAAA;IAAIC,WAAU;IAAeC,OAAO;MAAEC,SAAS;IAAW;KACxDhB,QAAAA,CAAAA;AAIT;AAEAF,SAASmB,cAAcxB;AAEvB,IAAMyB,oBAAoB;AAO1B,IAAMC,cAAcpD,2BAA6D,CAACqD,OAAOC,iBAAAA;AACvF,QAAM,EAAEpB,IAAIC,SAASS,YAAYL,WAAU,IAAKT,eAAeqB,mBAAmBE,MAAMrB,WAAW;AACnG,QAAM,CAACuB,QAAQC,iBAAAA,IAAqBrD,SAA+B,IAAA;AAInE,QAAMsD,YAAYxD,YAChB,CAACyD,eAAAA;AACCF,sBAAkBE,UAAAA;AAClB,QAAIJ,cAAc;AAChB,UAAI,OAAOA,iBAAiB,YAAY;AACtCA,uBAAeI,UAAAA;MACjB,OAAO;AACLJ,qBAAaK,UAAUD;MACzB;IACF;EACF,GACA;IAACJ;IAAcC;GAAO;AAGxBrD,YAAU,MAAA;AACR,QAAIqD,UAAUF,MAAMO,UAAU;AAC5BL,aAAOK,WAAWP,MAAMO;AACxBL,aAAOM,cAAc,cAAA;IACvB;EACF,GAAG;IAACR,MAAMO;IAAUL;GAAO;AAE3B,QAAMO,aAAa7D,YAAY,CAAC8D,UAAAA;AAC9BnB,eAAWmB,MAAMC,OAAO;AACxBzB,eAAW;MAAE0B,OAAOF,MAAMG;MAAWC,aAAaJ,MAAMI;MAAaC,gBAAgBL,MAAMK;IAAe,CAAA;EAC5G,GAAG,CAAA,CAAE;AAEL,SAAO,sBAAA,cAAChE,QAAAA;IAAQ,GAAGiD;IAAOgB,QAAQnC;IAAIoC,MAAMnC,UAAU,SAAS;IAAUhB,QAAQ2C;IAAYS,KAAKd;;AACpG,CAAA;AAEAL,YAAYF,cAAcC;AAQ1B,IAAMqB,yBACJ;AACF,IAAMC,wBACJ;AAMK,IAAMC,OAAO;EAClBC,MAAM5C;EACN6C,SAASxB;AACX;;;ACpKA,SAASyB,wBAAwB;AAEjC,SAASC,YAAYC,cAAc;AACnC,OAAOC,YAAmC;AAE1C,SAASC,uBAAuB;AAChC,SAAkCC,qBAAqB;AACvD,SAEEC,uBACAC,uBACAC,mBACK;AACP,SAASC,UAAU;AAgBZ,IAAMC,aAAa,CAAC,EAAEC,OAAOC,QAAO,MAAmB;AAC5D,SAAOV,OAAOW,GAAG;IACf;MACEC,KAAK;MACLC,KAAK,CAACC,WAAAA;AACJ,cAAMC,QAAQD,OAAOE,MAAMC,IAAIC,SAAQ;AACvCT,gBAAQM,OAAO;UAAEH,KAAK;QAAU,CAAA;AAChC,eAAO,CAAC,CAACH;MACX;IACF;IACA;MACEG,KAAK;MACLC,KAAK,CAACC,WAAAA;AACJ,cAAMC,QAAQD,OAAOE,MAAMC,IAAIC,SAAQ;AACvCT,gBAAQM,OAAO;UAAEH,KAAK;QAAY,CAAA;AAClC,eAAO,CAAC,CAACH;MACX;IACF;IACA;MACEG,KAAK;MACLC,KAAK,CAACC,WAAAA;AACJ,cAAMC,QAAQD,OAAOE,MAAMC,IAAIC,SAAQ;AACvCT,gBAAQM,OAAO;UAAEH,KAAK;QAAY,CAAA;AAClC,eAAO,CAAC,CAACH;MACX;IACF;IACA;MACEG,KAAK;MACLC,KAAK,CAACC,WAAAA;AACJ,cAAMC,QAAQD,OAAOE,MAAMC,IAAIC,SAAQ;AACvCT,gBAAQM,OAAO;UAAEH,KAAK;QAAa,CAAA;AACnC,eAAO,CAAC,CAACH;MACX;IACF;IACA;MACEG,KAAK;MACLC,KAAK,CAACC,WAAAA;AACJ,YAAIhB,iBAAiBgB,OAAOE,KAAK,GAAG;AAClC,iBAAO;QACT,OAAO;AACLN,kBAAQI,OAAOE,MAAMC,IAAIC,SAAQ,GAAI;YAAEN,KAAK;UAAQ,CAAA;AACpD,iBAAO;QACT;MACF;MACAO,OAAO,CAACL,WAAAA;AACN,YAAIhB,iBAAiBgB,OAAOE,KAAK,GAAG;AAClC,iBAAO;QACT,OAAO;AACLN,kBAAQI,OAAOE,MAAMC,IAAIC,SAAQ,GAAI;YAAEN,KAAK;YAASO,OAAO;UAAK,CAAA;AACjE,iBAAO;QACT;MACF;IACF;IACA;MACEP,KAAK;MACLC,KAAK,CAACC,WAAAA;AACJ,YAAIhB,iBAAiBgB,OAAOE,KAAK,GAAG;AAClC,iBAAO;QACT,OAAO;AACLN,kBAAQI,OAAOE,MAAMC,IAAIC,SAAQ,GAAI;YAAEN,KAAK;UAAM,CAAA;AAClD,iBAAO;QACT;MACF;MACAO,OAAO,CAACL,WAAAA;AACN,YAAIhB,iBAAiBgB,OAAOE,KAAK,GAAG;AAClC,iBAAO;QACT,OAAO;AACLN,kBAAQI,OAAOE,MAAMC,IAAIC,SAAQ,GAAI;YAAEN,KAAK;YAAOO,OAAO;UAAK,CAAA;AAC/D,iBAAO;QACT;MACF;IACF;IACA;MACEP,KAAK;MACLC,KAAK,MAAA;AACHH,gBAAQU,QAAW;UAAER,KAAK;QAAS,CAAA;AACnC,eAAO;MACT;IACF;GACD;AACH;AAWO,IAAMS,aAAa,CAAC,EAAEN,OAAOO,YAAYC,KAAKC,QAAQC,WAAWC,OAAOC,OAAM,MAAmB;AACtG,QAAM,EAAEC,UAAS,IAAK1B,gBAAAA;AACtB,QAAM,EAAE2B,UAAS,IAAK1B,cAAc,MAAA;AAClC,WAAO;MACLsB;MACAK,cAAcf;MACdgB,WAAW;QAAEC,QAAQjB,OAAOkB,UAAU;MAAE;MACxCX,YAAY;QACVA,cAAc,CAAA;QACdhB,YAAY,SAAA;QACZP,WAAWmC,kBAAkBvB,GAAG,CAACK,OAAOmB,aAAAA;AACtC,cAAI,CAACA,UAAU;AACbR,qBAASX,MAAMC,IAAIC,SAAQ,CAAA;UAC7B;AACA,iBAAO;QACT,CAAA;QACAd,sBAAsB;UAAEgC,cAAc;QAAK,CAAA;QAC3C/B,sBAAsB;UACpBuB;UACAF,OAAO;YACLZ,QAAQ;cACNuB,WAAW9B,GACT,sHACAmB,OAAOZ,QAAQuB,SAAAA;YAEnB;YACAC,UAAU;cACRD,WAAW9B,GACT,uIACAmB,OAAOY,UAAUD,SAAAA;YAErB;YACAE,SAAS;cACPF,WAAW9B,GAAG,iBAAiBmB,OAAOa,SAASF,SAAAA;YACjD;UACF;QACF,CAAA;;IAEJ;EACF,GAAG;IAACf;IAAYG;IAAWV;IAAOY;IAAQC;IAAWF;GAAM;AAE3D,SACE,gBAAAzB,OAAA,cAACuC,OAAAA;IACCC,eAAY;IACZC,KAAKb;IACLQ,WAAU;IACVM,OAAO;MACLC,kBAAkBrB,KAAKqB,oBAAoB;MAC3CC,iBAAiBtB,KAAKsB,mBAAmB;MACzCC,eAAevB,KAAKwB,cAAc;MAClCC,cAAczB,KAAK0B,aAAa;MAChC,GAAG;QAAE,wBAAwB,GAAG1B,KAAKwB,cAAc,GAAA;MAAQ;IAC7D;IACC,GAAIvB,UAAU;MAAE,aAAaA;IAAO;;AAG3C;;;AChLA,OAAO0B,UAASC,eAAAA,oBAAmB;AAW5B,IAAMC,iBAAiB,CAAC,EAAEC,YAAYC,gBAAgBC,QAAQC,OAAOC,YAAW,MAAuB;AAC5G,QAAM,EAAEC,IAAIC,SAASC,YAAYC,QAAO,IAAKC,eAAe,kBAAkBL,WAAAA;AAE9E,QAAMM,aAAaC,aACjB,CAACC,UAAAA;AACCL,eAAW,IAAA;AACXL,aAASU,KAAAA;EACX,GACA;IAACV;GAAO;AAGV,SAAOI,UACL,gBAAAO,OAAA,cAACC,YAAAA;IACCF,OAAON,QAAQS,kBAAkBd,eAAeK,QAAQU,KAAK;IAC7DC,WAAAA;IACAC,KAAKV;IACLN,QAAQQ;IACRV;IACAmB,QAAQd;IACRF;OAEA;AACN;",
|
|
6
|
+
"names": ["defaultColSize", "defaultRowSize", "createComponent", "createContextScope", "useControllableState", "React", "forwardRef", "useCallback", "useEffect", "useState", "DxGrid", "NaturalDxGrid", "colToA1Notation", "rowToA1Notation", "closestCell", "commentedClassName", "toPlaneCellIndex", "parseCellIndex", "cellQuery", "DxEditRequest", "tagName", "elementClass", "react", "events", "onAxisResize", "onEdit", "onSelect", "initialBox", "insetInlineStart", "insetBlockStart", "inlineSize", "blockSize", "GRID_NAME", "createGridContext", "createGridScope", "GridProvider", "useGridContext", "GridRoot", "__gridScope", "children", "id", "editing", "propsEditing", "defaultEditing", "onEditingChange", "setEditing", "prop", "defaultProp", "onChange", "editBox", "setEditBox", "scope", "div", "className", "style", "display", "displayName", "GRID_CONTENT_NAME", "GridContent", "props", "forwardedRef", "dxGrid", "setDxGridInternal", "setDxGrid", "nextDxGrid", "current", "getCells", "requestUpdate", "handleEdit", "event", "cellBox", "index", "cellIndex", "cellElement", "initialContent", "gridId", "mode", "ref", "gridSeparatorInlineEnd", "gridSeparatorBlockEnd", "Grid", "Root", "Content", "completionStatus", "EditorView", "keymap", "React", "useThemeContext", "useTextEditor", "createBasicExtensions", "createThemeExtensions", "filterChars", "mx", "editorKeys", "onNav", "onClose", "of", "key", "run", "editor", "value", "state", "doc", "toString", "shift", "undefined", "CellEditor", "extensions", "box", "gridId", "autoFocus", "slots", "onBlur", "themeMode", "parentRef", "initialValue", "selection", "anchor", "length", "focusChangeEffect", "focusing", "lineWrapping", "className", "scroller", "content", "div", "data-testid", "ref", "style", "insetInlineStart", "insetBlockStart", "minInlineSize", "inlineSize", "minBlockSize", "blockSize", "React", "useCallback", "GridCellEditor", "extensions", "getCellContent", "onBlur", "slots", "__gridScope", "id", "editing", "setEditing", "editBox", "useGridContext", "handleBlur", "useCallback", "value", "React", "CellEditor", "initialContent", "index", "autoFocus", "box", "gridId"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"
|
|
1
|
+
{"inputs":{"src/Grid/Grid.tsx":{"bytes":16514,"imports":[{"path":"@lit/react","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/lit-grid/dx-grid.pcss","kind":"import-statement","external":true},{"path":"@dxos/lit-grid","kind":"import-statement","external":true},{"path":"@dxos/lit-grid","kind":"import-statement","external":true}],"format":"esm"},"src/Grid/index.ts":{"bytes":368,"imports":[{"path":"src/Grid/Grid.tsx","kind":"import-statement","original":"./Grid"}],"format":"esm"},"src/CellEditor/CellEditor.tsx":{"bytes":17794,"imports":[{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-editor","kind":"import-statement","external":true},{"path":"@dxos/ui-editor","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true}],"format":"esm"},"src/CellEditor/GridCellEditor.tsx":{"bytes":3399,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"src/Grid/index.ts","kind":"import-statement","original":"../Grid"},{"path":"src/CellEditor/CellEditor.tsx","kind":"import-statement","original":"./CellEditor"}],"format":"esm"},"src/CellEditor/index.ts":{"bytes":484,"imports":[{"path":"src/CellEditor/CellEditor.tsx","kind":"import-statement","original":"./CellEditor"},{"path":"src/CellEditor/GridCellEditor.tsx","kind":"import-statement","original":"./GridCellEditor"}],"format":"esm"},"src/index.ts":{"bytes":711,"imports":[{"path":"@dxos/lit-grid","kind":"import-statement","external":true},{"path":"src/Grid/index.ts","kind":"import-statement","original":"./Grid"},{"path":"src/CellEditor/index.ts","kind":"import-statement","original":"./CellEditor"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":19809},"dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/lit-grid","kind":"import-statement","external":true},{"path":"@lit/react","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/lit-grid/dx-grid.pcss","kind":"import-statement","external":true},{"path":"@dxos/lit-grid","kind":"import-statement","external":true},{"path":"@dxos/lit-grid","kind":"import-statement","external":true},{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-editor","kind":"import-statement","external":true},{"path":"@dxos/ui-editor","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"exports":["CellEditor","DxEditRequest","Grid","GridCellEditor","GridContent","GridRoot","cellQuery","closestCell","colToA1Notation","commentedClassName","createGridScope","defaultColSize","defaultRowSize","editorKeys","gridSeparatorBlockEnd","gridSeparatorInlineEnd","parseCellIndex","rowToA1Notation","toPlaneCellIndex","useGridContext"],"entryPoint":"src/index.ts","inputs":{"src/index.ts":{"bytesInOutput":65},"src/Grid/Grid.tsx":{"bytesInOutput":3340},"src/CellEditor/CellEditor.tsx":{"bytesInOutput":4427},"src/CellEditor/GridCellEditor.tsx":{"bytesInOutput":615}},"bytes":8951}}}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type Extension } from '@codemirror/state';
|
|
2
2
|
import React, { type KeyboardEvent } from 'react';
|
|
3
3
|
import { type UseTextEditorProps } from '@dxos/react-ui-editor';
|
|
4
|
+
import { type ThemeExtensionsOptions } from '@dxos/ui-editor';
|
|
4
5
|
import { type GridEditBox } from '../Grid';
|
|
5
6
|
export type EditorKeyEvent = Pick<KeyboardEvent<HTMLInputElement>, 'key'> & {
|
|
6
7
|
shift?: boolean;
|
|
@@ -15,11 +16,10 @@ export type EditorKeysProps = {
|
|
|
15
16
|
export declare const editorKeys: ({ onNav, onClose }: EditorKeysProps) => Extension;
|
|
16
17
|
export type CellEditorProps = {
|
|
17
18
|
value?: string;
|
|
18
|
-
|
|
19
|
+
extensions?: Extension;
|
|
19
20
|
box?: GridEditBox;
|
|
20
21
|
gridId?: string;
|
|
21
|
-
} & Pick<UseTextEditorProps, 'autoFocus'> & {
|
|
22
22
|
onBlur?: EditorBlurHandler;
|
|
23
|
-
}
|
|
24
|
-
export declare const CellEditor: ({ value,
|
|
23
|
+
} & Pick<UseTextEditorProps, 'autoFocus'> & Pick<ThemeExtensionsOptions, 'slots'>;
|
|
24
|
+
export declare const CellEditor: ({ value, extensions, box, gridId, autoFocus, slots, onBlur }: CellEditorProps) => React.JSX.Element;
|
|
25
25
|
//# sourceMappingURL=CellEditor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CellEditor.d.ts","sourceRoot":"","sources":["../../../../src/CellEditor/CellEditor.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,KAAK,EAAE,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAGlD,OAAO,
|
|
1
|
+
{"version":3,"file":"CellEditor.d.ts","sourceRoot":"","sources":["../../../../src/CellEditor/CellEditor.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,KAAK,EAAE,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAGlD,OAAO,EAAE,KAAK,kBAAkB,EAAiB,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EACL,KAAK,sBAAsB,EAI5B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhG,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;AAC1F,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;AACpE,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;AAEjG,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AAGF,eAAO,MAAM,UAAU,uBAAwB,eAAe,KAAG,SAgFhE,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B,GAAG,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,GACvC,IAAI,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;AAExC,eAAO,MAAM,UAAU,iEAAkE,eAAe,sBAwDvG,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { type CellEditorProps } from './CellEditor';
|
|
4
|
+
declare const meta: {
|
|
5
|
+
title: string;
|
|
6
|
+
component: ({ value, extensions, box, gridId, autoFocus, slots, onBlur }: CellEditorProps) => React.JSX.Element;
|
|
7
|
+
render: (props: CellEditorProps) => React.JSX.Element;
|
|
8
|
+
decorators: import("@storybook/react").Decorator[];
|
|
9
|
+
parameters: {
|
|
10
|
+
layout: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export default meta;
|
|
14
|
+
type Story = StoryObj<typeof meta>;
|
|
15
|
+
export declare const Default: Story;
|
|
16
|
+
//# sourceMappingURL=CellEditor.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CellEditor.stories.d.ts","sourceRoot":"","sources":["../../../../src/CellEditor/CellEditor.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAmB,MAAM,OAAO,CAAC;AAIxC,OAAO,EAAc,KAAK,eAAe,EAAmC,MAAM,cAAc,CAAC;AA2DjG,QAAA,MAAM,IAAI;;;oBAzDmB,eAAe;;;QA+DxC,MAAM;;CAEyB,CAAC;eAErB,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import { type DxGridCellIndex, type GridScopedProps } from '../Grid';
|
|
2
3
|
import { type CellEditorProps } from './CellEditor';
|
|
3
|
-
|
|
4
|
-
export type GridCellEditorProps = GridScopedProps<Pick<CellEditorProps, 'extension' | 'onBlur'> & {
|
|
4
|
+
export type GridCellEditorProps = GridScopedProps<Pick<CellEditorProps, 'extensions' | 'onBlur' | 'slots'> & {
|
|
5
5
|
getCellContent: (index: DxGridCellIndex) => string | undefined;
|
|
6
6
|
}>;
|
|
7
|
-
export declare const GridCellEditor: ({
|
|
7
|
+
export declare const GridCellEditor: ({ extensions, getCellContent, onBlur, slots, __gridScope }: GridCellEditorProps) => React.JSX.Element | null;
|
|
8
8
|
//# sourceMappingURL=GridCellEditor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GridCellEditor.d.ts","sourceRoot":"","sources":["../../../../src/CellEditor/GridCellEditor.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAE3C,OAAO,
|
|
1
|
+
{"version":3,"file":"GridCellEditor.d.ts","sourceRoot":"","sources":["../../../../src/CellEditor/GridCellEditor.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAE3C,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAkB,MAAM,SAAS,CAAC;AACrF,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,MAAM,mBAAmB,GAAG,eAAe,CAC/C,IAAI,CAAC,eAAe,EAAE,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC,GAAG;IACzD,cAAc,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM,GAAG,SAAS,CAAC;CAChE,CACF,CAAC;AAEF,eAAO,MAAM,cAAc,+DAAgE,mBAAmB,6BAsB7G,CAAC"}
|