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

react-three-context

v0.3.1

Published

Context & provider to integrate vanilla three.js in your React app.

Downloads

3

Readme

react-three-context

Context & provider to integrate vanilla three.js in your React app.

Reasoning

I like the usability of React for building user interfaces, but when it comes to three.js scenes, I prefer an imperative approach to the declarative one used by react-three-fiber.

This context / provider allows you to build your three.js scene in vanilla js, and use it in your React application.

Usage

Wrap your component / app in a ThreeProvider, passing a script prop:

import { ThreeProvider } from "react-three-context";

<ThreeProvider script={threeScript} initialColor="red">
  <App />
</ThreeProvider>

A script is nothing more than an arrow function (or a class) which returns (at least) two methods init and update: init will be called on provider mount, while update will be called on each frame.

A canvas prop will be available in the init function, alongside with any other prop passed to the ThreeProvider. Passing a custom canvas prop will override the built-in canvas reference (Useful if you want to pass a ref to your own canvas).

init can be an async function.

import {
  BoxGeometry,
  Mesh,
  MeshNormalMaterial,
  PerspectiveCamera,
  Scene,
  WebGLRenderer,
} from "three";

const threeScript = () => {
  let renderer, scene, camera, box;
  return {
    init: (props) => {
      const { canvas, initialColor } = props;

      renderer = new WebGLRenderer({
        antialias: true,
        canvas: canvas,
      });

      scene = new Scene();
      camera = new PerspectiveCamera();
      camera.position.z = 4;

      box = new Mesh(
        new BoxGeometry(), 
        new MeshBasicMaterial({ color: new Color(initialColor)})
      );
      scene.add(box);
    },

    update: () => {
      renderer.render(scene, camera);
    },

    changeColor: () => {
      box.material.color = new Color(
        math.random(), 
        math.random(), 
        math.random()
      );
    }
  };
};

The built-in canvas will then be exported as a React component in the context as ThreeCanvas, alongside with any functions / parameters returned by the script passed to the ThreeProvider. Those can be accessed by using the convenience useThree hook.

Any props passed to ThreeCanvas will be passed on the canvas element, allowing you to style it.

import { useThree } from "react-three-context";

const App = () => {
  const { ThreeCanvas, changeColor } = useThree();

  return (
    <div>
      <p>Hello Three.js app!</p>
      <button onClick={changeColor}>Change Color</button>
      <ThreeCanvas className="fullscreen"/>
    </div>
  );
};

Support Buy me a coffee

If this tool has proven useful to you, consider buying me a coffee to support development of this and many other projects.