You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ha...@apache.org on 2017/12/28 03:28:13 UTC

[09/52] [partial] incubator-weex git commit: - [example] remove legacy .we examples

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/8668b0f9/android/playground/app/src/main/assets/vue-web/vue/components/input.js
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/assets/vue-web/vue/components/input.js b/android/playground/app/src/main/assets/vue-web/vue/components/input.js
new file mode 100644
index 0000000..7a08db8
--- /dev/null
+++ b/android/playground/app/src/main/assets/vue-web/vue/components/input.js
@@ -0,0 +1,1283 @@
+// NOTE: for vue2.0 and platform:web only.
+
+/******/ (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 App = __webpack_require__(43)
+	App.el = '#root'
+	new Vue(App)
+
+
+/***/ }),
+
+/***/ 4:
+/***/ (function(module, exports) {
+
+	/*
+		MIT License http://www.opensource.org/licenses/mit-license.php
+		Author Tobias Koppers @sokra
+	*/
+	// css base code, injected by the css-loader
+	module.exports = function() {
+		var list = [];
+
+		// return the list of modules as css string
+		list.toString = function toString() {
+			var result = [];
+			for(var i = 0; i < this.length; i++) {
+				var item = this[i];
+				if(item[2]) {
+					result.push("@media " + item[2] + "{" + item[1] + "}");
+				} else {
+					result.push(item[1]);
+				}
+			}
+			return result.join("");
+		};
+
+		// import a list of modules into the list
+		list.i = function(modules, mediaQuery) {
+			if(typeof modules === "string")
+				modules = [[null, modules, ""]];
+			var alreadyImportedModules = {};
+			for(var i = 0; i < this.length; i++) {
+				var id = this[i][0];
+				if(typeof id === "number")
+					alreadyImportedModules[id] = true;
+			}
+			for(i = 0; i < modules.length; i++) {
+				var item = modules[i];
+				// skip already imported module
+				// this implementation is not 100% perfect for weird media query combinations
+				//  when a module is imported multiple times with different media queries.
+				//  I hope this will never occur (Hey this way we have smaller bundles)
+				if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
+					if(mediaQuery && !item[2]) {
+						item[2] = mediaQuery;
+					} else if(mediaQuery) {
+						item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
+					}
+					list.push(item);
+				}
+			}
+		};
+		return list;
+	};
+
+
+/***/ }),
+
+/***/ 5:
+/***/ (function(module, exports, __webpack_require__) {
+
+	/*
+	  MIT License http://www.opensource.org/licenses/mit-license.php
+	  Author Tobias Koppers @sokra
+	  Modified by Evan You @yyx990803
+	*/
+
+	var hasDocument = typeof document !== 'undefined'
+
+	if (false) {
+	  if (!hasDocument) {
+	    throw new Error(
+	    'vue-style-loader cannot be used in a non-browser environment. ' +
+	    "Use { target: 'node' } in your Webpack config to indicate a server-rendering environment."
+	  ) }
+	}
+
+	var listToStyles = __webpack_require__(6)
+
+	/*
+	type StyleObject = {
+	  id: number;
+	  parts: Array<StyleObjectPart>
+	}
+
+	type StyleObjectPart = {
+	  css: string;
+	  media: string;
+	  sourceMap: ?string
+	}
+	*/
+
+	var stylesInDom = {/*
+	  [id: number]: {
+	    id: number,
+	    refs: number,
+	    parts: Array<(obj?: StyleObjectPart) => void>
+	  }
+	*/}
+
+	var head = hasDocument && (document.head || document.getElementsByTagName('head')[0])
+	var singletonElement = null
+	var singletonCounter = 0
+	var isProduction = false
+	var noop = function () {}
+
+	// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
+	// tags it will allow on a page
+	var isOldIE = typeof navigator !== 'undefined' && /msie [6-9]\b/.test(navigator.userAgent.toLowerCase())
+
+	module.exports = function (parentId, list, _isProduction) {
+	  isProduction = _isProduction
+
+	  var styles = listToStyles(parentId, list)
+	  addStylesToDom(styles)
+
+	  return function update (newList) {
+	    var mayRemove = []
+	    for (var i = 0; i < styles.length; i++) {
+	      var item = styles[i]
+	      var domStyle = stylesInDom[item.id]
+	      domStyle.refs--
+	      mayRemove.push(domStyle)
+	    }
+	    if (newList) {
+	      styles = listToStyles(parentId, newList)
+	      addStylesToDom(styles)
+	    } else {
+	      styles = []
+	    }
+	    for (var i = 0; i < mayRemove.length; i++) {
+	      var domStyle = mayRemove[i]
+	      if (domStyle.refs === 0) {
+	        for (var j = 0; j < domStyle.parts.length; j++) {
+	          domStyle.parts[j]()
+	        }
+	        delete stylesInDom[domStyle.id]
+	      }
+	    }
+	  }
+	}
+
+	function addStylesToDom (styles /* Array<StyleObject> */) {
+	  for (var i = 0; i < styles.length; i++) {
+	    var item = styles[i]
+	    var domStyle = stylesInDom[item.id]
+	    if (domStyle) {
+	      domStyle.refs++
+	      for (var j = 0; j < domStyle.parts.length; j++) {
+	        domStyle.parts[j](item.parts[j])
+	      }
+	      for (; j < item.parts.length; j++) {
+	        domStyle.parts.push(addStyle(item.parts[j]))
+	      }
+	      if (domStyle.parts.length > item.parts.length) {
+	        domStyle.parts.length = item.parts.length
+	      }
+	    } else {
+	      var parts = []
+	      for (var j = 0; j < item.parts.length; j++) {
+	        parts.push(addStyle(item.parts[j]))
+	      }
+	      stylesInDom[item.id] = { id: item.id, refs: 1, parts: parts }
+	    }
+	  }
+	}
+
+	function createStyleElement () {
+	  var styleElement = document.createElement('style')
+	  styleElement.type = 'text/css'
+	  head.appendChild(styleElement)
+	  return styleElement
+	}
+
+	function addStyle (obj /* StyleObjectPart */) {
+	  var update, remove
+	  var styleElement = document.querySelector('style[data-vue-ssr-id~="' + obj.id + '"]')
+
+	  if (styleElement) {
+	    if (isProduction) {
+	      // has SSR styles and in production mode.
+	      // simply do nothing.
+	      return noop
+	    } else {
+	      // has SSR styles but in dev mode.
+	      // for some reason Chrome can't handle source map in server-rendered
+	      // style tags - source maps in <style> only works if the style tag is
+	      // created and inserted dynamically. So we remove the server rendered
+	      // styles and inject new ones.
+	      styleElement.parentNode.removeChild(styleElement)
+	    }
+	  }
+
+	  if (isOldIE) {
+	    // use singleton mode for IE9.
+	    var styleIndex = singletonCounter++
+	    styleElement = singletonElement || (singletonElement = createStyleElement())
+	    update = applyToSingletonTag.bind(null, styleElement, styleIndex, false)
+	    remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true)
+	  } else {
+	    // use multi-style-tag mode in all other cases
+	    styleElement = createStyleElement()
+	    update = applyToTag.bind(null, styleElement)
+	    remove = function () {
+	      styleElement.parentNode.removeChild(styleElement)
+	    }
+	  }
+
+	  update(obj)
+
+	  return function updateStyle (newObj /* StyleObjectPart */) {
+	    if (newObj) {
+	      if (newObj.css === obj.css &&
+	          newObj.media === obj.media &&
+	          newObj.sourceMap === obj.sourceMap) {
+	        return
+	      }
+	      update(obj = newObj)
+	    } else {
+	      remove()
+	    }
+	  }
+	}
+
+	var replaceText = (function () {
+	  var textStore = []
+
+	  return function (index, replacement) {
+	    textStore[index] = replacement
+	    return textStore.filter(Boolean).join('\n')
+	  }
+	})()
+
+	function applyToSingletonTag (styleElement, index, remove, obj) {
+	  var css = remove ? '' : obj.css
+
+	  if (styleElement.styleSheet) {
+	    styleElement.styleSheet.cssText = replaceText(index, css)
+	  } else {
+	    var cssNode = document.createTextNode(css)
+	    var childNodes = styleElement.childNodes
+	    if (childNodes[index]) styleElement.removeChild(childNodes[index])
+	    if (childNodes.length) {
+	      styleElement.insertBefore(cssNode, childNodes[index])
+	    } else {
+	      styleElement.appendChild(cssNode)
+	    }
+	  }
+	}
+
+	function applyToTag (styleElement, obj) {
+	  var css = obj.css
+	  var media = obj.media
+	  var sourceMap = obj.sourceMap
+
+	  if (media) {
+	    styleElement.setAttribute('media', media)
+	  }
+
+	  if (sourceMap) {
+	    // https://developer.chrome.com/devtools/docs/javascript-debugging
+	    // this makes source maps inside style tags work properly in Chrome
+	    css += '\n/*# sourceURL=' + sourceMap.sources[0] + ' */'
+	    // http://stackoverflow.com/a/26603875
+	    css += '\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */'
+	  }
+
+	  if (styleElement.styleSheet) {
+	    styleElement.styleSheet.cssText = css
+	  } else {
+	    while (styleElement.firstChild) {
+	      styleElement.removeChild(styleElement.firstChild)
+	    }
+	    styleElement.appendChild(document.createTextNode(css))
+	  }
+	}
+
+
+/***/ }),
+
+/***/ 6:
+/***/ (function(module, exports) {
+
+	/**
+	 * Translates the list format produced by css-loader into something
+	 * easier to manipulate.
+	 */
+	module.exports = function listToStyles (parentId, list) {
+	  var styles = []
+	  var newStyles = {}
+	  for (var i = 0; i < list.length; i++) {
+	    var item = list[i]
+	    var id = item[0]
+	    var css = item[1]
+	    var media = item[2]
+	    var sourceMap = item[3]
+	    var part = {
+	      id: parentId + ':' + i,
+	      css: css,
+	      media: media,
+	      sourceMap: sourceMap
+	    }
+	    if (!newStyles[id]) {
+	      styles.push(newStyles[id] = { id: id, parts: [part] })
+	    } else {
+	      newStyles[id].parts.push(part)
+	    }
+	  }
+	  return styles
+	}
+
+
+/***/ }),
+
+/***/ 7:
+/***/ (function(module, exports) {
+
+	/* globals __VUE_SSR_CONTEXT__ */
+
+	// this module is a runtime utility for cleaner component module output and will
+	// be included in the final webpack user bundle
+
+	module.exports = function normalizeComponent (
+	  rawScriptExports,
+	  compiledTemplate,
+	  injectStyles,
+	  scopeId,
+	  moduleIdentifier /* server only */
+	) {
+	  var esModule
+	  var scriptExports = rawScriptExports = rawScriptExports || {}
+
+	  // ES6 modules interop
+	  var type = typeof rawScriptExports.default
+	  if (type === 'object' || type === 'function') {
+	    esModule = rawScriptExports
+	    scriptExports = rawScriptExports.default
+	  }
+
+	  // Vue.extend constructor export interop
+	  var options = typeof scriptExports === 'function'
+	    ? scriptExports.options
+	    : scriptExports
+
+	  // render functions
+	  if (compiledTemplate) {
+	    options.render = compiledTemplate.render
+	    options.staticRenderFns = compiledTemplate.staticRenderFns
+	  }
+
+	  // scopedId
+	  if (scopeId) {
+	    options._scopeId = scopeId
+	  }
+
+	  var hook
+	  if (moduleIdentifier) { // server build
+	    hook = function (context) {
+	      // 2.3 injection
+	      context =
+	        context || // cached call
+	        (this.$vnode && this.$vnode.ssrContext) || // stateful
+	        (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional
+	      // 2.2 with runInNewContext: true
+	      if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {
+	        context = __VUE_SSR_CONTEXT__
+	      }
+	      // inject component styles
+	      if (injectStyles) {
+	        injectStyles.call(this, context)
+	      }
+	      // register component module identifier for async chunk inferrence
+	      if (context && context._registeredComponents) {
+	        context._registeredComponents.add(moduleIdentifier)
+	      }
+	    }
+	    // used by ssr in case component is cached and beforeCreate
+	    // never gets called
+	    options._ssrRegister = hook
+	  } else if (injectStyles) {
+	    hook = injectStyles
+	  }
+
+	  if (hook) {
+	    var functional = options.functional
+	    var existing = functional
+	      ? options.render
+	      : options.beforeCreate
+	    if (!functional) {
+	      // inject component registration as beforeCreate hook
+	      options.beforeCreate = existing
+	        ? [].concat(existing, hook)
+	        : [hook]
+	    } else {
+	      // register for functioal component in vue file
+	      options.render = function renderWithStyleInjection (h, context) {
+	        hook.call(context)
+	        return existing(h, context)
+	      }
+	    }
+	  }
+
+	  return {
+	    esModule: esModule,
+	    exports: scriptExports,
+	    options: options
+	  }
+	}
+
+
+/***/ }),
+
+/***/ 43:
+/***/ (function(module, exports, __webpack_require__) {
+
+	var disposed = false
+	function injectStyle (ssrContext) {
+	  if (disposed) return
+	  __webpack_require__(44)
+	}
+	var Component = __webpack_require__(7)(
+	  /* script */
+	  __webpack_require__(46),
+	  /* template */
+	  __webpack_require__(47),
+	  /* styles */
+	  injectStyle,
+	  /* scopeId */
+	  "data-v-de6618e8",
+	  /* moduleIdentifier (server only) */
+	  null
+	)
+	Component.options.__file = "/Users/Hanks/Codes/work/incubator-weex/examples/vue/components/input.vue"
+	if (Component.esModule && Object.keys(Component.esModule).some(function (key) {return key !== "default" && key.substr(0, 2) !== "__"})) {console.error("named exports are not supported in *.vue files.")}
+	if (Component.options.functional) {console.error("[vue-loader] input.vue: functional components are not supported with templates, they should use render functions.")}
+
+	/* hot reload */
+	if (false) {(function () {
+	  var hotAPI = require("vue-hot-reload-api")
+	  hotAPI.install(require("vue"), false)
+	  if (!hotAPI.compatible) return
+	  module.hot.accept()
+	  if (!module.hot.data) {
+	    hotAPI.createRecord("data-v-de6618e8", Component.options)
+	  } else {
+	    hotAPI.reload("data-v-de6618e8", Component.options)
+	  }
+	  module.hot.dispose(function (data) {
+	    disposed = true
+	  })
+	})()}
+
+	module.exports = Component.exports
+
+
+/***/ }),
+
+/***/ 44:
+/***/ (function(module, exports, __webpack_require__) {
+
+	// style-loader: Adds some css to the DOM by adding a <style> tag
+
+	// load the styles
+	var content = __webpack_require__(45);
+	if(typeof content === 'string') content = [[module.id, content, '']];
+	if(content.locals) module.exports = content.locals;
+	// add the styles to the DOM
+	var update = __webpack_require__(5)("ab21e8f8", content, false);
+	// Hot Module Replacement
+	if(false) {
+	 // When the styles change, update the <style> tags
+	 if(!content.locals) {
+	   module.hot.accept("!!../../../node_modules/css-loader/index.js!../../../node_modules/vue-loader/lib/style-compiler/index.js?{\"vue\":true,\"id\":\"data-v-de6618e8\",\"scoped\":true,\"hasInlineConfig\":false}!../../../node_modules/vue-loader/lib/selector.js?type=styles&index=0!./input.vue", function() {
+	     var newContent = require("!!../../../node_modules/css-loader/index.js!../../../node_modules/vue-loader/lib/style-compiler/index.js?{\"vue\":true,\"id\":\"data-v-de6618e8\",\"scoped\":true,\"hasInlineConfig\":false}!../../../node_modules/vue-loader/lib/selector.js?type=styles&index=0!./input.vue");
+	     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
+	     update(newContent);
+	   });
+	 }
+	 // When the module is disposed, remove the <style> tags
+	 module.hot.dispose(function() { update(); });
+	}
+
+/***/ }),
+
+/***/ 45:
+/***/ (function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(4)();
+	// imports
+
+
+	// module
+	exports.push([module.id, "\n.input[data-v-de6618e8] {\n  font-size: 60px;\n  height: 80px;\n  width: 750px;\n}\n.button[data-v-de6618e8] {\n  font-size: 36;\n  width: 200;\n  color: #41B883;\n  text-align: center;\n  padding-top: 10;\n  padding-bottom: 10;\n  border-width: 2;\n  border-style: solid;\n  margin-right: 20;\n  border-color: rgb(162, 217, 192);\n  background-color: rgba(162, 217, 192, 0.2);\n}\n", ""]);
+
+	// exports
+
+
+/***/ }),
+
+/***/ 46:
+/***/ (function(module, exports) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	module.exports = {
+	  data: function data() {
+	    return {
+	      txtInput: '',
+	      txtChange: '',
+	      txtReturnType: '',
+	      txtSelection: '',
+	      autofocus: false
+	    };
+	  },
+	  methods: {
+	    ready: function ready() {
+	      var self = this;
+	      setTimeout(function () {
+	        self.autofocus = true;
+	      }, 1000);
+	    },
+	    onchange: function onchange(event) {
+	      this.txtChange = event.value;
+	      console.log('onchange', event.value);
+	    },
+	    onreturn: function onreturn(event) {
+	      this.txtReturnType = event.returnKeyType;
+	      console.log('onreturn', event.type);
+	    },
+	    oninput: function oninput(event) {
+	      this.txtInput = event.value;
+	      console.log('oninput', event.value);
+	    },
+	    focus: function focus() {
+	      this.$refs['input1'].focus();
+	    },
+	    blur: function blur() {
+	      this.$refs['input1'].blur();
+	    },
+	    setRange: function setRange() {
+	      console.log(this.$refs["inputselection"]);
+	      this.$refs["inputselection"].setSelectionRange(2, 6);
+	    },
+	    getSelectionRange: function getSelectionRange() {
+	      console.log(this.$refs["inputselection"]);
+	      var self = this;
+	      this.$refs["inputselection"].getSelectionRange(function (e) {
+	        self.txtSelection = e.selectionStart + '-' + e.selectionEnd;
+	      });
+	    }
+	  }
+	};
+
+/***/ }),
+
+/***/ 47:
+/***/ (function(module, exports, __webpack_require__) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _c('div', [_c('div', [_c('text', {
+	    staticStyle: _vm.$processStyle({
+	      "font-size": "40px"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("oninput: " + _vm._s(_vm.txtInput))]), _vm._v(" "), _c('text', {
+	    staticStyle: _vm.$processStyle({
+	      "font-size": "40px"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("onchange: " + _vm._s(_vm.txtChange))]), _vm._v(" "), _c('text', {
+	    staticStyle: _vm.$processStyle({
+	      "font-size": "40px"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("onreturntype: " + _vm._s(_vm.txtReturnType))]), _vm._v(" "), _c('text', {
+	    staticStyle: _vm.$processStyle({
+	      "font-size": "40px"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("selection: " + _vm._s(_vm.txtSelection))])]), _vm._v(" "), _c('scroller', [_c('div', [_c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "background-color": "#286090"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "title",
+	    staticStyle: _vm.$processStyle({
+	      "height": "80",
+	      "padding": "20",
+	      "color": "#FFFFFF"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("input type = text")])]), _vm._v(" "), _c('input', {
+	    staticClass: "input",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "type": "text",
+	      "placeholder": "Input Text",
+	      "autofocus": true,
+	      "value": ""
+	    },
+	    on: {
+	      "change": _vm.onchange,
+	      "input": _vm.oninput
+	    }
+	  })]), _vm._v(" "), _c('div', [_c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "background-color": "#286090"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "title",
+	    staticStyle: _vm.$processStyle({
+	      "height": "80",
+	      "padding": "20",
+	      "color": "#FFFFFF"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("input type = password")])]), _vm._v(" "), _c('input', {
+	    staticClass: "input",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "type": "password",
+	      "placeholder": "Input Password"
+	    },
+	    on: {
+	      "change": _vm.onchange,
+	      "input": _vm.oninput
+	    }
+	  })]), _vm._v(" "), _c('div', [_c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "background-color": "#286090"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "title",
+	    staticStyle: _vm.$processStyle({
+	      "height": "80",
+	      "padding": "20",
+	      "color": "#FFFFFF"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("input type = url")])]), _vm._v(" "), _c('input', {
+	    staticClass: "input",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "type": "url",
+	      "placeholder": "Input URL"
+	    },
+	    on: {
+	      "change": _vm.onchange,
+	      "input": _vm.oninput
+	    }
+	  })]), _vm._v(" "), _c('div', [_c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "background-color": "#286090"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "title",
+	    staticStyle: _vm.$processStyle({
+	      "height": "80",
+	      "padding": "20",
+	      "color": "#FFFFFF"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("input type = email")])]), _vm._v(" "), _c('input', {
+	    staticClass: "input",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "type": "email",
+	      "placeholder": "Input Email"
+	    },
+	    on: {
+	      "change": _vm.onchange,
+	      "input": _vm.oninput
+	    }
+	  })]), _vm._v(" "), _c('div', [_c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "background-color": "#286090"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "title",
+	    staticStyle: _vm.$processStyle({
+	      "height": "80",
+	      "padding": "20",
+	      "color": "#FFFFFF"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("input type = tel")])]), _vm._v(" "), _c('input', {
+	    staticClass: "input",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "type": "tel",
+	      "placeholder": "Input Tel"
+	    },
+	    on: {
+	      "change": _vm.onchange,
+	      "input": _vm.oninput
+	    }
+	  })]), _vm._v(" "), _c('div', [_c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "background-color": "#286090"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "title",
+	    staticStyle: _vm.$processStyle({
+	      "height": "80",
+	      "padding": "20",
+	      "color": "#FFFFFF"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("input type = time")])]), _vm._v(" "), _c('input', {
+	    staticClass: "input",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "type": "time",
+	      "placeholder": "Input Time"
+	    },
+	    on: {
+	      "change": _vm.onchange,
+	      "input": _vm.oninput
+	    }
+	  })]), _vm._v(" "), _c('div', [_c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "background-color": "#286090"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "title",
+	    staticStyle: _vm.$processStyle({
+	      "height": "80",
+	      "padding": "20",
+	      "color": "#FFFFFF"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("input type = number")])]), _vm._v(" "), _c('input', {
+	    staticClass: "input",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "type": "number",
+	      "placeholder": "Input number"
+	    },
+	    on: {
+	      "change": _vm.onchange,
+	      "input": _vm.oninput
+	    }
+	  })]), _vm._v(" "), _c('div', [_c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "background-color": "#286090"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "title",
+	    staticStyle: _vm.$processStyle({
+	      "height": "80",
+	      "padding": "20",
+	      "color": "#FFFFFF"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("input type = date")])]), _vm._v(" "), _c('input', {
+	    staticClass: "input",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "type": "date",
+	      "placeholder": "Input Date",
+	      "max": "2017-12-12",
+	      "min": "2015-01-01"
+	    },
+	    on: {
+	      "change": _vm.onchange,
+	      "input": _vm.oninput
+	    }
+	  })]), _vm._v(" "), _c('div', [_c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "background-color": "#286090"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "title",
+	    staticStyle: _vm.$processStyle({
+	      "height": "80",
+	      "padding": "20",
+	      "color": "#FFFFFF"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("input return-key-type = default")])]), _vm._v(" "), _c('input', {
+	    staticClass: "input",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "type": "text",
+	      "placeholder": "please input",
+	      "return-key-type": "default"
+	    },
+	    on: {
+	      "change": _vm.onchange,
+	      "return": _vm.onreturn,
+	      "input": _vm.oninput
+	    }
+	  })]), _vm._v(" "), _c('div', [_c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "background-color": "#286090"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "title",
+	    staticStyle: _vm.$processStyle({
+	      "height": "80",
+	      "padding": "20",
+	      "color": "#FFFFFF"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("input return-key-type = go")])]), _vm._v(" "), _c('input', {
+	    staticClass: "input",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "type": "text",
+	      "placeholder": "please input",
+	      "return-key-type": "go"
+	    },
+	    on: {
+	      "change": _vm.onchange,
+	      "return": _vm.onreturn,
+	      "input": _vm.oninput
+	    }
+	  })]), _vm._v(" "), _c('div', [_c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "background-color": "#286090"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "title",
+	    staticStyle: _vm.$processStyle({
+	      "height": "80",
+	      "padding": "20",
+	      "color": "#FFFFFF"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("input return-key-type = next")])]), _vm._v(" "), _c('input', {
+	    staticClass: "input",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "type": "text",
+	      "placeholder": "please input",
+	      "return-key-type": "next"
+	    },
+	    on: {
+	      "change": _vm.onchange,
+	      "return": _vm.onreturn,
+	      "input": _vm.oninput
+	    }
+	  })]), _vm._v(" "), _c('div', [_c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "background-color": "#286090"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "title",
+	    staticStyle: _vm.$processStyle({
+	      "height": "80",
+	      "padding": "20",
+	      "color": "#FFFFFF"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("input return-key-type = search")])]), _vm._v(" "), _c('input', {
+	    staticClass: "input",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "type": "text",
+	      "placeholder": "please input",
+	      "return-key-type": "search"
+	    },
+	    on: {
+	      "change": _vm.onchange,
+	      "return": _vm.onreturn,
+	      "input": _vm.oninput
+	    }
+	  })]), _vm._v(" "), _c('div', [_c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "background-color": "#286090"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "title",
+	    staticStyle: _vm.$processStyle({
+	      "height": "80",
+	      "padding": "20",
+	      "color": "#FFFFFF"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("input return-key-type = send")])]), _vm._v(" "), _c('input', {
+	    staticClass: "input",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "type": "text",
+	      "placeholder": "please input",
+	      "return-key-type": "send"
+	    },
+	    on: {
+	      "change": _vm.onchange,
+	      "return": _vm.onreturn,
+	      "input": _vm.oninput
+	    }
+	  })]), _vm._v(" "), _c('div', [_c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "background-color": "#286090"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "title",
+	    staticStyle: _vm.$processStyle({
+	      "height": "80",
+	      "padding": "20",
+	      "color": "#FFFFFF"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("input return-key-type = done")])]), _vm._v(" "), _c('input', {
+	    staticClass: "input",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "type": "text",
+	      "placeholder": "please input",
+	      "return-key-type": "done"
+	    },
+	    on: {
+	      "change": _vm.onchange,
+	      "return": _vm.onreturn,
+	      "input": _vm.oninput
+	    }
+	  })]), _vm._v(" "), _c('div', [_c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "background-color": "#286090"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "title",
+	    staticStyle: _vm.$processStyle({
+	      "height": "80",
+	      "padding": "20",
+	      "color": "#FFFFFF"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("function focus() & blur()")])]), _vm._v(" "), _c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "flex-direction": "row",
+	      "margin-bottom": "16px",
+	      "justify-content": "space-between"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "button",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "value": "Focus",
+	      "type": "primary"
+	    },
+	    on: {
+	      "click": _vm.focus
+	    }
+	  }), _vm._v(" "), _c('text', {
+	    staticClass: "button",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "value": "Blur",
+	      "type": "primary"
+	    },
+	    on: {
+	      "click": _vm.blur
+	    }
+	  })]), _vm._v(" "), _c('input', {
+	    ref: "input1",
+	    staticClass: "input",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "type": "text",
+	      "placeholder": "Input1",
+	      "value": ""
+	    }
+	  })]), _vm._v(" "), _c('div', [_c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "background-color": "#286090"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "title",
+	    staticStyle: _vm.$processStyle({
+	      "height": "80",
+	      "padding": "20",
+	      "color": "#FFFFFF"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._v("input selection")])]), _vm._v(" "), _c('div', {
+	    staticStyle: _vm.$processStyle({
+	      "flex-direction": "row",
+	      "margin-bottom": "16px",
+	      "justify-content": "space-between"
+	    }),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_c('text', {
+	    staticClass: "button",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "value": "setRange",
+	      "type": "primary"
+	    },
+	    on: {
+	      "click": _vm.setRange
+	    }
+	  }), _vm._v(" "), _c('text', {
+	    staticClass: "button",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "value": "getSelectionRange",
+	      "type": "primary"
+	    },
+	    on: {
+	      "click": _vm.getSelectionRange
+	    }
+	  })]), _vm._v(" "), _c('input', {
+	    ref: "inputselection",
+	    staticClass: "input",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "type": "text",
+	      "placeholder": "please input",
+	      "value": "123456789"
+	    },
+	    on: {
+	      "change": _vm.onchange,
+	      "return": _vm.onreturn,
+	      "input": _vm.oninput
+	    }
+	  })])])], 1)
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+	if (false) {
+	  module.hot.accept()
+	  if (module.hot.data) {
+	     require("vue-hot-reload-api").rerender("data-v-de6618e8", module.exports)
+	  }
+	}
+
+/***/ })
+
+/******/ });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/8668b0f9/android/playground/app/src/main/assets/vue-web/vue/components/list.js
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/assets/vue-web/vue/components/list.js b/android/playground/app/src/main/assets/vue-web/vue/components/list.js
new file mode 100644
index 0000000..e1e9797
--- /dev/null
+++ b/android/playground/app/src/main/assets/vue-web/vue/components/list.js
@@ -0,0 +1,705 @@
+// NOTE: for vue2.0 and platform:web only.
+
+/******/ (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 App = __webpack_require__(48)
+	App.el = '#root'
+	new Vue(App)
+
+
+/***/ }),
+
+/***/ 4:
+/***/ (function(module, exports) {
+
+	/*
+		MIT License http://www.opensource.org/licenses/mit-license.php
+		Author Tobias Koppers @sokra
+	*/
+	// css base code, injected by the css-loader
+	module.exports = function() {
+		var list = [];
+
+		// return the list of modules as css string
+		list.toString = function toString() {
+			var result = [];
+			for(var i = 0; i < this.length; i++) {
+				var item = this[i];
+				if(item[2]) {
+					result.push("@media " + item[2] + "{" + item[1] + "}");
+				} else {
+					result.push(item[1]);
+				}
+			}
+			return result.join("");
+		};
+
+		// import a list of modules into the list
+		list.i = function(modules, mediaQuery) {
+			if(typeof modules === "string")
+				modules = [[null, modules, ""]];
+			var alreadyImportedModules = {};
+			for(var i = 0; i < this.length; i++) {
+				var id = this[i][0];
+				if(typeof id === "number")
+					alreadyImportedModules[id] = true;
+			}
+			for(i = 0; i < modules.length; i++) {
+				var item = modules[i];
+				// skip already imported module
+				// this implementation is not 100% perfect for weird media query combinations
+				//  when a module is imported multiple times with different media queries.
+				//  I hope this will never occur (Hey this way we have smaller bundles)
+				if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
+					if(mediaQuery && !item[2]) {
+						item[2] = mediaQuery;
+					} else if(mediaQuery) {
+						item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
+					}
+					list.push(item);
+				}
+			}
+		};
+		return list;
+	};
+
+
+/***/ }),
+
+/***/ 5:
+/***/ (function(module, exports, __webpack_require__) {
+
+	/*
+	  MIT License http://www.opensource.org/licenses/mit-license.php
+	  Author Tobias Koppers @sokra
+	  Modified by Evan You @yyx990803
+	*/
+
+	var hasDocument = typeof document !== 'undefined'
+
+	if (false) {
+	  if (!hasDocument) {
+	    throw new Error(
+	    'vue-style-loader cannot be used in a non-browser environment. ' +
+	    "Use { target: 'node' } in your Webpack config to indicate a server-rendering environment."
+	  ) }
+	}
+
+	var listToStyles = __webpack_require__(6)
+
+	/*
+	type StyleObject = {
+	  id: number;
+	  parts: Array<StyleObjectPart>
+	}
+
+	type StyleObjectPart = {
+	  css: string;
+	  media: string;
+	  sourceMap: ?string
+	}
+	*/
+
+	var stylesInDom = {/*
+	  [id: number]: {
+	    id: number,
+	    refs: number,
+	    parts: Array<(obj?: StyleObjectPart) => void>
+	  }
+	*/}
+
+	var head = hasDocument && (document.head || document.getElementsByTagName('head')[0])
+	var singletonElement = null
+	var singletonCounter = 0
+	var isProduction = false
+	var noop = function () {}
+
+	// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
+	// tags it will allow on a page
+	var isOldIE = typeof navigator !== 'undefined' && /msie [6-9]\b/.test(navigator.userAgent.toLowerCase())
+
+	module.exports = function (parentId, list, _isProduction) {
+	  isProduction = _isProduction
+
+	  var styles = listToStyles(parentId, list)
+	  addStylesToDom(styles)
+
+	  return function update (newList) {
+	    var mayRemove = []
+	    for (var i = 0; i < styles.length; i++) {
+	      var item = styles[i]
+	      var domStyle = stylesInDom[item.id]
+	      domStyle.refs--
+	      mayRemove.push(domStyle)
+	    }
+	    if (newList) {
+	      styles = listToStyles(parentId, newList)
+	      addStylesToDom(styles)
+	    } else {
+	      styles = []
+	    }
+	    for (var i = 0; i < mayRemove.length; i++) {
+	      var domStyle = mayRemove[i]
+	      if (domStyle.refs === 0) {
+	        for (var j = 0; j < domStyle.parts.length; j++) {
+	          domStyle.parts[j]()
+	        }
+	        delete stylesInDom[domStyle.id]
+	      }
+	    }
+	  }
+	}
+
+	function addStylesToDom (styles /* Array<StyleObject> */) {
+	  for (var i = 0; i < styles.length; i++) {
+	    var item = styles[i]
+	    var domStyle = stylesInDom[item.id]
+	    if (domStyle) {
+	      domStyle.refs++
+	      for (var j = 0; j < domStyle.parts.length; j++) {
+	        domStyle.parts[j](item.parts[j])
+	      }
+	      for (; j < item.parts.length; j++) {
+	        domStyle.parts.push(addStyle(item.parts[j]))
+	      }
+	      if (domStyle.parts.length > item.parts.length) {
+	        domStyle.parts.length = item.parts.length
+	      }
+	    } else {
+	      var parts = []
+	      for (var j = 0; j < item.parts.length; j++) {
+	        parts.push(addStyle(item.parts[j]))
+	      }
+	      stylesInDom[item.id] = { id: item.id, refs: 1, parts: parts }
+	    }
+	  }
+	}
+
+	function createStyleElement () {
+	  var styleElement = document.createElement('style')
+	  styleElement.type = 'text/css'
+	  head.appendChild(styleElement)
+	  return styleElement
+	}
+
+	function addStyle (obj /* StyleObjectPart */) {
+	  var update, remove
+	  var styleElement = document.querySelector('style[data-vue-ssr-id~="' + obj.id + '"]')
+
+	  if (styleElement) {
+	    if (isProduction) {
+	      // has SSR styles and in production mode.
+	      // simply do nothing.
+	      return noop
+	    } else {
+	      // has SSR styles but in dev mode.
+	      // for some reason Chrome can't handle source map in server-rendered
+	      // style tags - source maps in <style> only works if the style tag is
+	      // created and inserted dynamically. So we remove the server rendered
+	      // styles and inject new ones.
+	      styleElement.parentNode.removeChild(styleElement)
+	    }
+	  }
+
+	  if (isOldIE) {
+	    // use singleton mode for IE9.
+	    var styleIndex = singletonCounter++
+	    styleElement = singletonElement || (singletonElement = createStyleElement())
+	    update = applyToSingletonTag.bind(null, styleElement, styleIndex, false)
+	    remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true)
+	  } else {
+	    // use multi-style-tag mode in all other cases
+	    styleElement = createStyleElement()
+	    update = applyToTag.bind(null, styleElement)
+	    remove = function () {
+	      styleElement.parentNode.removeChild(styleElement)
+	    }
+	  }
+
+	  update(obj)
+
+	  return function updateStyle (newObj /* StyleObjectPart */) {
+	    if (newObj) {
+	      if (newObj.css === obj.css &&
+	          newObj.media === obj.media &&
+	          newObj.sourceMap === obj.sourceMap) {
+	        return
+	      }
+	      update(obj = newObj)
+	    } else {
+	      remove()
+	    }
+	  }
+	}
+
+	var replaceText = (function () {
+	  var textStore = []
+
+	  return function (index, replacement) {
+	    textStore[index] = replacement
+	    return textStore.filter(Boolean).join('\n')
+	  }
+	})()
+
+	function applyToSingletonTag (styleElement, index, remove, obj) {
+	  var css = remove ? '' : obj.css
+
+	  if (styleElement.styleSheet) {
+	    styleElement.styleSheet.cssText = replaceText(index, css)
+	  } else {
+	    var cssNode = document.createTextNode(css)
+	    var childNodes = styleElement.childNodes
+	    if (childNodes[index]) styleElement.removeChild(childNodes[index])
+	    if (childNodes.length) {
+	      styleElement.insertBefore(cssNode, childNodes[index])
+	    } else {
+	      styleElement.appendChild(cssNode)
+	    }
+	  }
+	}
+
+	function applyToTag (styleElement, obj) {
+	  var css = obj.css
+	  var media = obj.media
+	  var sourceMap = obj.sourceMap
+
+	  if (media) {
+	    styleElement.setAttribute('media', media)
+	  }
+
+	  if (sourceMap) {
+	    // https://developer.chrome.com/devtools/docs/javascript-debugging
+	    // this makes source maps inside style tags work properly in Chrome
+	    css += '\n/*# sourceURL=' + sourceMap.sources[0] + ' */'
+	    // http://stackoverflow.com/a/26603875
+	    css += '\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */'
+	  }
+
+	  if (styleElement.styleSheet) {
+	    styleElement.styleSheet.cssText = css
+	  } else {
+	    while (styleElement.firstChild) {
+	      styleElement.removeChild(styleElement.firstChild)
+	    }
+	    styleElement.appendChild(document.createTextNode(css))
+	  }
+	}
+
+
+/***/ }),
+
+/***/ 6:
+/***/ (function(module, exports) {
+
+	/**
+	 * Translates the list format produced by css-loader into something
+	 * easier to manipulate.
+	 */
+	module.exports = function listToStyles (parentId, list) {
+	  var styles = []
+	  var newStyles = {}
+	  for (var i = 0; i < list.length; i++) {
+	    var item = list[i]
+	    var id = item[0]
+	    var css = item[1]
+	    var media = item[2]
+	    var sourceMap = item[3]
+	    var part = {
+	      id: parentId + ':' + i,
+	      css: css,
+	      media: media,
+	      sourceMap: sourceMap
+	    }
+	    if (!newStyles[id]) {
+	      styles.push(newStyles[id] = { id: id, parts: [part] })
+	    } else {
+	      newStyles[id].parts.push(part)
+	    }
+	  }
+	  return styles
+	}
+
+
+/***/ }),
+
+/***/ 7:
+/***/ (function(module, exports) {
+
+	/* globals __VUE_SSR_CONTEXT__ */
+
+	// this module is a runtime utility for cleaner component module output and will
+	// be included in the final webpack user bundle
+
+	module.exports = function normalizeComponent (
+	  rawScriptExports,
+	  compiledTemplate,
+	  injectStyles,
+	  scopeId,
+	  moduleIdentifier /* server only */
+	) {
+	  var esModule
+	  var scriptExports = rawScriptExports = rawScriptExports || {}
+
+	  // ES6 modules interop
+	  var type = typeof rawScriptExports.default
+	  if (type === 'object' || type === 'function') {
+	    esModule = rawScriptExports
+	    scriptExports = rawScriptExports.default
+	  }
+
+	  // Vue.extend constructor export interop
+	  var options = typeof scriptExports === 'function'
+	    ? scriptExports.options
+	    : scriptExports
+
+	  // render functions
+	  if (compiledTemplate) {
+	    options.render = compiledTemplate.render
+	    options.staticRenderFns = compiledTemplate.staticRenderFns
+	  }
+
+	  // scopedId
+	  if (scopeId) {
+	    options._scopeId = scopeId
+	  }
+
+	  var hook
+	  if (moduleIdentifier) { // server build
+	    hook = function (context) {
+	      // 2.3 injection
+	      context =
+	        context || // cached call
+	        (this.$vnode && this.$vnode.ssrContext) || // stateful
+	        (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional
+	      // 2.2 with runInNewContext: true
+	      if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {
+	        context = __VUE_SSR_CONTEXT__
+	      }
+	      // inject component styles
+	      if (injectStyles) {
+	        injectStyles.call(this, context)
+	      }
+	      // register component module identifier for async chunk inferrence
+	      if (context && context._registeredComponents) {
+	        context._registeredComponents.add(moduleIdentifier)
+	      }
+	    }
+	    // used by ssr in case component is cached and beforeCreate
+	    // never gets called
+	    options._ssrRegister = hook
+	  } else if (injectStyles) {
+	    hook = injectStyles
+	  }
+
+	  if (hook) {
+	    var functional = options.functional
+	    var existing = functional
+	      ? options.render
+	      : options.beforeCreate
+	    if (!functional) {
+	      // inject component registration as beforeCreate hook
+	      options.beforeCreate = existing
+	        ? [].concat(existing, hook)
+	        : [hook]
+	    } else {
+	      // register for functioal component in vue file
+	      options.render = function renderWithStyleInjection (h, context) {
+	        hook.call(context)
+	        return existing(h, context)
+	      }
+	    }
+	  }
+
+	  return {
+	    esModule: esModule,
+	    exports: scriptExports,
+	    options: options
+	  }
+	}
+
+
+/***/ }),
+
+/***/ 48:
+/***/ (function(module, exports, __webpack_require__) {
+
+	var disposed = false
+	function injectStyle (ssrContext) {
+	  if (disposed) return
+	  __webpack_require__(49)
+	}
+	var Component = __webpack_require__(7)(
+	  /* script */
+	  __webpack_require__(51),
+	  /* template */
+	  __webpack_require__(52),
+	  /* styles */
+	  injectStyle,
+	  /* scopeId */
+	  "data-v-c84ace68",
+	  /* moduleIdentifier (server only) */
+	  null
+	)
+	Component.options.__file = "/Users/Hanks/Codes/work/incubator-weex/examples/vue/components/list.vue"
+	if (Component.esModule && Object.keys(Component.esModule).some(function (key) {return key !== "default" && key.substr(0, 2) !== "__"})) {console.error("named exports are not supported in *.vue files.")}
+	if (Component.options.functional) {console.error("[vue-loader] list.vue: functional components are not supported with templates, they should use render functions.")}
+
+	/* hot reload */
+	if (false) {(function () {
+	  var hotAPI = require("vue-hot-reload-api")
+	  hotAPI.install(require("vue"), false)
+	  if (!hotAPI.compatible) return
+	  module.hot.accept()
+	  if (!module.hot.data) {
+	    hotAPI.createRecord("data-v-c84ace68", Component.options)
+	  } else {
+	    hotAPI.reload("data-v-c84ace68", Component.options)
+	  }
+	  module.hot.dispose(function (data) {
+	    disposed = true
+	  })
+	})()}
+
+	module.exports = Component.exports
+
+
+/***/ }),
+
+/***/ 49:
+/***/ (function(module, exports, __webpack_require__) {
+
+	// style-loader: Adds some css to the DOM by adding a <style> tag
+
+	// load the styles
+	var content = __webpack_require__(50);
+	if(typeof content === 'string') content = [[module.id, content, '']];
+	if(content.locals) module.exports = content.locals;
+	// add the styles to the DOM
+	var update = __webpack_require__(5)("415fe453", content, false);
+	// Hot Module Replacement
+	if(false) {
+	 // When the styles change, update the <style> tags
+	 if(!content.locals) {
+	   module.hot.accept("!!../../../node_modules/css-loader/index.js!../../../node_modules/vue-loader/lib/style-compiler/index.js?{\"vue\":true,\"id\":\"data-v-c84ace68\",\"scoped\":true,\"hasInlineConfig\":false}!../../../node_modules/vue-loader/lib/selector.js?type=styles&index=0!./list.vue", function() {
+	     var newContent = require("!!../../../node_modules/css-loader/index.js!../../../node_modules/vue-loader/lib/style-compiler/index.js?{\"vue\":true,\"id\":\"data-v-c84ace68\",\"scoped\":true,\"hasInlineConfig\":false}!../../../node_modules/vue-loader/lib/selector.js?type=styles&index=0!./list.vue");
+	     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
+	     update(newContent);
+	   });
+	 }
+	 // When the module is disposed, remove the <style> tags
+	 module.hot.dispose(function() { update(); });
+	}
+
+/***/ }),
+
+/***/ 50:
+/***/ (function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(4)();
+	// imports
+
+
+	// module
+	exports.push([module.id, "\n.list[data-v-c84ace68] {\n  height:850px\n}\n.count[data-v-c84ace68] {\n  font-size: 48px;\n  margin:10px;\n}\n.indicator[data-v-c84ace68] {\n  height: 40px;\n  width: 40px;\n  color:#45b5f0;\n}\n.row[data-v-c84ace68] {\n  width: 750px;\n}\n.item[data-v-c84ace68] {\n  justify-content: center;\n  border-bottom-width: 2px;\n  border-bottom-color: #c0c0c0;\n  height: 100px;\n  padding:20px;\n}\n.item[data-v-c84ace68]:active {\n   background-color: #00BDFF;\n}\n.item-title[data-v-c84ace68] {\n}\n", ""]);
+
+	// exports
+
+
+/***/ }),
+
+/***/ 51:
+/***/ (function(module, exports) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	module.exports = {
+	  methods: {
+	    onappear: function onappear(idx, e) {
+	      var appearId = this.rows[idx].id;
+	      console.log('+++++', appearId);
+	      var appearIds = this.appearIds;
+	      appearIds.push(appearId);
+	      this.getMinAndMaxIds(appearIds);
+	    },
+	    ondisappear: function ondisappear(idx, e) {
+	      var disAppearId = this.rows[idx].id;
+	      console.log('+++++', disAppearId);
+	      var appearIds = this.appearIds;
+	      var index = appearIds.indexOf(disAppearId);
+	      if (index > -1) {
+	        appearIds.splice(index, 1);
+	      }
+	      this.getMinAndMaxIds(appearIds);
+	    },
+	    getMinAndMaxIds: function getMinAndMaxIds(appearIds) {
+	      appearIds.sort(function (a, b) {
+	        return a - b;
+	      });
+	      this.appearIds = appearIds;
+	      this.appearMax = appearIds[appearIds.length - 1];
+	      this.appearMin = appearIds[0];
+	    }
+	  },
+	  data: function data() {
+	    return {
+	      appearMin: 1,
+	      appearMax: 1,
+	      appearIds: [],
+	      rows: [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }, { id: 6 }, { id: 7 }, { id: 8 }, { id: 9 }, { id: 10 }, { id: 11 }, { id: 12 }, { id: 13 }, { id: 14 }, { id: 15 }, { id: 16 }, { id: 17 }, { id: 18 }, { id: 19 }, { id: 20 }, { id: 21 }, { id: 22 }, { id: 23 }, { id: 24 }, { id: 25 }, { id: 26 }, { id: 27 }, { id: 28 }, { id: 29 }]
+	    };
+	  }
+	};
+
+/***/ }),
+
+/***/ 52:
+/***/ (function(module, exports, __webpack_require__) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _c('div', [_c('list', {
+	    staticClass: "list",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined))
+	  }, _vm._l((_vm.rows), function(v, i) {
+	    return _c('cell', {
+	      key: i,
+	      staticClass: "row",
+	      staticStyle: _vm.$processStyle(undefined),
+	      style: (_vm.$processStyle(undefined)),
+	      attrs: {
+	        "append": "tree",
+	        "index": i
+	      },
+	      on: {
+	        "appear": function($event) {
+	          _vm.onappear(i, $event)
+	        },
+	        "disappear": function($event) {
+	          _vm.ondisappear(i, $event)
+	        }
+	      }
+	    }, [_c('div', {
+	      staticClass: "item",
+	      staticStyle: _vm.$processStyle(undefined),
+	      style: (_vm.$processStyle(undefined))
+	    }, [_c('text', {
+	      staticClass: "item-title",
+	      staticStyle: _vm.$processStyle(undefined),
+	      style: (_vm.$processStyle(undefined))
+	    }, [_vm._v("row " + _vm._s(v.id))])])])
+	  })), _vm._v(" "), _c('text', {
+	    staticClass: "count",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "value": 'Appear items: ' + _vm.appearMin + ' ~ ' + _vm.appearMax
+	    }
+	  })], 1)
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+	if (false) {
+	  module.hot.accept()
+	  if (module.hot.data) {
+	     require("vue-hot-reload-api").rerender("data-v-c84ace68", module.exports)
+	  }
+	}
+
+/***/ })
+
+/******/ });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/8668b0f9/android/playground/app/src/main/assets/vue-web/vue/components/marquee.js
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/assets/vue-web/vue/components/marquee.js b/android/playground/app/src/main/assets/vue-web/vue/components/marquee.js
new file mode 100644
index 0000000..13bc55b
--- /dev/null
+++ b/android/playground/app/src/main/assets/vue-web/vue/components/marquee.js
@@ -0,0 +1,1034 @@
+// NOTE: for vue2.0 and platform:web only.
+
+/******/ (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 App = __webpack_require__(53)
+	App.el = '#root'
+	new Vue(App)
+
+
+/***/ }),
+/* 1 */,
+/* 2 */,
+/* 3 */,
+/* 4 */
+/***/ (function(module, exports) {
+
+	/*
+		MIT License http://www.opensource.org/licenses/mit-license.php
+		Author Tobias Koppers @sokra
+	*/
+	// css base code, injected by the css-loader
+	module.exports = function() {
+		var list = [];
+
+		// return the list of modules as css string
+		list.toString = function toString() {
+			var result = [];
+			for(var i = 0; i < this.length; i++) {
+				var item = this[i];
+				if(item[2]) {
+					result.push("@media " + item[2] + "{" + item[1] + "}");
+				} else {
+					result.push(item[1]);
+				}
+			}
+			return result.join("");
+		};
+
+		// import a list of modules into the list
+		list.i = function(modules, mediaQuery) {
+			if(typeof modules === "string")
+				modules = [[null, modules, ""]];
+			var alreadyImportedModules = {};
+			for(var i = 0; i < this.length; i++) {
+				var id = this[i][0];
+				if(typeof id === "number")
+					alreadyImportedModules[id] = true;
+			}
+			for(i = 0; i < modules.length; i++) {
+				var item = modules[i];
+				// skip already imported module
+				// this implementation is not 100% perfect for weird media query combinations
+				//  when a module is imported multiple times with different media queries.
+				//  I hope this will never occur (Hey this way we have smaller bundles)
+				if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
+					if(mediaQuery && !item[2]) {
+						item[2] = mediaQuery;
+					} else if(mediaQuery) {
+						item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
+					}
+					list.push(item);
+				}
+			}
+		};
+		return list;
+	};
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+	/*
+	  MIT License http://www.opensource.org/licenses/mit-license.php
+	  Author Tobias Koppers @sokra
+	  Modified by Evan You @yyx990803
+	*/
+
+	var hasDocument = typeof document !== 'undefined'
+
+	if (false) {
+	  if (!hasDocument) {
+	    throw new Error(
+	    'vue-style-loader cannot be used in a non-browser environment. ' +
+	    "Use { target: 'node' } in your Webpack config to indicate a server-rendering environment."
+	  ) }
+	}
+
+	var listToStyles = __webpack_require__(6)
+
+	/*
+	type StyleObject = {
+	  id: number;
+	  parts: Array<StyleObjectPart>
+	}
+
+	type StyleObjectPart = {
+	  css: string;
+	  media: string;
+	  sourceMap: ?string
+	}
+	*/
+
+	var stylesInDom = {/*
+	  [id: number]: {
+	    id: number,
+	    refs: number,
+	    parts: Array<(obj?: StyleObjectPart) => void>
+	  }
+	*/}
+
+	var head = hasDocument && (document.head || document.getElementsByTagName('head')[0])
+	var singletonElement = null
+	var singletonCounter = 0
+	var isProduction = false
+	var noop = function () {}
+
+	// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
+	// tags it will allow on a page
+	var isOldIE = typeof navigator !== 'undefined' && /msie [6-9]\b/.test(navigator.userAgent.toLowerCase())
+
+	module.exports = function (parentId, list, _isProduction) {
+	  isProduction = _isProduction
+
+	  var styles = listToStyles(parentId, list)
+	  addStylesToDom(styles)
+
+	  return function update (newList) {
+	    var mayRemove = []
+	    for (var i = 0; i < styles.length; i++) {
+	      var item = styles[i]
+	      var domStyle = stylesInDom[item.id]
+	      domStyle.refs--
+	      mayRemove.push(domStyle)
+	    }
+	    if (newList) {
+	      styles = listToStyles(parentId, newList)
+	      addStylesToDom(styles)
+	    } else {
+	      styles = []
+	    }
+	    for (var i = 0; i < mayRemove.length; i++) {
+	      var domStyle = mayRemove[i]
+	      if (domStyle.refs === 0) {
+	        for (var j = 0; j < domStyle.parts.length; j++) {
+	          domStyle.parts[j]()
+	        }
+	        delete stylesInDom[domStyle.id]
+	      }
+	    }
+	  }
+	}
+
+	function addStylesToDom (styles /* Array<StyleObject> */) {
+	  for (var i = 0; i < styles.length; i++) {
+	    var item = styles[i]
+	    var domStyle = stylesInDom[item.id]
+	    if (domStyle) {
+	      domStyle.refs++
+	      for (var j = 0; j < domStyle.parts.length; j++) {
+	        domStyle.parts[j](item.parts[j])
+	      }
+	      for (; j < item.parts.length; j++) {
+	        domStyle.parts.push(addStyle(item.parts[j]))
+	      }
+	      if (domStyle.parts.length > item.parts.length) {
+	        domStyle.parts.length = item.parts.length
+	      }
+	    } else {
+	      var parts = []
+	      for (var j = 0; j < item.parts.length; j++) {
+	        parts.push(addStyle(item.parts[j]))
+	      }
+	      stylesInDom[item.id] = { id: item.id, refs: 1, parts: parts }
+	    }
+	  }
+	}
+
+	function createStyleElement () {
+	  var styleElement = document.createElement('style')
+	  styleElement.type = 'text/css'
+	  head.appendChild(styleElement)
+	  return styleElement
+	}
+
+	function addStyle (obj /* StyleObjectPart */) {
+	  var update, remove
+	  var styleElement = document.querySelector('style[data-vue-ssr-id~="' + obj.id + '"]')
+
+	  if (styleElement) {
+	    if (isProduction) {
+	      // has SSR styles and in production mode.
+	      // simply do nothing.
+	      return noop
+	    } else {
+	      // has SSR styles but in dev mode.
+	      // for some reason Chrome can't handle source map in server-rendered
+	      // style tags - source maps in <style> only works if the style tag is
+	      // created and inserted dynamically. So we remove the server rendered
+	      // styles and inject new ones.
+	      styleElement.parentNode.removeChild(styleElement)
+	    }
+	  }
+
+	  if (isOldIE) {
+	    // use singleton mode for IE9.
+	    var styleIndex = singletonCounter++
+	    styleElement = singletonElement || (singletonElement = createStyleElement())
+	    update = applyToSingletonTag.bind(null, styleElement, styleIndex, false)
+	    remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true)
+	  } else {
+	    // use multi-style-tag mode in all other cases
+	    styleElement = createStyleElement()
+	    update = applyToTag.bind(null, styleElement)
+	    remove = function () {
+	      styleElement.parentNode.removeChild(styleElement)
+	    }
+	  }
+
+	  update(obj)
+
+	  return function updateStyle (newObj /* StyleObjectPart */) {
+	    if (newObj) {
+	      if (newObj.css === obj.css &&
+	          newObj.media === obj.media &&
+	          newObj.sourceMap === obj.sourceMap) {
+	        return
+	      }
+	      update(obj = newObj)
+	    } else {
+	      remove()
+	    }
+	  }
+	}
+
+	var replaceText = (function () {
+	  var textStore = []
+
+	  return function (index, replacement) {
+	    textStore[index] = replacement
+	    return textStore.filter(Boolean).join('\n')
+	  }
+	})()
+
+	function applyToSingletonTag (styleElement, index, remove, obj) {
+	  var css = remove ? '' : obj.css
+
+	  if (styleElement.styleSheet) {
+	    styleElement.styleSheet.cssText = replaceText(index, css)
+	  } else {
+	    var cssNode = document.createTextNode(css)
+	    var childNodes = styleElement.childNodes
+	    if (childNodes[index]) styleElement.removeChild(childNodes[index])
+	    if (childNodes.length) {
+	      styleElement.insertBefore(cssNode, childNodes[index])
+	    } else {
+	      styleElement.appendChild(cssNode)
+	    }
+	  }
+	}
+
+	function applyToTag (styleElement, obj) {
+	  var css = obj.css
+	  var media = obj.media
+	  var sourceMap = obj.sourceMap
+
+	  if (media) {
+	    styleElement.setAttribute('media', media)
+	  }
+
+	  if (sourceMap) {
+	    // https://developer.chrome.com/devtools/docs/javascript-debugging
+	    // this makes source maps inside style tags work properly in Chrome
+	    css += '\n/*# sourceURL=' + sourceMap.sources[0] + ' */'
+	    // http://stackoverflow.com/a/26603875
+	    css += '\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */'
+	  }
+
+	  if (styleElement.styleSheet) {
+	    styleElement.styleSheet.cssText = css
+	  } else {
+	    while (styleElement.firstChild) {
+	      styleElement.removeChild(styleElement.firstChild)
+	    }
+	    styleElement.appendChild(document.createTextNode(css))
+	  }
+	}
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports) {
+
+	/**
+	 * Translates the list format produced by css-loader into something
+	 * easier to manipulate.
+	 */
+	module.exports = function listToStyles (parentId, list) {
+	  var styles = []
+	  var newStyles = {}
+	  for (var i = 0; i < list.length; i++) {
+	    var item = list[i]
+	    var id = item[0]
+	    var css = item[1]
+	    var media = item[2]
+	    var sourceMap = item[3]
+	    var part = {
+	      id: parentId + ':' + i,
+	      css: css,
+	      media: media,
+	      sourceMap: sourceMap
+	    }
+	    if (!newStyles[id]) {
+	      styles.push(newStyles[id] = { id: id, parts: [part] })
+	    } else {
+	      newStyles[id].parts.push(part)
+	    }
+	  }
+	  return styles
+	}
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports) {
+
+	/* globals __VUE_SSR_CONTEXT__ */
+
+	// this module is a runtime utility for cleaner component module output and will
+	// be included in the final webpack user bundle
+
+	module.exports = function normalizeComponent (
+	  rawScriptExports,
+	  compiledTemplate,
+	  injectStyles,
+	  scopeId,
+	  moduleIdentifier /* server only */
+	) {
+	  var esModule
+	  var scriptExports = rawScriptExports = rawScriptExports || {}
+
+	  // ES6 modules interop
+	  var type = typeof rawScriptExports.default
+	  if (type === 'object' || type === 'function') {
+	    esModule = rawScriptExports
+	    scriptExports = rawScriptExports.default
+	  }
+
+	  // Vue.extend constructor export interop
+	  var options = typeof scriptExports === 'function'
+	    ? scriptExports.options
+	    : scriptExports
+
+	  // render functions
+	  if (compiledTemplate) {
+	    options.render = compiledTemplate.render
+	    options.staticRenderFns = compiledTemplate.staticRenderFns
+	  }
+
+	  // scopedId
+	  if (scopeId) {
+	    options._scopeId = scopeId
+	  }
+
+	  var hook
+	  if (moduleIdentifier) { // server build
+	    hook = function (context) {
+	      // 2.3 injection
+	      context =
+	        context || // cached call
+	        (this.$vnode && this.$vnode.ssrContext) || // stateful
+	        (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional
+	      // 2.2 with runInNewContext: true
+	      if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {
+	        context = __VUE_SSR_CONTEXT__
+	      }
+	      // inject component styles
+	      if (injectStyles) {
+	        injectStyles.call(this, context)
+	      }
+	      // register component module identifier for async chunk inferrence
+	      if (context && context._registeredComponents) {
+	        context._registeredComponents.add(moduleIdentifier)
+	      }
+	    }
+	    // used by ssr in case component is cached and beforeCreate
+	    // never gets called
+	    options._ssrRegister = hook
+	  } else if (injectStyles) {
+	    hook = injectStyles
+	  }
+
+	  if (hook) {
+	    var functional = options.functional
+	    var existing = functional
+	      ? options.render
+	      : options.beforeCreate
+	    if (!functional) {
+	      // inject component registration as beforeCreate hook
+	      options.beforeCreate = existing
+	        ? [].concat(existing, hook)
+	        : [hook]
+	    } else {
+	      // register for functioal component in vue file
+	      options.render = function renderWithStyleInjection (h, context) {
+	        hook.call(context)
+	        return existing(h, context)
+	      }
+	    }
+	  }
+
+	  return {
+	    esModule: esModule,
+	    exports: scriptExports,
+	    options: options
+	  }
+	}
+
+
+/***/ }),
+/* 8 */,
+/* 9 */
+/***/ (function(module, exports, __webpack_require__) {
+
+	var disposed = false
+	function injectStyle (ssrContext) {
+	  if (disposed) return
+	  __webpack_require__(10)
+	}
+	var Component = __webpack_require__(7)(
+	  /* script */
+	  __webpack_require__(12),
+	  /* template */
+	  __webpack_require__(13),
+	  /* styles */
+	  injectStyle,
+	  /* scopeId */
+	  "data-v-66798af2",
+	  /* moduleIdentifier (server only) */
+	  null
+	)
+	Component.options.__file = "/Users/Hanks/Codes/work/incubator-weex/examples/vue/include/panel.vue"
+	if (Component.esModule && Object.keys(Component.esModule).some(function (key) {return key !== "default" && key.substr(0, 2) !== "__"})) {console.error("named exports are not supported in *.vue files.")}
+	if (Component.options.functional) {console.error("[vue-loader] panel.vue: functional components are not supported with templates, they should use render functions.")}
+
+	/* hot reload */
+	if (false) {(function () {
+	  var hotAPI = require("vue-hot-reload-api")
+	  hotAPI.install(require("vue"), false)
+	  if (!hotAPI.compatible) return
+	  module.hot.accept()
+	  if (!module.hot.data) {
+	    hotAPI.createRecord("data-v-66798af2", Component.options)
+	  } else {
+	    hotAPI.reload("data-v-66798af2", Component.options)
+	  }
+	  module.hot.dispose(function (data) {
+	    disposed = true
+	  })
+	})()}
+
+	module.exports = Component.exports
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+	// style-loader: Adds some css to the DOM by adding a <style> tag
+
+	// load the styles
+	var content = __webpack_require__(11);
+	if(typeof content === 'string') content = [[module.id, content, '']];
+	if(content.locals) module.exports = content.locals;
+	// add the styles to the DOM
+	var update = __webpack_require__(5)("392aaf4e", content, false);
+	// Hot Module Replacement
+	if(false) {
+	 // When the styles change, update the <style> tags
+	 if(!content.locals) {
+	   module.hot.accept("!!../../../node_modules/css-loader/index.js!../../../node_modules/vue-loader/lib/style-compiler/index.js?{\"vue\":true,\"id\":\"data-v-66798af2\",\"scoped\":true,\"hasInlineConfig\":false}!../../../node_modules/vue-loader/lib/selector.js?type=styles&index=0!./panel.vue", function() {
+	     var newContent = require("!!../../../node_modules/css-loader/index.js!../../../node_modules/vue-loader/lib/style-compiler/index.js?{\"vue\":true,\"id\":\"data-v-66798af2\",\"scoped\":true,\"hasInlineConfig\":false}!../../../node_modules/vue-loader/lib/selector.js?type=styles&index=0!./panel.vue");
+	     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
+	     update(newContent);
+	   });
+	 }
+	 // When the module is disposed, remove the <style> tags
+	 module.hot.dispose(function() { update(); });
+	}
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(4)();
+	// imports
+
+
+	// module
+	exports.push([module.id, "\n.panel[data-v-66798af2] {\n  margin-bottom: 20px;\n  background-color: #fff;\n  /*border: 1px solid transparent;*/\n  /*border-radius: 10px;*/\n  /*-webkit-box-shadow: 0 1px 1px rgba(0,0,0,.05);*/\n  /*box-shadow: 0 1px 1px rgba(0,0,0,.05);*/\n  border-color: #dddddd;\n  border-width: 1px;\n}\n.panel-default[data-v-66798af2] {\n}\n.panel-primary[data-v-66798af2] {\n  border-color: rgb(40, 96, 144);\n}\n.panel-success[data-v-66798af2] {\n  border-color: rgb(76, 174, 76);\n}\n.panel-info[data-v-66798af2] {\n  border-color: rgb(70, 184, 218);\n}\n.panel-warning[data-v-66798af2] {\n  border-color: rgb(238, 162, 54);\n}\n.panel-danger[data-v-66798af2] {\n  border-color: rgb(212, 63, 58);\n}\n.panel-header[data-v-66798af2] {\n  background-color: #f5f5f5;\n  font-size: 40px;\n  /*padding-left: 12px;*/\n  /*padding-right: 12px;*/\n  /*padding-top: 20px;*/\n  /*padding-bottom: 20px;*/\n  color: #333;\n}\n.panel-header-default[data-v-66798af2] {\n}\n.panel-header-
 primary[data-v-66798af2] {\n  background-color: rgb(40, 96, 144);\n  color: #ffffff;\n}\n.panel-header-success[data-v-66798af2] {\n  background-color: rgb(92, 184, 92);\n  color: #ffffff;\n}\n.panel-header-info[data-v-66798af2] {\n  background-color: rgb(91, 192, 222);\n  color: #ffffff;\n}\n.panel-header-warning[data-v-66798af2] {\n  background-color: rgb(240, 173, 78);\n  color: #ffffff;\n}\n.panel-header-danger[data-v-66798af2] {\n  background-color: rgb(217, 83, 79);\n  color: #ffffff;\n}\n.panel-body[data-v-66798af2] {\n  padding-left: 12px;\n  padding-right: 12px;\n  padding-top: 20px;\n  padding-bottom: 20px;\n}\n.panel-body-default[data-v-66798af2] {\n}\n.panel-body-primary[data-v-66798af2] {\n}\n.panel-body-success[data-v-66798af2] {\n}\n.panel-body-info[data-v-66798af2] {\n}\n.panel-body-warning[data-v-66798af2] {\n}\n.panel-body-danger[data-v-66798af2] {\n}\n", ""]);
+
+	// exports
+
+
+/***/ }),
+/* 12 */
+/***/ (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 }
+	  }
+	};
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports, __webpack_require__) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _c('div', {
+	    class: ['panel', 'panel-' + _vm.type],
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle({
+	      borderWidth: _vm.border
+	    }))
+	  }, [_c('text', {
+	    class: ['panel-header', 'panel-header-' + _vm.type],
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle({
+	      paddingTop: _vm.paddingHead,
+	      paddingBottom: _vm.paddingHead,
+	      paddingLeft: _vm.paddingHead * 1.5,
+	      paddingRight: _vm.paddingHead * 1.5
+	    }))
+	  }, [_vm._v(_vm._s(_vm.title))]), _vm._v(" "), _c('div', {
+	    class: ['panel-body', 'panel-body-' + _vm.type],
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle({
+	      paddingTop: _vm.paddingBody,
+	      paddingBottom: _vm.paddingBody,
+	      paddingLeft: _vm.paddingBody * 1.5,
+	      paddingRight: _vm.paddingBody * 1.5
+	    }))
+	  }, [_vm._t("default")], 2)])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+	if (false) {
+	  module.hot.accept()
+	  if (module.hot.data) {
+	     require("vue-hot-reload-api").rerender("data-v-66798af2", module.exports)
+	  }
+	}
+
+/***/ }),
+/* 14 */,
+/* 15 */,
+/* 16 */,
+/* 17 */,
+/* 18 */,
+/* 19 */,
+/* 20 */,
+/* 21 */,
+/* 22 */,
+/* 23 */,
+/* 24 */,
+/* 25 */,
+/* 26 */,
+/* 27 */,
+/* 28 */,
+/* 29 */,
+/* 30 */,
+/* 31 */,
+/* 32 */,
+/* 33 */,
+/* 34 */,
+/* 35 */,
+/* 36 */,
+/* 37 */,
+/* 38 */,
+/* 39 */,
+/* 40 */,
+/* 41 */,
+/* 42 */,
+/* 43 */,
+/* 44 */,
+/* 45 */,
+/* 46 */,
+/* 47 */,
+/* 48 */,
+/* 49 */,
+/* 50 */,
+/* 51 */,
+/* 52 */,
+/* 53 */
+/***/ (function(module, exports, __webpack_require__) {
+
+	var disposed = false
+	var Component = __webpack_require__(7)(
+	  /* script */
+	  __webpack_require__(54),
+	  /* template */
+	  __webpack_require__(60),
+	  /* styles */
+	  null,
+	  /* scopeId */
+	  null,
+	  /* moduleIdentifier (server only) */
+	  null
+	)
+	Component.options.__file = "/Users/Hanks/Codes/work/incubator-weex/examples/vue/components/marquee.vue"
+	if (Component.esModule && Object.keys(Component.esModule).some(function (key) {return key !== "default" && key.substr(0, 2) !== "__"})) {console.error("named exports are not supported in *.vue files.")}
+	if (Component.options.functional) {console.error("[vue-loader] marquee.vue: functional components are not supported with templates, they should use render functions.")}
+
+	/* hot reload */
+	if (false) {(function () {
+	  var hotAPI = require("vue-hot-reload-api")
+	  hotAPI.install(require("vue"), false)
+	  if (!hotAPI.compatible) return
+	  module.hot.accept()
+	  if (!module.hot.data) {
+	    hotAPI.createRecord("data-v-d0289538", Component.options)
+	  } else {
+	    hotAPI.reload("data-v-d0289538", Component.options)
+	  }
+	  module.hot.dispose(function (data) {
+	    disposed = true
+	  })
+	})()}
+
+	module.exports = Component.exports
+
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	module.exports = {
+	  data: function data() {
+	    return {
+	      marquee: {
+	        height: 30,
+	        duration: 1500,
+	        interval: 2000,
+	        list: [{ text: 'Introducing Bots on Messenger' }, { text: 'Capturing 3D 360-Stereo VR Video' }, { text: 'The Future of Video on Facebook' }, { text: 'Announcing Vue.js 2.0' }, { text: 'Not Your Average Virtual-DOM' }, { text: 'Templates, JSX, or Hyperscript?' }]
+	      }
+	    };
+	  },
+	  components: {
+	    panel: __webpack_require__(9),
+	    marquee: __webpack_require__(55)
+	  },
+	  methods: {
+	    marqueeChange: function marqueeChange(e) {
+	      console.log(e);
+	    }
+	  }
+	};
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __webpack_require__) {
+
+	var disposed = false
+	function injectStyle (ssrContext) {
+	  if (disposed) return
+	  __webpack_require__(56)
+	}
+	var Component = __webpack_require__(7)(
+	  /* script */
+	  __webpack_require__(58),
+	  /* template */
+	  __webpack_require__(59),
+	  /* styles */
+	  injectStyle,
+	  /* scopeId */
+	  "data-v-58176c90",
+	  /* moduleIdentifier (server only) */
+	  null
+	)
+	Component.options.__file = "/Users/Hanks/Codes/work/incubator-weex/examples/vue/include/marquee.vue"
+	if (Component.esModule && Object.keys(Component.esModule).some(function (key) {return key !== "default" && key.substr(0, 2) !== "__"})) {console.error("named exports are not supported in *.vue files.")}
+	if (Component.options.functional) {console.error("[vue-loader] marquee.vue: functional components are not supported with templates, they should use render functions.")}
+
+	/* hot reload */
+	if (false) {(function () {
+	  var hotAPI = require("vue-hot-reload-api")
+	  hotAPI.install(require("vue"), false)
+	  if (!hotAPI.compatible) return
+	  module.hot.accept()
+	  if (!module.hot.data) {
+	    hotAPI.createRecord("data-v-58176c90", Component.options)
+	  } else {
+	    hotAPI.reload("data-v-58176c90", Component.options)
+	  }
+	  module.hot.dispose(function (data) {
+	    disposed = true
+	  })
+	})()}
+
+	module.exports = Component.exports
+
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __webpack_require__) {
+
+	// style-loader: Adds some css to the DOM by adding a <style> tag
+
+	// load the styles
+	var content = __webpack_require__(57);
+	if(typeof content === 'string') content = [[module.id, content, '']];
+	if(content.locals) module.exports = content.locals;
+	// add the styles to the DOM
+	var update = __webpack_require__(5)("5521c87a", content, false);
+	// Hot Module Replacement
+	if(false) {
+	 // When the styles change, update the <style> tags
+	 if(!content.locals) {
+	   module.hot.accept("!!../../../node_modules/css-loader/index.js!../../../node_modules/vue-loader/lib/style-compiler/index.js?{\"vue\":true,\"id\":\"data-v-58176c90\",\"scoped\":true,\"hasInlineConfig\":false}!../../../node_modules/vue-loader/lib/selector.js?type=styles&index=0!./marquee.vue", function() {
+	     var newContent = require("!!../../../node_modules/css-loader/index.js!../../../node_modules/vue-loader/lib/style-compiler/index.js?{\"vue\":true,\"id\":\"data-v-58176c90\",\"scoped\":true,\"hasInlineConfig\":false}!../../../node_modules/vue-loader/lib/selector.js?type=styles&index=0!./marquee.vue");
+	     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
+	     update(newContent);
+	   });
+	 }
+	 // When the module is disposed, remove the <style> tags
+	 module.hot.dispose(function() { update(); });
+	}
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(4)();
+	// imports
+
+
+	// module
+	exports.push([module.id, "\n.wrap[data-v-58176c90] {\n  overflow: hidden;\n  position: relative;\n}\n.anim[data-v-58176c90] {\n  flex-direction: column;\n  position: absolute;\n  transform: translateY(0) translateZ(0);\n}\n", ""]);
+
+	// exports
+
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports) {
+
+	'use strict';
+
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+	//
+
+	var _animation = weex.requireModule('animation');
+
+	module.exports = {
+	  props: {
+	    step: { default: 0 },
+	    count: { default: 0 },
+	    index: { default: 1 },
+	    duration: { default: 0 },
+	    interval: { default: 0 },
+	    outofview: { default: false }
+	  },
+	  created: function created() {
+	    if (this.interval > 0 && this.step > 0 && this.duration > 0) {
+	      this.run();
+	    }
+	  },
+	  methods: {
+	    run: function run() {
+	      if (this.outofview) {
+	        setTimeout(this.run.bind(this), this.interval);
+	      } else {
+	        setTimeout(function () {
+	          this.animation(this.run.bind(this));
+	        }.bind(this), this.interval);
+	      }
+	    },
+	    animation: function animation(cb) {
+	      var offset = -this.step * this.index;
+	      _animation.transition(this.$refs.anim, {
+	        styles: {
+	          transform: 'translateY(' + offset + 'px) translateZ(0)'
+	        },
+	        timingFunction: 'ease',
+	        duration: this.duration
+	      }, function () {
+	        this.index = (this.index + 1) % this.count;
+	        this.$emit('change', {
+	          index: this.index,
+	          count: this.count
+	        });
+	        cb && cb();
+	      }.bind(this));
+	    },
+	    appeared: function appeared() {
+	      this.outofview = false;
+	    },
+	    disappeared: function disappeared() {
+	      this.outofview = true;
+	    }
+	  }
+	};
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __webpack_require__) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _c('div', {
+	    staticClass: "wrap",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    on: {
+	      "appear": _vm.appeared,
+	      "disappear": _vm.disappeared
+	    }
+	  }, [_c('div', {
+	    ref: "anim",
+	    staticClass: "anim",
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined))
+	  }, [_vm._t("default")], 2)])
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+	if (false) {
+	  module.hot.accept()
+	  if (module.hot.data) {
+	     require("vue-hot-reload-api").rerender("data-v-58176c90", module.exports)
+	  }
+	}
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports, __webpack_require__) {
+
+	module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+	  return _c('scroller', [_c('panel', {
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle(undefined)),
+	    attrs: {
+	      "title": "Marquee",
+	      "type": "primary"
+	    }
+	  }, [_c('marquee', {
+	    staticStyle: _vm.$processStyle(undefined),
+	    style: (_vm.$processStyle({
+	      width: 700,
+	      height: _vm.marquee.height * 2,
+	      backgroundColor: 'rgb(223, 240, 216)',
+	      borderRadius: 8,
+	      paddingLeft: 10,
+	      paddingRight: 10
+	    })),
+	    attrs: {
+	      "step": _vm.marquee.height * 2,
+	      "count": _vm.marquee.list.length,
+	      "interval": _vm.marquee.interval,
+	      "duration": _vm.marquee.duration
+	    },
+	    on: {
+	      "change": _vm.marqueeChange
+	    }
+	  }, _vm._l((_vm.marquee.list), function(item, i) {
+	    return _c('div', {
+	      key: i,
+	      staticStyle: _vm.$processStyle(undefined),
+	      style: (_vm.$processStyle({
+	        height: _vm.marquee.height * _vm.marquee.length,
+	        paddingTop: _vm.marquee.height * 0.5,
+	        paddingBottom: _vm.marquee.height * 0.5,
+	        overflow: 'hidden'
+	      }))
+	    }, [_c('text', {
+	      staticStyle: _vm.$processStyle(undefined),
+	      style: (_vm.$processStyle({
+	        height: _vm.marquee.height,
+	        color: 'rgb(60, 118, 61)',
+	        fontSize: 28
+	      }))
+	    }, [_vm._v(_vm._s(item.text))])])
+	  }))], 1)], 1)
+	},staticRenderFns: []}
+	module.exports.render._withStripped = true
+	if (false) {
+	  module.hot.accept()
+	  if (module.hot.data) {
+	     require("vue-hot-reload-api").rerender("data-v-d0289538", module.exports)
+	  }
+	}
+
+/***/ })
+/******/ ]);
\ No newline at end of file