Giter Club home page Giter Club logo

focus-visible's Introduction

Build Status

Based on the proposed CSS :focus-visible pseudo-selector, this prototype adds a focus-visible class to the focused element, in situations in which the :focus-visible pseudo-selector should match.

Details

Polyfill

Support

👋 :focus-visible is now supported in all major browsers.

A browser suppor table showing focus-visible is supported in Chrome 86, Edge 86, Firefox 85, Opera 72, Safari 15.4, all Android browsers, Safari 15.4 on iOS, Android WebView, and Samsung Internet

We would encourage you to use the CSS selector instead of this polyfill if you are able. We are not currently planning to make any updates or release new versions of the polyfill, but are open to discussion in GitHub issues if changes need to be made for emergencies.

Installation

npm install --save focus-visible

We recommend only using versions of the polyfill that have been published to npm, rather than cloning the repo and using the source directly. This helps ensure the version you're using is stable and thoroughly tested.

If you do want to build from source, make sure you clone the latest tag!

Usage

1. Add the script to your page

    ...
    <script src="/node_modules/focus-visible/dist/focus-visible.min.js"></script>
  </body>
</html>

2. Update your CSS

We suggest that users selectively disable the default focus style by selecting for the case when the polyfill is loaded and .focus-visible is not applied to the element:

/*
  This will hide the focus indicator if the element receives focus via the mouse,
  but it will still show up on keyboard focus.
*/
.js-focus-visible :focus:not(.focus-visible) {
  outline: none;
}

If there are elements which should always have a focus ring shown, authors may explicitly add the focus-visible class. If explicitly added, it will not be removed on blur.

Alternatively, if you're using a framework which overwrites your classes (#179), you can rely on the data-js-focus-visible and data-focus-visible-added attributes.

[data-js-focus-visible] :focus:not([data-focus-visible-added]) {
  outline: none;
}

How it works

The script uses two heuristics to determine whether the keyboard is being (or will be) used:

  • a focus event immediately following a keydown event where the key pressed was either Tab, Shift + Tab, or an arrow key.

  • focus moves into an element which requires keyboard interaction, such as a text field

    • NOTE: this means that HTML elements like <input type={text|email|password|...}> or <textarea> will always match the :focus-visible selector, regardless of whether they are focused via a keyboard or a mouse.
  • TODO: ideally, we also trigger keyboard modality following a keyboard event which activates an element or causes a mutation; this still needs to be implemented.

Dependencies

If you want to use :focus-visible with an older browser you'll need to include an additional polyfill for Element.prototype.classList.

In accordance with the W3C's new polyfill guidance, the :focus-visible polyfill does not bundle other polyfills.

You can use a service like Polyfill.io to download only the polyfills needed by the current browser. Just add the following line to the start of your page:

<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Element.prototype.classList"></script>

Shadow DOM

It could be very expensive to apply this polyfill automatically to every shadow root that is created in a given document, so the polyfill ignores shadow roots by default. If you are using Shadow DOM in a component, it is possible to apply this polyfill imperatively to the component's shadow root:

// Check for the polyfill:
if (window.applyFocusVisiblePolyfill != null) {
  window.applyFocusVisiblePolyfill(myComponent.shadowRoot);
}

Lazy-loading

When this polyfill is lazy-loaded, and you are applying the polyfill to a shadow root with JavaScript, it is important to know when the polyfill has become available before trying to use it.

In order to act at the right time, you can observe the global focus-visible-polyfill-ready event:

window.addEventListener('focus-visible-polyfill-ready',
    () => window.applyFocusVisiblePolyfill(myComponent.shadowRoot),
    { once:  true });

Important: this event is only intended to support late application of the polyfill in lazy-loading use cases. Do not write code that depends on the event firing, as it is timing dependent and only fired once. If you plan to lazy-load the polyfill, it is recommended that you check for it synchronously (see example above under "Shadow DOM") and listen for the event only if the polyfill isn't available yet.

