@wordpress/dataviews 8.0.1-next.e256d081a.0 → 9.0.1-next.6870dfe5b.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 (269) hide show
  1. package/CHANGELOG.md +24 -1
  2. package/README.md +96 -1
  3. package/build/components/dataform-context/index.js +1 -0
  4. package/build/components/dataform-context/index.js.map +1 -1
  5. package/build/components/dataviews/index.js +11 -1
  6. package/build/components/dataviews/index.js.map +1 -1
  7. package/build/components/dataviews-context/index.js +1 -0
  8. package/build/components/dataviews-context/index.js.map +1 -1
  9. package/build/components/dataviews-layout/index.js +2 -1
  10. package/build/components/dataviews-layout/index.js.map +1 -1
  11. package/build/components/dataviews-picker/footer.js +145 -0
  12. package/build/components/dataviews-picker/footer.js.map +1 -0
  13. package/build/components/dataviews-picker/index.js +201 -0
  14. package/build/components/dataviews-picker/index.js.map +1 -0
  15. package/build/components/dataviews-selection-checkbox/index.js +4 -2
  16. package/build/components/dataviews-selection-checkbox/index.js.map +1 -1
  17. package/build/components/dataviews-view-config/index.js +1 -0
  18. package/build/components/dataviews-view-config/index.js.map +1 -1
  19. package/build/constants.js +4 -1
  20. package/build/constants.js.map +1 -1
  21. package/build/dataform-controls/checkbox.js +23 -2
  22. package/build/dataform-controls/checkbox.js.map +1 -1
  23. package/build/dataform-controls/color.js +128 -0
  24. package/build/dataform-controls/color.js.map +1 -0
  25. package/build/dataform-controls/email.js +10 -45
  26. package/build/dataform-controls/email.js.map +1 -1
  27. package/build/dataform-controls/index.js +8 -2
  28. package/build/dataform-controls/index.js.map +1 -1
  29. package/build/dataform-controls/telephone.js +34 -0
  30. package/build/dataform-controls/telephone.js.map +1 -0
  31. package/build/dataform-controls/text.js +7 -48
  32. package/build/dataform-controls/text.js.map +1 -1
  33. package/build/dataform-controls/{boolean.js → toggle.js} +6 -4
  34. package/build/dataform-controls/toggle.js.map +1 -0
  35. package/build/dataform-controls/url.js +34 -0
  36. package/build/dataform-controls/url.js.map +1 -0
  37. package/build/dataform-controls/utils/validated-text.js +76 -0
  38. package/build/dataform-controls/utils/validated-text.js.map +1 -0
  39. package/build/dataforms-layouts/card/index.js +6 -7
  40. package/build/dataforms-layouts/card/index.js.map +1 -1
  41. package/build/dataforms-layouts/data-form-layout.js +16 -4
  42. package/build/dataforms-layouts/data-form-layout.js.map +1 -1
  43. package/build/dataforms-layouts/index.js +31 -1
  44. package/build/dataforms-layouts/index.js.map +1 -1
  45. package/build/dataforms-layouts/row/index.js +113 -0
  46. package/build/dataforms-layouts/row/index.js.map +1 -0
  47. package/build/dataviews-layouts/grid/index.js +16 -11
  48. package/build/dataviews-layouts/grid/index.js.map +1 -1
  49. package/build/dataviews-layouts/index.js +9 -1
  50. package/build/dataviews-layouts/index.js.map +1 -1
  51. package/build/dataviews-layouts/picker-grid/index.js +357 -0
  52. package/build/dataviews-layouts/picker-grid/index.js.map +1 -0
  53. package/build/dataviews-layouts/utils/grid-items.js +37 -0
  54. package/build/dataviews-layouts/utils/grid-items.js.map +1 -0
  55. package/build/dataviews-layouts/utils/preview-size-picker.js +81 -0
  56. package/build/dataviews-layouts/utils/preview-size-picker.js.map +1 -0
  57. package/build/field-types/boolean.js +1 -1
  58. package/build/field-types/boolean.js.map +1 -1
  59. package/build/field-types/color.js +113 -0
  60. package/build/field-types/color.js.map +1 -0
  61. package/build/field-types/index.js +12 -0
  62. package/build/field-types/index.js.map +1 -1
  63. package/build/field-types/telephone.js +57 -0
  64. package/build/field-types/telephone.js.map +1 -0
  65. package/build/field-types/url.js +57 -0
  66. package/build/field-types/url.js.map +1 -0
  67. package/build/normalize-form-fields.js +6 -0
  68. package/build/normalize-form-fields.js.map +1 -1
  69. package/build/types.js.map +1 -1
  70. package/build/validation.js +1 -1
  71. package/build/validation.js.map +1 -1
  72. package/build-module/components/dataform-context/index.js +1 -0
  73. package/build-module/components/dataform-context/index.js.map +1 -1
  74. package/build-module/components/dataviews/index.js +11 -1
  75. package/build-module/components/dataviews/index.js.map +1 -1
  76. package/build-module/components/dataviews-context/index.js +1 -0
  77. package/build-module/components/dataviews-context/index.js.map +1 -1
  78. package/build-module/components/dataviews-layout/index.js +2 -1
  79. package/build-module/components/dataviews-layout/index.js.map +1 -1
  80. package/build-module/components/dataviews-picker/footer.js +136 -0
  81. package/build-module/components/dataviews-picker/footer.js.map +1 -0
  82. package/build-module/components/dataviews-picker/index.js +191 -0
  83. package/build-module/components/dataviews-picker/index.js.map +1 -0
  84. package/build-module/components/dataviews-selection-checkbox/index.js +4 -2
  85. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
  86. package/build-module/components/dataviews-view-config/index.js +1 -0
  87. package/build-module/components/dataviews-view-config/index.js.map +1 -1
  88. package/build-module/constants.js +3 -0
  89. package/build-module/constants.js.map +1 -1
  90. package/build-module/dataform-controls/checkbox.js +25 -3
  91. package/build-module/dataform-controls/checkbox.js.map +1 -1
  92. package/build-module/dataform-controls/color.js +122 -0
  93. package/build-module/dataform-controls/color.js.map +1 -0
  94. package/build-module/dataform-controls/email.js +9 -45
  95. package/build-module/dataform-controls/email.js.map +1 -1
  96. package/build-module/dataform-controls/index.js +8 -2
  97. package/build-module/dataform-controls/index.js.map +1 -1
  98. package/build-module/dataform-controls/telephone.js +27 -0
  99. package/build-module/dataform-controls/telephone.js.map +1 -0
  100. package/build-module/dataform-controls/text.js +6 -48
  101. package/build-module/dataform-controls/text.js.map +1 -1
  102. package/build-module/dataform-controls/{boolean.js → toggle.js} +5 -3
  103. package/build-module/dataform-controls/toggle.js.map +1 -0
  104. package/build-module/dataform-controls/url.js +27 -0
  105. package/build-module/dataform-controls/url.js.map +1 -0
  106. package/build-module/dataform-controls/utils/validated-text.js +70 -0
  107. package/build-module/dataform-controls/utils/validated-text.js.map +1 -0
  108. package/build-module/dataforms-layouts/card/index.js +6 -7
  109. package/build-module/dataforms-layouts/card/index.js.map +1 -1
  110. package/build-module/dataforms-layouts/data-form-layout.js +14 -4
  111. package/build-module/dataforms-layouts/data-form-layout.js.map +1 -1
  112. package/build-module/dataforms-layouts/index.js +32 -1
  113. package/build-module/dataforms-layouts/index.js.map +1 -1
  114. package/build-module/dataforms-layouts/row/index.js +106 -0
  115. package/build-module/dataforms-layouts/row/index.js.map +1 -0
  116. package/build-module/dataviews-layouts/grid/index.js +16 -11
  117. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  118. package/build-module/dataviews-layouts/index.js +10 -2
  119. package/build-module/dataviews-layouts/index.js.map +1 -1
  120. package/build-module/dataviews-layouts/picker-grid/index.js +348 -0
  121. package/build-module/dataviews-layouts/picker-grid/index.js.map +1 -0
  122. package/build-module/dataviews-layouts/utils/grid-items.js +29 -0
  123. package/build-module/dataviews-layouts/utils/grid-items.js.map +1 -0
  124. package/build-module/dataviews-layouts/utils/preview-size-picker.js +73 -0
  125. package/build-module/dataviews-layouts/utils/preview-size-picker.js.map +1 -0
  126. package/build-module/field-types/boolean.js +1 -1
  127. package/build-module/field-types/boolean.js.map +1 -1
  128. package/build-module/field-types/color.js +107 -0
  129. package/build-module/field-types/color.js.map +1 -0
  130. package/build-module/field-types/index.js +12 -0
  131. package/build-module/field-types/index.js.map +1 -1
  132. package/build-module/field-types/telephone.js +51 -0
  133. package/build-module/field-types/telephone.js.map +1 -0
  134. package/build-module/field-types/url.js +51 -0
  135. package/build-module/field-types/url.js.map +1 -0
  136. package/build-module/normalize-form-fields.js +6 -0
  137. package/build-module/normalize-form-fields.js.map +1 -1
  138. package/build-module/types.js.map +1 -1
  139. package/build-module/validation.js +1 -1
  140. package/build-module/validation.js.map +1 -1
  141. package/build-style/style-rtl.css +252 -12
  142. package/build-style/style.css +252 -12
  143. package/build-types/components/dataform/stories/index.story.d.ts +19 -4
  144. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
  145. package/build-types/components/dataform-context/index.d.ts.map +1 -1
  146. package/build-types/components/dataviews/index.d.ts +1 -1
  147. package/build-types/components/dataviews/index.d.ts.map +1 -1
  148. package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -1
  149. package/build-types/components/dataviews-context/index.d.ts +1 -0
  150. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  151. package/build-types/components/dataviews-layout/index.d.ts.map +1 -1
  152. package/build-types/components/dataviews-picker/footer.d.ts +4 -0
  153. package/build-types/components/dataviews-picker/footer.d.ts.map +1 -0
  154. package/build-types/components/dataviews-picker/index.d.ts +55 -0
  155. package/build-types/components/dataviews-picker/index.d.ts.map +1 -0
  156. package/build-types/components/dataviews-picker/stories/index.story.d.ts +42 -0
  157. package/build-types/components/dataviews-picker/stories/index.story.d.ts.map +1 -0
  158. package/build-types/components/dataviews-selection-checkbox/index.d.ts +2 -1
  159. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -1
  160. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  161. package/build-types/constants.d.ts +1 -0
  162. package/build-types/constants.d.ts.map +1 -1
  163. package/build-types/dataform-controls/checkbox.d.ts.map +1 -1
  164. package/build-types/dataform-controls/color.d.ts +6 -0
  165. package/build-types/dataform-controls/color.d.ts.map +1 -0
  166. package/build-types/dataform-controls/email.d.ts.map +1 -1
  167. package/build-types/dataform-controls/index.d.ts.map +1 -1
  168. package/build-types/dataform-controls/telephone.d.ts +6 -0
  169. package/build-types/dataform-controls/telephone.d.ts.map +1 -0
  170. package/build-types/dataform-controls/text.d.ts.map +1 -1
  171. package/build-types/dataform-controls/toggle.d.ts +6 -0
  172. package/build-types/dataform-controls/toggle.d.ts.map +1 -0
  173. package/build-types/dataform-controls/url.d.ts +6 -0
  174. package/build-types/dataform-controls/url.d.ts.map +1 -0
  175. package/build-types/dataform-controls/utils/validated-text.d.ts +16 -0
  176. package/build-types/dataform-controls/utils/validated-text.d.ts.map +1 -0
  177. package/build-types/dataforms-layouts/card/index.d.ts +0 -3
  178. package/build-types/dataforms-layouts/card/index.d.ts.map +1 -1
  179. package/build-types/dataforms-layouts/data-form-layout.d.ts +4 -1
  180. package/build-types/dataforms-layouts/data-form-layout.d.ts.map +1 -1
  181. package/build-types/dataforms-layouts/index.d.ts +10 -0
  182. package/build-types/dataforms-layouts/index.d.ts.map +1 -1
  183. package/build-types/dataforms-layouts/row/index.d.ts +6 -0
  184. package/build-types/dataforms-layouts/row/index.d.ts.map +1 -0
  185. package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
  186. package/build-types/dataviews-layouts/index.d.ts +12 -1
  187. package/build-types/dataviews-layouts/index.d.ts.map +1 -1
  188. package/build-types/dataviews-layouts/picker-grid/index.d.ts +4 -0
  189. package/build-types/dataviews-layouts/picker-grid/index.d.ts.map +1 -0
  190. package/build-types/dataviews-layouts/utils/grid-items.d.ts +5 -0
  191. package/build-types/dataviews-layouts/utils/grid-items.d.ts.map +1 -0
  192. package/build-types/dataviews-layouts/utils/preview-size-picker.d.ts +2 -0
  193. package/build-types/dataviews-layouts/utils/preview-size-picker.d.ts.map +1 -0
  194. package/build-types/field-types/color.d.ts +20 -0
  195. package/build-types/field-types/color.d.ts.map +1 -0
  196. package/build-types/field-types/index.d.ts.map +1 -1
  197. package/build-types/field-types/stories/index.story.d.ts +81 -0
  198. package/build-types/field-types/stories/index.story.d.ts.map +1 -0
  199. package/build-types/field-types/telephone.d.ts +20 -0
  200. package/build-types/field-types/telephone.d.ts.map +1 -0
  201. package/build-types/field-types/url.d.ts +20 -0
  202. package/build-types/field-types/url.d.ts.map +1 -0
  203. package/build-types/normalize-form-fields.d.ts.map +1 -1
  204. package/build-types/test/dataviews-picker.d.ts +2 -0
  205. package/build-types/test/dataviews-picker.d.ts.map +1 -0
  206. package/build-types/types.d.ts +36 -5
  207. package/build-types/types.d.ts.map +1 -1
  208. package/build-types/validation.d.ts.map +1 -1
  209. package/build-wp/index.js +5061 -4013
  210. package/package.json +16 -15
  211. package/src/components/dataform/stories/index.story.tsx +333 -11
  212. package/src/components/dataform-context/index.tsx +1 -0
  213. package/src/components/dataviews/index.tsx +25 -1
  214. package/src/components/dataviews/stories/fixtures.tsx +1 -1
  215. package/src/components/dataviews/stories/index.story.tsx +14 -0
  216. package/src/components/dataviews/style.scss +4 -2
  217. package/src/components/dataviews-context/index.ts +3 -0
  218. package/src/components/dataviews-layout/index.tsx +4 -2
  219. package/src/components/dataviews-picker/footer.tsx +207 -0
  220. package/src/components/dataviews-picker/index.tsx +284 -0
  221. package/src/components/dataviews-picker/stories/index.story.tsx +251 -0
  222. package/src/components/dataviews-picker/style.scss +10 -0
  223. package/src/components/dataviews-selection-checkbox/index.tsx +3 -0
  224. package/src/components/dataviews-view-config/index.tsx +1 -0
  225. package/src/constants.ts +3 -0
  226. package/src/dataform-controls/checkbox.tsx +33 -3
  227. package/src/dataform-controls/color.tsx +139 -0
  228. package/src/dataform-controls/email.tsx +10 -52
  229. package/src/dataform-controls/index.tsx +8 -2
  230. package/src/dataform-controls/telephone.tsx +30 -0
  231. package/src/dataform-controls/text.tsx +2 -57
  232. package/src/dataform-controls/{boolean.tsx → toggle.tsx} +3 -2
  233. package/src/dataform-controls/url.tsx +30 -0
  234. package/src/dataform-controls/utils/validated-text.tsx +96 -0
  235. package/src/dataforms-layouts/card/index.tsx +5 -4
  236. package/src/dataforms-layouts/card/style.scss +7 -0
  237. package/src/dataforms-layouts/data-form-layout.tsx +15 -3
  238. package/src/dataforms-layouts/index.tsx +35 -0
  239. package/src/dataforms-layouts/row/index.tsx +115 -0
  240. package/src/dataforms-layouts/row/style.scss +3 -0
  241. package/src/dataviews-layouts/grid/index.tsx +38 -33
  242. package/src/dataviews-layouts/grid/style.scss +42 -20
  243. package/src/dataviews-layouts/index.ts +16 -2
  244. package/src/dataviews-layouts/picker-grid/index.tsx +490 -0
  245. package/src/dataviews-layouts/picker-grid/style.scss +171 -0
  246. package/src/dataviews-layouts/utils/grid-items.scss +21 -0
  247. package/src/dataviews-layouts/utils/grid-items.tsx +35 -0
  248. package/src/dataviews-layouts/utils/preview-size-picker.tsx +87 -0
  249. package/src/field-types/boolean.tsx +1 -1
  250. package/src/field-types/color.tsx +115 -0
  251. package/src/field-types/index.tsx +15 -0
  252. package/src/field-types/stories/index.story.tsx +719 -0
  253. package/src/field-types/telephone.tsx +71 -0
  254. package/src/field-types/url.tsx +71 -0
  255. package/src/normalize-form-fields.ts +6 -0
  256. package/src/style.scss +4 -0
  257. package/src/test/dataform.tsx +2 -2
  258. package/src/test/dataviews-picker.tsx +478 -0
  259. package/src/test/dataviews.tsx +86 -0
  260. package/src/types.ts +56 -4
  261. package/src/validation.ts +3 -0
  262. package/tsconfig.tsbuildinfo +1 -1
  263. package/build/dataform-controls/boolean.js.map +0 -1
  264. package/build-module/dataform-controls/boolean.js.map +0 -1
  265. package/build-types/components/stories/index.story.d.ts +0 -63
  266. package/build-types/components/stories/index.story.d.ts.map +0 -1
  267. package/build-types/dataform-controls/boolean.d.ts +0 -6
  268. package/build-types/dataform-controls/boolean.d.ts.map +0 -1
  269. package/src/components/stories/index.story.tsx +0 -372
