{"id":22490670,"url":"https://github.com/timtnleeProject/vuejs-clipper","last_synced_at":"2025-08-02T22:33:25.085Z","repository":{"id":33015090,"uuid":"144592765","full_name":"timtnleeProject/vuejs-clipper","owner":"timtnleeProject","description":"Vue.js image clipping components using Vue-Rx.","archived":false,"fork":false,"pushed_at":"2022-12-12T01:49:44.000Z","size":23943,"stargazers_count":208,"open_issues_count":11,"forks_count":32,"subscribers_count":6,"default_branch":"master","last_synced_at":"2024-11-30T06:37:20.675Z","etag":null,"topics":["clip-images","clipper","crop-image","vue","vue-components","vue-rx","vuejs-clipper"],"latest_commit_sha":null,"homepage":"https://timtnleeproject.github.io/vuejs-clipper/#/","language":"Vue","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/timtnleeProject.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-08-13T14:40:29.000Z","updated_at":"2024-06-19T09:14:09.000Z","dependencies_parsed_at":"2023-01-14T23:15:29.538Z","dependency_job_id":null,"html_url":"https://github.com/timtnleeProject/vuejs-clipper","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timtnleeProject%2Fvuejs-clipper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timtnleeProject%2Fvuejs-clipper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timtnleeProject%2Fvuejs-clipper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timtnleeProject%2Fvuejs-clipper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/timtnleeProject","download_url":"https://codeload.github.com/timtnleeProject/vuejs-clipper/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228501414,"owners_count":17930243,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clip-images","clipper","crop-image","vue","vue-components","vue-rx","vuejs-clipper"],"created_at":"2024-12-06T17:22:30.797Z","updated_at":"2024-12-06T17:25:35.614Z","avatar_url":"https://github.com/timtnleeProject.png","language":"Vue","funding_links":[],"categories":["Vue"],"sub_categories":[],"readme":"# vuejs-clipper\n\nVue.js image clipping components using Vue-Rx.\n\n[![not found](https://img.shields.io/npm/v/vuejs-clipper.svg)](https://www.npmjs.com/package/vuejs-clipper)\n![status](https://github.com/timtnleeProject/vuejs-clipper/actions/workflows/publish.yml/badge.svg)\n\n- Add image clipping components to your Vue application in nothing flat.\n- Touch devices supported and fully responsive.\n\n## Demo/Document\n\nYou can find the source code of examples under the `examples` branch.\n\n- [Live demo \u0026 examples](https://timtnleeproject.github.io/vuejs-clipper)\n- [Quick Start](https://timtnleeproject.github.io/vuejs-clipper/#/examples/quick-start)\n- [Try it on codepen](https://codepen.io/timtnlee/pen/vzzqRM)\n- [README](https://github.com/timtnleeProject/vuejs-clipper#vuejs-clipper)\n- [vuejs-clipper wiki](https://github.com/timtnleeProject/vuejs-clipper/wiki)\n\n## Table of Contents\n\n- [Notice](#notice)\n- [Installation (NPM \u0026 ESM)](#installation-npm--esm)\n- [Installation (Script)](#installation-script)\n- [Components](#components)\n- [Changelog](#changelog)\n\n## Notice\n\n**Before using the plugin \u0026 components, here's something you should know:**\n\n- It's based on [**vue-rx**](https://github.com/vuejs/vue-rx).\n- [**rxjs**](https://github.com/ReactiveX/rxjs/tree/6.x) and [**vue-rx**](https://github.com/vuejs/vue-rx) are required as peer dependencies.\n- Components are responsive base on **width** instead of height, see [Component Layout](https://github.com/timtnleeProject/vuejs-clipper/wiki/Component-layout).\n- You can clip your images (local uploaded images or images served on your site), but you cannot clip a cross-origin image unless the image server sets the CORS headers.\n- Components' **input** is an image URL, **output** is a canvas element, they only help you clip images to canvas, you need to handle other things like _transform file input to image URL_ or _transform output canvas to image_ by yourself.\n- If you set the clipper to be _responsive_, for example: put it in a `Row, Col` system or set its width based on the container's width, _you will lose a little bit of precision_. The result of the clipper and the clip box position might not be that accurate. If you cannot tolerate the slippage, use fixed width `${width + border*2}px` on the clipper component like `width: 502px`.\n\n## Installation (NPM \u0026 ESM)\n\nInstall vuejs-clipper\n\n```bash\nnpm install vuejs-clipper --save\n```\n\nInstall peer dependencies if you haven't.\n\n```bash\nnpm install vue-rx rxjs --save\n```\n\nVuejs-clipper is based on **vue-rx**, so make sure you have the vue-rx plugin installed.\n\n```javascript\nimport Vue from 'vue'\nimport VueRx from 'vue-rx'\n// install vue-rx\nVue.use(VueRx)\n```\n\nMake sure to install **vue-rx** plugin first.\n\n### Import\n\n#### use dist files (Recommanded)\n\n```javascript\nimport Vue from 'vue'\nimport VueRx from 'vue-rx'\n// Use build files\nimport VuejsClipper from 'vuejs-clipper/dist/vuejs-clipper.umd.min'\nimport 'vuejs-clipper/dist/vuejs-clipper.css'\n\nVue.use(VueRx)\nVue.use(VuejsClipper)\n```\n\n#### use vuejs-clipper soruce\n\n\u003e Not Recommanded, through this way you need to make sure your project' sass and sass-loader version is supported\n\nYou are using `vuejs-clipper` directly with your build process(webpack etc).\n\nSo make sure you have css loader, ex: `sass-loader` if you haven't installed :\n\n\u003e vuejs-clipper@4 only support `sass` (not `node-sass`) for this approach\n\n```bash\nnpm install -D sass-loader sass\n```\n\n```javascript\nimport Vue from 'vue'\nimport VueRx from 'vue-rx'\nimport VuejsClipper from 'vuejs-clipper'\n// install vue-rx\nVue.use(VueRx)\n// install vuejs-clipper\nVue.use(VuejsClipper)\n```\n\n### Config\n\nBy default vuejs-clipper plugin will register **all components** to Vue global scope.\n\nregister some components to global with default component name\n\n```javascript\nVue.use(VuejsClipper, {\n  components: {\n    clipperBasic: true,\n    clipperPreview: true\n  }\n})\n```\n\nwith the customized component name\n\n```javascript\nVue.use(VuejsClipper, {\n  components: {\n    clipperBasic: 'image-clipper-basic',\n    clipperPreview: 'my-preview'\n  }\n})\n```\n\nnot register any components, but with some plugin options\n\n```javascript\nVue.use(VuejsClipper, {\n  components: null,\n  parentPropName: 'myCustomerName'\n  /*\n   parentPropName:\n    Vuejs-clipper Adds property to Vue instance in order to store `clipper-preview` list.\n    You can change the property name\n    default: '_imgPreviewLists'\n  */\n})\n```\n\n#### separately import components (need css loader)\n\n```javascript\nimport Vue from 'vue'\nimport VueRx from 'vue-rx'\n// install vue-rx\nVue.use(VueRx)\n```\n\nthen import in your components (SFC)\n\n```javascript\nimport { clipperBasic, clipperPreview } from 'vuejs-clipper'\n\nexport default {\n  components: {\n    clipperBasic,\n    clipperPreview\n  }\n}\n```\n\n## Installation (Script)\n\nInclude vuejs-clipper umd script after Vue.js.\n\n```html\n\u003c!-- rxjs--\u003e\n\u003cscript src=\"https://unpkg.com/rxjs/bundles/rxjs.umd.js\"\u003e\u003c/script\u003e\n\u003c!--vue--\u003e\n\u003cscript src=\"https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js\"\u003e\u003c/script\u003e\n\u003c!-- vue-rx--\u003e\n\u003cscript src=\"https://unpkg.com/vue-rx@6.2.0/dist/vue-rx.js\"\u003e\u003c/script\u003e\n\u003c!--vuejs-clipper script \u0026 style --\u003e\n\u003cscript src=\"./dist/vuejs-clipper.umd.min.js\"\u003e\u003c/script\u003e\n\u003clink rel=\"stylesheet\" href=\"./dist/vuejs-clipper.css\" /\u003e\n```\n\nUse in html/template\n\n```html\n\u003cclipper-basic src=\"example.jpg\"\u003e\u003c/clipper-basic\u003e\n```\n\n## Components\n\n![404](https://timtnleeproject.github.io/vuejs-clipper/doc-components.png)\n\n- [clipperBasic](#clipper-basic)\n- [clipperFixed](#clipper-fixed)\n- [clipperPreview](#clipper-preview)\n- [clipperUpload](#clipper-upload)\n- [clipperRange](#clipper-range)\n\nSee detail [examples](https://timtnleeproject.github.io/vuejs-clipper/#/examples).\n\n### clipper-basic\n\nan image clipping component\n\n```javascript\nimport { clipperBasic } from 'vuejs-clipper'\n```\n\n- Props\n\n| Prop         |              Type |           default | description                                                               |\n| ------------ | ----------------: | ----------------: | :------------------------------------------------------------------------ |\n| src          |            string |                   | image src                                                                 |\n| preview      |            string |                   | matches `clipper-preview`'s name to show preview image.                   |\n| border       |            number |                 1 | border width                                                              |\n| outline      |            number |                 6 | outlines near by the border to help user zooming.                         |\n| corner       |           boolean |              true | show corner layout                                                        |\n| grid         |           boolean |              true | show grid layout                                                          |\n| ratio        |            number |                   | ratio of clipping area (width/height). ex: `1`, `4/3` .                   |\n| wrap-ratio   |            number |               NaN | ratio of clipping container (width/height). ex: `1`, `4/3` .              |\n| mode         | 'normal'/'switch' |          'normal' | if ratio is set, this prop will affect how clipping area zoom.            |\n| bg-color     |            string |           'white' | background color                                                          |\n| lineColor    |            string |         '#1baae8' | clip box line color                                                       |\n| shadow       |            string | 'rgba(0,0,0,0.4)' | shadow color                                                              |\n| rotate       |            number |                 0 | rotate degree                                                             |\n| scale        |            number |                 1 | transform scale                                                           |\n| min-width    |            number |                 1 | minimum width(%) of clipping box related to clipping component's width    |\n| min-height   |            number |                 1 | minimum height(%) of clipping box related to clipping component's height. |\n| init-width   |            number |                50 | clipping area's width(%) when the image loaded.                           |\n| init-height  |            number |                50 | clipping area's height(%) when the image loaded.                          |\n| touch-create |           boolean |              true | enable/disable create new clipping area on touch device                   |\n| cross-origin |            string |         undefined | `crossorigin` attribute of `\u003cimg /\u003e` inside clipper. ex: `anonymous`      |\n\nFor more detail about the layout settings, pleases see [Component layout in depth](https://github.com/timtnleeProject/vuejs-clipper/wiki/Component-layout-in-depth).\n\n- Methods\n\n| method     | argument | return                                           | description                   |\n| ---------- | -------- | ------------------------------------------------ | ----------------------------- |\n| clip       | options  | canvas element                                   | get clipping canvas element   |\n| getDrawPos |          | `{pos, translate}`: positions and transformation | get result canvas information |\n\n`clip()` arguments\n\n[Resulting-canvas-size](https://github.com/timtnleeProject/vuejs-clipper/wiki/Resulting-canvas-size)\n\n| name              | type   | default   | description                                         |\n| ----------------- | ------ | --------- | --------------------------------------------------- |\n| options.wPixel    | number | undefined | Set the the width (pixel) of result canvas.         |\n| options.maxWPixel | number | undefined | Set the the maximum width (pixel) of result canvas. |\n\nset ref to use component methods\n\n```html\n\u003cclipper-basic ref=\"clipper\" /\u003e\n```\n\nin your Vue instance methods\n\n```javascript\nconst canvas = this.$refs.clipper.clip()\n```\n\n- Event\n\n| event | parameters | description   |\n| ----- | ---------- | ------------- |\n| load  | \\$event    | image onload  |\n| error | \\$error    | image onerror |\n\nusage :\n\n```html\n\u003cclipper-basic @error=\"errorCb\" @load=\"loadCb\" /\u003e\n```\n\n- Data\n\n| data     | type   | default | description                                                                                                                |\n| -------- | ------ | ------- | -------------------------------------------------------------------------------------------------------------------------- |\n| imgRatio | number | NaN     | upload image's ratio (image naturalWidth/natrualHeight). Default value is NaN, after the load event the value will be set. |\n| zoomTL\\$ | object |         | clipping area's position(%), can be top/bottom and left/right.                                                             |\n| zoomWH\\$ | object |         | clipping area's width and height(%)                                                                                        |\n\nusage :\n\n```javascript\nthis.$refs.clipper.imgRatio\nthis.$refs.clipper.zoomWH$.width\n```\n\n- Slot\n\n| slot        | description                            |\n| ----------- | -------------------------------------- |\n| placeholder | if no `src` provided, show placeholder |\n\n```html\n\u003cclipper-basic src=\"\"\u003e\n  \u003cdiv slot=\"placeholder\"\u003eNo image\u003c/div\u003e\n\u003c/clipper-basic\u003e\n```\n\n- rxjs Subject\n\n| subject    | description                                                        |\n| ---------- | ------------------------------------------------------------------ |\n| setTL\\$    | Set the position of the zooming area.                              |\n| setWH\\$    | Set the width and height of the zooming area.                      |\n| onChange\\$ | Subject that subscribes to zooming, moving, and rotating subjects. |\n\nusage:\n\n```javascript\nthis.$refs.clipper.setTL$.next({ left: 0, top: 0 }) // percentage 0%\nthis.$refs.clipper.setTL$.next({ right: 0, bottom: 10 })\nthis.$refs.clipper.setWH$.next({ width: 100, height: 100 }) // percentage 100%\n\nthis.$refs.clipper.onChange$.subscribe(() =\u003e {\n  // This happens whenever zooming, moving, and rotating occur.\n})\n```\n\n### clipper-fixed\n\nan image clipping component\n\n```javascript\nimport { clipperFixed } from 'vuejs-clipper'\n```\n\n- Props\n\n| Prop              |     Type |            default | description                                                                                     |\n| :---------------- | -------: | -----------------: | :---------------------------------------------------------------------------------------------- |\n| src               |   string |                    | image src                                                                                       |\n| preview           |   string |                    | matches `clipper-preview`'s name to show preview image.                                         |\n| ratio             |   number |                  1 | ratio of clipping area (width/height). ex: `1`, `4/3` .                                         |\n| zoom-rate         |   number |               0.04 | zooming faster if this value is larger                                                          |\n| min-scale         |   number |                0.1 | minimum transform scale                                                                         |\n| border            |   number |                  1 | border width                                                                                    |\n| border-color      |   string |            'white' | border color                                                                                    |\n| grid              |  boolean |               true | show grid layout                                                                                |\n| round             |  boolean |              false | Use a round clipping area, this only effect the component layout, also affect clipping results. |\n| bg-color          |   string |            'white' | background color                                                                                |\n| shadow            |   string |  'rgba(0,0,0,0.4)' | shadow color                                                                                    |\n| rotate            |   number |                  0 | rotate degree                                                                                   |\n| area              |   number |                 50 | width or height (%) of clipping box(depends on ratio).                                          |\n| cross-origin      |   string |          undefined | `crossorigin` attribute of `\u003cimg /\u003e` inside clipper. ex: `anonymous`                            |\n| handle-zoom-event | function | `(scale) =\u003e scale` | handle zooming, accept the calculated scale value, return the scale value.                      |\n\n- Method\n\n| method     | argument | return                                           | description                   |\n| ---------- | -------- | ------------------------------------------------ | ----------------------------- |\n| clip       | options  | canvas element                                   | get clipping canvas element.  |\n| getDrawPos |          | `{pos, translate}`: positions and transformation | get result canvas information |\n\n`clip()` arguments\n\n| name              | type   | default   | description                                         |\n| ----------------- | ------ | --------- | --------------------------------------------------- |\n| options.wPixel    | number | undefined | Set the the width (pixel) of result canvas.         |\n| options.maxWPixel | number | undefined | Set the the maximum width (pixel) of result canvas. |\n\n- Event\n\n| event | parameters | description   |\n| ----- | ---------- | ------------- |\n| load  | \\$event    | image onload  |\n| error | \\$error    | image onerror |\n\n- Data\n\n| data     | type   | default | description                                                                                                                |\n| -------- | ------ | ------- | -------------------------------------------------------------------------------------------------------------------------- |\n| imgRatio | number | NaN     | upload image's ratio (image naturalWidth/natrualHeight). Default value is NaN, after the load event the value will be set. |\n| bgTL\\$   | object |         | image's translate(X,Y)                                                                                                     |\n| bgWH\\$   | number |         | image's scaling                                                                                                            |\n\n- Slot\n\n| slot        | description                            |\n| ----------- | -------------------------------------- |\n| placeholder | if no `src` provided, show placeholder |\n\n- rxjs Subject\n\n| subject    | description                                                        |\n| ---------- | ------------------------------------------------------------------ |\n| setTL\\$    | Set the top and left of the image.                                 |\n| setWH\\$    | Set the sizing(scaling) of the image.                              |\n| onChange\\$ | Subject that subscribes to zooming, moving, and rotating subjects. |\n\nusage:\n\n```javascript\nthis.$refs.clipper.setTL$.next({ left: 50, top: 50 }) // percentage 0%\nthis.$refs.clipper.setWH$.next(0.6) // transform scale(0.6)\n\nthis.$refs.clipper.onChange$.subscribe(() =\u003e {\n  // This happens whenever zooming, moving, and rotating occur.\n})\n```\n\n### clipper-preview\n\npreview clipping result\n\n```javascript\nimport { clipperPreview } from 'vuejs-clipper'\n```\n\n- Props\n\n| Prop |   Type | default | description                                            |\n| ---- | -----: | ------: | :----------------------------------------------------- |\n| name | string |         | name that matches clipper component's preview property |\n\n- Slot\n\n| slot        | description                            |\n| ----------- | -------------------------------------- |\n| placeholder | if no `src` provided, show placeholder |\n\n### clipper-range\n\na simple input range component\n\n```javascript\nimport { clipperRange } from 'vuejs-clipper'\n```\n\nuse `v-model` binding data with `clipper-range`\n\n- Props\n\n| Prop |   Type | default | description            |\n| ---- | -----: | ------: | :--------------------- |\n| max  | number |      10 | maximum value of range |\n| min  | number |       0 | minimum value of range |\n\n### clipper-upload\n\na new component in 0.2.0\n\nan upload button that transforms image files to URL\n\n```javascript\nimport { clipperUpload } from 'vuejs-clipper'\n```\n\nuse `v-model` binding data with `clipper-upload`\n\n- Props\n\nProps that are not defined below will apply to the file input as attributes, for example: `accept`, `id`, and `name`.\n\n| Prop  |    Type | default | description                                                                                                                                                                  |\n| ----- | ------: | ------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| check | boolean |    true | Check if upload file is an image. If set to `true`, when upload files that are not images, it will do nothing, so you will not get an error event on the clipping component. |\n| exif  | boolean |    true | Transform EXIF image to correct orientation when uploading.                                                                                                                  |\n\n- Event\n\n| event | parameters | description                 |\n| ----- | ---------- | --------------------------- |\n| input | \\$event    | Result domgstring on change |\n\n- Data\n\n| data | type        | default | description                           |\n| ---- | ----------- | ------- | ------------------------------------- |\n| file | File Object | null    | Uploaded file's original File Object. |\n\n## Changelog\n\n- 4.1.0\n  - `clipper-fixed`: if prop `round` is `true`, result image will clip in rounded background [#119](https://github.com/timtnleeProject/vuejs-clipper/issues/119).\n- 4.0.0\n\n  - Use dart-sass instead of node-sass.\n  - update sass syntax: use `math.div` instead of `/`\n\n---\n\n- 3.2.0\n\n  - [Deprecated] should be `4.0.0`\n\n- 3.1.2\n  - Fix touch devices zooming bug: [#91](https://github.com/timtnleeProject/vuejs-clipper/issues/91)\n- 3.1.1\n  - Fix [#82](https://github.com/timtnleeProject/vuejs-clipper/issues/82)\n- 3.1.0\n  - Fix `clipper-basic` ratio is not correct.\n\n\u003e !Before v3.1.0, `clipper-basic` with `ratio` prop has a bug that the clip area is not calculated correctly with `border` prop, so the ratio of the clipping result isn't precise. (issue [#80](https://github.com/timtnleeProject/vuejs-clipper/issues/80))\n\n- 3.0.4\n  - `clipper-upload` accept rest props as input attributes.\n- 3.0.3\n  - Feature: Add `handleZoomEvent` to `clipper-fixed` for controlling zoom behavior. (issue [#54](https://github.com/timtnleeProject/vuejs-clipper/issues/54)\n- 3.0.2\n  - Fix: move clipper-basic init/reset position function into `$nextTick` (issue [#71](https://github.com/timtnleeProject/vuejs-clipper/issues/71))\n- 3.0.1\n  - Fix clipper-basic initalize ratio clip-box \u0026 wrong border layout.\n- 3.0.0\n  - Move `rxjs`, `vue-rx` from dependencies to peer dependencies.\n\n---\n\n- 2.1.2\n  - Fix `clipper-basic` incorrect layout for scaling \u0026 rotation (bug of 2.1.1).\n- 2.1.1\n  - Fix `clipper-basic` incorrect layout for verticle images on Firefox.\n- 2.1.0\n  - Fix broken `wrap-ratio`.\n- 2.0.0\n  - Change css naming to BEM.\n\n---\n\n- 1.1.6\n  - Update dependencies.\n- 1.1.5\n  - Add new prop `area` for `clipper-fixed`.\n- 1.1.4\n  - Add `crossorigin` attribute biding for `\u003cimg/\u003e` in clipper (`crossOrigin` prop).\n- 1.1.3\n  - Add `!important` statements to components' style.\n- 1.1.2\n  - Set pixel of `clip` result canvas. `clip({ wPixel, maxWPixel })`\n- 1.1.1\n  - Add `clipper-fixed` placeholder slot.\n- 1.1.0\n  - Fixed `clipper-basic` props `ratio` and `wrapRatio` behaviors, now `ratio` will not affect clipper's layout since there's `wrapRatio` to control the layout.\n- 1.0.1\n  - Fixed `clipper-fixed` loading images overflow.\n  - Add `wrapRatio`, `initWidth` and `initHeight` props to `clipper-basic`\n- 1.0.0\n  - Change the `clipper-basic` design, it will judge layout depends on the ratio.\n  - Production version.\n\n---\n\n- 0.2.13\n  - Decrease css specificity\n- 0.2.12\n  - Fixed [issue #13][issue13]\n- 0.2.11\n  - Expose rxjs subjects that can [set position and layout of the movable area](https://timtnleeproject.github.io/vuejs-clipper/#/examples/set-layout).\n- 0.2.10\n  - Use passive event listener on wheel event ([issue #8][issue8]).\n- 0.2.9\n  - New prop `border-color` for `clipper-fixed`\n  - Fixed [issue #4][issue4]\n- 0.2.8\n  - New prop `accept` for `clipper-upload` ([issue #1][issue1])\n  - Add EXIF image transformation feature to clipper-upload ([issue #2][issue2])\n\n[issue1]: https://github.com/timtnleeProject/vuejs-clipper/issues/1\n[issue2]: https://github.com/timtnleeProject/vuejs-clipper/issues/2\n[issue4]: https://github.com/timtnleeProject/vuejs-clipper/issues/4\n[issue8]: https://github.com/timtnleeProject/vuejs-clipper/issues/8\n[issue13]: https://github.com/timtnleeProject/vuejs-clipper/issues/13\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FtimtnleeProject%2Fvuejs-clipper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FtimtnleeProject%2Fvuejs-clipper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FtimtnleeProject%2Fvuejs-clipper/lists"}