Backwards compatibility

Until all browsers ship :focus-visible developers will need to use it defensively to avoid accidentally removing focus styles in legacy browsers. This is easy to do with the polyfill.

/*
  This will hide the focus indicator if the element receives focus via the mouse,
  but it will still show up on keyboard focus.
*/
.js-focus-visible :focus:not(.focus-visible) {
  outline: none;
}

/*
  Optionally: Define a strong focus indicator for keyboard focus.
  If you choose to skip this step then the browser's default focus
  indicator will be displayed instead.
*/
.js-focus-visible .focus-visible {
  …
}

As explained by the Paciello Group, developers who don't use the polyfill can still defensively rely on :focus-visible using the following snippet:

/*
  Provide basic, default focus styles.
*/
button:focus {
  …
}

/*
  Remove default focus styles for mouse users ONLY if
  :focus-visible is supported on this platform.
*/
button:focus:not(:focus-visible) {
  …
}

/*
  Optionally: If :focus-visible is supported on this
  platform, provide enhanced focus styles for keyboard
  focus.
*/
button:focus-visible {
  …
}

In the future, when all browsers support :focus-visible, the snippets above will be unnecessary. But until that time it's important to be mindful when you use :focus-visible and to ensure you always have a fallback strategy.

Big Thanks

Cross-browser Testing Platform and Open Source <3 Provided by Sauce Labs

focus-visible's People

Contributors

bkardell avatar danielruf avatar darrylblake avatar dependabot[bot] avatar dimitrinicolas avatar dontcallmedom avatar eps1lon avatar fyzu avatar greenkeeper[bot] avatar jonathantneal avatar josemarluedke avatar justineo avatar jwyung avatar kloots avatar marcoscaceres avatar matharden avatar nelonoel avatar oatymart avatar oliviertassinari avatar patrickhlauke avatar plinehan avatar robdodson avatar stefanjudis avatar thebuilder avatar tinymachine avatar travisleithead avatar westbrook avatar wojtekmaj avatar yoanmalie avatar yoavweiss 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

focus-visible's Issues

Suggestion: consider offering a distribution without baked-in DOM polyfills

One thing currently prohibiting me from using this (very useful) library is that it bakes in polyfills for both classList and matches (as of v1.0.1) - both of which I already polyfill elsewhere in many of my projects.

Is there any possibility of offering one file in the dist/ directory that does not include these?

React usage

Is there a way to use focus-visible in a React application?

I've installed through yarn and tried the following but cannot access any of the functions:
import * FocusVisible from 'focus-visible';

checkbox label focus

This seemed to make my day, works great for all my elements... except the checkboxes. I have the actual checkboxes styled away off the screen with labels containing a simulation of a styled checkbox.

I use CSS to show the focus outline on the label when the checkbox itself has focus, but it is showing up whether I use the keyboard or not...

<input type="checkbox" id="foo" class="my-checkbox"/>
<label for="foo" class="my-checkbox-label">
   //... my styled pseudo-checkbox
</label>
.my-checkbox  {
    opacity: 0;
    height: 0;
    position: absolute;
    left: -99999px;
    + label.my-checkbox-label {
        // ... styling for the label itself
    }
    &:focus {
        + label.my-checkbox-label {
            outline-style: auto;
	    outline-width: 1px;
	    outline-color: Highlight;
        }
    }
}

Any thoughts on how I could adapt the polyfill to catch this case?
Thanks!

Focus ring does not account for radio buttons

I noticed that the focus-ring polyfill only looks for tab key presses, and not arrow input, which is part of the default behavior for radio buttons.

I've fixed this locally by adding a few lines to the onKeyDown function.

function onKeyDown(e) {
    if (e.altKey || e.ctrlKey || e.metaKey)
      return;

    if (
	e.keyCode != 9 // tab
	&& e.keyCode != 37 // left arrow
	&& e.keyCode != 38 // up arrow
	&& e.keyCode != 39 // right arrow
	&& e.keyCode != 40 // down arrow
	)
      return;

    hadKeyboardEvent = true;
  }

