Theming
December 10, 2025 ยท View on GitHub
Customize the visual appearance of svelte-image-input components using CSS custom properties (CSS variables).
Overview
All components support theming through CSS custom properties. You can override these variables to match your application's design system, support dark mode, or create custom themes.
CSS Variables
ImageLoader Component
Drop Area
--image-loader-border-color: Border color (default:#ccc)--image-loader-border-width: Border width (default:2px)--image-loader-border-style: Border style (default:dashed)--image-loader-border-radius: Border radius (default:0)--image-loader-background-color: Background color (default:#f9f9f9)--image-loader-text-color: Text color (default:inherit)
Hover States
--image-loader-hover-border-color: Border color on hover (default:#999)--image-loader-hover-background-color: Background color on hover (default:#f0f0f0)
Button
--image-loader-button-color: Button text color (default:inherit)--image-loader-button-background: Button background (default:transparent)--image-loader-button-border-width: Button border width (default:1px)--image-loader-button-border-style: Button border style (default:solid)--image-loader-button-border-color: Button border color (default:currentColor)--image-loader-button-border-radius: Button border radius (default:0)--image-loader-button-hover-color: Button text color on hover (default:inherit)--image-loader-button-hover-background: Button background on hover (default:transparent)--image-loader-button-hover-border-color: Button border color on hover (default:currentColor)
ImageEncoder Component
--image-encoder-background-color: Canvas background color (default:transparent)--image-encoder-cursor: Cursor style (default:move)
ImageInput Component
--image-input-background: Container background (default:transparent)
Clear Button
--image-input-clear-button-color: Clear button color (default:inherit)--image-input-clear-button-background: Clear button background color (default:rgba(0, 0, 0, 0.1))--image-input-clear-button-border-color: Clear button border color (default:transparent)--image-input-clear-button-border-radius: Clear button border radius (default:0)--image-input-clear-button-hover-color: Clear button color on hover (default:inherit)--image-input-clear-button-hover-background: Clear button background color on hover (default:rgba(0, 0, 0, 0.2))--image-input-clear-button-hover-border-color: Clear button border color on hover (default:transparent)--image-input-clear-button-size: Clear button font size (default:1.5em)
Usage
Global Theme
Apply theme variables globally to affect all components:
<style>
:global(body) {
--image-loader-border-color: #4a7cf8;
--image-loader-background-color: #f0f4ff;
--image-loader-hover-border-color: #2a5cd6;
--image-loader-hover-background-color: #e0e8ff;
}
</style>
<ImageInput bind:url />
Component-Level Theme
Apply theme to specific components using a wrapper:
<div class="custom-theme">
<ImageInput bind:url />
</div>
<style>
.custom-theme {
--image-loader-border-color: #4a7cf8;
--image-loader-background-color: #f0f4ff;
--image-loader-button-color: #4a7cf8;
--image-input-clear-button-color: #4a7cf8;
}
</style>
Using Classes Prop
You can also use the classes prop with global styles:
<ImageInput bind:url classes="my-theme" />
<style>
:global(.my-theme) {
--image-loader-border-color: #4a7cf8;
--image-loader-background-color: #f0f4ff;
}
</style>
Example Themes
Dark Theme
<style>
.dark-theme {
--image-loader-border-color: #666;
--image-loader-background-color: #2a2a2a;
--image-loader-text-color: #fff;
--image-loader-hover-border-color: #888;
--image-loader-hover-background-color: #333;
--image-loader-button-color: #fff;
--image-encoder-background-color: #1a1a1a;
--image-input-clear-button-color: #fff;
--image-input-clear-button-hover-background: rgba(255, 255, 255, 0.1);
}
</style>
<div class="dark-theme">
<ImageInput bind:url />
</div>
Brand Theme
<style>
.brand-theme {
--image-loader-border-color: #4a7cf8;
--image-loader-background-color: #f0f4ff;
--image-loader-text-color: #333;
--image-loader-hover-border-color: #2a5cd6;
--image-loader-hover-background-color: #e0e8ff;
--image-loader-button-color: #4a7cf8;
--image-loader-button-hover-color: #2a5cd6;
--image-input-clear-button-color: #4a7cf8;
--image-input-clear-button-background: rgba(74, 124, 248, 0.1);
--image-input-clear-button-border-color: #4a7cf8;
--image-input-clear-button-border-radius: 50%;
--image-input-clear-button-hover-background: rgba(74, 124, 248, 0.2);
}
</style>
<div class="brand-theme">
<ImageInput bind:url />
</div>
Minimal Theme
<style>
.minimal-theme {
--image-loader-border-color: #e0e0e0;
--image-loader-border-width: 1px;
--image-loader-background-color: #fff;
--image-loader-hover-border-color: #b0b0b0;
--image-loader-text-color: #666;
--image-loader-button-color: #333;
}
</style>
<div class="minimal-theme">
<ImageInput bind:url />
</div>
Accessibility
When creating custom themes, ensure:
- Contrast Ratios: Text and backgrounds meet WCAG AA standards (4.5:1 for normal text)
- Focus Indicators: Maintain visible focus indicators for keyboard navigation
- Color Independence: Don't rely solely on color to convey information
Tips
- Variables cascade from parent elements, so you can set them at any level
- Default values ensure components work out of the box
- You can override individual variables without affecting others
- Combine with the
classesprop for maximum flexibility