Giter Site home page Giter Site logo

airbnb / react-with-direction Goto Github PK

View Code? Open in Web Editor NEW
192.0 26.0 30.0 49 KB

Components to provide and consume RTL or LTR direction in React

License: MIT License

JavaScript 100.00%
react ltr rtl directionality provider hoc higher-order-component right-to-left left-to-right

react-with-direction's Introduction

react-with-direction Version Badge

Build Status dependency status dev dependency status License Downloads

npm badge

Components to support both right-to-left (RTL) and left-to-right (LTR) layouts in React.

Supporting RTL or switching between different directions can be tricky. Most browsers have built-in support for displaying markup like paragraphs, lists, and tables. But what about interactive or complex custom UI components? In a right-to-left layout, a photo carousel should advance in the opposite direction, and the primary tab in a navigation control should the rightmost, for example.

This package provides components to simplify that effort.

withDirection

Use withDirection when your component needs to change based on the layout direction. withDirection is an HOC that consumes the direction from React context and passes it as a direction prop to the wrapped component. The wrapped component can then pivot its logic to accommodate each direction.

Usage example:

import withDirection, { withDirectionPropTypes, DIRECTIONS } from 'react-with-direction';

function ForwardsLabel({ direction }) {
  return (
    <div>
      Forwards
      {direction === DIRECTIONS.LTR && <img src="arrow-right.png" />}
      {direction === DIRECTIONS.RTL && <img src="arrow-left.png" />}
    </div>
  );
}
ForwardsLabel.propTypes = {
  ...withDirectionPropTypes,
};

export default withDirection(ForwardsLabel);

DirectionProvider

Use DirectionProvider at the top of your app to set the direction context, which can then be consumed by components using withDirection.

You should set the direction prop based on the language of the content being rendered; for example, DIRECTIONS.RTL (right-to-left) for Arabic or Hebrew, or DIRECTIONS.LTR (left-to-right) for English or most other languages.

DirectionProvider components can also be nested, so that the direction can be overridden for certain branches of the React tree.

DirectionProvider will render its children inside of a <div> element with a dir attribute set to match the direction prop, for example: <div dir="rtl">. This maintains consistency when being rendered in a browser. To render inside of a <span> instead of a div, set the inline prop to true.

Usage example:

import DirectionProvider, { DIRECTIONS } from 'react-with-direction/dist/DirectionProvider';
<DirectionProvider direction={DIRECTIONS.RTL}>
  <div>
    <ForwardsLabel />
  </div>
</DirectionProvider>

To set the lang attribute on the wrapping element, provide the lang prop to DirectionProvider.

Usage example:

import DirectionProvider, { DIRECTIONS } from 'react-with-direction/dist/DirectionProvider';

<DirectionProvider direction={DIRECTIONS.RTL} lang="ar">
  <div>
    <ForwardsLabel />
  </div>
</DirectionProvider>

Note that lang and direction are independent โ€“ lang only sets the attribute on the wrapping element.

AutoDirectionProvider

Use AutoDirectionProvider around, for example, user-generated content where the text direction is unknown or may change. This renders a DirectionProvider with the direction prop automatically set based on the text prop provided.

Direction will be determined based on the first strong LTR/RTL character in the text string. Strings with no strong direction (e.g., numbers) will inherit the direction from its nearest DirectionProvider ancestor or default to LTR.

Usage example:

import AutoDirectionProvider from 'react-with-direction/dist/AutoDirectionProvider';
<AutoDirectionProvider text={userGeneratedContent}>
  <ExampleComponent>
    {userGeneratedContent}
  </ExampleComponent>
</AutoDirectionProvider>

AutoDirectionProvider also supports the lang prop in the same way as DirectionProvider does.

react-with-direction's People

Contributors

brucewpaul avatar garrettberg avatar jpnelson avatar lencioni avatar ljharb avatar noratarano avatar yzimet avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

react-with-direction's Issues

error in typescript project

error in typescript project
Could not find a declaration file for module 'react-with-direction/dist/DirectionProvider'. 'D:/next project/gandom-front/node_modules/react-with-direction/dist/DirectionProvider.js' implicitly has an 'any' type.
Try npm i --save-dev @types/react-with-direction if it exists or add a new declaration (.d.ts) file containing declare module 'react-with-direction/dist/DirectionProvider';

Jest tests failing without module mock

Hi,

Jest tests fail on my project created with create-react-app.

One of the errors I get is:

 TypeError: Cannot read property 'propTypes' of undefined

      at withDirection (node_modules/react-with-direction/dist/withDirection.js:131:24)

