npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

rectangle-transform

v0.4.0

Published

方便用于对矩形框的拖拽,变形(包括强制比例,限制范围等)

Readme

RECTANGLE-Transform 矩形框的变换

项目背景

方便用于对矩形框的拖拽,变形(包括强制比例,限制范围等)

安装

   npm i rectangle-transform
   or
   yarn add rectangle-transform

使用

例子一,监听onmousedown,传入事件

import RTListener from 'rectangle-transform'
function onmousedown (ev) {
  const onMoving = ({target, proportion}) => {
    // do something
    console.log(target, proportion)
  }
  const onFinished = ({target, proportion}) => {
    // do something
    console.log(target, proportion)
  }
  RTListener(
    ev,
    {
      'xy',
      step: 40,
      target: {left: 0, top: 0, width: 20, height: 10},
      maximum: {left: 0, top: 0, width: 100, height: 100},
    },
    onMoving,
    onFinished,
  )
}

例子二,直接传入位移

import RTListener from 'rectangle-transform'
const movement = {x: 50, y: 50}
const {target: newTarget} = RTListener(
  movement,
  {
    'xy',
    target: {left: 0, top: 0, width: 20, height: 10},
    maximum: {left: 0, top: 0, width: 100, height: 100},
  },
)
console.log(newTarget)

参数类型说明

interface RTRect {
  left: number;
  top: number;
  width: number;
  height: number;
}
interface RTBbox extends RTRect {
  right: number;
  bottom: number;
}

// 方向控制:l t r b x y 分别是 左 上 右 下 水平 垂直
type RTCtrl = "lt" | "lb" | "rb" | "rt" | "xy" | "t" | "l" | "b" | "r" | "x" | "y"

// 回调函数的参数
interface RTUserDefinedHandlerParams {
  ev: MouseEvent; // 原生事件
  target: RTRect; // 新目标矩形,如果有定义步长,则等于stepTarget
  // 如果有定义步长,则有下面的参数:
  stepTarget?: RTRect; // 根据步长来生成新的矩形
  rawTarget?: RTRect; // 转化前的新目标矩形
  proportion?: RTRect; // 比例
}
// onmousemove, onmouseup 的回调函数
type RTUserDefinedHandler = (params: RTUserDefinedHandlerParams) => void | RTRect;

interface RTOptions {
    control: RTCtrl;
    target: RTRect; // 初始矩形
    maximum?: Partial<RTBbox>; // 最大的范围,可分别定义 左 上 右 下 宽 高
    minimum?: Partial<RTBbox>; // 最小的范围,可分别定义 左 上 右 下 宽 高
    step?: number | [number, number]; // 步长
    rate?: number; // 宽高比
}

interface RTResult {
    target: RTRect;
    proportion?: RTRect;
    stepTarget?: RTRect;
    rawTarget?: RTRect;
}

function RTListener(
  startEvent: MouseEvent | RTPointer,
  options: RTOptions,
  userMove?: RTUserDefinedHandler,
  userFinished?: RTUserDefinedHandler
): RTResult;