Image Input
ImageInput is a headless graphical submit button that renders a native <input type="image"> element. It displays an image defined by the src attribute and submits the form when clicked. The alt attribute displays if the image source is missing.
Use this component when you need a graphical submit button in forms, such as custom-styled submit buttons, clickable image actions, or branded form submission controls.
Usage
<ImageInput src="/icons/submit.png" alt="Submit form" />
<ImageInput src="/icons/search.svg" alt="Search" width={24} height={24} />
<ImageInput src="/branding/go-button.png" alt="Go" disabled={!formValid} />
Props
src: string (required) -- URL of the image to display
alt: string (required) -- alternative text for the image; serves as accessible name
width: number | undefined (default: undefined) -- width of the image in pixels
height: number | undefined (default: undefined) -- height of the image in pixels
disabled: boolean (default: false) -- whether the button is disabled
...restProps: unknown -- additional attributes spread onto the <input> element
Keyboard Interactions
- Enter: activates the image button and submits the form
- Space: activates the image button and submits the form
Note: keyboard interactions are provided natively by the <input type="image"> element.
ARIA
No additional ARIA attributes are needed. The native <input type="image"> element has an implicit button role and the alt attribute serves as its accessible name.
When to Use
- Use as a graphical submit button inside HTML forms when you want a clickable image instead of a text button.
- Use when branding or design requires a custom image as the form submission trigger.
- Avoid when you need a standard text-based submit button; use SubmitInput instead.
- Avoid when you need a non-submit image button; use a Button with an Image child instead.
When Not to Use
- Do not use when a plain text submit button is sufficient — use
SubmitInput for that.
- Do not use for a non-submit image button (no form submission, just a click handler) — use
Button with an Image child or use IconButton.
- Do not use as a generic image — use
Image for non-interactive images.
- Do not use without meaningful
alt text; the alt is the accessible name and is required for screen reader users.
- Do not rely on the click coordinates submitted by
<input type="image"> (name.x, name.y) for new code — modern UIs should not depend on this legacy behavior.
Headless
This headless component renders a native <input type="image"> element with configurable src, alt, width, height, and disabled props. It provides built-in form submission behavior with no additional ARIA needed. The consumer provides all visual styling including borders, shadows, hover/focus states, and sizing.
Styles
The consumer provides all CSS styling. The component renders with a .image-input class for targeting. Common styling includes removing default borders, adding hover effects, and controlling dimensions.
Testing
- Verify the component renders an
<input> element with type="image"
- Verify
src is set from the src prop
- Verify
alt is set from the alt prop
- Verify
width and height attributes are set when provided
- Verify
disabled attribute propagates correctly
- Verify pass-through attributes are applied
Advice
- Designers: Ensure the image clearly communicates its submit action. Provide sufficient contrast and hover/focus indicators. Always include meaningful alt text for accessibility.
- Developers: Always provide a descriptive
alt prop for screen reader users. Consider providing width and height to prevent layout shift during image loading.
Implementation Notes
- Renders a native
<input type="image"> element for graphical form submission
- The browser automatically triggers the containing form's
submit event when clicked
- Submits the click coordinates (x, y) as part of the form data
- The
src prop specifies the image URL to display
- The
alt prop provides alternative text when the image cannot be displayed and serves as the accessible name
- Supports
width and height props for image dimensions
- Supports
disabled to prevent interaction
- Spreads
restProps onto the input for consumer customization
- No additional ARIA attributes needed beyond the native semantics of
<input type="image">
Related components
image — an image element with alt text
button-input — an input element of type button for form actions <input type="button">
References
- MDN input type="image": https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/image
- HTML spec input type="image": https://html.spec.whatwg.org/multipage/input.html#image-button-state-(type=image)
Canonical contract
Generated from this component's canonical metadata — the machine-checked source the implementations are held to.
Metadata
- Component: image-input
- PascalCase: ImageInput
- Description: a graphical submit button that displays an image <input type="image">
- Status: beta — implemented and unit-tested in all seven frameworks with an axe-clean demo page; not yet exercised in composed flows
- HTML tag: <input>
- CSS class: .image-input
- Interactive: yes
ARIA
- Native
<input type="image"> exposes itself as a button to assistive technology alt (set from label) provides the accessible name — required
Keyboard
- Enter: activates the image button and submits the form
- Space: activates the image button and submits the form
Props
src: string (required) -- URL of the image to display alt: string (required) -- alternative text for the image; serves as accessible name width: number | undefined (default: undefined) -- width of the image in pixels height: number | undefined (default: undefined) -- height of the image in pixels disabled: boolean (default: false) -- whether the button is disabled ...restProps: unknown -- additional attributes spread onto the <input> element