Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
86dab52
feat: added link to header logo
rkeerthient Dec 11, 2025
13ab3c6
Merge remote-tracking branch 'origin/main' into OPAQF-68-slots
rkeerthient Dec 11, 2025
d0238fa
extracted Link to a const
rkeerthient Dec 11, 2025
4d2b009
Merge remote-tracking branch 'origin/main' into OPAQF-68-slots
rkeerthient Dec 11, 2025
0a0093a
fixed linkedLogo testcase Issue
rkeerthient Dec 11, 2025
099731f
made logo link optional
rkeerthient Dec 11, 2025
08ae53d
moved link to ImageWrapper, removed duplicate logoLink from locales
rkeerthient Dec 15, 2025
9b66502
docs: auto-generate component documentation
github-actions[bot] Dec 15, 2025
23ce67f
Update component screenshots for visual-editor
github-actions[bot] Dec 15, 2025
c703bd0
Update component screenshots for visual-editor
github-actions[bot] Dec 15, 2025
e8b8747
updated Link's aria-label
rkeerthient Dec 15, 2025
e7e28bd
Update component screenshots for visual-editor
github-actions[bot] Dec 15, 2025
49610a2
Update component screenshots for visual-editor
github-actions[bot] Dec 15, 2025
148f066
Merge remote-tracking branch 'origin/main' into OPAQF-68-slots
rkeerthient Dec 15, 2025
95a60c1
changed link to maybe, removed ClickedOnImage from locales and update…
rkeerthient Dec 15, 2025
cd4b1b5
Merge remote-tracking branch 'origin/main' into OPAQF-68-slots
rkeerthient Dec 15, 2025
dc663ce
Update component screenshots for visual-editor
github-actions[bot] Dec 15, 2025
d0a6004
added back aria label
rkeerthient Dec 15, 2025
faa47a0
Update component screenshots for visual-editor
github-actions[bot] Dec 15, 2025
b821c54
Update component screenshots for visual-editor
github-actions[bot] Dec 15, 2025
c718f8e
fixed aria-label thing
rkeerthient Dec 16, 2025
23926c5
Merge remote-tracking branch 'origin/main' into OPAQF-68-slots
rkeerthient Dec 16, 2025
aecba28
Update component screenshots for visual-editor
github-actions[bot] Dec 16, 2025
cf716b0
unused variable removed from locales
rkeerthient Dec 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/visual-editor/locales/cs/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/da/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/de/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/en-GB/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/en/visual-editor.json
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@
"localGeomodifier": "Local GeoModifier",
"localGeomodifierHeadingLevel": "Local GeoModifier Heading Level",
"logo": "Logo",
"logoLink": "Logo Link",
"logoStyles": "Logo Styles",
"logoUrl": "Logo",
"logoWidth": "Logo Width",
Expand Down
1 change: 1 addition & 0 deletions packages/visual-editor/locales/es/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/et/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/fi/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions packages/visual-editor/locales/fr/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/hr/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/hu/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/it/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/ja/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/lt/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/lv/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/nb/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/nl/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/pl/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/pt/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/ro/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/sk/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/sv/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/tr/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/zh-TW/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/visual-editor/locales/zh/visual-editor.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

73 changes: 53 additions & 20 deletions packages/visual-editor/src/components/contentBlocks/image/Image.tsx
Original file line number Diff line number Diff line change
@@ -1,35 +1,40 @@
import * as React from "react";
import { useTranslation } from "react-i18next";
import {
ComponentConfig,
Fields,
PuckComponent,
setDeep,
} from "@measured/puck";
import { ComplexImageType, ImageType } from "@yext/pages-components";
import {
useDocument,
resolveComponentData,
AssetImageType,
EntityField,
YextEntityField,
Image,
ImgSizesByBreakpoint,
MaybeLink,
TranslatableString,
YextEntityField,
YextField,
imgSizesHelper,
msg,
pt,
imgSizesHelper,
ImgSizesByBreakpoint,
resolveComponentData,
resolveDataFromParent,
AssetImageType,
useDocument,
} from "@yext/visual-editor";
import { ComplexImageType, ImageType } from "@yext/pages-components";
import { ImageStylingFields, ImageStylingProps } from "./styling.ts";
import * as React from "react";
import { useTranslation } from "react-i18next";
import { EmptyImageState } from "./EmptyImageState";
import { ImageStylingFields, ImageStylingProps } from "./styling.ts";

