
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
Library provides dragging/resizing/rotating/snapping SVG/HTML Elements.
Run npm install to install with npm.
npm install subjx
Including via a <script> tag:
<script src="../dist/js/subjx.js"></script>
Main function subjx returns Subjx instance which based on elements finded by
passed parameters:
import subjx from 'subjx';
import 'subjx/dist/style/subjx.css';
// possible parameters
const xElem = subjx( 'selector' ) |
subjx( element ) |
subjx( elementArray );
// enabling tool by `drag` method with the optional parameters
// by default just call `.drag()`
const xDraggable = xElem.drag();
// for disabling use `disable` method for each object
xDraggable.disable();
// getter returns root DOM element of 'controls'
xDraggable.controls;
// provides access to useful options
xDraggable.storage;
// for example: to get reference to any handle's DOM
const {
handles: { tl, tr, ...etc }
} = xDraggable.storage;
// enables dragging
// there is no need to call this method manually
xDraggable.enable(options);
// disables dragging, removes controls and handles
xDraggable.disable();
// adds event listener for some events
xDraggable.on(eventName, cb);
// removes event listener for some events
xDraggable.off(eventName, cb);
// Event names
const EVENTS = [
'dragStart',
'drag',
'dragEnd',
'resizeStart',
'resize',
'resizeEnd',
'rotateStart',
'rotate',
'rotateEnd'
];
// execute dragging manually
xDraggable.exeDrag({
dx, // drag along the x axis
dy // drag along the y axis
});
// execute resizing manually
xDraggable.exeResize({
dx, // resize along the x axis
dy, // resize along the y axis
revX, // reverse resizing along the x axis
revY, // reverse resizing along the y axis
doW, // allow width resizing
doH // allow height resizing
});
// execute rotating manually
xDraggable.exeRotate({
delta // radians
});
// Align element inside container: ['t', 'l', 'r', 'b', 'v', 'h']
xDraggable.applyAlignment('tr');
// Call this method when applying scale or viewBox values changing
// useful when element's container was transformed from outside
xDraggable.fitControlsToSize();
// Sets the origin for an element's transformations
xDraggable.setTransformOrigin(
{
x, // absolute the origin's position x coordinate
y, // absolute he origin's position y coordinate
dx, // offset the origin's position x coordinate
dy // offset the origin's position y coordinate
},
pin // leaves current origin fixed if true or not if false
);
// Sets transform origin to default
xDraggable.resetTransformOrigin();
// Returns element's current dimensions
xDraggable.getDimensions();
| Property | Description | Type | Default |
|---|---|---|---|
| container | Transformation coordinate system | 'selector' | element | element.parentNode |
| controlsContainer | Parent element of 'controls' | 'selector' | element | element.parentNode |
| axis | Constrain movement along an axis | string: 'x' | 'y' | 'xy' | 'xy' |
| snap | Snapping to grid in pixels/radians | object | { x: 10, y: 10, angle: 10 } |
| each | Mimic behavior with other '.draggable' elements | object | { move: false, resize: false, rotate: false } |
| proportions | Keep aspect ratio on resizing / scaling | boolean | false |
| draggable | Allow or deny an action | boolean | true |
| resizable | Allow or deny an action | boolean | true |
| rotatable | Allow or deny an action | boolean | true |
| scalable | Applies scaling only to root element | boolean | false |
| restrict | Restricts element dragging/resizing/rotation | 'selector' | element | - |
| rotatorAnchor | Rotator anchor direction | string: 'n' | 's' | 'w' | 'e' | 'e' |
| rotatorOffset | Rotator offset | number | 50 |
| transformOrigin | Sets the origin for an element's transformations | boolean | Array | false |
subjx('.draggable').drag({
onInit(elements) {
// fires on tool activation
},
onMove({ clientX, clientY, dx, dy, transform }) {
// fires on moving
},
onResize({ clientX, clientY, dx, dy, transform, width, height }) {
// fires on resizing
},
onRotate({ clientX, clientY, delta, transform }) {
// fires on rotation
},
onDrop({ clientX, clientY }) {
// fires on drop
},
onDestroy(el) {
// fires on tool deactivation
}
});
Subscribing new draggable element to previously activated(useful with each option)
const options = {};
const observable = subjx.createObservable();
subjx('.draggable').drag(options, observable);
// pass Observable to new element
const createDraggableAndSubscribe = e => {
subjx(e.target).drag(options, observable);
};
Allowed SVG elements:
g, path, rect, ellipse, line, polyline, polygon, circle
const xCloneable = xElem.clone({
// dropping area
stack: 'selector',
// set clone parent
appendTo: 'selector',
// set clone additional style
style: {
border: '1px dashed green',
background: 'transparent'
}
});
subjx('.cloneable').clone({
onInit(el) {
// fires on tool activation
},
onMove(dx, dy) {
// fires on moving
},
onDrop(e) {
// fires on drop
},
onDestroy() {
// fires on tool deactivation
}
});
Disabling
xCloneable.disable();
MIT (c) Karen Sarksyan
FAQs
Drag, Rotate, Resize library
We found that subjx demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.