Coder Social home page Coder Social logo

ui-layout's Introduction

UI.Layout directive Build Status

This directive allows you to split stuff ! Holy grail demo

Requirements

  • AngularJS

NOTE : if you use IE<=9, iOS<7 or Android<4 please include the requestAnimationFrame polyfill in your application.

NOTE : version 1.x is only compatible with IE>=10. If you use IE<=9 you need to use version 0.x

Installing

Browserify/WebPack

npm install --save angular-ui-layout

module.exports of index.js is the string 'ui.layout' so you can include it as such:

angular.module('myApp', [require('angular-ui-layout')]);
bower install angular-ui-layout\#bower
# or
bower install angular-ui-layout\#v0.0.0
# or
bower install angular-ui-layout\#src0.0.0

This will copy the UI.Layout files into a bower_components folder, along with its dependencies. Load the script files in your application:

<link rel="stylesheet" type="text/css" href="bower_components/angular-ui-layout/ui-layout.css"/>
<!-- ... -->
<script type="text/javascript" src="bower_components/raf/index.js"></script>
<script type="text/javascript" src="bower_components/angular-ui-layout/ui-layout.js"></script>

Add the UI.Layout module as a dependency to your application module:

var myAppModule = angular.module('MyApp', ['ui.layout']);

Usage

Add the directive like so:

<div ui-layout="{ flow : 'row' }"></div>
or
<ui-layout options="{ flow : 'row' }"></ui-layout>

If using a layout-container with ng-repeat, make sure to include a track by clause to the repeat, typically with $index:

<div ui-layout="{flow : 'column'}" class="maincontainer" >
  <div ui-layout-container ng-repeat="item in items track by $index"></div>
</div>

Options

flow

Type: String Default: 'row' flow: row | column

A fake flex-direction property. It specifies how the child elements are placed in the layout container, by setting the direction of the flex container's main axis. This determines the direction that child elements are laid out in.

dividerSize

Type: Integer Default: 10

The size in pixels that you want the divider/splitbar to be. Set to 0 to hide the splitbar, which in turn prevents user resizing the surrounding containers.

disableToggle

Type: Boolean Default: false

Set to true if you don't want the toggle arrows appearing in the splitbar.

disableMobileToggle

Type: Boolean Default: false

Like disableToggle above but only removes the arrows on mobile devices (max-device-width: 480px).

Child Attributes

uiLayoutContainer

Required on all child elements of the ui-layout element.

<div ui-layout>
    <div ui-layout-container></div>    
    <div ui-layout-container></div>    
</div>

Options

A string value 'central' can be passed to the directive:

<div ui-layout>
    <div ui-layout-container></div>    
    <div ui-layout-container="central"></div>    
    <div ui-layout-container></div>    
</div>

The 'central' container takes up all the remaining space during resizing, regardless of previous state, e.g. after splitbar drag.

collapsed [collapsed]

Type: boolean

<div ui-layout>
    <div ui-layout-container collapsed="true"></div>    
    <div ui-layout-container collapsed="layout.mycontainer"></div>    
</div>

Controls collapsed state of the container. Application can store the state of the layout e.g. like so:

$scope.layout {
  toolbar: true,
  leftSidebar: false,
  mycontainer: false
}

Changing those values will toggle container. See also [ui.layout.toggle][event-toggle].

size

Type: String

Sets the default placement of the splitbar.

pixels
<div ui-layout>
    <div ui-layout-container size="100px"></div>
</div>

percentage
<div ui-layout>
    <div ui-layout-container size="10%"></div>
</div>

minSize

Type: String Default: '8px'

Specifices the minimum size the child element can be set to. Defaults to the width of the splitbar if no value is provided.

pixels
<div ui-layout>
    <div ui-layout-container min-size="100px"></div>
</div>

percentage
<div ui-layout>
    <div ui-layout-container min-size="10%"></div>
</div>

maxSize

Type: String

Specifices the maxium size the child element can be set to.

pixels
<div ui-layout>
    <div ui-layout-container max-size="100px"></div>
</div>

percentage
<div ui-layout>
    <div ui-layout-container max-size="10%"></div>
</div>

Events

Events are broadcast on the scope where ui-layout is attached. This means they are available to any controller inside of a ui-layout container.

ui.layout.loaded

Returns: string or null

Dispatched when the layout container finished loading. It returns the value of the attribute, e.g. ui-layout-loaded="my-loaded-message", or null. The null also means that the layout has finished collapsing all the containers that should be collapsed (per application request when setting the [collapsed][collapsed] attribute).