const PLACEHOLDER_IMAGE_URL = "https://placehold.co/640x360";
const DEFAULT_LINK = "#";
const LINK_REGEX_VALIDATION = /^(https?:\/\/[^\s]+|\/[^\s]*|#[^\s]*)$/;

export interface ImageWrapperProps {
data: {
/** The image to display. */
image: YextEntityField<ImageType | ComplexImageType | AssetImageType>;
link?: TranslatableString;
};

/** Size and aspect ratio of the image. */
Expand Down Expand Up @@ -62,6 +67,9 @@ export const ImageWrapperFields: Fields<ImageWrapperProps> = {
},
}
),
link: YextField(msg("fields.link", "Link"), {
type: "translatableString",
}),
},
}),
styles: YextField(msg("fields.styles", "Styles"), {
Expand Down Expand Up @@ -115,6 +123,19 @@ const ImageWrapperComponent: PuckComponent<ImageWrapperProps> = (props) => {
!imageUrl ||
(typeof imageUrl === "string" && imageUrl.trim() === "");

const inputLink = resolveComponentData(
data.link ?? { en: DEFAULT_LINK, hasLocalizedValue: "true" as const },
i18n.language,
streamDocument
);

const resolvedLink =
typeof inputLink === "string" &&
LINK_REGEX_VALIDATION.test(inputLink.trim()) &&
inputLink.trim() !== DEFAULT_LINK
? inputLink.trim()
: undefined;

if (isEmpty) {
return (
<EmptyImageState
Expand Down Expand Up @@ -152,15 +173,22 @@ const ImageWrapperComponent: PuckComponent<ImageWrapperProps> = (props) => {
ref={puck.dragRef}
>
<div className="w-full h-full">
<Image
image={resolvedImage}
aspectRatio={styles.aspectRatio}
width={hideWidthProp ? undefined : styles.width}
className={
className || "max-w-full rounded-image-borderRadius w-full h-full"
}
sizes={transformedSizes}
/>
<MaybeLink
className="w-auto"
eventName="logoLink"
href={resolvedLink}
alwaysHideCaret={true}
>
<Image
image={resolvedImage}
aspectRatio={styles.aspectRatio}
width={hideWidthProp ? undefined : styles.width}
className={
className || "max-w-full rounded-image-borderRadius w-full h-full"
}
sizes={transformedSizes}
/>
</MaybeLink>
</div>
</EntityField>
);
Expand All @@ -177,6 +205,7 @@ export const imageDefaultProps = {
},
constantValueEnabled: true,
},
link: { en: DEFAULT_LINK, hasLocalizedValue: "true" as const },
},
styles: {
aspectRatio: 1.78,
Expand All @@ -190,12 +219,16 @@ export const ImageWrapper: ComponentConfig<{ props: ImageWrapperProps }> = {
inline: true,
fields: ImageWrapperFields,
defaultProps: imageDefaultProps,
resolveFields: (data) => {
resolveFields: (data, params) => {
const fields = resolveDataFromParent(ImageWrapperFields, data);
const parentType = params.parent?.type;

if (data.props.hideWidthProp) {
return setDeep(fields, "styles.objectFields.width.visible", false);
}
if (parentType !== "PrimaryHeaderSlot") {
return setDeep(fields, "data.objectFields.link.visible", false);
}

return setDeep(fields, "styles.objectFields.width.visible", true);
},
Expand Down
Loading