<!DOCTYPE html>
<html>

<head>
  <link href="//cdn.jsdelivr.net/picnicss/4.1.1/picnic.min.css" rel="stylesheet">
  <link rel="stylesheet" href="style.css">
  <meta charset="utf-8">
  <title>Mag.JS</title>
</head>

<body>

  <nav>
    <h1>Hello Mag.JS!</h1>
    <a target="_tab" href="https://github.com/magnumjs/mag.js">GitHub</a>
  </nav>

  <article class="card">
    <header>
      <h2>Phone Gallery</h2>
    </header>

    <footer>

      <phone-list id="app">
        <div class="container-fluid">
          <div class="row">
            <div class="col-md-2 third">
              <!--Sidebar content-->
              <p>
                Search:
                <input name="searchText">
              </p>
              <p>
                Sort by:
                <select name="orderBy">
                  <option value="name">Alphabetical</option>
                  <option value="age">Newest</option>
                </select>
              </p>

            </div>
            <div class="col-md-10">
              <!--Body content-->
              <ul class="phones">
                <li>
                  <span>MOTOROLA XOOM™</span>
                  <p>The Next, Next Generation tablet.</p>
                </li>
              </ul>

            </div>
          </div>
        </div>
      </phone-list>

    </footer>
  </article>


  <script src="//rawgit.com/magnumjs/mag.js/master/mag-latest.min.js"></script>
  <script src="//rawgit.com/magnumjs/mag.js/master/dist/mag.addons.0.22.min.js"></script>

  <script src="app.js"></script>

</body>

</html>
var app = {}

app.controller = function() {

  this.phones = [{
    name: 'Nexus S',
    snippet: 'Fast just got faster with Nexus S.',
    age: 1
  }, {
    name: 'Motorola XOOM™ with Wi-Fi',
    snippet: 'The Next, Next Generation tablet.',
    age: 2
  }, {
    name: 'MOTOROLA XOOM™',
    snippet: 'The Next, Next Generation tablet.',
    age: 3
  }];

  this.searchText = '';

  this.input = this.select = {
    _oninput: mag.noop
  }
  this.orderBy = 'age';

  this.searchFor = (phone) => {
    if (this.searchText) {
      return ~phone.name.indexOf(this.searchText) || ~phone.snippet.indexOf(this.searchText)
    }
    return 1;
  }

  this.sortByAge = (a, b) => {
    return parseFloat(a.age) - parseFloat(b.age);
  }

  this.sortByName = (a, b) => {
    if (a.name < b.name) return -1;
    if (a.name > b.name) return 1;
    return 0;
  }

}

app.view = function(state) {

  state.li = state.phones
    .filter(state.searchFor)
    .sort(state.orderBy == 'age' ? state.sortByAge : state.sortByName)
    .map(function(phone) {
      return {
        span: phone.name,
        p: phone.snippet
      }
    })

}

mag.module("app", app)
li:empty,
.hide {
  display: none;
}

a {
  display: block;
}

a:after {
  content: " \bb";
}

.mainButton {
  font-size: 1.5em;
}

nav a {
  float: right;
  margin-top: -50px;
}

body {
  background: #fff;
  text-align: left;
  width: 90%;
  max-width: 960px;
  margin: 0 auto;
  padding: 20px 0 0;
}

nav {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: 3em;
  padding: 0 .6em;
  background: #fff;
  box-shadow: 0 0 0.2em rgba(17, 17, 17, 0.2);
  z-index: 10000;
  transition: all .3s;
  transform-style: preserve-3d;
}

header {
  font-weight: bold;
  position: relative;
  border-bottom: 1px solid #eee;
  padding: .6em .8em;
}

footer {
  padding: .8em;
}

article {
  top: 100px;
}

.card {
  max-width: 100%;
  display: block;
  position: relative;
  box-shadow: 0;
  border-radius: .2em;
  border: 1px solid #ccc;
  overflow: hidden;
  text-align: left;
  background: #fff;
  margin-bottom: .6em;
  padding: 6px;
  transition: all .3s ease;
}
#Mag.JS

## plunk boilerplate of "Things"

Basic Mag.JS boilerplate to count and create a list of things dynamically.


From: https://docs.angularjs.org/tutorial/step_06