Giter Site home page Giter Site logo

react-perfect-scrollbar's Introduction

React-Perfect-Scrollbar Build Status npm npm downloads

This is a wrapper to allow use perfect-scrollbar in React.

To read documentation for versions < 1.0, please visit v0.2.5.

Usage

Install the package npm install react-perfect-scrollbar -S Import the css file if you have loader for css files:

    import 'react-perfect-scrollbar/dist/css/styles.css';

Import the module in the place you want to use:

    import PerfectScrollbar from 'react-perfect-scrollbar'

Wrap you content in this component:

    <PerfectScrollbar>
        ... SCROLLBAR CONTENT HERE ...
    </PerfectScrollbar>

Props

The following props are accepted:

options

The optional parameters used to initialize perfect-scrollbar. For more info, please refer to https://github.com/utatti/perfect-scrollbar#options

This prop previously was called "option", but has since been renamed. If you provide "option" as a prop, it will be used unless "options" is also passed.

containerRef

Return the container ref: (ref) => void; If you want to scroll to somewhere, just update scrollTop/scrollLeft by the ref:

// Suppose you have save the containerRef to this._scrollRef
// change scroll top
this._scrollRef.scrollTop = 0;

// change scroll left
this._scrollRef.scrollLeft = 0;

component

The container component type. Default to "div". Only string is allowed.

className

The className added to container.

style

The style added to container.

onScrollY

Invoked when the y-axis is scrolled in either direction.

onScrollX

Invoked when the x-axis is scrolled in either direction.

onScrollUp

Invoked when scrolling upwards.

onScrollDown

Invoked when scrolling downwards.

onScrollLeft

Invoked when scrolling to the left.

onScrollRight

Invoked when scrolling to the right.

onYReachStart

Invoked when scrolling reaches the start of the y-axis.

onYReachEnd

Invoked when scrolling reaches the end of the y-axis (useful for infinite scroll).

onXReachStart

Invoked when scrolling reaches the start of the x-axis.

onXReachEnd

Invoked when scrolling reaches the end of the x-axis.

All the callback 'onXXXX' can accept a parameter: the ref to the scrollbar container. You can get the current scrollTop and scrollLeft from it:

    <PerfectScrollbar
        onScrollY={container => console.log(`scrolled to: ${container.scrollTop}.`)}>
        ... SCROLLBAR CONTENT HERE ...
    </PerfectScrollbar>

onSync

Invoked when PerfectScrollbar comp needs to sync the scrollbar container by invoking ps.update()(Basically, it is invoked in CDU lifecycle) and receive the internal perfect-scroll instance ps as parameter.

It is useful when you want to customize the sync logic in some scenarios, eg: debounce the invocation of ps.update().

For more detail, please refer to issue#87 and the example directory.

React.HTMLAttributes

Any attributes defined in React.HTMLAttributes can be used for the component.

Methods

The following method can be called by the component ref:

updateScroll

Update the scrollbar(e.g. recalculate the size) manually. In the following case, the scrollbar will not update automatically, which cause the scrollbar size incorrect.

class Container extends Component {
  ...
  render() {
    return (
      <ScrollBar>
        ...
       <ChildComponent />
        ...
      </ScrollBar>
    );
  }
}

class ChildComponent extends Component {
  handleClick = () => {
    this.setState({
      show: !this.state.show,
    });
  }

  render () {
    return (
      <div>
        <button onClick={this.handleClick} />
        { this.state.show ? <div /> }
      </div>
    )
  }
}

You need to call updateScroll to get the correct scrollbar size:

class Container extends Component {
  ...
  render() {
    return (
      <ScrollBar
        ref = {(ref) => { this._scrollBarRef = ref; }}
      >
        ...
       <ChildComponent
        onUpdateSize = {() => { this._scrollBarRef.updateScroll(); }}
       />
        ...
      </ScrollBar>
    );
  }
}

