A spring that solves your animation problems.

Related tags

React react-motion
Overview

React-Motion

Build Status npm version Bower version react-motion channel on discord

import {Motion, spring} from 'react-motion';
// In your render...
<Motion defaultStyle={{x: 0}} style={{x: spring(10)}}>
  {value => <div>{value.x}</div>}
</Motion>

Animate a counter from 0 to 10. For more advanced usage, see below.

Install

  • Npm: npm install --save react-motion

  • Bower: do not install with bower install react-motion, it won't work. Use bower install --save https://unpkg.com/react-motion/bower.zip. Or in bower.json:

{
  "dependencies": {
    "react-motion": "https://unpkg.com/react-motion/bower.zip"
  }
}

then include as

<script src="bower_components/react-motion/build/react-motion.js"></script>
  • 1998 Script Tag:
<script src="https://unpkg.com/react-motion/build/react-motion.js"></script>
(Module exposed as `ReactMotion`)

Works with React-Native v0.18+.

Demos

Check the wiki for more!

Try the Demos Locally

git clone https://github.com/chenglou/react-motion.git
cd react-motion
npm install
  • With hot reloading (slow, development version): run npm start.
  • Without hot reloading (faster, production version): run npm run build-demos and open the static demos/demo_name/index.html file directly. Don't forget to use production mode when testing your animation's performance!

To build the repo yourself: npm run prepublish.

What does this library try to solve?

My React-Europe talk

For 95% of use-cases of animating components, we don't have to resort to using hard-coded easing curves and duration. Set up a stiffness and damping for your UI element, and let the magic of physics take care of the rest. This way, you don't have to worry about petty situations such as interrupted animation behavior. It also greatly simplifies the API.

This library also provides an alternative, more powerful API for React's TransitionGroup.

API

Exports:

  • spring
  • Motion
  • StaggeredMotion
  • TransitionMotion
  • presets

Here's the well-annotated public Flow type definition file (you don't have to use Flow with React-motion, but the types help document the API below).

P.S. using TypeScript? Here are the React-motion TypeScript definitions!


Helpers

- spring: (val: number, config?: SpringHelperConfig) => OpaqueConfig

Used in conjunction with the components below. Specifies the how to animate to the destination value, e.g. spring(10, {stiffness: 120, damping: 17}) means "animate to value 10, with a spring of stiffness 120 and damping 17".

  • val: the value.

  • config: optional, for further adjustments. Possible fields:

    • stiffness: optional, defaults to 170.
    • damping: optional, defaults to 26.
    • precision: optional, defaults to 0.01. Specifies both the rounding of the interpolated value and the speed (internal).

    It's normal not to feel how stiffness and damping affect your spring; use Spring Parameters Chooser to get a feeling. Usually, you'd just use the list of tasteful stiffness/damping presets below.

- Presets for {stiffness, damping}

Commonly used spring configurations used like so: spring(10, presets.wobbly) or spring(20, {...presets.gentle, precision: 0.1}). See here.


<Motion />

Usage

<Motion defaultStyle={{x: 0}} style={{x: spring(10)}}>
  {interpolatingStyle => <div style={interpolatingStyle} />}
</Motion>

Props

- style: Style

Required. The Style type is an object that maps to either a number or an OpaqueConfig returned by spring() above. Must keep the same keys throughout component's existence. The meaning of the values:

  • an OpaqueConfig returned from spring(x): interpolate to x.
  • a number x: jump to x, do not interpolate.
- defaultStyle?: PlainStyle

Optional. The PlainStyle type maps to numbers. Defaults to an object with the same keys as style above, whose values are the initial numbers you're interpolating on. Note that during subsequent renders, this prop is ignored. The values will interpolate from the current ones to the destination ones (specified by style).

- children: (interpolatedStyle: PlainStyle) => ReactElement

Required function.

  • interpolatedStyle: the interpolated style object passed back to you. E.g. if you gave style={{x: spring(10), y: spring(20)}}, you'll receive as interpolatedStyle, at a certain time, {x: 5.2, y: 12.1}, which you can then apply on your div or something else.

  • Return: must return one React element to render.

- onRest?: () => void

Optional. The callback that fires when the animation comes to a rest.


<StaggeredMotion />

Animates a collection of (fixed length) items whose values depend on each other, creating a natural, springy, "staggering" effect like so. This is preferred over hard-coding a delay for an array of Motions to achieve a similar (but less natural-looking) effect.

Usage

