Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

vue-croppa

Package Overview
Dependencies
Maintainers
1
Versions
60
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

vue-croppa - npm Package Compare versions

Comparing version 0.0.19 to 0.0.21

4

.eslintrc.js

@@ -22,6 +22,4 @@ module.exports = {

globals: {
"IScroll": true,
"Qiniu": true,
"plupload": true
"DocumentTouch": true
}
}
/*
* vue-croppa v0.0.19
* vue-croppa v0.0.21
* https://github.com/zhanziyang/vue-croppa

@@ -16,9 +16,9 @@ *

var u = {
getPointerCoords: function getPointerCoords(evt, cropperVM) {
var canvas = cropperVM.canvas,
quality = cropperVM.quality;
onePointCoord: function onePointCoord(point, vm) {
var canvas = vm.canvas,
quality = vm.quality;
var rect = canvas.getBoundingClientRect();
var clientX = evt.touches ? evt.touches[0].clientX : evt.clientX;
var clientY = evt.touches ? evt.touches[0].clientY : evt.clientY;
var clientX = point.clientX;
var clientY = point.clientY;
return {

@@ -29,4 +29,65 @@ x: (clientX - rect.left) * quality,

},
getPointerCoords: function getPointerCoords(evt, vm) {
var pointer = evt.touches ? evt.touches[0] : evt;
return this.onePointCoord(pointer, vm);
},
getPinchDistance: function getPinchDistance(evt, vm) {
var pointer1 = evt.touches[0];
var pointer2 = evt.touches[1];
var coord1 = this.onePointCoord(pointer1, vm);
var coord2 = this.onePointCoord(pointer2, vm);
return Math.sqrt(Math.pow(coord1.x - coord2.x, 2) + Math.pow(coord1.y - coord2.y, 2));
},
getPinchCenterCoord: function getPinchCenterCoord(evt, vm) {
var pointer1 = evt.touches[0];
var pointer2 = evt.touches[1];
var coord1 = this.onePointCoord(pointer1, vm);
var coord2 = this.onePointCoord(pointer2, vm);
return {
x: (coord1.x + coord2.x) / 2,
y: (coord1.y + coord2.y) / 2
};
},
imageLoaded: function imageLoaded(img) {
return img.complete && img.naturalWidth !== 0;
},
touchDetect: function touchDetect() {
window.addEventListener('touchstart', function onFirstTouch() {
window.USER_IS_TOUCHING = true;
window.removeEventListener('touchstart', onFirstTouch, false);
}, false);
},
rAFPolyfill: function rAFPolyfill() {
// rAF polyfill
var lastTime = 0;
var vendors = ['webkit', 'moz'];
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || // Webkit中此取消方法的名字变了
window[vendors[x] + 'CancelRequestAnimationFrame'];
}
if (!window.requestAnimationFrame) {
window.requestAnimationFrame = function (callback) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16.7 - (currTime - lastTime));
var id = window.setTimeout(function () {
var arg = currTime + timeToCall;
callback(arg);
}, timeToCall);
lastTime = currTime + timeToCall;
return id;
};
}
if (!window.cancelAnimationFrame) {
window.cancelAnimationFrame = function (id) {
clearTimeout(id);
};
}
Array.isArray = function (arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}

@@ -102,3 +163,5 @@ };

disableScrollToZoom: Boolean,
reverseZoomingGesture: Boolean,
disablePinchToZoom: Boolean,
reverseZoomingGesture: Boolean, // deprecated
reverseScrollToZoom: Boolean,
preventWhiteSpace: Boolean,

@@ -127,2 +190,5 @@ showRemoveButton: {

u.rAFPolyfill();
u.touchDetect();
var cropper = { render: function render() {

@@ -138,3 +204,3 @@ var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return _c('div', { class: 'croppa-container ' + (_vm.img ? 'croppa--has-target' : '') + ' ' + (_vm.disabled ? 'croppa--disabled' : '') + ' ' + (_vm.disableClickToChoose ? 'croppa--disabled-cc' : '') + ' ' + (_vm.disableDragToMove && _vm.disableScrollToZoom ? 'croppa--disabled-mz' : '') + ' ' + (_vm.fileDraggedOver ? 'croppa--dropzone' : ''), on: { "dragenter": function dragenter($event) {

} } }, [_c('input', { ref: "fileInput", attrs: { "type": "file", "accept": _vm.accept, "disabled": _vm.disabled, "hidden": "" }, on: { "change": _vm.handleInputChange } }), _c('div', { staticClass: "initial", staticStyle: { "width": "0", "height": "0", "visibility": "hidden" } }, [_vm._t("initial")], 2), _c('canvas', { ref: "canvas", on: { "click": function click($event) {
!_vm.disabled && _vm.chooseFile();
$event.stopPropagation();$event.preventDefault();_vm.handleClick($event);
}, "touchstart": function touchstart($event) {

@@ -187,3 +253,6 @@ $event.stopPropagation();$event.preventDefault();_vm.handlePointerStart($event);

dataUrl: '',
fileDraggedOver: false
fileDraggedOver: false,
tabStart: 0,
pinching: false,
pinchDistance: 0
};

@@ -268,12 +337,6 @@ },

zoomIn: function zoomIn() {
_this.zoom(true, {
x: _this.imgData.startX + _this.imgData.width / 2,
y: _this.imgData.startY + _this.imgData.height / 2
});
_this.zoom(true);
},
zoomOut: function zoomOut() {
_this.zoom(false, {
x: _this.imgData.startX + _this.imgData.width / 2,
y: _this.imgData.startY + _this.imgData.height / 2
});
_this.zoom(false);
},

@@ -292,3 +355,2 @@ refresh: function refresh() {

var ctx = this.ctx;
ctx.clearRect(0, 0, this.realWidth, this.realHeight);
this.paintBackground();

@@ -340,5 +402,9 @@ ctx.textBaseline = 'middle';

chooseFile: function chooseFile() {
if (this.img || this.disableClickToChoose) return;
this.$refs.fileInput.click();
},
handleClick: function handleClick() {
if (!this.img && !this.disableClickToChoose && !this.disabled && window.USER_IS_TOUCHING) {
this.chooseFile();
}
},
handleInputChange: function handleInputChange() {

@@ -401,6 +467,24 @@ var input = this.$refs.fileInput;

handlePointerStart: function handlePointerStart(evt) {
if (this.disabled || !this.img) return;
if (this.disabled) return;
// simulate click with touch on mobile devices
if (!this.img && !this.disableClickToChoose) {
this.tabStart = new Date().valueOf();
return;
}
// ignore mouse right click and middle click
if (evt.which && evt.which > 1) return;
this.dragging = true;
if (!evt.touches || evt.touches.length === 1) {
this.dragging = true;
this.pinching = false;
var coord = u.getPointerCoords(evt, this);
this.lastMovingCoord = coord;
}
if (evt.touches && evt.touches.length === 2 && !this.disablePinchToZoom) {
this.dragging = false;
this.pinching = true;
this.pinchDistance = u.getPinchDistance(evt, this);
}
if (document) {

@@ -435,4 +519,15 @@ var cancelEvents = ['mouseup', 'touchend', 'touchcancel', 'pointerend', 'pointercancel'];

handlePointerEnd: function handlePointerEnd(evt) {
if (this.disabled || !this.img) return;
if (this.disabled) return;
if (!this.img && !this.disableClickToChoose) {
var tabEnd = new Date().valueOf();
if (tabEnd - this.tabStart < 1000) {
this.chooseFile();
}
this.tabStart = 0;
return;
}
this.dragging = false;
this.pinching = false;
this.pinchDistance = 0;
this.lastMovingCoord = null;

@@ -442,11 +537,22 @@ },

if (this.disabled || this.disableDragToMove || !this.img) return;
if (!this.dragging) return;
var coord = u.getPointerCoords(evt, this);
if (this.lastMovingCoord) {
this.move({
x: coord.x - this.lastMovingCoord.x,
y: coord.y - this.lastMovingCoord.y
});
if (!evt.touches || evt.touches.length === 1) {
if (!this.dragging) return;
var coord = u.getPointerCoords(evt, this);
if (this.lastMovingCoord) {
this.move({
x: coord.x - this.lastMovingCoord.x,
y: coord.y - this.lastMovingCoord.y
});
}
this.lastMovingCoord = coord;
}
this.lastMovingCoord = coord;
if (evt.touches && evt.touches.length === 2 && !this.disablePinchToZoom) {
if (!this.pinching) return;
var distance = u.getPinchDistance(evt, this);
var delta = distance - this.pinchDistance;
this.zoom(delta > 0, null, 2);
this.pinchDistance = distance;
}
},

@@ -457,5 +563,5 @@ handleWheel: function handleWheel(evt) {

if (evt.wheelDelta < 0 || evt.deltaY > 0 || evt.detail > 0) {
this.zoom(this.reverseZoomingGesture, coord);
this.zoom(this.reverseZoomingGesture || this.reverseScrollToZoom, coord);
} else if (evt.wheelDelta > 0 || evt.deltaY < 0 || evt.detail < 0) {
this.zoom(!this.reverseZoomingGesture, coord);
this.zoom(!this.reverseZoomingGesture && !this.reverseScrollToZoom, coord);
}

@@ -466,3 +572,2 @@ },

this.fileDraggedOver = true;
console.log('enter');
},

@@ -506,3 +611,9 @@ handleDragLeave: function handleDragLeave(evt) {

zoom: function zoom(zoomIn, pos) {
var speed = this.realWidth / 100000 * this.zoomSpeed;
var timesFaster = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
pos = pos || {
x: this.imgData.startX + this.imgData.width / 2,
y: this.imgData.startY + this.imgData.height / 2
};
var speed = this.realWidth / 100000 * this.zoomSpeed * timesFaster;
var x = 1;

@@ -529,5 +640,5 @@ if (zoomIn) {

if (this.imgData.height < this.realHeight) {
var _x2 = this.realHeight / this.imgData.height;
var _x3 = this.realHeight / this.imgData.height;
this.imgData.height = this.realHeight;
this.imgData.width = this.imgData.width * _x2;
this.imgData.width = this.imgData.width * _x3;
}

@@ -545,2 +656,4 @@ this.preventMovingToWhiteSpace();

draw: function draw() {
var _this4 = this;
var ctx = this.ctx;

@@ -554,5 +667,6 @@ if (!this.img) return;

ctx.clearRect(0, 0, this.realWidth, this.realHeight);
this.paintBackground();
ctx.drawImage(this.img, startX, startY, width, height);
requestAnimationFrame(function () {
_this4.paintBackground();
ctx.drawImage(_this4.img, startX, startY, width, height);
});
},

@@ -568,3 +682,3 @@ generateDataUrl: function generateDataUrl(type) {

promisedBlob: function promisedBlob() {
var _this4 = this;
var _this5 = this;

@@ -577,3 +691,3 @@ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {

try {
_this4.generateBlob(function (blob) {
_this5.generateBlob(function (blob) {
resolve(blob);

@@ -580,0 +694,0 @@ }, args);

/*
* vue-croppa v0.0.19
* vue-croppa v0.0.21
* https://github.com/zhanziyang/vue-croppa

@@ -8,2 +8,2 @@ *

*/
!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?module.exports=i():"function"==typeof define&&define.amd?define(i):t.Croppa=i()}(this,function(){"use strict";var t={getPointerCoords:function(t,i){var e=i.canvas,a=i.quality,n=e.getBoundingClientRect(),o=t.touches?t.touches[0].clientX:t.clientX,r=t.touches?t.touches[0].clientY:t.clientY;return{x:(o-n.left)*a,y:(r-n.top)*a}},imageLoaded:function(t){return t.complete&&0!==t.naturalWidth}};Number.isInteger=Number.isInteger||function(t){return"number"==typeof t&&isFinite(t)&&Math.floor(t)===t};var i={render:function(){var t=this,i=t.$createElement,e=t._self._c||i;return e("div",{class:"croppa-container "+(t.img?"croppa--has-target":"")+" "+(t.disabled?"croppa--disabled":"")+" "+(t.disableClickToChoose?"croppa--disabled-cc":"")+" "+(t.disableDragToMove&&t.disableScrollToZoom?"croppa--disabled-mz":"")+" "+(t.fileDraggedOver?"croppa--dropzone":""),on:{dragenter:function(i){i.stopPropagation(),i.preventDefault(),t.handleDragEnter(i)},dragleave:function(i){i.stopPropagation(),i.preventDefault(),t.handleDragLeave(i)},dragover:function(i){i.stopPropagation(),i.preventDefault(),t.handleDragOver(i)},drop:function(i){i.stopPropagation(),i.preventDefault(),t.handleDrop(i)}}},[e("input",{ref:"fileInput",attrs:{type:"file",accept:t.accept,disabled:t.disabled,hidden:""},on:{change:t.handleInputChange}}),e("div",{staticClass:"initial",staticStyle:{width:"0",height:"0",visibility:"hidden"}},[t._t("initial")],2),e("canvas",{ref:"canvas",on:{click:function(i){!t.disabled&&t.chooseFile()},touchstart:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerStart(i)},mousedown:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerStart(i)},pointerstart:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerStart(i)},touchend:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerEnd(i)},touchcancel:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerEnd(i)},mouseup:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerEnd(i)},pointerend:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerEnd(i)},pointercancel:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerEnd(i)},touchmove:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerMove(i)},mousemove:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerMove(i)},pointermove:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerMove(i)},DOMMouseScroll:function(i){i.stopPropagation(),i.preventDefault(),t.handleWheel(i)},wheel:function(i){i.stopPropagation(),i.preventDefault(),t.handleWheel(i)},mousewheel:function(i){i.stopPropagation(),i.preventDefault(),t.handleWheel(i)}}}),t.showRemoveButton&&t.img?e("svg",{staticClass:"icon icon-remove",style:"top: -"+t.height/40+"px; right: -"+t.width/40+"px",attrs:{viewBox:"0 0 1024 1024",version:"1.1",xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",width:t.removeButtonSize||t.width/10,height:t.removeButtonSize||t.width/10},on:{click:t.unset}},[e("path",{attrs:{d:"M511.921231 0C229.179077 0 0 229.257846 0 512 0 794.702769 229.179077 1024 511.921231 1024 794.781538 1024 1024 794.702769 1024 512 1024 229.257846 794.781538 0 511.921231 0ZM732.041846 650.633846 650.515692 732.081231C650.515692 732.081231 521.491692 593.683692 511.881846 593.683692 502.429538 593.683692 373.366154 732.081231 373.366154 732.081231L291.761231 650.633846C291.761231 650.633846 430.316308 523.500308 430.316308 512.196923 430.316308 500.696615 291.761231 373.523692 291.761231 373.523692L373.366154 291.918769C373.366154 291.918769 503.453538 430.395077 511.881846 430.395077 520.349538 430.395077 650.515692 291.918769 650.515692 291.918769L732.041846 373.523692C732.041846 373.523692 593.447385 502.547692 593.447385 512.196923 593.447385 521.412923 732.041846 650.633846 732.041846 650.633846Z",fill:t.removeButtonColor}})]):t._e()])},staticRenderFns:[],model:{prop:"value",event:"init"},props:{value:Object,width:{type:Number,default:200,validator:function(t){return t>0}},height:{type:Number,default:200,validator:function(t){return t>0}},placeholder:{type:String,default:"Choose an image"},placeholderColor:{default:"#606060"},placeholderFontSize:{type:Number,default:0,validator:function(t){return t>=0}},canvasColor:{default:"#e6e6e6"},quality:{type:Number,default:2,validator:function(t){return Number.isInteger(t)&&t>0}},zoomSpeed:{default:3,type:Number,validator:function(t){return t>0}},accept:{type:String,default:"image/*"},fileSizeLimit:{type:Number,default:0,validator:function(t){return t>=0}},disabled:Boolean,disableDragAndDrop:Boolean,disableClickToChoose:Boolean,disableDragToMove:Boolean,disableScrollToZoom:Boolean,reverseZoomingGesture:Boolean,preventWhiteSpace:Boolean,showRemoveButton:{type:Boolean,default:!0},removeButtonColor:{type:String,default:"red"},removeButtonSize:{type:Number}},data:function(){return{instance:null,canvas:null,ctx:null,img:null,dragging:!1,lastMovingCoord:null,imgData:{},dataUrl:"",fileDraggedOver:!1}},computed:{realWidth:function(){return this.width*this.quality},realHeight:function(){return this.height*this.quality},realPlaceholderFontSize:function(){return this.placeholderFontSize*this.quality}},mounted:function(){this.init()},watch:{value:function(t){this.instance=t},realWidth:"init",realHeight:"init",canvasColor:"init",placeholder:"init",placeholderColor:"init",realPlaceholderFontSize:"init",preventWhiteSpace:"imgContentInit"},methods:{init:function(){var t=this;this.canvas=this.$refs.canvas,this.canvas.width=this.realWidth,this.canvas.height=this.realHeight,this.canvas.style.width=this.width+"px",this.canvas.style.height=this.height+"px",this.canvas.style.backgroundColor=this.canvasColor&&"default"!=this.canvasColor?"string"==typeof this.canvasColor?this.canvasColor:"":"#e6e6e6",this.ctx=this.canvas.getContext("2d"),this.$slots.initial&&this.$slots.initial[0]?this.setInitial():this.unset(),this.$emit("init",{getCanvas:function(){return t.canvas},getContext:function(){return t.ctx},getChosenFile:function(){return t.$refs.fileInput.files[0]},getActualImageSize:function(){return{width:t.realWidth,height:t.realHeight}},moveUpwards:function(i){t.move({x:0,y:-i})},moveDownwards:function(i){t.move({x:0,y:i})},moveLeftwards:function(i){t.move({x:-i,y:0})},moveRightwards:function(i){t.move({x:i,y:0})},zoomIn:function(){t.zoom(!0,{x:t.imgData.startX+t.imgData.width/2,y:t.imgData.startY+t.imgData.height/2})},zoomOut:function(){t.zoom(!1,{x:t.imgData.startX+t.imgData.width/2,y:t.imgData.startY+t.imgData.height/2})},refresh:function(){t.$nextTick(t.init)},reset:this.unset,chooseFile:this.chooseFile,generateDataUrl:this.generateDataUrl,generateBlob:this.generateBlob,promisedBlob:this.promisedBlob})},unset:function(){var t=this.ctx;t.clearRect(0,0,this.realWidth,this.realHeight),this.paintBackground(),t.textBaseline="middle",t.textAlign="center";var i=this.realWidth/1.5/this.placeholder.length,e=this.realPlaceholderFontSize&&0!=this.realPlaceholderFontSize?this.realPlaceholderFontSize:i;t.font=e+"px sans-serif",t.fillStyle=this.placeholderColor&&"default"!=this.placeholderColor?this.placeholderColor:"#606060",t.fillText(this.placeholder,this.realWidth/2,this.realHeight/2);var a=null!=this.img;this.img=null,this.$refs.fileInput.value="",this.imgData={},a&&this.$emit("image-remove")},setInitial:function(){var i=this,e=this.$slots.initial[0],a=e.tag,n=e.elm;"img"===a&&n&&n.src?t.imageLoaded(n)?(this.img=n,this.imgContentInit()):(n.onload=function(){i.$emit("initial-image-load"),i.img=n,i.imgContentInit()},n.onerror=function(){i.$emit("initial-image-error"),i.unset()}):this.unset()},chooseFile:function(){this.img||this.disableClickToChoose||this.$refs.fileInput.click()},handleInputChange:function(){var t=this.$refs.fileInput;if(t.files.length){var i=t.files[0];this.onNewFileIn(i)}},onNewFileIn:function(t){var i=this;if(this.$emit("file-choose",t),!this.fileSizeIsValid(t))throw this.$emit("file-size-exceed",t),new Error("File size exceeds limit which is "+this.fileSizeLimit+" bytes.");var e=new FileReader;e.onload=function(t){var e=t.target.result,a=new Image;a.src=e,a.onload=function(){i.img=a,i.imgContentInit()}},e.readAsDataURL(t)},fileSizeIsValid:function(t){return!!t&&(!this.fileSizeLimit||0==this.fileSizeLimit||t.size<this.fileSizeLimit)},imgContentInit:function(){this.imgData.startX=0,this.imgData.startY=0;var t=this.img.naturalWidth,i=this.img.naturalHeight;if(i/t<this.realHeight/this.realWidth){var e=i/this.realHeight;this.imgData.width=t/e,this.imgData.startX=-(this.imgData.width-this.realWidth)/2,this.imgData.height=this.realHeight}else{var a=t/this.realWidth;this.imgData.height=i/a,this.imgData.startY=-(this.imgData.height-this.realHeight)/2,this.imgData.width=this.realWidth}this.draw()},handlePointerStart:function(t){if(!this.disabled&&this.img&&!(t.which&&t.which>1)&&(this.dragging=!0,document)){var i=["mouseup","touchend","touchcancel","pointerend","pointercancel"],e=!0,a=!1,n=void 0;try{for(var o,r=i[Symbol.iterator]();!(e=(o=r.next()).done);e=!0){var s=o.value;document.addEventListener(s,this.handlePointerEnd)}}catch(t){a=!0,n=t}finally{try{!e&&r.return&&r.return()}finally{if(a)throw n}}}},handlePointerEnd:function(t){!this.disabled&&this.img&&(this.dragging=!1,this.lastMovingCoord=null)},handlePointerMove:function(i){if(!this.disabled&&!this.disableDragToMove&&this.img&&this.dragging){var e=t.getPointerCoords(i,this);this.lastMovingCoord&&this.move({x:e.x-this.lastMovingCoord.x,y:e.y-this.lastMovingCoord.y}),this.lastMovingCoord=e}},handleWheel:function(i){if(!this.disabled&&!this.disableScrollToZoom&&this.img){var e=t.getPointerCoords(i,this);i.wheelDelta<0||i.deltaY>0||i.detail>0?this.zoom(this.reverseZoomingGesture,e):(i.wheelDelta>0||i.deltaY<0||i.detail<0)&&this.zoom(!this.reverseZoomingGesture,e)}},handleDragEnter:function(t){this.disabled||this.disableDragAndDrop||this.img||(this.fileDraggedOver=!0,console.log("enter"))},handleDragLeave:function(t){this.disabled||this.disableDragAndDrop||this.img||(this.fileDraggedOver=!1)},handleDragOver:function(t){},handleDrop:function(t){if(!(this.disabled||this.disableDragAndDrop||this.img)&&t.dataTransfer&&t.dataTransfer.files.length){this.fileDraggedOver=!1;var i=t.dataTransfer.files[0];this.onNewFileIn(i)}},move:function(t){t&&(this.imgData.startX+=t.x,this.imgData.startY+=t.y,this.preventWhiteSpace&&this.preventMovingToWhiteSpace(),this.$emit("move"),this.draw())},preventMovingToWhiteSpace:function(){this.imgData.startX>0&&(this.imgData.startX=0),this.imgData.startY>0&&(this.imgData.startY=0),this.realWidth-this.imgData.startX>this.imgData.width&&(this.imgData.startX=-(this.imgData.width-this.realWidth)),this.realHeight-this.imgData.startY>this.imgData.height&&(this.imgData.startY=-(this.imgData.height-this.realHeight))},zoom:function(t,i){var e=this.realWidth/1e5*this.zoomSpeed,a=1;t?a=1+e:this.imgData.width>20&&(a=1-e),this.imgData.width=this.imgData.width*a,this.imgData.height=this.imgData.height*a;var n=(a-1)*(i.x-this.imgData.startX),o=(a-1)*(i.y-this.imgData.startY);if(this.imgData.startX=this.imgData.startX-n,this.imgData.startY=this.imgData.startY-o,this.preventWhiteSpace){if(this.imgData.width<this.realWidth){var r=this.realWidth/this.imgData.width;this.imgData.width=this.realWidth,this.imgData.height=this.imgData.height*r}if(this.imgData.height<this.realHeight){var s=this.realHeight/this.imgData.height;this.imgData.height=this.realHeight,this.imgData.width=this.imgData.width*s}this.preventMovingToWhiteSpace()}this.$emit("zoom"),this.draw()},paintBackground:function(){var t=this.canvasColor&&"default"!=this.canvasColor?this.canvasColor:"#e6e6e6";this.ctx.fillStyle=t,this.ctx.fillRect(0,0,this.realWidth,this.realHeight)},draw:function(){var t=this.ctx;if(this.img){var i=this.imgData,e=i.startX,a=i.startY,n=i.width,o=i.height;t.clearRect(0,0,this.realWidth,this.realHeight),this.paintBackground(),t.drawImage(this.img,e,a,n,o)}},generateDataUrl:function(t){return this.img?this.canvas.toDataURL(t):""},generateBlob:function(t,i,e){if(!this.img)return null;this.canvas.toBlob(t,i,e)},promisedBlob:function(){for(var t=this,i=arguments.length,e=Array(i),a=0;a<i;a++)e[a]=arguments[a];return new Promise(function(i,a){try{t.generateBlob(function(t){i(t)},e)}catch(t){a(t)}})}}};return{install:function(t,e){t.component("croppa",i)}}});
!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?module.exports=i():"function"==typeof define&&define.amd?define(i):t.Croppa=i()}(this,function(){"use strict";var t={onePointCoord:function(t,i){var e=i.canvas,a=i.quality,n=e.getBoundingClientRect(),o=t.clientX,r=t.clientY;return{x:(o-n.left)*a,y:(r-n.top)*a}},getPointerCoords:function(t,i){var e=t.touches?t.touches[0]:t;return this.onePointCoord(e,i)},getPinchDistance:function(t,i){var e=t.touches[0],a=t.touches[1],n=this.onePointCoord(e,i),o=this.onePointCoord(a,i);return Math.sqrt(Math.pow(n.x-o.x,2)+Math.pow(n.y-o.y,2))},getPinchCenterCoord:function(t,i){var e=t.touches[0],a=t.touches[1],n=this.onePointCoord(e,i),o=this.onePointCoord(a,i);return{x:(n.x+o.x)/2,y:(n.y+o.y)/2}},imageLoaded:function(t){return t.complete&&0!==t.naturalWidth},touchDetect:function(){window.addEventListener("touchstart",function t(){window.USER_IS_TOUCHING=!0,window.removeEventListener("touchstart",t,!1)},!1)},rAFPolyfill:function(){for(var t=0,i=["webkit","moz"],e=0;e<i.length&&!window.requestAnimationFrame;++e)window.requestAnimationFrame=window[i[e]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[i[e]+"CancelAnimationFrame"]||window[i[e]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(i){var e=(new Date).getTime(),a=Math.max(0,16.7-(e-t)),n=window.setTimeout(function(){i(e+a)},a);return t=e+a,n}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)}}};Number.isInteger=Number.isInteger||function(t){return"number"==typeof t&&isFinite(t)&&Math.floor(t)===t};var i={value:Object,width:{type:Number,default:200,validator:function(t){return t>0}},height:{type:Number,default:200,validator:function(t){return t>0}},placeholder:{type:String,default:"Choose an image"},placeholderColor:{default:"#606060"},placeholderFontSize:{type:Number,default:0,validator:function(t){return t>=0}},canvasColor:{default:"#e6e6e6"},quality:{type:Number,default:2,validator:function(t){return Number.isInteger(t)&&t>0}},zoomSpeed:{default:3,type:Number,validator:function(t){return t>0}},accept:{type:String,default:"image/*"},fileSizeLimit:{type:Number,default:0,validator:function(t){return t>=0}},disabled:Boolean,disableDragAndDrop:Boolean,disableClickToChoose:Boolean,disableDragToMove:Boolean,disableScrollToZoom:Boolean,disablePinchToZoom:Boolean,reverseZoomingGesture:Boolean,reverseScrollToZoom:Boolean,preventWhiteSpace:Boolean,showRemoveButton:{type:Boolean,default:!0},removeButtonColor:{type:String,default:"red"},removeButtonSize:{type:Number}};t.rAFPolyfill(),t.touchDetect();var e={render:function(){var t=this,i=t.$createElement,e=t._self._c||i;return e("div",{class:"croppa-container "+(t.img?"croppa--has-target":"")+" "+(t.disabled?"croppa--disabled":"")+" "+(t.disableClickToChoose?"croppa--disabled-cc":"")+" "+(t.disableDragToMove&&t.disableScrollToZoom?"croppa--disabled-mz":"")+" "+(t.fileDraggedOver?"croppa--dropzone":""),on:{dragenter:function(i){i.stopPropagation(),i.preventDefault(),t.handleDragEnter(i)},dragleave:function(i){i.stopPropagation(),i.preventDefault(),t.handleDragLeave(i)},dragover:function(i){i.stopPropagation(),i.preventDefault(),t.handleDragOver(i)},drop:function(i){i.stopPropagation(),i.preventDefault(),t.handleDrop(i)}}},[e("input",{ref:"fileInput",attrs:{type:"file",accept:t.accept,disabled:t.disabled,hidden:""},on:{change:t.handleInputChange}}),e("div",{staticClass:"initial",staticStyle:{width:"0",height:"0",visibility:"hidden"}},[t._t("initial")],2),e("canvas",{ref:"canvas",on:{click:function(i){i.stopPropagation(),i.preventDefault(),t.handleClick(i)},touchstart:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerStart(i)},mousedown:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerStart(i)},pointerstart:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerStart(i)},touchend:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerEnd(i)},touchcancel:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerEnd(i)},mouseup:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerEnd(i)},pointerend:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerEnd(i)},pointercancel:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerEnd(i)},touchmove:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerMove(i)},mousemove:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerMove(i)},pointermove:function(i){i.stopPropagation(),i.preventDefault(),t.handlePointerMove(i)},DOMMouseScroll:function(i){i.stopPropagation(),i.preventDefault(),t.handleWheel(i)},wheel:function(i){i.stopPropagation(),i.preventDefault(),t.handleWheel(i)},mousewheel:function(i){i.stopPropagation(),i.preventDefault(),t.handleWheel(i)}}}),t.showRemoveButton&&t.img?e("svg",{staticClass:"icon icon-remove",style:"top: -"+t.height/40+"px; right: -"+t.width/40+"px",attrs:{viewBox:"0 0 1024 1024",version:"1.1",xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",width:t.removeButtonSize||t.width/10,height:t.removeButtonSize||t.width/10},on:{click:t.unset}},[e("path",{attrs:{d:"M511.921231 0C229.179077 0 0 229.257846 0 512 0 794.702769 229.179077 1024 511.921231 1024 794.781538 1024 1024 794.702769 1024 512 1024 229.257846 794.781538 0 511.921231 0ZM732.041846 650.633846 650.515692 732.081231C650.515692 732.081231 521.491692 593.683692 511.881846 593.683692 502.429538 593.683692 373.366154 732.081231 373.366154 732.081231L291.761231 650.633846C291.761231 650.633846 430.316308 523.500308 430.316308 512.196923 430.316308 500.696615 291.761231 373.523692 291.761231 373.523692L373.366154 291.918769C373.366154 291.918769 503.453538 430.395077 511.881846 430.395077 520.349538 430.395077 650.515692 291.918769 650.515692 291.918769L732.041846 373.523692C732.041846 373.523692 593.447385 502.547692 593.447385 512.196923 593.447385 521.412923 732.041846 650.633846 732.041846 650.633846Z",fill:t.removeButtonColor}})]):t._e()])},staticRenderFns:[],model:{prop:"value",event:"init"},props:i,data:function(){return{instance:null,canvas:null,ctx:null,img:null,dragging:!1,lastMovingCoord:null,imgData:{},dataUrl:"",fileDraggedOver:!1,tabStart:0,pinching:!1,pinchDistance:0}},computed:{realWidth:function(){return this.width*this.quality},realHeight:function(){return this.height*this.quality},realPlaceholderFontSize:function(){return this.placeholderFontSize*this.quality}},mounted:function(){this.init()},watch:{value:function(t){this.instance=t},realWidth:"init",realHeight:"init",canvasColor:"init",placeholder:"init",placeholderColor:"init",realPlaceholderFontSize:"init",preventWhiteSpace:"imgContentInit"},methods:{init:function(){var t=this;this.canvas=this.$refs.canvas,this.canvas.width=this.realWidth,this.canvas.height=this.realHeight,this.canvas.style.width=this.width+"px",this.canvas.style.height=this.height+"px",this.canvas.style.backgroundColor=this.canvasColor&&"default"!=this.canvasColor?"string"==typeof this.canvasColor?this.canvasColor:"":"#e6e6e6",this.ctx=this.canvas.getContext("2d"),this.$slots.initial&&this.$slots.initial[0]?this.setInitial():this.unset(),this.$emit("init",{getCanvas:function(){return t.canvas},getContext:function(){return t.ctx},getChosenFile:function(){return t.$refs.fileInput.files[0]},getActualImageSize:function(){return{width:t.realWidth,height:t.realHeight}},moveUpwards:function(i){t.move({x:0,y:-i})},moveDownwards:function(i){t.move({x:0,y:i})},moveLeftwards:function(i){t.move({x:-i,y:0})},moveRightwards:function(i){t.move({x:i,y:0})},zoomIn:function(){t.zoom(!0)},zoomOut:function(){t.zoom(!1)},refresh:function(){t.$nextTick(t.init)},reset:this.unset,chooseFile:this.chooseFile,generateDataUrl:this.generateDataUrl,generateBlob:this.generateBlob,promisedBlob:this.promisedBlob})},unset:function(){var t=this.ctx;this.paintBackground(),t.textBaseline="middle",t.textAlign="center";var i=this.realWidth/1.5/this.placeholder.length,e=this.realPlaceholderFontSize&&0!=this.realPlaceholderFontSize?this.realPlaceholderFontSize:i;t.font=e+"px sans-serif",t.fillStyle=this.placeholderColor&&"default"!=this.placeholderColor?this.placeholderColor:"#606060",t.fillText(this.placeholder,this.realWidth/2,this.realHeight/2);var a=null!=this.img;this.img=null,this.$refs.fileInput.value="",this.imgData={},a&&this.$emit("image-remove")},setInitial:function(){var i=this,e=this.$slots.initial[0],a=e.tag,n=e.elm;"img"===a&&n&&n.src?t.imageLoaded(n)?(this.img=n,this.imgContentInit()):(n.onload=function(){i.$emit("initial-image-load"),i.img=n,i.imgContentInit()},n.onerror=function(){i.$emit("initial-image-error"),i.unset()}):this.unset()},chooseFile:function(){this.$refs.fileInput.click()},handleClick:function(){this.img||this.disableClickToChoose||this.disabled||!window.USER_IS_TOUCHING||this.chooseFile()},handleInputChange:function(){var t=this.$refs.fileInput;if(t.files.length){var i=t.files[0];this.onNewFileIn(i)}},onNewFileIn:function(t){var i=this;if(this.$emit("file-choose",t),!this.fileSizeIsValid(t))throw this.$emit("file-size-exceed",t),new Error("File size exceeds limit which is "+this.fileSizeLimit+" bytes.");var e=new FileReader;e.onload=function(t){var e=t.target.result,a=new Image;a.src=e,a.onload=function(){i.img=a,i.imgContentInit()}},e.readAsDataURL(t)},fileSizeIsValid:function(t){return!!t&&(!this.fileSizeLimit||0==this.fileSizeLimit||t.size<this.fileSizeLimit)},imgContentInit:function(){this.imgData.startX=0,this.imgData.startY=0;var t=this.img.naturalWidth,i=this.img.naturalHeight;if(i/t<this.realHeight/this.realWidth){var e=i/this.realHeight;this.imgData.width=t/e,this.imgData.startX=-(this.imgData.width-this.realWidth)/2,this.imgData.height=this.realHeight}else{var a=t/this.realWidth;this.imgData.height=i/a,this.imgData.startY=-(this.imgData.height-this.realHeight)/2,this.imgData.width=this.realWidth}this.draw()},handlePointerStart:function(i){if(!this.disabled)if(this.img||this.disableClickToChoose){if(!(i.which&&i.which>1)){if(!i.touches||1===i.touches.length){this.dragging=!0,this.pinching=!1;var e=t.getPointerCoords(i,this);this.lastMovingCoord=e}if(i.touches&&2===i.touches.length&&!this.disablePinchToZoom&&(this.dragging=!1,this.pinching=!0,this.pinchDistance=t.getPinchDistance(i,this)),document){var a=["mouseup","touchend","touchcancel","pointerend","pointercancel"],n=!0,o=!1,r=void 0;try{for(var s,h=a[Symbol.iterator]();!(n=(s=h.next()).done);n=!0){var l=s.value;document.addEventListener(l,this.handlePointerEnd)}}catch(t){o=!0,r=t}finally{try{!n&&h.return&&h.return()}finally{if(o)throw r}}}}}else this.tabStart=(new Date).valueOf()},handlePointerEnd:function(t){if(!this.disabled){if(!this.img&&!this.disableClickToChoose)return(new Date).valueOf()-this.tabStart<1e3&&this.chooseFile(),void(this.tabStart=0);this.dragging=!1,this.pinching=!1,this.pinchDistance=0,this.lastMovingCoord=null}},handlePointerMove:function(i){if(!this.disabled&&!this.disableDragToMove&&this.img){if(!i.touches||1===i.touches.length){if(!this.dragging)return;var e=t.getPointerCoords(i,this);this.lastMovingCoord&&this.move({x:e.x-this.lastMovingCoord.x,y:e.y-this.lastMovingCoord.y}),this.lastMovingCoord=e}if(i.touches&&2===i.touches.length&&!this.disablePinchToZoom){if(!this.pinching)return;var a=t.getPinchDistance(i,this),n=a-this.pinchDistance;this.zoom(n>0,null,2),this.pinchDistance=a}}},handleWheel:function(i){if(!this.disabled&&!this.disableScrollToZoom&&this.img){var e=t.getPointerCoords(i,this);i.wheelDelta<0||i.deltaY>0||i.detail>0?this.zoom(this.reverseZoomingGesture||this.reverseScrollToZoom,e):(i.wheelDelta>0||i.deltaY<0||i.detail<0)&&this.zoom(!this.reverseZoomingGesture&&!this.reverseScrollToZoom,e)}},handleDragEnter:function(t){this.disabled||this.disableDragAndDrop||this.img||(this.fileDraggedOver=!0)},handleDragLeave:function(t){this.disabled||this.disableDragAndDrop||this.img||(this.fileDraggedOver=!1)},handleDragOver:function(t){},handleDrop:function(t){if(!(this.disabled||this.disableDragAndDrop||this.img)&&t.dataTransfer&&t.dataTransfer.files.length){this.fileDraggedOver=!1;var i=t.dataTransfer.files[0];this.onNewFileIn(i)}},move:function(t){t&&(this.imgData.startX+=t.x,this.imgData.startY+=t.y,this.preventWhiteSpace&&this.preventMovingToWhiteSpace(),this.$emit("move"),this.draw())},preventMovingToWhiteSpace:function(){this.imgData.startX>0&&(this.imgData.startX=0),this.imgData.startY>0&&(this.imgData.startY=0),this.realWidth-this.imgData.startX>this.imgData.width&&(this.imgData.startX=-(this.imgData.width-this.realWidth)),this.realHeight-this.imgData.startY>this.imgData.height&&(this.imgData.startY=-(this.imgData.height-this.realHeight))},zoom:function(t,i){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;i=i||{x:this.imgData.startX+this.imgData.width/2,y:this.imgData.startY+this.imgData.height/2};var a=this.realWidth/1e5*this.zoomSpeed*e,n=1;t?n=1+a:this.imgData.width>20&&(n=1-a),this.imgData.width=this.imgData.width*n,this.imgData.height=this.imgData.height*n;var o=(n-1)*(i.x-this.imgData.startX),r=(n-1)*(i.y-this.imgData.startY);if(this.imgData.startX=this.imgData.startX-o,this.imgData.startY=this.imgData.startY-r,this.preventWhiteSpace){if(this.imgData.width<this.realWidth){var s=this.realWidth/this.imgData.width;this.imgData.width=this.realWidth,this.imgData.height=this.imgData.height*s}if(this.imgData.height<this.realHeight){var h=this.realHeight/this.imgData.height;this.imgData.height=this.realHeight,this.imgData.width=this.imgData.width*h}this.preventMovingToWhiteSpace()}this.$emit("zoom"),this.draw()},paintBackground:function(){var t=this.canvasColor&&"default"!=this.canvasColor?this.canvasColor:"#e6e6e6";this.ctx.fillStyle=t,this.ctx.fillRect(0,0,this.realWidth,this.realHeight)},draw:function(){var t=this,i=this.ctx;if(this.img){var e=this.imgData,a=e.startX,n=e.startY,o=e.width,r=e.height;requestAnimationFrame(function(){t.paintBackground(),i.drawImage(t.img,a,n,o,r)})}},generateDataUrl:function(t){return this.img?this.canvas.toDataURL(t):""},generateBlob:function(t,i,e){if(!this.img)return null;this.canvas.toBlob(t,i,e)},promisedBlob:function(){for(var t=this,i=arguments.length,e=Array(i),a=0;a<i;a++)e[a]=arguments[a];return new Promise(function(i,a){try{t.generateBlob(function(t){i(t)},e)}catch(t){a(t)}})}}};return{install:function(t,i){t.component("croppa",e)}}});
{
"name": "vue-croppa",
"version": "0.0.19",
"version": "0.0.21",
"description": "A simple straightforward customizable image cropper for vue.js.",

@@ -32,3 +32,7 @@ "main": "dist/vue-croppa.js",

"web",
"front-end"
"front-end",
"staightforward",
"customizable",
"editable",
"lightweight"
],

@@ -35,0 +39,0 @@ "author": "zhanziyang",

# vue-croppa
> A simple straightforward customizable image cropper for vue.js.
<a href="https://zhanziyang.github.io/vue-croppa/"><img src="https://zhanziyang.github.io/vue-croppa/static/preview2.png?v=2" width="400" alt="try it out" /></a>
<a href="https://zhanziyang.github.io/vue-croppa/"><img src="https://zhanziyang.github.io/vue-croppa/static/preview2.png?v=3" width="400" alt="try it out" /></a>

@@ -161,3 +161,3 @@

#### disable-click-to-choose
Disables the default "click to choose an image" user interaction. You can instead trigger the file chooser window programmatically by "drag and drop" functionality or invoking `chooseFile()` method.
Disables the default "click to choose a file" ("tab" on mobile) user interaction. You can instead trigger the file chooser window programmatically by "drag and drop" functionality or invoking `chooseFile()` method.
- type: `boolean`

@@ -176,3 +176,10 @@ - default: `false`

#### reverse-zooming-gesture
#### disable-pinch-to-zoom
Disables the default "pinch with two fingers to zoom" user interaction **on mobile**. You can instead zoom the image programmatically by invoking `zoomIn()` / `zoomOut()` methods.
- type: `boolean`
- default: `false`
#### <s>reverse-zooming-gesture</s>
**Deprecated** @v0.0.20+ Please use `reverse-scroll-to-zoom` instead. Because this doesn't reverse pinch to zoom.
Reverses the zoom-in/zoom-out direction when scrolling.

@@ -182,2 +189,7 @@ - type: `boolean`

#### reverse-scroll-to-zoom
Reverses the zoom-in/zoom-out direction when scrolling.
- type: `boolean`
- default: `false`
#### prevent-white-space

@@ -184,0 +196,0 @@ Prevents revealing background white space when moving or zooming the image.

@@ -68,3 +68,5 @@ Number.isInteger = Number.isInteger || function (value) {

disableScrollToZoom: Boolean,
reverseZoomingGesture: Boolean,
disablePinchToZoom: Boolean,
reverseZoomingGesture: Boolean, // deprecated
reverseScrollToZoom: Boolean,
preventWhiteSpace: Boolean,

@@ -71,0 +73,0 @@ showRemoveButton: {

export default {
getPointerCoords(evt, cropperVM) {
let { canvas, quality } = cropperVM
onePointCoord(point, vm) {
let { canvas, quality } = vm
let rect = canvas.getBoundingClientRect()
let clientX = evt.touches ? evt.touches[0].clientX : evt.clientX
let clientY = evt.touches ? evt.touches[0].clientY : evt.clientY
let clientX = point.clientX
let clientY = point.clientY
return {

@@ -13,5 +13,71 @@ x: (clientX - rect.left) * quality,

getPointerCoords(evt, vm) {
let pointer = evt.touches ? evt.touches[0] : evt
return this.onePointCoord(pointer, vm)
},
getPinchDistance(evt, vm) {
let pointer1 = evt.touches[0]
let pointer2 = evt.touches[1]
let coord1 = this.onePointCoord(pointer1, vm)
let coord2 = this.onePointCoord(pointer2, vm)
return Math.sqrt(Math.pow(coord1.x - coord2.x, 2) + Math.pow(coord1.y - coord2.y, 2))
},
getPinchCenterCoord(evt, vm) {
let pointer1 = evt.touches[0]
let pointer2 = evt.touches[1]
let coord1 = this.onePointCoord(pointer1, vm)
let coord2 = this.onePointCoord(pointer2, vm)
return {
x: (coord1.x + coord2.x) / 2,
y: (coord1.y + coord2.y) / 2
}
},
imageLoaded(img) {
return img.complete && img.naturalWidth !== 0
},
touchDetect() {
window.addEventListener('touchstart', function onFirstTouch() {
window.USER_IS_TOUCHING = true
window.removeEventListener('touchstart', onFirstTouch, false)
}, false)
},
rAFPolyfill() {
// rAF polyfill
var lastTime = 0
var vendors = ['webkit', 'moz']
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']
window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || // Webkit中此取消方法的名字变了
window[vendors[x] + 'CancelRequestAnimationFrame']
}
if (!window.requestAnimationFrame) {
window.requestAnimationFrame = function (callback) {
var currTime = new Date().getTime()
var timeToCall = Math.max(0, 16.7 - (currTime - lastTime))
var id = window.setTimeout(function () {
var arg = currTime + timeToCall
callback(arg)
}, timeToCall)
lastTime = currTime + timeToCall
return id
}
}
if (!window.cancelAnimationFrame) {
window.cancelAnimationFrame = function (id) {
clearTimeout(id)
}
}
Array.isArray = function (arg) {
return Object.prototype.toString.call(arg) === '[object Array]'
}
}
}

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc