Version 2025-07 is the last API version to support React-based UI components. Later versions use web components, native UI elements with built-in accessibility, better performance, and consistent styling with Shopify's design system. Check out the migration guide to upgrade your extension.
Image
The Image component embeds images within the interface with control over presentation and loading behavior. Use Image to visually illustrate concepts, showcase products, display user content, or support tasks and interactions with visual context.
Images support aspect ratio control, object fit, and loading states for progressive enhancement. For small product preview images, use ProductThumbnail. For profile images, use Avatar.
Supported targets
- Customer
Account::Kitchen Sink - customer-account.
footer. render-after - customer-account.
order-index. announcement. render - customer-account.
order-index. block. render - customer-account.
order-status. announcement. render - customer-account.
order-status. block. render - customer-account.
order-status. cart-line-item. render-after - customer-account.
order-status. cart-line-list. render-after - customer-account.
order-status. customer-information. render-after - customer-account.
order-status. fulfillment-details. render-after - customer-account.
order-status. payment-details. render-after - customer-account.
order-status. return-details. render-after - customer-account.
order-status. unfulfilled-items. render-after - customer-account.
order. action. menu-item. render - customer-account.
order. action. render - customer-account.
order. page. render - customer-account.
page. render - customer-account.
profile. addresses. render-after - customer-account.
profile. announcement. render - customer-account.
profile. block. render - customer-account.
profile. company-details. render-after - customer-account.
profile. company-location-addresses. render-after - customer-account.
profile. company-location-payment. render-after - customer-account.
profile. company-location-staff. render-after - customer-account.
profile. payment. render-after
Supported targets
- Customer
Account::Kitchen Sink - customer-account.
footer. render-after - customer-account.
order-index. announcement. render - customer-account.
order-index. block. render - customer-account.
order-status. announcement. render - customer-account.
order-status. block. render - customer-account.
order-status. cart-line-item. render-after - customer-account.
order-status. cart-line-list. render-after - customer-account.
order-status. customer-information. render-after - customer-account.
order-status. fulfillment-details. render-after - customer-account.
order-status. payment-details. render-after - customer-account.
order-status. return-details. render-after - customer-account.
order-status. unfulfilled-items. render-after - customer-account.
order. action. menu-item. render - customer-account.
order. action. render - customer-account.
order. page. render - customer-account.
page. render - customer-account.
profile. addresses. render-after - customer-account.
profile. announcement. render - customer-account.
profile. block. render - customer-account.
profile. company-details. render-after - customer-account.
profile. company-location-addresses. render-after - customer-account.
profile. company-location-payment. render-after - customer-account.
profile. company-location-staff. render-after - customer-account.
profile. payment. render-after
Anchor to PropertiesProperties
Configure the following properties on the Image component.
- Anchor to sourcesourcesourceRequired< MaybeConditionalStyle< string, AtLeastOne<ViewportSizeCondition & ResolutionCondition> > >Required< MaybeConditionalStyle< string, AtLeastOne<ViewportSizeCondition & ResolutionCondition> > >requiredrequired
The URL of the image to display. Supports remote URLs and local file resources. You can also use conditional styles with
resolutionandconditions to serve different images based on the device's pixel density or viewport width.- Anchor to accessibilityDescriptionaccessibilityDescriptionaccessibilityDescriptionstringstringDefault: ''Default: ''
The alternative text that describes the image for assistive technologies. Screen readers announce this text when they encounter the image, and it displays as a fallback if the image fails to load.
Learn more about writing effective alternative text.
- Anchor to accessibilityRoleaccessibilityRoleaccessibilityRole'decorative''decorative'
The semantic role of the image for assistive technologies.
decorative: Marks the image as purely visual, so screen readers skip it entirely. Use this for images that don’t convey meaningful content (like background patterns or visual flourishes).
- Anchor to aspectRatioaspectRatioaspectRationumbernumber
The aspect ratio to display the image at (fills the width of the parent container and sets the height accordingly). An invisible placeholder is created to prevent content jumping when the image loads. Use along with
fitif the specified aspect ratio does not match the intrinsic aspect ratio to prevent the image from stretching.- Anchor to borderborderborderMaybeResponsiveConditionalStyle<MaybeShorthandProperty<BorderStyle>>MaybeResponsiveConditionalStyle<MaybeShorthandProperty<BorderStyle>>
The border style of the element. Accepts a single value for all four edges, or a shorthand tuple for per-edge control:
'base': Appliesbaseto all edges.['base', 'none']: Block edges getbase, inline edges getnone.['base', 'none', 'dotted', 'base']: Values apply to block-start, inline-end, block-end, and inline-start respectively.
- Anchor to borderWidthborderWidthborderWidthMaybeResponsiveConditionalStyle< MaybeShorthandProperty<BorderWidth> >MaybeResponsiveConditionalStyle< MaybeShorthandProperty<BorderWidth> >
The border width of the element. Accepts a single value for all four edges, or a shorthand tuple for per-edge control:
'base': Appliesbaseto all edges.['base', 'medium']: Block edges getbase, inline edges getmedium.['base', 'medium', 'medium', 'base']: Values apply to block-start, inline-end, block-end, and inline-start respectively.
- Anchor to cornerRadiuscornerRadiuscornerRadiusMaybeResponsiveConditionalStyle< MaybeShorthandProperty<CornerRadius> >MaybeResponsiveConditionalStyle< MaybeShorthandProperty<CornerRadius> >
The corner radius of the element. Accepts a single value for all four corners, or a shorthand tuple for per-corner control using logical (writing-mode-aware) corners:
'base': All four corners getbaseradius.['base', 'none']: StartStart/EndEnd getbase, StartEnd/EndStart getnone. In left-to-right mode, StartStart and EndEnd are the top-left and bottom-right corners.['base', 'none', 'small', 'base']: Values apply to StartStart, StartEnd, EndEnd, and EndStart respectively.
A
alias is available. When both are set,takes precedence.- Anchor to fitfitfitMaybeResponsiveConditionalStyle<Fit>MaybeResponsiveConditionalStyle<Fit>
The fit of the image within its frame. Use when the image is not displayed at its intrinsic size to maintain the aspect ratio.
- Anchor to idididstringstring
A unique identifier for the component. Use this to target the component in scripts or stylesheets, or to distinguish it from other instances of the same component.
- Anchor to loadingloadingloadingLoadingLoading
The loading strategy for the image. Uses native browser behavior and is not supported by all browsers. If no value is provided, the image is loaded immediately.
- Anchor to borderRadiusborderRadiusborderRadiusMaybeResponsiveConditionalStyle< MaybeShorthandProperty<CornerRadius> >MaybeResponsiveConditionalStyle< MaybeShorthandProperty<CornerRadius> >deprecateddeprecated
The corner radius of the element. Accepts a single value for all four corners, or a shorthand tuple for per-corner control:
'base': All four corners getbaseradius.['base', 'none']: StartStart/EndEnd getbase, StartEnd/EndStart getnone.['base', 'none', 'small', 'base']: Values apply to StartStart, StartEnd, EndEnd, and EndStart respectively.
DeprecatedUse
instead.Deprecated:Use
instead.
MaybeResponsiveConditionalStyle
A type that represents a value that can be a conditional style. The conditions are based on the viewport size. We highly recommend using the `Style` helper which simplifies the creation of conditional styles.
T | ConditionalStyle<T, ViewportSizeCondition>ConditionalStyle
A conditional style definition that maps one or more conditions to different values. The `default` value is used as a fallback when none of the conditions in `conditionals` are satisfied.
- conditionals
An array of conditional values.
ConditionalValue<T, AcceptedConditions>[] - default
The default value applied when none of the conditional values specified in `conditionals` are met.
T
ConditionalValue
A single conditional branch that pairs a set of conditions with the value to apply when those conditions are met.
- conditions
The conditions that must be met for the value to be applied. At least one condition must be specified.
AcceptedConditions - value
The value that will be applied if the conditions are met.
T
ViewportSizeCondition
A condition that targets layouts based on the inline size (width in horizontal writing modes) of the viewport.
- viewportInlineSize
The minimum viewport inline size that the condition must match.
{ min: T; }
MaybeShorthandProperty
A type that accepts either a single value applied to all edges or a shorthand tuple for per-edge control. - `T`: A single value applied uniformly to all edges. - `[T, T]`: The first value applies to block-start and block-end, the second to inline-start and inline-end. - `[T, T, T, T]`: Values apply to block-start, inline-end, block-end, and inline-start respectively.
T | ShorthandProperty<T>ShorthandProperty
A tuple type that accepts two or four values following the CSS shorthand convention for box edges. - `[T, T]`: The first value applies to block-start and block-end, the second to inline-start and inline-end. - `[T, T, T, T]`: Values apply to block-start, inline-end, block-end, and inline-start respectively.
[T, T] | [T, T, T, T]BorderStyle
A keyword that maps to a predefined border style from the design system. - `base`: A solid border line, suitable for most use cases. - `dashed`: A dashed border line, often used for drop zones or placeholder boundaries. - `dotted`: A dotted border line. - `none`: No border is rendered.
'base' | 'dashed' | 'dotted' | 'none'CornerRadius
A keyword that maps to a predefined corner radius from the design system. - `base`: The default corner radius. - `small`: A subtle corner radius, smaller than `base`. - `large`: A pronounced corner radius, larger than `base`. - `fullyRounded`: Fully rounds the corners into a pill or circle shape. - `none`: No corner rounding; sharp square corners.
'base' | 'small' | 'large' | 'fullyRounded' | 'none' | CornerRadiusDeprecatedCornerRadiusDeprecated
'tight' | 'loose'BorderWidth
A keyword that maps to a predefined border width from the design system. - `base`: The default border width. - `medium`: A medium border width, thicker than `base`. - `thick`: The thickest available border width.
'base' | 'medium' | 'thick'Fit
Controls how an image fits within its frame when the image's intrinsic dimensions differ from the frame's dimensions. - `cover`: The image fills the entire frame while maintaining its aspect ratio. If the image is larger than the frame, it will be cropped. - `contain`: The image fits within the frame while maintaining its aspect ratio. The frame may have empty space if the aspect ratios differ. Learn more about the [object-fit](https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit) property.
'cover' | 'contain'Loading
Controls when the browser begins loading the image. - `eager`: Loads the image immediately, regardless of whether it’s visible in the viewport. - `lazy`: Defers loading until the image approaches the visible viewport, which can improve initial page performance.
'eager' | 'lazy'MaybeConditionalStyle
A type that represents a value that can be a conditional style. We highly recommend using the `Style` helper which simplifies the creation of conditional styles.
T | ConditionalStyle<T, AcceptedConditions>AtLeastOne
A utility type that requires at least one property from the given type to be present. Used to ensure that conditional style objects always specify at least one condition.
Partial<T> & U[keyof U]ResolutionCondition
A condition that targets devices based on their pixel density.
- resolution
The minimum device pixel ratio the condition must match.
Resolution
Resolution
The device pixel ratio used to serve resolution-appropriate images. A value of `1` targets standard displays, while higher values such as `2` or `3` target high-density (Retina) displays.
1 | 1.3 | 1.5 | 2 | 2.6 | 3 | 3.5 | 4Anchor to ExamplesExamples
Anchor to Display an imageDisplay an image
Embed an image from a URL. This example renders a basic image component with a remote source.
Display an image