Bundling in a widget, scope

Hi, and thanks for the awesome polyfill! I’m thinking of using it in Uppy file uploading widget http://github.com/transloadit/uppy I’m working on, and was wondering if you think an option to add scope would be a good idea?

  1. Option to specify a container element, so that .focus-visible will only be added to elements inside that container; Then .js-focus-visible could also be added to that container.
  2. Option to set a custom class name for .focus-visible (and .js-focus-visible maybe), so that I could set it to something like uppy-u-focus-visible to match my CSS guidelines and not risk being overriden by page styles (widgets are included in the page which already has third party CSS).

I can possibly send a PR for this, but wanted to hear your thoughts first. Thanks!

Shadow DOM

Description

The Focus-ring Polyfill has some issues when used with shadow DOM. The Polyfill is not able to add the focus-ring class to focusable elements within the shadow DOM such as a buttons. This is due to the shadow DOM event model. Events bubble up from shadow DOM but the events are re-targeted. This means that the events look like they come from the host instead of its internal events within the shadow DOM.

Versions & Environment

Focus-ring: v1.0.1

Steps to Reproduce

  • Clone repository [email protected]:emilbillberg/focus-ring-shadow-dom.git
  • Start a local server such as live-server or similar
  • The Polyfill is NOT able to set the focus-ring class on the button element
  • Go to the index.html file and change the Polymer Global setting to shady instead of shadow
  • The Polyfill is able to set the focus-ring class on the button element

Expected Results

The Polyfill should be able to set the focus-ring class on the button element when using Shadow DOM

Actual Results

The Polyfill sets the focus-ring class on the top custom element. In the example above this will be the custom element my-app.

white list

should [contenteditable], video[controls], audio[controls] also be white listed?

Could the example CSS also be part of the package (in NPM etc.)

I'm using the current version of focus-visible in a demo together with the video.js framework. I reference the focus-visible.js script from my HTML, but I need to add the example CSS from README.md manually:

/*
  This will hide the focus indicator if the element receives focus via the mouse,
  but it will still show up on keyboard focus.
*/
.js-focus-visible :focus:not(.focus-visible) {
  outline: none;
}

Could this be added to the repo as a focus-visible.css file, and then added to the package, so that it can be used in multiple places? Or is it not part of the core of the polyfil? In that case, could it be placed in the demo folder? Just seems like it would be helpful to have it as part of the bundle.

Remove support for author-added focus-ring class

Filing up as a followup from the discussion in issue #33 pertaining to the need for the data-focus-ring-added attribute. As of 8d00580 this polyfill supports persistence of instances of an author-defined focus-ring class. I would argue this should be removed on the premise that:

  1. This polyfill shouldn't give authors abilities they won't have with the actual :focus-ring psuedo. Therefore, once actual support for :focus-ring lands in browsers the only change authors need to make to their CSS is changing their rules from .focus-ring to :focus-ring. Hence, more with the grain.

  2. Should authors wish to ensure specific instances of UI always show focus they can leveraging the natural cascade and/or specificity rules in CSS:

// hide focus by default
:focus {
  outline: none;
}
// focus ring for keyboard navigation
.focus-ring {
  outline: solid 2px blue;
}

// always show focus outline around a specifc control
button.default-action:focus {
  outline: solid 2px blue;
}

Focus-ring is visible after switching browser tabs

If you switch browser tabs, with the mouse or keyboard. The JS will add a focus-visible class and data-focus-visible attribute.

To me and our users, this is unexpected behaviour. What do you think?

Replicate by clicking the div with tabindex="0" on the demo page. Now, no focus-ring is visible. Switch browser tabs. And when you switch back, the focus-ring is visible.

Thx

Wrong behaviour according to CSS editor drafts?

According to:
https://drafts.csswg.org/selectors-4/#the-focusring-pseudo