<StaggeredMotion
  defaultStyles={[{h: 0}, {h: 0}, {h: 0}]}
  styles={prevInterpolatedStyles => prevInterpolatedStyles.map((_, i) => {
    return i === 0
      ? {h: spring(100)}
      : {h: spring(prevInterpolatedStyles[i - 1].h)}
  })}>
  {interpolatingStyles =>
    <div>
      {interpolatingStyles.map((style, i) =>
        <div key={i} style={{border: '1px solid', height: style.h}} />)
      }
    </div>
  }
</StaggeredMotion>

Aka "the current spring's destination value is the interpolating value of the previous spring". Imagine a spring dragging another. Physics, it works!

Props

- styles: (previousInterpolatedStyles: ?Array<PlainStyle>) => Array<Style>

Required function. Don't forget the "s"!

  • previousInterpolatedStyles: the previously interpolating (array of) styles (undefined at first render, unless defaultStyles is provided).

  • Return: must return an array of Styles containing the destination values, e.g. [{x: spring(10)}, {x: spring(20)}].

- defaultStyles?: Array<PlainStyle>

Optional. Similar to Motion's defaultStyle, but an array of them.

- children: (interpolatedStyles: Array<PlainStyle>) => ReactElement

Required function. Similar to Motion's children, but accepts the array of interpolated styles instead, e.g. [{x: 5}, {x: 6.4}, {x: 8.1}]

