├── package.json
├── fis-conf.js
├── readme.md
├── module
├── utils.js
├── footer.jsx
├── todoModel.js
└── todoItem.jsx
├── index.html
├── app.jsx
├── static
└── mod.js
└── learn.json
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "private": true,
3 | "dependencies": {
4 | "director": "^1.2.0",
5 | "react": "^0.13.3",
6 | "todomvc-app-css": "^1.0.0",
7 | "todomvc-common": "^1.0.1"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/fis-conf.js:
--------------------------------------------------------------------------------
1 | /* global fis */
2 |
3 | fis.config.set('modules.parser.jsx', 'babel');
4 | fis.config.set('modules.parser.js', 'babel');
5 | fis.config.set('roadmap.ext.jsx', 'js'); // .jsx => .js
6 |
7 | //jswrapper 用来自动封装 `define`
8 | //require-async 用来支持动态加载组件
9 | fis.config.set('modules.postprocessor.js', 'jswrapper,require-async');
10 | fis.config.set('roadmap.path', [
11 | {
12 | reg: '/module/**.jsx',
13 | isMod: true
14 | },
15 | {
16 | reg: '/module/**.js',
17 | isMod: true
18 | },
19 | {
20 | reg: '**.js',
21 | isES6: false
22 | }
23 | ]);
24 |
25 | fis.config.set('settings.postprocessor.jswrapper', {
26 | type: 'amd' //历史遗留问题,此处应该是 mod.js
27 | });
28 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | # React TodoMVC Example in fis
2 |
3 |
4 | > _[React - facebook.github.io/react](http://facebook.github.io/react)_
5 |
6 |
7 | ## 任务列表
8 |
9 | - [ ] 拆分 `css` 到组件
10 | - [ ] 添加组件合并支持,暂时需要把 `.jsx?` 都引入到页面
11 |
12 | ## 功能
13 |
14 | - 支持资源压缩、资源添加 md5 戳、自动替换加 cdn 等
15 | - 支持 ES6、JSX 预编译,不需要运行时转换
16 |
17 | ## 安装使用
18 |
19 | ### 安装解析 ES6、JSX 的插件
20 |
21 | ```
22 | npm install -g xiangshouding/fis-parser-babel
23 | npm install -g fis-postprocessor-require-async
24 | ```
25 |
26 | ### FIS 编译发布
27 |
28 | ```bash
29 | fis release
30 | ```
31 |
32 | ### 启动 FIS Server 进行查看
33 |
34 | ```bash
35 | fis server start --type node
36 | ```
37 | > fis server -h 更多参数,比如修改端口号或者其他
38 |
39 | > 可用其他的 Web 服务代替
--------------------------------------------------------------------------------
/module/utils.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | export var Utils = {
3 | uuid () {
4 | /*jshint bitwise:false */
5 | var i, random;
6 | var uuid = '';
7 |
8 | for (i = 0; i < 32; i++) {
9 | random = Math.random() * 16 | 0;
10 | if (i === 8 || i === 12 || i === 16 || i === 20) {
11 | uuid += '-';
12 | }
13 | uuid += (i === 12 ? 4 : (i === 16 ? (random & 3 | 8) : random))
14 | .toString(16);
15 | }
16 |
17 | return uuid;
18 | },
19 |
20 | pluralize (count, word) {
21 | return count === 1 ? word : word + 's';
22 | },
23 |
24 | store (namespace, data) {
25 | if (data) {
26 | return localStorage.setItem(namespace, JSON.stringify(data));
27 | }
28 |
29 | var store = localStorage.getItem(namespace);
30 | return (store && JSON.parse(store)) || [];
31 | },
32 |
33 | extend () {
34 | var newObj = {};
35 | for (var i = 0; i < arguments.length; i++) {
36 | var obj = arguments[i];
37 | for (var key in obj) {
38 | if (obj.hasOwnProperty(key)) {
39 | newObj[key] = obj[key];
40 | }
41 | }
42 | }
43 | return newObj;
44 | }
45 | };
46 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | React • TodoMVC
6 |
7 |
8 |
9 |
10 |
11 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/module/footer.jsx:
--------------------------------------------------------------------------------
1 | /*jshint quotmark:false */
2 | /*jshint white:false */
3 | /*jshint trailing:false */
4 | /*jshint newcap:false */
5 | /*global React */
6 |
7 |
8 |
9 | 'use strict';
10 |
11 | /**
12 | * @require ./utils.js
13 | */
14 | import {Utils} from "./utils.js";
15 |
16 | export var TodoFooter = React.createClass({
17 | render () {
18 | var activeTodoWord = Utils.pluralize(this.props.count, 'item');
19 | var clearButton = null;
20 |
21 | if (this.props.completedCount > 0) {
22 | clearButton = (
23 |
28 | );
29 | }
30 |
31 | // React idiom for shortcutting to `classSet` since it'll be used often
32 | var cx = React.addons.classSet;
33 | var nowShowing = this.props.nowShowing;
34 | return (
35 |
66 | );
67 | }
68 | });
69 |
--------------------------------------------------------------------------------
/module/todoModel.js:
--------------------------------------------------------------------------------
1 | /*jshint quotmark:false */
2 | /*jshint white:false */
3 | /*jshint trailing:false */
4 | /*jshint newcap:false */
5 |
6 | 'use strict';
7 |
8 | /**
9 | * @require ./utils.js
10 | */
11 | import {Utils} from "./utils.js";
12 |
13 | // Generic "model" object. You can use whatever
14 | // framework you want. For this application it
15 | // may not even be worth separating this logic
16 | // out, but we do this to demonstrate one way to
17 | // separate out parts of your application.
18 | export class TodoModel {
19 | constructor (key) {
20 | this.key = key;
21 | this.todos = Utils.store(key);
22 | this.onChanges = [];
23 | }
24 |
25 | subscribe (onChange) {
26 | this.onChanges.push(onChange);
27 | }
28 |
29 | inform () {
30 | Utils.store(this.key, this.todos);
31 | this.onChanges.forEach(function (cb) { cb(); });
32 | }
33 |
34 | addTodo (title) {
35 | this.todos = this.todos.concat({
36 | id: Utils.uuid(),
37 | title: title,
38 | completed: false
39 | });
40 |
41 | this.inform();
42 | }
43 |
44 | toggleAll (checked) {
45 | // Note: it's usually better to use immutable data structures since they're
46 | // easier to reason about and React works very well with them. That's why
47 | // we use map() and filter() everywhere instead of mutating the array or
48 | // todo items themselves.
49 | this.todos = this.todos.map((todo) => {
50 | return Utils.extend({}, todo, {completed: checked});
51 | });
52 |
53 | this.inform();
54 | }
55 |
56 | toggle (todoToToggle) {
57 | this.todos = this.todos.map((todo) => {
58 | return todo !== todoToToggle ?
59 | todo :
60 | Utils.extend({}, todo, {completed: !todo.completed});
61 | });
62 |
63 | this.inform();
64 | }
65 |
66 | destroy (todo) {
67 | this.todos = this.todos.filter((candidate) => {
68 | return candidate !== todo;
69 | });
70 |
71 | this.inform();
72 | }
73 |
74 | save (todoToSave, text) {
75 | this.todos = this.todos.map((todo) => {
76 | return todo !== todoToSave ? todo : Utils.extend({}, todo, {title: text});
77 | });
78 |
79 | this.inform();
80 | }
81 |
82 | clearCompleted () {
83 | this.todos = this.todos.filter((todo) => {
84 | return !todo.completed;
85 | });
86 |
87 | this.inform();
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/module/todoItem.jsx:
--------------------------------------------------------------------------------
1 | /*jshint quotmark: false */
2 | /*jshint white: false */
3 | /*jshint trailing: false */
4 | /*jshint newcap: false */
5 | /*global React */
6 |
7 |
8 |
9 |
10 | var ESCAPE_KEY = 27;
11 | var ENTER_KEY = 13;
12 |
13 | export var TodoItem = React.createClass({
14 | handleSubmit (event) {
15 | var val = this.state.editText.trim();
16 | if (val) {
17 | this.props.onSave(val);
18 | this.setState({editText: val});
19 | } else {
20 | this.props.onDestroy();
21 | }
22 | },
23 |
24 | handleEdit () {
25 | this.props.onEdit();
26 | this.setState({editText: this.props.todo.title});
27 | },
28 |
29 | handleKeyDown (event) {
30 | if (event.which === ESCAPE_KEY) {
31 | this.setState({editText: this.props.todo.title});
32 | this.props.onCancel(event);
33 | } else if (event.which === ENTER_KEY) {
34 | this.handleSubmit(event);
35 | }
36 | },
37 |
38 | handleChange (event) {
39 | this.setState({editText: event.target.value});
40 | },
41 |
42 | getInitialState () {
43 | return {editText: this.props.todo.title};
44 | },
45 |
46 | /**
47 | * This is a completely optional performance enhancement that you can
48 | * implement on any React component. If you were to delete this method
49 | * the app would still work correctly (and still be very performant!), we
50 | * just use it as an example of how little code it takes to get an order
51 | * of magnitude performance improvement.
52 | */
53 | shouldComponentUpdate (nextProps, nextState) {
54 | return (
55 | nextProps.todo !== this.props.todo ||
56 | nextProps.editing !== this.props.editing ||
57 | nextState.editText !== this.state.editText
58 | );
59 | },
60 |
61 | /**
62 | * Safely manipulate the DOM after updating the state when invoking
63 | * `this.props.onEdit()` in the `handleEdit` method above.
64 | * For more info refer to notes at https://facebook.github.io/react/docs/component-api.html#setstate
65 | * and https://facebook.github.io/react/docs/component-specs.html#updating-componentdidupdate
66 | */
67 | componentDidUpdate (prevProps) {
68 | if (!prevProps.editing && this.props.editing) {
69 | var node = React.findDOMNode(this.refs.editField);
70 | node.focus();
71 | node.setSelectionRange(node.value.length, node.value.length);
72 | }
73 | },
74 |
75 | render() {
76 | return (
77 |
81 |
82 |
88 |
91 |
92 |
93 |
101 |
102 | );
103 | }
104 | });
105 |
--------------------------------------------------------------------------------
/app.jsx:
--------------------------------------------------------------------------------
1 | /*jshint quotmark:false */
2 | /*jshint white:false */
3 | /*jshint trailing:false */
4 | /*jshint newcap:false */
5 | /*global React, Router*/
6 |
7 | import {TodoFooter} from "./module/footer.jsx";
8 | import {TodoItem} from "./module/todoItem.jsx";
9 | import {TodoModel} from "./module/todoModel.js";
10 |
11 | var app = app || {};
12 |
13 | (function () {
14 | 'use strict';
15 |
16 | app.ALL_TODOS = 'all';
17 | app.ACTIVE_TODOS = 'active';
18 | app.COMPLETED_TODOS = 'completed';
19 |
20 | var ENTER_KEY = 13;
21 |
22 | var TodoApp = React.createClass({
23 | getInitialState () {
24 | return {
25 | nowShowing: app.ALL_TODOS,
26 | editing: null
27 | };
28 | },
29 |
30 | componentDidMount () {
31 | var setState = this.setState;
32 | var router = Router({
33 | '/': setState.bind(this, {nowShowing: app.ALL_TODOS}),
34 | '/active': setState.bind(this, {nowShowing: app.ACTIVE_TODOS}),
35 | '/completed': setState.bind(this, {nowShowing: app.COMPLETED_TODOS})
36 | });
37 | router.init('/');
38 | },
39 |
40 | handleNewTodoKeyDown (event) {
41 | if (event.keyCode !== ENTER_KEY) {
42 | return;
43 | }
44 |
45 | event.preventDefault();
46 |
47 | var val = React.findDOMNode(this.refs.newField).value.trim();
48 |
49 | if (val) {
50 | this.props.model.addTodo(val);
51 | React.findDOMNode(this.refs.newField).value = '';
52 | }
53 | },
54 |
55 | toggleAll (event) {
56 | var checked = event.target.checked;
57 | this.props.model.toggleAll(checked);
58 | },
59 |
60 | toggle (todoToToggle) {
61 | this.props.model.toggle(todoToToggle);
62 | },
63 |
64 | destroy (todo) {
65 | this.props.model.destroy(todo);
66 | },
67 |
68 | edit (todo) {
69 | this.setState({editing: todo.id});
70 | },
71 |
72 | save (todoToSave, text) {
73 | this.props.model.save(todoToSave, text);
74 | this.setState({editing: null});
75 | },
76 |
77 | cancel () {
78 | this.setState({editing: null});
79 | },
80 |
81 | clearCompleted () {
82 | this.props.model.clearCompleted();
83 | },
84 |
85 | render () {
86 | var footer;
87 | var main;
88 | var todos = this.props.model.todos;
89 |
90 | var shownTodos = todos.filter((todo) => {
91 | switch (this.state.nowShowing) {
92 | case app.ACTIVE_TODOS:
93 | return !todo.completed;
94 | case app.COMPLETED_TODOS:
95 | return todo.completed;
96 | default:
97 | return true;
98 | }
99 | }, this);
100 |
101 | var todoItems = shownTodos.map((todo) => {
102 | return (
103 |
113 | );
114 | }, this);
115 |
116 | var activeTodoCount = todos.reduce((accum, todo) => {
117 | return todo.completed ? accum : accum + 1;
118 | }, 0);
119 |
120 | var completedCount = todos.length - activeTodoCount;
121 |
122 | if (activeTodoCount || completedCount) {
123 | footer =
124 | ;
130 | }
131 |
132 | if (todos.length) {
133 | main = (
134 |
145 | );
146 | }
147 |
148 | return (
149 |
150 |
160 | {main}
161 | {footer}
162 |
163 | );
164 | }
165 | });
166 |
167 | var model = new TodoModel('react-todos');
168 |
169 | function render() {
170 | React.render(
171 | ,
172 | document.getElementById('todoapp')
173 | );
174 | }
175 |
176 | model.subscribe(render);
177 | render();
178 | })();
179 |
--------------------------------------------------------------------------------
/static/mod.js:
--------------------------------------------------------------------------------
1 | /**
2 | * file: mod.js
3 | * ver: 1.0.11
4 | * update: 2015/05/14
5 | *
6 | * https://github.com/fex-team/mod
7 | */
8 | var require, define;
9 |
10 | (function(global) {
11 | if (require) return; // 避免重复加载而导致已定义模块丢失
12 |
13 | var head = document.getElementsByTagName('head')[0],
14 | loadingMap = {},
15 | factoryMap = {},
16 | modulesMap = {},
17 | scriptsMap = {},
18 | resMap = {},
19 | pkgMap = {};
20 |
21 | function createScript(url, onerror) {
22 | if (url in scriptsMap) return;
23 | scriptsMap[url] = true;
24 |
25 | var script = document.createElement('script');
26 | if (onerror) {
27 | var tid = setTimeout(onerror, require.timeout);
28 |
29 | script.onerror = function() {
30 | clearTimeout(tid);
31 | onerror();
32 | };
33 |
34 | function onload() {
35 | clearTimeout(tid);
36 | }
37 |
38 | if ('onload' in script) {
39 | script.onload = onload;
40 | } else {
41 | script.onreadystatechange = function() {
42 | if (this.readyState == 'loaded' || this.readyState == 'complete') {
43 | onload();
44 | }
45 | }
46 | }
47 | }
48 | script.type = 'text/javascript';
49 | script.src = url;
50 | head.appendChild(script);
51 | return script;
52 | }
53 |
54 | function loadScript(id, callback, onerror) {
55 | var queue = loadingMap[id] || (loadingMap[id] = []);
56 | queue.push(callback);
57 |
58 | //
59 | // resource map query
60 | //
61 | var res = resMap[id] || resMap[id + '.js'] || {};
62 | var pkg = res.pkg;
63 | var url;
64 |
65 | if (pkg) {
66 | url = pkgMap[pkg].url;
67 | } else {
68 | url = res.url || id;
69 | }
70 |
71 | createScript(url, onerror && function() {
72 | onerror(id);
73 | });
74 | }
75 |
76 | define = function(id, factory) {
77 | id = id.replace(/\.js$/i, '');
78 | factoryMap[id] = factory;
79 |
80 | var queue = loadingMap[id];
81 | if (queue) {
82 | for (var i = 0, n = queue.length; i < n; i++) {
83 | queue[i]();
84 | }
85 | delete loadingMap[id];
86 | }
87 | };
88 |
89 | require = function(id) {
90 |
91 | // compatible with require([dep, dep2...]) syntax.
92 | if (id && id.splice) {
93 | return require.async.apply(this, arguments);
94 | }
95 |
96 | id = require.alias(id);
97 |
98 | var mod = modulesMap[id];
99 | if (mod) {
100 | return mod.exports;
101 | }
102 |
103 | //
104 | // init module
105 | //
106 | var factory = factoryMap[id];
107 | if (!factory) {
108 | throw '[ModJS] Cannot find module `' + id + '`';
109 | }
110 |
111 | mod = modulesMap[id] = {
112 | exports: {}
113 | };
114 |
115 | //
116 | // factory: function OR value
117 | //
118 | var ret = (typeof factory == 'function') ? factory.apply(mod, [require, mod.exports, mod]) : factory;
119 |
120 | if (ret) {
121 | mod.exports = ret;
122 | }
123 | return mod.exports;
124 | };
125 |
126 | require.async = function(names, onload, onerror) {
127 | if (typeof names == 'string') {
128 | names = [names];
129 | }
130 |
131 | var needMap = {};
132 | var needNum = 0;
133 |
134 | function findNeed(depArr) {
135 | for (var i = 0, n = depArr.length; i < n; i++) {
136 | //
137 | // skip loading or loaded
138 | //
139 | var dep = require.alias(depArr[i]);
140 |
141 | if (dep in factoryMap) {
142 | // check whether loaded resource's deps is loaded or not
143 | var child = resMap[dep] || resMap[dep + '.js'];
144 | if (child && 'deps' in child) {
145 | findNeed(child.deps);
146 | }
147 | continue;
148 | }
149 |
150 | if (dep in needMap) {
151 | continue;
152 | }
153 |
154 | needMap[dep] = true;
155 | needNum++;
156 | loadScript(dep, updateNeed, onerror);
157 |
158 | var child = resMap[dep] || resMap[dep + '.js'];
159 | if (child && 'deps' in child) {
160 | findNeed(child.deps);
161 | }
162 | }
163 | }
164 |
165 | function updateNeed() {
166 | if (0 == needNum--) {
167 | var args = [];
168 | for (var i = 0, n = names.length; i < n; i++) {
169 | args[i] = require(names[i]);
170 | }
171 |
172 | onload && onload.apply(global, args);
173 | }
174 | }
175 |
176 | findNeed(names);
177 | updateNeed();
178 | };
179 |
180 | require.resourceMap = function(obj) {
181 | var k, col;
182 |
183 | // merge `res` & `pkg` fields
184 | col = obj.res;
185 | for (k in col) {
186 | if (col.hasOwnProperty(k)) {
187 | resMap[k] = col[k];
188 | }
189 | }
190 |
191 | col = obj.pkg;
192 | for (k in col) {
193 | if (col.hasOwnProperty(k)) {
194 | pkgMap[k] = col[k];
195 | }
196 | }
197 | };
198 |
199 | require.loadJs = function(url) {
200 | createScript(url);
201 | };
202 |
203 | require.loadCss = function(cfg) {
204 | if (cfg.content) {
205 | var sty = document.createElement('style');
206 | sty.type = 'text/css';
207 |
208 | if (sty.styleSheet) { // IE
209 | sty.styleSheet.cssText = cfg.content;
210 | } else {
211 | sty.innerHTML = cfg.content;
212 | }
213 | head.appendChild(sty);
214 | } else if (cfg.url) {
215 | var link = document.createElement('link');
216 | link.href = cfg.url;
217 | link.rel = 'stylesheet';
218 | link.type = 'text/css';
219 | head.appendChild(link);
220 | }
221 | };
222 |
223 |
224 | require.alias = function(id) {
225 | return id.replace(/\.js$/i, '');
226 | };
227 |
228 | require.timeout = 5000;
229 |
230 | })(this);
231 |
--------------------------------------------------------------------------------
/learn.json:
--------------------------------------------------------------------------------
1 | {
2 | "angularjs": {
3 | "name": "AngularJS",
4 | "description": "HTML is great for declaring static documents, but it falters when we try to use it for declaring dynamic views in web-applications. AngularJS lets you extend HTML vocabulary for your application. The resulting environment is extraordinarily expressive, readable, and quick to develop.",
5 | "homepage": "angularjs.org",
6 | "examples": [{
7 | "name": "Example",
8 | "url": "examples/angularjs"
9 | }, {
10 | "name": "Example",
11 | "url": "examples/angularjs_require"
12 | }, {
13 | "name": "AngularJS Optimized",
14 | "url": "examples/angularjs-perf"
15 | }, {
16 | "name": "TypeScript & AngularJS",
17 | "url": "examples/typescript-angular"
18 | }, {
19 | "name": "Google Cloud Platform + Express",
20 | "url": "http://gcloud-todos.appspot.com",
21 | "source_url": "https://github.com/GoogleCloudPlatform/gcloud-node-todos",
22 | "type": "backend"
23 | }, {
24 | "name": "Angular2",
25 | "url": "examples/angular2"
26 | }],
27 | "link_groups": [{
28 | "heading": "Official Resources",
29 | "links": [{
30 | "name": "Tutorial",
31 | "url": "http://docs.angularjs.org/tutorial"
32 | }, {
33 | "name": "API Reference",
34 | "url": "http://docs.angularjs.org/api"
35 | }, {
36 | "name": "Developer Guide",
37 | "url": "http://docs.angularjs.org/guide"
38 | }, {
39 | "name": "Applications built with AngularJS",
40 | "url": "http://builtwith.angularjs.org"
41 | }, {
42 | "name": "Blog",
43 | "url": "http://blog.angularjs.org"
44 | }, {
45 | "name": "FAQ",
46 | "url": "http://docs.angularjs.org/misc/faq"
47 | }, {
48 | "name": "Videos",
49 | "url": "https://www.youtube.com/user/angularjs"
50 | }]
51 | }, {
52 | "heading": "Articles and Guides",
53 | "links": [{
54 | "name": "Code School AngularJS course",
55 | "url": "https://www.codeschool.com/courses/shaping-up-with-angular-js"
56 | }, {
57 | "name": "5 Awesome AngularJS Features",
58 | "url": "http://net.tutsplus.com/tutorials/javascript-ajax/5-awesome-angularjs-features"
59 | }, {
60 | "name": "Using Yeoman with AngularJS",
61 | "url": "http://briantford.com/blog/angular-yeoman.html"
62 | }, {
63 | "name": "me&ngular - an introduction to MVW",
64 | "url": "http://stephenplusplus.github.io/meangular"
65 | }]
66 | }, {
67 | "heading": "Community",
68 | "links": [{
69 | "name": "Walkthroughs and Tutorials on YouTube",
70 | "url": "http://www.youtube.com/playlist?list=PL1w1q3fL4pmgqpzb-XhG7Clgi67d_OHXz"
71 | }, {
72 | "name": "Google Groups mailing list",
73 | "url": "https://groups.google.com/forum/?fromgroups#!forum/angular"
74 | }, {
75 | "name": "angularjs on Stack Overflow",
76 | "url": "http://stackoverflow.com/questions/tagged/angularjs"
77 | }, {
78 | "name": "AngularJS on Twitter",
79 | "url": "https://twitter.com/angularjs"
80 | }, {
81 | "name": "AngularjS on Google+",
82 | "url": "https://plus.google.com/+AngularJS/posts"
83 | }]
84 | }]
85 | },
86 | "angulardart": {
87 | "name": "AngularDart",
88 | "description": "Dart is a class-based, object-oriented language with lexical scoping, closures, and optional static typing. AngularDart is a port of Angular to Dart.",
89 | "homepage": "github.com/angular/angular.dart",
90 | "examples": [{
91 | "name": "Example",
92 | "url": "examples/angular-dart"
93 | }],
94 | "link_groups": [{
95 | "heading": "Official Resources",
96 | "links": [{
97 | "name": "API Reference",
98 | "url": "http://ci.angularjs.org/view/Dart/job/angular.dart-master/javadoc/"
99 | }, {
100 | "name": "Tutorial",
101 | "url": "https://github.com/angular/angular.dart.tutorial"
102 | }, {
103 | "name": "A Tour of the Dart Language",
104 | "url": "http://www.dartlang.org/docs/dart-up-and-running/contents/ch02.html"
105 | }]
106 | }, {
107 | "heading": "Community",
108 | "links": [{
109 | "name": "AngularDart Mailing List",
110 | "url": "https://groups.google.com/forum/#!forum/angular-dart"
111 | }, {
112 | "name": "AngularDart on Stack Overflow",
113 | "url": "http://stackoverflow.com/questions/tagged/angulardart"
114 | }, {
115 | "name": "+AngularDart on Google+",
116 | "url": "https://plus.google.com/+AngularJS"
117 | }, {
118 | "name": "@angularjs on Twitter",
119 | "url": "https://twitter.com/angularjs"
120 | }, {
121 | "name": "Bugtracker on GitHub",
122 | "url": "https://github.com/angular/angular.dart/issues?state=open"
123 | }]
124 | }]
125 | },
126 | "ariatemplates": {
127 | "name": "Aria Templates",
128 | "description": "Aria Templates (aka AT) is an application framework written in JavaScript for building rich and large-scaled enterprise web applications.",
129 | "homepage": "ariatemplates.com",
130 | "examples": [{
131 | "name": "Example",
132 | "url": "examples/ariatemplates"
133 | }],
134 | "link_groups": [{
135 | "heading": "Official Resources",
136 | "links": [{
137 | "name": "Documentation",
138 | "url": "http://ariatemplates.com/usermanual"
139 | }, {
140 | "name": "API Reference",
141 | "url": "http://ariatemplates.com/aria/guide/apps/apidocs"
142 | }, {
143 | "name": "Guides",
144 | "url": "http://ariatemplates.com/guides"
145 | }, {
146 | "name": "Blog",
147 | "url": "http://ariatemplates.com/blog"
148 | }, {
149 | "name": "FAQ",
150 | "url": "http://ariatemplates.com/faq"
151 | }, {
152 | "name": "Aria Templates on GitHub",
153 | "url": "https://github.com/ariatemplates"
154 | }]
155 | }, {
156 | "heading": "Community",
157 | "links": [{
158 | "name": "Aria Templates on Stack Overflow",
159 | "url": "http://stackoverflow.com/questions/tagged/ariatemplates"
160 | }, {
161 | "name": "Forums",
162 | "url": "http://ariatemplates.com/forum"
163 | }, {
164 | "name": "Aria Templates on Twitter",
165 | "url": "http://twitter.com/ariatemplates"
166 | }]
167 | }]
168 | },
169 | "atmajs": {
170 | "name": "Atma.js",
171 | "description": "HMVC and the component-based architecture for building client, server or hybrid applications",
172 | "homepage": "atmajs.com",
173 | "examples": [{
174 | "name": "Example",
175 | "url": "examples/atmajs/"
176 | }],
177 | "link_groups": [{
178 | "heading": "Official Resources",
179 | "links": [{
180 | "name": "Get Started",
181 | "url": "http://atmajs.com/get/github"
182 | }, {
183 | "name": "Atma.js on GitHub",
184 | "url": "https://github.com/atmajs"
185 | }, {
186 | "name": "Atma.js DevTool",
187 | "url": "https://chrome.google.com/webstore/detail/atmajs-devtool/bpaepkmcmoablpdahclhdceapndfhdpo"
188 | }]
189 | }, {
190 | "heading": "Overview",
191 | "links": [{
192 | "name": "Libraries",
193 | "url": "https://github.com/tastejs/todomvc/blob/gh-pages/examples/atmajs/readme.md"
194 | }]
195 | }, {
196 | "heading": "Community",
197 | "links": [{
198 | "name": "Atma.js on Stack Overflow",
199 | "url": "http://stackoverflow.com/questions/tagged/atmajs"
200 | }, {
201 | "name": "Mailing list on Google Groups",
202 | "url": "https://groups.google.com/forum/?fromgroups#!forum/atmajs"
203 | }]
204 | }]
205 | },
206 | "aurelia": {
207 | "name": "Aurelia",
208 | "description": "Aurelia is a next generation JavaScript client framework that leverages simple conventions to empower your creativity.",
209 | "homepage": "aurelia.io",
210 | "examples": [{
211 | "name": "Example",
212 | "url": "examples/aurelia"
213 | }],
214 | "link_groups": [{
215 | "heading": "Official Resources",
216 | "links": [{
217 | "name": "Get started",
218 | "url": "http://aurelia.io/get-started.html"
219 | }, {
220 | "name": "Docs",
221 | "url": "http://aurelia.io/docs.html"
222 | }, {
223 | "name": "Aurelia on GitHub",
224 | "url": "https://github.com/aurelia"
225 | }]
226 | }, {
227 | "heading": "Articles and Guides",
228 | "links": [{
229 | "name": "Blog",
230 | "url": "http://blog.durandal.io/"
231 | }]
232 | }, {
233 | "heading": "Community",
234 | "links": [{
235 | "name": "Aurelia dicussions on Gitter",
236 | "url": "https://gitter.im/Aurelia/Discuss"
237 | }]
238 | }]
239 | },
240 | "backbonejs": {
241 | "name": "Backbone.js",
242 | "description": "Backbone.js gives structure to web applications by providing models with key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing API over a RESTful JSON interface.",
243 | "homepage": "backbonejs.org",
244 | "examples": [{
245 | "name": "Example",
246 | "url": "examples/backbone"
247 | }, {
248 | "name": "Example",
249 | "url": "examples/backbone_require"
250 | }, {
251 | "name": "Enyo & Backbone.js",
252 | "url": "examples/enyo_backbone"
253 | }, {
254 | "name": "TypeScript & Backbone.js",
255 | "url": "examples/typescript-backbone"
256 | }],
257 | "link_groups": [{
258 | "heading": "Official Resources",
259 | "links": [{
260 | "name": "Annotated source code",
261 | "url": "http://backbonejs.org/docs/backbone.html"
262 | }, {
263 | "name": "Applications built with Backbone.js",
264 | "url": "http://backbonejs.org/#examples"
265 | }, {
266 | "name": "FAQ",
267 | "url": "http://backbonejs.org/#faq"
268 | }]
269 | }, {
270 | "heading": "Articles and Guides",
271 | "links": [{
272 | "name": "Developing Backbone.js Applications",
273 | "url": "http://addyosmani.github.io/backbone-fundamentals"
274 | }, {
275 | "name": "Collection of tutorials, blog posts, and example sites",
276 | "url": "https://github.com/documentcloud/backbone/wiki/Tutorials%2C-blog-posts-and-example-sites"
277 | }]
278 | }, {
279 | "heading": "Community",
280 | "links": [{
281 | "name": "Backbone.js on Stack Overflow",
282 | "url": "http://stackoverflow.com/questions/tagged/backbone.js"
283 | }, {
284 | "name": "Google Groups mailing list",
285 | "url": "https://groups.google.com/forum/#!forum/backbonejs"
286 | }, {
287 | "name": "Backbone.js on Twitter",
288 | "url": "http://twitter.com/documentcloud"
289 | }]
290 | }]
291 | },
292 | "ampersand": {
293 | "name": "Ampersand.js",
294 | "description": "A highly modular, loosely coupled, non-frameworky framework for building advanced JavaScript apps.",
295 | "homepage": "ampersandjs.com",
296 | "examples": [{
297 | "name": "Architecture Example",
298 | "url": "examples/ampersand"
299 | }],
300 | "link_groups": [{
301 | "heading": "Official Resources",
302 | "links": [{
303 | "name": "Project Site",
304 | "url": "http://ampersandjs.com"
305 | }, {
306 | "name": "Guides",
307 | "url": "http://ampersandjs.com/learn"
308 | }, {
309 | "name": "API Reference",
310 | "url": "http://ampersandjs.com/docs"
311 | }, {
312 | "name": "Curated Front-end Modules",
313 | "url": "http://tools.ampersandjs.com"
314 | }, {
315 | "name": "#&yet IRC Channel on Freenode",
316 | "url": "https://botbot.me/freenode/andyet/"
317 | }]
318 | }, {
319 | "heading": "Related Materials",
320 | "links": [{
321 | "name": "Human JavaScript (free online book)",
322 | "url": "http://learn.humanjavascript.com"
323 | }, {
324 | "name": "Introducing Ampersand Blogpost",
325 | "url": "http://blog.andyet.com/2014/06/25/introducing-ampersand-js/"
326 | }, {
327 | "name": "&yet – The team behind Ampersand.js",
328 | "url": "http://andyet.com"
329 | }]
330 | }]
331 | },
332 | "elm": {
333 | "name": "Elm",
334 | "description": "A functional reactive language for interactive applications",
335 | "homepage": "elm-lang.org",
336 | "examples": [{
337 | "name": "Example",
338 | "url": "examples/elm"
339 | }],
340 | "link_groups": [{
341 | "heading": "Official Resources",
342 | "links": [{
343 | "name": "Project Site",
344 | "url": "http://elm-lang.org/"
345 | }, {
346 | "name": "Guides",
347 | "url": "http://elm-lang.org/Learn.elm"
348 | }, {
349 | "name": "Syntax Reference",
350 | "url": "http://elm-lang.org/learn/Syntax.elm"
351 | }, {
352 | "name": "Libraries",
353 | "url": "http://elm-lang.org/Libraries.elm"
354 | }, {
355 | "name": "#elm IRC Channel on Freenode",
356 | "url": "http://webchat.freenode.net/?channels=elm"
357 | }]
358 | }]
359 | },
360 | "canjs": {
361 | "name": "CanJS",
362 | "description": "CanJS is a MIT-licensed, client-side, JavaScript framework that makes building rich web applications easy.",
363 | "homepage": "canjs.com",
364 | "examples": [{
365 | "name": "Example",
366 | "url": "examples/canjs"
367 | }, {
368 | "name": "Example",
369 | "url": "examples/canjs_require"
370 | }],
371 | "link_groups": [{
372 | "heading": "Official Resources",
373 | "links": [{
374 | "name": "Documentation",
375 | "url": "http://canjs.com/docs/index.html"
376 | }, {
377 | "name": "Getting started",
378 | "url": "http://canjs.com/guides/Tutorial.html"
379 | }, {
380 | "name": "Applications built with CanJS",
381 | "url": "http://canjs.com/#examples"
382 | }, {
383 | "name": "Blog",
384 | "url": "http://bitovi.com/blog/tag/canjs"
385 | }, {
386 | "name": "Getting started video",
387 | "url": "http://www.youtube.com/watch?v=GdT4Oq6ZQ68"
388 | }]
389 | }, {
390 | "heading": "Articles and Guides",
391 | "links": [{
392 | "name": "Diving into CanJS",
393 | "url": "http://net.tutsplus.com/tutorials/javascript-ajax/diving-into-canjs"
394 | }]
395 | }, {
396 | "heading": "Community",
397 | "links": [{
398 | "name": "CanJS on Stack Overflow",
399 | "url": "http://stackoverflow.com/questions/tagged/canjs"
400 | }, {
401 | "name": "CanJS Forums",
402 | "url": "http://forum.javascriptmvc.com/#Forum/canjs"
403 | }, {
404 | "name": "CanJS on Twitter",
405 | "url": "http://twitter.com/canjs"
406 | }, {
407 | "name": "#canjs IRC",
408 | "url": "http://webchat.freenode.net/?channels=canjs"
409 | }]
410 | }]
411 | },
412 | "chaplin": {
413 | "name": "Chaplin",
414 | "description": "Chaplin is an architecture for JavaScript applications using the Backbone.js library. Chaplin addresses Backbone’s limitations by providing a lightweight and flexible structure that features well-proven design patterns and best practices.",
415 | "homepage": "chaplinjs.org",
416 | "examples": [{
417 | "name": "Example",
418 | "url": "examples/chaplin-brunch/public"
419 | }],
420 | "link_groups": [{
421 | "heading": "Official Resources",
422 | "links": [{
423 | "name": "Getting Started",
424 | "url": "http://docs.chaplinjs.org/getting_started.html"
425 | }, {
426 | "name": "Documentation",
427 | "url": "http://docs.chaplinjs.org"
428 | }, {
429 | "name": "Annotated Source Code",
430 | "url": "http://chaplinjs.org/annotated/chaplin.html"
431 | }, {
432 | "name": "Applications built with Chaplin",
433 | "url": "http://chaplinjs.org/examples.html"
434 | }, {
435 | "name": "Cookbook",
436 | "url": "https://github.com/chaplinjs/chaplin/wiki/Cookbook"
437 | }, {
438 | "name": "Chaplin on GitHub",
439 | "url": "https://github.com/chaplinjs"
440 | }]
441 | }, {
442 | "heading": "Articles and Guides",
443 | "links": [{
444 | "name": "JavaScript MVC frameworks: A Comparison of Marionette and Chaplin",
445 | "url": "http://9elements.com/io/index.php/comparison-of-marionette-and-chaplin"
446 | }]
447 | }, {
448 | "heading": "Community",
449 | "links": [{
450 | "name": "Support forum on ost.io",
451 | "url": "http://ost.io/@chaplinjs/chaplin"
452 | }, {
453 | "name": "Chaplin on Stack Overflow",
454 | "url": "http://stackoverflow.com/questions/tagged/chaplinjs"
455 | }, {
456 | "name": "Chaplin on Twitter",
457 | "url": "http://twitter.com/chaplinjs"
458 | }]
459 | }]
460 | },
461 | "closure": {
462 | "name": "Closure Tools",
463 | "description": "The Closure Tools project is an effort by Google engineers to open source the tools used in many of Google's sites and web applications for use by the wider Web development community.",
464 | "homepage": "developers.google.com/closure",
465 | "examples": [{
466 | "name": "Example",
467 | "url": "examples/closure"
468 | }],
469 | "link_groups": [{
470 | "heading": "Official Resources",
471 | "links": [{
472 | "name": "Documentation",
473 | "url": "https://developers.google.com/closure/library/docs/overview"
474 | }, {
475 | "name": "API Reference",
476 | "url": "http://docs.closure-library.googlecode.com/git/index.html"
477 | }, {
478 | "name": "Blog",
479 | "url": "http://closuretools.blogspot.com"
480 | }, {
481 | "name": "FAQ",
482 | "url": "https://developers.google.com/closure/faq"
483 | }]
484 | }, {
485 | "heading": "Articles and Guides",
486 | "links": [{
487 | "name": "Examples, walkthroughs, and articles",
488 | "url": "http://www.googleclosure.com"
489 | }, {
490 | "name": "First Adventure in Google Closure",
491 | "url": "http://www.codeproject.com/Articles/265364/First-Adventures-in-Google-Closure"
492 | }]
493 | }, {
494 | "heading": "Community",
495 | "links": [{
496 | "name": "Google Groups mailing list",
497 | "url": "https://groups.google.com/group/closure-library-discuss"
498 | }, {
499 | "name": "Closure Tools on Twitter",
500 | "url": "http://twitter.com/closuretools"
501 | }, {
502 | "name": "Closure Tools on Google+",
503 | "url": "https://plus.google.com/communities/113969319608324762672"
504 | }]
505 | }]
506 | },
507 | "componentjs": {
508 | "name": "ComponentJS",
509 | "description": "Provides a powerful run-time Component System for hierarchically structuring the UI dialogs of complex HTML5-based Clients. Fully isolates each UI segment, with sophisticated hierarchical Event, Service, Hook, Model, Socket and Property mechanisms.",
510 | "homepage": "componentjs.com/",
511 | "source_path": [{
512 | "name": "Example",
513 | "url": "examples/componentjs"
514 | }],
515 | "link_groups": [{
516 | "heading": "Official Resources",
517 | "links": [{
518 | "name": "Overview Video",
519 | "url": "http://www.youtube.com/watch?v=gtz7PCMxzVA"
520 | }, {
521 | "name": "Demo",
522 | "url": "http://componentjs.com/demo.html"
523 | }, {
524 | "name": "Tutorial",
525 | "url": "http://componentjs.com/tutorial.html"
526 | }, {
527 | "name": "API Reference",
528 | "url": "http://componentjs.com/api.html"
529 | }]
530 | }, {
531 | "heading": "Community",
532 | "links": [{
533 | "name": "ComponentJS on GitHub",
534 | "url": "https://github.com/rse/componentjs"
535 | }, {
536 | "name": "ComponentJS on Twitter",
537 | "url": "http://twitter.com/componentjs"
538 | }]
539 | }]
540 | },
541 | "cujo": {
542 | "name": "cujoJS",
543 | "description": "cujo is an architectural toolkit for next generation JavaScript applications. It encourages highly modular development, declarative application assembly, and embraces the asynchronous nature of JavaScript and its fusion of object-oriented and functional programming styles.",
544 | "homepage": "cujojs.com",
545 | "examples": [{
546 | "name": "Example",
547 | "url": "examples/cujo"
548 | }],
549 | "link_groups": [{
550 | "heading": "Official Resources",
551 | "links": [{
552 | "name": "know cujoJS",
553 | "url": "http://know.cujojs.com/"
554 | }, {
555 | "name": "cujoJS on GitHub",
556 | "url": "https://github.com/cujojs"
557 | }]
558 | }, {
559 | "heading": "Articles and Guides",
560 | "links": [{
561 | "name": "An introductory presentation",
562 | "url": "http://www.youtube.com/watch?v=TqX-CqYYwEc"
563 | }]
564 | }, {
565 | "heading": "Community",
566 | "links": [{
567 | "name": "Google Groups mailing list",
568 | "url": "https://groups.google.com/forum/#!forum/cujojs"
569 | }, {
570 | "name": "cujoJS on Twitter",
571 | "url": "http://twitter.com/cujojs"
572 | }]
573 | }]
574 | },
575 | "dart": {
576 | "name": "Dart",
577 | "description": "Dart is a class-based, object-oriented language with lexical scoping, closures, and optional static typing. Dart helps you build structured modern web apps and is easy to learn for a wide range of developers.",
578 | "homepage": "dartlang.org",
579 | "examples": [{
580 | "name": "Example",
581 | "url": "examples/vanilladart/web"
582 | }],
583 | "link_groups": [{
584 | "heading": "Official Resources",
585 | "links": [{
586 | "name": "Documentation",
587 | "url": "https://www.dartlang.org/docs/dart-up-and-running/contents/ch01.html"
588 | }, {
589 | "name": "API Reference",
590 | "url": "http://api.dartlang.org/docs/releases/latest"
591 | }, {
592 | "name": "A Tour of the Dart Language",
593 | "url": "http://www.dartlang.org/docs/dart-up-and-running/contents/ch02.html"
594 | }, {
595 | "name": "Articles",
596 | "url": "http://www.dartlang.org/articles"
597 | }, {
598 | "name": "Tutorials",
599 | "url": "http://www.dartlang.org/docs/tutorials"
600 | }, {
601 | "name": "FAQ",
602 | "url": "http://www.dartlang.org/support/faq.html"
603 | }]
604 | }, {
605 | "heading": "Articles and Guides",
606 | "links": [{
607 | "name": "Getting started with Google Dart",
608 | "url": "http://www.techrepublic.com/blog/webmaster/getting-started-with-google-dart/931"
609 | }]
610 | }, {
611 | "heading": "Community",
612 | "links": [{
613 | "name": "Dart on Stack Overflow",
614 | "url": "http://stackoverflow.com/questions/tagged/dart"
615 | }, {
616 | "name": "Dart on Twitter",
617 | "url": "http://twitter.com/dart_lang"
618 | }, {
619 | "name": "Dart on Google+",
620 | "url": "https://plus.google.com/+dartlang/posts"
621 | }]
622 | }]
623 | },
624 | "deftjs": {
625 | "name": "DeftJS",
626 | "description": "DeftJS enhances Ext JS and Sencha Touch’s APIs with additional building blocks that enable large development teams to rapidly build enterprise scale applications, leveraging best practices and proven patterns discovered by top RIA developers at some of the best consulting firms in the industry.",
627 | "homepage": "deftjs.org",
628 | "examples": [{
629 | "name": "Example",
630 | "url": "examples/extjs_deftjs"
631 | }],
632 | "link_groups": [{
633 | "heading": "Official Resources",
634 | "links": [{
635 | "name": "Documentation",
636 | "url": "https://github.com/deftjs/DeftJS/wiki"
637 | }, {
638 | "name": "DeftJS on GitHub",
639 | "url": "https://github.com/deftjs/DeftJS"
640 | }]
641 | }, {
642 | "heading": "Articles and Guides",
643 | "links": [{
644 | "name": "Exploring ExtJS with DeftJS",
645 | "url": "http://www.briankotek.com/blog/index.cfm/2012/5/8/Exploring-ExtJS-with-DeftJS"
646 | }]
647 | }, {
648 | "heading": "Community",
649 | "links": [{
650 | "name": "DeftJS on Stack Overflow",
651 | "url": "http://stackoverflow.com/questions/tagged/deftjs"
652 | }, {
653 | "name": "Mailing list on Google Groups",
654 | "url": "https://groups.google.com/forum/?fromgroups#!forum/deftjs"
655 | }, {
656 | "name": "DeftJS on Twitter",
657 | "url": "http://twitter.com/deftjs"
658 | }]
659 | }]
660 | },
661 | "derby": {
662 | "name": "Derby",
663 | "description": "MVC framework making it easy to write realtime, collaborative applications that run in both Node.js and browsers.",
664 | "homepage": "derbyjs.com",
665 | "examples": [{
666 | "name": "Real-time Example",
667 | "url": "http://todomvc.derbyjs.com",
668 | "source_url": "examples/derby"
669 | }],
670 | "link_groups": [{
671 | "heading": "Official Resources",
672 | "links": [{
673 | "name": "Introduction",
674 | "url": "http://derbyjs.com/#introduction"
675 | }, {
676 | "name": "Getting Started",
677 | "url": "http://derbyjs.com/#getting_started"
678 | }, {
679 | "name": "Applications built with Derby",
680 | "url": "https://github.com/codeparty/derby/wiki/Community-Projects#website-showcase"
681 | }, {
682 | "name": "Blog",
683 | "url": "http://blog.derbyjs.com"
684 | }, {
685 | "name": "FAQ",
686 | "url": "https://github.com/codeparty/derby/wiki/Frequently-Asked-Questions"
687 | }, {
688 | "name": "Derby on GitHub",
689 | "url": "https://github.com/codeparty/derby"
690 | }]
691 | }, {
692 | "heading": "Articles and Guides",
693 | "links": [{
694 | "name": "Learning DerbyJS",
695 | "url": "http://nickofnicks.com/2013/04/24/nodejs/derbyjs/learning-derbyjs/"
696 | }, {
697 | "name": "Screencast - 6 Things I'm Loving about DerbyJS",
698 | "url": "http://micknelson.wordpress.com/2012/07/27/6-things-im-loving-about-derbyjs"
699 | }]
700 | }, {
701 | "heading": "Community",
702 | "links": [{
703 | "name": "Derby on Stack Overflow",
704 | "url": "http://stackoverflow.com/questions/tagged/derbyjs"
705 | }, {
706 | "name": "Mailing list on Google Groups",
707 | "url": "https://groups.google.com/forum/?fromgroups#!forum/derbyjs"
708 | }, {
709 | "name": "Derby on Twitter",
710 | "url": "http://twitter.com/derbyjs"
711 | }]
712 | }]
713 | },
714 | "dijon": {
715 | "name": "Dijon",
716 | "description": "An IOC/DI framework in Javascript, inspired by Robotlegs and Swiftsuspenders.",
717 | "homepage": "github.com/creynders/dijon-framework",
718 | "examples": [{
719 | "name": "Example",
720 | "url": "examples/dijon"
721 | }],
722 | "link_groups": [{
723 | "heading": "Official Resources",
724 | "links": [{
725 | "name": "Documentation",
726 | "url": "http://creynders.github.com/dijon-framework/docs"
727 | }, {
728 | "name": "Dijon on GitHub",
729 | "url": "https://github.com/creynders/dijon-framework"
730 | }]
731 | }, {
732 | "heading": "Community",
733 | "links": [{
734 | "name": "Dijon on Twitter",
735 | "url": "http://twitter.com/camillereynders"
736 | }]
737 | }]
738 | },
739 | "dojo": {
740 | "name": "Dojo",
741 | "description": "Dojo saves you time and scales with your development process, using web standards as its platform. It’s the toolkit experienced developers turn to for building high quality desktop and mobile web applications.",
742 | "homepage": "dojotoolkit.org",
743 | "examples": [{
744 | "name": "Example",
745 | "url": "examples/dojo"
746 | }],
747 | "link_groups": [{
748 | "heading": "Official Resources",
749 | "links": [{
750 | "name": "Documentation",
751 | "url": "http://dojotoolkit.org/documentation"
752 | }, {
753 | "name": "Getting started guide",
754 | "url": "https://dojotoolkit.org/reference-guide/quickstart"
755 | }, {
756 | "name": "API Reference",
757 | "url": "http://dojotoolkit.org/api"
758 | }, {
759 | "name": "Blog",
760 | "url": "http://dojotoolkit.org/blog"
761 | }]
762 | }, {
763 | "heading": "Articles and Guides",
764 | "links": [{
765 | "name": "Getting StartED with Dojo",
766 | "url": "http://dojotoolkit.org/documentation/tutorials/1.10/start/"
767 | }]
768 | }, {
769 | "heading": "Community",
770 | "links": [{
771 | "name": "Dojo/MVC on Stack Overflow",
772 | "url": "http://stackoverflow.com/questions/tagged/dojo+model-view-controller"
773 | }, {
774 | "name": "Mailing list",
775 | "url": "http://dojotoolkit.org/community"
776 | }, {
777 | "name": "Dojo on Twitter",
778 | "url": "http://twitter.com/dojo"
779 | }]
780 | }]
781 | },
782 | "duel": {
783 | "name": "DUEL",
784 | "description": "DUEL is a dual-side templating engine using HTML for layout and 100% pure JavaScript as the binding language. The same views may be executed both directly in the browser (client-side template) and on the server (server-side template).",
785 | "homepage": "bitbucket.org/mckamey/duel/wiki/Home",
786 | "examples": [{
787 | "name": "Example",
788 | "url": "examples/duel/www"
789 | }],
790 | "link_groups": [{
791 | "heading": "Official Resources",
792 | "links": [{
793 | "name": "Syntax",
794 | "url": "https://bitbucket.org/mckamey/duel/wiki/Syntax"
795 | }, {
796 | "name": "Examples",
797 | "url": "https://bitbucket.org/mckamey/duel/wiki/Examples"
798 | }, {
799 | "name": "DUEL on BitBucket",
800 | "url": "https://bitbucket.org/mckamey/duel/src"
801 | }]
802 | }]
803 | },
804 | "durandal": {
805 | "name": "Durandal",
806 | "description": "Single Page Apps Done Right.",
807 | "homepage": "durandaljs.com",
808 | "examples": [{
809 | "name": "Example",
810 | "url": "examples/durandal/index.html"
811 | }],
812 | "link_groups": [{
813 | "heading": "Official Resources",
814 | "links": [{
815 | "name": "Getting Started",
816 | "url": "http://durandaljs.com/pages/get-started/"
817 | }, {
818 | "name": "Documentation",
819 | "url": "http://durandaljs.com/pages/docs"
820 | }, {
821 | "name": "Videos",
822 | "url": "http://durandaljs.com/pages/videos/"
823 | }, {
824 | "name": "Durandal on GitHub",
825 | "url": "https://github.com/BlueSpire/Durandal"
826 | }]
827 | }
828 | , {
829 | "heading": "Articles and Guides",
830 | "links": [{
831 | "name": "HotTowel Template - Durandal with ASP.Net MVC",
832 | "url": "http://www.johnpapa.net/hottowel/"
833 | }, {
834 | "name": "Using Durandal to Create Single Page Apps",
835 | "url": "http://stephenwalther.com/archive/2013/02/08/using-durandal-to-create-single-page-apps"
836 | },{
837 | "name": "nuGet Download",
838 | "url": "http://www.nuget.org/packages/Durandal/"
839 | }]
840 | }, {
841 | "heading": "Community",
842 | "links": [{
843 | "name": "Durandal on Stack Overflow",
844 | "url": "http://stackoverflow.com/questions/tagged/durandal"
845 | }, {
846 | "name": "Mailing list on Google Groups",
847 | "url": "https://groups.google.com/forum/#!forum/durandaljs"
848 | }, {
849 | "name": "Durandal on Twitter",
850 | "url": "http://twitter.com/durandaljs"
851 | }]
852 | }]
853 | },
854 | "emberjs": {
855 | "name": "Ember.js",
856 | "description": "A framework for creating ambitious web applications.",
857 | "homepage": "emberjs.com",
858 | "examples": [{
859 | "name": "Example",
860 | "url": "examples/emberjs"
861 | }, {
862 | "name": "Example",
863 | "url": "examples/emberjs_require"
864 | }],
865 | "link_groups": [{
866 | "heading": "Official Resources",
867 | "links": [{
868 | "name": "Guides",
869 | "url": "http://emberjs.com/guides"
870 | }, {
871 | "name": "API Reference",
872 | "url": "http://emberjs.com/api"
873 | }, {
874 | "name": "Screencast - Building an App with Ember.js",
875 | "url": "https://www.youtube.com/watch?v=Ga99hMi7wfY"
876 | }, {
877 | "name": "Applications built with Ember.js",
878 | "url": "http://emberjs.com/ember-users"
879 | }, {
880 | "name": "Blog",
881 | "url": "http://emberjs.com/blog"
882 | }]
883 | }, {
884 | "heading": "Articles and Guides",
885 | "links": [{
886 | "name": "Getting Into Ember.js",
887 | "url": "http://net.tutsplus.com/tutorials/javascript-ajax/getting-into-ember-js"
888 | }, {
889 | "name": "EmberWatch",
890 | "url": "http://emberwatch.com"
891 | }]
892 | }, {
893 | "heading": "Community",
894 | "links": [{
895 | "name": "Ember.js on Stack Overflow",
896 | "url": "http://stackoverflow.com/questions/tagged/ember.js"
897 | }, {
898 | "name": "Ember.js on Twitter",
899 | "url": "http://twitter.com/emberjs"
900 | }, {
901 | "name": "Ember.js on Google+",
902 | "url": "https://plus.google.com/communities/106387049790387471205"
903 | }]
904 | }]
905 | },
906 | "enyo": {
907 | "name": "Enyo",
908 | "description": "Use the same framework to develop apps for the web and for all major platforms, desktop and mobile.",
909 | "homepage": "enyojs.com",
910 | "examples": [{
911 | "name": "Example",
912 | "url": "examples/enyo_backbone"
913 | }],
914 | "link_groups": [{
915 | "heading": "Official Resources",
916 | "links": [{
917 | "name": "Documentation",
918 | "url": "http://enyojs.com/docs"
919 | }, {
920 | "name": "About",
921 | "url": "http://enyojs.com/about"
922 | }, {
923 | "name": "Applications built with Enyo",
924 | "url": "http://enyojs.com/showcase"
925 | }, {
926 | "name": "Blog",
927 | "url": "http://blog.enyojs.com"
928 | }, {
929 | "name": "FAQ",
930 | "url": "http://enyojs.com/about/faq"
931 | }, {
932 | "name": "Enyo on GitHub",
933 | "url": "https://github.com/enyojs"
934 | }]
935 | }, {
936 | "heading": "Community",
937 | "links": [{
938 | "name": "Enyo on Stack Overflow",
939 | "url": "http://stackoverflow.com/questions/tagged/enyo"
940 | }, {
941 | "name": "Forums",
942 | "url": "http://forums.enyojs.com"
943 | }, {
944 | "name": "Mailing list on Google Groups",
945 | "url": "https://groups.google.com/forum/#!forum/enyo-development"
946 | }, {
947 | "name": "Enyo on Twitter",
948 | "url": "http://twitter.com/enyojs"
949 | }]
950 | }]
951 | },
952 | "epitome": {
953 | "name": "Epitome",
954 | "description": "Epitome is a new extensible and modular open-source MVC* framework, built out of MooTools Classes and Events.",
955 | "homepage": "dimitarchristoff.github.io/Epitome",
956 | "examples": [{
957 | "name": "Example",
958 | "url": "examples/epitome"
959 | }],
960 | "link_groups": [{
961 | "heading": "Official Resources",
962 | "links": [{
963 | "name": "API Reference",
964 | "url": "http://dimitarchristoff.github.io/Epitome"
965 | }, {
966 | "name": "Examples",
967 | "url": "http://dimitarchristoff.github.io/Epitome/#examples"
968 | }, {
969 | "name": "Download & Building",
970 | "url": "http://dimitarchristoff.github.io/Epitome/#download-building"
971 | }, {
972 | "name": "Epitome on GitHub",
973 | "url": "https://github.com/DimitarChristoff/Epitome"
974 | }]
975 | }, {
976 | "heading": "Community",
977 | "links": [{
978 | "name": "Epitome on Twitter",
979 | "url": "http://twitter.com/D_mitar"
980 | }]
981 | }]
982 | },
983 | "exoskeleton": {
984 | "name": "Exoskeleton",
985 | "description": "A faster and leaner Backbone for your HTML5 apps.",
986 | "homepage": "exosjs.com",
987 | "examples": [{
988 | "name": "Example",
989 | "url": "examples/exoskeleton"
990 | }],
991 | "link_groups": [{
992 | "heading": "Official Resources",
993 | "links": [{
994 | "name": "Documentation",
995 | "url": "http://backbonejs.org"
996 | }, {
997 | "name": "Exoskeleton on GitHub",
998 | "url": "https://github.com/paulmillr/exoskeleton"
999 | }]
1000 | }, {
1001 | "heading": "Community",
1002 | "links": [{
1003 | "name": "Exoskeleton on Stack Overflow",
1004 | "url": "http://stackoverflow.com/questions/tagged/exoskeleton"
1005 | }, {
1006 | "name": "Backbone on Stack Overflow",
1007 | "url": "http://stackoverflow.com/questions/tagged/backbone.js"
1008 | }, {
1009 | "name": "Exoskeleton's author on Twitter",
1010 | "url": "http://twitter.com/paulmillr"
1011 | }]
1012 | }]
1013 | },
1014 | "firebase": {
1015 | "name": "Firebase",
1016 | "description": "Firebase is a scalable realtime backend that lets you build apps fast without managing servers.",
1017 | "homepage": "firebase.com",
1018 | "examples": [{
1019 | "name": "Firebase + AngularJS Realtime Example",
1020 | "url": "examples/firebase-angular"
1021 | }],
1022 | "link_groups": [{
1023 | "heading": "Official Resources",
1024 | "links": [{
1025 | "name": "AngularFire Site",
1026 | "url": "http://angularfire.com/"
1027 | }, {
1028 | "name": "Documentation & Examples",
1029 | "url": "https://www.firebase.com/docs/"
1030 | }, {
1031 | "name": "Blog",
1032 | "url": "https://www.firebase.com/blog/"
1033 | }, {
1034 | "name": "Firebase on GitHub",
1035 | "url": "http://firebase.github.io"
1036 | }, {
1037 | "name": "Tutorial",
1038 | "url": "https://www.firebase.com/tutorial/"
1039 | }]
1040 | }, {
1041 | "heading": "Community",
1042 | "links": [{
1043 | "name": "Firebase + Angular Mailing list on Google Groups",
1044 | "url": "https://groups.google.com/forum/#!forum/firebase-angular"
1045 | }, {
1046 | "name": "Firebase on Stack Overflow",
1047 | "url": "http://stackoverflow.com/questions/tagged/firebase"
1048 | }, {
1049 | "name": "Firebase on Twitter",
1050 | "url": "http://twitter.com/Firebase"
1051 | }, {
1052 | "name": "Firebase on Facebook",
1053 | "url": "http://facebook.com/Firebase"
1054 | }, {
1055 | "name": "Firebase on Google+",
1056 | "url": "https://plus.google.com/115330003035930967645/posts"
1057 | }]
1058 | }]
1059 | },
1060 | "flight": {
1061 | "name": "Flight",
1062 | "description": "Flight is a lightweight, component-based JavaScript framework that maps behavior to DOM nodes.",
1063 | "homepage": "flightjs.github.io",
1064 | "examples": [{
1065 | "name": "Example",
1066 | "url": "examples/flight"
1067 | }],
1068 | "link_groups": [{
1069 | "heading": "Official Resources",
1070 | "links": [{
1071 | "name": "GitHub",
1072 | "url": "https://github.com/flightjs/flight"
1073 | }, {
1074 | "name": "Demo Application",
1075 | "url": "http://flightjs.github.io/example-app/"
1076 | }, {
1077 | "name": "Installation",
1078 | "url": "https://github.com/flightjs/flight/blob/master/README.md#installation"
1079 | }, {
1080 | "name": "Collection of Flight components",
1081 | "url": "http://flight-components.jit.su/"
1082 | }, {
1083 | "name": "Flight on Twitter",
1084 | "url": "https://twitter.com/flightjs"
1085 | }]
1086 | }, {
1087 | "heading": "Articles and Guides",
1088 | "links": [{
1089 | "name": "Introducing Flight: a web application framework",
1090 | "url": "https://blog.twitter.com/2013/introducing-flight-a-web-application-framework"
1091 | }, {
1092 | "name": "Building Web Applications with Flight",
1093 | "url": "http://simplebutgood.net/building-web-applications-with-flight-part-1/"
1094 | }, {
1095 | "name": "Building a chat app with @flight",
1096 | "url": "http://blog.stefanritter.com/post/81767869139/building-a-chat-app-with-flight-part-1"
1097 | }, {
1098 | "name": "Redesigning Search at Airbnb",
1099 | "url": "http://nerds.airbnb.com/redesigning-search/"
1100 | }, {
1101 | "name": "Flight Mixins",
1102 | "url": "http://kenneth.kufluk.com/blog/2014/01/flight-mixins/"
1103 | }, {
1104 | "name": "Flight at TweetDeck",
1105 | "url": "https://blog.twitter.com/2013/flight-at-tweetdeck"
1106 | }, {
1107 | "name": "How Flight Plays Well With non-Flight JS",
1108 | "url": "http://www.retailmenot.com/corp/eng/posts/2014/08/28/how-flight-plays-well-with-non-flight-js/"
1109 | }, {
1110 | "name": "Learning to Fly — Twitter Flight and Mixins",
1111 | "url": "https://speakerdeck.com/anguscroll/learning-to-fly-twitter-flight-and-mixins-1"
1112 | }]
1113 | }, {
1114 | "heading":"Videos",
1115 | "links":[{
1116 | "name": "Dan Webb: Flight.js [JSConfUS 2013]",
1117 | "url": "https://www.youtube.com/watch?v=4WRmFp8jZjc"
1118 | }, {
1119 | "name": "MountainWest JavaScript 2014",
1120 | "url": "https://www.youtube.com/watch?v=PrcvUZGuUa8"
1121 | }]
1122 | }, {
1123 | "heading": "Community",
1124 | "links": [{
1125 | "name": "Stack Overflow",
1126 | "url": "http://stackoverflow.com/questions/tagged/twitter-flight"
1127 | }, {
1128 | "name": "Flight's Google Group",
1129 | "url": "https://groups.google.com/forum/?fromgroups#!forum/twitter-flight"
1130 | }, {
1131 | "name": "Flight on Freenode IRC (#flightjs)",
1132 | "url": "http://webchat.freenode.net/?channels=flightjs"
1133 | }]
1134 | }]
1135 | },
1136 | "gwt": {
1137 | "name": "Google Web Toolkit",
1138 | "description": "Google Web Toolkit (GWT) is a development toolkit for building and optimizing complex browser-based applications. GWT is used by many products at Google, including Google AdWords and Orkut. It's open source, completely free, and used by thousands of developers around the world.",
1139 | "homepage": "developers.google.com/web-toolkit",
1140 | "examples": [{
1141 | "name": "Example",
1142 | "url": "examples/gwt"
1143 | }],
1144 | "link_groups": [{
1145 | "heading": "Official Resources",
1146 | "links": [{
1147 | "name": "Documentation",
1148 | "url": "https://developers.google.com/web-toolkit/doc/latest/DevGuide"
1149 | }, {
1150 | "name": "Getting Started with the GWT SDK",
1151 | "url": "https://developers.google.com/web-toolkit/gettingstarted"
1152 | }, {
1153 | "name": "Articles",
1154 | "url": "https://developers.google.com/web-toolkit/articles"
1155 | }, {
1156 | "name": "Case Studies",
1157 | "url": "https://developers.google.com/web-toolkit/casestudies"
1158 | }, {
1159 | "name": "Blog",
1160 | "url": "http://googlewebtoolkit.blogspot.com"
1161 | }, {
1162 | "name": "FAQ",
1163 | "url": "https://developers.google.com/web-toolkit/doc/latest/FAQ"
1164 | }]
1165 | }, {
1166 | "heading": "Community",
1167 | "links": [{
1168 | "name": "Google Web Toolkit on Stack Overflow",
1169 | "url": "http://stackoverflow.com/questions/tagged/gwt"
1170 | }, {
1171 | "name": "Mailing list on Google Groups",
1172 | "url": "http://groups.google.com/group/Google-Web-Toolkit"
1173 | }, {
1174 | "name": "Google Web Toolkit on Twitter",
1175 | "url": "http://twitter.com/googledevtools"
1176 | }]
1177 | }]
1178 | },
1179 | "javascript": {
1180 | "name": "JavaScript",
1181 | "description": "JavaScript® (often shortened to JS) is a lightweight, interpreted, object-oriented language with first-class functions, most known as the scripting language for Web pages, but used in many non-browser environments as well such as node.js or Apache CouchDB.",
1182 | "homepage": "developer.mozilla.org/en-US/docs/JavaScript",
1183 | "examples": [{
1184 | "name": "Vanilla JavaScript Example",
1185 | "url": "examples/vanillajs"
1186 | }]
1187 | },
1188 | "jquery": {
1189 | "name": "jQuery",
1190 | "description": "jQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal and manipulation, event handling, animation, and Ajax much simpler with an easy-to-use API that works across a multitude of browsers. With a combination of versatility and extensibility, jQuery has changed the way that millions of people write JavaScript.",
1191 | "homepage": "jquery.com",
1192 | "examples": [{
1193 | "name": "Example",
1194 | "url": "examples/jquery"
1195 | }],
1196 | "link_groups": [{
1197 | "heading": "Official Resources",
1198 | "links": [{
1199 | "name": "How jQuery Works",
1200 | "url": "http://learn.jquery.com/about-jquery/how-jquery-works"
1201 | }, {
1202 | "name": "API Reference",
1203 | "url": "http://api.jquery.com"
1204 | }, {
1205 | "name": "Plugins",
1206 | "url": "http://plugins.jquery.com"
1207 | }, {
1208 | "name": "Brower Support",
1209 | "url": "http://jquery.com/browser-support"
1210 | }, {
1211 | "name": "Blog",
1212 | "url": "http://blog.jquery.com"
1213 | }]
1214 | }, {
1215 | "heading": "Articles and Guides",
1216 | "links": [{
1217 | "name": "Try jQuery",
1218 | "url": "http://try.jquery.com"
1219 | }, {
1220 | "name": "jQuery Annotated Source",
1221 | "url": "http://robflaherty.github.io/jquery-annotated-source/"
1222 | }, {
1223 | "name": "10 Things I Learned From the jQuery Source",
1224 | "url": "http://paulirish.com/2010/10-things-i-learned-from-the-jquery-source"
1225 | }]
1226 | }, {
1227 | "heading": "Community",
1228 | "links": [{
1229 | "name": "jQuery on Stack Overflow",
1230 | "url": "http://stackoverflow.com/questions/tagged/jquery"
1231 | }, {
1232 | "name": "Forums",
1233 | "url": "http://forum.jquery.com"
1234 | }, {
1235 | "name": "jQuery on Twitter",
1236 | "url": "http://twitter.com/jquery"
1237 | }, {
1238 | "name": "jQuery on Google+",
1239 | "url": "https://plus.google.com/102828491884671003608/posts"
1240 | }]
1241 | }]
1242 | },
1243 | "kendo": {
1244 | "name": "Kendo UI",
1245 | "description": "Comprehensive HTML5/JavaScript framework for modern web and mobile app development.",
1246 | "homepage": "kendoui.com",
1247 | "examples": [{
1248 | "name": "Example",
1249 | "url": "examples/kendo"
1250 | }],
1251 | "link_groups": [{
1252 | "heading": "Official Resources",
1253 | "links": [{
1254 | "name": "Documentation",
1255 | "url": "http://docs.kendoui.com"
1256 | }, {
1257 | "name": "API Reference",
1258 | "url": "http://docs.kendoui.com/api/dataviz/chart"
1259 | }, {
1260 | "name": "What is Kendo UI",
1261 | "url": "http://docs.kendoui.com/getting-started/introduction"
1262 | }, {
1263 | "name": "Applications built with Kendo UI",
1264 | "url": "http://demos.kendoui.com"
1265 | }, {
1266 | "name": "Blog",
1267 | "url": "http://www.kendoui.com/blogs.aspx"
1268 | }, {
1269 | "name": "FAQ",
1270 | "url": "http://www.kendoui.com/faq/faq.aspx"
1271 | }]
1272 | }, {
1273 | "heading": "Community",
1274 | "links": [{
1275 | "name": "Kendo UI on Stack Overflow",
1276 | "url": "http://stackoverflow.com/questions/tagged/kendo-ui"
1277 | }, {
1278 | "name": "Kendo UI on Twitter",
1279 | "url": "http://twitter.com/kendoui"
1280 | }, {
1281 | "name": "Kendo UI on Google+",
1282 | "url": "https://plus.google.com/117798269023828336983/posts"
1283 | }]
1284 | }]
1285 | },
1286 | "knockback": {
1287 | "name": "Knockback.js",
1288 | "description": "Both Knockout.js and Backbone.js have their strengths and weaknesses, but together they are amazing! With Knockback.js, you can use the strong ORM provided by Backbone and create dynamic views using Knockout bindings.",
1289 | "homepage": "kmalakoff.github.io/knockback",
1290 | "examples": [{
1291 | "name": "Example",
1292 | "url": "examples/knockback"
1293 | }],
1294 | "link_groups": [{
1295 | "heading": "Official Resources",
1296 | "links": [{
1297 | "name": "Getting Started with Knockback.js",
1298 | "url": "http://kmalakoff.github.io/knockback/getting_started_introduction.html"
1299 | }, {
1300 | "name": "Tutorials",
1301 | "url": "http://kmalakoff.github.io/knockback/tutorials_introduction.html"
1302 | }, {
1303 | "name": "API Reference",
1304 | "url": "http://kmalakoff.github.io/knockback/doc/index.html"
1305 | }, {
1306 | "name": "Knockback.js Reference App",
1307 | "url": "http://kmalakoff.github.io/knockback/app_knockback_reference.html"
1308 | }, {
1309 | "name": "Knockback.js on Twitter",
1310 | "url": "http://twitter.com/knockbackjs"
1311 | }]
1312 | }]
1313 | },
1314 | "knockoutjs": {
1315 | "name": "Knockout.js",
1316 | "description": "Knockout.js helps you simplify dynamic JavaScript UIs using the Model-View-ViewModel (MVVM) pattern.",
1317 | "homepage": "knockoutjs.com",
1318 | "examples": [{
1319 | "name": "Example",
1320 | "url": "examples/knockoutjs"
1321 | }, {
1322 | "name": "Example",
1323 | "url": "examples/knockoutjs_require"
1324 | }],
1325 | "link_groups": [{
1326 | "heading": "Official Resources",
1327 | "links": [{
1328 | "name": "Documentation",
1329 | "url": "http://knockoutjs.com/documentation/introduction.html"
1330 | }, {
1331 | "name": "Tutorials",
1332 | "url": "http://learn.knockoutjs.com"
1333 | }, {
1334 | "name": "Live examples",
1335 | "url": "http://knockoutjs.com/examples"
1336 | }]
1337 | }, {
1338 | "heading": "Articles and Guides",
1339 | "links": [{
1340 | "name": "Getting Started with Knockout.js",
1341 | "url": "http://www.adobe.com/devnet/html5/articles/getting-started-with-knockoutjs.html"
1342 | }, {
1343 | "name": "Into the Ring with Knockout.js",
1344 | "url": "http://net.tutsplus.com/tutorials/javascript-ajax/into-the-ring-with-knockout-js"
1345 | }, {
1346 | "name": "Beginners Guide to Knockout.js",
1347 | "url": "http://www.sitepoint.com/beginners-guide-to-knockoutjs-part-1"
1348 | }]
1349 | }, {
1350 | "heading": "Community",
1351 | "links": [{
1352 | "name": "Knockout.js on Stack Overflow",
1353 | "url": "http://stackoverflow.com/questions/tagged/knockout"
1354 | }, {
1355 | "name": "Mailing list on Google Groups",
1356 | "url": "http://groups.google.com/group/knockoutjs"
1357 | }, {
1358 | "name": "Knockout.js on Twitter",
1359 | "url": "http://twitter.com/knockoutjs"
1360 | }, {
1361 | "name": "Knockout.js on Google+",
1362 | "url": "https://plus.google.com/communities/106789046312204355684/stream/c5bfcfdf-3690-44a6-b015-35aad4f4e42e"
1363 | }]
1364 | }]
1365 | },
1366 | "lavaca": {
1367 | "name": "Lavaca",
1368 | "description": "A curated collection of tools for building mobile web applications.",
1369 | "homepage": "getlavaca.com",
1370 | "examples": [{
1371 | "name": "Example",
1372 | "url": "examples/lavaca_require"
1373 | }],
1374 | "link_groups": [{
1375 | "heading": "Official Resources",
1376 | "links": [{
1377 | "name": "Guide",
1378 | "url": "http://getlavaca.com/#/guide"
1379 | }, {
1380 | "name": "API Reference",
1381 | "url": "http://getlavaca.com/#/apidoc"
1382 | }, {
1383 | "name": "Live examples",
1384 | "url": "http://getlavaca.com/#/examples"
1385 | }]
1386 | }, {
1387 | "heading": "Articles and Guides",
1388 | "links": [{
1389 | "name": "Why Lavaca is the only sane HTML5 mobile development framework out there",
1390 | "url": "http://povolotski.me/2013/09/20/lavaca-intro/"
1391 | }]
1392 | }, {
1393 | "heading": "Community",
1394 | "links": [{
1395 | "name": "Lavaca on Twitter",
1396 | "url": "http://twitter.com/getlavaca"
1397 | }]
1398 | }]
1399 | },
1400 | "marionettejs": {
1401 | "name": "Backbone.Marionette",
1402 | "description": "Marionette simplifies your Backbone application code with robust views and architecture solutions.",
1403 | "homepage": "marionettejs.com",
1404 | "examples": [{
1405 | "name": "Example Basic Marionette",
1406 | "url": "examples/backbone_marionette"
1407 | }],
1408 | "link_groups": [{
1409 | "heading": "Official Resources",
1410 | "links": [{
1411 | "name": "Docs",
1412 | "url": "http://marionettejs.com/docs/current/"
1413 | }, {
1414 | "name": "Gitter",
1415 | "url": "https://gitter.im/marionettejs/backbone.marionette"
1416 | }, {
1417 | "name": "YouTube - Dancing with Marionette",
1418 | "url": "https://www.youtube.com/channel/UC6dVRPnSACav2AYB5XG7BZw"
1419 | }, {
1420 | "name": "Marionette Inspector",
1421 | "url": "http://marionettejs.com/inspector/"
1422 | }, {
1423 | "name": "MarionetteJS on GitHub",
1424 | "url": "https://github.com/marionettejs/backbone.marionette"
1425 | }]
1426 | }, {
1427 | "heading": "Articles and Guides",
1428 | "links": [{
1429 | "name": "Marionette 101",
1430 | "url": "https://www.youtube.com/watch?v=7yZKsgKxziw"
1431 | }, {
1432 | "name": "Marionette - The Backbone Framework",
1433 | "url": "https://www.youtube.com/watch?v=EvQnntaqVdE"
1434 | }]
1435 | }, {
1436 | "heading": "Community",
1437 | "links": [{
1438 | "name": "Backbone.Marionette on Stack Overflow",
1439 | "url": "http://stackoverflow.com/questions/tagged/backbone.marionette"
1440 | }, {
1441 | "name": "Backbone.Marionette on Twitter",
1442 | "url": "http://twitter.com/marionettejs"
1443 | }]
1444 | }]
1445 | },
1446 | "meteor": {
1447 | "name": "Meteor",
1448 | "description": "Meteor is an open-source platform for building top-quality web apps in a fraction of the time, whether you're an expert developer or just getting started.",
1449 | "homepage": "meteor.com",
1450 | "examples": [{
1451 | "name": "Real-time Example",
1452 | "url": "http://todomvcapp.meteor.com",
1453 | "source_url": "examples/meteor"
1454 | }],
1455 | "link_groups": [{
1456 | "heading": "Official Resources",
1457 | "links": [{
1458 | "name": "Documentation",
1459 | "url": "http://docs.meteor.com"
1460 | }, {
1461 | "name": "Applications built with Meteor",
1462 | "url": "http://madewith.meteor.com"
1463 | }, {
1464 | "name": "Examples",
1465 | "url": "http://meteor.com/examples"
1466 | }, {
1467 | "name": "Blog",
1468 | "url": "http://meteor.com/blog"
1469 | }, {
1470 | "name": "FAQ",
1471 | "url": "http://meteor.com/faq"
1472 | }, {
1473 | "name": "Meteor on GitHub",
1474 | "url": "https://github.com/meteor"
1475 | }, {
1476 | "name": "Meteor on YouTube",
1477 | "url": "http://www.youtube.com/user/MeteorVideos"
1478 | }]
1479 | }, {
1480 | "heading": "Articles and Guides",
1481 | "links": [{
1482 | "name": "Learn Meteor Fundamentals and Best Practices",
1483 | "url": "http://andrewscala.com/meteor"
1484 | }, {
1485 | "name": "Introduction to Realtime Web with Meteor and Node.js",
1486 | "url": "http://www.andrewmunsell.com/blog/introduction-to-realtime-web-meteor-and-nodejs"
1487 | }, {
1488 | "name": "Confessions of a Meteor Newb",
1489 | "url": "http://blog.jerodsanto.net/2012/04/confessions-of-a-meteor-newb"
1490 | }]
1491 | }, {
1492 | "heading": "Community",
1493 | "links": [{
1494 | "name": "Meteor on Stack Overflow",
1495 | "url": "http://stackoverflow.com/questions/tagged/meteor"
1496 | }, {
1497 | "name": "Mailing list on Google Groups",
1498 | "url": "https://groups.google.com/forum/?fromgroups#!forum/meteor-core"
1499 | }, {
1500 | "name": "Meteor on Twitter",
1501 | "url": "http://twitter.com/meteorjs"
1502 | }]
1503 | }]
1504 | },
1505 | "mithril": {
1506 | "name": "Mithril",
1507 | "description": "Mithril is a client-side MVC framework - a tool to organize code in a way that is easy to think about and to maintain.",
1508 | "homepage": "lhorie.github.io/mithril/",
1509 | "examples": [{
1510 | "name": "Architecture Example",
1511 | "url": "examples/mithril"
1512 | }],
1513 | "link_groups": [{
1514 | "heading": "Official Resources",
1515 | "links": [{
1516 | "name": "Documentation",
1517 | "url": "http://lhorie.github.io/mithril/getting-started.html"
1518 | }, {
1519 | "name": "API Reference",
1520 | "url": "http://lhorie.github.io/mithril/mithril.html"
1521 | }, {
1522 | "name": "Tutorials",
1523 | "url": "http://lhorie.github.io/mithril-blog/"
1524 | }, {
1525 | "name": "Mithril on Github",
1526 | "url": "https://github.com/lhorie/mithril.js"
1527 | }]
1528 | }, {
1529 | "heading": "Community",
1530 | "links": [{
1531 | "name": "Mailing list on Google Groups",
1532 | "url": "https://groups.google.com/forum/#!forum/mithriljs"
1533 | }, {
1534 | "name": "StackOverflow",
1535 | "url": "http://stackoverflow.com/questions/tagged/mithril.js"
1536 | }, {
1537 | "name": "Projects and Snippets",
1538 | "url": "https://github.com/lhorie/mithril.js/wiki/Community-Projects-and-Snippets"
1539 | }]
1540 | }]
1541 | },
1542 | "montage": {
1543 | "name": "MontageJS",
1544 | "description": "MontageJS is a framework for building rich HTML5 applications optimized for today and tomorrow’s range of connected devices. It offers time-tested design patterns and software principles, a modular architecture, a friendly method to achieve a clean separation of concerns, and supports sharing packages and modules with your NodeJS server.",
1545 | "homepage": "montagejs.org",
1546 | "examples": [{
1547 | "name": "Example",
1548 | "url": "examples/montage"
1549 | }],
1550 | "link_groups": [{
1551 | "heading": "Official Resources",
1552 | "links": [{
1553 | "name": "Quick Start",
1554 | "url": "http://montagejs.org/docs/montagejs-setup.html"
1555 | }, {
1556 | "name": "Documentation",
1557 | "url": "http://montagejs.org/docs"
1558 | }, {
1559 | "name": "API Reference",
1560 | "url": "http://montagejs.org/api"
1561 | }, {
1562 | "name": "Applications built with MontageJS",
1563 | "url": "http://montagejs.org/apps"
1564 | }, {
1565 | "name": "MontageJS on GitHub",
1566 | "url": "https://github.com/montagejs/montage"
1567 | }, {
1568 | "name": "Minit - MontageJS Initializer",
1569 | "url": "https://github.com/montagejs/minit"
1570 | }, {
1571 | "name": "MOP - MontageJS Optimizer",
1572 | "url": "https://github.com/montagejs/mop"
1573 | }]
1574 | }, {
1575 | "heading": "Articles and Guides",
1576 | "links": [{
1577 | "name": "YouTube - Getting Started",
1578 | "url": "http://www.youtube.com/watch?v=JfT1ML200JI"
1579 | }, {
1580 | "name": "My First MontageJS Application",
1581 | "url": "http://renaun.com/blog/2013/05/my-first-montagejs-application/"
1582 | }]
1583 | }, {
1584 | "heading": "Community",
1585 | "links": [{
1586 | "name": "IRC",
1587 | "url": "http://webchat.freenode.net/?channels=montage"
1588 | }, {
1589 | "name": "Mailing list on Google Groups",
1590 | "url": "https://groups.google.com/forum/?fromgroups#!forum/montagejs"
1591 | }, {
1592 | "name": "Montage on Twitter",
1593 | "url": "http://twitter.com/montagejs"
1594 | }, {
1595 | "name": "Montage on Google+",
1596 | "url": "https://plus.google.com/116915300739108010954"
1597 | }]
1598 | }]
1599 | },
1600 | "olives": {
1601 | "name": "Olives.js",
1602 | "description": "A JS Framework for creating realtime and scalable applications. Based on Emily.js and socket.io.",
1603 | "homepage": "flams.github.io/olives",
1604 | "examples": [{
1605 | "name": "Example",
1606 | "url": "examples/olives"
1607 | }],
1608 | "link_groups": [{
1609 | "heading": "Official Resources",
1610 | "links": [{
1611 | "name": "Documentation",
1612 | "url": "http://flams.github.io/olives/docs/latest"
1613 | }, {
1614 | "name": "Applications built with Olives.js",
1615 | "url": "http://flams.github.io/olives/#liveexamples"
1616 | }, {
1617 | "name": "Olives.js on GitHub",
1618 | "url": "https://github.com/flams/olives"
1619 | }]
1620 | }]
1621 | },
1622 | "polymer": {
1623 | "name": "Polymer",
1624 | "description": "Polymer is a new type of library for the web, built on top of Web Components, and designed to leverage the evolving web platform on modern browsers. It is comprised of core platform features (e.g Shadow DOM, Custom Elements, MDV) enabled with polyfills and a next generation web application framework built on these technologies.",
1625 | "homepage": "polymer-project.org",
1626 | "examples": [{
1627 | "name": "Example",
1628 | "url": "examples/polymer"
1629 | }],
1630 | "link_groups": [{
1631 | "heading": "Official Resources",
1632 | "links": [{
1633 | "name": "Documentation",
1634 | "url": "http://www.polymer-project.org/docs/start/usingelements.html"
1635 | }, {
1636 | "name": "API Reference",
1637 | "url": "http://www.polymer-project.org/docs/polymer/polymer.html"
1638 | }, {
1639 | "name": "Polymer on GitHub",
1640 | "url": "https://github.com/polymer"
1641 | }, {
1642 | "name": "Polymer on Stack Overflow",
1643 | "url": "http://stackoverflow.com/questions/tagged/polymer"
1644 | }]
1645 | }, {
1646 | "heading": "Videos",
1647 | "links": [{
1648 | "name": "Polymer And The Web Components Revolution",
1649 | "url": "https://www.youtube.com/watch?v=yRbOSdAe_JU"
1650 | }, {
1651 | "name": "Polymer And Web Components Change Everything",
1652 | "url": "https://www.youtube.com/watch?v=8OJ7ih8EE7s"
1653 | }]
1654 | }, {
1655 | "heading": "Community",
1656 | "links": [{
1657 | "name": "Mailing list on Google Groups",
1658 | "url": "https://groups.google.com/forum/#!msg/polymer-dev/"
1659 | }, {
1660 | "name": "Web Components on Google+",
1661 | "url": "https://plus.google.com/103330502635338602217/"
1662 | }]
1663 | }]
1664 | },
1665 | "puremvc": {
1666 | "name": "PureMVC",
1667 | "description": "PureMVC is a lightweight framework for creating applications based upon the classic Model, View and Controller concept.",
1668 | "homepage": "puremvc.org",
1669 | "examples": [{
1670 | "name": "Example",
1671 | "url": "examples/puremvc"
1672 | }],
1673 | "link_groups": [{
1674 | "heading": "Official Resources",
1675 | "links": [{
1676 | "name": "Documentation",
1677 | "url": "http://puremvc.org/content/view/98/189"
1678 | }, {
1679 | "name": "Applications built with PureMVC",
1680 | "url": "http://puremvc.org/content/blogsection/9/176"
1681 | }, {
1682 | "name": "FAQ",
1683 | "url": "http://puremvc.org/content/section/3/188"
1684 | }, {
1685 | "name": "PureMVC on GitHub",
1686 | "url": "https://github.com/puremvc"
1687 | }]
1688 | }, {
1689 | "heading": "Articles and Guides",
1690 | "links": [{
1691 | "name": "PureMVC Performance Test",
1692 | "url": "http://blog.kaegi.net/puremvc-performance-test-compared-to-using-no-framework"
1693 | }]
1694 | }, {
1695 | "heading": "Community",
1696 | "links": [{
1697 | "name": "PureMVC on Stack Overflow",
1698 | "url": "http://stackoverflow.com/questions/tagged/puremvc"
1699 | }, {
1700 | "name": "PureMVC on Twitter",
1701 | "url": "http://twitter.com/puremvc"
1702 | }, {
1703 | "name": "PureMVC on Google+",
1704 | "url": "https://plus.google.com/+puremvc/posts"
1705 | }]
1706 | }]
1707 | },
1708 | "ractive": {
1709 | "name": "Ractive.js",
1710 | "description": "Ractive is a next-generation DOM manipulation library for creating reactive user interfaces, optimised for developer sanity. It was originally developed to create interactive news applications at theguardian.com.",
1711 | "homepage": "ractivejs.org",
1712 | "examples": [{
1713 | "name": "Example",
1714 | "url": "examples/ractive"
1715 | }],
1716 | "link_groups": [{
1717 | "heading": "Official Resources",
1718 | "links": [{
1719 | "name": "Ractive.js on GitHub",
1720 | "url": "https://github.com/RactiveJS/Ractive"
1721 | }, {
1722 | "name": "Wiki",
1723 | "url": "https://github.com/RactiveJS/Ractive/wiki"
1724 | }, {
1725 | "name": "60-second setup",
1726 | "url": "https://github.com/Rich-Harris/Ractive/wiki/60-second-setup"
1727 | }, {
1728 | "name": "Interactive tutorials",
1729 | "url": "http://learn.ractivejs.org"
1730 | }, {
1731 | "name": "Examples",
1732 | "url": "http://ractivejs.org/examples"
1733 | }]
1734 | }, {
1735 | "heading": "Community",
1736 | "links": [{
1737 | "name": "Ractive.js on Twitter",
1738 | "url": "http://twitter.com/RactiveJS"
1739 | }, {
1740 | "name": "Ractive.js on Stack Overflow",
1741 | "url": "http://stackoverflow.com/questions/tagged/ractivejs"
1742 | }]
1743 | }]
1744 | },
1745 | "rappidjs": {
1746 | "name": "rAppid.js",
1747 | "description": "The declarative Rich Internet Application Javascript MVC Framework.",
1748 | "homepage": "rappidjs.com",
1749 | "examples": [{
1750 | "name": "Example",
1751 | "url": "examples/rappidjs"
1752 | }],
1753 | "link_groups": [{
1754 | "heading": "Official Resources",
1755 | "links": [{
1756 | "name": "API Reference",
1757 | "url": "http://www.rappidjs.com/#/api"
1758 | }, {
1759 | "name": "Wiki",
1760 | "url": "http://www.rappidjs.com/#/wiki"
1761 | }, {
1762 | "name": "UI Components",
1763 | "url": "http://www.rappidjs.com/#/ui"
1764 | }, {
1765 | "name": "Blog",
1766 | "url": "http://blog.rappidjs.com"
1767 | }, {
1768 | "name": "rAppid.js on GitHub",
1769 | "url": "https://github.com/rappid/rAppid.js"
1770 | }]
1771 | }, {
1772 | "heading": "Community",
1773 | "links": [{
1774 | "name": "rAppid.js on Twitter",
1775 | "url": "http://twitter.com/rappidjs"
1776 | }]
1777 | }]
1778 | },
1779 | "react": {
1780 | "name": "React",
1781 | "description": "React is a JavaScript library for creating user interfaces. Its core principles are declarative code, efficiency, and flexibility. Simply specify what your component looks like and React will keep it up-to-date when the underlying data changes.",
1782 | "homepage": "facebook.github.io/react",
1783 | "examples": [{
1784 | "name": "Example",
1785 | "url": "examples/react"
1786 | }, {
1787 | "name": "React & Backbone.js",
1788 | "url": "examples/react-backbone"
1789 | }],
1790 | "link_groups": [{
1791 | "heading": "Official Resources",
1792 | "links": [{
1793 | "name": "Tutorial",
1794 | "url": "http://facebook.github.io/react/docs/tutorial.html"
1795 | }, {
1796 | "name": "Philosophy",
1797 | "url": "http://www.quora.com/Pete-Hunt/Posts/React-Under-the-Hood"
1798 | }, {
1799 | "name": "Support",
1800 | "url": "http://facebook.github.io/react/support.html"
1801 | }, {
1802 | "name": "Flux architecture example",
1803 | "url": "https://github.com/facebook/flux/tree/master/examples/flux-todomvc"
1804 | }]
1805 | }, {
1806 | "heading": "Community",
1807 | "links": [{
1808 | "name": "ReactJS on Stack Overflow",
1809 | "url": "https://stackoverflow.com/questions/tagged/reactjs"
1810 | }, {
1811 | "name": "Google Groups Mailing List",
1812 | "url": "https://groups.google.com/group/reactjs"
1813 | }, {
1814 | "name": "IRC",
1815 | "url": "irc://chat.freenode.net/reactjs"
1816 | }]
1817 | }]
1818 | },
1819 | "reagent": {
1820 | "name": "Reagent",
1821 | "description": "Reagent provides a minimalistic interface between ClojureScript and React. It allows you to define efficient React components using nothing but plain ClojureScript functions and data, that describe your UI using a Hiccup-like syntax.",
1822 | "homepage": "reagent-project.github.io/",
1823 | "examples": [{
1824 | "name": "Example",
1825 | "url": "examples/reagent"
1826 | }],
1827 | "link_groups": [{
1828 | "heading": "Official Resources",
1829 | "links": [{
1830 | "name": "Reagent Template",
1831 | "url": "https://github.com/reagent-project/reagent-template"
1832 | }, {
1833 | "name": "Reagent Cookbook",
1834 | "url": "https://github.com/reagent-project/reagent-cookbook"
1835 | }, {
1836 | "name": "Reagent Forms",
1837 | "url": "https://github.com/reagent-project/reagent-forms"
1838 | }]
1839 | }, {
1840 | "heading": "Community",
1841 | "links": [{
1842 | "name": "Reagent on Stack Overflow",
1843 | "url": "http://stackoverflow.com/questions/tagged/reagent"
1844 | }, {
1845 | "name": "Google Groups Mailing List",
1846 | "url": "https://groups.google.com/forum/#!forum/reagent-project"
1847 | }, {
1848 | "name": "Reagent on Twitter",
1849 | "url": "https://twitter.com/ReagentProject"
1850 | }, {
1851 | "name": "Reagent YouTube Channel",
1852 | "url": "https://www.youtube.com/channel/UC1UP5LiNNNf0a45dA9eDA0Q"
1853 | }]
1854 | }]
1855 | },
1856 | "sammyjs": {
1857 | "name": "Sammy.js",
1858 | "description": "A small web framework with class.",
1859 | "homepage": "sammyjs.org",
1860 | "examples": [{
1861 | "name": "Example",
1862 | "url": "examples/sammyjs"
1863 | }],
1864 | "link_groups": [{
1865 | "heading": "Official Resources",
1866 | "links": [{
1867 | "name": "Introduction",
1868 | "url": "http://sammyjs.org/intro"
1869 | }, {
1870 | "name": "Documentation",
1871 | "url": "http://sammyjs.org/docs"
1872 | }, {
1873 | "name": "Wiki",
1874 | "url": "http://sammyjs.org/wiki"
1875 | }, {
1876 | "name": "FAQ",
1877 | "url": "http://sammyjs.org/faq"
1878 | }, {
1879 | "name": "Sammy.js on GitHub",
1880 | "url": "http://github.com/quirkey/sammy"
1881 | }]
1882 | }, {
1883 | "heading": "Articles and Guides",
1884 | "links": [{
1885 | "name": "Sammy.js For RESTful Evented JavaScript",
1886 | "url": "http://churchm.ag/sammy-js-for-restful-evented-javascript"
1887 | }]
1888 | }, {
1889 | "heading": "Community",
1890 | "links": [{
1891 | "name": "Mailing list on Google Groups",
1892 | "url": "http://groups.google.com/group/sammyjs"
1893 | }, {
1894 | "name": "Sammy.js on Twitter",
1895 | "url": "http://twitter.com/sammy_js"
1896 | }]
1897 | }]
1898 | },
1899 | "sapui5": {
1900 | "name": "SAPUI5",
1901 | "description": "SAP's HTML5-based UI technology that allows you to build rich, interactive Web applications.",
1902 | "homepage": "scn.sap.com/community/developer-center/front-end",
1903 | "examples": [{
1904 | "name": "Example",
1905 | "url": "examples/sapui5"
1906 | }],
1907 | "link_groups": [{
1908 | "heading": "Official Resources",
1909 | "links": [{
1910 | "name": "Introduction",
1911 | "url": "http://scn.sap.com/community/developer-center/front-end/blog/2013/03/19/how-to-build-testable-sapui5-applications"
1912 | }, {
1913 | "name": "Getting Started",
1914 | "url": "https://sapui5.netweaver.ondemand.com/"
1915 | }, {
1916 | "name": "API Reference",
1917 | "url": "https://sapui5.netweaver.ondemand.com/sdk/#content/Overview.html"
1918 | }, {
1919 | "name": "Twitter Search",
1920 | "url": "https://twitter.com/search?q=%23sapui5"
1921 | }, {
1922 | "name": "OpenUI5 Twitter",
1923 | "url": "https://twitter.com/OpenUI5"
1924 | }]
1925 | }]
1926 | },
1927 | "serenadejs": {
1928 | "name": "Serenade.js",
1929 | "description": "Serenade.js is a client side framework built on the MVC pattern. It makes it simple to create rich client side applications by freeing you from having to keep the DOM up to date with your data through powerful data bindings.",
1930 | "homepage": "serenadejs.org",
1931 | "examples": [{
1932 | "name": "Example",
1933 | "url": "examples/serenadejs"
1934 | }],
1935 | "link_groups": [{
1936 | "heading": "Official Resources",
1937 | "links": [{
1938 | "name": "Introduction",
1939 | "url": "http://serenadejs.org/introduction.html"
1940 | }, {
1941 | "name": "Applications built with Serenade.js",
1942 | "url": "http://serenade.herokuapp.com"
1943 | }, {
1944 | "name": "Serenade.js on GitHub",
1945 | "url": "https://github.com/elabs/serenade.js"
1946 | }]
1947 | }, {
1948 | "heading": "Community",
1949 | "links": [{
1950 | "name": "Serenade.js on Twitter",
1951 | "url": "http://twitter.com/serenadejs"
1952 | }]
1953 | }]
1954 | },
1955 | "socketstream": {
1956 | "name": "SocketStream",
1957 | "description": "SocketStream 0.3 is a fast, modular Node.js web framework dedicated to building realtime single-page apps.",
1958 | "homepage": "socketstream.org",
1959 | "examples": [{
1960 | "name": "Real-time Example",
1961 | "url": "examples/socketstream/README.md",
1962 | "source_url": "examples/socketstream"
1963 | }],
1964 | "link_groups": [{
1965 | "heading": "Official Resources",
1966 | "links": [{
1967 | "name": "Tour",
1968 | "url": "http://www.socketstream.org/tour"
1969 | }, {
1970 | "name": "SocketStream on GitHub",
1971 | "url": "https://github.com/socketstream"
1972 | }]
1973 | }, {
1974 | "heading": "Articles and Guides",
1975 | "links": [{
1976 | "name": "Video - Owen Barnes introduces SocketStream",
1977 | "url": "http://www.infoq.com/presentations/SocketStream"
1978 | }]
1979 | }, {
1980 | "heading": "Community",
1981 | "links": [{
1982 | "name": "SocketStream on Stack Overflow",
1983 | "url": "http://stackoverflow.com/questions/tagged/socketstream"
1984 | }, {
1985 | "name": "SocketStream on Twitter",
1986 | "url": "http://twitter.com/socketstream"
1987 | }]
1988 | }]
1989 | },
1990 | "somajs": {
1991 | "name": "soma.js",
1992 | "description": "soma.js is a framework created to build scalable and maintainable javascript applications.",
1993 | "homepage": "somajs.github.io/somajs",
1994 | "examples": [{
1995 | "name": "Example",
1996 | "url": "examples/somajs"
1997 | }, {
1998 | "name": "Example",
1999 | "url": "examples/somajs_require"
2000 | }],
2001 | "link_groups": [{
2002 | "heading": "Official Resources",
2003 | "links": [{
2004 | "name": "Slides: Introduction",
2005 | "url": "http://somajs.github.io/somajs/#/1"
2006 | }, {
2007 | "name": "Quick Start",
2008 | "url": "http://somajs.github.io/somajs/site/#quick-start"
2009 | }, {
2010 | "name": "Demos",
2011 | "url": "http://somajs.github.io/somajs/site/#demos"
2012 | }, {
2013 | "name": "Blog",
2014 | "url": "http://www.soundstep.com/blog"
2015 | }, {
2016 | "name": "soma.js on GitHub",
2017 | "url": "https://github.com/somajs/somajs"
2018 | }]
2019 | }, {
2020 | "heading": "Community",
2021 | "links": [{
2022 | "name": "Mailing list on Google Groups",
2023 | "url": "https://groups.google.com/forum/#!forum/somajs"
2024 | }, {
2025 | "name": "soma.js on Twitter",
2026 | "url": "http://twitter.com/soundstep"
2027 | }]
2028 | }]
2029 | },
2030 | "spine": {
2031 | "name": "Spine.js",
2032 | "description": "Build Awesome JavaScript MVC Applications.",
2033 | "homepage": "spinejs.com",
2034 | "examples": [{
2035 | "name": "Example",
2036 | "url": "examples/spine"
2037 | }],
2038 | "link_groups": [{
2039 | "heading": "Official Resources",
2040 | "links": [{
2041 | "name": "Documentation",
2042 | "url": "http://spinejs.com/docs/"
2043 | }, {
2044 | "name": "Step by Step Tutorials",
2045 | "url": "http://spinejs.com/docs/example"
2046 | }, {
2047 | "name": "API Reference",
2048 | "url": "http://spinejs.com/api/index"
2049 | }]
2050 | }, {
2051 | "heading": "Articles and Guides",
2052 | "links": [{
2053 | "name": "Building JavaScript Web Apps With MVC & Spine.js",
2054 | "url": "http://addyosmani.com/blog/building-apps-spinejs"
2055 | }]
2056 | }, {
2057 | "heading": "Community",
2058 | "links": [{
2059 | "name": "Spine on Stack Overflow",
2060 | "url": "http://stackoverflow.com/questions/tagged/spine.js"
2061 | }, {
2062 | "name": "Mailing list on Google Groups",
2063 | "url": "https://groups.google.com/forum/#!forum/spinejs"
2064 | }, {
2065 | "name": "Spine's author, Alex MacCaw, on Twitter",
2066 | "url": "http://twitter.com/maccman"
2067 | }]
2068 | }]
2069 | },
2070 | "thorax": {
2071 | "name": "Thorax",
2072 | "description": "An opinionated, battle-tested Backbone + Handlebars framework to build large scale web applications.",
2073 | "homepage": "thoraxjs.org",
2074 | "examples": [{
2075 | "name": "Example",
2076 | "url": "examples/thorax"
2077 | }, {
2078 | "name": "Thorax & Lumbar",
2079 | "url": "examples/thorax_lumbar/public"
2080 | }],
2081 | "link_groups": [{
2082 | "heading": "Official Resources",
2083 | "links": [{
2084 | "name": "Getting Started",
2085 | "url": "http://thoraxjs.org/start.html"
2086 | }, {
2087 | "name": "API Reference",
2088 | "url": "http://thoraxjs.org/api.html"
2089 | }, {
2090 | "name": "Screencast - Introduction to Thorax",
2091 | "url": "http://vimeo.com/60230630"
2092 | }, {
2093 | "name": "Seed Project",
2094 | "url": "https://github.com/walmartlabs/thorax-seed"
2095 | }, {
2096 | "name": "Thorax on GitHub",
2097 | "url": "https://github.com/walmartlabs/thorax"
2098 | }]
2099 | }, {
2100 | "heading": "Community",
2101 | "links": [{
2102 | "name": "Thorax on Twitter",
2103 | "url": "http://twitter.com/walmartlabs"
2104 | }]
2105 | }]
2106 | },
2107 | "troopjs": {
2108 | "name": "TroopJS",
2109 | "description": "The simple js framework that does as little as possible, then stays out of the way.",
2110 | "homepage": "troopjs.com",
2111 | "examples": [{
2112 | "name": "Example",
2113 | "url": "examples/troopjs_require"
2114 | }],
2115 | "link_groups": [{
2116 | "heading": "Official Resources",
2117 | "links": [{
2118 | "name": "TODOs Application (latest)",
2119 | "url": "https://github.com/troopjs/troopjs-todos"
2120 | }, {
2121 | "name": "TroopJS on GitHub",
2122 | "url": "https://github.com/troopjs"
2123 | }]
2124 | }]
2125 | },
2126 | "typescript": {
2127 | "name": "TypeScript",
2128 | "description": "TypeScript is a language for application-scale JavaScript development. TypeScript is a typed superset of JavaScript that compiles to plain JavaScript. Any browser. Any host. Any OS. Open Source.",
2129 | "homepage": "typescriptlang.org",
2130 | "examples": [{
2131 | "name": "TypeScript & AngularJS",
2132 | "url": "examples/typescript-angular"
2133 | }, {
2134 | "name": "TypeScript & Backbone.js",
2135 | "url": "examples/typescript-backbone"
2136 | }],
2137 | "link_groups": [{
2138 | "heading": "Official Resources",
2139 | "links": [{
2140 | "name": "Tutorial",
2141 | "url": "http://www.typescriptlang.org/Tutorial"
2142 | }, {
2143 | "name": "Code Playground",
2144 | "url": "http://www.typescriptlang.org/Playground"
2145 | }, {
2146 | "name": "Documentation",
2147 | "url": "http://typescript.codeplex.com/documentation"
2148 | }, {
2149 | "name": "Applications built with TypeScript",
2150 | "url": "http://www.typescriptlang.org/Samples"
2151 | }, {
2152 | "name": "Blog",
2153 | "url": "http://blogs.msdn.com/b/typescript"
2154 | }, {
2155 | "name": "Source Code",
2156 | "url": "http://typescript.codeplex.com/sourcecontrol/latest#README.txt"
2157 | }]
2158 | }, {
2159 | "heading": "Articles and Guides",
2160 | "links": [{
2161 | "name": "Thoughts on TypeScript",
2162 | "url": "http://www.nczonline.net/blog/2012/10/04/thoughts-on-typescript"
2163 | }, {
2164 | "name": "ScreenCast - Why I Like TypeScript",
2165 | "url": "http://www.leebrimelow.com/why-i-like-typescripts"
2166 | }]
2167 | }, {
2168 | "heading": "Community",
2169 | "links": [{
2170 | "name": "TypeScript on Stack Overflow",
2171 | "url": "http://stackoverflow.com/questions/tagged/typescript"
2172 | }, {
2173 | "name": "Forums",
2174 | "url": "http://typescript.codeplex.com/discussions"
2175 | }, {
2176 | "name": "TypeScript on Twitter",
2177 | "url": "http://twitter.com/typescriptlang"
2178 | }]
2179 | }]
2180 | },
2181 | "vue": {
2182 | "name": "Vue.js",
2183 | "description": "Vue.js provides efficient MVVM data bindings with a simple and flexible API. It uses plain JavaScript object models, DOM-based templating and extendable directives and filters.",
2184 | "homepage": "vuejs.org",
2185 | "examples": [{
2186 | "name": "Example",
2187 | "url": "examples/vue"
2188 | }],
2189 | "link_groups": [{
2190 | "heading": "Official Resources",
2191 | "links": [{
2192 | "name": "Documentation",
2193 | "url": "http://vuejs.org/guide/"
2194 | }, {
2195 | "name": "API Reference",
2196 | "url": "http://vuejs.org/api/"
2197 | }, {
2198 | "name": "Examples",
2199 | "url": "http://vuejs.org/examples/"
2200 | }, {
2201 | "name": "Vue.js on GitHub",
2202 | "url": "https://github.com/yyx990803/vue"
2203 | }]
2204 | }, {
2205 | "heading": "Community",
2206 | "links": [{
2207 | "name": "Twitter",
2208 | "url": "http://twitter.com/vuejs"
2209 | }, {
2210 | "name": "Gitter Channel",
2211 | "url": "https://gitter.im/yyx990803/vue"
2212 | }, {
2213 | "name": "Discussions on GitHub",
2214 | "url": "https://github.com/vuejs/Discussion/issues"
2215 | }]
2216 | }]
2217 | },
2218 | "yui": {
2219 | "name": "YUI",
2220 | "description": "YUI is a free, open source JavaScript and CSS library for building richly interactive web applications.",
2221 | "homepage": "yuilibrary.com",
2222 | "examples": [{
2223 | "name": "Example",
2224 | "url": "examples/yui"
2225 | }],
2226 | "link_groups": [{
2227 | "heading": "Official Resources",
2228 | "links": [{
2229 | "name": "Documentation",
2230 | "url": "http://yuilibrary.com/yui/docs"
2231 | }, {
2232 | "name": "Quick Start",
2233 | "url": "http://yuilibrary.com/yui/quick-start"
2234 | }, {
2235 | "name": "Tutorials",
2236 | "url": "http://yuilibrary.com/yui/docs/tutorials"
2237 | }, {
2238 | "name": "Examples",
2239 | "url": "http://yuilibrary.com/yui/docs/examples"
2240 | }, {
2241 | "name": "Blog",
2242 | "url": "http://yuiblog.com"
2243 | }]
2244 | }, {
2245 | "heading": "Community",
2246 | "links": [{
2247 | "name": "YUI on Stack Overflow",
2248 | "url": "http://stackoverflow.com/questions/tagged/yui"
2249 | }, {
2250 | "name": "Forums",
2251 | "url": "http://yuilibrary.com/forum"
2252 | }, {
2253 | "name": "YUI on Twitter",
2254 | "url": "http://twitter.com/yuilibrary"
2255 | }]
2256 | }]
2257 | },
2258 | "webrx": {
2259 | "name": "WebRx",
2260 | "description": "WebRx is a browser-based MVVM-Framework written in Typescript that combines functional-reactive programming with declarative Data-Binding and Templating.",
2261 | "homepage": "webrxjs.org",
2262 | "examples": [{
2263 | "name": "Example",
2264 | "url": "examples/webrx"
2265 | }],
2266 | "link_groups": [{
2267 | "heading": "Official Resources",
2268 | "links": [{
2269 | "name": "Tutorial",
2270 | "url": "http://webrxjs.org/docs/getting-started.html"
2271 | }, {
2272 | "name": "API Reference",
2273 | "url": "http://webrxjs.org/api/modules/_interfaces_.wx.html"
2274 | }, {
2275 | "name": "Documentation",
2276 | "url": "http://webrxjs.org/docs"
2277 | }, {
2278 | "name": "Live examples",
2279 | "url": "http://webrxjs.org/docs/examples.html"
2280 | }]
2281 | }, {
2282 | "heading": "Community",
2283 | "links": [{
2284 | "name": "WebRx on Stack Overflow",
2285 | "url": "http://stackoverflow.com/questions/tagged/webrx"
2286 | }, {
2287 | "name": "WebRx on Twitter",
2288 | "url": "http://twitter.com/webrxjs"
2289 | }]
2290 | }, {
2291 | "angular2": {
2292 | "name": "Angular2",
2293 | "description": "Angular is a development platform for building mobile and desktop web applications",
2294 | "homepage": "https://angular.io/",
2295 | "examples": [{
2296 | "name": "Example",
2297 | "url": "examples/angular2"
2298 | }],
2299 | "link_groups": [{
2300 | "heading": "Official Resources",
2301 | "links": [{
2302 | "name": "Tutorial",
2303 | "url": "https://angular.io/docs/js/latest/quickstart.html"
2304 | }]
2305 | }]
2306 | }}]
2307 | },
2308 | "templates": {
2309 | "todomvc": "
<%= description %>
<% if (typeof link_groups !== 'undefined') { %>
<% link_groups.forEach(function (link_group) { %> <%= link_group.heading %>
<% }); %> <% } %> "
2310 | }
2311 | }
2312 |
--------------------------------------------------------------------------------