Giter Site home page Giter Site logo

asmyshlyaev177 / react-horizontal-scrolling-menu Goto Github PK

View Code? Open in Web Editor NEW
752.0 8.0 97.0 29.91 MB

Horizontal scrolling menu component for React.

Home Page: https://www.npmjs.com/package/react-horizontal-scrolling-menu

License: MIT License

JavaScript 4.83% TypeScript 92.86% CSS 1.21% Shell 0.09% MDX 0.39% HTML 0.62%
react reactjs react-component javascript navigation scroll scrolling gallery popular typescript

react-horizontal-scrolling-menu's Introduction

For hire

React horizontal scrolling menu

example

npm Tests Codacy Badge Codacy Badge Commitizen friendly npm bundle size (minified + gzip) Donate Bitcoin

Check out my new project πŸ‘‰ https://github.com/asmyshlyaev177/state-in-url

Add a ⭐️ and follow me to support the project!

Proud corner

performance-dashboard-on-aws | React status code

Storybook (Faster and more convinient, new examples will be here)

Codesandbox Examples (Deprecated)

Center items

Dynamically add items when last is visible

apiRef - controling component outside

Add item and scroll to it

Loop scroll

Custom transition/animation

Swipe on mobile devices(need to run locally, codesandbox has issues)

Previous version V1

This is a highly customizable horizontal scrolling menu component for React. Can also use it for Amazon like items block or a Gallery. Menu component is responsive, just set width for parent container. Items width will be determined from CSS styles.

For navigation, you can use scrollbar, native touch scroll, mouse wheel or drag by mouse.

Component provide context with visible items and helpers.

Possible set default position on initialization.

Check out examples on Storybook or codesandbox.

⭐ if you like the project :)

NextJS issues

Cannot use import statement outside a module

Quick start

npm install --save react-horizontal-scrolling-menu

test In project:

import React from 'react';
import { ScrollMenu, VisibilityContext } from 'react-horizontal-scrolling-menu';
import 'react-horizontal-scrolling-menu/dist/styles.css';

const getItems = () =>
  Array(20)
    .fill(0)
    .map((_, ind) => ({ id: `element-${ind}` }));

function App() {
  const [items, setItems] = React.useState(getItems);
  const [selected, setSelected] = React.useState([]);

  const isItemSelected = (id) => !!selected.find((el) => el === id);

  const handleClick =
    (id) =>
    ({ getItemById, scrollToItem }) => {
      const itemSelected = isItemSelected(id);

      setSelected((currentSelected) =>
        itemSelected
          ? currentSelected.filter((el) => el !== id)
          : currentSelected.concat(id),
      );
    };

  return (
    <ScrollMenu LeftArrow={LeftArrow} RightArrow={RightArrow}>
      {items.map(({ id }) => (
        <Card
          itemId={id} // NOTE: itemId is required for track items
          title={id}
          key={id}
          onClick={handleClick(id)}
          selected={isItemSelected(id)}
        />
      ))}
    </ScrollMenu>
  );
}

const LeftArrow = () => {
  const visibility = React.useContext < publicApiType > VisibilityContext;
  const isFirstItemVisible = visibility.useIsVisible('first', true);
  return (
    <Arrow
      disabled={isFirstItemVisible}
      onClick={() => visibility.scrollPrev()}
      className="left"
    >
      Left
    </Arrow>
  );
};

const RightArrow = () => {
  const visibility = React.useContext < publicApiType > VisibilityContext;
  const isLastItemVisible = visibility.useIsVisible('last', false);
  return (
    <Arrow
      disabled={isLastItemVisible}
      onClick={() => visibility.scrollNext()}
      className="right"
    >
      Right
    </Arrow>
  );
};

