@wordpress/dataviews 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/CHANGELOG.md +13 -5
  2. package/build/bulk-actions-toolbar.js +182 -0
  3. package/build/bulk-actions-toolbar.js.map +1 -0
  4. package/build/bulk-actions.js +8 -8
  5. package/build/bulk-actions.js.map +1 -1
  6. package/build/constants.js +1 -26
  7. package/build/constants.js.map +1 -1
  8. package/build/dataviews.js +13 -5
  9. package/build/dataviews.js.map +1 -1
  10. package/build/filter-and-sort-data-view.js +72 -65
  11. package/build/filter-and-sort-data-view.js.map +1 -1
  12. package/build/filter-summary.js +3 -3
  13. package/build/filter-summary.js.map +1 -1
  14. package/build/index.js +2 -2
  15. package/build/index.js.map +1 -1
  16. package/build/item-actions.js +41 -22
  17. package/build/item-actions.js.map +1 -1
  18. package/build/layouts.js +38 -0
  19. package/build/layouts.js.map +1 -0
  20. package/build/lock-unlock.js.map +1 -1
  21. package/build/normalize-fields.js +7 -2
  22. package/build/normalize-fields.js.map +1 -1
  23. package/build/pagination.js +13 -7
  24. package/build/pagination.js.map +1 -1
  25. package/build/single-selection-checkbox.js +4 -0
  26. package/build/single-selection-checkbox.js.map +1 -1
  27. package/build/types.js +6 -0
  28. package/build/types.js.map +1 -0
  29. package/build/view-actions.js +2 -1
  30. package/build/view-actions.js.map +1 -1
  31. package/build/view-grid.js +9 -10
  32. package/build/view-grid.js.map +1 -1
  33. package/build/view-list.js +134 -21
  34. package/build/view-list.js.map +1 -1
  35. package/build/view-table.js +9 -9
  36. package/build/view-table.js.map +1 -1
  37. package/build-module/bulk-actions-toolbar.js +175 -0
  38. package/build-module/bulk-actions-toolbar.js.map +1 -0
  39. package/build-module/bulk-actions.js +8 -8
  40. package/build-module/bulk-actions.js.map +1 -1
  41. package/build-module/constants.js +1 -25
  42. package/build-module/constants.js.map +1 -1
  43. package/build-module/dataviews.js +13 -5
  44. package/build-module/dataviews.js.map +1 -1
  45. package/build-module/filter-and-sort-data-view.js +72 -65
  46. package/build-module/filter-and-sort-data-view.js.map +1 -1
  47. package/build-module/filter-summary.js +3 -3
  48. package/build-module/filter-summary.js.map +1 -1
  49. package/build-module/index.js +1 -1
  50. package/build-module/index.js.map +1 -1
  51. package/build-module/item-actions.js +40 -24
  52. package/build-module/item-actions.js.map +1 -1
  53. package/build-module/layouts.js +30 -0
  54. package/build-module/layouts.js.map +1 -0
  55. package/build-module/lock-unlock.js.map +1 -1
  56. package/build-module/normalize-fields.js +7 -2
  57. package/build-module/normalize-fields.js.map +1 -1
  58. package/build-module/pagination.js +14 -7
  59. package/build-module/pagination.js.map +1 -1
  60. package/build-module/single-selection-checkbox.js +5 -0
  61. package/build-module/single-selection-checkbox.js.map +1 -1
  62. package/build-module/types.js +2 -0
  63. package/build-module/types.js.map +1 -0
  64. package/build-module/view-actions.js +2 -1
  65. package/build-module/view-actions.js.map +1 -1
  66. package/build-module/view-grid.js +9 -10
  67. package/build-module/view-grid.js.map +1 -1
  68. package/build-module/view-list.js +135 -23
  69. package/build-module/view-list.js.map +1 -1
  70. package/build-module/view-table.js +9 -9
  71. package/build-module/view-table.js.map +1 -1
  72. package/build-style/style-rtl.css +82 -44
  73. package/build-style/style.css +82 -44
  74. package/build-types/add-filter.d.ts +8 -0
  75. package/build-types/add-filter.d.ts.map +1 -0
  76. package/build-types/bulk-actions-toolbar.d.ts +8 -0
  77. package/build-types/bulk-actions-toolbar.d.ts.map +1 -0
  78. package/build-types/bulk-actions.d.ts +14 -0
  79. package/build-types/bulk-actions.d.ts.map +1 -0
  80. package/build-types/constants.d.ts +45 -0
  81. package/build-types/constants.d.ts.map +1 -0
  82. package/build-types/dataviews.d.ts +15 -0
  83. package/build-types/dataviews.d.ts.map +1 -0
  84. package/build-types/dropdown-menu-helper.d.ts +6 -0
  85. package/build-types/dropdown-menu-helper.d.ts.map +1 -0
  86. package/build-types/filter-and-sort-data-view.d.ts +18 -0
  87. package/build-types/filter-and-sort-data-view.d.ts.map +1 -0
  88. package/build-types/filter-summary.d.ts +6 -0
  89. package/build-types/filter-summary.d.ts.map +1 -0
  90. package/build-types/filters.d.ts +3 -0
  91. package/build-types/filters.d.ts.map +1 -0
  92. package/build-types/index.d.ts +4 -0
  93. package/build-types/index.d.ts.map +1 -0
  94. package/build-types/item-actions.d.ts +37 -0
  95. package/build-types/item-actions.d.ts.map +1 -0
  96. package/build-types/layouts.d.ts +20 -0
  97. package/build-types/layouts.d.ts.map +1 -0
  98. package/build-types/lock-unlock.d.ts +2 -0
  99. package/build-types/lock-unlock.d.ts.map +1 -0
  100. package/build-types/normalize-fields.d.ts +12 -0
  101. package/build-types/normalize-fields.d.ts.map +1 -0
  102. package/build-types/pagination.d.ts +16 -0
  103. package/build-types/pagination.d.ts.map +1 -0
  104. package/build-types/reset-filters.d.ts +6 -0
  105. package/build-types/reset-filters.d.ts.map +1 -0
  106. package/build-types/search-widget.d.ts +2 -0
  107. package/build-types/search-widget.d.ts.map +1 -0
  108. package/build-types/search.d.ts +3 -0
  109. package/build-types/search.d.ts.map +1 -0
  110. package/build-types/single-selection-checkbox.d.ts +17 -0
  111. package/build-types/single-selection-checkbox.d.ts.map +1 -0
  112. package/build-types/stories/fixtures.d.ts +114 -0
  113. package/build-types/stories/fixtures.d.ts.map +1 -0
  114. package/build-types/stories/index.story.d.ts +15 -0
  115. package/build-types/stories/index.story.d.ts.map +1 -0
  116. package/build-types/types.d.ts +254 -0
  117. package/build-types/types.d.ts.map +1 -0
  118. package/build-types/utils.d.ts +2 -0
  119. package/build-types/utils.d.ts.map +1 -0
  120. package/build-types/view-actions.d.ts +3 -0
  121. package/build-types/view-actions.d.ts.map +1 -0
  122. package/build-types/view-grid.d.ts +15 -0
  123. package/build-types/view-grid.d.ts.map +1 -0
  124. package/build-types/view-list.d.ts +16 -0
  125. package/build-types/view-list.d.ts.map +1 -0
  126. package/build-types/view-table.d.ts +14 -0
  127. package/build-types/view-table.d.ts.map +1 -0
  128. package/package.json +12 -12
  129. package/src/bulk-actions-toolbar.js +244 -0
  130. package/src/{bulk-actions.js → bulk-actions.tsx} +73 -17
  131. package/src/{constants.js → constants.ts} +1 -35
  132. package/src/dataviews.js +16 -4
  133. package/src/filter-and-sort-data-view.ts +169 -0
  134. package/src/filter-summary.js +3 -3
  135. package/src/index.js +1 -1
  136. package/src/{item-actions.js → item-actions.tsx} +112 -28
  137. package/src/layouts.js +39 -0
  138. package/src/normalize-fields.ts +25 -0
  139. package/src/{pagination.js → pagination.tsx} +28 -7
  140. package/src/{single-selection-checkbox.js → single-selection-checkbox.tsx} +17 -2
  141. package/src/stories/fixtures.js +0 -2
  142. package/src/style.scss +100 -44
  143. package/src/types.ts +314 -0
  144. package/src/view-actions.js +2 -1
  145. package/src/{view-grid.js → view-grid.tsx} +45 -16
  146. package/src/view-list.tsx +421 -0
  147. package/src/view-table.js +8 -8
  148. package/tsconfig.json +22 -0
  149. package/tsconfig.tsbuildinfo +1 -0
  150. package/src/filter-and-sort-data-view.js +0 -154
  151. package/src/normalize-fields.js +0 -17
  152. package/src/view-list.js +0 -207
  153. /package/src/{lock-unlock.js → lock-unlock.ts} +0 -0
