GithubHelp home page GithubHelp logo

soywod / react-pin-field Goto Github PK

View Code? Open in Web Editor NEW
412.0 5.0 24.0 2.08 MB

πŸ“Ÿ React component for entering PIN codes.

Home Page: https://soywod.github.io/react-pin-field/

License: MIT License

TypeScript 88.92% JavaScript 8.07% Nix 3.01%
react component field pin code typescript input

react-pin-field's Introduction

πŸ“Ÿ React PIN Field tests codecov npm

React component for entering PIN codes.

gif

Live demo at https://soywod.github.io/react-pin-field/.

Installation

yarn add react-pin-field
# or
npm install react-pin-field

Usage

import PinField from "react-pin-field";

Props

type PinFieldProps = {
  ref?: React.Ref<HTMLInputElement[]>;
  className?: string;
  length?: number;
  validate?: string | string[] | RegExp | ((key: string) => boolean);
  format?: (char: string) => string;
  onResolveKey?: (key: string, ref?: HTMLInputElement) => any;
  onRejectKey?: (key: string, ref?: HTMLInputElement) => any;
  onChange?: (code: string) => void;
  onComplete?: (code: string) => void;
  style?: React.CSSProperties;
} & React.InputHTMLAttributes<HTMLInputElement>;

const defaultProps = {
  ref: {current: []},
  className: "",
  length: 5,
  validate: /^[a-zA-Z0-9]$/,
  format: key => key,
  formatAriaLabel: (idx, length) => `pin code ${idx} of ${length}`,
  onResolveKey: () => {},
  onRejectKey: () => {},
  onChange: () => {},
  onComplete: () => {},
  style: {},
};

Reference

Every input can be controlled thanks to the React reference:

<PinField ref={ref} />;

// reset all inputs
ref.current.forEach(input => (input.value = ""));

// focus the third input
ref.current[2].focus();

Style

The pin field can be styled either with style or className. This last one allows you to use pseudo-classes like :nth-of-type, :focus, :hover, :valid, :invalid…

Length

Length of the code (number of characters).

Validate

Characters can be validated with a validator. A validator can take the form of:

  • a String of allowed characters: abcABC123
  • an Array of allowed characters: ["a", "b", "c", "1", "2", "3"]
  • a RegExp: /^[a-zA-Z0-9]$/
  • a predicate: (char: string) => boolean

Format

Characters can be formatted with a formatter (char: string) => string.

Format Aria Label(s)

This function is used to generate accessible labels for each input within the <PinField />. By default it renders the string pin code 1 of 6, pin code 2 of 6, etc., depending on the actual index of the input field and the total length of the pin field.

You can customize the aria-label string by passing your own function. This can be useful for: i) site internationalisation (i18n); ii) simply describing each input with different semantics than the ones provided by react-pin-field.

Events

  • onResolveKey: when a key passes the validator
  • onRejectKey: when a key is rejected by the validator
  • onChange: when the code changes
  • onComplete: when the code has been fully filled

Examples

See the live demo.

Development

git clone https://github.com/soywod/react-pin-field.git
cd react-pin-field
yarn install

To start the development server:

yarn start

To build the lib:

yarn build

To build the demo:

yarn build:demo

Tests

Unit tests

Unit tests are handled by Jest (.test files) and Enzyme (.spec files).

yarn test:unit

End-to-end tests

End-to-end tests are handled by Cypress (.e2e files).

yarn start
yarn test:e2e

Sponsoring

github paypal ko-fi buy-me-a-coffee liberapay

react-pin-field's People

Contributors

bluepioupiou avatar dannystreur avatar dependabot[bot] avatar dss3113 avatar franciscokloganb avatar pedrosoaresll avatar soywod avatar sveisvei avatar vikeri 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

react-pin-field's Issues

Pasting code on IOS Chrome not working from Message

I am still having this issue on IOS Chrome and IOS webview with version 3.0.15.

