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

@seracio/thirdact

v0.9.0

Published

> A set of react components that encapsulate d3-selection api

Downloads

7

Readme

thirdAct

A set of react components that encapsulate d3-selection api

Disclaimer

thirdact is still on a very early stage. It is born of our frustration of using the different workflows that mix React and d3 together.

d3's general update pattern is quite incompatible with React's data binding as React only keeps track of the current data.

This is an experimental attempt to express the d3-selection API in a jsx style. This way, we can mix d3 and React into the render method, without using React hooks such as componentDidUpdate to manage d3 instructions.

  • It uses the d3-selection API under the hood, we are just transforming jsx components to d3 instructions
  • React's Virtual DOM is not involved or aware of the generated DOM, but we isolate it into an empty React element

A first overview

you can find a full example here

import { scaleLinear } from 'd3-scale';
import React from 'react';
import {
    SelectAll,
    Transition,
    Selection,
    Append,
    Remove
} from '@seracio/thirdact';

const App = ({ data }) => {
    const size = 500;

    const scaleX = scaleLinear()
        .domain([0, data.length - 1])
        .range([100, 400]);

    return (
        <svg
            preserveAspectRatio="xMinYMin meet"
            viewBox={`0 0 ${size} ${size}`}
        >
            <text
                x={size / 2}
                y={50}
                style={{
                    alignmentBaseline: 'middle',
                    textAnchor: 'middle',
                    fontFamily: 'sans-serif'
                }}
            >
                Hello thirdact
            </text>
            <SelectAll data={data} selector={'.circle'} root={<g />}>                
                <Selection type="enter">
                    <Append>
                        {/* use react conventions to specify your data */}
                        <circle
                            className="circle"
                            cx={(d, i) => scaleX(i)}
                            cy={100}
                            r={10}
                            style={{ fill: 'transparent' }}
                        />
                    </Append>
                    {/* on a transition, only specify the attr, styles or events you want to update */}
                    <Transition duration={1000}>
                        <circle cy={200} style={{ fill: d => d }} />
                    </Transition>
                </Selection>
                <Selection type="update">
                    <Transition duration={1000}>
                        <circle cx={(d, i) => scaleX(i)} />
                    </Transition>
                </Selection>
                <Selection type="exit">
                    {/* you can chain transitions */}
                    <Transition duration={500}>
                        <circle cy={250} r={5} />
                    </Transition>
                    <Transition duration={500}>
                        <circle cy={400} style={{ fill: 'transparent' }} />
                    </Transition>
                    <Remove />
                </Selection>
            </SelectAll>        
        </svg>
    );
};

Install

yarn add react react-dom d3-selection d3-selection-multi d3-transition lodash.kebabcase
yarn add @seracio/thirdact

Usage

First of all - and if you use d3 modules - you'll need to patch d3-selection-multi and d3-transition to d3 in your root file:

import * as d3 from 'd3-selection';
import 'd3-selection-multi';
import 'd3-transition';

Then you can import the different components of thirdact:

import {
    SelectAll,
    Transition,
    Selection,
    Append,
    Remove
} from '@seracio/thirdact';

API

SelectAll

SelectAll is the root component, it takes several props:

| name | type | description | |:-------:|:-------:|:--------------:| | data | Array | | | selector | string | the equivalent of the d3's selector in d3.selectAll(selector) | | getKey | (d,i) => string | an optional function to get the key of the current datum | | root | React$Element | the react element where the DOM managed by d3 will be |

Selection

Selection is the only component allowed as direct child of SelectAll.
It allows you to use d3's data join by specifying a type props:

| name | type | description | |:------:|:-------:|:--------------:| |type|string|enter or update or exit (and soon enter+exit)|


Once you have split your data into selections thanks to the general update pattern, you can finally do the mapping between your data and the DOM thans to modifiers:

  • Append to create items
  • Remove to remove them
  • Transition for updating them
  • Call to apply them a function

You can chain modifiers.

Append

Append is used to add new tags to the DOM, define their attributes and styles or attach events. thirdact's API is here quite different to its d3 counterpart:

<Append>
    <rect className="toto" 
        x={0} 
        y={(d,i) => i*10} 
        width={(d,i) => d} 
        height={10} 
        styles={{strokeWidth: 2}}
        onClick={(d,i) => console.log(d)}
        />
</Append>

will be transcripted on:

selection.append('rect')
    .attr('class', 'toto')
    .attr('x', 0)
    .attr('y', i*10)
    .attr('width', (d,i) => d)
    .attr('height', 10)
    .style('stroke-width', 2)
    .on('click', (d,i) => console.log(d));

Transitions

Transition currently support these props:

| name | type | description | |:------:|:-------:|:--------------:| |duration|number| |

You just have to specify the attributes or styles you want to update:

<Transition duration={500}>
    <path
        style={{fill: 'blue'}}
        tween-d={tween}
        />
</Transition>

Note the equivalent of d3's attrTween: tween-[attr name]

Remove

Remove has no props

Call

Call uses a function as a children

<Selection type="enter">
    <Append>
        {/**/}
    </Append>
    <Call>
    {function(selection){
        // ...
    }}
    </Call>
</Selection>

Chaining transformations

<Selection type="enter">
    <Append>
        <circle
            className="circle"
            cx={(d, i) => scaleX(i)}
            cy={100}
            r={10}
            style={{ fill: 'transparent' }}
        />
    </Append>
    <Transition duration={1000}>
        <circle cy={200} style={{ fill: d => d }} />
    </Transition>
</Selection>

License

MIT License

Copyright (c) 2017 serac.io

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.