function Card({ onClick, selected, title, itemId }) {
  const visibility = React.useContext < publicApiType > VisibilityContext;
  const visible = visibility.useIsVisible(itemId, true);

  return (
    <div
      onClick={() => onClick(visibility)}
      style={{
        width: '160px',
      }}
      tabIndex={0}
    >
      <div className="card">
        <div>{title}</div>
        <div>visible: {JSON.stringify(visible)}</div>
        <div>selected: {JSON.stringify(!!selected)}</div>
      </div>
      <div
        style={{
          height: '200px',
        }}
      />
    </div>
  );
}

export default App;

Check out Example in example-nextjs folder for info how to implement more features like mouse drag or disable body scroll.

Example

You can clone repository and run demo project.

git clone https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu
npm run setup
npm run demo

Storybook

Can clone repo and run storybook

git clone https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu
npm run setup
npm run storybook

Helpers and api

Children of main ScrollMenu component(arrows, fotter, items) can use VisibilityContext to access state and callbacks. Function callbacks also pass context, eg onWheel, onScroll etc.

Properties and callbacks

Prop Signature
LeftArrow React component for left arrow
RightArrow React component for right arrow
Header React component Header
Footer React component Footer
onWheel (VisibilityContext, event) => void
onScroll (VisibilityContext, event) => void, will fire before scroll
onInit (VisibilityContext) => void
apiRef React.RefObject | React.RefCallback
options options for IntersectionObserver - rootMargin, treshhhold, and ratio to consider element visible
containerRef React.RefObject | React.RefCallback
onUpdate (VisibilityContext) => void
onMouseDown (VisibilityContext) => (React.MouseEventHandler) => void
onMouseLeave (VisibilityContext) => (React.MouseEventHandler) => void
onMouseUp (VisibilityContext) => (React.MouseEventHandler) => void
onMouseMove (VisibilityContext) => (React.MouseEventHandler) => void
onTouchMove (VisibilityContext) => (React.TouchEventHandler) => void
onTouchStart (VisibilityContext) => (React.TouchEventHandler) => void
onTouchEnd (VisibilityContext) => (React.TouchEventHandler) => void
itemClassName ClassName of Item
scrollContainerClassName ClassName of scrollContainer
transitionDuration Duration of transitions in ms, default 500
transitionBehavior 'smooth' |'auto' | customFunction
wrapperClassName ClassName of the outer-most div
RTL Enable Right to left direction
noPolyfill Don't use polyfill for scroll, no transitions

VisibilityContext

Prop Signature
useIsVisible (itemId: string, defaultValue?: false) => boolean
getItemById itemId => IOItem | undefined
getItemElementById itemId => DOM Element | null
getItemByIndex index => IOItem | undefined
getItemElementByIndex index => DOM Element | null
getNextElement () => IOItem | undefined
getPrevElement () => IOItem | undefined
isFirstItemVisible boolean
isItemVisible itemId => boolean
isLastItem boolean
isLastItemVisible boolean
scrollNext (behavior, inline, block, ScrollOptions) => void
scrollPrev (behavior, inline, block, ScrollOptions) => void
scrollToItem (item, behavior, inline, block, ScrollOptions) => void
items ItemsMap class instance
scrollContainer Ref

items class instance

ItemsMap class store info about all items and has methods to get currently visible items, prev/next item. Also, can subscribe to updates.

Prop/method Description
subscribe subscribe for events for itemId or first, last, onInit, onUpdate, eg. items.subscribe('item5', (item) => setVisible(item.visible))
unsubscribe use in useEffect to cleanup, pass same cb instance
getVisible return only visible items
toItems return ids for all items
toArr return all items
first return first item
last return last item
prev (itemId | Item) => previous item | undefined
next (itemId | Item) => next item | undefined

Transition/Animation

NOTE: won't work with RTL prop

Can use transitionDuration, and transitionBehavior See example

ScrollOptions for scrollToItem, scrollPrev, scrollNext

Will override transition* options passed to ScrollMenu

{
  // target,
  behavior, // 'smooth', 'auto' or custom function
    // inline,
    // block,
    {
      duration: number, // number in milliseconds
    };
}

