Getting Started

Install svelte-chop-chop and add image cropping to your Svelte 5 app in minutes.

Installation

npm install @we-are-singular/svelte-chop-chop

Peer dependencies

Only Svelte 5 is required as a peer dependency:

peerDependencies:
  svelte: "^5.0.0"

Basic cropper

Import the Cropper component and pass it an image source:

<script lang="ts">
  import { Cropper } from '@we-are-singular/svelte-chop-chop';
  import '@we-are-singular/svelte-chop-chop/themes/default';

  let cropper = $state<ReturnType<typeof Cropper.create>>();

  async function crop() {
    const blob = await cropper?.export({ format: 'image/webp', quality: 0.9 });
    // use the blob...
  }
</script>

<Cropper
  bind:this={cropper}
  src="/photo.jpg"
  aspectRatio={1}
/>
<button onclick={crop}>Crop</button>

Full image editor

The ImageEditor component bundles crop, filters, finetune, rotate, resize, frame and watermark panels:

<script lang="ts">
  import { ImageEditor } from '@we-are-singular/svelte-chop-chop';
  import { pluginFilters } from '@we-are-singular/svelte-chop-chop/plugins/filters';
  import { pluginFinetune } from '@we-are-singular/svelte-chop-chop/plugins/finetune';
  import { pluginFrame } from '@we-are-singular/svelte-chop-chop/plugins/frame';
  import { pluginWatermark } from '@we-are-singular/svelte-chop-chop/plugins/watermark';
  import { pluginResize } from '@we-are-singular/svelte-chop-chop/plugins/resize';
  import '@we-are-singular/svelte-chop-chop/themes/default';
</script>

<ImageEditor
  src="/photo.jpg"
  plugins={[pluginFilters(), pluginFinetune(), pluginFrame(), pluginWatermark(), pluginResize()]}
  onexport={(blob) => console.log('exported', blob)}
/>

Headless composable

Need full UI control? Use createCropper directly:

<script lang="ts">
  import { createCropper } from '@we-are-singular/svelte-chop-chop/headless';

  const cropper = createCropper({
    aspectRatio: 16 / 9,
    minWidth: 100,
    minHeight: 100,
  });
</script>

<div use:cropper.bindContainer class="my-container">
  <img use:cropper.bindImage src="/photo.jpg" alt="" />
</div>

CSS themes

Three themes are included. Import exactly one:

import '@we-are-singular/svelte-chop-chop/themes/default'; // recommended
import '@we-are-singular/svelte-chop-chop/themes/dark';
import '@we-are-singular/svelte-chop-chop/themes/minimal';

Next steps