(No onRest for StaggeredMotion because we haven't found a good semantics for it yet. Voice your support in the issues section.)


<TransitionMotion />

Helps you to do mounting and unmounting animation.

Usage

You have items a, b, c, with their respective style configuration, given to TransitionMotion's styles. In its children function, you're passed the three interpolated styles as params; you map over them and produce three components. All is good.

During next render, you give only a and b, indicating that you want c gone, but that you'd like to animate it reaching value 0, before killing it for good.

Fortunately, TransitionMotion has kept c around and still passes it into the children function param. So when you're mapping over these three interpolated styles, you're still producing three components. It'll keep interpolating, while checking c's current value at every frame. Once c reaches the specified 0, TransitionMotion will remove it for good (from the interpolated styles passed to your children function).

This time, when mapping through the two remaining interpolated styles, you'll produce only two components. c is gone for real.

import createReactClass from 'create-react-class';

const Demo = createReactClass({
  getInitialState() {
    return {
      items: [{key: 'a', size: 10}, {key: 'b', size: 20}, {key: 'c', size: 30}],
    };
  },
  componentDidMount() {
    this.setState({
      items: [{key: 'a', size: 10}, {key: 'b', size: 20}], // remove c.
    });
  },
  willLeave() {
    // triggered when c's gone. Keeping c until its width/height reach 0.
    return {width: spring(0), height: spring(0)};
  },
  render() {
    return (
      <TransitionMotion
        willLeave={this.willLeave}
        styles={this.state.items.map(item => ({
          key: item.key,
          style: {width: item.size, height: item.size},
        }))}>
        {interpolatedStyles =>
          // first render: a, b, c. Second: still a, b, c! Only last one's a, b.
          <div>
            {interpolatedStyles.map(config => {
              return <div key={config.key} style={{...config.style, border: '1px solid'}} />
            })}
          </div>
        }
      </TransitionMotion>
    );
  },
});

Props

First, two type definitions to ease the comprehension.

  • TransitionStyle: an object of the format {key: string, data?: any, style: Style}.

    • key: required. The ID that TransitionMotion uses to track which configuration is which across renders, even when things are reordered. Typically reused as the component key when you map over the interpolated styles.

    • data: optional. Anything you'd like to carry along. This is so that when the previous section example's c disappears, you still get to access c's related data, such as the text to display along with it.

    • style: required. The actual starting style configuration, similar to what you provide for Motion's style. Maps keys to either a number or an OpaqueConfig returned by spring().

  • TransitionPlainStyle: similar to above, except the style field's value is of type PlainStyle, aka an object that maps to numbers.

- styles: Array<TransitionStyle> | (previousInterpolatedStyles: ?Array<TransitionPlainStyle>) => Array<TransitionStyle>

Required. Accepts either:

  • an array of TransitionStyle configs, e.g. [{key: 'a', style: {x: spring(0)}}, {key: 'b', style: {x: spring(10)}}].

  • a function similar to StaggeredMotion, taking the previously interpolating styles (undefined at first call, unless defaultStyles is provided), and returning the previously mentioned array of configs. You can do staggered mounting animation with this.

- defaultStyles?: Array<TransitionPlainStyle>

Optional. Similar to the other components' defaultStyle/defaultStyles.

- children: (interpolatedStyles: Array<TransitionPlainStyle>) => ReactElement

Required function. Similar to other two components' children. Receive back an array similar to what you provided for defaultStyles, only that each style object's number value represent the currently interpolating value.

- willLeave?: (styleThatLeft: TransitionStyle) => ?Style

Optional. Defaults to () => null. The magic sauce property.

  • styleThatLeft: the e.g. {key: ..., data: ..., style: ...} object from the styles array, identified by key, that was present during a previous render, and that is now absent, thus triggering the call to willLeave. Note that the style property is exactly what you passed in styles, and is not interpolated. For example, if you passed a spring for x you will receive an object like {x: {stiffness, damping, val, precision}}.

  • Return: null to indicate you want the TransitionStyle gone immediately. A Style object to indicate you want to reach transition to the specified value(s) before killing the TransitionStyle.

- didLeave?: (styleThatLeft: {key: string, data?: any}) => void

Optional. Defaults to () => {}.

  • styleThatLeft: the {key:..., data:...} that was removed after the finished transition.
- willEnter?: (styleThatEntered: TransitionStyle) => PlainStyle

Optional. Defaults to styleThatEntered => stripStyle(styleThatEntered.style). Where stripStyle turns {x: spring(10), y: spring(20)} into {x: 10, y: 20}.

  • styleThatEntered: similar to willLeave's, except the TransitionStyle represents the object whose key value was absent during the last render, and that is now present.

  • Return: a defaultStyle-like PlainStyle configuration, e.g. {x: 0, y: 0}, that serves as the starting values of the animation. Under this light, the default provided means "a style config that has the same starting values as the destination values".

Note that willEnter and defaultStyles serve different purposes. willEnter only triggers when a previously inexistent TransitionStyle inside styles comes into the new render.

(No onRest for TransitionMotion because we haven't found a good semantics for it yet. Voice your support in the issues section.)


FAQ

  • How do I set the duration of my animation?

Hard-coded duration goes against fluid interfaces. If your animation is interrupted mid-way, you'd get a weird completion animation if you hard-coded the time. That being said, in the demo section there's a great Spring Parameters Chooser for you to have a feel of what spring is appropriate, rather than guessing a duration in the dark.

  • How do I unmount the TransitionMotion container itself?

You don't. Unless you put it in another TransitionMotion...

  • How do I do staggering/chained animation where items animate in one after another?

See StaggeredMotion

  • My ref doesn't work in the children function.

React string refs won't work:

<Motion style={...}>{currentValue => <div ref="stuff" />}</Motion>

This is how React works. Here's the callback ref solution.

Comments
  • Implement a basic animation loop.

    Implement a basic animation loop.

    I have adapted this from a project I started working on a few days ago.

    The animation loop has the following features:

    • Decoupled stepping from rendering so that stepping can be done using a constant time step which is very important in any numerical integration.
    • API that allows passing in pure functions.
    • Pauses when browser tab is not visible (more accurately when the ticker is called too infrequently).
    • Stops automatically when there are no more animations to run.
    • Supports rendering with interpolation.

    I would really appreciate some feedback to make sure we take this in the right direction.

    API

    import createAnimationLoop from './src/animationLoop';
    
    const animationLoop = createAnimationLoop({
      // Fixed time step in seconds.
      timeStep: 1/60,
    
      // Slow-mo anyone? Give 0.1 a try.
      timeScale: 1,
    
      // Pause if we have more than this many steps worth of accumulated time.
      maxSteps: 10,
    
      // Function that gives the current (relative or absolute) time.
      getTime: performance.now.bind(performance),
    
      // Function that calls our loop when a frame can be rendered.
      ticker: window.requestAnimationFrame.bind(window)
    });
    
    const stepFn = (timeStep, state) => {
      // compute next state
    };
    
    const renderFn = (alpha, nextState, prevState) => {
      // render interpolated state
    };
    
    // Register a simulation/animation.
    const unsubscribe = animationLoop.subscribe(stepFn, renderFn, initialState);
    
    // Start the loop. Noop if the loop is running.
    animationLoop.start();
    
    // Whenever we decide that our animation has finished,
    // for example when the speed is 0.
    // The loop stops automatically if there are no other running animations.
    unsubscribe();
    

    Explanation

    This library is basically a very simplified physics simulation engine for React. Because of this we can learn from what others have done in the gaming industry.

    I have done quite a bit of reading on the subject and looked under the hood of a number of game engines before writing this animation loop. Here are some good articles on the subject.

    So what is the animation loop? The animation loop is the heartbeat of our engine and is responsible for calling the function that updates our physic simulation whenever a frame can be rendered. One update cycle is called a step and in the case of browsers requestAnimationFrame dictates when a frame can be rendered.

    At any given step, a physics simulation, just like this library, uses numerical integrations to compute the state of the “world” from the previous step’s state. As such, this state is only an approximation of how a similar system would behave in the real world.

    In order to ensure the stability of the system and to have accurate integrations it is important to do the stepping in fixed time increments or fixed time step. The problem with requestAnimationFrame is that it gets called at irregular (many times dramatic) intervals.

    Step

    In order to solve this problem stepping needs to be decoupled from rendering. The way this works is whenever rAF is called we accumulate time. When enough time is accumulated we advance our simulation. If for example at any point in time we have accumulated 35ms and our chosen time step is 16.6ms then the system will advance by 2 steps in one frame.

    Render

    When it’s time to render, we inevitably run into an awkward situation where our world stays the same for 2 frames in a row when not enough time accumulates to make a step. Many times this is followed by a frame in which two steps are made. This leads to an irritating jitter when rendered. The solution is straightforward though. Knowing the current and previous state as well as the unused accumulated time, we can interpolate all values resulting in buttery smooth animations.

    Time Step

    The time step has a direct impact on the progression of the simulation. The lower the time step, the more accurate and stable the simulation gets. The higher the time step, the more brittle it becomes. In my experience the system becomes very unstable at any time step above 1/20 seconds or 0.05 ms with objects flying everywhere and does not noticeably improve accuracy for time steps below 1/120 seconds or 0.008 ms. Remember changing the time step does not mean a change in the rendered FPS. It just means the simulation does more or less steps per frame. What it does mean however, is that it impacts performance. A higher time step means more performance at the expense of stability and accuracy. I think a safe bet is a time step of 1/60.

    opened by iclanzan 39
  • New name!

    New name!

    React-animation is taken on npm. Let's find a better name for it.

    Current suggestions:

    • React-Spring (not sure, we might add Decay component later)
    • React-Motion
    • React-Move
    • Reanimation
    • React-Tween
    opened by chenglou 33
  • Tell when animation is finished

    Tell when animation is finished

    Sort of related to #100

    It is OK now to check current value if you are using default spring preset. But if I am using something like wobbly and animate height, I can easily get zero height while animation is far from being finished (then it goes to negative height, but that is a different story).

    So if I think that my animation is done when height equals 0 and want to unmount element, that is not actually true and on next RAF component is shown again but with a very little height. And again and again.

    animation-end

    I am pretty sure we had this discussion somewhere else, but could not find a separate issue for this.

    I would like to see API in this way:

    <Motion>
      {(style, {isFinished}) => console.log(isFinished)}
    </Motion>
    

    Passing another object to render function will not break current API, and will potentially allow us to pass more fields, not only isFinished but exposing some RM internal state (maybe related to #219)

    enhancement 
    opened by nkbt 26
  • Add Motion.@onRest

    Add Motion.@onRest

    I don't intend for this to land until after I've used it and made sure we're solving the right problem, but I'm opening this now so @chenglou can play with it (and maybe add Flow if there are places I've missed).

    See also #235.

    opened by appsforartists 20
  • New Spring API draft

    New Spring API draft

    This only concerns animating a single spring for now. I need to prototype a bit more on the springs with dependencies (e.g. chat heads, where the destination of the second head is the current position of the first head) and TransitionSpring, but I think this new Spring is cool enough to stay even if the other solutions don't work out. (props names are temporary. Not important right now)

    <Spring to={{top: 10, left: 20}}>Hi</Spring> That's your new basic spring. It renders to a div and transfers all the props. to is constrained to recognized CSS attributes (will provide injectable defaults for different platforms). Will intelligently not interpolate non-interpolable/unrecognized attributes. A few major advantages:

    • Does manual DOM manipulation under the hood and skips React's render (a-la Animated). Better perf and since this spring's a very common use-case, lots of potential perf boost here. Heck, screw all of this, let's just use Velocity.js or something under the hood =).
    • Can interpolate from height: auto; by reaching into the DOM to set an initial value. #62
    • Color interpolation (color, backgroundColor) comes for free without needing to expose a helper. Same for interpolating "10%" strings. #85
    • Spring precision/error margin are implicitly configured; e.g. left will be rounded to integer and when the spring wobbling distance is around 1 px we'll stop right away because there's no point to keep going. #100.
    • Interpolating many springs: none of our business anymore. map through some random arrays and return your Spring with the desired configuration each time. This is not true for dependent springs. I'm still thinking of a clean API for that.
    • No more vendor prefix, e.g. if you provide transition, we'll add WebkitTransition for you under the hood.

    To configure the spring stiffness and damping: <Spring to={{top: config(10, 120, 17), left: 20}}>Hi</Spring> 120 being stiffness and 17 being damping. Function params format subject to change depending on what's concise and clear. If every attribute has the same config, we could accept a config prop on the spring itself for convenience. What the return value of config(10, 120, 17) is doesn't matter. You don't really read into the anyway. This also kills the special config: [] to signal that you want to jump to the final value straight away. We could provide a clearer stop(destValue) instead. Again, name and signature subject to change.

    An initial prop is exposed (equivalent of defaultValue right now).

    As you can see, it's not that much of a departure from the current basic Spring API: you were probably already using something similar. I'm having a bit of trouble figuring out how the perf that comes from skipping render will cooperate with dependent springs or TransitionSpring (seems like with a child-function you kind of have to re-render the wrapper every time), brainstorming welcome.

    opened by chenglou 18
  • Adding a child to another component during an animation throws error

    Adding a child to another component during an animation throws error

    I have the following (simplified) structure:

        <DumbWrapperComponent>
          <Messages/>  (listens to MesagesStore)
          <OtherUI/>     (listens to UIStore)
        </DumbWrapperComponent>
    

    Messages and OtherUI have two distinct stores they're listening to, so they (should) render independently of each other. OtherUI has some draggable elements using ReactMotion for smooth animation and an 'Add Message' button which adds a message to Messages using Flux pattern. It all works fine except for a case when you click the 'Add Message' button quickly after dragging something so the animation is still running. I get "Error: Invariant Violation: Expected flush transaction's stored dirty-components length (1) to match dirty-components array length (2)"

    I'm going to check it more thoroughly in a second and update/close if I find the solution but I thought I'd ask just as a sanity check - is this an expected and known behavior/limitation of React Motion?

    I'm still using v0.2.7 if that matters.

    opened by koko236 17
  • Name of animation end callback

    Name of animation end callback

    Context: implementing/implemented callback for when a component finishes transitioning. We're not sure yet whether the callback will be applied on the whole component, on the a single style object, or per style value (current implantation for Motion is on the whole component/style object (same thing for Motion since a Motion component has a single style obj), so keep that in mind if you want a future-proof name for this (or not. Maybe it's better to have a specific name for our current implementation, and a different one for a different, e.g. per-value callback).

    Potential names:

    • onEnd
    • onRest
    • onDone
    • onStop
    • onFinish
    • ???

    Go ahead!

    opened by chenglou 16
  • Testing base, ES6 coverage report

    Testing base, ES6 coverage report

    As part of #13. Independent from the code itself. Only had to fix same syntax issue in Spring, since parser crashed on that one.

    When lib files are moved, these configs should be updated accordingly, but for the moment everything works fine.

    opened by nkbt 15
  • Restructure API docs to use better type signatures

    Restructure API docs to use better type signatures

    I was having a great deal of trouble understanding the API, so I've attempted to make the type signatures much clearer in the docs. I may have got some things wrong though. I originally stuck to the Haskell-esque syntax for the type signatures, but opted to switch to TypeScript syntax because it allows you to annotate the function parameters. I hope this helps!

    Rendered

    opened by brendanzab 13
  • Traditional curve/duration animation

    Traditional curve/duration animation

    Hi Chenglou,

    Here are my thoughts after integrating the Spring API yesterday:

    • Users of my components will have trouble understanding stiffness/damping compared to the slightly more intuitive and common curve/duration.
    • In some instances the Spring animation doesn't return to a stable state.
    • Would be great to see some predefined constants like you get with most curve animation libraries (e.g. stiff_spring, wobbly_spring).

    I love the API design but would really like to have the choice to use a Tween object. I know it's got issues like you mentioned in the React-Europe talk but I don't think it would hurt to provide a traditional approach to animation as well.

    let Demo = React.createClass({
      getInitialState() {
        return {open: false};
      },
    
      handleMouseDown() {
        this.setState({open: !this.state.open});
      },
    
      render() {
        return (
          <div>
            <button onMouseDown={this.handleMouseDown}>Toggle</button>
            <Tween endValue={{val: this.state.open ? 400 : 0, config: [EasingTypes.easeInOutQuad, 2]}}>
              {interpolated =>
                <div className="demo0-block" style={{
                  transform: `translate3d(${interpolated.val}px, 0, 0)`,
                }} />
              }
            </Tween>
          </div>
        );
      }
    });
    
    opened by twobit 13
  • Theoretical: Timeline Rewind/Replay Implementation

    Theoretical: Timeline Rewind/Replay Implementation

    I think the best way to move animation forward in react is to make it dead simple to experiment with the animation on a set of potentially multipage actions.

    For example, let's say I have an admin panel, I have a certain flow to getting from listing to a form and then performing an action and I want to set some nice animations for doing all that, ideally by setting a crude version then experimenting by recording and replaying back.

    This can potentially benefit more then just the developer.

    For simplicity sake, lets assuming we have the following, as their not that hard (probably) and some technologies related to them are still surfacing as we speak or in their growing stages (eg. baobab v2).

    • a single application state tree like structure (eg. baobab) that holds all the data in the application
    • we save animation configuration exclusively in the tree structure and its inteded to be constant for the lifecycle of the application (except when we're intentionally editing in development)
    • we have a timeline system that can save all changes made to said structure from one predefined start point to a predefined end point
    • we have a simple interface for viewing and editing nodes in the tree (ie. for our purposes mainly animation configuration nodes)
    • we can reset the entire state with out any page reload and we can also save to localStorage and reload

    Problems & Questions

    How could we go about saving animation state to said structure? (with out key paths everywhere) How can we go about triggering animation state from said structure? How can we go about storing animation configuration in the state structure? How can we go about reading in a human understandable format the configuration from the tree? How can we go about resetting everything? (ie. stop/replay) How do we handle animation that's applied to many items? (ie. shared components that appear in multiple areas)

    opened by srcspider 13
  • Add support for prefers-reduced-motion

    Add support for prefers-reduced-motion

    Please add support for prefers-reduced-motion. If a site visitor's browser indicates that they are bothered by animation, as evidenced by them having set prefers-reduced-motion to reduce, then don't serve them animation; jump immediately to the end state without animation.

    opened by ChasBelov 0
  • Listing an array of authors in package.json breaks some tools that parse it

    Listing an array of authors in package.json breaks some tools that parse it

    Hi! While upgrading some dependencies in our project, I noticed an issue with the metadata for this package that caused our build process to crash after the upgrade.

    Specifically, according to the npm documentation the author field in package.json should designate a single person and be either a JSON object or a string. This package currently has "author": ["nkbt", "chenglou"], which violates the spec and crashes some tools that try to parse it according to the spec (such as https://github.com/pivotal/LicenseFinder). While such tools should probably be made more robust, the current package.json for this project is (AFAICT) still invalid.

    Probably the simplest fix would be to change the key from "author" to "contributors", which has the same semantics but allows multiple values. It could also be a good idea to validate the package.json against https://www.npmjs.com/package/package.json-schema.

    opened by ikaronen-relex 0
  • Bump express from 4.16.3 to 4.18.2

    Bump express from 4.16.3 to 4.18.2

    Bumps express from 4.16.3 to 4.18.2.

    Release notes

    Sourced from express's releases.

    4.18.2

    4.18.1

    • Fix hanging on large stack of sync routes

    4.18.0

    ... (truncated)

    Changelog

    Sourced from express's changelog.

    4.18.2 / 2022-10-08

    4.18.1 / 2022-04-29

    • Fix hanging on large stack of sync routes

    4.18.0 / 2022-04-25

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump qs from 6.2.3 to 6.2.4

    Bump qs from 6.2.3 to 6.2.4

    Bumps qs from 6.2.3 to 6.2.4.

    Changelog

    Sourced from qs's changelog.

    6.2.4

    • [Fix] parse: ignore __proto__ keys (#428)
    • [Fix] utils.merge: avoid a crash with a null target and an array source
    • [Fix] utils.merge: avoid a crash with a null target and a truthy non-array source
    • [Fix] utils: merge: fix crash when source is a truthy primitive & no options are provided
    • [Fix] when parseArrays is false, properly handle keys ending in []
    • [Robustness] stringify: avoid relying on a global undefined (#427)
    • [Refactor] use cached Array.isArray
    • [Docs] Clarify the need for "arrayLimit" option
    • [meta] fix README.md (#399)
    • [meta] Clean up license text so it’s properly detected as BSD-3-Clause
    • [meta] add FUNDING.yml
    • [actions] backport actions from main
    • [Tests] use safer-buffer instead of Buffer constructor
    • [Tests] remove nonexistent tape option
    • [Dev Deps] backport from main
    Commits
    • 90d9f2b v6.2.4
    • ba24e74 [Fix] parse: ignore __proto__ keys (#428)
    • f047c9d [Dev Deps] backport from main
    • 5f8e28b [actions] backport actions from main
    • 2c38654 [Robustness] stringify: avoid relying on a global undefined (#427)
    • 37e176d [meta] fix README.md (#399)
    • 081a3ab [Tests] use safer-buffer instead of Buffer constructor
    • 943e411 [meta] Clean up license text so it’s properly detected as BSD-3-Clause
    • 0d82916 [Fix] utils.merge: avoid a crash with a null target and an array source
    • c103b90 [Fix] utils.merge`: avoid a crash with a null target and a truthy non-array...
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump decode-uri-component from 0.2.0 to 0.2.2

    Bump decode-uri-component from 0.2.0 to 0.2.2

    Bumps decode-uri-component from 0.2.0 to 0.2.2.

    Release notes

    Sourced from decode-uri-component's releases.

    v0.2.2

    • Prevent overwriting previously decoded tokens 980e0bf

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.1...v0.2.2

    v0.2.1

    • Switch to GitHub workflows 76abc93
    • Fix issue where decode throws - fixes #6 746ca5d
    • Update license (#1) 486d7e2
    • Tidelift tasks a650457
    • Meta tweaks 66e1c28

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.1

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump loader-utils from 1.1.0 to 1.4.2

    Bump loader-utils from 1.1.0 to 1.4.2

    Bumps loader-utils from 1.1.0 to 1.4.2.

    Release notes

    Sourced from loader-utils's releases.

    v1.4.2

    1.4.2 (2022-11-11)

    Bug Fixes

    v1.4.1

    1.4.1 (2022-11-07)

    Bug Fixes

    v1.4.0

    1.4.0 (2020-02-19)

    Features

    • the resourceQuery is passed to the interpolateName method (#163) (cd0e428)

    v1.3.0

    1.3.0 (2020-02-19)

    Features

    • support the [query] template for the interpolatedName method (#162) (469eeba)

    v1.2.3

    1.2.3 (2018-12-27)

    Bug Fixes

    • interpolateName: don't interpolated hashType without hash or contenthash (#140) (3528fd9)

    v1.2.2

    1.2.2 (2018-12-27)

    Bug Fixes

    ... (truncated)

    Changelog

    Sourced from loader-utils's changelog.

    1.4.2 (2022-11-11)

    Bug Fixes

    1.4.1 (2022-11-07)

    Bug Fixes

    1.4.0 (2020-02-19)

    Features

    • the resourceQuery is passed to the interpolateName method (#163) (cd0e428)

    1.3.0 (2020-02-19)

    Features

    • support the [query] template for the interpolatedName method (#162) (469eeba)

    1.2.3 (2018-12-27)

    Bug Fixes

    • interpolateName: don't interpolated hashType without hash or contenthash (#140) (3528fd9)

    1.2.2 (2018-12-27)

    Bug Fixes

    ... (truncated)

    Commits
    Maintainer changes

    This version was pushed to npm by evilebottnawi, a new releaser for loader-utils since your current version.


    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
Releases(v0.5.2)
  • v0.5.2(Oct 2, 2017)

  • v0.5.1(Aug 28, 2017)

  • v0.5.0(Apr 26, 2017)

    Breaking

    • Dropping support for older React. Currently supported versions are ^0.14.9 || ^15.3.0

    Changes

    • Upgraded all React components to use ES6 classes
    • Replace React.PropTypes with prop-types package

    PRs:

    • #463 @MichaelDeBoey Use 'react-dom/test-utils' package instead of 'react-addons-test-utils'
    • #462 @MichaelDeBoey Update deprecated 'create-react-class' dependencies in tests to ES6 classes
    • #460 @nkbt Split tests in Travis and use Node 6
    • #458 @MichaelDeBoey Update peerDependencies to be compatible with 'prop-types' package
    • #457 @ifndefdeadmau5 Use ES6 classes in ‘Motion.js’
    • #455 @Holi0317 Use ES6 class style for creating react components
    Source code(tar.gz)
    Source code(zip)
  • v0.4.8(Apr 18, 2017)

    • externalize stripStyle #452 by @bearcott
    • Migrated deprecated React.PropTypes and React.createClass #446 by @Andarist
    • Fix link to TypeScript types #443 by @pshrmn
    • Refactored demo and fixed flow check errors #435 by @therewillbecode
    • Fix broken link #430 by @codler
    • Unmounted component setState fix #420 by @alleycat-at-git
    Source code(tar.gz)
    Source code(zip)
Owner
Cheng Lou
https://rescript-lang.org https://reactjs.com
Cheng Lou
A Spring Boot - React Petshop Application

zuri-petshop A Spring Boot-React-React Native Petshop Application Installation In order to install the development environment, please follow below st

Ali Turgut Bozkurt 21 Jun 19, 2022
Smart Shop免费开源商城系统-spring cloud框架

注:该代码为1.0版本 以下介绍为v1.5部分 前言 交流群 技术微信 启山智软社区团购是一款系统稳定且经过线上反复论证并拥有大量真实用户使用的Java社区团购系统。 基于市场的反馈和变化,我们在不断开发完善社区团购的基础上,还抽离了一套属于我们自己的智慧门店物流配送系统,来帮助线下门店针对货物进行

null 356 Nov 9, 2022
NextJs + Spring Boot + MySQL

iMusic Website View Demo Description This is a website to liste to music online build with backend Spring Boot, database MySQL, and frontend Nextjs. P

 Phạm Dung Bắc 15 Nov 20, 2022
Vanilla JS spring-interpolated values

Vanilla JS spring-interpolated values

Martin Wecke 4 Feb 28, 2022
Open source, production-ready animation and gesture library for React

An open source and production-ready motion library for React on the web. Framer Motion is an open source, production-ready library that's designed for

Framer 17.2k Jan 9, 2023
A React-Fullstack platform helps to track & compare your Incomes & Expenses transactions in one place via detailed Graphical information to manage your Budget.

Budget Master Track your income and expenses in one place via detailed graphical information to manage your budget. Manage your budget and transaction

Siddharth Singh Bhadoriya 9 Nov 27, 2022
Open Source Website where you can manage your information and artworks of your fursona(s)

MyFursona About this project MyFursona is an open source project where users can manage their artworks, info (such as biography and interests), and lo

MyFursona 23 Jan 7, 2023
Material-UI is a simple and customizable component library to build faster, beautiful, and more accessible React applications. Follow your own design system, or start with Material Design.

Material-UI Quickly build beautiful React apps. Material-UI is a simple and customizable component library to build faster, beautiful, and more access

Material-UI 83.6k Dec 30, 2022
✍ It has never been so easy to document your things!

Docz makes it easy to write and publish beautiful interactive documentation for your code. Create MDX files showcasing your code and Docz turns them i

Docz 23.1k Jan 9, 2023
⚡️ Simple, Modular & Accessible UI Components for your React Applications

Build Accessible React Apps with Speed ⚡️ Chakra UI provides a set of accessible, reusable, and composable React components that make it super easy to

Chakra UI 30.5k Jan 4, 2023
You can use this CLI Tool to clean your iOS and Android projects and keep them updated.

Mobile App Cleaner You can use this CLI Tool to clean your iOS and Android projects and keep them updated. This tool automatizes these items below; Cl

automizer 21 Mar 19, 2022
A simple tool that tells you what food is safe for your dog.

Can My Dog Eat A simple tool that tells you what food is safe for your dog. View website Features Can My Dog Eat is a simple website where you can loo

Isabelle Viktoria Maciohsek 25 Dec 11, 2022
✨ Plan your future with Mandal-art ✨

✨ Plan your future with Mandal-art ✨ ?? Make my own Mandal-art Mandal-art is a word that combines'Manda+la' and'Art', which means'achieving the goal',

Min Kyung Kang 35 Nov 9, 2022
Very simple app to decode your Vaccination Proof QR Code (such as the one provided by government of Quebec) - Compatible with SHC (Smart Health Card standard)

shc-covid19-decoder Visit simple hosted version on your phone (does NOT transmit any data, all remains in your browser) https://fproulx.github.io/shc-

François Proulx 148 Sep 23, 2022
Get updates in Telegram when a vaccination center available in your pin code. We can win Covid 🤝

Cowin Bot Get updates in Telegram when an vaccination center available in your pin code. We can win Covid ?? Commands: /start - Start the Bot /help -

Tuhin Kanti Pal 14 Oct 3, 2022
Organize your life by planning the activities you do on a daily basis.

Task Tracker made using only React. This application is designed to better organize your life by planning the activities you do every day. Don't be la

Gabriel Dimitrievski 100 Oct 10, 2022
Check Your Nearest Vaccination Center And Slots Availability using pincode and district name.

Vaccine Tracker Application - Pan India ?? Website • Playstore made with ♥ for the people of India DevIncept is an 30 day open source program helping

sameer srivastava 67 Nov 3, 2022
A Facebook Clone which built with reactJS. You can sign in with your Google Account and send realtime posts.

Facebook Clone with ReactJS A Facebook Clone application that you can sign in with your Google Account and send realtime posts. Facebook Clone Demo Li

Mert Çankaya 23 Nov 25, 2022
A graphical frontend for exploring your org-roam Zettelkasten

org-roam-ui: an org-roam frontend Org-Roam-UI is a frontend for exploring and interacting with your org-roam notes. Org-Roam-UI is meant a successor o

Org-roam 1.5k Jan 4, 2023