Other helpers

slidingWindow

Can get previous or next visible group of items with slidingWindow(allItems: string[], visibleItems: string[]) helper, e.g

slidingWindow(allItems, visibleItems)
.prev()
//.next()

getItemsPos

Can get first, center and last items, e.g.

const prevGroup = slidingWindow(allItems, visibleItems).prev()
const { first, center: centerItem, last } = getItemsPos(prevGroup)

// and scroll to center item of previous group of items
scrollToItem(getItemById(centerItem, 'smooth', 'center'))

Check out examples

apiRef

Can pass Ref object to Menu, current value will assigned as VisibilityContext. But some other values can be staled, so better use it only for firing functions like scrollToItem.

For scrolling use apiRef.scrollToItem(apiRef.getItemElementById) instead of apiRef.scrollToItem(apiRef.getItemById).

Can get item outside of context via apiRef.getItemElementById(id) or directly via document.querySelector(`[data-key='${itemId}']`). See apiRef example and Add item and scroll to it

Browser support

  • Browser must support IntersectionObserver API and requestAnimationFrame or use polyfills.
  • Only modern browsers, no IE or smart toasters

About

My first npm project. Sorry for my english.

Any contribution and correction appreciated. Just fork repo, commit and make PR, don't forget about tests.

react-horizontal-scrolling-menu's People

Contributors

adamward459 avatar asmyshlyaev177 avatar benmneb avatar filipjnc avatar github-actions[bot] 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

react-horizontal-scrolling-menu's Issues

TypeScript Error when using the component

When I compiled the application using the component, 0.5.3, with TypeScript 3.3, I got the following error:

TypeScript error: Generic type 'ReactElement<P, T>' requires between 1 and 2 type arguments.  TS2707

     5 |     arrowClass: string;
     6 |     arrowDisabledClass: string;
  >  7 |     arrowLeft: React.ReactElement | null;
       |                ^
     8 |     arrowRight: React.ReactElement | null;
     9 |     clickWhenDrag: boolean;
    10 |     dragging: boolean;

In my own experiment, arrowLeft?: JSX.Element and arrowRight?: JSX.Element would work just as fine.

Method to increase scrolling speed

Is your feature request related to a problem? Please describe.
I feel the scrolling is a little slow in my implementation and would like a way to scale this speed

Describe the solution you'd like
A setting that lets you set a translation speed

"mounted" remains false after init

On my project after initialization variable mounted remains false until we trigger some rerendering.
Because of this clicking to Arrows leads to instant (0s) transition to destination point.
Unfortunately I can not reproduce this behavior on demo page (even by adding react-router).
I don't know why mounter remains false.. but do we need this || !mounted condition here?

export const innerStyle = ({ translate, dragging, mounted, transition }) => {
  return {
    ...
    transition: `transform ${dragging || !mounted ? '0' : transition}s`
  };
};

Or, another question:
There is setMounted function with variable initialized which is used only in this function. What's the reason of this variable? Also, setMounted is calling in componentDidUpdate only, shouldn't we call it in componentDidMount too?

My settings

<ScrollMenu
  data={data}
  arrowLeft={<Arrow type="prev" />}
  arrowRight={<Arrow type="next" />}
  onSelect={this.onSelect}
  wheel={false}
  alignCenter={false}
  wrapperClass={style.sliderInner}
  itemClass={style.sliderItem}
/>

Typescript support

Do you have plans to add typescript support ? Primarily, there are two ways -

  1. Adding the project to DefinitelyTyped project so that users can have typescript support by installing @types/react-horizontal-scrolling-menu
  2. Adding type declaration files (.d.ts) in this project itself.

If you are ready to merge a PR to add the declaration files to this repo itself, I can volunteer.

scrollToEndOfSelectedItem

I am using this react-horizontal-scrolling-menu for my personal use and here i do have larger width items which does not fit in my wrapping bar.