Display an image
React
import {
reactExtension,
Image,
} from '@shopify/ui-extensions-react/customer-account';
export default reactExtension(
'customer-account.page.render',
() => <Extension />,
);
function Extension() {
return (
<Image source="https://cdn.shopify.com/YOUR_IMAGE_HERE" />
);
}JS
import {extension, Image} from '@shopify/ui-extensions/customer-account';
export default extension('customer-account.page.render', (root) => {
const image = root.createComponent(Image, {
source: 'https://cdn.shopify.com/YOUR_IMAGE_HERE',
});
root.appendChild(image);
});Anchor to Display a product imageDisplay a product image
Display a product image alongside product details in a layout. This example demonstrates how to control image sizing with aspectRatio and pair the image with product details using an InlineStack.
Display a product image
React
import {
reactExtension,
Image,
Text,
BlockStack,
InlineStack,
} from '@shopify/ui-extensions-react/customer-account';
export default reactExtension(
'customer-account.page.render',
() => <Extension />,
);
function Extension() {
return (
<InlineStack spacing="base">
<Image
source="https://cdn.shopify.com/static/sample-product/House-Plant1.png"
accessibilityLabel="Indoor plant in a gray pot"
aspectRatio={1}
/>
<BlockStack spacing="small">
<Text emphasis="bold">Indoor Plant</Text>
<Text appearance="subdued">Qty: 2</Text>
<Text appearance="success">Delivered</Text>
</BlockStack>
</InlineStack>
);
}JS
import {extension, Image, Text, BlockStack, InlineStack} from '@shopify/ui-extensions/customer-account';
export default extension('customer-account.page.render', (root) => {
const image = root.createComponent(Image, {
source: 'https://cdn.shopify.com/static/sample-product/House-Plant1.png',
accessibilityLabel: 'Indoor plant in a gray pot',
aspectRatio: 1,
});
const name = root.createComponent(Text, {emphasis: 'bold'}, 'Indoor Plant');
const qty = root.createComponent(Text, {appearance: 'subdued'}, 'Qty: 2');
const status = root.createComponent(Text, {appearance: 'success'}, 'Delivered');
const details = root.createComponent(BlockStack, {spacing: 'small'});
details.append(name);
details.append(qty);
details.append(status);
const row = root.createComponent(InlineStack, {spacing: 'base'});
row.append(image);
row.append(details);
root.append(row);
});Anchor to Set an aspect ratioSet an aspect ratio
Compare different aspect ratios on the same image. This example stacks a 1:1 square crop above a 16:9 widescreen crop, both using fit="cover" to fill their containers.
Set an aspect ratio
React
import {
reactExtension,
Image,
BlockStack,
} from '@shopify/ui-extensions-react/customer-account';
export default reactExtension(
'customer-account.page.render',
() => <Extension />,
);
function Extension() {
return (
<BlockStack spacing="base">
<Image
source="https://cdn.shopify.com/static/sample-product/House-Plant1.png"
accessibilityLabel="Indoor plant in a gray pot, square crop"
aspectRatio={1}
fit="cover"
/>
<Image
source="https://cdn.shopify.com/static/sample-product/House-Plant1.png"
accessibilityLabel="Indoor plant in a gray pot, widescreen crop"
aspectRatio={16 / 9}
fit="cover"
/>
</BlockStack>
);
}JS
import {extension, Image, BlockStack} from '@shopify/ui-extensions/customer-account';
export default extension('customer-account.page.render', (root) => {
const square = root.createComponent(Image, {
source: 'https://cdn.shopify.com/static/sample-product/House-Plant1.png',
accessibilityLabel: 'Indoor plant in a gray pot, square crop',
aspectRatio: 1,
fit: 'cover',
});
const wide = root.createComponent(Image, {
source: 'https://cdn.shopify.com/static/sample-product/House-Plant1.png',
accessibilityLabel: 'Indoor plant in a gray pot, widescreen crop',
aspectRatio: 16 / 9,
fit: 'cover',
});
const stack = root.createComponent(BlockStack, {spacing: 'base'});
stack.append(square);
stack.append(wide);
root.append(stack);
});Anchor to Mark an image as decorativeMark an image as decorative
Hide images from screen readers when purely decorative. This example presents an image with an empty accessibilityLabel and accessibilityRole="decorative" so assistive technologies skip it.
Mark an image as decorative
React
import {
reactExtension,
Image,
Text,
Heading,
BlockStack,
} from '@shopify/ui-extensions-react/customer-account';
export default reactExtension(
'customer-account.page.render',
() => <Extension />,
);
function Extension() {
return (
<BlockStack spacing="base">
<Image
source="https://cdn.shopify.com/static/sample-product/House-Plant1.png"
accessibilityLabel=""
accessibilityRole="decorative"
/>
<Heading>Your order is on its way</Heading>
<Text appearance="subdued">
Estimated delivery: April 15, 2026
</Text>
</BlockStack>
);
}JS
import {extension, Image, Text, Heading, BlockStack} from '@shopify/ui-extensions/customer-account';
export default extension('customer-account.page.render', (root) => {
const image = root.createComponent(Image, {
source: 'https://cdn.shopify.com/static/sample-product/House-Plant1.png',
accessibilityLabel: '',
accessibilityRole: 'decorative',
});
const heading = root.createComponent(Heading, {}, 'Your order is on its way');
const delivery = root.createComponent(Text, {appearance: 'subdued'}, 'Estimated delivery: April 15, 2026');
const stack = root.createComponent(BlockStack, {spacing: 'base'});
stack.append(image);
stack.append(heading);
stack.append(delivery);
root.append(stack);
});Anchor to Best practicesBest practices
- Always provide descriptive alt text: Write alt text that describes what's in the image, not what the image is for. Use "Blue cotton t-shirt with crew neck" instead of "Product image." For decorative images that don't add information, use an empty
accessibilityLabelwithaccessibilityRole="decorative". - Use images for meaningful content, not decoration: Display product photos, diagrams, charts, or instructional screenshots. For icons or decorative elements, use the Icon component instead.
- Ensure images are accessible and performant: Use appropriate image formats (WebP for photos, PNG for graphics with transparency). Ensure images load from reliable sources with proper CORS configuration if cross-origin.
- Consider the image's purpose and context: Use images to help customers understand products, visualize data, or follow instructions. Every image should serve a clear purpose in your interface.
Anchor to LimitationsLimitations
- Images can be loaded from remote URLs. Cross-origin images require proper CORS headers from the image host.
- The component displays images at their intrinsic aspect ratio unless overridden with
aspectRatio. Usefit("cover"or"contain") to control how the image resizes within its container. - The component provides a basic placeholder while images load but doesn't include built-in loading skeletons. Use SkeletonImage for loading placeholders.