@@ -8,7 +8,6 @@ import clsx from 'clsx';
8
8
*/
9
9
import {
10
10
Composite ,
11
- __experimentalGrid as Grid ,
12
11
__experimentalVStack as VStack ,
13
12
CheckboxControl ,
14
13
Spinner ,
@@ -24,7 +23,8 @@ import type {
24
23
ViewBaseProps ,
25
24
} from '../../types' ;
26
25
import type { SetSelection } from '../../private-types' ;
27
- import { useUpdatedPreviewSizeOnViewportChange } from '../../dataviews-layouts/grid/preview-size-picker' ;
26
+ import { useContext } from '@wordpress/element' ;
27
+ import DataViewsContext from '../dataviews-context' ;
28
28
29
29
type DataPickerGridLayoutProps < Item > = {
30
30
multiple : boolean ;
@@ -54,6 +54,8 @@ export default function DataPickerGridLayout< Item >( {
54
54
setSize,
55
55
startPosition,
56
56
} : DataPickerGridLayoutProps < Item > ) {
57
+ const { resizeObserverRef } = useContext ( DataViewsContext ) ;
58
+
57
59
const hasData = ! ! data ?. length ;
58
60
59
61
const titleField = fields . find (
@@ -66,37 +68,39 @@ export default function DataPickerGridLayout< Item >( {
66
68
( field ) => field . id === view ?. descriptionField
67
69
) ;
68
70
69
- const updatedPreviewSize = useUpdatedPreviewSizeOnViewportChange ( ) ;
70
- const usedPreviewSize = updatedPreviewSize || view . layout ?. previewSize ;
71
- const gridStyle = usedPreviewSize
72
- ? {
73
- gridTemplateColumns : `repeat(${ usedPreviewSize } , minmax(0, 1fr))` ,
74
- }
75
- : { } ;
71
+ const usedPreviewSize = view . layout ?. previewSize ;
72
+ /*
73
+ * This is the maximum width that an image can achieve in the grid. The reasoning is:
74
+ * The biggest min image width available is 430px (see /dataviews-layouts/grid/preview-size-picker.tsx).
75
+ * Because the grid is responsive, once there is room for another column, the images shrink to accommodate it.
76
+ * So each image will never grow past 2*430px plus a little more to account for the gaps.
77
+ */
78
+ const size = '900px' ;
76
79
77
80
return (
78
81
< >
79
82
{ hasData && (
80
83
< Composite
81
84
virtualFocus
82
85
orientation = "horizontal"
83
- render = { ( props ) => (
84
- < Grid
85
- { ...props }
86
- as = "ul"
86
+ render = {
87
+ < ul
88
+ ref = {
89
+ resizeObserverRef as React . RefObject < HTMLUListElement >
90
+ }
91
+ style = { {
92
+ gridTemplateColumns :
93
+ usedPreviewSize &&
94
+ `repeat(auto-fill, minmax(${ usedPreviewSize } px, 1fr))` ,
95
+ } }
87
96
className = "dataviews-picker-grid"
88
97
aria-label = { label }
89
98
role = "listbox"
90
99
aria-multiselectable = { multiple }
91
100
tabIndex = { 0 }
92
- gap = { 8 }
93
- columns = { 2 }
94
- alignment = "top"
95
101
aria-busy = { isLoading }
96
- style = { gridStyle }
97
- children = { props . children }
98
102
/>
99
- ) }
103
+ }
100
104
>
101
105
{ data . map ( ( item , index ) => {
102
106
const position = startPosition + index ;
@@ -119,6 +123,9 @@ export default function DataPickerGridLayout< Item >( {
119
123
descriptionField = { descriptionField }
120
124
setSize = { setSize }
121
125
position = { position }
126
+ config = { {
127
+ sizes : size ,
128
+ } }
122
129
/>
123
130
) ;
124
131
} ) }
@@ -154,6 +161,9 @@ type GridItemProps< Item > = {
154
161
descriptionField : NormalizedField < Item > | undefined ;
155
162
setSize : number ;
156
163
position : number ;
164
+ config : {
165
+ sizes : string ;
166
+ } ;
157
167
} ;
158
168
159
169
function GridItem < Item > ( {
@@ -169,11 +179,16 @@ function GridItem< Item >( {
169
179
descriptionField,
170
180
setSize,
171
181
position,
182
+ config,
172
183
} : GridItemProps < Item > ) {
173
184
const { showTitle = true , showMedia = true , showDescription = true } = view ;
174
185
const renderedMediaField =
175
186
showMedia && mediaField ?. render ? (
176
- < mediaField . render item = { item } field = { mediaField } />
187
+ < mediaField . render
188
+ item = { item }
189
+ field = { mediaField }
190
+ config = { config }
191
+ />
177
192
) : null ;
178
193
const renderedTitleField =
179
194
showTitle && titleField ?. render ? (
0 commit comments