The pseudo class focus-ring should always be applied on focus to input elements to indicate a where the user should enter text.
However, it should applied if I select e.g. a link / button element using the keyboard (tab button).
However, if I do so with the mouse it shouldn't be applied. The reason is that if I tab through links using the keyboard I need to know WHERE I am but I don't need that information if I click on the element.
Of course, it depends on the corresponding browser's heuristics but that part is mentioned as example there.

No focus styling when navigating with keyboard from outside the web content

Tested on https://wicg.github.io/focus-ring/demo/

Using safari: when the address bar has the focus, pressing tab moves focus to the first input field but it does not receive focus styling. Pressing alt+tab moves focus to the last input field but it does not receive focus styling.

Using chrome: when the address bar has the focus, pressing alt+tab moves focus to the last input field but it does not receive focus styling.

In both cases, if I press shift after navigating, it does add the styling. I assume there's a problem with catching the keyboard events from outside the web content?

Question: Who to ask about focusring JS event?

The [Selectors 4 specification] doesn’t mention a corresponding JS event for :focus, so I understand that it might also not mention a corresponding JS event for :focus-ring.

Is that something to ask here? Feel free to close this if it is outside the bounds of this project.

Global :focus { outline: none; } reset declaration and Polyfill concerns

Hi :)

Per the documentation, I'm really struggling with the blanket :focus { outline: none; } code recommendation. I want to be on board with this awesome feature but feel like we could come up with something better.

It is very bold to say hey.. attention all browsers - kill all outlines on focusable elements and then rely on JS to fill the gaps or when implemented only supporting browsers will overwrite that rule. Many older browsers support :focus {} but will not support :focus-ring ever.

Some ideas

Here are some ideas instead of just a global :focus { outline: none; }

  1. For the spec: lean on fault tolerance so browsers that don't understand skip it?:

:not(:focus-ring) :focus { outline: none; }

  1. For the Polyfill have JS add a class to html tag and descend from that:

.focus-ring-polyfill :focus:not(.focus-ring) { outline: none; }

This would mean JS is probably present, loaded, no errors, and the Polyfill should work.

I don't want to be a stick in the mud but we are working hard out here trying to get folks to stop killing outlines for many different accessibility-related reasons.

Consider these personas:

Lisa: I use my Dell laptop I'm a mouse user, touch user, and a keyboard user. I have a cognitive related disability that affects my memory and have low-vision it's important for me to have an understanding of where I am in the interface -- and yes even right after I click on something. I don't always use a screen reader. I may start a web form using a keyboard and then click on something and I get confused when the focus ring is removed from the UI.

Paul: I turn JavaScript off because it ensures my browsing experience does not have too much animation. I'm epileptic, have low vision, and very sensitive to animation and flashing. I'm also a keyboard user and mouse user. Because of this I turn the brightness down on my screen. I have difficulty getting around a site when they don't have focus states.

On Mac, button clicks don't actually steal focus

Browsers act a little different than OS controls in other contexts, such as in system dialogs. With Full Keyboard Access, you can tab to any control and it will show the focus ring. But if you have clicked in a text field and then click on a radio button, for instance, it is not just that the radio button doesn't get the focus ring: It doesn't get the focus either. You can still type in the field.

This is a nice thing on the Mac, and the real reason why you don't normally see focus rings on non-text-editable controls on Mac. It is something that Windows got wrong when they copied the Mac UI.

