svelte-cloudinary/README.md

143 lines
3.9 KiB
Markdown
Raw Normal View History

2020-11-08 10:45:38 +00:00
# svelte-cloudinary
This is a little library that aims at integrating and making it easier to use the svelte with [Cloudinary](https://cloudinary.com/).
2020-11-16 15:17:38 +00:00
There is an official integration coming, but it's not ready and for not does not work great for now (SSR e.g.).
2020-11-08 10:45:38 +00:00
2020-11-11 20:36:03 +00:00
## 🌈 Features
- Fully typed and typescript compatible
- [Tiny: `~30kb gzip`](https://bundlephobia.com/result?p=svelte-cloudinary) (Of which 99% is the cloudinary dep.)
- Automatic **resizing** based on the DOM and applied CSS
- Automatic **lazy loading**
- Fully compatible with native cloudinary options
2020-11-11 20:55:50 +00:00
- Sapper (SSR) compatible
2020-11-11 20:36:03 +00:00
2020-11-11 20:36:22 +00:00
## 🗂 [Docs](https://svelte-cloudinary.vercel.app/modules/_index_)
2020-11-08 10:45:38 +00:00
## 🚀 Quickstart
```bash
yarn add svelte-cloudinary
```
```svelte
<script>
2020-11-08 10:47:45 +00:00
import { image, initialize } from 'svelte-cloudinary'
initialize({ cloud_name: 'myCloudinaryCloud' })
2020-11-08 10:45:38 +00:00
const src = 'my/cloudinary/asset'
</script>
<style>
img {
width: 50vw;
height: 50vh;
object-fit: cover;
}
</style>
<img
2020-11-11 20:36:03 +00:00
use:image={{ src, bind: true, lazy: true }}
2020-11-08 10:45:38 +00:00
class="home-img"
alt="background" />
```
This will formulate the Cloudinary url and insert it into the `img.src` property.
Also it will resize to the `img` object itself because we set `bind: true`.
2020-11-16 15:29:01 +00:00
## 🤔 Why an [action](https://svelte.dev/docs#use_action) and not component?
Well components are great of course, but when we only need to set a `src` tags we can leverage the upsides of a svelte [action](https://svelte.dev/docs#use_action)
What are benefits?
- Native styling (Svelte for now does not allow easy styling of child components
- Lightweight
- Reusable and composable
Downsides:
- The src will not be set serverside, so also not in the initial server response. Which I believe is not that bad though for images.
## 🤓 Key Concepts
2020-11-11 20:52:25 +00:00
### `step`
The `step` property (defaults to `200`) helps reducing the amounts of transformations cloudinary need to perform and less credits being billed to you.
How? Basically whenever we calculate the dynamic size of the image rendered on the DOM we will get very specific numbers depending on the device.
With `step` we approximate the size needed to a multiple of `step`.
###### Example
2020-11-12 10:19:54 +00:00
Imagine the same `<img />` has the width of `420`,`470` and `1080` on an iPhone, Android and Laptop respectively.
2020-11-11 20:52:25 +00:00
With a `step` size of e.g. `100` (`<img use:image={{ ..., step: 100 }} />`) they will become `500`, `500`, and `1100`. This will limit the ammount of transformations needed.
### `bind`
2020-11-12 10:19:54 +00:00
With bind we can dynamically set the width and/or height of the transformed image depending of the rendered size.
2020-11-11 20:52:25 +00:00
- `bind: this` The size of the `<img />` element
2020-11-12 10:19:54 +00:00
- `bind: el` The computed size of another element in the dom (useful for a carousel e.g.)
2020-11-11 20:52:25 +00:00
- `bind: { width: this }` Only bind the width, leaving the height free. Also works with height of course
- `bind: { width: '.wrapper' }` Finds the closest element that matches the selector and uses it for width.
##### Note
2020-11-12 10:19:54 +00:00
If you provide a `bind` options (`<img use:image={{..., bind: true }} />`) but no crop option, we will automatically add `crop: 'fill'` otherwise the image will not be resized by cloudinary.
2020-11-11 20:52:25 +00:00
###### TLDR;
```svelte
<img use:image={{ src, bind: true }} />
<!-- Is internally equivalent to the following -->
<img use:image={{ src, bind: true, options: { crop: 'fill' } }} />
```
2020-11-11 20:36:03 +00:00
## ⌨️ Examples
2020-11-08 10:45:38 +00:00
2020-11-11 20:52:25 +00:00
### Fixed size
```svelte
<img
use:image={{ src, options: { width: 200, height: 100, crop: 'fill' } }}
/>
```
### `bind`
2020-11-08 10:45:38 +00:00
```svelte
<!-- Simple -->
<img
use:image={{ src, bind: true, }}
/>
```
```svelte
<!-- Bind size to parent with selectors -->
<div class="wrapper"
<img
use:image={{ src, bind: '.wrapper', }}
/>
</div>
```
```svelte
<!-- Bind width to parent with element -->
<div class="wrapper"
<img
use:image={{ src, bind: { width: '.wrapper' }, }}
/>
</div>
```
### `options`
Native cloudinary options. See [here for official docs](https://cloudinary.com/documentation/image_transformations)
For a quick glance