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 🙏

© 2025 – Pkg Stats / Ryan Hefner

ngvas-image-cors

v0.7.6

Published

HTML Canvas components for Angular2 / Angular4. It is CORS enabled for ImageShape

Readme

ngvas

An Angular2 / Angular4 Module for HTML Canvas

The ngvas library allows you to control the <canvas> element from within Angular 2. Or is it 4 now?

Look in the /demo directory for a working example.

Experiment with ngvas in a Plunker.


Example Angular Module:

import { NgvasModule, tweens, hitAreas } from "ngvas";

@NgModule({
  imports:      [ BrowserModule, NgvasModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
class AppModule { }

Example HTML with Ngvas components:

<ngvas [width]="500" [height]="500" (ready)="onNgvasInit()">
    <template ngFor let-rect [ngForOf]="rects">
        <ngvas-rectangle [fill]="rect.color" [translate]="rect.xy" [width]="rect.w" [height]="rect.h" origin="center"></ngvas-rectangle>
    </template>
    <ngvas-circle [fill]="'#0000ff'" [x]="100" [y]="100" [radius]="50" origin="center" (click)="onClickHandler($event)" [hitArea]="PixelHitArea"></ngvas-circle>
</ngvas>

Components

<ngvas>: NgvasComponent Input Bindings

| @Input("name") | Data Type | Description | | --------------- | ---------- | -------------------------------------------------- | | active | boolean | Sets if animation in the canvas is active or not. | | width | number | Sets the width of the <canvas> element. | | height | number | Sets the height of the <canvas> element. |

<ngvas>: NgvasComponent Event Bindings

| @Output("name") | Data Type | Description | | ---------------- | ----------------- | ----------------------------------------------- | | ready | NgvasComponent | Fires once when the component is initialized. |


<ngvas-*>: NgvasBaseComponent Input Bindings

These input bindings are available on all <ngvas-*> components.

| @Input("name") | Data Type | Description | | --------------- | ------------ | ------------------------------------------------------------- | | name | string | The name of the component. Not used at this point. | | active | boolean | Sets if the animation is active on the component. | | visible | boolean | Sets if the component is visible on the canvas. | | x | number | Sets the x coordinate of the shape. | | y | number | Sets the y coordinate of the shape. | | origin | [number, number] | "center" | Sets the x and y origin of the shape. "center" will lock the origin to the shape's center. | | width | number | Sets the width of the shape. Not applicable for many shapes. | | height | number | Sets the height of the shape. Not applicable for many shapes. | | rotation | number | Sets the rotation of the shape in degrees. | | scaleX | number | Sets the x scale of the shape. | | scaleY | number | Sets the y scale of the shape in degrees. | | skewX | number | Sets the x skew of the shape in degrees. | | skewY | number | Sets the y skew of the shape. | | scale | TweenInput<S, [number, number]> | Scale multiplier. | | size | TweenInput<S, [number, number]> | Sets the width and height of the shape. | | skew | TweenInput<S, [number, number]> | Sets the X and Y skew of the shape. | | rotate | TweenInput<S, number> | Rotates the shape by the specified degrees. | | translate | TweenInput<S, [number, number]> | Moves the shape the specified X and Y coordinates. | | animate | ((shape: S) => boolean) | undefined | This function is invoked on every frame request. | | constrain | ConstraintFunction[] | undefined | This function is invoked on event frame request. | | hitArea | typeof PixelHitArea | A function to calculate if the current mouse coordinates are within a shape. | | opacity | number | Sets the overall opacity of the shape. It's proabably easier to use a fill or stroke ColorStyle with opacity. | | compose | { alpha?: number, overlay?: ComposeOverlay } | Sets how the shape is overlayed on the canvas. CanvasRenderingContext2D.globalCompositeOperation | | fill | TweenInput<S, ColorStyle> | Sets the fill color, gradient or pattern of the shape. CanvasRenderingContext2D.fillStyle | | stroke | TweenInput<S, { width:number, style:ColorStyle, join?:LineJoin, cap?:LineCap, dashOffset?:number, miterLimit?:number }> | Sets the stroke settings of the shape. | | shadow | TweenInput<S, { blur:number, color:string, offsetX:number, offsetY:number }> | Sets the shadow settings of the shape. |

<ngvas-*>: NgvasBaseComponent Event Bindings

These event bindings are available on all <ngvas-*> components. Note: a hit area is required for mouse events to work.

| @Output("name") | Data Type | Description | | ---------------- | ------------------------ | --------------------------------------------------------------- | | click | MouseEvent | Emits a MouseEvent if the shape is clicked. | | dblclick | MouseEvent | Emits a MouseEvent if the shape is double-clicked. | | wheel | WheelEvent | Emits a WheelEvent if the scroll wheel is used over the shape. | | mouseenter | MouseEvent | Emits a MouseEvent if the mouse pointer enters the shape. | | mouseleave | MouseEvent | Emits a MouseEvent if the mouse pointer leaves the shape. | | shape | BaseShape & BaseStyle | On init, emits the underlying class of the shape. |


<ngvas-arc>: NgvasArcComponent Input Bindings

Draws a portion of a circle. connectToCenter to make a pie-chart shape.

| @Input("name") | Data Type | Description | | --------------- | ------------------------------- | ------------------------------------------------------------------ | | angle | TweenInput<ArcShape, number> | The ending angle of the arc in degrees. | | radius | TweenInput<ArcShape, number> | The radius of the arc. | | connectToCenter | boolean | If true, connects the arc to the center point like a pie slice. |

Example:

<ngvas-arc fill="#ff0000" [x]="250" [y]="250" [radius]="50" [angle]="270" origin="center" [connectToCenter]="true"></ngvas-arc>

<ngvas-bezier>: NgvasBezierCurveComponent Input Bindings

Draws one or more connected bezier curves.

| @Input("name") | Data Type | Description | | --------------- | --------------- | ------------------------------------ | | curves | BezierCurve[] | An array of connected bezier curves. |

<ngvas-bezier [stroke]="{ width: 4 }" [x]="50" [y]="50" [curves]="[[ [100, 100], [150, 450], [400, 300], [400, 400] ]]"></ngvas-bezier>

<ngvas-circle>: NgvasCircleComponent Input Bindings

Draws a circle. Basically, an arc with a 360 degree angle.

| @Input("name") | Data Type | Description | | --------------- | ---------------------------------- | -------------------------- | | radius | TweenInput<CircleShape, number> | The radius of the circle. |

<ngvas-circle fill="#ff0000" [x]="250" [y]="250" [radius]="50" origin="center"></ngvas-circle>

<ngvas-image>: NgvasImageComponent Input Bindings

Draws an image from the

| @Input("name") | Data Type | Description | | --------------- | ---------- | --------------------------- | | src | string | The URL path to the image. |

<ngvas-image fill="rgba(0,0,0,0)" [x]="10" [y]="10" [width]="100" [height]="100" src="../test/bird.jpg"></ngvas-image>

Note: As a temporary fix, <ngvas-image> must set fill to make it visible.


<ngvas-line>: NgvasLineComponent Input Bindings

Draws one or more connected lines.

| @Input("name") | Data Type | Description | | --------------- | ----------- | ----------------------------- | | lines | Line[] | An array of connected lines. |

<ngvas-line [stroke]="{ width: 4 }" [lines]="[ [[100, 100], [200, 200]], [[200, 200], [300, 100]] ]"></ngvas-line>

<ngvas-polygon>: NgvasPolygonComponent Input Bindings

Draws a shape with any combination of lines, bezier curves and quadratic curves.

| @Input("name") | Data Type | Description | | --------------- | --------------------------------------------- | ------------------------------------------- | | sides | Array<Line | BezierCurve | QuadraticCurve> | An array of a variety of lines and curves. |

<ngvas-polygon fill="#ff0000" [x]="50" [y]="50" [sides]="sidesArray"></ngvas-polygon>

<ngvas-quadratic>: NgvasQuadraticCurveComponent Input Bindings

Draws one or more connected quadratic curves.

| @Input("name") | Data Type | Description | | --------------- | ------------------- | ---------------------------------------- | | curves | QuadraticCurve[] | An array of connected quadratic curves. |

<ngvas-quadratic [stroke]="{ width: 4 }" [x]="50" [y]="50" [curves]="[[ [100, 100], [150, 450], [400, 400] ]]"></ngvas-quadratic>

<ngvas-text>: NgvasTextComponent Input Bindings

Draws text.

| @Input("name") | Data Type | Description | | --------------- | ----------------------------------------------------------------- | --------------------------------- | | text | string | The text to display. | | textStyle | { font?: string, align?: TextAlign, baseline?: TextBaseline } | The style of the displayed text. |

<ngvas-text fill="#0000ff" [textStyle]="{ font: '48px Arial' }" [x]="50" [y]="250" text="This is text."></ngvas-text>

Tweening Inputs and Functions

You can set almost any value of a component to tween from its current value to a target value over a specified period of time with specific easing.

import { tweens } from "ngvas";

type TweenFunc = (time: number, startValue: number, changeValue: number, duration: number) => number;

type TweenInput <S, T> = T | [ T, number, TweenFunc | undefined, ((s: S) => void) | undefined ];

// Set the amount of pixels to move, the tween duration in MS, and the easing function to use.
const translateTween = [ [250, 250], 1000, tweens.easings.easeInOutSine ];

Example HTML:

<ngvas-circle fill="#ff0000" [x]="50" [y]="50" [radius]="50" [translate]="translateTween" origin="center"></ngvas-circle>

Built-in Tweens

  • easeLinear
  • easeInSine, easeOutSine, easeInOutSine
  • easeInQuint, easeOutQuint, easeInOutQuint
  • easeInQuart, easeOutQuart, easeInOutQuart
  • easeInQuad, easeOutQuad, easeInOutQuad
  • easeInExpo, easeOutExpo, easeInOutExpo
  • easeInElastic, easeOutElastic, easeInOutElastic
  • easeInCircular, easeOutCircular, easeInOutCircular
  • easeInBack, easeOutBack, easeInOutBack
  • easeInBounce, easeOutBounce, easeInOutBounce
  • easeInCubic, easeOutCubic, easeInOutCubic

Hit Area Functions

One function to calculate if the mouse coordinates are on a shape is available. It is pixel accurate and non-optimized. Use it judiciously until more effecient hit area functions become available.

import { hitAreas } from "ngvas";

import PixelHitArea = hitAreas.PixelHitArea;

Types

Import interfaces:

import * as types from "ngvas";
// Point = [ x, y ]
type Point = [number, number];

// Line = [ startPoint, endPoint ]
type Line = [Point, Point];

// QuadraticCurve = [ startPoint, controlPoint, endPoint ]
type QuadraticCurve = [Point, Point, Point];

// BexierCurve = [ startPoint, controlPoint0, controlPoint1, endPoint ]
type BezierCurve = [Point, Point, Point, Point];

// Example: Point | [ Point, durationInMS, TweenFunc]
type TweenInput <S extends BaseStyle, T> = T | [ T, number, TweenFunc | undefined, ((s: S) => void) | undefined ]

type ComposeOverlay = "source-over" | "source-in" | "source-out" | "source-atop" |
            "destination-over" | "destination-in" | "destination-out" | "destination-atop" |
            "lighter" | "copy" | "xor" | "multiply" | "screen" | "overlay" | "darken" |
            "lighten" | "color-dodge" | "color-burn" | "hard-light" | "soft-light" | "difference" |
            "exclusion" | "hue" | "saturation" | "color" | "luminosity";

// ColorStyle: 0xff9966, "#ff9966", "#ff9966ff", "rgb(255,200,150)", "rgba(255,200,150,0.5)
type ColorStyle = number | string | CanvasGradient | CanvasPattern;
type LineJoin = "miter" | "bevel" | "round";
type LineCap = "butt" | "round" | "square";
type TextAlign = "left" | "right" | "center" | "start" | "end";
type TextBaseline = "top" | "hanging" | "middle" | "alphabetic" | "ideographic" | "bottom";

TODOs for 1.0

  • Improve docs.
  • Unit tests with >90% coverage.
  • Improve originToCenter for curves and polygon.
  • Built-in Constraints.
  • Add mouse events: mousedown, mouseup
  • Add other hit area types: vector rectangle, circle.
  • Optimization.

TODOs for 1.x

  • Add drag and drop events.
  • Add HammerJS support.
  • Grouping components.
  • Optimization.