Giter VIP home page Giter VIP logo

react-paperjs's Introduction

React Paper.js

npm Build Status codecov

Dependencies Status Dev Dependencies Status Peer Dependencies Status

React fiber renderer and component container for Paper.js.

Install

Recommended: Paper 0.12.x, React, React DOM 17.x.

npm install --save @psychobolt/react-paperjs
# or
yarn add @psychobolt/react-paperjs

Examples

There are several demos. Also check out their sources. Here is one to get you started:

import React from 'react';
import { PaperContainer, Circle, Layer } from '@psychobolt/react-paperjs'

const Shapes = () => <Circle center={[120, 50]} radius={35} fillColor="#00FF00" />;

const App = (props) => (
  <div>
    <PaperContainer {...props}>
      <Circle center={[80, 50]} radius={35} fillColor="red" />
      <Layer>
        <Shapes />
      </Layer>
    </PaperContainer>
  </div>
);

export default App;

Components

Common usage with PaperContainer and its default renderer.

PaperContainer

Provide and creates Paper Scope context. To access Paper Scope, you may use the provided HOC. All children are rendered into its canvas with PaperRenderer by default.

Props

renderer?: Renderer

The default is PaperRenderer. Alternatively, you can extend and pass in your own.

canvasProps?: {} | (paper) => ({})

Props to be passed to <canvas>. Alternatively, you can provide a function that returns new props.

viewProps?: {} | (paper) => ({})

Props to be passed to the View. Alternatively, you can provide a function that returns new props.

onMount?: (paper) => myCallback(paper)

Callback on container mount.

className?: string

Canvas element class attribute.

Paper

Refer supported Paper types. All props are passed to the type constructor.

API

PaperRenderer

Currently a synchronous but extensible implementation.

Members

defaultHostConfig: {}

The host config that is passed into React Reconciler by default. This should not be mutated. Instead, extend PaperRenderer with a getHostConfig function.

defaultTypes: { [type: string]: (props: {}, paper: Paper) => Object}

A mapping of types with their instance factory method. This should not be mutated. Instead, extend PaperRenderer with a getInstanceFactory function.

Extension Example

import React from 'React';
import { PaperContainer, PaperRenderer } from '@psychobolt/react-paperjs'

import MyCustomStencil, { TYPE_NAME as MyCustomStencilComponent } from './MyCustomStencil';

class MyPaperRenderer extends PaperRenderer {
  getInstanceFactory() {
    return { 
      ...this.defaultTypes, /* 
        refer to default types
        see https://github.com/psychobolt/react-paperjs/blob/master/src/Paper.types.js#L42 
      */
      [MyCustomStencilComponent]: (props, paper) => new MyCustomStencil(props),
    };
  }
}

const App = (props) => (
   <PaperContainer renderer={MyPaperRenderer}>
     <MyCustomStencilComponent />
   </PaperContainer>
);

export default App;

The above code adds a custom Component Type to the renderer's instance factory. Then the component can be rendered inside the container.

Higher-order Components

Paper Scope

Injects Paper Scope as component prop 'paper'.

Example usage:

import React from 'react';

import { PaperScope, Circle } from '@psychobolt/react-paperjs';

export default @PaperScope class Scene {
  render() {
    const { paper } = this.props;
    return <Circle fillColor="red" radius={35} center={paper.view.center} />;
  }
}

As an alternative, you can use a helper function:

import React from 'react';

import { renderWithPaperScope, Circle } from '@psychobolt/react-paperjs';

export default class Scene {
  render() {
    return renderWithPaperScope(paper => <Circle fillColor="red" radius={35} center={paper.view.center} />);
  }
}

Extensions

If you're interested in editor components for React Paper JS, you can checkout another library that's work in progress.

Development Guide

Please see DEVELOPMENT.md

react-paperjs's People

Contributors

anotherjesse avatar dependabot-preview[bot] avatar kasbah avatar mejackreed avatar psychobolt avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.