class ChildComponent extends Component {
  handleClick = () => {
    this.setState({
      show: !this.state.show,
    }, () => this.props.onUpdateSize());
  }

  render () {
    return (
      <div>
        <button onClick={this.handleClick} />
        { this.state.show ? <div /> }
      </div>
    )
  }
}

Example

A working example can be found in the example directory. Please run npm run example in browser. (Must run npm run build for the first time)

License

MIT

react-perfect-scrollbar's People

Contributors

4lejandrito avatar centrual avatar dr15 avatar elvinra avatar g-rath avatar ggwzrd avatar goldenyz avatar haoliangwu avatar jeremyvinec avatar marcellobarile avatar marcelometal avatar patresi avatar patrykkopycinski avatar phil-dileo avatar sugarshin avatar yangzhou01 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

react-perfect-scrollbar's Issues

"ReferenceError: getComputedStyle is not defined" after upgrading to 1.0.0

If I upgrade to 1.0.0 and run my component tests, I get this stack trace:

ReferenceError: getComputedStyle is not defined
    at get (...\node_modules\perfect-scrollbar\dist\perfect-scrollbar.common.js:9:3)
    at new PerfectScrollbar (...\node_modules\perfect-scrollbar\dist\perfect-scrollbar.common.js:1131:16)
    at ScrollBar.componentDidMount (...\node_modules\react-perfect-scrollbar\lib\scrollbar.js:63:24)
    at commitLifeCycles (...\node_modules\react-dom\cjs\react-dom.development.js:8770:24)
    at commitAllLifeCycles (...\node_modules\react-dom\cjs\react-dom.development.js:9946:9)
    at Object.invokeGuardedCallback (...\node_modules\react-dom\cjs\react-dom.development.js:491:10)
    at invokeGuardedCallback (...\node_modules\react-dom\cjs\react-dom.development.js:438:27)
    at commitRoot (...\node_modules\react-dom\cjs\react-dom.development.js:10050:9)
    at performWorkOnRoot (...\node_modules\react-dom\cjs\react-dom.development.js:11017:42)
    at performWork (...\node_modules\react-dom\cjs\react-dom.development.js:10967:7)
    at requestWork (...\node_modules\react-dom\cjs\react-dom.development.js:10878:7)
    at scheduleWorkImpl (...\node_modules\react-dom\cjs\react-dom.development.js:10732:11)
    at scheduleWork (...\node_modules\react-dom\cjs\react-dom.development.js:10689:12)
    at scheduleTopLevelUpdate (...\node_modules\react-dom\cjs\react-dom.development.js:11193:5)
    at Object.updateContainer (...\node_modules\react-dom\cjs\react-dom.development.js:11231:7)
    at ...\node_modules\react-dom\cjs\react-dom.development.js:15226:19
    at Object.unbatchedUpdates (...\node_modules\react-dom\cjs\react-dom.development.js:11102:12)
    at renderSubtreeIntoContainer (...\node_modules\react-dom\cjs\react-dom.development.js:15225:17)
    at Object.render (...\node_modules\react-dom\cjs\react-dom.development.js:15290:12)
    at Object.render (...\node_modules\enzyme-adapter-react-16\build\ReactSixteenAdapter.js:218:50)
    at new ReactWrapper (...\node_modules\enzyme\build\ReactWrapper.js:98:16)
    at mount (...\node_modules\enzyme\build\mount.js:19:10)
    at Suite.<anonymous> (C:/Users/Kyle Getz/Work/event-viewer/src/components/DataGrid/__test__/index.spec.js:88:19)
    at Object.create (...\node_modules\mocha\lib\interfaces\common.js:112:19)
    at context.describe.context.context (...\node_modules\mocha\lib\interfaces\bdd.js:44:27)
    at Object.<anonymous> (C:/Users/Kyle Getz/Work/event-viewer/src/components/DataGrid/__test__/index.spec.js:16:1)
    at Module._compile (module.js:635:30)
    at loader (...\node_modules\babel-register\lib\node.js:144:5)
    at Object.require.extensions.(anonymous function) [as .js] (...\node_modules\babel-register\lib\node.js:154:7)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at Module.require (module.js:579:17)
    at require (internal/module.js:11:18)
    at ...\node_modules\mocha\lib\mocha.js:231:27
    at Array.forEach (<anonymous>)
    at Mocha.loadFiles (...\node_modules\mocha\lib\mocha.js:228:14)
    at Mocha.run (...\node_modules\mocha\lib\mocha.js:536:10)
    at Object.<anonymous> (...\node_modules\mocha\bin\_mocha:582:18)
    at Module._compile (module.js:635:30)
    at Object.Module._extensions..js (module.js:646:10)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at Function.Module.runMain (module.js:676:10)
    at startup (bootstrap_node.js:187:16)
    at bootstrap_node.js:608:3