My point: Ideally, instead of just hiding the focus ring on non-text-editable controls that are clicked on (instead of tabbed to, or voiced to), we should be throwing the focus back to the previously focused text field (or to the window/iframe, if there isn't one).

All that aside, I do like what you've created here.

Add support for other navigation keys

I have found your library and first off, its AMAZING! Thank you so much, I would like to propose adding support however for other keystrokes such as arrow and spacebar keys so that the interactions work as expected via all input element in a complex form. Is this part of the spec that was proposed? If so I would be more than happy to add handlers for these events in a PR.

Recommendation: Promote styling `outline-width` over `outline`

To preserve user agent outline styles, I recommend you promote styling outline-width instead of outline:

:focus:not(.focus-ring) {
    outline-width: none;
}

This allows overrides to restore user agent styles:

.override:focus {
    outline-width: medium;
}

Browser vendor feedback

Just wanted to put down some feedback we've received while discussing :focus-ring with other implementors. We were having these discussions over email but I realized it'd be better if they were here on GitHub so there's a record. Maybe we should add this to the explainer at some point? Anyway, here's a brief recap:

Mozilla

They mentioned that they already have :focus-ring in the form of :moz-focusring which they could unprefix at any point.

Safari

No word on feelings toward :focus-ring. Though they did mention that Apple.com uses a technique to differentiate between mouse and keyboard focus and selectively apply a class (similar to what the polyfill does). So I imagine they could replace that with :focus-ring if it existed.

Edge

Wondered if developers would need more fine grained control in order to support different modalities (eye gaze, voice input, etc). Mentioned MQL4 'pointer' query. Alice suggested that those modalities could still fall into the bucket of matching :focus-ring. It'd be up to the browser to decide.

Edge also mentioned :hover and :active might also want to provide different behavior depending on input modality. Wondered if there was a missing primitive possibly around detecting input modality.

Were concerned that if authors already disable :focus, what would stop them from also disabling :focus-ring? Alice mentioned that we think most folks disable :focus because it shows focus indicators indiscriminately, and if they had more control (via :focus-ring), this would resolve that issue.

cc @boggydigital, @travisleithead, @dbolter, @cookiecrook, @alice to make sure I captured everyone's positions accurately. BTW thank you all for taking the time to discuss this with us 😊

When to match :focus-ring:?

Currently we model the behaviour of <button>, which (in Chrome) shows a focus ring when it receives focus after a keyboard event, or when a key is pressed while it is focused.

Another option would be to show a focus ring only when focus is received from a keyboard event. This would be a break from existing behaviour, but may be input into browsers' eventual decision of what behaviour to model.

Create a test page for different browser behaviors

Adding a todo for myself.

It would be useful to have a page with as many focusable elements as we can get on it so we can easily look at the expected focus ring behavior in different browsers. Some users mentioned that removing the focus ring when a user clicks a button on windows would actually change the expected behavior (apparently windows leaves the ring in place for mouse clicks?)

Could maybe repurpose the demo page for this.

Should :focus-visible match when returning focus or programmatically focusing?

When a user closes a modal, focus is programmatically returned to the previously focused element. For example, this is the case when using react-modal.

In this case, should :focus-ring apply to the focussed element or not?

I guess the same question applies to anytime when an element is focussed programmatically.

My guess is that, if the element that focus is returning to had :focus-ring when it was initially focussed, it should also have :focus-ring when focus is returned.

How do we handle .focus()?

I don't think we currently have a way to handle calling .focus() on an element that should self apply focus-ring

Progressive Enhancement recommendation

Hello :) Great work on this!

I'm wondering if you'd be interested in including another example in the demo/docs that demonstrated a progressive enhancement approach where we 'detect' JS and if it is 'present' we kill outlines.

If JS fails or there is an error, no elements will have focus rings.

I've created an example of this for review.

When window regains focus, focus-ring class should reapplied to the focused element

To repro:

  1. Use the keyboard to focus a button and apply .focus-ring to it.
  2. Switch a different tab/window.
  3. Return to the original tab/window.

Expect: Since the originally button still has focus, and the focus was obtained via the keyboard, the focus ring should be reapplied to it. This is what happens when focus-ring.js isn't used.

Actual: The focus ring is lost.

As a general rule, an element's focus ring is dropped if the window itself loses focus, but restored if/when the window regains focus. In the repro sequence above, a standard button (without using focus-ring.js) will end up showing a focus ring at the end of step #3.

This useful behavior helps keyboard users reacquire the focused element when returning to a previously-used window.