This is very likely related to the provider (and the fact that tests don't have them). Other tests fail, but don't produce warnings realted to direction (although that is the cause).

For now I've mocked the react-with-direction module:

src/mocks/react-with-direction.js

let reactWithDirection = jest.genMockFromModule('react-with-direction');

reactWithDirection = {
  ...reactWithDirection,
  default: component => component
};

module.exports = reactWithDirection;

This seems to resolve it.

Is there a recommended solution for this?

Thanks!

Impact babel-plugin-transform-replace-object-assign

i getting the following error while importing DateRangePicker lib.

Configuring module specifier with a string is no longer supported. Configure with { "moduleSpecifier": "object.assign" } instead of "object.assign".

ERROR in ./node_modules/react-with-direction/dist/proptypes/brcast.js Module build failed (from ./node_modules/babel-loader/lib/index.js): Error: C:/work/POC/pq-client-develop/node_modules/react-with-direction/dist/proptypes/brcast.js: Configuring module specifier with a string is no longer supported. Configure with { "moduleSpecifier": "object.assign" } instead of "object.assign". at PluginPass.exit (C:\work\POC\pq-client-develop\node_modules\babel-plugin-transform-replace-object-assign\lib\index.js:23:19) at newFn (C:\work\POC\pq-client-develop\node_modules\babel-traverse\lib\visitors.js:276:21) at NodePath._call (C:\work\POC\pq-client-develop\node_modules\babel-traverse\lib\path\context.js:76:18) at NodePath.call (C:\work\POC\pq-client-develop\node_modules\babel-traverse\lib\path\context.js:48:17) at NodePath.visit (C:\work\POC\pq-client-develop\node_modules\babel-traverse\lib\path\context.js:117:8) at TraversalContext.visitQueue (C:\work\POC\pq-client-develop\node_modules\babel-traverse\lib\context.js:150:16) at TraversalContext.visitSingle (C:\work\POC\pq-client-develop\node_modules\babel-traverse\lib\context.js:108:19) at TraversalContext.visit (C:\work\POC\pq-client-develop\node_modules\babel-traverse\lib\context.js:192:19) at Function.traverse.node (C:\work\POC\pq-client-develop\node_modules\babel-traverse\lib\index.js:114:17) at traverse (C:\work\POC\pq-client-develop\node_modules\babel-traverse\lib\index.js:79:12) at File.transform (C:\work\POC\pq-client-develop\node_modules\babel-core\lib\transformation\file\index.js:516:35) at C:\work\POC\pq-client-develop\node_modules\babel-core\lib\transformation\pipeline.js:50:19 at File.wrap (C:\work\POC\pq-client-develop\node_modules\babel-core\lib\transformation\file\index.js:532:16) at Pipeline.transform (C:\work\POC\pq-client-develop\node_modules\babel-core\lib\transformation\pipeline.js:47:17) at transpile (C:\work\POC\pq-client-develop\node_modules\babel-loader\lib\index.js:50:20) at C:\work\POC\pq-client-develop\node_modules\babel-loader\lib\fs-cache.js:118:18 @ ./node_modules/react-with-styles/lib/withStyles.js 50:14-67 @ ./node_modules/react-dates/lib/components/CalendarMonth.js @ ./node_modules/react-dates/lib/index.js @ ./node_modules/react-dates/index.js @ ./src/js/components/CourseInfo/courseInfo.jsx @ ./src/js/components/CourseInfo/index.js @ ./src/js/components/index.js @ ./src/js/index.js @ multi (webpack)-dev-server/client?http://0.0.0.0:9000 ./src/js/index.js

i stuck by this.

Ref: https://github.com/newoga/babel-plugin-transform-replace-object-assign

Add styles for DirectionProvider div or span

Is there a way to add styles for DirectionProvider? because I tried both using style or styled-components and I got errors like

Failed prop type: DirectionProvider: unknown props found: className

React 17

React 17 is around the corner and this package still relies on the unsafe componentWillRecieveProps. I attempted to make a pr to mark it as unsafe but this breaks with pre 16 react versions. Can we move forward and remove support for pre 16 react? If not switching to componentDidUpdate in this PR #14 seems like the logical way forward.

Legacy context usage prints warnings in React StrictMode

I noticed when using rheostat that this project is printing warnings in React StrictMode because it's using the legacy React Context instead of the one released in React 16.3. I understand this library would like to continue supporting React <16.3, but it also prevents using concurrent mode when that is eventually released into stable.

What is the long term strategy for releasing this library? Should there be a new major version/forked library which supports React 16.3+? Is it possible to feature-detect the new Context API and use that if it's available?

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.