Jul-05-2022.15-02-32.mp4

Also used the example, same issue on Chrome on IOS:

Jul-05-2022.15-20-50.mp4

The problem mentioned in the issues below is still actual in version 3.0.15. I have posted videos in both stories.

We have a react app using the latest version and it doesn't allow quick paste from IOS Message into the box, it only fills the first box with one number.

#52

Problems with jest testing

There are problems in testing the component in jest, he says that there is a syntax error, when I remove the import from the pin-field, the problem does not occur.

The error:
image

My dependencies and devDependencies:
"dependencies": {
"@babel/preset-env": "^7.10.2",
"@loadable/component": "^5.12.0",
"@material-ui/core": "^4.10.2",
"@material-ui/lab": "^4.0.0-alpha.56",
"axios": "^0.19.2",
"brazilian-values": "^0.7.5",
"js-cookie": "^2.2.1",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-pin-field": "^1.0.3",
"react-router": "^5.2.0",
"react-router-dom": "^5.2.0",
"react-router-guards": "^1.0.2",
"react-scripts": "3.4.0",
"styled-components": "^5.1.1",
"typescript": "~3.9.5",
"yup": "^0.29.1"
},

"devDependencies": {
"@types/loadable__component": "^5.10.0",
"@types/react-router": "^5.1.7",
"@types/react-router-dom": "^5.1.5",
"@types/styled-components": "^5.1.0",
"@types/yup": "^0.29.3",
"@typescript-eslint/eslint-plugin": "^3.3.0",
"@typescript-eslint/parser": "^3.3.0",
"eslint-config-prettier": "^6.11.0",
"eslint-config-react": "^1.1.7",
"eslint-plugin-prettier": "^3.1.4",
"eslint-plugin-react-hooks": "^4.0.4",
"eslint-plugin-testing-library": "^3.3.0",
"jest-environment-jsdom-sixteen": "^1.0.3",
"prettier": "^2.0.5",
"t": "^0.5.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^10.2.1",
"@testing-library/user-event": "^12.0.2",
"@types/jest": "^26.0.0",
"@types/js-cookie": "^2.2.6",
"@types/node": "^14.0.13",
"@types/react": "^16.9.37",
"@types/react-dom": "^16.9.8"
}

Add a behaviour when key isn't allowed

When we enter a key that is not allow, we don't really see that it's not a bug. Maybe display a red border hat shake a little before comming back to normal on the highlited input

Should allow setting `type=number`

The type prop on the fields should be able to be set from the PinField component. This will allow using mobile browsers' numeric keyboards.

react_1.forwardRef is not a function

< PinField data-cy="pin-field" />

but

Uncaught TypeError: react_1.forwardRef is not a function
at Object../node_modules/react-pin-field/lib/pin-field/pin-field.js (pin-field.js:240)
at webpack_require (bootstrap:782)
at fn (bootstrap:150)
at Object../node_modules/react-pin-field/lib/pin-field/index.js (index.js:13)
at webpack_require (bootstrap:782)
at fn (bootstrap:150)
at Object../node_modules/react-pin-field/lib/index.js (index.js:14)
at webpack_require (bootstrap:782)
at fn (bootstrap:150)
at Module../src/components/PinInp/index.js (index.js:1)

iOS "From Messages" Auto Paste

Hello soywood,

I think I might have found problem with the onPaste handler.

When you receive a text message with the pin on iOS, the device usually gives you an option to auto enter it for you. Whenever I choose that option it only enters the first value into the input fields leaving other fields empty.

It works if you manually copy and paste the code in.

Thanks for making this awesome component

Paste doesn't work on macOS

Cmd+V Does not trigger any paste when focusing the pin fields.
Paste works when you select paste from the secondary click context menu.

Ctrl+V Seems to work in Linux and Windows

OnComplete not being fired

When I complete the Pin Field Group, the function that is coded to fire when the pin is completed is not being called.

Example Code:

