Skip to content

Commit 8378654

Browse files
authored
fix(ui): apply consistent styling to custom & default block thumbnails (#11555)
Fixes #9744
1 parent b0da85d commit 8378654

File tree

9 files changed

+73
-25
lines changed

9 files changed

+73
-25
lines changed

packages/payload/src/fields/config/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,6 +1399,9 @@ export type Block = {
13991399
singularName?: string
14001400
}
14011401
imageAltText?: string
1402+
/**
1403+
* Preferred aspect ratio of the image is 3 : 2
1404+
*/
14021405
imageURL?: string
14031406
/** Customize generated GraphQL and Typescript schema names.
14041407
* The slug is used by default.

packages/ui/src/elements/ThumbnailCard/index.scss

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99
border: 1px solid var(--theme-border-color);
1010
border-radius: var(--style-radius-m);
1111
transition: border 100ms cubic-bezier(0, 0.2, 0.2, 1);
12+
padding: base(0.5);
1213

1314
&__label {
14-
padding: base(0.5);
15+
padding: base(0.75) base(0.5) base(0.25) base(0.5);
1516
overflow: hidden;
1617
text-overflow: ellipsis;
1718
white-space: nowrap;

packages/ui/src/fields/Blocks/BlocksDrawer/index.scss

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,19 @@
1616
}
1717

1818
&__default-image {
19+
display: flex;
20+
align-items: center;
21+
justify-content: center;
1922
width: 100%;
23+
aspect-ratio: 3 / 2;
2024
overflow: hidden;
21-
padding-top: base(0.75);
25+
26+
img,
27+
svg {
28+
width: 100%;
29+
height: 100%;
30+
object-fit: cover;
31+
}
2232
}
2333

2434
&__block-groups {
@@ -60,7 +70,6 @@
6070

6171
&__blocks {
6272
grid-template-columns: repeat(3, 1fr);
63-
gap: base(0.5);
6473
}
6574

6675
&__block-groups {

packages/ui/src/fields/Blocks/BlocksDrawer/index.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,13 @@ export const BlocksDrawer: React.FC<Props> = (props) => {
123123
closeModal(drawerSlug)
124124
}}
125125
thumbnail={
126-
imageURL ? (
127-
<img alt={imageAltText} src={imageURL} />
128-
) : (
129-
<div className={`${baseClass}__default-image`}>
126+
<div className={`${baseClass}__default-image`}>
127+
{imageURL ? (
128+
<img alt={imageAltText} src={imageURL} />
129+
) : (
130130
<DefaultBlockImage />
131-
</div>
132-
)
131+
)}
132+
</div>
133133
}
134134
/>
135135
</li>

packages/ui/src/graphics/DefaultBlockImage/index.tsx

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,43 @@ import React, { useState } from 'react'
22
import { v4 as uuid } from 'uuid'
33

44
export const DefaultBlockImage: React.FC = () => {
5-
const [patternID] = useState(`pattern${uuid()}`)
6-
const [imageID] = useState(`image${uuid()}`)
5+
const [patternID] = useState(() => `pattern${uuid()}`)
76

87
return (
9-
<svg fill="none" height="53" viewBox="0 0 82 53" width="82">
10-
<rect fill={`url(#${patternID})`} height="52.7791" width="80.574" x="0.713013" />
11-
<defs>
12-
<pattern height="1" id={`${patternID}`} patternContentUnits="objectBoundingBox" width="1">
13-
<use transform="scale(0.00387597 0.00591716)" xlinkHref={`#${imageID}`} />
14-
</pattern>
15-
<image
16-
height="169"
17-
id={imageID}
18-
width="258"
19-
xlinkHref="data:image/png;base64,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"
8+
<svg
9+
fill="none"
10+
height="151"
11+
preserveAspectRatio="xMidYMid slice"
12+
viewBox="0 0 231 151"
13+
width="231"
14+
xmlns="http://www.w3.org/2000/svg"
15+
>
16+
<g clipPath={`url(#${patternID})`}>
17+
<rect fill="#D9D9D9" height="100%" rx="2" width="100%" />
18+
<rect
19+
fill="#BCBCBC"
20+
height="116.063"
21+
transform="rotate(52.0687 33.7051 79.3051)"
22+
width="85.8593"
23+
x="33.7051"
24+
y="79.3051"
25+
/>
26+
<rect
27+
fill="#BCBCBC"
28+
height="116.063"
29+
transform="rotate(52.0687 86.1219 92.6272)"
30+
width="85.8593"
31+
x="86.1219"
32+
y="92.6272"
2033
/>
34+
<circle cx="189" cy="45" fill="#BCBCBC" r="19" />
35+
<rect fill="#B8B8B8" height="5" rx="2.5" width="98" x="66" y="70" />
36+
<rect fill="#B8B8B8" height="5" rx="2.5" width="76" x="77" y="82" />
37+
</g>
38+
<defs>
39+
<clipPath id={`${patternID}`}>
40+
<rect fill="white" height="151" width="231" />
41+
</clipPath>
2142
</defs>
2243
</svg>
2344
)

test/fields/collections/Blocks/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export const getBlocksField = (prefix?: string): BlocksField => ({
1111
blocks: [
1212
{
1313
slug: prefix ? `${prefix}Content` : 'content',
14+
imageURL: '/api/uploads/file/payload480x320.jpg',
1415
interfaceName: prefix ? `${prefix}ContentBlock` : 'ContentBlock',
1516
admin: {
1617
components: {
34.5 KB
Loading

test/fields/payload-types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -901,7 +901,7 @@ export interface ContentBlock {
901901
* via the `definition` "NoBlockname".
902902
*/
903903
export interface NoBlockname {
904-
text: string;
904+
text?: string | null;
905905
id?: string | null;
906906
blockName?: string | null;
907907
blockType: 'noBlockname';
@@ -967,7 +967,7 @@ export interface LocalizedContentBlock {
967967
* via the `definition` "localizedNoBlockname".
968968
*/
969969
export interface LocalizedNoBlockname {
970-
text: string;
970+
text?: string | null;
971971
id?: string | null;
972972
blockName?: string | null;
973973
blockType: 'localizedNoBlockname';

test/fields/seed.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,15 @@ const dirname = path.dirname(filename)
6969

7070
export const seed = async (_payload: Payload) => {
7171
const jpgPath = path.resolve(dirname, './collections/Upload/payload.jpg')
72+
const jpg480x320Path = path.resolve(dirname, './collections/Upload/payload480x320.jpg')
7273
const pngPath = path.resolve(dirname, './uploads/payload.png')
7374

7475
// Get both files in parallel
75-
const [jpgFile, pngFile] = await Promise.all([getFileByPath(jpgPath), getFileByPath(pngPath)])
76+
const [jpgFile, jpg480x320File, pngFile] = await Promise.all([
77+
getFileByPath(jpgPath),
78+
getFileByPath(jpg480x320Path),
79+
getFileByPath(pngPath),
80+
])
7681

7782
const createdArrayDoc = await _payload.create({
7883
collection: arrayFieldsSlug,
@@ -121,6 +126,14 @@ export const seed = async (_payload: Payload) => {
121126
overrideAccess: true,
122127
})
123128

129+
await _payload.create({
130+
collection: uploadsSlug,
131+
data: {},
132+
file: jpg480x320File,
133+
depth: 0,
134+
overrideAccess: true,
135+
})
136+
124137
// const createdJPGDocSlug2 = await _payload.create({
125138
// collection: uploads2Slug,
126139
// data: {

0 commit comments

Comments
 (0)