Here you guys already do have feature scrollToSelected onSelect it automatically scroll to the front of that particular item.
Screen Shot 2019-05-27 at 4 25 19 PM

But can we have feature on which we can directly scrollTo the end of the selected item??
Screen Shot 2019-05-27 at 4 25 35 PM

Here link of stackoverflow

Initial translate still using 51px when set as 0/-1

Initial translate doesn't work when set it as 0 or -1.

<ScrollMenu  
       data={data}  
       arrowLeft={ArrowLeft}  
       arrowRight={ArrowRight}  
       translate={0}  
       wheel={false}  
       selected={selected}  
       onSelect={onSelect}  
/>

Got the following html after refresh web page.
<div class="menu-wrapper--inner" style="width: 9900px; transform: translate3d(51px, 0px, 0px); transition: transform 0.4s ease 0s; white-space: nowrap; text-align: left; user-select: none;">

Transition to initial position

Please check this link

There is toggle button, click it few times.
You would notice that every time when lists appears, there is transition to initial position in the first list.
This transition reproduces with small amount of items, when full width of all items is smaller than viewport of list's width.
Second list does not have this transition.

bug5

It's very noticeable on my project because I use react-horizontal-scrolling-menu in rows that are rendered by ReactList. So every time I scroll the page, new react-horizontal-scrolling-menu elements renders and transition animation appears.
How do you think, is it possible to set initial position statically without transition?


btw in second list I've used

scrollToSelected
selected="item6"

and item 6 indeed appeared in the viewport, but not in center. This is not so important, just let you know.

Should drag and arrow click recompute all menu elements?

Maybe I am not understanding React, or how this component works, but should every drag and arrow click result in recomputing all the elements in your menu?

Even in the codesandbox demo provided in the documention, I noticed that the Menu functional component on line 39 iterates through every item in the list repeatedly during drag events. Is there a way to stop this?

Intertia scrolling for touch device

How easy would it be to implement inertia scrolling where you flick sideways and the items scroll first at fast and then slow down? Would be happy to help code this if you think its possible.

RTL alignment support

Does this component support RTL alignment? If supports please tell me the process.

Scroll functionality not working when using images

Hey there!

I've faced an issue while using images as items in the scroll menu - Basically, the elements (images) render perfectly, but both the scroll functionality and arrow buttons don't work.

This behaviour is solved when I refresh the page. - Any thoughts where this may come from?

I'm using a map() function to return each menu item (image).

Item was selected falsely by being dragging to the initial position

Consider such case: user starts dragging the list, moved a lot from side to side but luckily stops exactly at same position it was picked.
Item will be selected, but that's not what user needs.
How about counting amount of pixels moved by X axis instead of comparing start/stop positions?
selected

Inactive space on the left when dragging

Example on codesandbox

There is some inactive space on the left, when dragging items.
When you drag to the right - it scrolls back to the center, as intended.
Same happens when you scroll way left, it scrolls back to the center, it's ok.
But when you scroll slightly to the left, there is an area where items stuck and do not scrolls back to the center.

bug3

Selected property not working

Hi.
Thanks for great component!
Unfortunately I met small issue: It looks like programmatically switching selected element is not working.
I am modifying "selected" property but it has no effect.
It is a bug or there is some undocumented tweaks?

BR, Vlad

Setup Airbrake for your JavaScript application

Install Airbrake in 2 easy steps:

Step 1: Add the library
Include via CDN:

<script src="https://cdnjs.cloudflare.com/ajax/libs/airbrake-js/1.4.6/client.min.js"></script>

We also support installation via npm and Bower.

Step 2: Copy this config snippet to your app.js file