@@ -0,0 +1,171 @@
1
+
2
+ @import "../utils/grid-items.scss";
3
+
4
+ .dataviews-view-picker-grid {
5
+ .dataviews-view-picker-grid__card {
6
+ height: 100%;
7
+ justify-content: flex-start;
8
+ position: relative;
9
+
10
+ .dataviews-view-picker-grid__title-actions {
11
+ padding: $grid-unit-10 0 $grid-unit-05;
12
+ }
13
+
14
+ .dataviews-view-picker-grid__title-field {
15
+ min-height: $grid-unit-30; // Preserve layout when there is no ellipsis button
16
+ display: flex;
17
+ align-items: center;
18
+
19
+ &--clickable {
20
+ width: fit-content;
21
+ }
22
+ }
23
+
24
+
25
+ &.is-selected {
26
+ .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field .dataviews-view-picker-grid__field-value {
27
+ color: $gray-900;
28
+ }
29
+ }
30
+ &.is-selected .dataviews-view-picker-grid__media::after,
31
+ .dataviews-view-picker-grid__media:focus::after {
32
+ background-color: rgba(var(--wp-admin-theme-color--rgb), 0.08);
33
+ }
34
+ &.is-selected .dataviews-view-picker-grid__media::after {
35
+ box-shadow: inset 0 0 0 $border-width var(--wp-admin-theme-color);
36
+ }
37
+ .dataviews-view-picker-grid__media:focus::after {
38
+ box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
39
+ }
40
+ }
41
+
42
+ &:focus-visible {
43
+ // Only show one focus outline at a time. When focus is on a child element,
44
+ // hide the grid's own focus outline.
45
+ &[aria-activedescendant] {
46
+ outline: none;
47
+ }
48
+
49
+ [data-active-item="true"] {
50
+ outline: 2px solid var(--wp-admin-theme-color);
51
+ }
52
+ }
53
+
54
+ .dataviews-selection-checkbox {
55
+ // Always show the checkbox in picker mode.
56
+ top: $grid-unit-10 !important;
57
+
58
+ input {
59
+ // When the dataview is used as a picker, ensure the checkbox can't be clicked on.
60
+ // Only the item card itself is clickable.
61
+ pointer-events: none;
62
+ }
63
+ }
64
+
65
+ .dataviews-view-picker-grid__media {
66
+ width: 100%;
67
+ aspect-ratio: 1/1;
68
+ background-color: $white;
69
+ border-radius: $radius-medium;
70
+ position: relative;
71
+
72
+ img {
73
+ object-fit: cover;
74
+ width: 100%;
75
+ height: 100%;
76
+ }
77
+
78
+ &::after {
79
+ content: "";
80
+ position: absolute;
81
+ top: 0;
82
+ left: 0;
83
+ width: 100%;
84
+ height: 100%;
85
+ box-shadow: inset 0 0 0 $border-width rgba(0, 0, 0, 0.1);
86
+ border-radius: $grid-unit-05;
87
+ pointer-events: none;
88
+ }
89
+ }
90
+
91
+ .dataviews-view-picker-grid__fields {
92
+ position: relative;
93
+ font-size: 12px;
94
+ line-height: 16px;
95
+
96
+ &:not(:empty) {
97
+ padding: 0 0 $grid-unit-15;
98
+ }
99
+
100
+ .dataviews-view-picker-grid__field-value:not(:empty) {
101
+ min-height: $grid-unit-30;
102
+ line-height: $grid-unit-05 * 5;
103
+ padding-top: math.div($grid-unit-05, 2);
104
+ }
105
+
106
+ .dataviews-view-picker-grid__field {
107
+ min-height: $grid-unit-30;
108
+ align-items: center;
109
+
110
+ .dataviews-view-picker-grid__field-name {
111
+ width: 35%;
112
+ color: $gray-700;
113
+ overflow: hidden;
114
+ text-overflow: ellipsis;
115
+ white-space: nowrap;
116
+ }
117
+
118
+ .dataviews-view-picker-grid__field-value {
119
+ width: 65%;
120
+ overflow: hidden;
121
+ text-overflow: ellipsis;
122
+ white-space: nowrap;
123
+ }
124
+
125
+ &:not(:has(.dataviews-view-picker-grid__field-value:not(:empty))) {
126
+ display: none;
127
+ }
128
+ }
129
+ }
130
+
131
+ .dataviews-view-picker-grid__badge-fields {
132
+ &:not(:empty) {
133
+ padding-bottom: $grid-unit-15;
134
+ }
135
+ }
136
+ }
137
+
138
+ .dataviews-view-picker-grid__field-value:empty,
139
+ .dataviews-view-picker-grid__field:empty {
140
+ display: none;
141
+ }
142
+
143
+ .dataviews-view-picker-grid__card .dataviews-selection-checkbox {
144
+ position: absolute;
145
+ top: -9999em;
146
+ left: $grid-unit-10;
147
+ z-index: z-index(".dataviews-view-grid__card .dataviews-selection-checkbox");
148
+
149
+ @media (hover: none) {
150
+ // Show checkboxes on devices that do not support hover.
151
+ top: $grid-unit-10;
152
+ }
153
+ }
154
+
155
+ .dataviews-view-picker-grid__card:hover .dataviews-selection-checkbox,
156
+ .dataviews-view-picker-grid__card:focus-within .dataviews-selection-checkbox,
157
+ .dataviews-view-picker-grid__card.is-selected .dataviews-selection-checkbox {
158
+ top: $grid-unit-10;
159
+ }
160
+
161
+ .dataviews-view-picker-grid__media--clickable {
162
+ cursor: pointer;
163
+ }
164
+
165
+ .dataviews-view-picker-grid-group__header {
166
+ font-size: $font-size-large;
167
+ font-weight: $font-weight-medium;
168
+ color: $gray-900;
169
+ margin: 0 0 $grid-unit-10 0;
170
+ padding: 0 $grid-unit-60;
171
+ }
@@ -0,0 +1,21 @@
1
+ .dataviews-view-grid-items {
2
+ margin-bottom: auto;
3
+ display: grid;
4
+ gap: $grid-unit-40;
5
+ grid-template-rows: max-content;
6
+ grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
7
+ padding: 0 $grid-unit-60 $grid-unit-30;
8
+ container-type: inline-size;
9
+ /**
10
+ * Breakpoints were adjusted from media queries breakpoints to account for
11
+ * the sidebar width. This was done to match the existing styles we had.
12
+ */
13
+ @container (max-width: 430px) {
14
+ padding-left: $grid-unit-30;
15
+ padding-right: $grid-unit-30;
16
+ }
17
+
18
+ @media not (prefers-reduced-motion) {
19
+ transition: padding ease-out 0.1s;
20
+ }
21
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import type { ComponentPropsWithoutRef } from 'react';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { forwardRef } from '@wordpress/element';
10
+
11
+ /**
12
+ * External dependencies
13
+ */
14
+ import clsx from 'clsx';
15
+
16
+ export const GridItems = forwardRef<
17
+ HTMLDivElement,
18
+ {
19
+ className?: string;
20
+ previewSize: number | undefined;
21
+ } & ComponentPropsWithoutRef< 'div' >
22
+ >( ( { className, previewSize, ...props }, ref ) => {
23
+ return (
24
+ <div
25
+ ref={ ref }
26
+ className={ clsx( 'dataviews-view-grid-items', className ) }
27
+ style={ {
28
+ gridTemplateColumns:
29
+ previewSize &&
30
+ `repeat(auto-fill, minmax(${ previewSize }px, 1fr))`,
31
+ } }
32
+ { ...props }
33
+ />
34
+ );
35
+ } );
@@ -0,0 +1,87 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { RangeControl } from '@wordpress/components';
5
+ import { __ } from '@wordpress/i18n';
6
+ import { useContext } from '@wordpress/element';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import DataViewsContext from '../../components/dataviews-context';
12
+ import type { ViewGrid } from '../../types';
13
+
14
+ const imageSizes = [
15
+ {
16
+ value: 120,
17
+ breakpoint: 1,
18
+ },
19
+ {
20
+ value: 170,
21
+ breakpoint: 1,
22
+ },
23
+ {
24
+ value: 230,
25
+ breakpoint: 1,
26
+ },
27
+ {
28
+ value: 290,
29
+ breakpoint: 1112, // at minimum image width, 4 images display at this container size
30
+ },
31
+ {
32
+ value: 350,
33
+ breakpoint: 1636, // at minimum image width, 6 images display at this container size
34
+ },
35
+ {
36
+ value: 430,
37
+ breakpoint: 588, // at minimum image width, 2 images display at this container size
38
+ },
39
+ ];
40
+
41
+ export default function PreviewSizePicker() {
42
+ const context = useContext( DataViewsContext );
43
+ const view = context.view as ViewGrid;
44
+
45
+ const breakValues = imageSizes.filter( ( size ) => {
46
+ return context.containerWidth >= size.breakpoint;
47
+ } );
48
+
49
+ const layoutPreviewSize = view.layout?.previewSize ?? 230; // Default to the third smallest size if no preview size is set.
50
+ // If the container has resized and the set preview size is no longer available,
51
+ // we reset it to the next smallest size, or the smallest available size.
52
+ const previewSizeToUse =
53
+ breakValues
54
+ .map( ( size, index ) => ( { ...size, index } ) )
55
+ .filter( ( size ) => size.value <= layoutPreviewSize )
56
+ .sort( ( a, b ) => b.value - a.value )[ 0 ]?.index ?? 0;
57
+
58
+ const marks = breakValues.map( ( size, index ) => {
59
+ return {
60
+ value: index,
61
+ };
62
+ } );
63
+
64
+ return (
65
+ <RangeControl
66
+ __nextHasNoMarginBottom
67
+ __next40pxDefaultSize
68
+ showTooltip={ false }
69
+ label={ __( 'Preview size' ) }
70
+ value={ previewSizeToUse }
71
+ min={ 0 }
72
+ max={ breakValues.length - 1 }
73
+ withInputField={ false }
74
+ onChange={ ( value = 0 ) => {
75
+ context.onChangeView( {
76
+ ...view,
77
+ layout: {
78
+ ...view.layout,
79
+ previewSize: breakValues[ value ].value,
80
+ },
81
+ } );
82
+ } }
83
+ step={ 1 }
84
+ marks={ marks }
85
+ />
86
+ );
87
+ }
@@ -48,7 +48,7 @@ export default {
48
48
  return null;
49
49
  },
50
50
  },