Collapsing container on application load currently goes through these steps:

  1. layout is first loaded with all containers uncollapsed (disregarding user set values), then
  2. containers are collapsed either:
  • automatically: application has not set a string return value for the ui.layout.loaded event.
  • manually: application sets collapsed flags in the callback passed to ui.layout.loaded

All this means that the user will notice a flicker. If the flicker is not desirable, hide the layout behind an overlay, wait for the ui.layout.loaded event. In the "automatic" mode, all is done and the layout should be presentable. In the "manual" mode it is up to the application to count the ui.layout.toggle events.

<div id="main-container" ui-layout ui-layout-loaded>
    <div ui-layout-container>
      <div ui-layout ui-layout-loaded="child-container">
          <div ui-layout-container>
          
          </div>
      </div>
    </div>
</div>
$scope.$on('ui.layout.loaded', function(evt, id) => {
  switch (id) {
    case 'main-container':
      ...
      break;
    case 'child-container':
      ...
      break;
    default:
      break;
  }
});

Note: the value of the attribute is not evaluated, so:

$scope.layout = {
  mySidebar: {someKey: 'some value'}
}

<div id='my-sidebar' ui-layout ui-layout-loaded="layout.mySidebar.someKey"></div>
// $scope.$on will receive the string 'layout.mySidebar.someKey'

ui.layout.toggle [event-toggle]

Dispatched when a container is opened or closed. Element can be identified container.id, which is the same as element.id if provided, otherwise it is null.

$scope.$on('ui.layout.toggle', function(e, container){
  if ( container.size > 0 ){
     console.log('container is open!');
  }
});

Manually toggling (clicking the arrow button on the splitbar) will not update the collapsed attribute. If the application is using the collapsed attribute of ui-layout-container to programmatically control the collapsed state, the application should update it's state when this event occurs to stay in sync with the UI.

ui.layout.resize

Dispatched as a splitbar is dragged, debounced to occur only every 50ms.

$scope.$on('ui.layout.resize', function(e, beforeContainer, afterContainer){});

Testing

We use Karma and jshint to ensure the quality of the code. The easiest way to run these checks is to use grunt:

npm install -g gulp
npm install && bower install
gulp

The karma task will try to open Firefox and Chrome as browser in which to run the tests. Make sure this is available or change the configuration in test\karma-jqlite.conf.js and test\karma-jquery.conf.js

Some test tasks :

  • gulp karma : Will run jqlite and jquery tests in simple run mode,
  • gulp karma:jqlite:unit : Will run jqlite tests in simple run mode,
  • gulp karma:jquery:unit : Will run jquery tests in simple run mode,
  • gulp karma:jqlite:watch : Will run jqlite tests and watch for changes,
  • gulp karma:jquery:watch : Will run jquery tests and watch for changes,

** gulp serve runs and watches all**

ui-layout's People

Contributors

0x-r4bbit avatar aaronroberson avatar agdude avatar bobbiebarker avatar danielpquinn avatar darabos avatar douglasduteil avatar ebuildy avatar grantharris avatar hamxiaoz avatar ianjennings avatar jbro-io avatar maxkorp avatar nateabele avatar neilrees avatar peterdavehello avatar petrsimon avatar pheonixblade9 avatar realtica avatar somekittens avatar srguiwiz avatar stephanealie avatar whummer avatar widmoser avatar yanivefraim 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ui-layout's Issues

bounded size attribute does not work

Hello all,

maybe I'm wrong with something but I wonder about not working directive if I try to set "size" with an bounded size attribute . Have a look here:
http://plnkr.co/fDuGbBxpc7He5wlgBPXe

If you replace the lines with {{sizeA}} or {{sizeB}} with the commented lines you will see a working layout.

What can I do to get it to run? I'm happy aboaut any hint.

Thank you in advance and bb

Wendelin

Contributing: Browser support

So I have a fix for the overlapping issue #21, and am working on an implementation of #4.

The problem is, my fix for #21 involves the use of css calc. It works fine and passes the (modified for the new values) tests, with one caveat: It blows up for phantom js. Turns out that the webkit used by phantomjs doesnt support calc. This lead me on a search which shows that opera mini doesnt either. I can add fallbacks (although I could use a hand figuring out what to fall back to). This leads me to my question.

Are there any sort of browser support requirements? It seems the current version of everything other than opera mini should work, and it works back to ie8.

It seems that theres no formal support list. I know the modal in ui-bootstrap had issues within the last year (not sure if they still exist) with opera mini for what I suspect are the same reasons.

Do I need to find an alternate solution? Or is this an acceptable loss?

directive not working on Internet Explorer 9 and older browsers