(You can find your project ID and API KEY with your project's settings):

var airbrake = new airbrakeJs.Client({
  projectId: <Your project ID>,
  projectKey: '<Your project API Key>'
});

To test that Airbrake has been installed correctly in your JavaScript project, just open up the JavaScript console in your internet browser and paste in:

airbrake.notify('hey there!')

Visit official GitHub repo for more info on alternative configurations and advanced options.

Left arrow bug

Hello, check this example please

Seems to be there is something wrong with offset calculations when alignCenter is false

Steps to reproduce:
Click right arrow (it works)
Click left arrow (it doesn't)
Also note the position of the list, now click to any item in the list, it jumps to the beginning immediately.

bug1
bug2

Settings:

<ScrollMenu
    ref={el => (this.menu = el)}
    data={menu}
    arrowLeft={ArrowLeft}
    arrowRight={ArrowRight}
    onUpdate={this.onUpdate}
    onSelect={this.onSelect}
    alignCenter={false}
    wheel={false}
  />
      </div

Cards snap back

Describe the bug
The items snap back immediately after I pull them

To Reproduce
Steps to reproduce the behavior:
I create a card in React and programmatically fill the list via componentDidMount()

I then cannot pull permanently over them.

Example repo
This is in cordova, I don't have a working example of the bug but I can implement one later

Desktop (please complete the following information):
Cordova - iOS

Smartphone (please complete the following information):
iPhone 8 and iOS simulator

onClick Function

Hi ,
I'm new with react. Is the onClick function active on this component? Because I have a series of buttons with the onClick function in the menuItem but my onClick function is not called.

Use my own buttons and call forward/backward via refs?

Does this component allow me to use my own arrow functions? Somewhere outside the div itself and call its forward/backward actions.

I want the arrow buttons to be above the scrolling div. Apart from this great component and I am loving it.

TypeError: null is not an object (evaluating 'elem.getBoundingClientRect')

Hi, I had this error when unmounting the component:

TypeError: null is not an object (evaluating 'elem.getBoundingClientRect')

I checked the utils.js file for the getClientRect() function and made a little change that fixed the problem.

Before:

const getClientRect = elem => {
  const { x, left, width } = elem.getBoundingClientRect();
  return { width, x: !isNaN(x) ? +x : +left };
};

After:

const getClientRect = elem => {
  const { x, left, width } = elem ? elem.getBoundingClientRect() : {x:0, left:0, width:0};
  return { width, x: !isNaN(x) ? +x : +left };
};```

Maybe it can be added to the next version, or maybe I make a PR for this.

Some Items (with relatively short height) gets lower

Describe the bug
Some items with relatively short height seems to align it's top onto center.

image

Outmost wrapper doesn't seem to be oversized.

image

I tried but couldn't reproduce in your example. I guess it's because of some subtle differences from my project. And I'm trying to figure it out.

Hopefuly you encountered similar issues and know what's happening?

Desktop, Smartphone

  • chrome, safari

Clicking on an item returns scroll to the beginning

When i click on an item, it scrolls me back to the first items at the beginning. I tried to use the given example from the docs. I don't know how to fix that.
So i copied and pasted the example in a new create-react-app project. Its all loaded. I have 17 items. When i clicked on 17th item i get scrolled back to beginning.

Types for ScrollMenu not recognized

Describe the bug
After importing ScrollMenu, using it in JSX leads to typescript error:

import ScrollMenu from 'react-horizontal-scrolling-menu'

function Menu() {
  return <ScrollMenu alignCenter={false} ...>
}

Message for ScrollMenu:

JSX element class does not support attributes because it does not have a 'props' property

After some tests I found out, that #63 could fix this issue. Would this be the correct solution?

onUpdate wrong behavior

When component receive translate prop in initial mount, onUpdate callback is not executed. This is due of this condition:

if (onUpdate && translate !== translateOld && translate !== lastTranslateUpdate) {

Sometimes translate and lastTranslateUpdate are equals to 0. So, If I remove the last part of the condition, then the behavior is the expected

if (onUpdate && translate !== translateOld /*&& translate !== lastTranslateUpdate*/) {

I think that the condition translate !== translateOld is enough.

Greetings from Chile!

Trying to test the examples but `npm install fails`

I decided to clone your repository to try out some of the examples but on running npm install, execution fails. Below is the log of this:

D:\Samples>cd react-horizontal-scrolling-menu
D:\Samples\react-horizontal-scrolling-menu>npm install
npm WARN deprecated [email protected]: CoffeeScript on NPM has moved to "coffeescript" (no hyphen)
npm WARN deprecated [email protected]: Critical security bugs fixed in 2.5.5
npm WARN deprecated [email protected]: Package no longer supported. Contact [email protected] for more info.
npm WARN deprecated [email protected]: 1.2.0 should have been a major version bump
npm ERR! code 1
npm ERR! Command failed: C:\cygwin\bin\git.EXE clone --mirror -q https://github.com/maicki/why-did-you-update.git C:\Users\admin\AppData\Roaming\npm-cache\_cacache\tmp\git-clone-0dae8b53\.git --config core.longpaths=true
npm ERR! /cygdrive/c/Users/admin/AppData/Roaming/npm-cache/_cacache/tmp/git-clone-0dae8b53/C:\Users\admin\AppData\Roaming\npm-cache\_cacache\tmp\git-clone-0dae8b53\.git: No such file or directory
npm ERR!
npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\admin\AppData\Roaming\npm-cache\_logs\2018-08-15T23_33_32_311Z-debug.log

Also the examples:

D:\Samples\react-horizontal-scrolling-menu>cd examples

D:\Samples\react-horizontal-scrolling-menu\examples>npm install
npm ERR! code EUNSUPPORTEDPROTOCOL
npm ERR! Unsupported URL Type "link:": link:..

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\admin\AppData\Roaming\npm-cache\_logs\2018-08-15T23_38_02_853Z-debug.log

How can this be fixed?

Can i use a custom component as data

I would like to use this to make a horizontal scroll of Avatar images, instead of plain text, is this possible? If so, how? The examples I've seen all use the same data souce (a list of objects with name key).

Thanks in advance!

Refresh datasource

When I give new data in props to ScrollMenu, the list was not refresh automatically. I find in your shoulComponentUpdate, if you add :

const {data} = nextProps;
menuItems !== data (in return)

, the refresh is done. (There is maybe an other method, I start with React ^^)

Moreover, if you do also the centering of elements (or reorder), this become great. In any case, your component is very useful and matches to my need !! ;)

Show scrollbar

Is there away to show the scrollbar to scroll through the items?
Is there a -webkit-scrollbar property being set to display:none somewhere we can override, or would it be a custom react item programmed to reflect the current position of the menu?

Touchpad side scrolling

So the clickable arrows work fine to scroll and so does scrolling up and down on my touchpad..

But scrolling left and right on my touch pad i can only go right, if I go left i get pushed back right.. wonder how to fix it...

i'm not even able to run the source by its self just to play around with it yet...

not sure if somehow making the side buttons scroll too is breaking the ability to scroll left and right and a touchpad maybe or if your emulating a scroll bar and just haven't programed it

I'm really happy I found this almost works perfectly for me

How can I change default style?

First of all, thanks for your library.
I want to use this library, but I hope to remove default style.
Especially this.

image

So I tried something to remove it

  <ScrollMenu
        data={menu}
        arrowLeft={ArrowLeft}
        arrowRight={ArrowRight}
        selected={selected}
        menuStyle={null}
        wrapperStyle={null}
        alignCenter={false}
      />

and in css file

.menu-wrapper--inner {
  width: 100%
}

But it didn't work anything.
Is there any way to remove or modify default styles?

Incorrect scrolling width counting

When menu initially loading, width of scrolled items incorrectly counted. Scrolling area is too big, I scroll until blank space is visible wihtout any menu items.
When I click on one of the menu items, it works correctly and blank area isn't visible
Also, mounted is false on initial load

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.