Using Pintura Image Editor with Alpine
For a quick start use the Alpine example project as a guideline.
Alpine implementation example
In the example below we'll use the appendDefaultEditor
method to quickly add an image editor to an HTML element.
This creates a "default" editor that has all available plugins loaded and comes preset with all plugin default options and English locale. Each of these settings can be adjusted freely.
<!DOCTYPE html>
<link rel="stylesheet" href="./pintura.css" />
<!-- Alpine Pintura custom directive, see code snippet below -->
<script src="./alpine-pintura/index.js" type="module" defer></script>
<!-- Load Alpine library -->
<script src="./alpine/alpine.min.js" defer></script>
<div x-data="{ src: null, dest: null }">
<!-- Load images from file input -->
<input
x-show="!src"
type="file"
@change="(e) => {
// Get the first file
const [file] = e.target.files;
// Check if is defined and is image
if (!file || !/image/.test(file.type)) return;
// Set as editor source
src = file;
}"
/>
<!-- Load a local or remote image -->
<button x-show="!src" @click="src = 'image.jpeg'">Load local image</button>
<!-- Displays resulting image if defined -->
<img x-show="dest && !src" :src="dest" alt="" />
<!-- Pintura node -->
<div
style="width: 90vw; height: 600px"
x-show="src"
x-pintura="{
src,
imageCropAspectRatio: 1,
}"
@pintura:init="(e) => {
// Clear previous result (if any)
dest = null;
}"
@pintura:load="(e) => {
// Just to show what the load event contains
console.log('load', e);
}"
@pintura:process="(e) => {
// Called when an image is processed
console.log('process', e);
// Clear source so editor hides
src = null;
// Show resulting image
dest = URL.createObjectURL(e.detail.dest);
}"
></div>
</div>
Alpine custom directive for Pintura
This code creates a basic Alpine Pintura directive to create inline editors.
It routes the editor events to the directive DOM node using dispatchEditorEvents
, it creates reactive properties using effect
, and it cleans up the editor instance and event routes when the node is destroyed.
import {
appendDefaultEditor,
dispatchEditorEvents,
} from '../node_modules/@pqina/pintura/pintura.js';
document.addEventListener('alpine:init', () => {
Alpine.directive(
'pintura',
(el, { expression }, { evaluateLater, effect, cleanup }) => {
// create editor
const editor = appendDefaultEditor(el);
// route editor events to element
const unsubs = dispatchEditorEvents(editor, el);
// handle prop updates
const getUpdatedProps = evaluateLater(expression);
effect(() => {
getUpdatedProps((props) => {
Object.assign(editor, props);
});
});
// clean up editor
cleanup(() => {
// destroy editor instance
editor.destroy();
// unsub all routed events
unsubs.forEach((unsub) => unsub());
});
}
);
});
Next steps
With the editor set up, we can continue to configure the editor to our liking by adjusting the available options exposed by the editor API