51
- Edit: 'boolean',
51
+ Edit: 'checkbox',
52
52
  render: ( { item, field }: DataViewRenderFieldProps< any > ) => {
53
53
  if ( field.elements ) {
54
54
  return renderFromElements( { item, field } );
@@ -0,0 +1,115 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { colord } from 'colord';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { __ } from '@wordpress/i18n';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import type {
15
+ DataViewRenderFieldProps,
16
+ SortDirection,
17
+ NormalizedField,
18
+ FieldTypeDefinition,
19
+ } from '../types';
20
+ import { renderFromElements } from '../utils';
21
+ import {
22
+ OPERATOR_IS,
23
+ OPERATOR_IS_ANY,
24
+ OPERATOR_IS_NONE,
25
+ OPERATOR_IS_NOT,
26
+ } from '../constants';
27
+
28
+ function sort( valueA: any, valueB: any, direction: SortDirection ) {
29
+ // Convert colors to HSL for better sorting
30
+ const colorA = colord( valueA );
31
+ const colorB = colord( valueB );
32
+
33
+ if ( ! colorA.isValid() && ! colorB.isValid() ) {
34
+ return 0;
35
+ }
36
+ if ( ! colorA.isValid() ) {
37
+ return direction === 'asc' ? 1 : -1;
38
+ }
39
+ if ( ! colorB.isValid() ) {
40
+ return direction === 'asc' ? -1 : 1;
41
+ }
42
+
43
+ // Sort by hue, then saturation, then lightness
44
+ const hslA = colorA.toHsl();
45
+ const hslB = colorB.toHsl();
46
+
47
+ if ( hslA.h !== hslB.h ) {
48
+ return direction === 'asc' ? hslA.h - hslB.h : hslB.h - hslA.h;
49
+ }
50
+ if ( hslA.s !== hslB.s ) {
51
+ return direction === 'asc' ? hslA.s - hslB.s : hslB.s - hslA.s;
52
+ }
53
+ return direction === 'asc' ? hslA.l - hslB.l : hslB.l - hslA.l;
54
+ }
55
+
56
+ export default {
57
+ sort,
58
+ isValid: {
59
+ custom: ( item: any, field: NormalizedField< any > ) => {
60
+ const value = field.getValue( { item } );
61
+
62
+ if (
63
+ ! [ undefined, '', null ].includes( value ) &&
64
+ ! colord( value ).isValid()
65
+ ) {
66
+ return __( 'Value must be a valid color.' );
67
+ }
68
+
69
+ if ( field.elements ) {
70
+ const validValues = field.elements.map( ( f ) => f.value );
71
+ if ( ! validValues.includes( value ) ) {
72
+ return __( 'Value must be one of the elements.' );
73
+ }
74
+ }
75
+
76
+ return null;
77
+ },
78
+ },
79
+ Edit: 'color',
80
+ render: ( { item, field }: DataViewRenderFieldProps< any > ) => {
81
+ if ( field.elements ) {
82
+ return renderFromElements( { item, field } );
83
+ }
84
+
85
+ const value = field.getValue( { item } );
86
+
87
+ if ( ! value || ! colord( value ).isValid() ) {
88
+ return value;
89
+ }
90
+
91
+ // Render color with visual preview
92
+ return (
93
+ <div
94
+ style={ { display: 'flex', alignItems: 'center', gap: '8px' } }
95
+ >
96
+ <div
97
+ style={ {
98
+ width: '16px',
99
+ height: '16px',
100
+ borderRadius: '50%',
101
+ backgroundColor: value,
102
+ border: '1px solid #ddd',
103
+ flexShrink: 0,
104
+ } }
105
+ />
106
+ <span>{ value }</span>
107
+ </div>
108
+ );
109
+ },
110
+ enableSorting: true,
111
+ filterBy: {
112
+ defaultOperators: [ OPERATOR_IS_ANY, OPERATOR_IS_NONE ],
113
+ validOperators: [ OPERATOR_IS, OPERATOR_IS_NOT ],
114
+ },
115
+ } satisfies FieldTypeDefinition< any >;
@@ -21,6 +21,9 @@ import { default as date } from './date';
21
21
  import { default as boolean } from './boolean';
22
22
  import { default as media } from './media';
23
23
  import { default as array } from './array';
24
+ import { default as telephone } from './telephone';
25
+ import { default as color } from './color';
26
+ import { default as url } from './url';
24
27
  import { renderFromElements } from '../utils';
25
28
  import { ALL_OPERATORS, OPERATOR_IS, OPERATOR_IS_NOT } from '../constants';
26
29
 
@@ -65,6 +68,18 @@ export default function getFieldTypeDefinition< Item >(
65
68
  return array;
66
69
  }
67
70
 
71
+ if ( 'telephone' === type ) {
72
+ return telephone;
73
+ }
74
+
75
+ if ( 'color' === type ) {
76
+ return color;
77
+ }
78
+
79
+ if ( 'url' === type ) {
80
+ return url;
81
+ }
82
+
68
83
  // This is a fallback for fields that don't provide a type.
69
84
  // It can be removed when the field.type is mandatory.
70
85
  return {