@@ -1,3 +1,8 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import type { MouseEventHandler, ReactElement } from 'react';
5
+
1
6
  /**
2
7
  * WordPress dependencies
3
8
  */
@@ -15,6 +20,7 @@ import { moreVertical } from '@wordpress/icons';
15
20
  * Internal dependencies
16
21
  */
17
22
  import { unlock } from './lock-unlock';
23
+ import type { Action, ActionModal as ActionModalType, AnyItem } from './types';
18
24
 
19
25
  const {
20
26
  DropdownMenuV2: DropdownMenu,
@@ -24,7 +30,50 @@ const {
24
30
  kebabCase,
25
31
  } = unlock( componentsPrivateApis );
26
32
 
27
- function ButtonTrigger( { action, onClick } ) {
33
+ interface ButtonTriggerProps< Item extends AnyItem > {
34
+ action: Action< Item >;
35
+ onClick: MouseEventHandler;
36
+ }
37
+
38
+ interface DropdownMenuItemTriggerProps< Item extends AnyItem > {
39
+ action: Action< Item >;
40
+ onClick: MouseEventHandler;
41
+ }
42
+
43
+ interface ActionModalProps< Item extends AnyItem > {
44
+ action: ActionModalType< Item >;
45
+ items: Item[];
46
+ closeModal?: () => void;
47
+ }
48
+
49
+ interface ActionWithModalProps< Item extends AnyItem >
50
+ extends ActionModalProps< Item > {
51
+ ActionTrigger: (
52
+ props: ButtonTriggerProps< Item > | DropdownMenuItemTriggerProps< Item >
53
+ ) => ReactElement;
54
+ isBusy?: boolean;
55
+ }
56
+
57
+ interface ActionsDropdownMenuGroupProps< Item extends AnyItem > {
58
+ actions: Action< Item >[];
59
+ item: Item;
60
+ }
61
+
62
+ interface ItemActionsProps< Item extends AnyItem > {
63
+ item: Item;
64
+ actions: Action< Item >[];
65
+ isCompact: boolean;
66
+ }
67
+
68
+ interface CompactItemActionsProps< Item extends AnyItem > {
69
+ item: Item;
70
+ actions: Action< Item >[];
71
+ }
72
+
73
+ function ButtonTrigger< Item extends AnyItem >( {
74
+ action,
75
+ onClick,
76
+ }: ButtonTriggerProps< Item > ) {
28
77
  return (
29
78
  <Button
30
79
  label={ action.label }
@@ -36,58 +85,86 @@ function ButtonTrigger( { action, onClick } ) {
36
85
  );
37
86
  }
38
87
 
39
- function DropdownMenuItemTrigger( { action, onClick } ) {
88
+ function DropdownMenuItemTrigger< Item extends AnyItem >( {
89
+ action,
90
+ onClick,
91
+ }: DropdownMenuItemTriggerProps< Item > ) {
40
92
  return (
41
93
  <DropdownMenuItem
42
94
  onClick={ onClick }
43
- hideOnClick={ ! action.RenderModal }
95
+ hideOnClick={ ! ( 'RenderModal' in action ) }
44
96
  >
45
97
  <DropdownMenuItemLabel>{ action.label }</DropdownMenuItemLabel>
46
98
  </DropdownMenuItem>
47
99
  );
48
100
  }
49
101
 
50
- function ActionWithModal( { action, item, ActionTrigger } ) {
102
+ export function ActionModal< Item extends AnyItem >( {
103
+ action,
104
+ items,
105
+ closeModal,
106
+ }: ActionModalProps< Item > ) {
107
+ return (
108
+ <Modal
109
+ title={ action.modalHeader || action.label }
110
+ __experimentalHideHeader={ !! action.hideModalHeader }
111
+ onRequestClose={ closeModal ?? ( () => {} ) }
112
+ overlayClassName={ `dataviews-action-modal dataviews-action-modal__${ kebabCase(
113
+ action.id
114
+ ) }` }
115
+ >
116
+ <action.RenderModal
117
+ items={ items }
118
+ closeModal={ closeModal }
119
+ onActionStart={ action.onActionStart }
120
+ onActionPerformed={ action.onActionPerformed }
121
+ />
122
+ </Modal>
123
+ );
124
+ }
125
+
126
+ export function ActionWithModal< Item extends AnyItem >( {
127
+ action,
128
+ items,
129
+ ActionTrigger,
130
+ isBusy,
131
+ }: ActionWithModalProps< Item > ) {
51
132
  const [ isModalOpen, setIsModalOpen ] = useState( false );
52
133
  const actionTriggerProps = {
53
134
  action,
54
- onClick: () => setIsModalOpen( true ),
135
+ onClick: () => {
136
+ setIsModalOpen( true );
137
+ },
138
+ items,
139
+ isBusy,
55
140
  };
56
- const { RenderModal, hideModalHeader } = action;
57
141
  return (
58
142
  <>
59
143
  <ActionTrigger { ...actionTriggerProps } />
60
144
  { isModalOpen && (
61
- <Modal
62
- title={ action.modalHeader || action.label }
63
- __experimentalHideHeader={ !! hideModalHeader }
64
- onRequestClose={ () => {
65
- setIsModalOpen( false );
66
- } }
67
- overlayClassName={ `dataviews-action-modal dataviews-action-modal__${ kebabCase(
68
- action.id
69
- ) }` }
70
- >
71
- <RenderModal
72
- items={ [ item ] }
73
- closeModal={ () => setIsModalOpen( false ) }
74
- />
75
- </Modal>
145
+ <ActionModal
146
+ action={ action }
147
+ items={ items }
148
+ closeModal={ () => setIsModalOpen( false ) }
149
+ />
76
150
  ) }
77
151
  </>
78
152
  );
79
153
  }
80
154
 
81
- function ActionsDropdownMenuGroup( { actions, item } ) {
155
+ export function ActionsDropdownMenuGroup< Item extends AnyItem >( {
156
+ actions,
157
+ item,
158
+ }: ActionsDropdownMenuGroupProps< Item > ) {
82
159
  return (
83
160
  <DropdownMenuGroup>
84
161
  { actions.map( ( action ) => {
85
- if ( !! action.RenderModal ) {
162
+ if ( 'RenderModal' in action ) {
86
163
  return (
87
164
  <ActionWithModal
88
165
  key={ action.id }
89
166
  action={ action }
90
- item={ item }
167
+ items={ [ item ] }
91
168
  ActionTrigger={ DropdownMenuItemTrigger }
92
169
  />
93
170
  );
@@ -104,7 +181,11 @@ function ActionsDropdownMenuGroup( { actions, item } ) {
104
181
  );
105
182
  }
106
183
 
107
- export default function ItemActions( { item, actions, isCompact } ) {
184
+ export default function ItemActions< Item extends AnyItem >( {
185
+ item,
186
+ actions,
187
+ isCompact,
188
+ }: ItemActionsProps< Item > ) {
108
189
  const { primaryActions, eligibleActions } = useMemo( () => {
109
190
  // If an action is eligible for all items, doesn't need
110
191
  // to provide the `isEligible` function.
@@ -134,12 +215,12 @@ export default function ItemActions( { item, actions, isCompact } ) {
134
215
  >
135
216
  { !! primaryActions.length &&
136
217
  primaryActions.map( ( action ) => {
137
- if ( !! action.RenderModal ) {
218
+ if ( 'RenderModal' in action ) {
138
219
  return (
139
220
  <ActionWithModal
140
221
  key={ action.id }
141
222
  action={ action }
142
- item={ item }
223
+ items={ [ item ] }
143
224
  ActionTrigger={ ButtonTrigger }
144
225
  />
145
226
  );
@@ -157,7 +238,10 @@ export default function ItemActions( { item, actions, isCompact } ) {
157
238
  );
158
239
  }
159
240
 
160
- function CompactItemActions( { item, actions } ) {
241
+ function CompactItemActions< Item extends AnyItem >( {
242
+ item,
243
+ actions,
244
+ }: CompactItemActionsProps< Item > ) {
161
245
  return (
162
246
  <DropdownMenu
163
247
  trigger={
package/src/layouts.js ADDED
@@ -0,0 +1,39 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __, isRTL } from '@wordpress/i18n';
5
+ import {
6
+ blockTable,
7
+ category,
8
+ formatListBullets,
9
+ formatListBulletsRTL,
10
+ } from '@wordpress/icons';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import ViewTable from './view-table';
16
+ import ViewGrid from './view-grid';
17
+ import ViewList from './view-list';
18
+ import { LAYOUT_GRID, LAYOUT_LIST, LAYOUT_TABLE } from './constants';
19
+
20
+ export const VIEW_LAYOUTS = [
21
+ {
22
+ type: LAYOUT_TABLE,
23
+ label: __( 'Table' ),
24
+ component: ViewTable,
25
+ icon: blockTable,
26
+ },
27
+ {
28
+ type: LAYOUT_GRID,
29
+ label: __( 'Grid' ),
30
+ component: ViewGrid,
31
+ icon: category,
32
+ },
33
+ {
34
+ type: LAYOUT_LIST,
35
+ label: __( 'List' ),
36
+ component: ViewList,
37
+ icon: isRTL() ? formatListBulletsRTL : formatListBullets,
38
+ },
39
+ ];
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import type { Field, AnyItem, NormalizedField } from './types';
5
+
6
+ /**
7
+ * Apply default values and normalize the fields config.
8
+ *
9
+ * @param fields Fields config.
10
+ * @return Normalized fields config.
11
+ */
12
+ export function normalizeFields< Item extends AnyItem >(
13
+ fields: Field< Item >[]
14
+ ): NormalizedField< Item >[] {
15
+ return fields.map( ( field ) => {
16
+ const getValue = field.getValue || ( ( { item } ) => item[ field.id ] );
17
+
18
+ return {
19
+ ...field,
20
+ header: field.header || field.id,
21
+ getValue,
22
+ render: field.render || getValue,
23
+ };
24
+ } );
25
+ }
@@ -10,14 +10,29 @@ import { createInterpolateElement, memo } from '@wordpress/element';
10
10
  import { sprintf, __, _x } from '@wordpress/i18n';
11
11
  import { chevronRight, chevronLeft } from '@wordpress/icons';
12
12
 
13
+ /**
14
+ * Internal dependencies
15
+ */
16
+ import type { View } from './types';
17
+
18
+ interface PaginationProps {
19
+ view: View;
20
+ onChangeView: ( view: View ) => void;
21
+ paginationInfo: {
22
+ totalItems: number;
23
+ totalPages: number;
24
+ };
25
+ }
26
+
13
27
  const Pagination = memo( function Pagination( {
14
28
  view,
15
29
  onChangeView,
16
30
  paginationInfo: { totalItems = 0, totalPages },
17
- } ) {
31
+ }: PaginationProps ) {
18
32
  if ( ! totalItems || ! totalPages ) {
19
33
  return null;
20
34
  }
35
+ const currentPage = view.page ?? 1;
21
36
  return (
22
37
  !! totalItems &&
23
38
  totalPages !== 1 && (
@@ -43,12 +58,15 @@ const Pagination = memo( function Pagination( {
43
58
  CurrentPageControl: (
44
59
  <SelectControl
45
60
  aria-label={ __( 'Current page' ) }
46
- value={ view.page }
61
+ value={ view.page?.toString() }
47
62
  options={ Array.from(
48
63
  Array( totalPages )
49
64
  ).map( ( _, i ) => {
50
65
  const page = i + 1;
51
- return { value: page, label: page };
66
+ return {
67
+ value: page.toString(),
68
+ label: page.toString(),
69
+ };
52
70
  } ) }
53
71
  onChange={ ( newValue ) => {
54
72
  onChangeView( {
@@ -66,9 +84,12 @@ const Pagination = memo( function Pagination( {
66
84
  <HStack expanded={ false } spacing={ 1 }>
67
85
  <Button
68
86
  onClick={ () =>
69
- onChangeView( { ...view, page: view.page - 1 } )
87
+ onChangeView( {
88
+ ...view,
89
+ page: currentPage - 1,
90
+ } )
70
91
  }
71
- disabled={ view.page === 1 }
92
+ disabled={ currentPage === 1 }
72
93
  __experimentalIsFocusable
73
94
  label={ __( 'Previous page' ) }
74
95
  icon={ chevronLeft }
@@ -78,9 +99,9 @@ const Pagination = memo( function Pagination( {
78
99
  />
79
100
  <Button
80
101
  onClick={ () =>
81
- onChangeView( { ...view, page: view.page + 1 } )
102
+ onChangeView( { ...view, page: currentPage + 1 } )
82
103
  }
83
- disabled={ view.page >= totalPages }
104
+ disabled={ currentPage >= totalPages }
84
105
  __experimentalIsFocusable
85
106
  label={ __( 'Next page' ) }
86
107
  icon={ chevronRight }
@@ -4,7 +4,22 @@
4
4
  import { __, sprintf } from '@wordpress/i18n';
5
5
  import { CheckboxControl } from '@wordpress/components';
6
6
 
7
- export default function SingleSelectionCheckbox( {
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import type { Field, AnyItem } from './types';
11
+
12
+ interface SingleSelectionCheckboxProps< Item extends AnyItem > {
13
+ selection: string[];
14
+ onSelectionChange: ( selection: Item[] ) => void;
15
+ item: Item;
16
+ data: Item[];
17
+ getItemId: ( item: Item ) => string;
18
+ primaryField?: Field< Item >;
19
+ disabled: boolean;
20
+ }
21
+
22
+ export default function SingleSelectionCheckbox< Item extends AnyItem >( {
8
23
  selection,
9
24
  onSelectionChange,
10
25
  item,
@@ -12,7 +27,7 @@ export default function SingleSelectionCheckbox( {
12
27
  getItemId,
13
28
  primaryField,
14
29
  disabled,
15
- } ) {
30
+ }: SingleSelectionCheckboxProps< Item > ) {
16
31
  const id = getItemId( item );
17
32
  const isSelected = selection.includes( id );
18
33
  let selectionLabel;
@@ -171,7 +171,6 @@ export const fields = [
171
171
  id: 'type',
172
172
  maxWidth: 400,
173
173
  enableHiding: false,
174
- type: 'enumeration',
175
174
  elements: [
176
175
  { value: 'Not a planet', label: 'Not a planet' },
177
176
  { value: 'Ice giant', label: 'Ice giant' },
@@ -189,7 +188,6 @@ export const fields = [
189
188
  {
190
189
  header: 'Categories',
191
190
  id: 'categories',
192
- type: 'enumeration',
193
191
  elements: [
194
192
  { value: 'Space', label: 'Space' },
195
193
  { value: 'NASA', label: 'NASA' },
package/src/style.scss CHANGED
@@ -292,25 +292,26 @@
292
292
  }
293
293
 
294
294
  .dataviews-view-grid__card {
295
- border-radius: $radius-block-ui * 2;
296
- border: 1px solid $gray-200;
297
295
  height: 100%;
298
296
  justify-content: flex-start;
299
297
 
300
298
  .dataviews-view-grid__title-actions {
301
- padding: $grid-unit-05 $grid-unit $grid-unit-05 $grid-unit-05;
299
+ padding: $grid-unit-10 0 $grid-unit-05;
302
300
  }
303
301
 
304
302
  .dataviews-view-grid__primary-field {
305
- min-height: $grid-unit-50;
303
+ min-height: $grid-unit-40; // Preserve layout when there is no ellipsis button
306
304
  }
307
- &.is-selected {
308
- border-color: var(--wp-admin-theme-color);
309
- background-color: rgba(var(--wp-admin-theme-color--rgb), 0.04);
310
305
 
306
+ &.is-selected {
311
307
  .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value {
312
308
  color: $gray-900;
313
309
  }
310
+
311
+ .page-pages-preview-field__button::after {
312
+ box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
313
+ background: rgba(var(--wp-admin-theme-color--rgb), 0.04);
314
+ }
314
315
  }
315
316
  }
316
317
 
@@ -318,15 +319,28 @@
318
319
  width: 100%;
319
320
  min-height: 200px;
320
321
  aspect-ratio: 1/1;
321
- border-bottom: 1px solid $gray-200;
322
322
  background-color: $gray-100;
323
- border-radius: 3px 3px 0 0;
323
+ border-radius: $grid-unit-05;
324
+ overflow: hidden;
325
+ position: relative;
324
326
 
325
327
  img {
326
328
  object-fit: cover;
327
329
  width: 100%;
328
330
  height: 100%;
329
331
  }
332
+
333
+ &::after {
334
+ content: "";
335
+ position: absolute;
336
+ top: 0;
337
+ left: 0;
338
+ width: 100%;
339
+ height: 100%;
340
+ box-shadow: inset 0 0 0 $border-width rgba(0, 0, 0, 0.1);
341
+ border-radius: $grid-unit-05;
342
+ pointer-events: none;
343
+ }
330
344
  }
331
345
 
332
346
  .dataviews-view-grid__fields {
@@ -337,7 +351,6 @@
337
351
  &:not(:empty) {
338
352
  padding: $grid-unit-15 0;
339
353
  padding-top: 0;
340
- margin: 0 $grid-unit-15;
341
354
  }
342
355
 
343
356
  .dataviews-view-grid__field {
@@ -366,8 +379,7 @@
366
379
 
367
380
  .dataviews-view-grid__badge-fields {
368
381
  &:not(:empty) {
369
- padding: $grid-unit-15;
370
- padding-top: 0;
382
+ padding-bottom: $grid-unit-15;
371
383
  }
372
384
 
373
385
  .dataviews-view-grid__field-value {
@@ -385,32 +397,33 @@
385
397
 
386
398
  .dataviews-view-list {
387
399
  margin: 0;
388
- padding: $grid-unit-10;
389
400
 
390
401
  li {
391
402
  margin: 0;
392
403
  cursor: pointer;
404
+ border-top: 1px solid $gray-100;
393
405
 
394
406
  .dataviews-view-list__item-wrapper {
395
407
  position: relative;
396
- padding-right: $grid-unit-30;
397
408
  border-radius: $grid-unit-05;
398
409
 
399
- &::after {
400
- position: absolute;
401
- content: "";
402
- top: 100%;
403
- left: $grid-unit-30;
404
- right: $grid-unit-30;
405
- background: $gray-100;
406
- height: 1px;
407
- }
408
-
409
410
  > * {
410
411
  width: 100%;
411
412
  }
412
413
  }
413
414
 
415
+ .dataviews-view-list__item-actions .components-button {
416
+ opacity: 0;
417
+ }
418
+
419
+ &.is-selected,
420
+ &.is-hovered,
421
+ &:focus-within {
422
+ .dataviews-view-list__item-actions .components-button {
423
+ opacity: 1;
424
+ }
425
+ }
426
+
414
427
  &:not(.is-selected) {
415
428
  .dataviews-view-list__primary-field {
416
429
  color: $gray-900;
@@ -418,6 +431,7 @@
418
431
  &:hover,
419
432
  &:focus-within {
420
433
  color: var(--wp-admin-theme-color);
434
+ background-color: #f8f8f8;
421
435
 
422
436
  .dataviews-view-list__primary-field,
423
437
  .dataviews-view-list__fields {
@@ -425,28 +439,25 @@
425
439
  }
426
440
  }
427
441
  }
442
+
428
443
  }
429
444
 
430
445
  li.is-selected,
431
446
  li.is-selected:focus-within {
432
447
  .dataviews-view-list__item-wrapper {
433
- background-color: var(--wp-admin-theme-color);
434
- color: $white;
448
+ background-color: rgba(var(--wp-admin-theme-color--rgb), 0.04);
449
+ color: $gray-900;
435
450
 
436
451
  .dataviews-view-list__primary-field,
437
452
  .dataviews-view-list__fields,
438
453
  .components-button {
439
- color: $white;
440
- }
441
-
442
- &::after {
443
- background: transparent;
454
+ color: var(--wp-admin-theme-color);
444
455
  }
445
456
  }
446
457
  }
447
458
 
448
459
  .dataviews-view-list__item {
449
- padding: $grid-unit-15 0 $grid-unit-15 $grid-unit-30;
460
+ padding: $grid-unit-20 0 $grid-unit-20 $grid-unit-40;
450
461
  width: 100%;
451
462
  scroll-margin: $grid-unit-10 0;
452
463
 
@@ -454,13 +465,12 @@
454
465
  &::before {
455
466
  position: absolute;
456
467
  content: "";
457
- top: -1px;
458
- right: -1px;
459
- bottom: -1px;
460
- left: -1px;
461
- box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
462
- z-index: -1;
463
- border-radius: $grid-unit-05;
468
+ top: calc(var(--wp-admin-border-width-focus) + 1px);
469
+ right: var(--wp-admin-border-width-focus);
470
+ bottom: var(--wp-admin-border-width-focus);
471
+ left: var(--wp-admin-border-width-focus);
472
+ box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
473
+ border-radius: $radius-block-ui;
464
474
  }
465
475
  }
466
476
  .dataviews-view-list__primary-field {
@@ -472,11 +482,11 @@
472
482
  .dataviews-view-list__media-wrapper {
473
483
  width: $grid-unit-50;
474
484
  height: $grid-unit-50;
475
- border-radius: $grid-unit-05;
476
485
  overflow: hidden;
477
486
  position: relative;
478
487
  flex-shrink: 0;
479
488
  background-color: $gray-100;
489
+ border-radius: $grid-unit-05;
480
490
 
481
491
  img {
482
492
  width: 100%;
@@ -517,6 +527,11 @@
517
527
  }
518
528
  }
519
529
 
530
+ .dataviews-view-list__item-actions {
531
+ padding-top: $grid-unit-20;
532
+ padding-right: $grid-unit-40;
533
+ }
534
+
520
535
  & + .dataviews-pagination {
521
536
  justify-content: space-between;
522
537
  }
@@ -555,10 +570,6 @@
555
570
  flex-shrink: 0;
556
571
  }
557
572
 
558
- .dataviews-view-grid__title-actions .dataviews-view-table-selection-checkbox {
559
- margin-left: $grid-unit-10;
560
- }
561
-
562
573
  .dataviews-filter-summary__popover {
563
574
  .components-popover__content {
564
575
  width: 230px;
@@ -790,3 +801,48 @@
790
801
  }
791
802
  }
792
803
  }
804
+
805
+
806
+ .dataviews-bulk-actions-toolbar-wrapper {
807
+ display: flex;
808
+ flex-grow: 1;
809
+ width: 100%;
810
+
811
+ .components-toolbar-group {
812
+ align-items: center;
813
+ }
814
+
815
+ .components-button.is-busy {
816
+ max-height: $button-size;
817
+ }
818
+ }
819
+
820
+ .dataviews-bulk-actions {
821
+ position: absolute;
822
+ display: flex;
823
+ flex-direction: column;
824
+ align-content: center;
825
+ flex-wrap: wrap;
826
+ width: 100%;
827
+ bottom: $grid-unit-30;
828
+ z-index: z-index(".dataviews-bulk-actions");
829
+
830
+ .components-accessible-toolbar {
831
+ border-color: $gray-300;
832
+ box-shadow: $shadow-popover;
833
+
834
+ .components-toolbar-group {
835
+ border-color: $gray-200;
836
+
837
+ &:last-child {
838
+ border: 0;
839
+ }
840
+ }
841
+ }
842
+
843
+ .dataviews-bulk-actions__selection-count {
844
+ display: flex;
845
+ align-items: center;
846
+ margin: 0 $grid-unit-10 0 $grid-unit-10;
847
+ }
848
+ }