@dxos/react-ui-grid 0.8.4-main.72ec0f3 → 0.8.4-main.74a063c4e0
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 +138 -160
- 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 +3 -2
- package/dist/types/src/CellEditor/CellEditor.d.ts.map +1 -1
- package/dist/types/src/CellEditor/CellEditor.stories.d.ts +1 -1
- package/dist/types/src/CellEditor/GridCellEditor.d.ts.map +1 -1
- package/dist/types/src/Grid/Grid.d.ts +5 -5
- package/dist/types/src/Grid/Grid.d.ts.map +1 -1
- package/dist/types/src/Grid/Grid.stories.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +24 -20
- package/src/CellEditor/CellEditor.stories.tsx +2 -2
- package/src/CellEditor/CellEditor.tsx +8 -9
- package/src/CellEditor/GridCellEditor.tsx +0 -1
- package/src/Grid/Grid.stories.tsx +28 -18
- package/src/Grid/Grid.tsx +10 -8
package/package.json
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/react-ui-grid",
|
|
3
|
-
"version": "0.8.4-main.
|
|
3
|
+
"version": "0.8.4-main.74a063c4e0",
|
|
4
4
|
"description": "React component which manages a `dx-grid` Lit web component.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/dxos/dxos"
|
|
10
|
+
},
|
|
7
11
|
"license": "MIT",
|
|
8
12
|
"author": "DXOS.org",
|
|
9
|
-
"sideEffects":
|
|
13
|
+
"sideEffects": false,
|
|
10
14
|
"type": "module",
|
|
11
15
|
"exports": {
|
|
12
16
|
".": {
|
|
@@ -28,31 +32,31 @@
|
|
|
28
32
|
"@codemirror/state": "^6.5.2",
|
|
29
33
|
"@codemirror/view": "^6.38.4",
|
|
30
34
|
"@lit/react": "^1.0.8",
|
|
31
|
-
"@preact-signals/safe-react": "^0.9.0",
|
|
32
35
|
"@radix-ui/react-context": "1.1.1",
|
|
33
36
|
"@radix-ui/react-popper": "1.2.2",
|
|
34
37
|
"@radix-ui/react-use-controllable-state": "1.1.0",
|
|
35
|
-
"@dxos/util": "0.8.4-main.
|
|
36
|
-
"@dxos/react-ui-editor": "0.8.4-main.
|
|
37
|
-
"@dxos/lit-grid": "0.8.4-main.
|
|
38
|
+
"@dxos/util": "0.8.4-main.74a063c4e0",
|
|
39
|
+
"@dxos/react-ui-editor": "0.8.4-main.74a063c4e0",
|
|
40
|
+
"@dxos/lit-grid": "0.8.4-main.74a063c4e0",
|
|
41
|
+
"@dxos/ui-editor": "0.8.4-main.74a063c4e0"
|
|
38
42
|
},
|
|
39
43
|
"devDependencies": {
|
|
40
|
-
"@types/react": "~19.2.
|
|
41
|
-
"@types/react-dom": "~19.2.
|
|
42
|
-
"react": "~19.2.
|
|
43
|
-
"react-dom": "~19.2.
|
|
44
|
-
"vite": "7.1.
|
|
45
|
-
"@dxos/
|
|
46
|
-
"@dxos/react-ui
|
|
47
|
-
"@dxos/react-ui-
|
|
48
|
-
"@dxos/storybook-utils": "0.8.4-main.
|
|
49
|
-
"@dxos/
|
|
44
|
+
"@types/react": "~19.2.7",
|
|
45
|
+
"@types/react-dom": "~19.2.3",
|
|
46
|
+
"react": "~19.2.3",
|
|
47
|
+
"react-dom": "~19.2.3",
|
|
48
|
+
"vite": "^7.1.11",
|
|
49
|
+
"@dxos/random": "0.8.4-main.74a063c4e0",
|
|
50
|
+
"@dxos/react-ui": "0.8.4-main.74a063c4e0",
|
|
51
|
+
"@dxos/react-ui-search": "0.8.4-main.74a063c4e0",
|
|
52
|
+
"@dxos/storybook-utils": "0.8.4-main.74a063c4e0",
|
|
53
|
+
"@dxos/ui-theme": "0.8.4-main.74a063c4e0"
|
|
50
54
|
},
|
|
51
55
|
"peerDependencies": {
|
|
52
|
-
"react": "
|
|
53
|
-
"react-dom": "
|
|
54
|
-
"@dxos/react-ui": "0.8.4-main.
|
|
55
|
-
"@dxos/
|
|
56
|
+
"react": "~19.2.3",
|
|
57
|
+
"react-dom": "~19.2.3",
|
|
58
|
+
"@dxos/react-ui": "0.8.4-main.74a063c4e0",
|
|
59
|
+
"@dxos/ui-theme": "0.8.4-main.74a063c4e0"
|
|
56
60
|
},
|
|
57
61
|
"publishConfig": {
|
|
58
62
|
"access": "public"
|
|
@@ -47,7 +47,7 @@ const DefaultStory = (props: CellEditorProps) => {
|
|
|
47
47
|
<div className='text-sm'>
|
|
48
48
|
Last action: <span className='font-mono'>{lastAction}</span>
|
|
49
49
|
</div>
|
|
50
|
-
<div className='relative border border-separator
|
|
50
|
+
<div className='relative border border-separator h-[100px] w-[300px]'>
|
|
51
51
|
<CellEditor
|
|
52
52
|
value={value}
|
|
53
53
|
extensions={extensions}
|
|
@@ -70,7 +70,7 @@ const meta = {
|
|
|
70
70
|
title: 'ui/react-ui-grid/CellEditor',
|
|
71
71
|
component: CellEditor,
|
|
72
72
|
render: DefaultStory,
|
|
73
|
-
decorators: [withTheme],
|
|
73
|
+
decorators: [withTheme()],
|
|
74
74
|
parameters: {
|
|
75
75
|
layout: 'centered',
|
|
76
76
|
},
|
|
@@ -8,15 +8,14 @@ import { EditorView, keymap } from '@codemirror/view';
|
|
|
8
8
|
import React, { type KeyboardEvent } from 'react';
|
|
9
9
|
|
|
10
10
|
import { useThemeContext } from '@dxos/react-ui';
|
|
11
|
+
import { type UseTextEditorProps, useTextEditor } from '@dxos/react-ui-editor';
|
|
11
12
|
import {
|
|
12
13
|
type ThemeExtensionsOptions,
|
|
13
|
-
type UseTextEditorProps,
|
|
14
14
|
createBasicExtensions,
|
|
15
15
|
createThemeExtensions,
|
|
16
16
|
filterChars,
|
|
17
|
-
|
|
18
|
-
} from '@dxos/
|
|
19
|
-
import { mx } from '@dxos/react-ui-theme';
|
|
17
|
+
} from '@dxos/ui-editor';
|
|
18
|
+
import { mx } from '@dxos/ui-theme';
|
|
20
19
|
|
|
21
20
|
import { type GridEditBox } from '../Grid';
|
|
22
21
|
|
|
@@ -123,7 +122,7 @@ export type CellEditorProps = {
|
|
|
123
122
|
} & Pick<UseTextEditorProps, 'autoFocus'> &
|
|
124
123
|
Pick<ThemeExtensionsOptions, 'slots'>;
|
|
125
124
|
|
|
126
|
-
export const CellEditor = ({ value, extensions, box, gridId,
|
|
125
|
+
export const CellEditor = ({ value, extensions, box, gridId, autoFocus, slots, onBlur }: CellEditorProps) => {
|
|
127
126
|
const { themeMode } = useThemeContext();
|
|
128
127
|
const { parentRef } = useTextEditor(() => {
|
|
129
128
|
return {
|
|
@@ -145,18 +144,18 @@ export const CellEditor = ({ value, extensions, box, gridId, onBlur, autoFocus,
|
|
|
145
144
|
slots: {
|
|
146
145
|
editor: {
|
|
147
146
|
className: mx(
|
|
148
|
-
'
|
|
147
|
+
'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)',
|
|
149
148
|
slots?.editor?.className,
|
|
150
149
|
),
|
|
151
150
|
},
|
|
152
151
|
scroll: {
|
|
153
152
|
className: mx(
|
|
154
|
-
'
|
|
153
|
+
'overflow-x-hidden! !py-[max(0,calc(var(--dx-grid-cell-editor-padding-block)-1px))] pe-0! !pl-(--dx-grid-cell-editor-padding-inline)',
|
|
155
154
|
slots?.scroll?.className,
|
|
156
155
|
),
|
|
157
156
|
},
|
|
158
157
|
content: {
|
|
159
|
-
className: mx('
|
|
158
|
+
className: mx('break-normal!', slots?.content?.className),
|
|
160
159
|
},
|
|
161
160
|
},
|
|
162
161
|
}),
|
|
@@ -174,7 +173,7 @@ export const CellEditor = ({ value, extensions, box, gridId, onBlur, autoFocus,
|
|
|
174
173
|
insetBlockStart: box?.insetBlockStart ?? '0px',
|
|
175
174
|
minInlineSize: box?.inlineSize ?? '180px',
|
|
176
175
|
minBlockSize: box?.blockSize ?? '30px',
|
|
177
|
-
...{ '--dx-
|
|
176
|
+
...{ '--dx-grid-cell-width': `${box?.inlineSize ?? 200}px` },
|
|
178
177
|
}}
|
|
179
178
|
{...(gridId && { 'data-grid': gridId })}
|
|
180
179
|
/>
|
|
@@ -7,15 +7,15 @@ import React, { type MouseEvent, type MutableRefObject, useCallback, useRef, use
|
|
|
7
7
|
|
|
8
8
|
import { defaultRowSize } from '@dxos/lit-grid';
|
|
9
9
|
import { type DxGridPlaneCells } from '@dxos/lit-grid';
|
|
10
|
-
import {
|
|
10
|
+
import { random } from '@dxos/random';
|
|
11
11
|
import { DropdownMenu } from '@dxos/react-ui';
|
|
12
|
-
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
13
12
|
import { toPlaneCellIndex } from '@dxos/react-ui-grid';
|
|
14
|
-
import { Combobox, type ComboboxRootProps } from '@dxos/react-ui-
|
|
13
|
+
import { Combobox, type ComboboxRootProps, useSearchListResults } from '@dxos/react-ui-search';
|
|
14
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
15
15
|
|
|
16
16
|
import { Grid, type GridContentProps, type GridEditing, type GridRootProps } from './Grid';
|
|
17
17
|
|
|
18
|
-
const storybookItems =
|
|
18
|
+
const storybookItems = random.helpers.uniqueArray(random.commerce.productName, 16);
|
|
19
19
|
|
|
20
20
|
type GridStoryProps = GridContentProps & Pick<GridRootProps, 'onEditingChange'>;
|
|
21
21
|
|
|
@@ -87,24 +87,34 @@ const GridStory = ({ initialCells, ...props }: GridStoryProps) => {
|
|
|
87
87
|
onValueChange={setMultiselectValue}
|
|
88
88
|
>
|
|
89
89
|
<Combobox.VirtualTrigger virtualRef={triggerRef} />
|
|
90
|
-
<
|
|
91
|
-
<Combobox.Input placeholder='Search...' />
|
|
92
|
-
<Combobox.List>
|
|
93
|
-
{storybookItems.map((value) => (
|
|
94
|
-
<Combobox.Item key={value}>{value}</Combobox.Item>
|
|
95
|
-
))}
|
|
96
|
-
</Combobox.List>
|
|
97
|
-
<Combobox.Arrow />
|
|
98
|
-
</Combobox.Content>
|
|
90
|
+
<ComboboxContentWithFiltering />
|
|
99
91
|
</Combobox.Root>
|
|
100
92
|
</div>
|
|
101
93
|
);
|
|
102
94
|
};
|
|
103
95
|
|
|
96
|
+
const ComboboxContentWithFiltering = () => {
|
|
97
|
+
const { results, handleSearch } = useSearchListResults({
|
|
98
|
+
items: storybookItems,
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
return (
|
|
102
|
+
<Combobox.Content onSearch={handleSearch}>
|
|
103
|
+
<Combobox.Input placeholder='Search...' />
|
|
104
|
+
<Combobox.List>
|
|
105
|
+
{results.map((value) => (
|
|
106
|
+
<Combobox.Item key={value} value={value} label={value} />
|
|
107
|
+
))}
|
|
108
|
+
</Combobox.List>
|
|
109
|
+
<Combobox.Arrow />
|
|
110
|
+
</Combobox.Content>
|
|
111
|
+
);
|
|
112
|
+
};
|
|
113
|
+
|
|
104
114
|
const meta = {
|
|
105
115
|
title: 'ui/react-ui-grid/Grid',
|
|
106
116
|
component: GridStory,
|
|
107
|
-
decorators: [withTheme, withLayout({
|
|
117
|
+
decorators: [withTheme(), withLayout({ layout: 'column' })],
|
|
108
118
|
parameters: {
|
|
109
119
|
layout: 'fullscreen',
|
|
110
120
|
},
|
|
@@ -145,7 +155,7 @@ export const Basic: Story = {
|
|
|
145
155
|
'1,1': {
|
|
146
156
|
value: 'Demo decoration',
|
|
147
157
|
accessoryHtml: `
|
|
148
|
-
<button class="dx-button
|
|
158
|
+
<button class="dx-button w-6 px-0.5 min-h-0 absolute inset-y-1 right-1" data-story-action="menu">
|
|
149
159
|
<svg><use href="/icons.svg#ph--arrow-right--regular"/></svg>
|
|
150
160
|
</button>
|
|
151
161
|
`,
|
|
@@ -189,7 +199,7 @@ export const Calendar: Story = {
|
|
|
189
199
|
// TODO(burdon): Formatting changes when cell is selected.
|
|
190
200
|
cells[toPlaneCellIndex({ col, row })] = {
|
|
191
201
|
readonly: true,
|
|
192
|
-
accessoryHtml: '<div class="flex
|
|
202
|
+
accessoryHtml: '<div class="flex h-full w-full justify-center items-center overflow-hidden">0</div>',
|
|
193
203
|
className: '',
|
|
194
204
|
};
|
|
195
205
|
}
|
|
@@ -199,8 +209,8 @@ export const Calendar: Story = {
|
|
|
199
209
|
},
|
|
200
210
|
},
|
|
201
211
|
render: (args) => (
|
|
202
|
-
<div className='
|
|
203
|
-
<div className='
|
|
212
|
+
<div className='h-full flex justify-center'>
|
|
213
|
+
<div className='h-full w-[288px] border-x border-separator'>
|
|
204
214
|
<GridStory {...args} />
|
|
205
215
|
</div>
|
|
206
216
|
</div>
|
package/src/Grid/Grid.tsx
CHANGED
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@dxos/lit-grid/dx-grid.pcss';
|
|
6
|
-
|
|
7
5
|
import { type EventName, createComponent } from '@lit/react';
|
|
8
6
|
import { type Scope, createContextScope } from '@radix-ui/react-context';
|
|
9
7
|
import { useControllableState } from '@radix-ui/react-use-controllable-state';
|
|
@@ -16,6 +14,7 @@ import React, {
|
|
|
16
14
|
useState,
|
|
17
15
|
} from 'react';
|
|
18
16
|
|
|
17
|
+
import '@dxos/lit-grid/dx-grid.pcss';
|
|
19
18
|
import { type DxAxisResize, type DxEditRequest, type DxGridCellsSelect, DxGrid as NaturalDxGrid } from '@dxos/lit-grid';
|
|
20
19
|
|
|
21
20
|
type DxGridElement = NaturalDxGrid;
|
|
@@ -63,20 +62,23 @@ const [createGridContext, createGridScope] = createContextScope(GRID_NAME, []);
|
|
|
63
62
|
const [GridProvider, useGridContext] = createGridContext<GridContextValue>(GRID_NAME);
|
|
64
63
|
|
|
65
64
|
type GridRootProps = PropsWithChildren<
|
|
66
|
-
{
|
|
65
|
+
{
|
|
66
|
+
id: string;
|
|
67
|
+
} & Partial<{
|
|
67
68
|
editing: GridEditing;
|
|
68
69
|
defaultEditing: GridEditing;
|
|
69
70
|
onEditingChange: (nextEditing: GridEditing) => void;
|
|
70
71
|
}>
|
|
71
72
|
>;
|
|
72
73
|
|
|
74
|
+
// TODO(burdon): Make headless.
|
|
73
75
|
const GridRoot = ({
|
|
76
|
+
__gridScope,
|
|
77
|
+
children,
|
|
74
78
|
id,
|
|
75
79
|
editing: propsEditing,
|
|
76
80
|
defaultEditing,
|
|
77
81
|
onEditingChange,
|
|
78
|
-
children,
|
|
79
|
-
__gridScope,
|
|
80
82
|
}: GridScopedProps<GridRootProps>) => {
|
|
81
83
|
const [editing = null, setEditing] = useControllableState({
|
|
82
84
|
prop: propsEditing,
|
|
@@ -150,12 +152,12 @@ GridContent.displayName = GRID_CONTENT_NAME;
|
|
|
150
152
|
// Fragments
|
|
151
153
|
//
|
|
152
154
|
|
|
153
|
-
// NOTE(Zan): These fragments add border to
|
|
155
|
+
// NOTE(Zan): These fragments add border to w-end and h-end of the grid using pseudo-elements.
|
|
154
156
|
// These are offset by 1px to avoid double borders in planks.
|
|
155
157
|
const gridSeparatorInlineEnd =
|
|
156
|
-
'[&>.dx-grid]:relative [&>.dx-grid]:after:absolute [&>.dx-grid]:after:inset-
|
|
158
|
+
'[&>.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';
|
|
157
159
|
const gridSeparatorBlockEnd =
|
|
158
|
-
'[&>.dx-grid]:relative [&>.dx-grid]:before:absolute [&>.dx-grid]:before:inset-
|
|
160
|
+
'[&>.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';
|
|
159
161
|
|
|
160
162
|
//
|
|
161
163
|
// Exports
|