handlePinCode() {
    alert('Code completed')
    this.setState({ isLoading: true });

    setTimeout(() => this.setState({ isLoading: false }), 1000);
}

render() {
    return (
        <div className="text-center m-5">
            <h2>Bienvenido</h2>

            <PinField
                length="4"
                validate={/^[0-9]$/}
                onComplete={this.handlePinCode}
                disabled={this.state.isLoading}
                type="number"
            ></PinField>
        </div>
    );
}

AutoFill doesn't work correctly on Safari

Hi! Thanks for this lib, its awesome! But there is an issue which seems to be critical.
In Safari (both mobile and desktop) autoFill works incorrect - it inserts code from sms in first input ignoring others:

image

Also, same issue when you get one-time-code from email (new feature from MacOS Sonoma, Safari 17):
image

I've tried to debug a little and it seems onChange event doesn't fire for autofill.

Delete key is not triggering any event

If I complete the pin field and then I delete one of the fields with the Delete key the onChange event is not fired

Code example:

codesandbox.io

Steps to reproduce:

  • Fill the pin fields
  • Try to delete one field with the Delete key
  • Look at the current code and completed rows

Environment

Tech Version
Browser Chrome Version 80.0.3987.149 (Official Build) (64-bit)
react 16.13.0
react-pin-field 1.0.1

Prevent modifier keys (Alt, OS, Ctrl...) to be blocked

For eg, Alt+<num> is used by browsers to change tab. Alt+1 for the first, Alt+2 for the second etc. When the field has the focus, you can't anymore use these binds. Instead of switching the tab, it inserts the number.

Issue with last input field

Hi πŸ‘‹πŸ»,

Firstly, thanks for your efforts in this library, it is really useful

I faced an issue with the last input field, when I try to clear it, the last two fields are cleared and this causes calling the onComplete twice.
I tried to figure out the issue, but I didn't reach any solution :(

  • I'm using React with Next.js and Tailwind and I'm calling a custom function onComplete: onComplete={handleVerify}
    <PinField autoFocus ref={codeRef} onComplete={handleVerify} className='w-full rounded-md text-center placeholder:text-xs placeholder:text-gray-300 bg-my-gray border-gray-300 transition-all ease-soft-spring focus:shadow-md focus:ring-1 focus:shadow-sky-200 focus:outline-none hover:bg-my-200' id="code" placeholder='β—‹' validate={/^[0-9]$/} />

ezgif-8-560513cd79

Disable logs via prop

Im trying to disable the logs spamming the console on development evn,
Any props to do so? couldn't find any documentation regarding this issue.