Hi,
This is a great library but it uses window.requestanimationframe which is not supported in all browsers

Check http://caniuse.com/#feat=requestanimationframe

I would suggest using requestanimationframe like mentioned @ http://stackoverflow.com/questions/5605588/how-to-use-requestanimationframe

I was able to make this directive by making it use window.setTimeout if window.requestAnimationFrame is not available. Like :

// Animate the page outside the event
if(window.requestAnimationFrame)
animationFrameRequested = window.requestAnimationFrame(_draw) ;
else
animationFrameRequested = window.setTimeout(_draw, 1000 / 60);

Can I commit the fix or you can do the fix and rev the version.

Thanks
Ankit

The splitbar position defaults to middle on page load

I was using Jquery's UI Layout plugin initially and recently started using angular and so the ui layout directive . In Jquery's UI Layout the resizer (the splitbar) once repositioned does not change on page reload . Unlike this in ui-layout directive we move the splitbar according to our convenience refresh the page and then splitbar will come back to its initial position .

pass options: sizes through angualr templates for device detection cutomization

I am looking for an easy way to customize the layout panes sizes through templates.
$scope.rightPaneSize = "{ flow : 'column', sizes: ['60%'] }";

The working syntax is : options="{ flow : 'column', sizes: ['40%'] }"
My result is: options=" '{ flow : 'column', sizes: ['40%'] }' "

What would be the right way to get it working?

trigger window resize from extenal component

My UI is using a CSS transition to init the UI, going from a CSS scroller to the UI interface with a slide down CSS transition. When it comes to height, the ui is initially at zero and it is revealed afterward ounce the loading scroller is done. This causes ui-layout issue since the column horizontal inner splitter is not set properly at 50%. It remains at the top instead. It works properly when I resize the window manually. But, I cannot trigger the resize ui-layout resize event with $(window).trigger('resize') from an external component.

Emit an event on resize

If you did a scope.$emit('resized') in _resize(), it would make it easy to implement arbitrary reactions to the new size.

Contributing

I was trying to use this plugin but it wasn't working as desired because it didn't take into consideration the offset of the parent element. I changed the first part of _cached_layout_values function to this:

      _cache.previousElement = {};
      _cache.previousElement.width = previousElement.getBoundingClientRect().width;
      _cache.previousElement.height = previousElement.getBoundingClientRect().height;
      _cache.previousElement.min = parseInt(previousElement.getAttribute('min-size'),10);
      _cache.previousElement.max = parseInt(previousElement.getAttribute('max-size'), 10);
      _cache.previousElement.left = previousElement.offsetLeft - previousElement.parentElement.offsetLeft;
      _cache.previousElement.top = previousElement.offsetTop - previousElement.parentElement.offsetTop;
      _cache.nextElement = {};
      _cache.nextElement.width = nextElement.getBoundingClientRect().width;
      _cache.nextElement.height = nextElement.getBoundingClientRect().height;
      _cache.nextElement.min = parseInt(nextElement.getAttribute('min-size'),10);
      _cache.nextElement.max = parseInt(nextElement.getAttribute('max-size'), 10);
      _cache.nextElement.left = nextElement.offsetLeft - nextElement.parentElement.offsetLeft;
      _cache.nextElement.top = nextElement.offsetTop - nextElement.parentElement.offsetTop;

End Position Not Correct When Dragging Splitbar

I noticed an issue while testing a fix for #52. The code doesn't seem to get (or maybe just doesn't correctly process) the last mouse event when dragging a splitbar.

To reproduce, look at the following Plunker:

http://plnkr.co/ijRt6M2ob5wZNG0bbxrj

Drag one of the splitbars quickly, and then stop moving, but don't release the mouse button. The position of the mouse and position of the splitbar will often be different. Then slightly move the mouse either up/down or left/right. The splitbar will jump to the current mouse location.

Status?

@ggoodman what's the deal with this? I have someone on IRC asking me about it. Also, what was the other project someone pointed out to us that has pretty much the same thing?

Handle splitters on tablet

I am very pleased with the desktop behavior so far.

I am testing on tablet with Chrome emulator and the splitters are not moving instead the whole UI does. Most likely an integration/configuration matter since I can see there is already some mobile events available.

What could be the configuration to disable the tablet defaults in order to trigger the desired behavior?

dividerSize dynamic sizing - panes not splitting

When I pass a dynamic value to teh divederSize option, the panes are not splitted although the value is present in the output, replace the dividerSize value with an hardCoded value and it works.

Output has no width, height, or panes value (width, left, top) value

By the way, ui-layout-container size="{{panes.sizes.splitTop}}" is working fine.