Scroll Event not detected

The components wrapped inside the <ReactPerfectScrollbar ></ReactPerfectScrollbar> do not always detect scroll events on wheel, keyboard, trackpad triggers.Hence scroll gets stuck mid page for no reason and releases itself again for no reason.

However, it does behave as expected if the mouse pointer is scrolled by placing on the scroll-rail or manually scrolled using pointer.

Sample- This is routing panel which renders suitable view according to the route:

App.js


import ReactPerfectScrollbar from "react-perfect-scrollbar";
import 'react-perfect-scrollbar/dist/css/styles.css';

class App extends Component {
  render() {

return <div className="wrapper">
                <Sidebar {...this.props} />
                
                    <div
                    className={ navigator.platform.indexOf("Win") > -1 ? "main-panel ps" : "main-panel" }
                    ref="mainPanel"
                    >
                    <ReactPerfectScrollbar onScrollY={(container) => console.log("Just scrolled vertically on : ",  container) }>
                        <Header {...this.props} />
                        <div className="main-content">
                        <Switch>
                            <Route exact path="/" render={props => (this.props.sessionActive ? 
                               <AppErrorBoundary>
                                    <Home {...props} />
                                </AppErrorBoundary> : this.props.forcereset ? <Home {...props} /> : 
                                            <Redirect to='/auth/login' />)} />
                            <Route path="/user-agreement" component={UserAgreement} />
                            <Route path="/not-authorized" component={NotAuthorized} />
                            <Route path="*" component={PageNotFound} />
                        </Switch>
                        </div>
                        <Footer fluid />
                    </ReactPerfectScrollbar>
                </div>
                
        </div>

}
}

The output from console.log statement does not get displayed when its "stuck".
Can you suggest the reason/fix here?

ref.scrolltop not scrolling the component

When I try to use the scrollTop to manually scroll my page to a specific part property it doesn't scroll.

I tried:

this._scrollRef.scrollTop = 500;
// and
this._scrollRef.scrollTop = 500 + "px";

but none of them seem to do the trick.

If I log this.scrollRef it gives me the following output, which does contain the scrollTop:
image

The way I have set up my component is as follows

<ScrollBar ref = {(ref) => { this._scrollBarRef = ref; }}>
     <My-Component/>
</ScrollBar>

Is there something that I'm missing

Max-height works differently than vanilla perfect-scrollbar

Hello and thank you for maintaining this project.

I have two examples to illustrate the issue I'm running into:

In both demos I have four examples:

  1. Container has a height of 15rem with <15rem worth of content. In both there is whitespace below content (this is what I'm ultimately trying to avoid).
  2. Container has a height of 15rem with >15rem worth of content. Both examples work as expected.
  3. Container has a max-height of 15rem with <15rem worth of content. In both the container shrinks to the size of the content (this is the ideal).
  4. Container has a max-height of 15rem with >15rem worth of content. With perfect-scrollbar the result is identical to using height; with react-perfect-scrollbar scrolling is disabled.

Again, thank you for taking the time to look at this. If there are additional details or examples I could provide, please let me know.

.d.ts

Is it possible to get a declaration for typescript?

Is dynamic scroll locking possible?

Let's say I have a bit of code like

<Scrollbar 
    option={{
        suppressScrollY: isLocked ? true : false
    }} 
>
    {content}
</Scrollbar>

It doesn't seem to pick up on the boolean change. If I just pass in an explicit true/false it does seem to lock the scroll.

Input Lag

On a brand new macbook pro, when using the scrollbar on a heavy content site, there is noticeable lag when first scrolling and the response.

containerRef is not working

this._scrollRef.scrollTop = 0;

If the code is readme, it will not work.

this._scrollRef._container.scrollTop = 0;

It works if you replace the code as above.

Reverse from bottom to top

I populate a composant with message.
The first message is set at the bottom of the component. The next message is set to the bottom, the previous is set above.
When MessageContainer is full, I expect the scrollbar, but I don't see it, and cannot scroll.
The normal populating work has expected.

        <div className={classes.Messagecontainer}>
        <PerfectScrollbar
        option={{suppressScrollX: true}}>
        <ul className={classes.message}>
        {listmessages.map((message) =>
        <Message login={JSON.parse(message).login} message={JSON.parse(message).message} />
        )
        }
        </ul>
        </PerfectScrollbar>
        </div>
);
Messagecontainer: {
    position: "relative",
    height: "85%",
    width: "100%",
    [theme.breakpoints.down("sm")]: {
    border: "1px solid black",
    height: "380px",
    marginLeft: "0"
    }
  },

message: {
  position: "absolute",
  bottom: '0'
}```

None of the options work

It seems like none of the options work. Example, suppressScrollY={ true }, onScrollX={ console.log('scrolling x') }

no element is specified to initialize PerfectScrollbar

Hello,

We're using Jest and Enzyme to do unit tests that includes components with react-perfect-scrollbar. When doing a snapshot test, we got this error: "no element is specified to initialize PerfectScrollbar". The code works fine on the website, just only in the unit test snapshot, we get an error. Any ideas on how to fix this? Thanks!

Here's a code snippet:

`import React from 'react';
import renderer from 'react-test-renderer';
import AbstractHistory from '../src/components/Abstract/AbstractHistory';
import configureStore from 'redux-mock-store';

import expect from 'expect';
import { mount } from 'enzyme';

import { initialState } from '../src/redux/initial-state'
import { Modal } from 'reactstrap';
import PerfectScrollbar from 'react-perfect-scrollbar'
import '../../css/perfect-scrollbar.css'