utils.ts:22 [React PIN Field] (notifier) focus-input: idx=0
utils.ts:22 [React PIN Field] (main) event: key-down,idx=0,key=/
utils.ts:22 [React PIN Field] (reducer) handle-key-down: key=/
utils.ts:22 [React PIN Field] (notifier) reject-key: idx=0,key=/
utils.ts:22 [React PIN Field] (main) event: key-up,idx=0
utils.ts:22 [React PIN Field] (reducer) handle-key-up: ignored
utils.ts:22 [React PIN Field] (main) event: key-down,idx=0,key=Χ’
utils.ts:22 [React PIN Field] (reducer) handle-key-down: key=Χ’
utils.ts:22 [React PIN Field] (notifier) reject-key: idx=0,key=Χ’
utils.ts:22 [React PIN Field] (main) event: key-up,idx=0
utils.ts:22 [React PIN Field] (reducer) handle-key-up: ignored
utils.ts:22 [React PIN Field] (main) event: key-down,idx=0,key=2
utils.ts:22 [React PIN Field] (reducer) handle-key-down: key=2
utils.ts:22 [React PIN Field] (notifier) set-input-val: idx=0,val=2
utils.ts:22 [React PIN Field] (notifier) resolve-key: idx=0,key=2
utils.ts:22 [React PIN Field] (notifier) focus-input: idx=1
utils.ts:22 [React PIN Field] (main) event: focus,idx=1
utils.ts:22 [React PIN Field] (notifier) handle-code-change: code={2}
utils.ts:22 [React PIN Field] (notifier) focus-input: idx=1
utils.ts:22 [React PIN Field] (main) event: key-up,idx=1
utils.ts:22 [React PIN Field] (reducer) handle-key-up: ignored
utils.ts:22 [React PIN Field] (main) event: key-down,idx=1,key=Χ‘
utils.ts:22 [React PIN Field] (reducer) handle-key-down: key=Χ‘
utils.ts:22 [React PIN Field] (notifier) reject-key: idx=1,key=Χ‘
utils.ts:22 [React PIN Field] (main) event: key-up,idx=1
utils.ts:22 [React PIN Field] (reducer) handle-key-up: ignored
utils.ts:22 [React PIN Field] (main) event: key-down,idx=1,ignored-key=Alt
utils.ts:22 [React PIN Field] (main) event: key-down,idx=1,ignored-key=Shift
utils.ts:22 [React PIN Field] (main) event: key-up,idx=1
utils.ts:22 [React PIN Field] (reducer) handle-key-up: ignored
utils.ts:22 [React PIN Field] (main) event: key-up,idx=1
utils.ts:22 [React PIN Field] (reducer) handle-key-up: ignored
utils.ts:22 [React PIN Field] (main) event: key-up,idx=1
utils.ts:22 [React PIN Field] (reducer) handle-key-up: ignored
utils.ts:22 [React PIN Field] (main) event: focus,idx=0
2utils.ts:22 [React PIN Field] (reducer) handle-key-up: ignored
utils.ts:22 [React PIN Field] (notifier) focus-input: idx=0
utils.ts:22 [React PIN Field] (main) event: key-down,idx=0,key=q
utils.ts:22 [React PIN Field] (reducer) handle-key-down: key=q
utils.ts:22 [React PIN Field] (notifier) set-input-val: idx=0,val=q
utils.ts:22 [React PIN Field] (notifier) resolve-key: idx=0,key=q
utils.ts:22 [React PIN Field] (notifier) focus-input: idx=1
utils.ts:22 [React PIN Field] (main) event: focus,idx=1
utils.ts:22 [React PIN Field] (notifier) handle-code-change: code={q}
utils.ts:22 [React PIN Field] (notifier) focus-input: idx=1
utils.ts:22 [React PIN Field] (main) event: key-up,idx=1
utils.ts:22 [React PIN Field] (reducer) handle-key-up: ignored
utils.ts:22 [React PIN Field] (main) event: key-down,idx=1,key=g
utils.ts:22 [React PIN Field] (reducer) handle-key-down: key=g
utils.ts:22 [React PIN Field] (notifier) set-input-val: idx=1,val=g
utils.ts:22 [React PIN Field] (notifier) resolve-key: idx=1,key=g
utils.ts:22 [React PIN Field] (notifier) focus-input: idx=2
utils.ts:22 [React PIN Field] (main) event: focus,idx=2
utils.ts:22 [React PIN Field] (notifier) handle-code-change: code={qg}
utils.ts:22 [React PIN Field] (notifier) focus-input: idx=2
utils.ts:22 [React PIN Field] (main) event: key-up,idx=2
utils.ts:22 [React PIN Field] (reducer) handle-key-up: ignored
utils.ts:22 [React PIN Field] (main) event: key-down,idx=2,key=2

Internet Explorer infinite loop

Hey. I've just started to use this awesome component. But i noticed a bug which only occurs in Internet Explorer.
If the user types the input very fast then the cursor gets swapping between the inputs. Causing the whole browser to shut down (CPU intensive process probably in the background).

Is it a know issue?

Execute twice when strictmode

I'm having an issue where onComplete and other events are executing twice inside a React Strict Mode component called FormAuthPin.

My code:

export default function FormAuthPin({
  onCompletePin,
  isLoading,
  isError,
}: Props) {
  const pinRef = useRef<HTMLInputElement[]>([]);
  useEffect(() => {
    if (isError) {
      pinRef &&
        pinRef.current &&
        pinRef.current.forEach((input) => (input.value = ''));
    }
  }, [isError]);


  return (
    <PinField
      ref={pinRef}
      className={cn('pin-field', {
        complete: isLoading,
      })}
      autoFocus
      length={6}
      disabled={isLoading}
      onComplete={(value) => {
        console.log(value, 'value');
        // onCompletePin(value);
      }}
    />
  );
}

example (when i'm typing the last number):
123456

Result:
(2x) 123456 value

How to style inputs that have been filled already?

I've been trying to style inputs that have been filled already with a green outline using the &:valid selector but it doesn't seem to work since all the inputs turn green even if no object has been selected.
My CSS looks like this

&:valid {
    border-color: #00c700;
    box-shadow: 0 0 0.25rem #00c700;
}
<PinField 
      ref={inputRef}
      onChange={setCode}
      validate={/^[0-9]$/}
      onComplete={()=>setComplete(true)}
      disabled={verified}
/>

How can I style the input boxes that have already been filled?

Missing methods

Hi,

it almost works, but I have two use cases that i cannot get working:

  1. Focus manually
  2. Clear the input

When I try to manipulate the component on the DOM level the component does not work properly. Any chance you can implement that?

SSR support

I got ReferenceError: HTMLElement is not defined
when try to implement on Nextjs

Building with vite.js

Building this with vite.js creates a problem when not targetting commonjs.

The source of the problem is form "index.js" and Object.defineProperty(exports, "__esModule", { value: true });.

The browser error is: Uncaught ReferenceError: exports is not defined

I think changing the "module" in tsconfig from "commonjs" to "umd" might fix this, or even better move to a more broad target https://tsdx.io/ - e.g. like headlessui: https://github.com/tailwindlabs/headlessui/blob/develop/scripts/build.sh#L8

build error on v2

hi there ~

i try to use the latest version on npm, got

image

downgrade to 1.0.6 is fine ~

env:

react-pin-field: v2.0.0-beta.0
@soywod/pin-field: 0.1.9

Pasting code on mobile

When a value is pasted, it will paste entirely into the field that is focused rather than attempt to fill in one character at a time until the fields are all filled.

Is this intentional? Should it be pasting into all of the fields?

Version 2.0.0-beta.2
Device: iPhone 11
Browser: Safari

[bug] React state not synced on event callbacks

Description

React local state values don't get updated on the onChange event callback prop of the ReactPinField component.

Expected Behavior

The local state should be in sync when executing the onChange function.

Actual Behavior

The local state value isn't in sync when executing the onChange function.

Possible Fix

It is possible that mutating the original props object may cause this issue.

const props: DefaultProps & InputProps = {...defaultProps, ...customProps};

Steps to Reproduce

  1. Add a local state to your app. (ex. const [myState, setMyState] = useState("initialValue");).
  2. Define a function to handle the ReactPinField onChange event. (ex. onChange={myHandlerFunction}).
  3. Add a local state usage in the handler function. (ex. console.log(myState);).
  4. When the onChange event callback is triggered, the initial state value is logged in the console.
  5. Update your local state value.
  6. Trigger the onChange callback again; the console shows the initial state value instead of the updated value.

Environment

  • Version used: 2.0.0-beta.2
  • Browser Name and version: Brave Browser V1.26.67 Chromium: 91.0.4472.114 (Official Build) (x86_64)
  • Operating System and version: macOS Big Sur 11.4
  • Link to demo: https://codesandbox.io/s/lucid-snyder-t3v2k

onChange/onComplete events not triggered when a not valid key is pressed

If I complete the pin field and then I go to the first or any field that is filled and press one of these keys (ArrowUp[38], ArrowDown[40], ContextMenu[93], Esc[27], or whatever key that is not valid with this regex /^[0-9]$/) the content of that field is deleted. Is this intended? Also, the onchange event is not triggered

I think that is better if the pushed key is not valid, that field should stay untouched. Or maybe that could be configurable via a prop? deleteWhenNotValid or whatever, it's just a brainstorming

Code example:

codesandbox.io

Steps to reproduce:

  • Fill the pin fields
  • Go to a field that is filled
  • Press a letter or an arrow (Up or Down)
  • The field is deleted but the onChange/onComplete event is not triggered.
  • The current code and completed rows are not updated

Environment

Tech Version
Browser Chrome Version 80.0.3987.149 (Official Build) (64-bit)
react 16.13.0
react-pin-field 1.0.2

debug prop should not be pass to input element

the prop debug is only for ReactPinField, pass to input element will cause warning:

Warning: Received `false` for a non-boolean attribute `debug`.

If you want to write it to the DOM, pass a string instead: debug="false" or debug={value.toString()}.

If you used to conditionally omit it with debug={condition && value}, pass debug={condition ? value : undefined} instead.
    at input
    at http://localhost:3333/static/js/bundle.js:182130:59
    at div

currently we can pass undefined to debug to prevent this warning, but debug={undefined} look unlike what it should be.

[bug] Reactive props update the web component root, not to the child inputs.

Description

On the initial render of ReactPinField, the props passed are transmitted to the child inputs and removed from the root element, but when the props value gets updated, the root element gets synced, but the child inputs do not.

Expected Behavior

The props should be synced to the child inputs and removed from the root element.

Actual Behavior

The props updates only apply to the root element.

Possible Fix

Maybe listen for the props changes in the attributeChangedCallback of the https://github.com/soywod/pin-field web component:
https://github.com/soywod/pin-field/blob/d398dc287c606fe4eefd57a5c79abc439cc9c092/src/index.ts#L124

And do something like in the connectedCallback, pass the props to the child inputs and remove them from the root element: https://github.com/soywod/pin-field/blob/d398dc287c606fe4eefd57a5c79abc439cc9c092/src/index.ts#L155-L162.

Steps to Reproduce

  1. Add a dynamic prop to the ReactPinField component. (ex. className={someDynamicState}).
  2. Update the dynamic prop value.
  3. The prop is updated in the <swd-pin-field> component.
  4. The prop isn't transmitted to the child inputs.

The demo in the repository shows the bug:

<ReactPinField
className={cn("pin-field", {complete: demoCompleted})}
onComplete={() => setDemoCompleted(true)}

Screen Recording

Environment

  • Version used: 2.0.0-beta.2
  • Browser Name and version: Brave Browser V1.26.67 Chromium: 91.0.4472.114 (Official Build) (x86_64)
  • Operating System and version: macOS Big Sur 11.4
  • Link to demo: https://react-pin-field.soywod.me

Error: Jest can't compile when react-pin-field is called in component

Hello @soywod

I was using react-pin-field together @caiomdias but when we running Jest to test our components, we receive an error.

jest error unexpected token import

I did a fork of this repo and change the module inside tsconfig.json to CommonJS, so all working.
I think that other people could have this problem too, I don't know if have other solution for this but, if you want I can do a pull request with this change.

At this moment we are using another repository to solve Pin Inputs, but we really would like to use yours.

I tried the recommendations about this issue #18 but nothing worked.

PR: #21

[bug] Test crashes with Jest

I'm using craco and the tests of the app works until I added react-pin-field:

`
SyntaxError: Unexpected token 'export'

  at Runtime.createScriptFromCode (node_modules/jest-runtime/build/index.js:1350:14)
  at Object.<anonymous> (node_modules/react-pin-field/dist/react-pin-field.cjs.development.js:6:16)

`

How to solve this?

Feature request: Set initial value

Hi!

I was wondering if it is possible to set an initial value, e.g. when the code is already supplied in the query parameters.

Thanks :)

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.