Thanks in advance for your reply.

Window.resize resets layout to initial positions

This is related to #13 & #39, but still a separate issue.

If the user adjusts the split of the panes, then resizes the windows, they jump back to their original percentages / sizes. I'm not sure if there's a clean solution to this, but it can be jarring.

window resize not resetting arrows

UI-layout is working erratically when resizing window ounce handle one arrow have been clicked on.

  1. Click to expand to full view horizontally or vertically
  2. Resize window

Handle reset to origins but click handle does not reset both arrows and handle is not moving anymore.
All arrows should then be visible.

Same issue with mouse scroll when both arrows are not present on the handle and the reset is not complete.

Splitting a div that may be longer than the window (North, East+/West+)?

I love the Holy Grail demo!

But... it assumes ui-layout will be used to partition the entire visible browser window.

Is there a way to use it to split a div that may continue beyond the window length? I'm able to get it to function within a div by using style="position:relative" on the parent of the ui-layout, but I don't see how to allow the vertical partitions to extend beyond the bottom of the browser (causing a scrollbar to appear for the entire window). Instead, each partition ends up with its own scrollbar, as needed ... which is ugly.

Think of this as North, East+, and West+, with East+ and West+ potentially longer than the window size.

Bower out of date

The code on bower is very much out of date compared to the current contents of this repo. Any chance you could push out a version bump?

A fake media query for responsive panes

I would like to apply different classes for different ranges of width/height of a pane. If I had the width attribute in scope I could do:

<div ui-layout>
  <div ng-class="{
    small: width < 100,
    medium: width > 100 && width < 400,
    large: width > 400
  }"></div>
</div>

But I don't have access to width which is internal to directive.

A better solution would be some sort of fake media query to make it easier to write such code. One solution could be this:

<div ui-layout>
  <div size-class="{
  small: { max: 100 }, 
  medium: {min: 100, max: 400},
  large: {min: 400}
  }"></div>
</div>

Above solution is vertical/horizontal independent and doesn't need exposing width

Parameterized Flow (Row/Column)

I've been looking in layout options for an upcoming product, and what you have so far is pretty slick. I agree with issue #3 ... the ability to set/persist width & height on each split is key.

Beyond that, I'd like a hook to parameterize the flow option... meaning a way to toggle the split from a Row to Column, and visa-versa. The link below takes you to an example showing how this could work.

http://plnkr.co/edit/igJXFGghO3eKHPQ23Jq2?p=preview

If you inspect the DOM, you'll see that the DOM elements are changing... but only the splitbar is updating.

Initial size of panes/position of splitbar is not always correct

Sometimes the splitbar is positioned such that the leftmost pane has size zero.

Here is a Plunker showing the issue. In this case it's combined with Angular bootstrap-ui's tabset and tab tags, but I've seen it without using these (couldn't manage to reproduce that simpler case just now though -- couldn't remember the combination of layout that caused it).

http://plnkr.co/wBoCHdMd3VNPYryE1URy

Notice that the leftmost splitbar is all the way to the left, even though there are min-size and size set for the div.

If you click on the splitbar and move it one pixel to the right, it will snap into place.