describe('AbstractHistory (Snapshot)', () => {

const mockStore = configureStore()
let store

beforeEach(() => {
    store = mockStore(initialState)
})

it('AbstractHistory snapshot renders', () => {        
    const component = renderer.create(<AbstractHistory store={store} />);
    const json = component.toJSON();
    expect(json).toMatchSnapshot();
});

});`

onYReachEnd function call on initial render

I am using onYReachEnd function for infinite scroll but function calls on initially render so got error of Maximum update depth exceeded.

version 1.5.3

<PerfectScrollbar
ref={ref => {
this._scrollBarRef1 = ref;
}}
onYReachEnd={container => this.loadMoreItems(container)}
options={{ suppressScrollX: true, wheelPropagation: true, }}
>
{data.length > 0 && (
data.map((chat, index) => {
return (
<ChatListItem
key={chat_${index}}
item={chat}
/>
);
})
)}

2019-09-23 18_56_39-Window

how can i scroll to bottom using ref.scrollTop

I have a chat UI inside the scrolling wrapper and scrollbar position is at the top at first.
I'd like to scroll it to the bottom using ref.scrollTop.
how can i get the maximum value of scrollTop?
or Is there any other way to scroll to the bottom?

Scrollbar remains visible until you scroll

"react-perfect-scrollbar": "0.2.0",

I'm using this to implement a tbody that scrolls while the table headers stay put. The problem I'm having is that if the number of rows is large such that overflow is required and then the number of rows decreases, the scrollbar hangs around. Once you scroll the display gets updated to none. Wondering why it doesn't update automatically?

bad behavior when toggling a class

Hello,
There is a bug in the component : when we toggle some classes in className prop, it makes the component not scrollable and scrolled to { top: 0; left: 0 }. I found two hacks to correct :

  1. Change the key prop of the component every time you change a className. Problem: if you have transitions applied to the component, they won't apply. Then the second hack is better
  2. Don't change the styles with className but change with style props, then everything is alright.

I couldn't reproduce the bug in CodePen because I don't know how to add the library to a codepen, but if someone has a clue for me to

wheel Propagation

My understanding is that wheel propagation stops double scrolling on touch devices when set to true. is there a way to implement this on the react version? thanks.

Catch event click thumb

I need to catch the event that fires when the thumb is clicked, only using the onScrollY doesn't work because it fires only when scroll movement is done. I can't find it in the docs so it could not even exist.
I would love to do something like this:

<PerfectScrollbar onThumbEnter={this.OnEnter} onThumbLeave={this.OnLeave} />

Multiple instances not initializing

In one of my React components, I have several sections where I want to use react-perfect-scrollbar and be able to create scrolling individually. One of these sections happens to be in an overlay the user can open and close -- like a collapsable panel.

The problem is that only the first section where I used <PerfectScrollbar> is working properly but the other sections are not scrolling at all.

Does this solution allow only one instance of perfect scrollbar? If I can have multiple instances, is there anything special I need to do to initialize them?

BTW, if I use the regular perfect-scrollbar package, I can have multiple scrollable sections but so far, I can't have more than one if I use this react-perfect-scrollbar package.

Typing not perfect

Hi,

Could you do a minor fix in the index.d.ts file so you don't have implicit any's?

Now:

containerRef?: ((ref) => void);

Prefered:

containerRef?: ((ref: any) => void);

Thanks!

Goes back one webpage

I tried the React component and on horizontal scroll it goes back one web page when trying to scroll left, using a trackpad.

Not scrolling on touch screens in Chrome

On Chrome, scroll is not properly responding to touch on touchscreens. It seems to scroll a tiny bit every time I gesture to scroll up or down but it's not an acceptable behavior.

It seems to work OK in Edge but even there, it's very very jumpy but at least it does scroll.

And it's the same issue on the new Chrome based Edge.

Using a mouse, everything works fine but touch produces a very poor experience.

Rename "option" prop to "options"

The option prop should be options, since its a collection of options.

You can prevent this from being a breaking change with the following:

this._ps = new PerfectScrollbar(this._container, this.props.options || this.props.option);

I'm happy to make a PR for this, if you're happy for this change to take place.

Scrollbar goes crazy

2019-12-18_16-07-18

This happens when the scrollbar is about to be shown , and it's unstopable , what's wrong :(

the perf issue in the scenario that children nodes change frequently

I believe the root cause is due to

this._ps.update();
.

the following is the perf screenshot of my company current project:
image

the business is related to real-time trading, so the children of order book component change frequently and I found this library always call this._ps.update() after its children changed. This will cause the whole page to recalculate style frequently and decrease the FPS.

Is there a better way to solve this? IMHO, the ps.update() is used to sync scroll container when the size or content of scroll container change, but maybe it is a little overwhelming to trigger it in each CDU lifecycle.

is it better to expose prop to indicate the meaning of bypassing this logic when we know our scroll container is fixed or just debounce it?

How can I suppress scroll?

On the original perfect-scroll bar there is an option to suppressScrollY or suppressScrollX. Is there any way to achieve this with react-perfect-scrollbar?

With the trackpad scrolling does not stop at the bottom of the scrollable area it continues infinitely.

I have implemented react-perfect-scrollbar inside of a modal and I am experiencing a bug I have not been able to fix and seems to be a bug with react-perfect-scrollbar.

Expected behavior: When I scroll to the bottom of the content area and all content is in view, the scrolling should stop and I will no longer be able to scroll inside of this area.

Actual behavior: When I scroll to the bottom of the content area and all content is in view, I continue to be able to scroll the content. There seems to be no limit to how far I can scroll it seems to go on infinitely as I watch the content scroll further and further out of view.

If there is anything I can do on my end to resolve this issue please let me know.

Two vertical scrolls

I have 2 blocks, one(small-children) inside second(big-parent), both have 2 vertical scrolls. When small scroll end, big window start scrolling (all this time mouse inside small block). On default scroll it works good: when scrolling stop in small window, big windows doesn't continue scroll.

i try to fix it by using :hover, but it doesn't help.

How do you add "scroll-behavior: smooth;" for cases like scrollTop = 0 ?

I have a big component inside the scrolling wrapper and I have an external trigger for scroll to top. But when it's triggered it scrolls to top in an instant.
I'd like to use the css property "scroll-behavior: smooth;" here so that the transition is smooth.
Please help me on the approach.

Can you expose getContainer() method to return underlying _container ref?

I need the container ref to calculate its boundaries to make my Sticky component working right when initial scrolling offset > 0. Right now I can only receive the container in onScroll handler and to get the container before scrolling is happening, I have to access internal member _container.
Thanks!

position of scrollbar is not correct on production build

I have an issue with scrollbar position. When I run my app on production build, scrollbar is showed at the left of my list. I tried to check the style of ps__rail-y element and found that style of left is 0. But on development mode that work ok. Pls help me to resolve this issue

Making it work?

I'm probably doing something really dumb but I tried to get this to work here

https://codesandbox.io/s/qx185m784q

And no luck. Any ideas?

import React from 'react';
import { render } from 'react-dom';
import PerfectScrollbar from 'react-perfect-scrollbar';
import Hello from './Hello';

import 'perfect-scrollbar/dist/css/perfect-scrollbar.css';

const styles = {
  fontFamily: 'sans-serif',
  textAlign: 'center',
};

const App = () => (
  <div style={styles}>
    <Hello name="CodeSandbox" />
    <div style={{
      border: '1px solid black',
      height: '200px',
      overflow: 'auto',
    }}>
    <PerfectScrollbar>
    <h2>Start editing to see some magic happen {'\u2728'}</h2>
    <h2>Start editing to see some magic happen {'\u2728'}</h2>
    <h2>Start editing to see some magic happen {'\u2728'}</h2>
    <h2>Start editing to see some magic happen {'\u2728'}</h2>
    <h2>Start editing to see some magic happen {'\u2728'}</h2>
    <h2>Start editing to see some magic happen {'\u2728'}</h2>
    <h2>Start editing to see some magic happen {'\u2728'}</h2>
    <h2>Start editing to see some magic happen {'\u2728'}</h2>
    <h2>Start editing to see some magic happen {'\u2728'}</h2>
    <h2>Start editing to see some magic happen {'\u2728'}</h2>
    </PerfectScrollbar>
    </div>
  </div>
);

render(<App />, document.getElementById('root'));

Support for Hooks

I'm trying this library out in one of my projects and trying to make it work with the useRef hook. Is this possible? It looks like the component will only accept a ref callback instead of a RefObject.

CSS: Transparent Rail

I couldn't place the transparent rail unless I applied the style to the overall application styles. Anyway, this way it worked for me.

global-styles
preview

How to use containerRef?

Dear Allen,

Thank you for making this react wrapper for perfect-scrollbar.
I'm trying to use it in my project.
Do you have an example with more details of how to use the containerRef?
I was trying to scroll down in the container area when there is a button clicked.

Thank you very much!
Daniel

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.