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 🙏

© 2024 – Pkg Stats / Ryan Hefner

ng-rive

v0.3.1

Published

<h1 align="center">Angular Rive</h1>

Downloads

2,444

Readme

A repository for Angular built around the rive canvas runtime.

GitHub npm npm

Demo

Compatibility

Animations built before version 0.7.0 rive-canvas will not work with new versions of ng-rive.

| Angular | Rive-canvas | ng-rive | | --------|--------------|---------| | >14 | 0.7.* | 0.2.* | | 12 | 0.7.* | 0.1.* | | <12 | 0.6.* | 0.0.* |

Get started

  1. Install :
npm install ng-rive @rive-app/canvas-advanced
  1. Import RiveModule:
import { RiveModule } from 'ng-rive';

@NgModule({
  declarations: [MyComponent],
  imports: [
    CommonModule,
    RiveModule,
  ],
})
export class MyModule { }
  1. Add your .riv file in your assets
|-- assets
|   |--rive
|      |-- knight.riv

If you want to change the path you can specify it with the RIVE_FOLDER provider:

import { RiveModule, RIVE_FOLDER } from 'ng-rive';
@NgModule({
  declarations: [MyComponent],
  imports: [
    CommonModule,
    RiveModule,
  ],
  providers: [{
    provide: RIVE_FOLDER,
    useValue: 'assets/animations',
  }]
})
export class MyModule { }
  1. Use in template :
<canvas riv="knight" width="500" height="500">
  <riv-animation name="idle" play></riv-animation>
</canvas>
  1. Debug: If you see the error Error: Can't resolve 'fs', add this in your package.json:
"browser": {
  "fs": false,
  "path": false
}

API

Canvas

The RiveCanvas loads a .riv animation file into it's canvas tag :

Input

  • [riv]: The .riv file or it's name if in the asset. Full path is managed by the RIVE_FOLDER token.
  • [artboard]: The name of the artboard to used. If not specified, the default one is used.
  • [width]: The width of the canvas in pixel.
  • [height]: The height of the canvas in pixel.
  • [fit]: How the animation should fit inside the canvas.
  • [alignment]: Where the animation should be positioned inside the canvas.
  • [lazy]: If provided, the file will only be loaded when canvas is visible in the viewport.
  • [viewbox]: Enable zoom in the canvas. Expect a string minX minY maxX maxY. Default 0 0 100% 100%.

⚠️ The lazy input use the IntersectionObserver API which will not work in all browser.

Output

  • (artboardChange): Emit the new Artboard

Examples

Canvas zoomed from "25% 25%" (top left), to "75% 75%" (bottom right).

<canvas riv="knight" viewbox="25% 25% 75% 75%" width="500" height="500"></canvas>

Animation

Run an animation inside a canvas based on name or index:

<canvas riv="knight" width="500" height="500">
  <riv-animation name="idle" play speed="0.5"></riv-animation>
</canvas>

Input

  • [name]: The name of the animation in the file loaded by the canvas.
  • [index] The index of the animation in the file loaded by the canvas (used if name is not provided).
  • [play]: Bind the player to a boolean (playing: true, paused: false).
  • [speed]: The speed at which the animation should play. Negative values cause the animation to play backward.
  • [mix]: The weight of this application over another in the same Artboard.

Output

  • (load): Emitted the loaded LinearAnimation.

Player

Provide more control over the animation

<canvas riv="poison-loader" width="500" height="500">
  <riv-player #player="rivPlayer" name="idle" [time]="time" mode="one-shot"></riv-player>
</canvas>
<input type="range" step="0.1" (input)="time = $event.target.value" [min]="player.startTime" [max]="player.endTime" />

Input / Output

  • [(time)]: Bind the animation to a specific time
  • [(play)]: Bind the player to a boolean (playing: true, paused: false).
  • [(speed)]: The speed at which the animation should play. Negative values cause the animation to play backward.

Based on the mode, the play, time & speed might change automatically.

Input

  • [name]: The name of the animation in the file loaded by the canvas.
  • [index] The index of the animation in the file loaded by the canvas (used if name is not provided).
  • [mix]: The weight of this application over another in the same Artboard.

⚠️ Deprecated: These input will be remove in the next version

  • [mode]: Force a mode: "one-shot", "loop" or "ping-pong" (if undefined, default mode is used).
  • [autoreset]: If true, will reset the animation to start when done (only for one-shot mode).

Output

  • (load): Emitted the loaded LinearAnimation.
  • (timeChange): Emitted just before refreshing the canvas when play is true. This output will be triggered for every frame if listened to. As every output create a rendering cycle, use it with care.

Node

The RiveNode directive give you access to one node :

<canvas riv="knight">
  <riv-animation name="idle" play></riv-animation>
  <riv-node name="cloud" x="300"></riv-node>
</canvas>

This example will set the position of the cloud to 300px of its origin.

Important: You need to have at least one animation playing to modify a node.

Input

  • [x] The x position of the node.
  • [y] The y position of the node.
  • [scaleX] The scaleX of the node.
  • [scaleY] The scaleX of the node.
  • [scale] Apply scaleX & scaleY.
  • [rotation] Apply rotation on the node. If value is below 2*PI use radians, else degrees.

⚠️ If the property of the node is updated by the animation, the animation wins.


State Machine

You can manipulate the state of a state machine animation though inputs:

<canvas riv="skills">
  <riv-state-machine name="move" play>
    <riv-input name="Level" [value]="level.value"><riv-input>
  </riv-state-machine>
</canvas>
<input type="radio" formControl="level" value="0" > Beginner
<input type="radio" formControl="level" value="1"> Intermediate
<input type="radio" formControl="level" value="2"> Expert

Input

  • [name] The name of the state machine in the file loaded by the canvas.
  • [index] The index of the state machine in the file loaded by the canvas (used if name is not provided).
  • [play]: Bind the player to a boolean (playing: true, paused: false).
  • [speed]: The speed at which the animation should play. Negative values cause the animation to play backward.

Output

  • (load): Emitted the loaded StateMachine.
  • (stateChange): Emitted the names of the states that have changed.

State Machine Input

The riv-input enables you to manipulated the state machine:

<canvas riv="skills">
  <riv-state-machine name="move" play>
    <riv-input #trigger="rivInput" name="Level"><riv-input>
  </riv-state-machine>
</canvas>
<button (click)="tigger.fire()">Trigger change</button>

Input

  • [name] The name of the input
  • [value] The value of the input, only if the type of the input is Boolean or Number

Ouput

  • (load) Emit the State Machine Input object when it's loaded from the rive file.
  • (change) Emit when the input value is changed or if fired.

Method

  • fire() Trigger a change, only if the type of the input is Trigger

State Machine Event Listeners

By default all State Machine defined in the template that have event listener will be triggered. (⚠️ You need to add your state machine in the template to start listening on it):

<canvas riv="skills">
  <riv-state-machine name="move"></riv-state-machine>
</canvas>

Canvas will listen on all event listeners from the state machine "move", but not other in the same artboard.

Technics

Play if canvas is visible

To save ressources you can play the animation only when the canvas is visible in the viewport :

<canvas #canvas="rivCanvas" riv="knight" width="500" height="500">
  <riv-animation name="idle" [name]="canvas.isVisible | async"></riv-animation>
</canvas>

Multiple Animations

You can run multiple animations within the same canvas :

<canvas riv="knight">
  <riv-player name="idle" play></riv-player>
  <riv-player name="day_night" play mode="ping-pong" speed="0.5"></riv-player>
</canvas>