Optionally scope focus-ring to a specific DOM node

For projects that are just standalone libraries/components, it might be beneficial to be able to scope the focus-ring JS to just a specific DOM node rather than the entire body. This would allow these components to use focus-ring without inadvertently modifying other parts of the parent application.

If the team thinks that this is worth doing, I'd be happy to submit a PR.

Discrepancy between master and gh-pages branch

This repo has two branches, master and gh-pages. I'm assuming gh-pages is the correct one to use as this is the 'default' in the GH interface.

Hit an issue with this setup when sticking the bare repo URL into bower. This clones the master rather than the gh-pages branch.. and the master branch seems to have issues, notably the naming of isHandlingKeyboardThrottle / keyboardThrottleTimeoutID.

Error in browser: Uncaught ReferenceError: isHandlingKeyboardThrottle is not defined at HTMLBodyElement.onKeyDown (focus-ring.js:87)

See https://github.com/WICG/focus-ring/blob/7ff067a8164f4d2db8ebbb0da5c5d3cdb005096d/src/focus-ring.js#L86

Why capture mode for the keydown event listener?

Just curious why capture mode is used when binding the keydown event listener? (e.g. document.body.addEventListener('keydown', onKeyDown, true);). Makes sense for the focus and blur events as those do not bubble, but keydown does.

Issues with proper focus styles on selects in Chrome

First of all, thank you for all the work you are doing! It is so nice to see work being put into making the creation of accessible user interfaces more accessible!

I have stumbled upon an issue with the demo in Chrome (Version 61.0.3163.100 (Official Build) (64-bit) on OSX).

The problem

The demo currently leaves the multi-select and the select with a size attribute without any visual focus clues in Chrome. When tabbing to the elements no outline is visible.

The focus works in Firefox and Safari on OSX. Firefox uses the subtle dotted focus around the first item in the select and Safari uses the regular (although slightly thinner) outline around the entire select.

Potential cause

The current implementation relies on outline-width: 0 instead of outline: none. This seems to have some nice benefits in terms of what needs to be handled by the polyfill (e.g. buttons, selects and radio arrow keys all just work since the outline-width: 0 doesn't affect them for some reason). However for select elements with a multiple or a size attribute the outline is all of a sudden removed (See http://jsbin.com/motuhiwoye/edit?html,css,output).

Possible solution

One possible solution could be to handle all focusable elements the same by adding .focus-ring explicitly. This way outline: none could be used instead of outline-width: 0. That would of course make it impossible to recover the initial browser outline styling, but that might be okay since users can always design their own escape hatches. Also that would then add the need for handling more situations (key navigation and more elements) but I can see those scenarios are already being discussed in other issues (#54).

I hope this is helpful. Please let me know if there is anything else I need to do (add examples, create a PR, etc...). Once again thank you for the great work!

What's the impact on users with low vision or cognitive impairments?

Having different focus indicators for mouse and keyboard users is going to be very confusing. More specifically for users with low vision or cognitive impairments or learning disabilities. It is very problematic. Focus indicators need to be presented in a consistent way.

I think there are several usability and accessibility issues with most of the demoed options here.

Common WCAG 2.0 AA failures include:
Common Failures for SC 2.4.7
F55: 2.1.1, 2.4.7, and 3.2.1 due to using script to remove focus when focus is received.
F78: Failure of Success Criterion 2.4.7 due to styling element outlines and borders in a way that removes or renders non-visible the visual focus indicator

Check more keys that just `Tab` to determine if in keyboard mode

I am using this polyfill on a project with a couple of modal dialogs that can be triggered from different parts of the app. Whenever I close such a dialog via the Enter or Escape key focus is reset to the original place manually via .focus().

Unfortunately the .focus-ring class does not seem to be added, because only the Tab key is considered when setting the hadKeyboardEvent.

Would it make sense to add more keys like Enter, Escape and Space and Arrows?
I already tried this in my project and it seems to be fine.

I can create a PR for this.

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.