# Setting up Pintura Image Editor with Vue

For a quick start use the [Vue 3 example project](https://github.com/pqina/pintura-example-vue-3) or [Vue 2 example project](https://github.com/pqina/pintura-example-vue-2) as a guideline.

It includes a normal, modal, and overlay editor example, as well as an example showing how to integrate FilePond with Pintura.

## Installing the Vue modules

### Using test version

Test versions of the `pintura` and `vue-pintura` modules are available on NPM.

```bash
npm install --save @pqina/vue-pintura @pqina/pintura
```

### Using private npm

The `pintura` module is available on the pqina private npm.

In our project root directory we create a file called `.npmrc` and copy the snippet below to the file. Then we replace `PQINA_NPM_KEY` with our private npm key as displayed on the pqina customer portal.

```bash
@pqina:registry=https://npm.pqina.nl/
//npm.pqina.nl/:_authToken=PQINA_NPM_KEY
```

Now we can install the needed modules like shown below.

```bash
npm install --save @pqina/vue-pintura @pqina/pintura
```

### Using local modules

Instead of installing from the private npm we can create a `local_modules` folder inside our project root directory. We then copy paste the `pintura` files from the product package, the `vue-pintura` package is available on npm.

We can now install the modules like shown below.

```bash
npm install --save @pqina/vue-pintura ./local_modules/pintura
```

### Using Pintura with Vue 2

When using the `vue-pintura` module with Vue 2 we need to import the Pintura components from `@pqina/vue-pintura/vue-2` instead of `@pqina/vue-pintura`

## Vue Events and properties

To listen for DOM [events](../../api/ui/events/) we can use the Vue `v-on` directive. Please note that just as with the [Pintura Image Editor Custom Element](../../api/ui/events/#subscribing-to-events) events are prefixed with `pintura:`, so instead of listen for `load` we listen for `pintura:load`.

```html
<PinturaEditor @pintura:load="handleImageLoad($event)"></PinturaEditor>
```

Properties can be used as we would with the normal JavaScript version of the editor but should be prefixed with a colon `':'`, so `src` needs to be set as `:src`

```html
<PinturaEditor :src="image.jpeg"></PinturaEditor>
```

## Default Vue implementation example

In the default example below we'll use the [getEditorDefaults](../../api/ui/exports/#editor) method to quickly create an image editor.

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.

```html
<template>
    <div>
        <div style="height: 600px">
            <PinturaEditor
                v-bind="editorDefaults"
                :src="src"
                :imageCropAspectRatio="imageCropAspectRatio"
            ></PinturaEditor>
        </div>
    </div>
</template>
<script>
    // Import the editor default configuration
    import { getEditorDefaults } from '@pqina/pintura';

    // Import the component from `vue-pintura`
    // When using Vue 2 import from @pqina/vue-pintura/vue-2 instead
    import { PinturaEditor } from '@pqina/vue-pintura';

    export default {
        name: 'App',
        components: {
            PinturaEditor,
        },
        data() {
            return {
                // Pass the editor default configuration options
                editorDefaults: getEditorDefaults(),

                // The source image to load
                src: 'image.jpeg',

                // This will set a square crop aspect ratio
                imageCropAspectRatio: 1,
            };
        },
    };
</script>
<style>
    @import '../node_modules/@pqina/pintura/pintura.css';

    // When using local_modules replace with
    // @import '../local_modules/pintura/pintura.css';
</style>
```

## Advanced Vue implementation example

In this example we'll create a custom editor, using a custom set of plugins, locale, and available options.

While this example is a lot more verbose it does allow us to create a more optimal editor package. The build process will tree-shake unused functionality resulting in a smaller build target.

```html
<template>
    <div>
        <div style="height: 600px">
            <PinturaEditor
                v-bind="editorDefaults"
                :src="src"
                :imageCropAspectRatio="imageCropAspectRatio"
            ></PinturaEditor>
        </div>
    </div>
</template>
<script>
    // Import the editor functionality
    import {
        // Import the default image reader and writer
        createDefaultImageReader,
        createDefaultImageWriter,

        // The method used to register the plugins
        setPlugins,

        // The plugins we want to use
        plugin_crop,
        plugin_finetune,
        plugin_annotate,

        // The user interface and plugin locale objects
        locale_en_gb,
        plugin_crop_locale_en_gb,
        plugin_finetune_locale_en_gb,
        plugin_annotate_locale_en_gb,

        // Because we use the annotate plugin we also need
        // to import the markup editor locale and the shape preprocessor
        markup_editor_locale_en_gb,
        createDefaultShapePreprocessor,

        // Import the default configuration for the markup editor and finetune plugins
        markup_editor_defaults,
        plugin_finetune_defaults,
    } from '@pqina/pintura';

    // Import the component from `vue-pintura`
    // When using Vue 2 import from @pqina/vue-pintura/vue-2 instead
    import { PinturaEditor } from '@pqina/vue-pintura';

    // This registers the plugins with Pintura Image Editor
    setPlugins(plugin_crop, plugin_finetune, plugin_annotate);

    export default {
        name: 'App',
        components: {
            PinturaEditor,
        },
        data() {
            return {
                // Our editor custom configuration options
                editorDefaults: {
                    // This will read the image data (required)
                    imageReader: createDefaultImageReader(),

                    // This will write the output image
                    imageWriter: createDefaultImageWriter(),

                    // The markup editor default options, tools, shape style controls
                    ...markup_editor_defaults,

                    // The finetune util controls
                    ...plugin_finetune_defaults,

                    // This handles complex shapes like arrows / frames
                    shapePreprocessor: createDefaultShapePreprocessor(),

                    // This will set a square crop aspect ratio
                    imageCropAspectRatio: 1,

                    // The icons and labels to use in the user interface (required)
                    locale: {
                        ...locale_en_gb,
                        ...plugin_crop_locale_en_gb,
                        ...plugin_finetune_locale_en_gb,
                        ...plugin_annotate_locale_en_gb,
                        ...markup_editor_locale_en_gb,
                    },
                },

                // The source image to load
                src: 'image.jpeg',

                // This will set a square crop aspect ratio
                imageCropAspectRatio: 1,
            };
        },
    };
</script>
<style>
    @import '../node_modules/@pqina/pintura/pintura.css';

    // When using local_modules replace with
    // @import '../local_modules/pintura/pintura.css';
</style>
```

## 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](../../api/image-editor/)