Debugging this a bit, it seems that tElement[0].offsetWidth is zero (the parent element's size) for some reason. I'm not that familiar with how/when layout sets this value.

Option to override chevron classes

Would be good to add option to override chevronLeft, chevronRight, chevronUp, chevronDown somehow. Mainly because some of us choose to use font-awesome or some other library instead of bootstrap glyphicons.

Doesn't work with jQuery

Hi!

Currently the library doesn't works when jQuery is loaded.
Dragging around the drawers doesn't work.

Drag position is calculated incorrectly when parent elements has margins/paddings and defined position

I've verified that the dragging position is affected by containers margins and paddings.
This can be verified in the following example:

<!DOCTYPE html>
<html style="height: 100%" ng-app="DemoApp">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="ui-layout.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.3/angular.js"></script>
    <script src="https://gist.githubusercontent.com/paulirish/1579671/raw/3d42a3a76ed09890434a07be2212f376959e616f/rAF.js"></script>
    <script src="https://raw.githubusercontent.com/angular-ui/ui-layout/master/src/ui-layout.js"></script>
    <script>
        angular.module("DemoApp", ["ui.layout"]);
    </script>
</head>
<body style="height: 100%; padding:0; width: 600px; margin: 0 auto; padding: 40px; box-sizing: border-box; ">
    <div style="height: 100%; position: relative; ">
        <div ui-layout="{ flow : 'column' }" style="height: 100%; " >

            <div style="height: 100%; background-color: #aaa;" ui-layout-container>
                Left content
            </div>

            <div style="height: 100%; background-color: #bbb;" ui-layout-container>

                <div ui-layout="{ flow : 'row' }" style="height: 100%; " >

                    <div style="height: 100%; background-color: #ccc;" ui-layout-container>
                        Right Up content
                    </div>

                    <div style="height: 100%; background-color: #ddd;" ui-layout-container>
                        Right Down content
                    </div>
                </div>

            </div>
        </div>
    </div>
</body>
</html>

I've checked that this is happening because mouseMoveHandler is using the mouse cursor position directly, without considering that one of parent elements could have the position defined (absolute or relative).

Nesting column layouts

I'm trying to create a layout that consists of two resizable panes and within one of them again two resizable panes.

|-----------------------------|----------|
| |---------|---------------| |          |
| |         |               | |          |
| |         |               | |          |
| |---------|---------------| |          |
|-----------------------------|----------|

I tried it like this, but this doesn't work:

    <div ui-layout="{flow: 'column'}" style="background: yellow">
      <div ui-layout-container style="background: grey">Two
        <div ui-layout="{flow: 'column'}" style="background: green">
          <div ui-layout-container style="background: aqua">A</div>
          <div ui-layout-container max-size="50%" size="15%" style="background: salmon">
            B
          </div>
        </div>
      </div>
      <div ui-layout-container max-size="50%" size="15%" style="background: salmon">
        three
      </div>
    </div>

If I remove the secondary ui-layout things get totally messed up.

Any idea if that's possible?

ui-layout doesn't work with minification/uglification

When building an app with ui-layout, if your build process passes through a minification step (mine uses uglifyify with browserify), the split views won't get initialized properly due to renaming of $window and LayoutContainer.

I've fixed this locally and will try to prepare a PR in the next few days. If any one else is coming across this in the meantime, you need to fix the directive declarations like this:

.directive('uiLayout', ['$window', function($window) {

.directive('uiSplitbar', ['LayoutContainer', function(LayoutContainer) {

.directive('uiLayoutContainer', ['LayoutContainer', function(LayoutContainer) {

Of course you will also need the closing square brackets at the end of each of these directive declarations like this:

}])

Publish to NPM

Currently if I want to grab ui-layout with an NPM install, I have to set it to the github path. This is small, but what makes it frustrating is that the releases that get tagged don't include a package.json, so you have to go dig on master and find the matching commit to a given version, and then set to that, rather than just referencing the tag. I know the package is on bower, but a lot of people don't feel like using 2 package managers for a project, especially if only one or two packages requires the second.

At minimum, it would be nice to include the package.json in the tagged build. Ideally, that tagged commit would also get published to NPM. I'll throw up a PR in a bit, but I wanted to see if anyone had any input.

Resize breaks if one of the panels has an ng-include

I have code similar to the following

    <div ui-layout="{flow : 'row'}">
        <div ui-layout="{flow : 'column'}" size="66%">
            <div>
                <!--contents-->
            </div>
            <div>
                <!--contents-->
            </div>
        </div>
        <!-- attention here -->
        <div ng-include="'detailsPanel.html'"></div>
    </div>

The link function ends up executing twice. Once in the state as described above. The second time, the div with the ng-include is missing (presumably so ng can replace it with the modified contents). this causes barElm.nextElementSibling to be null, and thereby the var nextElement. Inside _cached_layout_values, there are a few references to nextElement.getBoundingClientRect and nextElement.getAttribute that blow up, because nextElement is null. which brings the whole thing crashing down.

For now I've worked around it by nesting the ng-include in an additional div, but this seems superfluous if a fix is possible.

Manually include of stylesheet?

Hello,

I have to add this line manually to the index.html:

These lines:

<script src="bower_components/raf/index.js"></script> <script src="bower_components/angular-ui-layout/ui-layout.js"></script>

are added during the bower installation well. But the CSS include has to be added manually.

The height of nested row in row flow is not calculated correctly (scroll is shown)

This bug can be found:
http://plnkr.co/edit/ClUBztAgxWVa0UH58TPf?p=preview

The scroll is shown on the bottom right corner.

The code to reproduce:

<div ui-layout  >
  <div ui-layout-container class=" html-back" ></div>

  <div ui-layout-container> 
    <div ui-layout="{flow : 'column'}" >
      <div ui-layout-container class=" html-back" ></div>
      <div ui-layout-container >
          <div ui-layout  >
              <div ui-layout-container class=" html-back" ></div>
              <div ui-layout-container class=" html-back" ></div>
         </div>
      </div>
    </div>
  </div>
</div>

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.