# Leptos Image
[![Crates.io](https://img.shields.io/crates/v/leptos_image.svg)](https://crates.io/crates/leptos_image)
[![docs.rs](https://docs.rs/leptos_image/badge.svg)](https://docs.rs/leptos_image)
> Crafted with inspiration from Next.js
Images make a substantial impact on the size and performance of a website, so why not get them right?
Enter Leptos ``, a component that enhances the standard HTML `` element with automatic image optimization features.
## Features
- **Size Optimization**: Automatically resizes images and converts them to the modern `.webp` format for an optimal balance of size and quality.
- **Low-Quality Image Placeholders (LQIP)**: Embeds SVG placeholders extracted from original images into server-side rendered HTML, improving perceived performance during image loading.
- **Faster Page Load**: Prioritizes critical images, impacting Largest Contentful Paint (LCP), with the `priority` prop by adding a preload `` to the document head, accelerating load times.
## Version compatibility for Leptos and Leptos Image
The table below shows the compatible versions of `leptos_image` for each `leptos` version. Ensure you are using compatible versions to avoid potential issues.
| `leptos` version | `leptos_image` version |
|------------------|------------------------|
| 0.6.* | 0.2.* |
## Installation
To add `leptos_image` to your project, use cargo:
```bash
cargo add leptos_image --optional
```
Enable the SSR feature in your `Cargo.toml`:
```toml
[features]
ssr = [
"leptos_image/ssr",
# other dependencies...
]
hydrate = [
"leptos_image/hydrate",
# other dependencies...
]
```
## Quick Start
> This requires SSR + Leptos Axum integration
1. **Provide Image Context**: Initialize your Leptos application with `leptos_image::provide_image_context` to grant it read access to the image cache.
```rust
use leptos::*;
#[component]
fn App() -> impl IntoView {
leptos_image::provide_image_context();
// Your app content here
}
```
2. **Axum State Configuration**: Incorporate `ImageOptimizer` into your app's Axum state.
```rust
// Composite App State with the optimizer and leptos options.
#[derive(Clone, axum::extract::FromRef)]
struct AppState {
leptos_options: leptos::LeptosOptions,
optimizer: leptos_image::ImageOptimizer,
}
```
3. **Integrate with Router**: Ensure your `ImageOptimizer` is available during SSR of your Leptos App.
- Add Image Cache Route: Use `image_cache_route` to serve cached images.
- Add `ImageOptimizer` to your App state.
- Add `ImageOptimizer` to Leptos Context: Provide the optimizer to Leptos context using `leptos_routes_with_context`.
```rust
use leptos::*;
use leptos_axum::*;
use leptos_image::*;
async fn main() {
// Get Leptos options from configuration.
let conf = get_configuration(None).await.unwrap();
let leptos_options = conf.leptos_options;
let root = leptos_options.site_root.clone();
// Create App State with ImageOptimizer.
let state = AppState {
leptos_options,
optimizer: ImageOptimizer::new("/__cache/image", root, 1),
};
// Create your router
let app = Router::new()
.route("/api/*fn_name", post(handle_server_fns))
// Add a handler for serving the cached images.
.image_cache_route(&state)
// Provide the optimizer to leptos context.
.leptos_routes_with_context(&state, routes, state.optimizer.provide_context(), App)
.fallback(fallback_handler)
// Provide the state to the app.
.with_state(state);
}
```
A full working example is available in the [examples](./example/start-axum) directory.
Now you can use the Image Component anywhere in your app!
```rust
#[component]
pub fn MyImage() -> impl IntoView {
view! {
}
}
```
This setup ensures your Leptos application is fully equipped to deliver optimized images, enhancing the performance and user experience of your web projects.