You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by cx...@apache.org on 2017/03/27 07:42:14 UTC

[08/18] incubator-weex git commit: Merge branch 'v0.10.0-playground' into 0.11-dev

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/93063f14/android/playground/app/src/main/assets/vue/index.js
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/assets/vue/index.js b/android/playground/app/src/main/assets/vue/index.js
new file mode 100644
index 0000000..2270e82
--- /dev/null
+++ b/android/playground/app/src/main/assets/vue/index.js
@@ -0,0 +1,496 @@
+// { "framework": "Vue" }
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId])
+/******/ 			return installedModules[moduleId].exports;
+
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			exports: {},
+/******/ 			id: moduleId,
+/******/ 			loaded: false
+/******/ 		};
+
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+
+/******/ 		// Flag the module as loaded
+/******/ 		module.loaded = true;
+
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+
+
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ 0:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* script */
+	__vue_exports__ = __webpack_require__(468)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(480)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/index.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+	module.exports.el = 'true'
+	new Vue(module.exports)
+
+
+/***/ },
+
+/***/ 421:
+/***/ function(module, exports) {
+
+	exports.getBaseURL = function (vm) {
+	  var bundleUrl = vm.$getConfig().bundleUrl;
+	  var nativeBase;
+	  var isAndroidAssets = bundleUrl.indexOf('your_current_IP') >= 0 || bundleUrl.indexOf('file://assets/')>=0;
+	  var isiOSAssets = bundleUrl.indexOf('file:///') >= 0 && bundleUrl.indexOf('WeexDemo.app') > 0;
+	  if (isAndroidAssets) {
+	    nativeBase = 'file://assets/';
+	  }
+	  else if (isiOSAssets) {
+	    // file:///var/mobile/Containers/Bundle/Application/{id}/WeexDemo.app/
+	    // file:///Users/{user}/Library/Developer/CoreSimulator/Devices/{id}/data/Containers/Bundle/Application/{id}/WeexDemo.app/
+	    nativeBase = bundleUrl.substring(0, bundleUrl.lastIndexOf('/') + 1);
+	  }
+	  else {
+	    var host = 'localhost:12580';
+	    var matches = /\/\/([^\/]+?)\//.exec(vm.$getConfig().bundleUrl);
+	    if (matches && matches.length >= 2) {
+	      host = matches[1];
+	    }
+	    nativeBase = 'http://' + host + '/' + vm.dir + '/build/';
+	  }
+	  var h5Base = './index.html?page=./' + vm.dir + '/build/';
+	  // in Native
+	  var base = nativeBase;
+	  if (typeof window === 'object') {
+	    // in Browser or WebView
+	    base = h5Base;
+	  }
+	  return base
+	}
+
+
+/***/ },
+
+/***/ 468:
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+
+	module.exports = {
+	  data: function data() {
+	    return {
+	      items: [
+	      // common
+	      { name: 'vue/syntax/hello-world', title: 'Hello World' }, { name: 'vue/style/index', title: 'Common Style' }, { name: 'vue/animation', title: 'Animation' },
+
+	      // component
+	      { name: 'vue/components/text', title: 'Text' }, { name: 'vue/components/image', title: 'Image' }, { name: 'vue/components/input', title: 'Input' }, { name: 'vue/components/scroller', title: 'Scroller' }, { name: 'vue/components/list', title: 'List' }, { name: 'vue/components/slider', title: 'Slider' }, { name: 'vue/components/a', title: 'A' }, { name: 'vue/components/video', title: 'Video' }, { name: 'vue/components/countdown', title: 'Countdown' }, { name: 'vue/components/marquee', title: 'Marquee' }, { name: 'vue/components/web', title: 'Web' }, { name: 'vue/components/navigator', title: 'Navigator' }, { name: 'vue/components/tabbar', title: 'Tabbar' },
+
+	      // module
+	      { name: 'vue/modules/instance-api', title: 'Instance API' }, { name: 'vue/modules/modal', title: 'Modal' }, { name: 'vue/modules/stream', title: 'Stream' }, { name: 'vue/modules/storage', title: 'Storage' },
+	      // {name: 'module/clipboard', title: 'Clipboard'}, // 0.8 , developing
+
+	      // showcase
+	      { name: 'vue/showcase/progress', title: 'Progress Bar' }, { name: 'vue/showcase/itemlist', title: 'List (Advanced)' }, { name: 'vue/showcase/calculator', title: 'Calculator' }]
+	    };
+	  },
+	  components: {
+	    exampleList: __webpack_require__(469)
+	  }
+	};
+
+/***/ },
+
+/***/ 469:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* script */
+	__vue_exports__ = __webpack_require__(470)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(479)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/include/example-list.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+
+
+/***/ },
+
+/***/ 470:
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	var getBaseURL = __webpack_require__(421).getBaseURL;
+	module.exports = {
+	  props: {
+	    dir: {
+	      default: 'examples'
+	    }, // examples, test ...
+	    items: {
+	      default: [{ name: 'hello', title: 'Hello World', url: '' }]
+	    }
+	  },
+	  components: {
+	    exampleListItem: __webpack_require__(471)
+	  },
+	  created: function created() {
+	    var base = getBaseURL(this);
+	    for (var i in this.items) {
+	      var item = this.items[i];
+	      if (!item.url) {
+	        item.url = base + item.name + '.js';
+	      }
+	    }
+	  }
+	};
+
+/***/ },
+
+/***/ 471:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* styles */
+	__vue_styles__.push(__webpack_require__(472)
+	)
+
+	/* script */
+	__vue_exports__ = __webpack_require__(473)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(478)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/include/example-list-item.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+
+
+/***/ },
+
+/***/ 472:
+/***/ function(module, exports) {
+
+	module.exports = {
+	  "item-txt": {
+	    "fontSize": 48,
+	    "color": "#555555"
+	  }
+	}
+
+/***/ },
+
+/***/ 473:
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	var event = __weex_require_module__('event');
+	module.exports = {
+	  props: {
+	    title: { default: '456' },
+	    url: { default: '' }
+	  },
+	  components: {
+	    listItem: __webpack_require__(474)
+	  },
+	  methods: {
+	    redirect: function redirect() {
+	      event.openURL(this.url);
+	    }
+	  }
+	};
+
+/***/ },
+
+/***/ 474:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* styles */
+	__vue_styles__.push(__webpack_require__(475)
+	)
+
+	/* script */
+	__vue_exports__ = __webpack_require__(476)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(477)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/include/list-item.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+
+
+/***/ },
+
+/***/ 475:
+/***/ function(module, exports) {
+
+	module.exports = {
+	  "item": {
+	    "paddingTop": 25,
+	    "paddingBottom": 25,
+	    "paddingLeft": 35,
+	    "paddingRight": 35,
+	    "height": 160,
+	    "justifyContent": "center",
+	    "borderBottomWidth": 1,
+	    "borderColor": "#dddddd"
+	  }
+	}
+
+/***/ },
+
+/***/ 476:
+/***/ function(module, exports) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	module.exports = {
+	  props: {
+	    bgColor: { default: '#ffffff' }
+	  },
+	  methods: {
+	    click: function click() {
+	      this.$emit('click');
+	    },
+	    touchstart: function touchstart() {
+	      // FIXME android touch
+	      // TODO adaptive opposite bgColor
+	      // this.bgColor = '#e6e6e6';
+	    },
+	    touchend: function touchend() {
+	      // FIXME android touchend not triggered
+	      // this.bgColor = '#ffffff';
+	    }
+	  }
+	};
+
+/***/ },
+
+/***/ 477:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('div', {
+	    staticClass: ["item"],
+	    style: {
+	      backgroundColor: _vm.bgColor
+	    },
+	    on: {
+	      "click": _vm.click,
+	      "touchstart": _vm.touchstart,
+	      "touchend": _vm.touchend
+	    }
+	  }, [_vm._t("default")])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ },
+
+/***/ 478:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('list-item', {
+	    on: {
+	      "click": _vm.redirect
+	    }
+	  }, [_h('text', {
+	    staticClass: ["item-txt"]
+	  }, [_vm._s(_vm.title)])])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ },
+
+/***/ 479:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('list', [_vm._l((_vm.items), function(item) {
+	    return _h('cell', {
+	      appendAsTree: true,
+	      attrs: {
+	        "append": "tree"
+	      }
+	    }, [_h('example-list-item', {
+	      attrs: {
+	        "title": item.title,
+	        "url": item.url
+	      }
+	    })])
+	  })])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ },
+
+/***/ 480:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('example-list', {
+	    attrs: {
+	      "items": _vm.items,
+	      "dir": "examples"
+	    }
+	  })
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ }
+
+/******/ });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/93063f14/android/playground/app/src/main/assets/vue/modules/clipboard.js
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/assets/vue/modules/clipboard.js b/android/playground/app/src/main/assets/vue/modules/clipboard.js
new file mode 100644
index 0000000..ea4f907
--- /dev/null
+++ b/android/playground/app/src/main/assets/vue/modules/clipboard.js
@@ -0,0 +1,691 @@
+// { "framework": "Vue" }
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId])
+/******/ 			return installedModules[moduleId].exports;
+
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			exports: {},
+/******/ 			id: moduleId,
+/******/ 			loaded: false
+/******/ 		};
+
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+
+/******/ 		// Flag the module as loaded
+/******/ 		module.loaded = true;
+
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+
+
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ 0:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* script */
+	__vue_exports__ = __webpack_require__(481)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(482)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/modules/clipboard.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+	module.exports.el = 'true'
+	new Vue(module.exports)
+
+
+/***/ },
+
+/***/ 383:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* styles */
+	__vue_styles__.push(__webpack_require__(384)
+	)
+
+	/* script */
+	__vue_exports__ = __webpack_require__(385)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(386)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/include/panel.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+
+
+/***/ },
+
+/***/ 384:
+/***/ function(module, exports) {
+
+	module.exports = {
+	  "panel": {
+	    "marginBottom": 20,
+	    "backgroundColor": "#ffffff",
+	    "borderColor": "#dddddd",
+	    "borderWidth": 1
+	  },
+	  "panel-primary": {
+	    "borderColor": "rgb(40,96,144)"
+	  },
+	  "panel-success": {
+	    "borderColor": "rgb(76,174,76)"
+	  },
+	  "panel-info": {
+	    "borderColor": "rgb(70,184,218)"
+	  },
+	  "panel-warning": {
+	    "borderColor": "rgb(238,162,54)"
+	  },
+	  "panel-danger": {
+	    "borderColor": "rgb(212,63,58)"
+	  },
+	  "panel-header": {
+	    "backgroundColor": "#f5f5f5",
+	    "fontSize": 40,
+	    "color": "#333333"
+	  },
+	  "panel-header-primary": {
+	    "backgroundColor": "rgb(40,96,144)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-success": {
+	    "backgroundColor": "rgb(92,184,92)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-info": {
+	    "backgroundColor": "rgb(91,192,222)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-warning": {
+	    "backgroundColor": "rgb(240,173,78)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-danger": {
+	    "backgroundColor": "rgb(217,83,79)",
+	    "color": "#ffffff"
+	  }
+	}
+
+/***/ },
+
+/***/ 385:
+/***/ function(module, exports) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	module.exports = {
+	  props: {
+	    type: { default: 'default' },
+	    title: { default: '' },
+	    paddingBody: { default: 20 },
+	    paddingHead: { default: 20 },
+	    dataClass: { default: '' }, // FIXME transfer class
+	    border: { default: 0 }
+	  }
+	};
+
+/***/ },
+
+/***/ 386:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('div', {
+	    class: ['panel', 'panel-' + _vm.type],
+	    style: {
+	      borderWidth: _vm.border
+	    }
+	  }, [_h('text', {
+	    class: ['panel-header', 'panel-header-' + _vm.type],
+	    style: {
+	      paddingTop: _vm.paddingHead,
+	      paddingBottom: _vm.paddingHead,
+	      paddingLeft: _vm.paddingHead * 1.5,
+	      paddingRight: _vm.paddingHead * 1.5
+	    }
+	  }, [_vm._s(_vm.title)]), _h('div', {
+	    class: ['panel-body', 'panel-body-' + _vm.type],
+	    style: {
+	      paddingTop: _vm.paddingBody,
+	      paddingBottom: _vm.paddingBody,
+	      paddingLeft: _vm.paddingBody * 1.5,
+	      paddingRight: _vm.paddingBody * 1.5
+	    }
+	  }, [_vm._t("default")])])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ },
+
+/***/ 387:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* styles */
+	__vue_styles__.push(__webpack_require__(388)
+	)
+
+	/* script */
+	__vue_exports__ = __webpack_require__(389)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(390)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/include/button.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+
+
+/***/ },
+
+/***/ 388:
+/***/ function(module, exports) {
+
+	module.exports = {
+	  "btn": {
+	    "marginBottom": 0,
+	    "alignItems": "center",
+	    "justifyContent": "center",
+	    "borderWidth": 1,
+	    "borderStyle": "solid",
+	    "borderColor": "#333333"
+	  },
+	  "btn-default": {
+	    "color": "rgb(51,51,51)"
+	  },
+	  "btn-primary": {
+	    "backgroundColor": "rgb(40,96,144)",
+	    "borderColor": "rgb(40,96,144)"
+	  },
+	  "btn-success": {
+	    "backgroundColor": "rgb(92,184,92)",
+	    "borderColor": "rgb(76,174,76)"
+	  },
+	  "btn-info": {
+	    "backgroundColor": "rgb(91,192,222)",
+	    "borderColor": "rgb(70,184,218)"
+	  },
+	  "btn-warning": {
+	    "backgroundColor": "rgb(240,173,78)",
+	    "borderColor": "rgb(238,162,54)"
+	  },
+	  "btn-danger": {
+	    "backgroundColor": "rgb(217,83,79)",
+	    "borderColor": "rgb(212,63,58)"
+	  },
+	  "btn-link": {
+	    "borderColor": "rgba(0,0,0,0)",
+	    "borderRadius": 0
+	  },
+	  "btn-txt-default": {
+	    "color": "rgb(51,51,51)"
+	  },
+	  "btn-txt-primary": {
+	    "color": "rgb(255,255,255)"
+	  },
+	  "btn-txt-success": {
+	    "color": "rgb(255,255,255)"
+	  },
+	  "btn-txt-info": {
+	    "color": "rgb(255,255,255)"
+	  },
+	  "btn-txt-warning": {
+	    "color": "rgb(255,255,255)"
+	  },
+	  "btn-txt-danger": {
+	    "color": "rgb(255,255,255)"
+	  },
+	  "btn-txt-link": {
+	    "color": "rgb(51,122,183)"
+	  },
+	  "btn-sz-large": {
+	    "width": 300,
+	    "height": 100,
+	    "paddingTop": 25,
+	    "paddingBottom": 25,
+	    "paddingLeft": 40,
+	    "paddingRight": 40,
+	    "borderRadius": 15
+	  },
+	  "btn-sz-middle": {
+	    "width": 240,
+	    "height": 80,
+	    "paddingTop": 15,
+	    "paddingBottom": 15,
+	    "paddingLeft": 30,
+	    "paddingRight": 30,
+	    "borderRadius": 10
+	  },
+	  "btn-sz-small": {
+	    "width": 170,
+	    "height": 60,
+	    "paddingTop": 12,
+	    "paddingBottom": 12,
+	    "paddingLeft": 25,
+	    "paddingRight": 25,
+	    "borderRadius": 7
+	  },
+	  "btn-txt-sz-large": {
+	    "fontSize": 45
+	  },
+	  "btn-txt-sz-middle": {
+	    "fontSize": 35
+	  },
+	  "btn-txt-sz-small": {
+	    "fontSize": 30
+	  }
+	}
+
+/***/ },
+
+/***/ 389:
+/***/ function(module, exports) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	module.exports = {
+	  props: {
+	    type: { default: 'default' },
+	    size: { default: 'large' },
+	    value: { default: '' }
+	  }
+	};
+
+/***/ },
+
+/***/ 390:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('div', {
+	    class: ['btn', 'btn-' + _vm.type, 'btn-sz-' + _vm.size]
+	  }, [_h('text', {
+	    class: ['btn-txt', 'btn-txt-' + _vm.type, 'btn-txt-sz-' + _vm.size]
+	  }, [_vm._s(_vm.value)])])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ },
+
+/***/ 393:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* styles */
+	__vue_styles__.push(__webpack_require__(394)
+	)
+
+	/* script */
+	__vue_exports__ = __webpack_require__(395)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(396)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/include/tip.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+
+
+/***/ },
+
+/***/ 394:
+/***/ function(module, exports) {
+
+	module.exports = {
+	  "tip": {
+	    "paddingLeft": 36,
+	    "paddingRight": 36,
+	    "paddingTop": 36,
+	    "paddingBottom": 36,
+	    "borderRadius": 10
+	  },
+	  "tip-txt": {
+	    "fontSize": 28
+	  },
+	  "tip-success": {
+	    "backgroundColor": "#dff0d8",
+	    "borderColor": "#d6e9c6"
+	  },
+	  "tip-txt-success": {
+	    "color": "#3c763d"
+	  },
+	  "tip-info": {
+	    "backgroundColor": "#d9edf7",
+	    "borderColor": "#bce8f1"
+	  },
+	  "tip-txt-info": {
+	    "color": "#31708f"
+	  },
+	  "tip-warning": {
+	    "backgroundColor": "#fcf8e3",
+	    "borderColor": "#faebcc"
+	  },
+	  "tip-txt-warning": {
+	    "color": "#8a6d3b"
+	  },
+	  "tip-danger": {
+	    "backgroundColor": "#f2dede",
+	    "borderColor": "#ebccd1"
+	  },
+	  "tip-txt-danger": {
+	    "color": "#a94442"
+	  }
+	}
+
+/***/ },
+
+/***/ 395:
+/***/ function(module, exports) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	module.exports = {
+	  props: {
+	    type: { default: 'success' },
+	    value: { default: '' }
+	  }
+	};
+
+/***/ },
+
+/***/ 396:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('div', {
+	    class: ['tip', 'tip-' + _vm.type]
+	  }, [_h('text', {
+	    class: ['tip-txt', 'tip-txt-' + _vm.type]
+	  }, [_vm._s(_vm.value)])])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ },
+
+/***/ 481:
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	var modal = __weex_require_module__('modal');
+	var clipboard = __weex_require_module__('clipboard');
+	module.exports = {
+	  data: function data() {
+	    return {
+	      textToCopy: '',
+	      textFromPaste: '',
+	      tips: ''
+	    };
+	  },
+	  components: {
+	    panel: __webpack_require__(383),
+	    tip: __webpack_require__(393),
+	    button: __webpack_require__(387)
+	  },
+	  mounted: function mounted() {
+	    this.tips = "1. Just click COPY button. It will auto generate a string with random text, and copy to system clipboard. \n 2. do copy in another app, then come back and click PASTE button.";
+	  },
+	  methods: {
+	    doCopy: function doCopy() {
+	      modal.toast({ 'message': 'doCopy!', duration: 0.5 });
+	      textToCopy = "autoGenerateTextToCopy" + Math.random();
+	      clipboard.setString(textToCopy);
+	      this.textToCopy = textToCopy;
+	      this.tips = "copy done. Now system clipboard has string of '" + textToCopy + "', try PASTE button, or paste in another app.";
+	    },
+	    doPaste: function doPaste() {
+	      var me = this;
+	      modal.toast({ 'message': 'doPaste!', duration: 0.5 });
+	      clipboard.getString(function (ret) {
+	        console.log("paste result is " + JSON.stringify(ret));
+	        me.textFromPaste = ret.data;
+	        me.tips = "Paste done. Only support native(Android/iOS) NOW. according to security reason, paste in html5 is not supported.";
+	      });
+	    }
+	  }
+	};
+
+/***/ },
+
+/***/ 482:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('scroller', [_h('panel', {
+	    attrs: {
+	      "title": "Clipboard",
+	      "type": "primary"
+	    }
+	  }, [_h('panel', {
+	    attrs: {
+	      "title": "Copy to clipboard5"
+	    }
+	  }, [_h('text', {
+	    staticStyle: {
+	      lineHeight: "40px",
+	      fontSize: "28px"
+	    }
+	  }, [_vm._s(_vm.textToCopy)]), _h('button', {
+	    attrs: {
+	      "type": "info",
+	      "size": "middle",
+	      "value": "Copy"
+	    },
+	    nativeOn: {
+	      "click": function($event) {
+	        _vm.doCopy($event)
+	      }
+	    }
+	  })]), _h('panel', {
+	    attrs: {
+	      "title": "Paste from clipboard"
+	    }
+	  }, [_h('text', {
+	    staticStyle: {
+	      lineHeight: "40px",
+	      fontSize: "28px"
+	    }
+	  }, [_vm._s(_vm.textFromPaste)]), _h('button', {
+	    attrs: {
+	      "type": "info",
+	      "size": "middle",
+	      "value": "Paste"
+	    },
+	    nativeOn: {
+	      "click": function($event) {
+	        _vm.doPaste($event)
+	      }
+	    }
+	  })]), _h('panel', {
+	    attrs: {
+	      "title": "Result"
+	    }
+	  }, [_h('tip', {
+	    staticStyle: {
+	      marginBottom: "20px"
+	    },
+	    attrs: {
+	      "value": _vm.tips
+	    }
+	  })])])])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ }
+
+/******/ });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/93063f14/android/playground/app/src/main/assets/vue/modules/instance-api.js
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/assets/vue/modules/instance-api.js b/android/playground/app/src/main/assets/vue/modules/instance-api.js
new file mode 100644
index 0000000..9cff934
--- /dev/null
+++ b/android/playground/app/src/main/assets/vue/modules/instance-api.js
@@ -0,0 +1,304 @@
+// { "framework": "Vue" }
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId])
+/******/ 			return installedModules[moduleId].exports;
+
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			exports: {},
+/******/ 			id: moduleId,
+/******/ 			loaded: false
+/******/ 		};
+
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+
+/******/ 		// Flag the module as loaded
+/******/ 		module.loaded = true;
+
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+
+
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ 0:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* script */
+	__vue_exports__ = __webpack_require__(483)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(484)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/modules/instance-api.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+	module.exports.el = 'true'
+	new Vue(module.exports)
+
+
+/***/ },
+
+/***/ 383:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* styles */
+	__vue_styles__.push(__webpack_require__(384)
+	)
+
+	/* script */
+	__vue_exports__ = __webpack_require__(385)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(386)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/include/panel.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+
+
+/***/ },
+
+/***/ 384:
+/***/ function(module, exports) {
+
+	module.exports = {
+	  "panel": {
+	    "marginBottom": 20,
+	    "backgroundColor": "#ffffff",
+	    "borderColor": "#dddddd",
+	    "borderWidth": 1
+	  },
+	  "panel-primary": {
+	    "borderColor": "rgb(40,96,144)"
+	  },
+	  "panel-success": {
+	    "borderColor": "rgb(76,174,76)"
+	  },
+	  "panel-info": {
+	    "borderColor": "rgb(70,184,218)"
+	  },
+	  "panel-warning": {
+	    "borderColor": "rgb(238,162,54)"
+	  },
+	  "panel-danger": {
+	    "borderColor": "rgb(212,63,58)"
+	  },
+	  "panel-header": {
+	    "backgroundColor": "#f5f5f5",
+	    "fontSize": 40,
+	    "color": "#333333"
+	  },
+	  "panel-header-primary": {
+	    "backgroundColor": "rgb(40,96,144)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-success": {
+	    "backgroundColor": "rgb(92,184,92)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-info": {
+	    "backgroundColor": "rgb(91,192,222)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-warning": {
+	    "backgroundColor": "rgb(240,173,78)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-danger": {
+	    "backgroundColor": "rgb(217,83,79)",
+	    "color": "#ffffff"
+	  }
+	}
+
+/***/ },
+
+/***/ 385:
+/***/ function(module, exports) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	module.exports = {
+	  props: {
+	    type: { default: 'default' },
+	    title: { default: '' },
+	    paddingBody: { default: 20 },
+	    paddingHead: { default: 20 },
+	    dataClass: { default: '' }, // FIXME transfer class
+	    border: { default: 0 }
+	  }
+	};
+
+/***/ },
+
+/***/ 386:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('div', {
+	    class: ['panel', 'panel-' + _vm.type],
+	    style: {
+	      borderWidth: _vm.border
+	    }
+	  }, [_h('text', {
+	    class: ['panel-header', 'panel-header-' + _vm.type],
+	    style: {
+	      paddingTop: _vm.paddingHead,
+	      paddingBottom: _vm.paddingHead,
+	      paddingLeft: _vm.paddingHead * 1.5,
+	      paddingRight: _vm.paddingHead * 1.5
+	    }
+	  }, [_vm._s(_vm.title)]), _h('div', {
+	    class: ['panel-body', 'panel-body-' + _vm.type],
+	    style: {
+	      paddingTop: _vm.paddingBody,
+	      paddingBottom: _vm.paddingBody,
+	      paddingLeft: _vm.paddingBody * 1.5,
+	      paddingRight: _vm.paddingBody * 1.5
+	    }
+	  }, [_vm._t("default")])])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ },
+
+/***/ 483:
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	module.exports = {
+	  data: function data() {
+	    return {
+	      config: ''
+	    };
+	  },
+	  components: {
+	    panel: __webpack_require__(383)
+	  },
+	  created: function created() {
+	    var config = this.$getConfig();
+	    console.log('config', JSON.stringify(config));
+	    this.config = JSON.stringify(config, null, 2);
+	  }
+	};
+
+/***/ },
+
+/***/ 484:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('scroller', [_h('panel', {
+	    attrs: {
+	      "title": "$getConfig()",
+	      "type": "primary"
+	    }
+	  }, [_h('text', [_vm._s(_vm.config)])])])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ }
+
+/******/ });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/93063f14/android/playground/app/src/main/assets/vue/modules/modal.js
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/assets/vue/modules/modal.js b/android/playground/app/src/main/assets/vue/modules/modal.js
new file mode 100644
index 0000000..5b8805f
--- /dev/null
+++ b/android/playground/app/src/main/assets/vue/modules/modal.js
@@ -0,0 +1,581 @@
+// { "framework": "Vue" }
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId])
+/******/ 			return installedModules[moduleId].exports;
+
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			exports: {},
+/******/ 			id: moduleId,
+/******/ 			loaded: false
+/******/ 		};
+
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+
+/******/ 		// Flag the module as loaded
+/******/ 		module.loaded = true;
+
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+
+
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ 0:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* script */
+	__vue_exports__ = __webpack_require__(485)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(486)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/modules/modal.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+	module.exports.el = 'true'
+	new Vue(module.exports)
+
+
+/***/ },
+
+/***/ 383:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* styles */
+	__vue_styles__.push(__webpack_require__(384)
+	)
+
+	/* script */
+	__vue_exports__ = __webpack_require__(385)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(386)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/include/panel.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+
+
+/***/ },
+
+/***/ 384:
+/***/ function(module, exports) {
+
+	module.exports = {
+	  "panel": {
+	    "marginBottom": 20,
+	    "backgroundColor": "#ffffff",
+	    "borderColor": "#dddddd",
+	    "borderWidth": 1
+	  },
+	  "panel-primary": {
+	    "borderColor": "rgb(40,96,144)"
+	  },
+	  "panel-success": {
+	    "borderColor": "rgb(76,174,76)"
+	  },
+	  "panel-info": {
+	    "borderColor": "rgb(70,184,218)"
+	  },
+	  "panel-warning": {
+	    "borderColor": "rgb(238,162,54)"
+	  },
+	  "panel-danger": {
+	    "borderColor": "rgb(212,63,58)"
+	  },
+	  "panel-header": {
+	    "backgroundColor": "#f5f5f5",
+	    "fontSize": 40,
+	    "color": "#333333"
+	  },
+	  "panel-header-primary": {
+	    "backgroundColor": "rgb(40,96,144)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-success": {
+	    "backgroundColor": "rgb(92,184,92)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-info": {
+	    "backgroundColor": "rgb(91,192,222)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-warning": {
+	    "backgroundColor": "rgb(240,173,78)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-danger": {
+	    "backgroundColor": "rgb(217,83,79)",
+	    "color": "#ffffff"
+	  }
+	}
+
+/***/ },
+
+/***/ 385:
+/***/ function(module, exports) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	module.exports = {
+	  props: {
+	    type: { default: 'default' },
+	    title: { default: '' },
+	    paddingBody: { default: 20 },
+	    paddingHead: { default: 20 },
+	    dataClass: { default: '' }, // FIXME transfer class
+	    border: { default: 0 }
+	  }
+	};
+
+/***/ },
+
+/***/ 386:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('div', {
+	    class: ['panel', 'panel-' + _vm.type],
+	    style: {
+	      borderWidth: _vm.border
+	    }
+	  }, [_h('text', {
+	    class: ['panel-header', 'panel-header-' + _vm.type],
+	    style: {
+	      paddingTop: _vm.paddingHead,
+	      paddingBottom: _vm.paddingHead,
+	      paddingLeft: _vm.paddingHead * 1.5,
+	      paddingRight: _vm.paddingHead * 1.5
+	    }
+	  }, [_vm._s(_vm.title)]), _h('div', {
+	    class: ['panel-body', 'panel-body-' + _vm.type],
+	    style: {
+	      paddingTop: _vm.paddingBody,
+	      paddingBottom: _vm.paddingBody,
+	      paddingLeft: _vm.paddingBody * 1.5,
+	      paddingRight: _vm.paddingBody * 1.5
+	    }
+	  }, [_vm._t("default")])])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ },
+
+/***/ 387:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* styles */
+	__vue_styles__.push(__webpack_require__(388)
+	)
+
+	/* script */
+	__vue_exports__ = __webpack_require__(389)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(390)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/include/button.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+
+
+/***/ },
+
+/***/ 388:
+/***/ function(module, exports) {
+
+	module.exports = {
+	  "btn": {
+	    "marginBottom": 0,
+	    "alignItems": "center",
+	    "justifyContent": "center",
+	    "borderWidth": 1,
+	    "borderStyle": "solid",
+	    "borderColor": "#333333"
+	  },
+	  "btn-default": {
+	    "color": "rgb(51,51,51)"
+	  },
+	  "btn-primary": {
+	    "backgroundColor": "rgb(40,96,144)",
+	    "borderColor": "rgb(40,96,144)"
+	  },
+	  "btn-success": {
+	    "backgroundColor": "rgb(92,184,92)",
+	    "borderColor": "rgb(76,174,76)"
+	  },
+	  "btn-info": {
+	    "backgroundColor": "rgb(91,192,222)",
+	    "borderColor": "rgb(70,184,218)"
+	  },
+	  "btn-warning": {
+	    "backgroundColor": "rgb(240,173,78)",
+	    "borderColor": "rgb(238,162,54)"
+	  },
+	  "btn-danger": {
+	    "backgroundColor": "rgb(217,83,79)",
+	    "borderColor": "rgb(212,63,58)"
+	  },
+	  "btn-link": {
+	    "borderColor": "rgba(0,0,0,0)",
+	    "borderRadius": 0
+	  },
+	  "btn-txt-default": {
+	    "color": "rgb(51,51,51)"
+	  },
+	  "btn-txt-primary": {
+	    "color": "rgb(255,255,255)"
+	  },
+	  "btn-txt-success": {
+	    "color": "rgb(255,255,255)"
+	  },
+	  "btn-txt-info": {
+	    "color": "rgb(255,255,255)"
+	  },
+	  "btn-txt-warning": {
+	    "color": "rgb(255,255,255)"
+	  },
+	  "btn-txt-danger": {
+	    "color": "rgb(255,255,255)"
+	  },
+	  "btn-txt-link": {
+	    "color": "rgb(51,122,183)"
+	  },
+	  "btn-sz-large": {
+	    "width": 300,
+	    "height": 100,
+	    "paddingTop": 25,
+	    "paddingBottom": 25,
+	    "paddingLeft": 40,
+	    "paddingRight": 40,
+	    "borderRadius": 15
+	  },
+	  "btn-sz-middle": {
+	    "width": 240,
+	    "height": 80,
+	    "paddingTop": 15,
+	    "paddingBottom": 15,
+	    "paddingLeft": 30,
+	    "paddingRight": 30,
+	    "borderRadius": 10
+	  },
+	  "btn-sz-small": {
+	    "width": 170,
+	    "height": 60,
+	    "paddingTop": 12,
+	    "paddingBottom": 12,
+	    "paddingLeft": 25,
+	    "paddingRight": 25,
+	    "borderRadius": 7
+	  },
+	  "btn-txt-sz-large": {
+	    "fontSize": 45
+	  },
+	  "btn-txt-sz-middle": {
+	    "fontSize": 35
+	  },
+	  "btn-txt-sz-small": {
+	    "fontSize": 30
+	  }
+	}
+
+/***/ },
+
+/***/ 389:
+/***/ function(module, exports) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	module.exports = {
+	  props: {
+	    type: { default: 'default' },
+	    size: { default: 'large' },
+	    value: { default: '' }
+	  }
+	};
+
+/***/ },
+
+/***/ 390:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('div', {
+	    class: ['btn', 'btn-' + _vm.type, 'btn-sz-' + _vm.size]
+	  }, [_h('text', {
+	    class: ['btn-txt', 'btn-txt-' + _vm.type, 'btn-txt-sz-' + _vm.size]
+	  }, [_vm._s(_vm.value)])])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ },
+
+/***/ 485:
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	var modal = __weex_require_module__('modal');
+	module.exports = {
+	  data: function data() {
+	    return {};
+	  },
+	  components: {
+	    panel: __webpack_require__(383),
+	    button: __webpack_require__(387)
+	  },
+	  methods: {
+	    toast: function toast(msg, duration) {
+	      if (!msg || typeof msg !== 'string') {
+	        msg = 'I am Toast show!';
+	      }
+	      duration = duration || 2;
+	      modal.toast({
+	        'message': msg,
+	        'duration': duration
+	      });
+	    },
+	    alert: function alert(msg, okTitle, cancelTitle) {
+	      if (!msg || typeof msg !== 'string') {
+	        msg = "I am Alert!";
+	      }
+	      modal.alert({
+	        'message': msg,
+	        'okTitle': okTitle,
+	        'cancelTitle': cancelTitle
+	      }, function () {
+	        modal.toast({ message: "Click Alert OK Bnt!!" });
+	      });
+	    },
+	    confirm: function confirm(msg, okTitle, cancelTitle) {
+	      if (!msg || typeof msg !== 'string') {
+	        msg = "I am Confirm!";
+	      }
+	      okTitle = okTitle || "OK";
+	      cancelTitle = cancelTitle || "Cancel";
+	      modal.confirm({
+	        'message': msg,
+	        'okTitle': okTitle,
+	        'cancelTitle': cancelTitle
+	      }, function (result) {
+	        modal.toast({ message: "Click Confirm  " + JSON.stringify(result) });
+	      });
+	    },
+	    prompt: function prompt() {
+	      modal.prompt({
+	        'message': 'I am Prompt!',
+	        'okTitle': 'ok',
+	        'cancelTitle': 'cancel'
+	      }, function (result) {
+	        modal.toast({ message: "Click Prompt  " + JSON.stringify(result) });
+	      });
+	    }
+	  }
+	};
+
+/***/ },
+
+/***/ 486:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('scroller', [_h('panel', {
+	    attrs: {
+	      "title": "Toast",
+	      "type": "primary"
+	    }
+	  }, [_h('button', {
+	    attrs: {
+	      "type": "primary",
+	      "value": "Toast"
+	    },
+	    nativeOn: {
+	      "click": function($event) {
+	        _vm.toast($event)
+	      }
+	    }
+	  })]), _h('panel', {
+	    attrs: {
+	      "title": "Dialog",
+	      "type": "primary"
+	    }
+	  }, [_h('button', {
+	    staticStyle: {
+	      marginBottom: "20px"
+	    },
+	    attrs: {
+	      "type": "success",
+	      "value": "Alert"
+	    },
+	    nativeOn: {
+	      "click": function($event) {
+	        _vm.alert($event)
+	      }
+	    }
+	  }), _h('button', {
+	    staticStyle: {
+	      marginBottom: "20px"
+	    },
+	    attrs: {
+	      "type": "primary",
+	      "value": "Confirm"
+	    },
+	    nativeOn: {
+	      "click": function($event) {
+	        _vm.confirm($event)
+	      }
+	    }
+	  }), _h('button', {
+	    attrs: {
+	      "type": "warning",
+	      "value": "Prompt"
+	    },
+	    nativeOn: {
+	      "click": function($event) {
+	        _vm.prompt($event)
+	      }
+	    }
+	  })])])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ }
+
+/******/ });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/93063f14/android/playground/app/src/main/assets/vue/modules/storage.js
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/assets/vue/modules/storage.js b/android/playground/app/src/main/assets/vue/modules/storage.js
new file mode 100644
index 0000000..13a3d93
--- /dev/null
+++ b/android/playground/app/src/main/assets/vue/modules/storage.js
@@ -0,0 +1,381 @@
+// { "framework": "Vue" }
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId])
+/******/ 			return installedModules[moduleId].exports;
+
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			exports: {},
+/******/ 			id: moduleId,
+/******/ 			loaded: false
+/******/ 		};
+
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+
+/******/ 		// Flag the module as loaded
+/******/ 		module.loaded = true;
+
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+
+
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ 0:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* script */
+	__vue_exports__ = __webpack_require__(487)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(488)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/modules/storage.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+	module.exports.el = 'true'
+	new Vue(module.exports)
+
+
+/***/ },
+
+/***/ 383:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* styles */
+	__vue_styles__.push(__webpack_require__(384)
+	)
+
+	/* script */
+	__vue_exports__ = __webpack_require__(385)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(386)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/include/panel.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+
+
+/***/ },
+
+/***/ 384:
+/***/ function(module, exports) {
+
+	module.exports = {
+	  "panel": {
+	    "marginBottom": 20,
+	    "backgroundColor": "#ffffff",
+	    "borderColor": "#dddddd",
+	    "borderWidth": 1
+	  },
+	  "panel-primary": {
+	    "borderColor": "rgb(40,96,144)"
+	  },
+	  "panel-success": {
+	    "borderColor": "rgb(76,174,76)"
+	  },
+	  "panel-info": {
+	    "borderColor": "rgb(70,184,218)"
+	  },
+	  "panel-warning": {
+	    "borderColor": "rgb(238,162,54)"
+	  },
+	  "panel-danger": {
+	    "borderColor": "rgb(212,63,58)"
+	  },
+	  "panel-header": {
+	    "backgroundColor": "#f5f5f5",
+	    "fontSize": 40,
+	    "color": "#333333"
+	  },
+	  "panel-header-primary": {
+	    "backgroundColor": "rgb(40,96,144)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-success": {
+	    "backgroundColor": "rgb(92,184,92)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-info": {
+	    "backgroundColor": "rgb(91,192,222)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-warning": {
+	    "backgroundColor": "rgb(240,173,78)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-danger": {
+	    "backgroundColor": "rgb(217,83,79)",
+	    "color": "#ffffff"
+	  }
+	}
+
+/***/ },
+
+/***/ 385:
+/***/ function(module, exports) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	module.exports = {
+	  props: {
+	    type: { default: 'default' },
+	    title: { default: '' },
+	    paddingBody: { default: 20 },
+	    paddingHead: { default: 20 },
+	    dataClass: { default: '' }, // FIXME transfer class
+	    border: { default: 0 }
+	  }
+	};
+
+/***/ },
+
+/***/ 386:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('div', {
+	    class: ['panel', 'panel-' + _vm.type],
+	    style: {
+	      borderWidth: _vm.border
+	    }
+	  }, [_h('text', {
+	    class: ['panel-header', 'panel-header-' + _vm.type],
+	    style: {
+	      paddingTop: _vm.paddingHead,
+	      paddingBottom: _vm.paddingHead,
+	      paddingLeft: _vm.paddingHead * 1.5,
+	      paddingRight: _vm.paddingHead * 1.5
+	    }
+	  }, [_vm._s(_vm.title)]), _h('div', {
+	    class: ['panel-body', 'panel-body-' + _vm.type],
+	    style: {
+	      paddingTop: _vm.paddingBody,
+	      paddingBottom: _vm.paddingBody,
+	      paddingLeft: _vm.paddingBody * 1.5,
+	      paddingRight: _vm.paddingBody * 1.5
+	    }
+	  }, [_vm._t("default")])])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ },
+
+/***/ 487:
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	var storage = __weex_require_module__('storage');
+	module.exports = {
+	  data: function data() {
+	    return {
+	      setItemResult: 'loading',
+	      getItemResult: 'loading',
+	      removeItemResult: 'loading',
+	      lengthResult: 'loading',
+	      getAllKeysResult: 'loading'
+	    };
+	  },
+	  components: {
+	    panel: __webpack_require__(383)
+	  },
+	  created: function created() {
+	    var me = this;
+
+	    //setItem
+	    storage.setItem('foo', 'foo-value', function (e) {
+	      console.log('set [foo<->foo-value]:' + JSON.stringify(e));
+	      me.setItemResult = 'foo:' + JSON.stringify(e) + '\n';
+	    });
+	    storage.setItem('bar', 'bar-value', function (e) {
+	      console.log('set [bar<->bar-value]:' + JSON.stringify(e));
+	      me.setItemResult = me.setItemResult + 'bar:' + JSON.stringify(e);
+	    });
+
+	    //getItem
+	    storage.getItem('foo', function (e) {
+	      console.log('get foo result:' + JSON.stringify(e));
+	      me.getItemResult = 'get foo,value is ' + e.data + '\n';
+	    });
+	    storage.getItem('bar', function (e) {
+	      console.log('get bar result:' + JSON.stringify(e));
+	      me.getItemResult += 'get bar,value is ' + e.data;
+	    });
+
+	    //length
+	    storage.length(function (e) {
+	      console.log('length:' + JSON.stringify(e));
+	      me.lengthResult = 'current length is ' + e.data;
+	    });
+
+	    //getAllKeys
+	    storage.getAllKeys(function (e) {
+	      console.log('getAllKeys:' + JSON.stringify(e));
+	      me.getAllKeysResult = '' + e.data;
+	      //me.getAllKeysResult +=' '+ typeof e.data
+	    });
+
+	    //removeItem
+	    storage.removeItem('foo', function (e) {
+	      console.log('remove foo:' + JSON.stringify(e));
+	      me.removeItemResult = 'remove item foo ' + e.result;
+	    });
+	  }
+	};
+
+/***/ },
+
+/***/ 488:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('scroller', [_h('panel', {
+	    attrs: {
+	      "title": "storage API",
+	      "type": "primary"
+	    }
+	  }, [_h('panel', {
+	    attrs: {
+	      "title": "setItem"
+	    }
+	  }, [_h('text', [_vm._s(_vm.setItemResult)])]), _h('panel', {
+	    attrs: {
+	      "title": "getItem"
+	    }
+	  }, [_h('text', [_vm._s(_vm.getItemResult)])]), _h('panel', {
+	    attrs: {
+	      "title": "length"
+	    }
+	  }, [_h('text', [_vm._s(_vm.lengthResult)])]), _h('panel', {
+	    attrs: {
+	      "title": "getAllKeys"
+	    }
+	  }, [_h('text', [_vm._s(_vm.getAllKeysResult)])]), _h('panel', {
+	    attrs: {
+	      "title": "removeItem"
+	    }
+	  }, [_h('text', [_vm._s(_vm.removeItemResult)])])])])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ }
+
+/******/ });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/93063f14/android/playground/app/src/main/assets/vue/modules/stream.js
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/assets/vue/modules/stream.js b/android/playground/app/src/main/assets/vue/modules/stream.js
new file mode 100644
index 0000000..785a8bf
--- /dev/null
+++ b/android/playground/app/src/main/assets/vue/modules/stream.js
@@ -0,0 +1,477 @@
+// { "framework": "Vue" }
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId])
+/******/ 			return installedModules[moduleId].exports;
+
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			exports: {},
+/******/ 			id: moduleId,
+/******/ 			loaded: false
+/******/ 		};
+
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+
+/******/ 		// Flag the module as loaded
+/******/ 		module.loaded = true;
+
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+
+
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ 0:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* script */
+	__vue_exports__ = __webpack_require__(489)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(490)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/modules/stream.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+	module.exports.el = 'true'
+	new Vue(module.exports)
+
+
+/***/ },
+
+/***/ 383:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* styles */
+	__vue_styles__.push(__webpack_require__(384)
+	)
+
+	/* script */
+	__vue_exports__ = __webpack_require__(385)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(386)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/include/panel.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+
+
+/***/ },
+
+/***/ 384:
+/***/ function(module, exports) {
+
+	module.exports = {
+	  "panel": {
+	    "marginBottom": 20,
+	    "backgroundColor": "#ffffff",
+	    "borderColor": "#dddddd",
+	    "borderWidth": 1
+	  },
+	  "panel-primary": {
+	    "borderColor": "rgb(40,96,144)"
+	  },
+	  "panel-success": {
+	    "borderColor": "rgb(76,174,76)"
+	  },
+	  "panel-info": {
+	    "borderColor": "rgb(70,184,218)"
+	  },
+	  "panel-warning": {
+	    "borderColor": "rgb(238,162,54)"
+	  },
+	  "panel-danger": {
+	    "borderColor": "rgb(212,63,58)"
+	  },
+	  "panel-header": {
+	    "backgroundColor": "#f5f5f5",
+	    "fontSize": 40,
+	    "color": "#333333"
+	  },
+	  "panel-header-primary": {
+	    "backgroundColor": "rgb(40,96,144)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-success": {
+	    "backgroundColor": "rgb(92,184,92)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-info": {
+	    "backgroundColor": "rgb(91,192,222)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-warning": {
+	    "backgroundColor": "rgb(240,173,78)",
+	    "color": "#ffffff"
+	  },
+	  "panel-header-danger": {
+	    "backgroundColor": "rgb(217,83,79)",
+	    "color": "#ffffff"
+	  }
+	}
+
+/***/ },
+
+/***/ 385:
+/***/ function(module, exports) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	module.exports = {
+	  props: {
+	    type: { default: 'default' },
+	    title: { default: '' },
+	    paddingBody: { default: 20 },
+	    paddingHead: { default: 20 },
+	    dataClass: { default: '' }, // FIXME transfer class
+	    border: { default: 0 }
+	  }
+	};
+
+/***/ },
+
+/***/ 386:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('div', {
+	    class: ['panel', 'panel-' + _vm.type],
+	    style: {
+	      borderWidth: _vm.border
+	    }
+	  }, [_h('text', {
+	    class: ['panel-header', 'panel-header-' + _vm.type],
+	    style: {
+	      paddingTop: _vm.paddingHead,
+	      paddingBottom: _vm.paddingHead,
+	      paddingLeft: _vm.paddingHead * 1.5,
+	      paddingRight: _vm.paddingHead * 1.5
+	    }
+	  }, [_vm._s(_vm.title)]), _h('div', {
+	    class: ['panel-body', 'panel-body-' + _vm.type],
+	    style: {
+	      paddingTop: _vm.paddingBody,
+	      paddingBottom: _vm.paddingBody,
+	      paddingLeft: _vm.paddingBody * 1.5,
+	      paddingRight: _vm.paddingBody * 1.5
+	    }
+	  }, [_vm._t("default")])])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ },
+
+/***/ 489:
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	var stream = __weex_require_module__('stream');
+	module.exports = {
+	  data: function data() {
+	    return {
+	      getJsonpResult: 'loading...',
+	      getResult: 'loading...',
+	      postResult: 'loading...',
+	      putResult: 'loading...',
+	      deleteResult: 'loading...',
+	      headResult: 'loading...',
+	      patchResult: 'loading...'
+	    };
+	  },
+	  components: {
+	    panel: __webpack_require__(383)
+	  },
+	  created: function created() {
+	    var me = this;
+	    var GET_URL_JSONP = 'http://jsfiddle.net/echo/jsonp/?callback=anything&result=content_in_response';
+	    var GET_URL = 'http://httpbin.org/get';
+	    var POST_URL = 'http://httpbin.org/post';
+	    var PUT_URL = 'http://httpbin.org/put';
+	    var DELETE_URL = 'http://httpbin.org/delete';
+	    var HEAD_URL = 'http://httpbin.org/status/418';
+	    var PATCH_URL = 'http://httpbin.org/patch';
+
+	    stream.fetch({
+	      method: 'GET',
+	      url: GET_URL_JSONP,
+	      type: 'jsonp'
+	    }, function (ret) {
+	      if (!ret.ok) {
+	        me.getJsonpResult = "request failed";
+	      } else {
+	        console.log('get:' + ret);
+	        me.getJsonpResult = JSON.stringify(ret.data);
+	      }
+	    }, function (response) {
+	      console.log('get jsonp in progress:' + response.length);
+	      me.getJsonpResult = "bytes received:" + response.length;
+	    });
+
+	    stream.fetch({
+	      method: 'GET',
+	      url: GET_URL,
+	      type: 'json'
+	    }, function (ret) {
+	      if (!ret.ok) {
+	        me.getResult = "request failed";
+	      } else {
+	        console.log('get:' + ret);
+	        me.getResult = JSON.stringify(ret.data);
+	      }
+	    }, function (response) {
+	      console.log('get in progress:' + response.length);
+	      me.getResult = "bytes received:" + response.length;
+	    });
+
+	    stream.fetch({
+	      method: 'POST',
+	      url: POST_URL,
+	      type: 'json'
+	    }, function (ret) {
+	      if (!ret.ok) {
+	        me.postResult = "request failed";
+	      } else {
+	        console.log('get:' + JSON.stringify(ret));
+	        me.postResult = JSON.stringify(ret.data);
+	      }
+	    }, function (response) {
+	      console.log('get in progress:' + response.length);
+	      me.postResult = "bytes received:" + response.length;
+	    });
+
+	    stream.fetch({
+	      method: 'PUT',
+	      url: PUT_URL,
+	      type: 'json'
+	    }, function (ret) {
+	      if (!ret.ok) {
+	        me.putResult = "request failed";
+	      } else {
+	        console.log('get:' + JSON.stringify(ret));
+	        me.putResult = JSON.stringify(ret.data);
+	      }
+	    }, function (response) {
+	      console.log('get in progress:' + response.length);
+	      me.putResult = "bytes received:" + response.length;
+	    });
+
+	    stream.fetch({
+	      method: 'DELETE',
+	      url: DELETE_URL,
+	      type: 'json'
+	    }, function (ret) {
+
+	      if (!ret.ok) {
+	        me.deleteResult = "request failed";
+	      } else {
+	        console.log('get:' + JSON.stringify(ret));
+	        me.deleteResult = JSON.stringify(ret.data);
+	      }
+	    }, function (response) {
+	      console.log('get in progress:' + response.length);
+	      me.deleteResult = "bytes received:" + response.length;
+	    });
+
+	    stream.fetch({
+	      method: 'HEAD',
+	      url: HEAD_URL,
+	      type: 'json'
+	    }, function (ret) {
+	      if (ret.statusText !== 'I\'m a teapot') {
+	        me.headResult = "request failed";
+	      } else {
+	        console.log('get:' + JSON.stringify(ret));
+	        me.headResult = ret.statusText;
+	      }
+	    }, function (response) {
+	      console.log('get in progress:' + response.length);
+	      me.headResult = "bytes received:" + response.length;
+	    });
+
+	    stream.fetch({
+	      method: 'PATCH',
+	      url: PATCH_URL,
+	      type: 'json'
+	    }, function (ret) {
+	      if (!ret.ok) {
+	        me.patchResult = "request failed";
+	      } else {
+	        console.log('get:' + JSON.stringify(ret));
+	        me.patchResult = JSON.stringify(ret.data);
+	      }
+	    }, function (response) {
+	      console.log('get in progress:' + response.length);
+	      me.patchResult = "bytes received:" + response.length;
+	    });
+	  }
+	};
+
+/***/ },
+
+/***/ 490:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('scroller', [_h('panel', {
+	    attrs: {
+	      "title": "stream.fetch",
+	      "type": "primary"
+	    }
+	  }, [_h('panel', {
+	    attrs: {
+	      "title": "method = GET"
+	    }
+	  }, [_h('text', [_vm._s(_vm.getResult)])]), _h('panel', {
+	    attrs: {
+	      "title": "method = GET / type = jsonp"
+	    }
+	  }, [_h('text', [_vm._s(_vm.getJsonpResult)])]), _h('panel', {
+	    attrs: {
+	      "title": "method = POST"
+	    }
+	  }, [_h('text', [_vm._s(_vm.postResult)])]), _h('panel', {
+	    attrs: {
+	      "title": "method = PUT"
+	    }
+	  }, [_h('text', [_vm._s(_vm.putResult)])]), _h('panel', {
+	    attrs: {
+	      "title": "method = DELETE"
+	    }
+	  }, [_h('text', [_vm._s(_vm.deleteResult)])]), _h('panel', {
+	    attrs: {
+	      "title": "method = HEAD"
+	    }
+	  }, [_h('text', [_vm._s(_vm.headResult)])]), _h('panel', {
+	    attrs: {
+	      "title": "method = PATCH"
+	    }
+	  }, [_h('text', [_vm._s(_vm.patchResult)])])])])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ }
+
+/******/ });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/93063f14/android/playground/app/src/main/assets/vue/showcase/calculator.js
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/assets/vue/showcase/calculator.js b/android/playground/app/src/main/assets/vue/showcase/calculator.js
new file mode 100644
index 0000000..eb5e7c0
--- /dev/null
+++ b/android/playground/app/src/main/assets/vue/showcase/calculator.js
@@ -0,0 +1,340 @@
+// { "framework": "Vue" }
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId])
+/******/ 			return installedModules[moduleId].exports;
+
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			exports: {},
+/******/ 			id: moduleId,
+/******/ 			loaded: false
+/******/ 		};
+
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+
+/******/ 		// Flag the module as loaded
+/******/ 		module.loaded = true;
+
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+
+
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ 0:
+/***/ function(module, exports, __webpack_require__) {
+
+	var __vue_exports__, __vue_options__
+	var __vue_styles__ = []
+
+	/* styles */
+	__vue_styles__.push(__webpack_require__(491)
+	)
+
+	/* script */
+	__vue_exports__ = __webpack_require__(492)
+
+	/* template */
+	var __vue_template__ = __webpack_require__(493)
+	__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+	if (
+	  typeof __vue_exports__.default === "object" ||
+	  typeof __vue_exports__.default === "function"
+	) {
+	if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+	__vue_options__ = __vue_exports__ = __vue_exports__.default
+	}
+	if (typeof __vue_options__ === "function") {
+	  __vue_options__ = __vue_options__.options
+	}
+	__vue_options__.__file = "/Users/lixinke/git/other/weex/examples/vue/showcase/calculator.vue"
+	__vue_options__.render = __vue_template__.render
+	__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+	__vue_options__.style = __vue_options__.style || {}
+	__vue_styles__.forEach(function (module) {
+	for (var name in module) {
+	__vue_options__.style[name] = module[name]
+	}
+	})
+
+	module.exports = __vue_exports__
+	module.exports.el = 'true'
+	new Vue(module.exports)
+
+
+/***/ },
+
+/***/ 491:
+/***/ function(module, exports) {
+
+	module.exports = {
+	  "row": {
+	    "flexDirection": "row"
+	  },
+	  "result": {
+	    "textAlign": "right",
+	    "backgroundColor": "#666666",
+	    "fontSize": 40,
+	    "color": "#FFFFFF",
+	    "height": 100,
+	    "padding": 30,
+	    "margin": 5
+	  },
+	  "btn": {
+	    "flex": 1,
+	    "textAlign": "center",
+	    "backgroundColor": "#eeeeee",
+	    "fontSize": 36,
+	    "height": 100,
+	    "padding": 30,
+	    "margin": 5
+	  },
+	  "btn-operator": {
+	    "backgroundColor": "#666699",
+	    "fontSize": 40,
+	    "color": "#FFFFFF"
+	  }
+	}
+
+/***/ },
+
+/***/ 492:
+/***/ function(module, exports) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	var OP = ['+', '-', '*', '/'];
+	var modal = __weex_require_module__('modal');
+	module.exports = {
+	  data: function data() {
+	    return {
+	      result: '',
+	      inputs: []
+	    };
+	  },
+	  methods: {
+	    input: function input(e) {
+	      modal.toast({ message: 'input: ' + e.target.attr.value, duration: 1 });
+	      var value = e.target.attr['value'];
+	      var inputs = this.inputs;
+	      var lastOne = inputs.length ? inputs[inputs.length - 1] : '';
+	      if (OP.indexOf(lastOne) > -1 && OP.indexOf(value) > -1) {
+	        return;
+	      }
+	      inputs.push(value);
+	      var buf = [],
+	          char;
+	      for (var i = 0; i < inputs.length; i++) {
+	        char = inputs[i];
+	        if (OP.indexOf(char) > -1) {
+	          char = ' ' + char + ' ';
+	        }
+	        buf.push(char);
+	      }
+	      this.result = buf.join('');
+	    },
+	    calculate: function calculate() {
+	      var result = eval(this.result);
+	      this.inputs = [result];
+	      this.result = result;
+	    },
+	    clear: function clear() {
+	      this.inputs = [];
+	      this.result = '';
+	    }
+	  }
+	};
+
+/***/ },
+
+/***/ 493:
+/***/ function(module, exports) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _h('div', {
+	    staticStyle: {
+	      padding: "5px"
+	    }
+	  }, [_h('text', {
+	    staticClass: ["result"]
+	  }, [_vm._s(_vm.result)]), _h('div', {
+	    staticClass: ["row"]
+	  }, [_h('text', {
+	    staticClass: ["btn"],
+	    on: {
+	      "click": _vm.input
+	    }
+	  }, ["1"]), _h('text', {
+	    staticClass: ["btn"],
+	    on: {
+	      "click": _vm.input
+	    }
+	  }, ["2"]), _h('text', {
+	    staticClass: ["btn"],
+	    on: {
+	      "click": _vm.input
+	    }
+	  }, ["3"]), _h('text', {
+	    staticClass: ["btn", "btn-operator"],
+	    on: {
+	      "click": _vm.input
+	    }
+	  }, ["+"])]), _h('div', {
+	    staticClass: ["row"]
+	  }, [_h('text', {
+	    staticClass: ["btn"],
+	    on: {
+	      "click": _vm.input
+	    }
+	  }, ["4"]), _h('text', {
+	    staticClass: ["btn"],
+	    on: {
+	      "click": _vm.input
+	    }
+	  }, ["5"]), _h('text', {
+	    staticClass: ["btn"],
+	    on: {
+	      "click": _vm.input
+	    }
+	  }, ["6"]), _h('text', {
+	    staticClass: ["btn", "btn-operator"],
+	    on: {
+	      "click": _vm.input
+	    }
+	  }, ["-"])]), _h('div', {
+	    staticClass: ["row"]
+	  }, [_h('text', {
+	    staticClass: ["btn"],
+	    on: {
+	      "click": _vm.input
+	    }
+	  }, ["7"]), _h('text', {
+	    staticClass: ["btn"],
+	    on: {
+	      "click": _vm.input
+	    }
+	  }, ["8"]), _h('text', {
+	    staticClass: ["btn"],
+	    on: {
+	      "click": _vm.input
+	    }
+	  }, ["9"]), _h('text', {
+	    staticClass: ["btn", "btn-operator"],
+	    on: {
+	      "click": _vm.input
+	    }
+	  }, ["*"])]), _h('div', {
+	    staticClass: ["row"]
+	  }, [_h('text', {
+	    staticClass: ["btn"],
+	    on: {
+	      "click": _vm.input
+	    }
+	  }, ["0"]), _h('text', {
+	    staticClass: ["btn"],
+	    on: {
+	      "click": _vm.input
+	    }
+	  }, ["."]), _h('text', {
+	    staticClass: ["btn"],
+	    on: {
+	      "click": _vm.clear
+	    }
+	  }, ["AC"]), _h('text', {
+	    staticClass: ["btn", "btn-operator"],
+	    on: {
+	      "click": _vm.calculate
+	    }
+	  }, ["="])])])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+
+/***/ }
+
+/******/ });
\ No newline at end of file