├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .github ├── ISSUE_TEMPLATE │ └── ----please-use-mand-mobie-issue-helper---.md ├── PULL_REQUEST_TEMPLATE.md ├── issue_template.md └── workflows │ └── preview.yml ├── .gitignore ├── .npmrc ├── .travis.yml ├── CHANGELOG.en-US.md ├── CHANGELOG.md ├── CHECKLIST.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── README.zh-CN.md ├── build ├── check-versions.js ├── component-init.js ├── mand-change-log.js ├── rollup │ ├── build-component.rollup.js │ ├── build-css-variables.js │ ├── build-example.rollup.js │ ├── build-mand-mobile.rollup.js │ ├── build-vw-responsive.js │ ├── dev-server.rollup.js │ ├── rollup-plugin-config.js │ ├── rollup-plugin-example-config.js │ ├── rollup-plugin-stylus-compiler.js │ └── rollup-plugin-svg-sprite.js ├── stylus-mixin.js ├── template.exp ├── utils.js └── webpack │ ├── build-example.js │ ├── build-mand-mobile.js │ ├── build-style-entry.js │ ├── dev-client.js │ ├── dev-server.js │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ ├── webpack.build.conf.js │ ├── webpack.dev.conf.js │ ├── webpack.example.conf.js │ └── webpack.test.conf.js ├── components ├── _locale │ ├── index.js │ └── lang │ │ ├── en-US.js │ │ ├── es-MX.js │ │ └── zh-CN.js ├── _style │ ├── global.styl │ ├── images │ │ ├── keyboard-del.png │ │ ├── keyboard-hide.png │ │ ├── license-keyboard-del.png │ │ ├── new-energy.png │ │ ├── spinner.svg │ │ ├── success-color.svg │ │ └── warn-color.svg │ └── mixin │ │ ├── theme.basic.styl │ │ ├── theme.components.styl │ │ ├── theme.variable.styl │ │ └── util.styl ├── _util │ ├── animate.js │ ├── debug.js │ ├── dom.js │ ├── env.js │ ├── formate-value.js │ ├── index.js │ ├── lang.js │ ├── render.js │ ├── scroller.js │ └── store.js ├── action-bar │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ └── demo3.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ └── demo3.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── action-sheet │ ├── README.en-US.md │ ├── README.md │ ├── action-sheet.vue │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ └── demo1.vue │ │ └── index.vue │ ├── index.js │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ └── demo1.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── activity-indicator │ ├── README.en-US.md │ ├── README.md │ ├── carousel-circle.vue │ ├── carousel.vue │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ └── demo2.vue │ │ └── index.vue │ ├── index.vue │ ├── roller-success.vue │ ├── roller.vue │ ├── spinner.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ └── demo2.vue │ │ └── demo.spec.js ├── agree │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ ├── demo4.vue │ │ │ └── demo5.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ ├── demo3.vue │ │ ├── demo4.vue │ │ └── demo5.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── amount │ ├── DINPro-Medium.ttf │ ├── README.en-US.md │ ├── README.md │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ └── demo3.vue │ │ └── index.vue │ ├── index.vue │ ├── number-capital.js │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ └── demo3.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── bill │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ └── demo1.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ └── demo1.vue │ │ └── demo.spec.js ├── button │ ├── README.en-US.md │ ├── README.md │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ └── demo4.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ ├── demo3.vue │ │ └── demo4.vue │ │ └── demo.spec.js ├── captcha │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ └── demo2.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ └── demo2.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── cashier │ ├── README.en-US.md │ ├── README.md │ ├── channel-button.vue │ ├── channel-item.vue │ ├── channel.vue │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ └── demo1.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ ├── demo3.vue │ │ └── demo4.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── cell-item │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ └── demo2.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ └── demo2.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── chart │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ └── demo2.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ └── demo2.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── check-base │ └── box.vue ├── check-box │ └── index.vue ├── check-group │ └── index.vue ├── check-list │ └── index.vue ├── check │ ├── README.en-US.md │ ├── README.md │ ├── box.vue │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ ├── demo4.vue │ │ │ └── demo5.vue │ │ └── index.vue │ ├── group.vue │ ├── index.vue │ ├── list.vue │ ├── mixin │ │ └── index.js │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ ├── demo3.vue │ │ └── demo4.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── codebox │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ └── demo3.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ └── demo3.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── date-picker │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ └── demo3.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ └── demo3.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── detail-item │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ └── demo0.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ └── demo0.vue │ │ └── demo.spec.js ├── dialog │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ └── demo1.vue │ │ └── index.vue │ ├── dialog.vue │ ├── index.js │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ └── demo1.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── drop-menu │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ └── demo3.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ └── demo3.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── field-item │ └── index.vue ├── field │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ └── demo0.vue │ │ └── index.vue │ ├── index.vue │ ├── item.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ └── demo0.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── icon │ ├── README.en-US.md │ ├── README.md │ ├── default-svg-list.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ └── demo3.vue │ │ └── index.vue │ ├── iconfont.ttf │ ├── iconfont.woff │ ├── index.vue │ ├── load-spirte.js │ ├── selection.json │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ └── demo3.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── image-reader │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ └── demo1.vue │ │ └── index.vue │ ├── image-dataurl.js │ ├── image-processor.d.ts │ ├── image-processor.js │ ├── image-reader.js │ ├── index.vue │ └── test │ │ ├── file.mock.js │ │ └── index.spec.js ├── image-viewer │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ └── demo0.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ └── demo0.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── index.js ├── input-item │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── cursor.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ ├── demo4.vue │ │ │ └── demo5.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ ├── demo3.vue │ │ ├── demo4.vue │ │ └── demo5.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── landscape │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ └── demo0.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ └── demo0.vue │ │ └── demo.spec.js ├── license-plate-input │ └── index.vue ├── license-plate-keyboard │ ├── index.vue │ ├── mixed-key-board.vue │ └── short-cut-row.vue ├── license-plate │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ └── demo1.vue │ │ └── index.vue │ ├── index.vue │ ├── test │ │ ├── __snapshots__ │ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ │ └── demo0.vue │ │ └── demo.spec.js │ └── util.js ├── notice-bar │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ ├── demo4.vue │ │ │ ├── demo5.vue │ │ │ ├── demo6.vue │ │ │ ├── demo7.vue │ │ │ └── demo8.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ ├── demo3.vue │ │ ├── demo4.vue │ │ ├── demo5.vue │ │ ├── demo6.vue │ │ └── demo7.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── number-keyboard │ ├── README.en-US.md │ ├── README.md │ ├── board.vue │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ └── demo4.vue │ │ └── index.vue │ ├── index.vue │ ├── key.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ └── demo1.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── picker │ ├── README.en-US.md │ ├── README.md │ ├── cascade.js │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ └── demo2.vue │ │ ├── data │ │ │ ├── district.js │ │ │ └── simple.js │ │ └── index.vue │ ├── index.vue │ ├── mixins │ │ └── index.js │ ├── picker-column.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ └── demo2.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── popup-title-bar │ └── index.vue ├── popup │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ └── demo1.vue │ │ └── index.vue │ ├── index.vue │ ├── mixins │ │ ├── index.js │ │ └── title-bar.js │ ├── test │ │ ├── __snapshots__ │ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ └── demo1.vue │ │ ├── demo.spec.js │ │ ├── index.spec.js │ │ └── touch-trigger.js │ └── title-bar.vue ├── progress │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ └── demo1.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ └── demo1.vue │ │ └── demo.spec.js ├── radio-box │ └── index.vue ├── radio-group │ └── index.vue ├── radio-list │ └── index.vue ├── radio │ ├── README.en-US.md │ ├── README.md │ ├── box.vue │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ ├── demo4.vue │ │ │ └── demo5.vue │ │ └── index.vue │ ├── group.vue │ ├── index.vue │ ├── list.vue │ ├── mixins │ │ └── index.js │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ ├── demo3.vue │ │ ├── demo4.vue │ │ └── demo5.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── result-page │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ └── demo3.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ └── demo3.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── ruler │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ └── demo4.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ └── demo2.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── scroll-view-more │ └── index.vue ├── scroll-view-refresh │ └── index.vue ├── scroll-view │ ├── README.en-US.md │ ├── README.md │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ ├── demo4.vue │ │ │ ├── demo5.vue │ │ │ └── demo6.vue │ │ └── index.vue │ ├── index.vue │ ├── more.vue │ ├── refresh.vue │ └── test │ │ ├── index.spec.js │ │ └── scroll-view-content.vue ├── selector │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ └── demo4.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ ├── demo3.vue │ │ └── demo4.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── skeleton │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ └── demo2.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ ├── demo3.vue │ │ └── demo4.vue │ │ └── demo.spec.js ├── slider │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ ├── demo4.vue │ │ │ └── demo5.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ ├── demo3.vue │ │ ├── demo4.vue │ │ └── demo5.vue │ │ └── demo.spec.js ├── stepper │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ ├── demo4.vue │ │ │ └── demo5.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ ├── demo3.vue │ │ ├── demo4.vue │ │ └── demo5.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── steps │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ ├── demo4.vue │ │ │ ├── demo5.vue │ │ │ ├── demo6.vue │ │ │ ├── demo7.vue │ │ │ └── demo8.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ ├── demo3.vue │ │ ├── demo4.vue │ │ ├── demo5.vue │ │ ├── demo6.vue │ │ ├── demo7.vue │ │ └── demo8.vue │ │ └── demo.spec.js ├── swiper-item │ └── index.vue ├── swiper │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ └── demo3.vue │ │ ├── data │ │ │ ├── mulit-item.js │ │ │ └── simple.js │ │ └── index.vue │ ├── index.vue │ ├── swiper-item.vue │ └── test │ │ └── index.spec.js ├── switch │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ └── demo3.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ └── demo3.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── tab-bar │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ ├── demo4.vue │ │ │ ├── demo5.vue │ │ │ └── demo6.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ ├── demo3.vue │ │ └── demo4.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── tab-pane │ └── index.vue ├── tab-picker │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ └── demo0.vue │ │ ├── data.json │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ └── demo0.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── tabs │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ └── demo0.vue │ │ └── index.vue │ ├── index.vue │ ├── tab-pane.vue │ └── test │ │ ├── __snapshots__ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ └── demo0.vue │ │ ├── demo.spec.js │ │ └── index.spec.js ├── tag │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ └── demo4.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── index.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ ├── demo2.vue │ │ ├── demo3.vue │ │ └── demo4.vue │ │ └── index.spec.js ├── textarea-item │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ └── demo2.vue │ │ └── index.vue │ ├── index.vue │ └── test │ │ ├── __snapshots__ │ │ └── deme.spec.js.snap │ │ ├── cases │ │ ├── demo0.vue │ │ ├── demo1.vue │ │ └── demo2.vue │ │ ├── deme.spec.js │ │ └── index.spec.js ├── tip │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ └── demo4.vue │ │ └── index.vue │ ├── index.js │ ├── test │ │ ├── index.spec.js │ │ └── tip-wrapper.vue │ └── tip.vue ├── toast │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ ├── demo4.vue │ │ │ ├── demo5.vue │ │ │ ├── demo6.vue │ │ │ ├── demo7.vue │ │ │ ├── demo8.vue │ │ │ └── demo9.vue │ │ └── index.vue │ ├── index.js │ ├── test │ │ ├── __snapshots__ │ │ │ └── demo.spec.js.snap │ │ ├── cases │ │ │ ├── demo0.vue │ │ │ ├── demo1.vue │ │ │ ├── demo2.vue │ │ │ ├── demo3.vue │ │ │ ├── demo4.vue │ │ │ └── demo5.vue │ │ ├── demo.spec.js │ │ └── index.spec.js │ └── toast.vue ├── transition │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ │ ├── cases │ │ │ └── demo0.vue │ │ └── index.vue │ └── index.vue └── water-mark │ ├── README.en-US.md │ ├── README.md │ ├── component.js │ ├── demo │ ├── cases │ │ ├── demo0.vue │ │ └── demo1.vue │ └── index.vue │ ├── index.vue │ └── test │ ├── __snapshots__ │ └── demo.spec.js.snap │ ├── cases │ ├── demo0.vue │ └── demo1.vue │ └── demo.spec.js ├── config ├── dev.env.js ├── index.js ├── prod.env.js └── test.env.js ├── docs ├── examples │ ├── index.html │ ├── mand-mobile-example.css │ └── mand-mobile-example.js ├── index.gitee.html ├── index.html └── static │ ├── img │ ├── backboard.ffb0d5b.png │ ├── list.405b4bc.png │ └── mr-king.abdaf07.png │ └── js │ ├── EnUSDesignMandDesignIntroduce.f70a8c79.js │ ├── EnUSDesignMandDesignViewpoint.04f44e0a.js │ ├── EnUSDesignOtherResource.160c70d7.js │ ├── EnUSDesignPrincipleAttitude.491147bd.js │ ├── EnUSDesignPrincipleClearControllable.1e5130e0.js │ ├── EnUSDesignPrincipleIntuition.451dc518.js │ ├── EnUSDesignPrincipleSecurity.e24af9fc.js │ ├── EnUSDesignVisionColor.c28cb75d.js │ ├── EnUSDesignVisionFont.c0b73247.js │ ├── EnUSDesignVisionIcon.47bb4688.js │ ├── EnUSDesignVisionLayer.e9ad7ece.js │ ├── EnUSDesignVisionLayout.1445019f.js │ ├── EnUSDocsChangelog.4715ea58.js │ ├── EnUSDocsChangelog.56a5aaa1.js │ ├── EnUSDocsComponentsBasicActionBar.5629af1a.js │ ├── EnUSDocsComponentsBasicActionBar.dcd729d4.js │ ├── EnUSDocsComponentsBasicActivityIndicator.74af40e3.js │ ├── EnUSDocsComponentsBasicActivityIndicator.9909ebd3.js │ ├── EnUSDocsComponentsBasicButton.a7b5b535.js │ ├── EnUSDocsComponentsBasicButton.c4cc67f4.js │ ├── EnUSDocsComponentsBasicCellItem.29fd6dd1.js │ ├── EnUSDocsComponentsBasicCellItem.c8c8bef7.js │ ├── EnUSDocsComponentsBasicDetailItem.de52e0d7.js │ ├── EnUSDocsComponentsBasicDropMenu.72e7f054.js │ ├── EnUSDocsComponentsBasicDropMenu.79db5bdf.js │ ├── EnUSDocsComponentsBasicIcon.8a6dae99.js │ ├── EnUSDocsComponentsBasicIcon.a3cef2ba.js │ ├── EnUSDocsComponentsBasicImageReader.01f03404.js │ ├── EnUSDocsComponentsBasicImageReader.eb003ede.js │ ├── EnUSDocsComponentsBasicImageViewer.122524df.js │ ├── EnUSDocsComponentsBasicNoticeBar.4c139e97.js │ ├── EnUSDocsComponentsBasicNoticeBar.a850c251.js │ ├── EnUSDocsComponentsBasicProgress.7c971f57.js │ ├── EnUSDocsComponentsBasicSkeleton.daa70054.js │ ├── EnUSDocsComponentsBasicSkeleton.ea5a8b89.js │ ├── EnUSDocsComponentsBasicStepper.342b877d.js │ ├── EnUSDocsComponentsBasicStepper.4f5fee52.js │ ├── EnUSDocsComponentsBasicSteps.2c0288a9.js │ ├── EnUSDocsComponentsBasicSteps.2cdcf23d.js │ ├── EnUSDocsComponentsBasicSwiper.6823a2cd.js │ ├── EnUSDocsComponentsBasicTabBar.14b4e18f.js │ ├── EnUSDocsComponentsBasicTabBar.44071577.js │ ├── EnUSDocsComponentsBasicTabs.8137824c.js │ ├── EnUSDocsComponentsBasicTag.4d912fe8.js │ ├── EnUSDocsComponentsBasicTag.a4cb7ebc.js │ ├── EnUSDocsComponentsBusinessAmount.a09c4257.js │ ├── EnUSDocsComponentsBusinessBill.340e288a.js │ ├── EnUSDocsComponentsBusinessBill.7358287a.js │ ├── EnUSDocsComponentsBusinessCaptcha.72d27638.js │ ├── EnUSDocsComponentsBusinessCaptcha.d5f0b5f4.js │ ├── EnUSDocsComponentsBusinessCashier.cd37a7ec.js │ ├── EnUSDocsComponentsBusinessCashier.ec5dbcc5.js │ ├── EnUSDocsComponentsBusinessChart.fe889242.js │ ├── EnUSDocsComponentsBusinessLandscape.56b884df.js │ ├── EnUSDocsComponentsBusinessLandscape.d57e1de4.js │ ├── EnUSDocsComponentsBusinessLicensePlate.c2eb1b3a.js │ ├── EnUSDocsComponentsBusinessResultPage.b8a7437e.js │ ├── EnUSDocsComponentsBusinessResultPage.c61b1b3c.js │ ├── EnUSDocsComponentsBusinessRuler.f47716a9.js │ ├── EnUSDocsComponentsBusinessWaterMark.d9b346c6.js │ ├── EnUSDocsComponentsFeedbackActionSheet.07072f6b.js │ ├── EnUSDocsComponentsFeedbackActionSheet.9e8a4c05.js │ ├── EnUSDocsComponentsFeedbackDatePicker.79fc91cf.js │ ├── EnUSDocsComponentsFeedbackDatePicker.da312461.js │ ├── EnUSDocsComponentsFeedbackDialog.c8718086.js │ ├── EnUSDocsComponentsFeedbackDialog.ed88dd3b.js │ ├── EnUSDocsComponentsFeedbackPicker.8eeaeeb0.js │ ├── EnUSDocsComponentsFeedbackPicker.be17716c.js │ ├── EnUSDocsComponentsFeedbackPopup.883d9ccc.js │ ├── EnUSDocsComponentsFeedbackPopup.c5a70293.js │ ├── EnUSDocsComponentsFeedbackSelector.82fc6bc5.js │ ├── EnUSDocsComponentsFeedbackSelector.a9611d86.js │ ├── EnUSDocsComponentsFeedbackTabPicker.8d97a833.js │ ├── EnUSDocsComponentsFeedbackTabPicker.a27550e5.js │ ├── EnUSDocsComponentsFeedbackTip.60642fc0.js │ ├── EnUSDocsComponentsFeedbackTip.85fab37f.js │ ├── EnUSDocsComponentsFeedbackToast.18954716.js │ ├── EnUSDocsComponentsFeedbackToast.d9b072db.js │ ├── EnUSDocsComponentsFeedbackTransition.5f8e52e6.js │ ├── EnUSDocsComponentsFeedbackTransition.ff7ae5a9.js │ ├── EnUSDocsComponentsFormAgree.49b62701.js │ ├── EnUSDocsComponentsFormAgree.e4bc90d1.js │ ├── EnUSDocsComponentsFormCheck.8dea2e58.js │ ├── EnUSDocsComponentsFormCheck.c1b1a57f.js │ ├── EnUSDocsComponentsFormCodebox.69843375.js │ ├── EnUSDocsComponentsFormField.105ee0ad.js │ ├── EnUSDocsComponentsFormField.312402f5.js │ ├── EnUSDocsComponentsFormInputItem.2d4fc5de.js │ ├── EnUSDocsComponentsFormInputItem.c25a3f34.js │ ├── EnUSDocsComponentsFormNumberKeyboard.ca0eaa1b.js │ ├── EnUSDocsComponentsFormNumberKeyboard.ed9aa584.js │ ├── EnUSDocsComponentsFormRadio.23685081.js │ ├── EnUSDocsComponentsFormRadio.d7692c26.js │ ├── EnUSDocsComponentsFormSlider.35de6cf4.js │ ├── EnUSDocsComponentsFormSwitch.67097ed6.js │ ├── EnUSDocsComponentsFormTextareaItem.30828274.js │ ├── EnUSDocsComponentsFormTextareaItem.98e8d47c.js │ ├── EnUSDocsComponentsGestureScrollView.4e3785cd.js │ ├── EnUSDocsComponentsGestureScrollView.a72bc966.js │ ├── EnUSDocsDevelopment.e441faf6.js │ ├── EnUSDocsIntroduce.e0143075.js │ ├── EnUSDocsMigration.1f6b6e4b.js │ ├── EnUSDocsStarted.ffb0b708.js │ ├── EnUSDocsTheme.cf21f770.js │ ├── ZhCNDesignMandDesignIntroduce.dbc78aff.js │ ├── ZhCNDesignMandDesignViewpoint.754dfeeb.js │ ├── ZhCNDesignOtherResource.be8fa784.js │ ├── ZhCNDesignPrincipleAttitude.99231c0e.js │ ├── ZhCNDesignPrincipleClearControllable.321ab37c.js │ ├── ZhCNDesignPrincipleIntuition.e1d0c04e.js │ ├── ZhCNDesignPrincipleSecurity.35933762.js │ ├── ZhCNDesignVisionColor.f34f77c5.js │ ├── ZhCNDesignVisionFont.68542ab0.js │ ├── ZhCNDesignVisionIcon.60ec5168.js │ ├── ZhCNDesignVisionLayer.e37ac570.js │ ├── ZhCNDesignVisionLayout.bc4d9ba0.js │ ├── ZhCNDocsChangelog.035160ab.js │ ├── ZhCNDocsChangelog.1248e454.js │ ├── ZhCNDocsComponentsBasicActionBar.2be3d6fd.js │ ├── ZhCNDocsComponentsBasicActionBar.ca56c475.js │ ├── ZhCNDocsComponentsBasicActivityIndicator.27385a0d.js │ ├── ZhCNDocsComponentsBasicActivityIndicator.6fd1a08f.js │ ├── ZhCNDocsComponentsBasicButton.480c9e73.js │ ├── ZhCNDocsComponentsBasicButton.4fb4fc15.js │ ├── ZhCNDocsComponentsBasicCellItem.063f7120.js │ ├── ZhCNDocsComponentsBasicCellItem.7b1dd792.js │ ├── ZhCNDocsComponentsBasicDetailItem.7255d1a9.js │ ├── ZhCNDocsComponentsBasicDropMenu.03a4d3d3.js │ ├── ZhCNDocsComponentsBasicDropMenu.9796410e.js │ ├── ZhCNDocsComponentsBasicIcon.d94a0f1b.js │ ├── ZhCNDocsComponentsBasicIcon.ef8069da.js │ ├── ZhCNDocsComponentsBasicImageReader.0a1bcdd8.js │ ├── ZhCNDocsComponentsBasicImageReader.4258b20a.js │ ├── ZhCNDocsComponentsBasicImageViewer.9d28cf80.js │ ├── ZhCNDocsComponentsBasicNoticeBar.08814eaa.js │ ├── ZhCNDocsComponentsBasicNoticeBar.7b0c8a41.js │ ├── ZhCNDocsComponentsBasicProgress.6e75e530.js │ ├── ZhCNDocsComponentsBasicSkeleton.2820018a.js │ ├── ZhCNDocsComponentsBasicSkeleton.efedb87d.js │ ├── ZhCNDocsComponentsBasicStepper.77fccab9.js │ ├── ZhCNDocsComponentsBasicStepper.97e674af.js │ ├── ZhCNDocsComponentsBasicSteps.2eea83a7.js │ ├── ZhCNDocsComponentsBasicSteps.6db492b9.js │ ├── ZhCNDocsComponentsBasicSwiper.a106cb0a.js │ ├── ZhCNDocsComponentsBasicTabBar.b315a42e.js │ ├── ZhCNDocsComponentsBasicTabBar.d777ae1d.js │ ├── ZhCNDocsComponentsBasicTabs.e7ff2d1f.js │ ├── ZhCNDocsComponentsBasicTag.9172ea0c.js │ ├── ZhCNDocsComponentsBasicTag.9c697c71.js │ ├── ZhCNDocsComponentsBusinessAmount.3fb5d5a4.js │ ├── ZhCNDocsComponentsBusinessBill.3f8b6238.js │ ├── ZhCNDocsComponentsBusinessBill.40f1f121.js │ ├── ZhCNDocsComponentsBusinessCaptcha.09b3e54f.js │ ├── ZhCNDocsComponentsBusinessCaptcha.7fa4369b.js │ ├── ZhCNDocsComponentsBusinessCashier.e7e711cf.js │ ├── ZhCNDocsComponentsBusinessCashier.e89e997e.js │ ├── ZhCNDocsComponentsBusinessChart.2ab4a476.js │ ├── ZhCNDocsComponentsBusinessLandscape.2bd04a3d.js │ ├── ZhCNDocsComponentsBusinessLandscape.6735de43.js │ ├── ZhCNDocsComponentsBusinessLicensePlate.b129dc61.js │ ├── ZhCNDocsComponentsBusinessResultPage.3c17d14a.js │ ├── ZhCNDocsComponentsBusinessResultPage.c902d266.js │ ├── ZhCNDocsComponentsBusinessRuler.15bea6a9.js │ ├── ZhCNDocsComponentsBusinessWaterMark.c5580e90.js │ ├── ZhCNDocsComponentsFeedbackActionSheet.27cafd37.js │ ├── ZhCNDocsComponentsFeedbackActionSheet.7cd23f2b.js │ ├── ZhCNDocsComponentsFeedbackDatePicker.73cd9c47.js │ ├── ZhCNDocsComponentsFeedbackDatePicker.a6fc3066.js │ ├── ZhCNDocsComponentsFeedbackDialog.1bfc4aa3.js │ ├── ZhCNDocsComponentsFeedbackDialog.c538dcc2.js │ ├── ZhCNDocsComponentsFeedbackPicker.b217fc30.js │ ├── ZhCNDocsComponentsFeedbackPicker.fe82722d.js │ ├── ZhCNDocsComponentsFeedbackPopup.1b39ee9e.js │ ├── ZhCNDocsComponentsFeedbackPopup.71025094.js │ ├── ZhCNDocsComponentsFeedbackSelector.749b3ba3.js │ ├── ZhCNDocsComponentsFeedbackSelector.7eee41c9.js │ ├── ZhCNDocsComponentsFeedbackTabPicker.6f5a9aa1.js │ ├── ZhCNDocsComponentsFeedbackTabPicker.a903b43a.js │ ├── ZhCNDocsComponentsFeedbackTip.66ca9199.js │ ├── ZhCNDocsComponentsFeedbackTip.b417cb33.js │ ├── ZhCNDocsComponentsFeedbackToast.0bbce73e.js │ ├── ZhCNDocsComponentsFeedbackToast.737ebada.js │ ├── ZhCNDocsComponentsFeedbackTransition.1fa9f3aa.js │ ├── ZhCNDocsComponentsFeedbackTransition.3333498f.js │ ├── ZhCNDocsComponentsFormAgree.012cfdab.js │ ├── ZhCNDocsComponentsFormAgree.c4b3735e.js │ ├── ZhCNDocsComponentsFormCheck.0cf519a2.js │ ├── ZhCNDocsComponentsFormCheck.e8484cef.js │ ├── ZhCNDocsComponentsFormCodebox.d7202445.js │ ├── ZhCNDocsComponentsFormField.4b995046.js │ ├── ZhCNDocsComponentsFormField.a0f83533.js │ ├── ZhCNDocsComponentsFormInputItem.2210c321.js │ ├── ZhCNDocsComponentsFormInputItem.e176a017.js │ ├── ZhCNDocsComponentsFormNumberKeyboard.7b0afb82.js │ ├── ZhCNDocsComponentsFormNumberKeyboard.9a1cf4c8.js │ ├── ZhCNDocsComponentsFormRadio.39e462ee.js │ ├── ZhCNDocsComponentsFormRadio.bf42d4f6.js │ ├── ZhCNDocsComponentsFormSlider.c9ba2cad.js │ ├── ZhCNDocsComponentsFormSwitch.9c43e7bf.js │ ├── ZhCNDocsComponentsFormTextareaItem.8594642e.js │ ├── ZhCNDocsComponentsFormTextareaItem.874d71d5.js │ ├── ZhCNDocsComponentsGestureScrollView.1f76e34e.js │ ├── ZhCNDocsComponentsGestureScrollView.aecadc5c.js │ ├── ZhCNDocsDevelopment.8632a79c.js │ ├── ZhCNDocsIntroduce.c09b14c3.js │ ├── ZhCNDocsMigration.7fa521dc.js │ ├── ZhCNDocsStarted.2b90e77b.js │ ├── ZhCNDocsTheme.b502aca6.js │ ├── app.fe21ffc5.js │ ├── manifest.28792707.js │ └── vendor.7e4f1f52.js ├── examples ├── App.vue ├── assets │ ├── images │ │ ├── bank-zs.svg │ │ ├── cashier-icon-1.png │ │ ├── cashier-icon-2.png │ │ ├── cashier-icon-3.png │ │ ├── cashier-icon-4.png │ │ ├── cashier-icon-5.png │ │ └── tip-package.svg │ └── responsive.js ├── category.vue ├── components.json ├── create-demo-module.js ├── demo-index.js ├── home.vue ├── index.html ├── index.livereload.html ├── main.bundle.js ├── main.js ├── route.js ├── single-component-app.vue ├── single-component-main.js └── theme.custom.styl ├── gulpfile.js ├── jest.config.js ├── package-lock.json ├── package.json ├── postcss.config.js ├── site ├── .babelrc ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .postcssrc.js ├── build │ ├── bin │ │ ├── default.mfe.blog.config.js │ │ ├── gen-indices.js │ │ ├── markdown.js │ │ ├── mfe-blog-dev.js │ │ ├── mfe-blog-generate.js │ │ └── utils.js │ ├── build.js │ ├── check-versions.js │ ├── dev-client.js │ ├── dev-server.js │ ├── public-path-webpack-plugin.js │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ ├── webpack.dev.conf.js │ └── webpack.prod.conf.js ├── config │ ├── dev.env.js │ ├── index.js │ └── prod.env.js ├── docs │ ├── design │ │ ├── other │ │ │ ├── resource.en-US.md │ │ │ └── resource.md │ │ ├── preface │ │ │ ├── introduce.en-US.md │ │ │ ├── introduce.md │ │ │ ├── viewpoint.en-US.md │ │ │ └── viewpoint.md │ │ ├── principle │ │ │ ├── attitude.en-US.md │ │ │ ├── attitude.md │ │ │ ├── clear-controllable.en-US.md │ │ │ ├── clear-controllable.md │ │ │ ├── intuition.en-US.md │ │ │ ├── intuition.md │ │ │ ├── security.en-US.md │ │ │ └── security.md │ │ └── vision │ │ │ ├── color.en-US.md │ │ │ ├── color.md │ │ │ ├── font.en-US.md │ │ │ ├── font.md │ │ │ ├── icon.en-US.md │ │ │ ├── icon.md │ │ │ ├── layer.en-US.md │ │ │ ├── layer.md │ │ │ ├── layout.en-US.md │ │ │ └── layout.md │ ├── development.en-US.md │ ├── development.md │ ├── introduce.en-US.md │ ├── introduce.md │ ├── migration.en-US.md │ ├── migration.md │ ├── started.en-US.md │ ├── started.md │ ├── theme.en-US.md │ └── theme.md ├── index.html ├── mfe.blog.config.js ├── package.json └── theme │ └── default │ ├── App.vue │ ├── DocTemplate.vue │ ├── Error.vue │ ├── Home.vue │ ├── Preview.vue │ ├── assets │ ├── css │ │ ├── demo.styl │ │ ├── global.styl │ │ ├── hightlight.css │ │ ├── markdown.styl │ │ ├── mixin.styl │ │ ├── toc.styl │ │ └── tooltip.css │ ├── images │ │ ├── algolia.png │ │ ├── codesandbox.png │ │ ├── github.png │ │ └── home │ │ │ └── pictorial │ │ │ ├── 0.png │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ ├── 5.png │ │ │ ├── backboard.png │ │ │ ├── list.png │ │ │ └── mr-king.png │ └── js │ │ ├── home.config.js │ │ ├── responsive.js │ │ └── util.js │ ├── components │ ├── Demo.vue │ ├── Doc.vue │ ├── Footer.vue │ ├── GitContributors.vue │ ├── GitStar.vue │ ├── Header.vue │ ├── Menu.vue │ ├── Search.vue │ ├── Table.vue │ └── home │ │ ├── Animation0.vue │ │ ├── Animation1.vue │ │ ├── Animation2.vue │ │ ├── CharacteristicCard.vue │ │ └── HomePictorial.vue │ ├── main.js │ └── router │ └── index.js ├── static ├── .gitkeep ├── animate.css ├── jquery.lettering.js ├── jquery.textillate.js ├── pace.css └── pace.js ├── test └── jest.init.js └── types ├── action-sheet.d.ts ├── component.d.ts ├── dialog.d.ts ├── image-processor.d.ts ├── index.d.ts ├── mand-mobile.d.ts └── toast.d.ts /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["iOS >= 8", "Android >= 4"] 7 | } 8 | }] 9 | ], 10 | "plugins": [ 11 | "transform-object-rest-spread", 12 | "syntax-dynamic-import", 13 | "transform-vue-jsx" 14 | ], 15 | "env": { 16 | "test": { 17 | "presets": [ 18 | ["env", { "targets": { "node": "current" }}] 19 | ], 20 | "plugins": [ 21 | ["import", { 22 | "libraryName": "mand-mobile", 23 | "libraryDirectory": "components" 24 | }] 25 | ] 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | build/*.js 2 | config/*.js 3 | lib/* 4 | output/* 5 | examples/* 6 | site/* 7 | **/*.spec.* 8 | **/demo/data/** 9 | scroller.js 10 | animate.js 11 | gulpfile.js 12 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | parserOptions: {ecmaVersion: 8, sourceType: 'module', ecmaFeatures: {jsx: true, experimentalObjectRestSpread: true}}, 3 | env: {es6: true, node: true, browser: true}, 4 | plugins: ['html', 'json'], 5 | extends: ['eslint-config-aesir-mandatory'], 6 | } 7 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/----please-use-mand-mobie-issue-helper---.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: '⚠️ Please use Mand Mobile Issue Helper ⚠️' 3 | about: The issue which is not created via https://mand-mobile.github.io/mand-mobile-issue-helper/?project=mand-mobile will be closed immediately. 不是用Mand Mobile Issue Helper创建的issue会被立即关闭。 4 | labels: 5 | --- 6 | 7 | The issue which is not created via Mand Mobile Issue Helper will be closed immediately. 8 | 9 | --- 10 | 11 | 注意:不是用 Mand Mobile Issue Helper 创建的 issue 会被立即关闭。 -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## 提交PR前 2 | 3 | * 请认真阅读[开发指南](https://didi.github.io/mand-mobile/#/zh-CN/docs/development) 4 | * fork **dev分支** 5 | * 按照规范命名分支 6 | * 需通过测试 7 | * 提交PR至**dev分支** 8 | 9 | 10 | 11 | ## 创建PR 12 | 13 | * 标题规则:type(scope):description,参考[规范](https://didi.github.io/mand-mobile/#/zh-CN/docs/development?anchor=Commit%E8%A7%84%E8%8C%83) 14 | * 内容描述,参考"PR 内容区" 15 | 16 | ## 请把以上内容删除,并填写以下内容!!! 17 | 18 | 19 | 20 | ### 背景描述 21 | 22 | 23 | ### 主要改动 24 | 25 | 26 | ### 需要注意 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /.github/issue_template.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.github/workflows/preview.yml: -------------------------------------------------------------------------------- 1 | name: 🔂 Surge PR Preview 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | preview: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v2 10 | - uses: afc163/surge-preview@v1 11 | with: 12 | surge_token: ${{ secrets.SURGE_TOKEN }} 13 | github_token: ${{ secrets.GITHUB_TOKEN }} 14 | build: | 15 | npm install 16 | npm run build:site 17 | dist: site/public 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | lib/ 5 | output/ 6 | # package-lock.json 7 | yarn.lock 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | test/coverage 12 | test/unit/coverage 13 | test/e2e/reports 14 | selenium-debug.log 15 | site/public 16 | site/dist 17 | site/build/bin/algolia-key.js 18 | lib-vw 19 | coverage/ 20 | # Editor directories and files 21 | .idea 22 | .vscode 23 | *.suo 24 | *.ntvs* 25 | *.njsproj 26 | *.sln 27 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | registry=https://registry.npmjs.org/ -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: node_js 3 | node_js: 4 | - "8" 5 | 6 | cache: 7 | directories: 8 | - node_modules 9 | 10 | branches: 11 | only: 12 | - master 13 | - dev 14 | 15 | script: 16 | - npm test 17 | - npm run codecov 18 | -------------------------------------------------------------------------------- /CHECKLIST.md: -------------------------------------------------------------------------------- 1 | # 发版步骤 2 | 3 | - 日志 4 | - [ ] 更新`package.json`版本号 5 | - [ ] 更新CHANGELOG 6 | - 检测 7 | - [ ] `npm run test` 8 | - [ ] `npm run build` 9 | - [ ] `npm run dev:bundle` 10 | - 构建 11 | - [ ] 切换至`master`分支并合并`dev`分支 12 | - [ ] 构建项目: `npm run build` 13 | - [ ] 推送至远程分支 14 | - [ ] 版本发布: `npm publish` 15 | - 站点 16 | - [ ] 构建示例: `npm run build:example` 17 | - [ ] 更新依赖: `cd site && npm install mand-mobile` 18 | - [ ] 构建站点: `npm run build:site` 19 | - [ ] 合并至`master`分支并推送 20 | - 收尾 21 | - [ ] 进入CI查看进度 22 | - [ ] 仓库发布RELEASE 23 | -------------------------------------------------------------------------------- /build/utils.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | 3 | exports.resultLog = function (type = 'success', msg = '') { 4 | const color = type === 'success' ? 'greenBright' : 'redBright' 5 | const bgColor = type === 'success' ? 'bgGreenBright' : 'bgRedBright' 6 | const output = msg.split('**').reduce((value, part, index) => { 7 | if (index % 2 === 1) { 8 | return value += chalk[color].bold.underline(part) 9 | } else { 10 | return value += chalk[color](part) 11 | } 12 | }, '') 13 | console.log( 14 | '\n' 15 | + chalk[bgColor].bold(` ${type.toUpperCase()} `) 16 | + ' ' 17 | + output 18 | + '\n' 19 | ) 20 | } -------------------------------------------------------------------------------- /build/webpack/build-mand-mobile.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | require('../check-versions')() 3 | 4 | process.env.NODE_ENV = 'production' 5 | 6 | const chalk = require('chalk') 7 | const webpack = require('webpack') 8 | const webpackConfig = require('./webpack.build.conf') 9 | 10 | webpack(webpackConfig, function (err, stats) { 11 | if (err) { 12 | throw err 13 | } 14 | process.stdout.write(stats.toString({ 15 | colors: true, 16 | modules: false, 17 | children: false, 18 | chunks: false, 19 | chunkModules: false 20 | }) + '\n\n') 21 | 22 | if (stats.hasErrors()) { 23 | console.log(chalk.red(' Build failed with errors.\n')) 24 | process.exit(1) 25 | } 26 | 27 | console.log(chalk.cyan(' Build complete.\n')) 28 | }) 29 | -------------------------------------------------------------------------------- /build/webpack/dev-client.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 'use strict' 3 | require('eventsource-polyfill') 4 | var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') 5 | 6 | hotClient.subscribe(function (event) { 7 | if (event.action === 'reload') { 8 | window.location.reload() 9 | } 10 | }) 11 | -------------------------------------------------------------------------------- /build/webpack/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const config = require('../../config') 4 | const isProduction = process.env.NODE_ENV === 'production' 5 | 6 | module.exports = { 7 | loaders: utils.cssLoaders({ 8 | sourceMap: isProduction 9 | ? config.build.productionSourceMap 10 | : config.dev.cssSourceMap, 11 | extract: isProduction 12 | }), 13 | transformToRequire: { 14 | video: 'src', 15 | source: 'src', 16 | img: 'src', 17 | image: 'xlink:href' 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /components/_locale/index.js: -------------------------------------------------------------------------------- 1 | import defaultLang from './lang/zh-CN' 2 | 3 | let lang = defaultLang 4 | 5 | function template(str, option) { 6 | if (!str || !option) { 7 | return str 8 | } 9 | 10 | return str.replace(/\{(\w+)\}/g, (match, key) => { 11 | return option[key] 12 | }) 13 | } 14 | 15 | export const t = (path, option) => { 16 | let value 17 | const array = path.split('.') 18 | let current = lang 19 | for (let i = 0, j = array.length; i < j; i++) { 20 | const property = array[i] 21 | value = current[property] 22 | if (i === j - 1) { 23 | return template(value, option) 24 | } 25 | if (!value) { 26 | return '' 27 | } 28 | current = value 29 | } 30 | return '' 31 | } 32 | 33 | export const setLocale = l => { 34 | lang = l || lang 35 | } 36 | 37 | export default {setLocale, t} 38 | -------------------------------------------------------------------------------- /components/_style/images/keyboard-del.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/components/_style/images/keyboard-del.png -------------------------------------------------------------------------------- /components/_style/images/keyboard-hide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/components/_style/images/keyboard-hide.png -------------------------------------------------------------------------------- /components/_style/images/license-keyboard-del.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/components/_style/images/license-keyboard-del.png -------------------------------------------------------------------------------- /components/_style/images/new-energy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/components/_style/images/new-energy.png -------------------------------------------------------------------------------- /components/_style/images/success-color.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /components/_style/images/warn-color.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /components/_util/debug.js: -------------------------------------------------------------------------------- 1 | import {isProd} from './env' 2 | 3 | export const warn = (msg, fn = 'error') => { 4 | !isProd && console[fn](`[Mand-Mobile]: ${msg}`) 5 | } 6 | -------------------------------------------------------------------------------- /components/_util/dom.js: -------------------------------------------------------------------------------- 1 | import {inBrowser} from './env' 2 | 3 | class Dom { 4 | appendChild() {} 5 | removeChild() {} 6 | querySelector() {} 7 | addEventListener() {} 8 | removeEventListener() {} 9 | } 10 | 11 | const dom = new Dom() 12 | let mdDocument = dom 13 | let mdBody = dom 14 | 15 | mdDocument.body = mdBody 16 | 17 | if (inBrowser) { 18 | mdDocument = window.document 19 | mdBody = document.body 20 | } 21 | 22 | export {mdDocument, mdBody, dom} 23 | -------------------------------------------------------------------------------- /components/_util/env.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | // Development environment 4 | export const isProd = process.env.NODE_ENV === 'production' 5 | 6 | // Browser environment sniffing 7 | export const inBrowser = !Vue.prototype.$isServer || typeof window !== 'undefined' 8 | export const UA = inBrowser && window.navigator.userAgent.toLowerCase() 9 | export const isAndroid = UA && UA.indexOf('android') > 0 10 | export const isIOS = UA && /iphone|ipad|ipod|ios/.test(UA) 11 | export const root = typeof window !== 'undefined' ? window : global 12 | -------------------------------------------------------------------------------- /components/_util/index.js: -------------------------------------------------------------------------------- 1 | export * from './debug' 2 | export * from './env' 3 | export * from './store' 4 | export * from './lang' 5 | export * from './dom' 6 | -------------------------------------------------------------------------------- /components/action-bar/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'action-bar', 3 | 'text': '操作栏', 4 | 'category': 'basic', 5 | 'description': '', 6 | 'author': 'xuxiaoyan' 7 | } 8 | -------------------------------------------------------------------------------- /components/action-bar/demo/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 34 | -------------------------------------------------------------------------------- /components/action-bar/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 31 | -------------------------------------------------------------------------------- /components/action-bar/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 35 | -------------------------------------------------------------------------------- /components/action-bar/test/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 35 | -------------------------------------------------------------------------------- /components/action-bar/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import Demo3 from './cases/demo3' 5 | import {renderToString} from '@vue/server-test-utils' 6 | 7 | describe('ActionBar Demo', () => { 8 | test(`Basic`, () => { 9 | expect(renderToString(Demo0)).toMatchSnapshot() 10 | }) 11 | test(`Multiple buttons`, () => { 12 | expect(renderToString(Demo1)).toMatchSnapshot() 13 | }) 14 | test(`Multiple buttons and disabled button`, () => { 15 | expect(renderToString(Demo2)).toMatchSnapshot() 16 | }) 17 | test(`With slot`, () => { 18 | expect(renderToString(Demo3)).toMatchSnapshot() 19 | }) 20 | }) 21 | -------------------------------------------------------------------------------- /components/action-sheet/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'action-sheet', 3 | 'text': '底部弹窗', 4 | 'category': 'feedback', 5 | 'description': '', 6 | 'author': 'qiman' 7 | } 8 | -------------------------------------------------------------------------------- /components/action-sheet/demo/index.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 20 | -------------------------------------------------------------------------------- /components/action-sheet/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 37 | -------------------------------------------------------------------------------- /components/action-sheet/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import {renderToString} from '@vue/server-test-utils' 4 | import {mount} from '@vue/test-utils' 5 | 6 | describe('ActionSheet', () => { 7 | test(`Basic`, () => { 8 | expect(renderToString(Demo0)).toMatchSnapshot() 9 | }) 10 | test(`Singleton pattern`, done => { 11 | const wrapper = mount(Demo1) 12 | wrapper.vm.$_showActionSheet() 13 | setTimeout(() => { 14 | expect(document.body.querySelector('.md-action-sheet').outerHTML).toMatchSnapshot() 15 | done() 16 | }, 300) 17 | }) 18 | }) 19 | -------------------------------------------------------------------------------- /components/activity-indicator/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'activity-indicator', 3 | 'text': '活动指示器', 4 | 'category': 'basic', 5 | 'description': '', 6 | 'author': 'xuxiaoyan' 7 | } 8 | -------------------------------------------------------------------------------- /components/activity-indicator/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import {renderToString} from '@vue/server-test-utils' 5 | 6 | describe('ActivityIndicator', () => { 7 | test(`Roller`, () => { 8 | expect(renderToString(Demo0)).toMatchSnapshot() 9 | }) 10 | test(`Spinner`, () => { 11 | expect(renderToString(Demo1)).toMatchSnapshot() 12 | }) 13 | test(`Carousel`, () => { 14 | expect(renderToString(Demo2)).toMatchSnapshot() 15 | }) 16 | }) 17 | -------------------------------------------------------------------------------- /components/agree/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Agree 勾选按钮 3 | preview: https://didi.github.io/mand-mobile/examples/#/agree 4 | --- 5 | 6 | 用于标记切换某种状态,如协议勾选 7 | 8 | ### 引入 9 | 10 | ```javascript 11 | import { Agree } from 'mand-mobile' 12 | 13 | Vue.component(Agree.name, Agree) 14 | ``` 15 | 16 | ### 代码演示 17 | 18 | 19 | ### API 20 | 21 | #### Agree Props 22 | |属性 | 说明 | 类型 | 默认值 | 备注 | 23 | |----|-----|------|------|------| 24 | |v-model|是否选中|Boolean|`false`|-| 25 | |disabled|是否禁用|Boolean|`false`|-| 26 | |size|按钮大小|String|`md`|可选值参考组件`Icon`| 27 | |icon-type 2.6.0+|选中图标|string|`circle`|可选值`circle` | `square`| 28 | 29 | #### Agree Events 30 | 31 | ##### @change(name, checked) 32 | 勾选状态发生变化事件 33 | 34 | |属性 | 说明 | 类型 | 35 | |----|-----|------| 36 | |name|单选按钮名称,唯一标识|Number/String| 37 | |checked|是否选中|Boolean| 38 | -------------------------------------------------------------------------------- /components/agree/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'agree', 3 | 'text': '单选框', 4 | 'category': 'form', 5 | 'description': '', 6 | 'author': 'chengyanjing' 7 | } 8 | -------------------------------------------------------------------------------- /components/agree/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 33 | -------------------------------------------------------------------------------- /components/agree/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | -------------------------------------------------------------------------------- /components/agree/test/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 33 | -------------------------------------------------------------------------------- /components/agree/test/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | -------------------------------------------------------------------------------- /components/agree/test/cases/demo4.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 34 | -------------------------------------------------------------------------------- /components/agree/test/cases/demo5.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 34 | -------------------------------------------------------------------------------- /components/amount/DINPro-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/components/amount/DINPro-Medium.ttf -------------------------------------------------------------------------------- /components/amount/demo/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 29 | 30 | -------------------------------------------------------------------------------- /components/amount/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 25 | 26 | -------------------------------------------------------------------------------- /components/amount/test/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 33 | 34 | -------------------------------------------------------------------------------- /components/amount/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import Demo3 from './cases/demo3' 5 | import {renderToString} from '@vue/server-test-utils' 6 | 7 | describe('Amount -Demo', () => { 8 | test(`Basic`, () => { 9 | expect(renderToString(Demo0)).toMatchSnapshot() 10 | }) 11 | test(`Thousands Separator`, () => { 12 | expect(renderToString(Demo1)).toMatchSnapshot() 13 | }) 14 | test(`Transition`, () => { 15 | expect(renderToString(Demo2)).toMatchSnapshot() 16 | }) 17 | test(`Disabled unselected`, () => { 18 | expect(renderToString(Demo3)).toMatchSnapshot() 19 | }) 20 | }) 21 | -------------------------------------------------------------------------------- /components/bill/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bill 票据 3 | preview: https://didi.github.io/mand-mobile/examples/#/bill 4 | --- 5 | 6 | 电子账单或票据 7 | 8 | ### 引入 9 | 10 | ```javascript 11 | import { Bill } from 'mand-mobile' 12 | 13 | Vue.component(Bill.name, Bill) 14 | ``` 15 | 16 | ### 代码演示 17 | 18 | 19 | ### API 20 | 21 | #### Bill Props 22 | |属性 | 说明 | 类型 | 默认值 | 备注 | 23 | |----|-----|------|------ |------| 24 | |name|票据抬头|String|-|-| 25 | |no|票据编号|String|-|-| 26 | |water-mark|水印内容|String|-|复杂内容使用`scoped slot`| 27 | 28 | #### Bill Slots 29 | 30 | ##### default 31 | 默认内容插槽 32 | 33 | ##### header 34 | 头部内容插槽 35 | 36 | ##### footer 37 | 底部内容插槽 38 | 39 | ##### watermask 40 | 水印内容scoped插槽 41 | 42 | ```html 43 |
44 | 45 |
46 | ``` -------------------------------------------------------------------------------- /components/bill/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'bill', 3 | 'text': '票据', 4 | 'category': 'business', 5 | 'description': '', 6 | 'author': 'xuxiaoyan' 7 | } 8 | -------------------------------------------------------------------------------- /components/bill/demo/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 21 | 22 | -------------------------------------------------------------------------------- /components/bill/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import {renderToString} from '@vue/server-test-utils' 4 | 5 | describe('Bill', () => { 6 | test(`Basic`, () => { 7 | expect(renderToString(Demo0)).toMatchSnapshot() 8 | }) 9 | test(`Using slots`, () => { 10 | expect(renderToString(Demo1)).toMatchSnapshot() 11 | }) 12 | }) 13 | -------------------------------------------------------------------------------- /components/button/demo/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 23 | 24 | -------------------------------------------------------------------------------- /components/button/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | 24 | -------------------------------------------------------------------------------- /components/button/test/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 23 | 24 | -------------------------------------------------------------------------------- /components/button/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import Demo3 from './cases/demo3' 5 | import Demo4 from './cases/demo4' 6 | import {renderToString} from '@vue/server-test-utils' 7 | 8 | describe('Button', () => { 9 | test(`Basic`, () => { 10 | expect(renderToString(Demo0)).toMatchSnapshot() 11 | }) 12 | test(`Plain`, () => { 13 | expect(renderToString(Demo1)).toMatchSnapshot() 14 | }) 15 | test(`Round`, () => { 16 | expect(renderToString(Demo2)).toMatchSnapshot() 17 | }) 18 | test(`Inline`, () => { 19 | expect(renderToString(Demo3)).toMatchSnapshot() 20 | }) 21 | test(`Text link`, () => { 22 | expect(renderToString(Demo4)).toMatchSnapshot() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /components/captcha/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'captcha', 3 | 'text': '验证码窗口', 4 | 'category': 'business', 5 | 'description': '交互式验证码校验弹窗', 6 | 'author': 'moyu ' 7 | } 8 | -------------------------------------------------------------------------------- /components/captcha/demo/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 27 | 28 | 35 | -------------------------------------------------------------------------------- /components/captcha/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 22 | 23 | 30 | -------------------------------------------------------------------------------- /components/captcha/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import {renderToString} from '@vue/server-test-utils' 5 | 6 | describe('Captcha - Demo', () => { 7 | test(`Customize`, () => { 8 | expect(renderToString(Demo0)).toMatchSnapshot() 9 | }) 10 | test(`Inline display`, () => { 11 | expect(renderToString(Demo1)).toMatchSnapshot() 12 | }) 13 | test(`HalfScreen`, () => { 14 | expect(renderToString(Demo2)).toMatchSnapshot() 15 | }) 16 | }) 17 | -------------------------------------------------------------------------------- /components/cashier/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'cashier', 3 | 'text': '收银台', 4 | 'category': 'business', 5 | 'description': '', 6 | 'author': 'xuxiaoyan' 7 | } 8 | -------------------------------------------------------------------------------- /components/cashier/demo/index.vue: -------------------------------------------------------------------------------- 1 | < 11 | 12 | 18 | 19 | 24 | -------------------------------------------------------------------------------- /components/cell-item/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'cell-item', 3 | 'text': '列表单元', 4 | 'category': 'basic', 5 | 'description': '列表用于展现并列层级的信息内容,列表可承载功能入口、功能操作、信息展示等功能', 6 | 'author': 'moyu ' 7 | } 8 | -------------------------------------------------------------------------------- /components/cell-item/demo/index.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 18 | -------------------------------------------------------------------------------- /components/cell-item/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 28 | -------------------------------------------------------------------------------- /components/cell-item/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import {renderToString} from '@vue/server-test-utils' 5 | 6 | describe('CellItem - Demo', () => { 7 | test(`Basic`, () => { 8 | expect(renderToString(Demo0)).toMatchSnapshot() 9 | }) 10 | test(`Simple List`, () => { 11 | expect(renderToString(Demo1)).toMatchSnapshot() 12 | }) 13 | test(`Content List`, () => { 14 | expect(renderToString(Demo2)).toMatchSnapshot() 15 | }) 16 | }) 17 | -------------------------------------------------------------------------------- /components/chart/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'chart', 3 | 'text': '折线图表', 4 | 'category': 'business', 5 | 'description': '基于 SVG 的折线图表组件', 6 | 'author': 'moyu ' 7 | } 8 | -------------------------------------------------------------------------------- /components/chart/demo/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 20 | 21 | 25 | -------------------------------------------------------------------------------- /components/chart/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import {renderToString} from '@vue/server-test-utils' 5 | 6 | describe('Chart - Demo', () => { 7 | test(`Multiple fold lines`, () => { 8 | expect(renderToString(Demo0)).toMatchSnapshot() 9 | }) 10 | test(`Gradient fold line`, () => { 11 | expect(renderToString(Demo1)).toMatchSnapshot() 12 | }) 13 | test(`Area fill`, () => { 14 | expect(renderToString(Demo2)).toMatchSnapshot() 15 | }) 16 | }) 17 | -------------------------------------------------------------------------------- /components/check-box/index.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /components/check-group/index.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /components/check-list/index.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /components/check/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'check', 3 | 'text': '复选项', 4 | 'category': 'form', 5 | 'description': '', 6 | 'author': 'moyu ' 7 | } 8 | -------------------------------------------------------------------------------- /components/check/demo/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 26 | -------------------------------------------------------------------------------- /components/check/demo/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 27 | -------------------------------------------------------------------------------- /components/check/mixin/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | props: { 3 | icon: { 4 | type: String, 5 | default: 'checked', 6 | }, 7 | iconInverse: { 8 | type: String, 9 | default: 'check', 10 | }, 11 | iconDisabled: { 12 | type: String, 13 | default: 'check-disabled', 14 | }, 15 | iconSvg: { 16 | type: Boolean, 17 | default: false, 18 | }, 19 | iconSize: { 20 | type: String, 21 | default: 'md', 22 | }, 23 | iconPosition: { 24 | type: String, 25 | default: 'right', 26 | }, 27 | }, 28 | } 29 | -------------------------------------------------------------------------------- /components/check/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 23 | -------------------------------------------------------------------------------- /components/check/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 29 | -------------------------------------------------------------------------------- /components/check/test/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 23 | -------------------------------------------------------------------------------- /components/check/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import Demo3 from './cases/demo3' 5 | import Demo4 from './cases/demo4' 6 | import {renderToString} from '@vue/server-test-utils' 7 | 8 | describe('Check - Demo', () => { 9 | test(`Check options`, () => { 10 | expect(renderToString(Demo0)).toMatchSnapshot() 11 | }) 12 | test(`Check options group`, () => { 13 | expect(renderToString(Demo1)).toMatchSnapshot() 14 | }) 15 | test(`Check box`, () => { 16 | expect(renderToString(Demo2)).toMatchSnapshot() 17 | }) 18 | test(`Check box group`, () => { 19 | expect(renderToString(Demo3)).toMatchSnapshot() 20 | }) 21 | test(`Check list`, () => { 22 | expect(renderToString(Demo4)).toMatchSnapshot() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /components/codebox/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'codebox', 3 | 'text': '验证码输入框', 4 | 'category': 'business', 5 | 'description': '验证码/密码输入框组件', 6 | 'author': 'moyu ' 7 | } 8 | -------------------------------------------------------------------------------- /components/codebox/demo/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 25 | -------------------------------------------------------------------------------- /components/codebox/demo/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 29 | -------------------------------------------------------------------------------- /components/codebox/demo/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 28 | -------------------------------------------------------------------------------- /components/codebox/demo/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 29 | -------------------------------------------------------------------------------- /components/codebox/demo/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 21 | -------------------------------------------------------------------------------- /components/codebox/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 25 | -------------------------------------------------------------------------------- /components/codebox/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 26 | -------------------------------------------------------------------------------- /components/codebox/test/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 24 | -------------------------------------------------------------------------------- /components/codebox/test/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 25 | -------------------------------------------------------------------------------- /components/codebox/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import Demo3 from './cases/demo3' 5 | import {renderToString} from '@vue/server-test-utils' 6 | 7 | describe('Codebox', () => { 8 | test(`Basic`, () => { 9 | expect(renderToString(Demo0)).toMatchSnapshot() 10 | }) 11 | test(`Character mask`, () => { 12 | expect(renderToString(Demo1)).toMatchSnapshot() 13 | }) 14 | test(`Unlimited length`, () => { 15 | expect(renderToString(Demo2)).toMatchSnapshot() 16 | }) 17 | test(`System keyboard`, () => { 18 | expect(renderToString(Demo3)).toMatchSnapshot() 19 | }) 20 | }) 21 | -------------------------------------------------------------------------------- /components/date-picker/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'date-picker', 3 | 'text': '日期选择器', 4 | 'category': 'feedback', 5 | 'description': '', 6 | 'author': 'xuxiaoyan' 7 | } 8 | -------------------------------------------------------------------------------- /components/date-picker/demo/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /components/date-picker/demo/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | -------------------------------------------------------------------------------- /components/date-picker/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 29 | -------------------------------------------------------------------------------- /components/date-picker/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /components/date-picker/test/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 27 | -------------------------------------------------------------------------------- /components/detail-item/README.en-US.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: DetailItem 3 | preview: https://didi.github.io/mand-mobile/examples/#/detail-item 4 | --- 5 | 6 | Detail list usually used as bill details, inventory details and so on. 7 | 8 | ### Import 9 | 10 | ```javascript 11 | import { DetailItem } from 'mand-mobile' 12 | 13 | Vue.component(DetailItem.name, DetailItem) 14 | ``` 15 | 16 | ### Code Examples 17 | 18 | 19 | ### API 20 | 21 | #### CellItem Props 22 | |Props | Description | Type | Default | Note| 23 | |----|-----|------|------|------| 24 | |title|title|String|-|-| 25 | |content|content text|String|-|-| 26 | |bold|whether emphasis content|Boolean|`false`|-| 27 | -------------------------------------------------------------------------------- /components/detail-item/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: DetailItem 清单项 3 | preview: https://didi.github.io/mand-mobile/examples/#/detail-item 4 | --- 5 | 6 | 清单列表用于展示一些列表信息,如账单。 7 | 8 | ### 引入 9 | 10 | ```javascript 11 | import { DetailItem } from 'mand-mobile' 12 | 13 | Vue.component(DetailItem.name, DetailItem) 14 | ``` 15 | 16 | ### 代码演示 17 | 18 | 19 | ### API 20 | 21 | #### CellItem Props 22 | |属性 | 说明 | 类型 | 默认值|备注| 23 | |----|-----|------|------|------| 24 | |title|标题|String|-|-| 25 | |content|描述内容|String|-|-| 26 | |bold|是否加粗显示|Boolean|`false`|-| 27 | -------------------------------------------------------------------------------- /components/detail-item/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'detail-item', 3 | 'text': '清单项目', 4 | 'category': 'basic', 5 | 'description': '清单列表用于展示一些列表信息,如账单。', 6 | 'author': 'moyu ' 7 | } 8 | -------------------------------------------------------------------------------- /components/detail-item/demo/index.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 16 | -------------------------------------------------------------------------------- /components/detail-item/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import {renderToString} from '@vue/server-test-utils' 3 | 4 | describe('DetailItem', () => { 5 | test(`Basic`, () => { 6 | expect(renderToString(Demo0)).toMatchSnapshot() 7 | }) 8 | }) 9 | -------------------------------------------------------------------------------- /components/dialog/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'dialog', 3 | 'text': '模态窗口', 4 | 'category': 'feedback', 5 | 'description': '弹出式交互窗口', 6 | 'author': 'moyu ' 7 | } 8 | -------------------------------------------------------------------------------- /components/dialog/demo/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 19 | 20 | 24 | -------------------------------------------------------------------------------- /components/dialog/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import {renderToString} from '@vue/server-test-utils' 3 | 4 | describe('Dialog - Demo', () => { 5 | test(`Basic`, () => { 6 | expect(renderToString(Demo0)).toMatchSnapshot() 7 | }) 8 | }) 9 | -------------------------------------------------------------------------------- /components/drop-menu/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'drop-menu', 3 | 'text': '下拉菜单', 4 | 'category': 'basic', 5 | 'description': '', 6 | 'author': 'xuxiaoyan' 7 | } 8 | -------------------------------------------------------------------------------- /components/drop-menu/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 36 | -------------------------------------------------------------------------------- /components/drop-menu/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import Demo3 from './cases/demo3' 5 | 6 | import {renderToString} from '@vue/server-test-utils' 7 | 8 | describe('DropMenu - Demo', () => { 9 | test(`Basic`, () => { 10 | expect(renderToString(Demo0)).toMatchSnapshot() 11 | }) 12 | test(`Initial selection`, () => { 13 | expect(renderToString(Demo1)).toMatchSnapshot() 14 | }) 15 | test(`Disabled item`, () => { 16 | expect(renderToString(Demo2)).toMatchSnapshot() 17 | }) 18 | test(`Custom menu options`, () => { 19 | expect(renderToString(Demo3)).toMatchSnapshot() 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /components/field-item/index.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /components/field/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'field', 3 | 'text': '组合列表', 4 | 'category': 'form', 5 | 'description': '单个连续模块垂直排列,显示当前的内容、状态和可进行的操作', 6 | 'author': 'moyu ' 7 | } 8 | -------------------------------------------------------------------------------- /components/field/demo/index.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 16 | -------------------------------------------------------------------------------- /components/field/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | 3 | import {renderToString} from '@vue/server-test-utils' 4 | 5 | describe('Field', () => { 6 | test(`Basic`, () => { 7 | expect(renderToString(Demo0)).toMatchSnapshot() 8 | }) 9 | }) 10 | -------------------------------------------------------------------------------- /components/field/test/index.spec.js: -------------------------------------------------------------------------------- 1 | import {FieldItem} from 'mand-mobile' 2 | import sinon from 'sinon' 3 | import {shallowMount} from '@vue/test-utils' 4 | 5 | describe('Field - Operation', () => { 6 | let wrapper 7 | 8 | afterEach(() => { 9 | wrapper && wrapper.destroy() 10 | }) 11 | 12 | it('field item click event', () => { 13 | let clicked = false 14 | wrapper = shallowMount(FieldItem, { 15 | listeners: { 16 | click() { 17 | clicked = true 18 | }, 19 | }, 20 | }) 21 | const eventSpy = sinon.spy(wrapper.vm, '$emit') 22 | 23 | wrapper.find('.md-field-item').trigger('click') 24 | expect(eventSpy.calledWith('click')).toBe(true) 25 | expect(clicked).toBe(true) 26 | }) 27 | }) 28 | -------------------------------------------------------------------------------- /components/icon/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/components/icon/iconfont.ttf -------------------------------------------------------------------------------- /components/icon/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/components/icon/iconfont.woff -------------------------------------------------------------------------------- /components/icon/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 27 | -------------------------------------------------------------------------------- /components/icon/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import Demo3 from './cases/demo3' 5 | import {renderToString} from '@vue/server-test-utils' 6 | 7 | describe('Icon - Demo', () => { 8 | test(`Font icon`, () => { 9 | expect(renderToString(Demo0)).toMatchSnapshot() 10 | }) 11 | test(`Svg icon`, () => { 12 | expect(renderToString(Demo1)).toMatchSnapshot() 13 | }) 14 | test(`Icon size`, () => { 15 | expect(renderToString(Demo2)).toMatchSnapshot() 16 | }) 17 | test(`Icon color`, () => { 18 | expect(renderToString(Demo3)).toMatchSnapshot() 19 | }) 20 | }) 21 | -------------------------------------------------------------------------------- /components/icon/test/index.spec.js: -------------------------------------------------------------------------------- 1 | import {Icon} from 'mand-mobile' 2 | import sinon from 'sinon' 3 | import {shallowMount} from '@vue/test-utils' 4 | 5 | describe('Icon - Operation', () => { 6 | let wrapper 7 | 8 | afterEach(() => { 9 | wrapper && wrapper.destroy() 10 | }) 11 | 12 | it('icon click event', () => { 13 | let clicked = false 14 | wrapper = shallowMount(Icon, { 15 | propsData: { 16 | name: 'success-color', 17 | }, 18 | listeners: { 19 | click() { 20 | clicked = true 21 | }, 22 | }, 23 | }) 24 | const eventSpy = sinon.spy(wrapper.vm, '$emit') 25 | 26 | wrapper.find('.md-icon').trigger('click') 27 | expect(eventSpy.calledWith('click')).toBe(true) 28 | expect(clicked).toBe(true) 29 | }) 30 | }) 31 | -------------------------------------------------------------------------------- /components/image-reader/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'image-reader', 3 | 'text': '图片选择器', 4 | 'category': 'basic', 5 | 'description': '', 6 | 'author': 'xuxiaoyan' 7 | } 8 | -------------------------------------------------------------------------------- /components/image-reader/demo/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /components/image-reader/image-processor.d.ts: -------------------------------------------------------------------------------- 1 | export interface ImageProcessorOptions { 2 | dataUrl: string 3 | width?: number 4 | height?: number 5 | quality: number 6 | } 7 | 8 | export interface ImageProcessorData { 9 | dataUrl: string 10 | blob: Blob 11 | } 12 | 13 | export default function ImageProcessor( 14 | options: ImageProcessorOptions, 15 | callback?: (data: ImageProcessorData) => any): Promise 16 | -------------------------------------------------------------------------------- /components/image-viewer/README.en-US.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: ImageViewer 3 | preview: https://didi.github.io/mand-mobile/examples/#/image-viewer 4 | --- 5 | 6 | For browsing multiple pictures and swiping to switch pictures 7 | 8 | ### Import 9 | 10 | ```javascript 11 | import { ImageViewer } from 'mand-mobile' 12 | 13 | Vue.component(ImageViewer.name, ImageViewer) 14 | ``` 15 | 16 | 17 | ### Code Examples 18 | 19 | 20 | ### API 21 | 22 | #### ImageViewer Props 23 | |Props | Description | Type | Default | Note | 24 | |----|-----|------|------|------| 25 | | v-model | viewer display | Boolean | `false` | 26 | | list |show picture list | Array | `[]` | -| 27 | | initial-index | initialize the index of displayed image | Number | `0` | - | 28 | | has-dots | display the index of picture| Boolean | `true` | - | 29 | 30 | -------------------------------------------------------------------------------- /components/image-viewer/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: ImageViewer 图片查看器 3 | preview: https://didi.github.io/mand-mobile/examples/#/image-viewer 4 | --- 5 | 6 | 用于浏览多张图片,并可对图片进行滑动切换 7 | 8 | ### 引入 9 | 10 | ```javascript 11 | import { ImageViewer } from 'mand-mobile' 12 | 13 | Vue.component(ImageViewer.name, ImageViewer) 14 | ``` 15 | 16 | 17 | ### 代码演示 18 | 19 | 20 | ### API 21 | 22 | #### ImageViewer Props 23 | |属性 | 说明 | 类型 | 默认值 | 备注| 24 | |----|-----|------|------|------| 25 | | v-model | 是否显示查看器 | Boolean | `false` | 26 | | list |展示图片列表 | Array | `[]` | -| 27 | | initial-index | 初始索引值 | Number | `0` | - | 28 | | has-dots | 是否展示图片索引值 | Boolean | `true` | - | 29 | 30 | -------------------------------------------------------------------------------- /components/image-viewer/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'image-viewer', 3 | 'text': '图片查看器', 4 | 'category': 'basic', 5 | 'description': '图片查看器', 6 | 'author': 'linyufei' 7 | } 8 | -------------------------------------------------------------------------------- /components/image-viewer/demo/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /components/image-viewer/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import {renderToString} from '@vue/server-test-utils' 3 | 4 | describe('ImageViewer - Demo', () => { 5 | test(`Basic`, () => { 6 | expect(renderToString(Demo0)).toMatchSnapshot() 7 | }) 8 | }) 9 | -------------------------------------------------------------------------------- /components/input-item/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'input-item', 3 | 'text': '输入框', 4 | 'category': 'form', 5 | 'description': '', 6 | 'author': 'xuxiaoyan' 7 | } 8 | -------------------------------------------------------------------------------- /components/landscape/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'landscape', 3 | 'text': '压屏', 4 | 'category': 'business', 5 | 'description': '用于展示压屏广告或通知的组件。', 6 | 'author': 'zhaozhe' 7 | } 8 | -------------------------------------------------------------------------------- /components/landscape/demo/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 18 | -------------------------------------------------------------------------------- /components/landscape/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import {renderToString} from '@vue/server-test-utils' 3 | 4 | describe('Landscape - Demo', () => { 5 | test('Basic', () => { 6 | expect(renderToString(Demo0)).toMatchSnapshot() 7 | }) 8 | }) 9 | -------------------------------------------------------------------------------- /components/license-plate/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'license-plate', 3 | 'text': '车牌号键入', 4 | 'category': 'business', 5 | 'description': '车牌号输入键盘', 6 | 'author': 'weishuodan' 7 | } 8 | -------------------------------------------------------------------------------- /components/license-plate/demo/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 27 | -------------------------------------------------------------------------------- /components/license-plate/demo/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 19 | -------------------------------------------------------------------------------- /components/license-plate/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 20 | 21 | 23 | -------------------------------------------------------------------------------- /components/license-plate/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import {renderToString} from '@vue/server-test-utils' 3 | 4 | describe('Landscape - Demo', () => { 5 | test('Basic', () => { 6 | expect(renderToString(Demo0)).toMatchSnapshot() 7 | }) 8 | }) 9 | -------------------------------------------------------------------------------- /components/notice-bar/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'notice-bar', 3 | 'text': '通告栏', 4 | 'category': 'basic', 5 | 'description': '通告栏', 6 | 'author': 'linyufei' 7 | } 8 | -------------------------------------------------------------------------------- /components/notice-bar/demo/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /components/notice-bar/demo/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 26 | -------------------------------------------------------------------------------- /components/notice-bar/demo/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /components/notice-bar/demo/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 21 | -------------------------------------------------------------------------------- /components/notice-bar/demo/cases/demo5.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 27 | -------------------------------------------------------------------------------- /components/notice-bar/demo/cases/demo6.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 27 | -------------------------------------------------------------------------------- /components/notice-bar/demo/cases/demo7.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 25 | -------------------------------------------------------------------------------- /components/notice-bar/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /components/notice-bar/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | -------------------------------------------------------------------------------- /components/notice-bar/test/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /components/notice-bar/test/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /components/notice-bar/test/cases/demo5.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 22 | -------------------------------------------------------------------------------- /components/notice-bar/test/cases/demo6.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 22 | -------------------------------------------------------------------------------- /components/notice-bar/test/cases/demo7.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 20 | -------------------------------------------------------------------------------- /components/number-keyboard/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'number-keyboard', 3 | 'text': '数字键盘', 4 | 'category': 'form', 5 | 'description': '', 6 | 'author': 'xuxiaoyan' 7 | } 8 | -------------------------------------------------------------------------------- /components/number-keyboard/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 20 | 21 | 31 | -------------------------------------------------------------------------------- /components/number-keyboard/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import {renderToString} from '@vue/server-test-utils' 4 | 5 | describe('NumberKeyboard - Demo', () => { 6 | test('With confirmation key and decimal point, generally used for price or amount input', () => { 7 | expect(renderToString(Demo0)).toMatchSnapshot() 8 | }) 9 | test('Simple type', () => { 10 | expect(renderToString(Demo1)).toMatchSnapshot() 11 | }) 12 | }) 13 | -------------------------------------------------------------------------------- /components/picker/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'picker', 3 | 'text': '选择器', 4 | 'category': 'feedback', 5 | 'description': '', 6 | 'author': 'xuxiaoyan' 7 | } 8 | -------------------------------------------------------------------------------- /components/picker/demo/data/simple.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | [ 3 | {text: '2015', value: 1}, 4 | {text: '2016', value: 2}, 5 | {text: '2017', value: 3}, 6 | {text: '2018', value: 4}, 7 | {text: '2019', value: 5}, 8 | {text: '2020', value: 6}, 9 | {text: '2021', value: 2}, 10 | {text: '2022', value: 3}, 11 | {text: '2023', value: 2}, 12 | {text: '2024', value: 3}, 13 | {text: '2025', value: 2}, 14 | {text: '2026', value: 3}, 15 | {text: '2027', value: 2}, 16 | {text: '2028', value: 3}, 17 | {text: '2029', value: 2}, 18 | {text: '2030', value: 3}, 19 | ], 20 | ] 21 | -------------------------------------------------------------------------------- /components/picker/mixins/index.js: -------------------------------------------------------------------------------- 1 | import {t} from '../../_locale' 2 | import popupMixin from '../../popup/mixins' 3 | import popupTitleBarMixin from '../../popup/mixins/title-bar' 4 | 5 | export default { 6 | mixins: [popupMixin, popupTitleBarMixin], 7 | props: { 8 | isView: { 9 | type: Boolean, 10 | default: false, 11 | }, 12 | okText: { 13 | default: t('md.picker.confirm'), 14 | }, 15 | cancelText: { 16 | default: t('md.picker.cancel'), 17 | }, 18 | lineHeight: { 19 | type: Number, 20 | }, 21 | keepIndex: { 22 | type: Boolean, 23 | default: false, 24 | }, 25 | }, 26 | } 27 | -------------------------------------------------------------------------------- /components/picker/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /components/picker/test/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 27 | -------------------------------------------------------------------------------- /components/popup-title-bar/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /components/popup/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'popup', 3 | 'text': '弹出层', 4 | 'category': 'feedback', 5 | 'description': '', 6 | 'author': 'xuxiaoyan' 7 | } 8 | -------------------------------------------------------------------------------- /components/popup/demo/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 19 | -------------------------------------------------------------------------------- /components/popup/mixins/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | props: { 3 | value: { 4 | type: Boolean, 5 | default: false, 6 | }, 7 | hasMask: { 8 | type: Boolean, 9 | default: true, 10 | }, 11 | maskClosable: { 12 | type: Boolean, 13 | default: true, 14 | }, 15 | }, 16 | } 17 | -------------------------------------------------------------------------------- /components/popup/mixins/title-bar.js: -------------------------------------------------------------------------------- 1 | export default { 2 | props: { 3 | title: { 4 | type: String, 5 | default: '', 6 | }, 7 | describe: { 8 | type: String, 9 | default: '', 10 | }, 11 | okText: { 12 | type: String, 13 | default: '', 14 | }, 15 | cancelText: { 16 | type: String, 17 | default: '', 18 | }, 19 | titleAlign: { 20 | type: String, 21 | default: 'center', 22 | }, 23 | largeRadius: { 24 | type: Boolean, 25 | default: false, 26 | }, 27 | onlyClose: { 28 | type: Boolean, 29 | default: false, 30 | }, 31 | }, 32 | } 33 | -------------------------------------------------------------------------------- /components/popup/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import {renderToString} from '@vue/server-test-utils' 4 | 5 | describe('Popup - Demo', () => { 6 | test('Different positions', () => { 7 | expect(renderToString(Demo0)).toMatchSnapshot() 8 | }) 9 | test('Other configurations', () => { 10 | expect(renderToString(Demo1)).toMatchSnapshot() 11 | }) 12 | }) 13 | -------------------------------------------------------------------------------- /components/popup/test/touch-trigger.js: -------------------------------------------------------------------------------- 1 | export default function(element, eventName, x, y, keyCodeOrValue) { 2 | const touch = { 3 | identifier: Date.now(), 4 | target: element, 5 | pageX: x, 6 | pageY: y, 7 | clientX: x, 8 | clientY: y, 9 | radiusX: 2.5, 10 | radiusY: 2.5, 11 | rotationAngle: 10, 12 | force: 0.5, 13 | } 14 | 15 | const event = document.createEvent('CustomEvent') 16 | event.initCustomEvent(eventName, true, true, {}) 17 | event.touches = [touch] 18 | event.targetTouches = [touch] 19 | event.changedTouches = [touch] 20 | event.keyCode = keyCodeOrValue 21 | event.clientX = x 22 | event.clientY = y 23 | event.pageX = x 24 | event.pageY = y 25 | 26 | element.value += keyCodeOrValue 27 | 28 | element.dispatchEvent(event) 29 | } 30 | -------------------------------------------------------------------------------- /components/progress/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'progress', 3 | 'text': '进度', 4 | 'category': 'basic', 5 | 'description': '', 6 | 'author': 'xuxiaoyan' 7 | } -------------------------------------------------------------------------------- /components/progress/demo/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 21 | 22 | 26 | -------------------------------------------------------------------------------- /components/progress/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import {renderToString} from '@vue/server-test-utils' 4 | import {mount} from '@vue/test-utils' 5 | 6 | describe('Progress', () => { 7 | test(`Basic`, () => { 8 | expect(renderToString(Demo0)).toMatchSnapshot() 9 | }) 10 | test(`Other configurations`, () => { 11 | const wrapper = mount(Demo1) 12 | expect(wrapper.html()).toMatchSnapshot() 13 | }) 14 | }) 15 | -------------------------------------------------------------------------------- /components/radio-box/index.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /components/radio-group/index.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /components/radio-list/index.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /components/radio/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'radio', 3 | 'text': '单选框', 4 | 'category': 'form', 5 | 'description': '', 6 | 'author': 'moyu ' 7 | } 8 | -------------------------------------------------------------------------------- /components/radio/demo/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 26 | -------------------------------------------------------------------------------- /components/radio/demo/cases/demo4.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 28 | -------------------------------------------------------------------------------- /components/radio/group.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 33 | 34 | -------------------------------------------------------------------------------- /components/radio/mixins/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | props: { 3 | icon: { 4 | type: String, 5 | default: 'checked', 6 | }, 7 | iconInverse: { 8 | type: String, 9 | default: 'check', 10 | }, 11 | iconDisabled: { 12 | type: String, 13 | default: 'check-disabled', 14 | }, 15 | iconSvg: { 16 | type: Boolean, 17 | default: false, 18 | }, 19 | iconSize: { 20 | type: String, 21 | default: 'md', 22 | }, 23 | iconPosition: { 24 | type: String, 25 | default: 'left', 26 | }, 27 | }, 28 | } 29 | -------------------------------------------------------------------------------- /components/radio/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 22 | -------------------------------------------------------------------------------- /components/radio/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 29 | -------------------------------------------------------------------------------- /components/radio/test/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | -------------------------------------------------------------------------------- /components/radio/test/cases/demo4.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 23 | -------------------------------------------------------------------------------- /components/radio/test/cases/demo5.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 27 | -------------------------------------------------------------------------------- /components/result-page/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'result-page', 3 | 'text': '结果页', 4 | 'category': 'business', 5 | 'description': '用于展示流程终点页面的组件。', 6 | 'author': 'zhaozhe' 7 | } 8 | -------------------------------------------------------------------------------- /components/result-page/demo/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 21 | 22 | -------------------------------------------------------------------------------- /components/result-page/demo/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 23 | 24 | -------------------------------------------------------------------------------- /components/result-page/demo/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /components/result-page/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 18 | 19 | -------------------------------------------------------------------------------- /components/result-page/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | 20 | -------------------------------------------------------------------------------- /components/result-page/test/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | 22 | -------------------------------------------------------------------------------- /components/result-page/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import Demo3 from './cases/demo3' 5 | import {renderToString} from '@vue/server-test-utils' 6 | 7 | describe('ResultPage', () => { 8 | test(`404`, () => { 9 | expect(renderToString(Demo0)).toMatchSnapshot() 10 | }) 11 | test(`Network anomaly`, () => { 12 | expect(renderToString(Demo1)).toMatchSnapshot() 13 | }) 14 | test(`With button`, () => { 15 | expect(renderToString(Demo2)).toMatchSnapshot() 16 | }) 17 | test(`Custom pattern`, () => { 18 | expect(renderToString(Demo3)).toMatchSnapshot() 19 | }) 20 | }) 21 | -------------------------------------------------------------------------------- /components/result-page/test/index.spec.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import {ResultPage} from 'mand-mobile' 3 | import {mount} from '@vue/test-utils' 4 | 5 | describe('ResultPage - Operation', () => { 6 | let wrapper 7 | 8 | afterEach(() => { 9 | wrapper && wrapper.destroy() 10 | }) 11 | 12 | it('props reactive', () => { 13 | let name = '' 14 | wrapper = mount(ResultPage, { 15 | propsData: { 16 | text: '123', 17 | }, 18 | }) 19 | expect(wrapper.find('.md-result-text').text()).toBe('123') 20 | wrapper.setProps({text: '456'}) 21 | expect(wrapper.find('.md-result-text').text()).toBe('456') 22 | }) 23 | }) 24 | -------------------------------------------------------------------------------- /components/ruler/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'ruler', 3 | 'text': '刻度尺', 4 | 'category': 'business', 5 | 'description': '刻度尺', 6 | 'author': 'supergaojian <402853745@qq.com>' 7 | } -------------------------------------------------------------------------------- /components/ruler/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 30 | 31 | 37 | -------------------------------------------------------------------------------- /components/ruler/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import {renderToString} from '@vue/server-test-utils' 5 | 6 | describe('Radio', () => { 7 | test(`Basic`, () => { 8 | expect(renderToString(Demo0)).toMatchSnapshot() 9 | }) 10 | test(`With Field`, () => { 11 | expect(renderToString(Demo1)).toMatchSnapshot() 12 | }) 13 | test(`List`, () => { 14 | expect(renderToString(Demo2)).toMatchSnapshot() 15 | }) 16 | }) 17 | -------------------------------------------------------------------------------- /components/scroll-view-more/index.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /components/scroll-view-refresh/index.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /components/scroll-view/test/scroll-view-content.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 13 | 14 | 18 | -------------------------------------------------------------------------------- /components/selector/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'selector', 3 | 'text': '列表选择器', 4 | 'category': 'feedback', 5 | 'description': '', 6 | 'author': 'xuxiaoyan' 7 | } 8 | -------------------------------------------------------------------------------- /components/selector/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import Demo3 from './cases/demo3' 5 | import Demo4 from './cases/demo4' 6 | import {renderToString} from '@vue/server-test-utils' 7 | 8 | describe('Selector - Demo', () => { 9 | test(`No need to confirm`, () => { 10 | expect(renderToString(Demo0)).toMatchSnapshot() 11 | }) 12 | test(`Custom options`, () => { 13 | expect(renderToString(Demo1)).toMatchSnapshot() 14 | }) 15 | test(`Confirmed mode`, () => { 16 | expect(renderToString(Demo2)).toMatchSnapshot() 17 | }) 18 | test(`Check mode`, () => { 19 | expect(renderToString(Demo3)).toMatchSnapshot() 20 | }) 21 | test(`Multi mode`, () => { 22 | expect(renderToString(Demo4)).toMatchSnapshot() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /components/skeleton/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Skeleton 骨架屏 3 | preview: https://didi.github.io/mand-mobile/examples/#/skeleton 4 | --- 5 | 6 | 骨架屏,一般用于数据尚未加载前先展示出页面的大致结构的加载状态 2.5.0+ 7 | 8 | ### 引入 9 | 10 | ```javascript 11 | import { Skeleton } from 'mand-mobile' 12 | 13 | Vue.component(Skeleton.name, Skeleton) 14 | ``` 15 | 16 | ### 代码演示 17 | 18 | 19 | ### API 20 | 21 | #### Skeleton Props 22 | |属性 | 说明 | 类型 | 默认值 | 备注| 23 | |----|-----|------|------|------| 24 | |loading|是否显示骨架屏|Boolean|true|-| 25 | |avatar|是否显示图标占位图|Boolean|false|-| 26 | |avatar-size|图标占位图大小|String|md| sm, md, lg | 27 | |title|是否显示标题占位图|Boolean|false|-| 28 | |title-width|标题占位宽度|Number,String| 40%|-| 29 | |row|内容占位图行数|Number|3|-| 30 | |row-width|内容占位图宽度|String,Number,Array\|100%|-| 31 | -------------------------------------------------------------------------------- /components/skeleton/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'skeleton', 3 | 'text': '骨架屏', 4 | 'category': 'basic', 5 | 'description': '', 6 | 'author': 'zouhang' 7 | } 8 | -------------------------------------------------------------------------------- /components/skeleton/demo/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 21 | 22 | 26 | -------------------------------------------------------------------------------- /components/skeleton/demo/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 25 | 26 | 30 | -------------------------------------------------------------------------------- /components/skeleton/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 21 | -------------------------------------------------------------------------------- /components/skeleton/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 22 | -------------------------------------------------------------------------------- /components/skeleton/test/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 23 | -------------------------------------------------------------------------------- /components/skeleton/test/cases/demo4.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 23 | -------------------------------------------------------------------------------- /components/skeleton/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import Demo3 from './cases/demo3' 5 | import Demo4 from './cases/demo4' 6 | import {renderToString} from '@vue/server-test-utils' 7 | 8 | describe('Skeleton - Demo', () => { 9 | test(`basic`, () => { 10 | expect(renderToString(Demo0)).toMatchSnapshot() 11 | }) 12 | test(`withAvatar`, () => { 13 | expect(renderToString(Demo1)).toMatchSnapshot() 14 | }) 15 | test(`switchSkeleton`, () => { 16 | expect(renderToString(Demo2)).toMatchSnapshot() 17 | }) 18 | test(`defaultSkeleton`, () => { 19 | expect(renderToString(Demo3)).toMatchSnapshot() 20 | }) 21 | test(`combineSkeleton`, () => { 22 | expect(renderToString(Demo4)).toMatchSnapshot() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /components/slider/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Slider 滑块 3 | preview: https://didi.github.io/mand-mobile/examples/#/slider 4 | --- 5 | 6 | ### 引入 7 | 8 | ```javascript 9 | import { Slider } from 'mand-mobile' 10 | 11 | Vue.component(Slider.name, Slider) 12 | ``` 13 | 14 | ### 代码演示 15 | 16 | 17 | ### API 18 | 19 | #### Slider Props 20 | |属性 | 说明 | 类型 | 默认值 | 备注| 21 | |----|-----|------|------|------| 22 | |v-model|双向绑定的值, 当开启range时, 其值为数组形式|number, number[]|`0`|-| 23 | |disabled|是否禁用滑块|Boolean|`false`|-| 24 | |min|可拖动的最小值|number|`0`|-| 25 | |max|可拖动的最大值|number|`100`|-| 26 | |step|步长|number|`1`|-| 27 | |range|是否启动双向拖动|Boolean|`false`|-| 28 | |format|显示文本的格式化函数|Function|`(val) => {return val}`|-| 29 | -------------------------------------------------------------------------------- /components/slider/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'slider', 3 | 'text': '滑块', 4 | 'category': 'form', 5 | 'description': '', 6 | 'author': 'moyu ' 7 | } 8 | -------------------------------------------------------------------------------- /components/slider/demo/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | -------------------------------------------------------------------------------- /components/slider/demo/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | -------------------------------------------------------------------------------- /components/slider/demo/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 30 | -------------------------------------------------------------------------------- /components/slider/demo/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | 26 | -------------------------------------------------------------------------------- /components/slider/demo/cases/demo4.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | -------------------------------------------------------------------------------- /components/slider/demo/cases/demo5.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | -------------------------------------------------------------------------------- /components/slider/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 21 | -------------------------------------------------------------------------------- /components/slider/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 21 | -------------------------------------------------------------------------------- /components/slider/test/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 26 | -------------------------------------------------------------------------------- /components/slider/test/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 21 | -------------------------------------------------------------------------------- /components/slider/test/cases/demo4.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 21 | -------------------------------------------------------------------------------- /components/slider/test/cases/demo5.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | -------------------------------------------------------------------------------- /components/stepper/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'stepper', 3 | 'text': '步进器', 4 | 'category': 'basic', 5 | 'description': '步进器', 6 | 'author': 'linyufei' 7 | } 8 | -------------------------------------------------------------------------------- /components/stepper/demo/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 26 | -------------------------------------------------------------------------------- /components/stepper/demo/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 26 | -------------------------------------------------------------------------------- /components/stepper/demo/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 31 | -------------------------------------------------------------------------------- /components/stepper/demo/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 31 | -------------------------------------------------------------------------------- /components/stepper/demo/cases/demo4.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 26 | -------------------------------------------------------------------------------- /components/stepper/demo/cases/demo5.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 26 | -------------------------------------------------------------------------------- /components/stepper/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 22 | -------------------------------------------------------------------------------- /components/stepper/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 22 | -------------------------------------------------------------------------------- /components/stepper/test/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 27 | -------------------------------------------------------------------------------- /components/stepper/test/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 27 | -------------------------------------------------------------------------------- /components/stepper/test/cases/demo4.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 22 | -------------------------------------------------------------------------------- /components/stepper/test/cases/demo5.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 22 | -------------------------------------------------------------------------------- /components/steps/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'steps', 3 | 'text': '步骤条', 4 | 'category': 'basic', 5 | 'description': '展示当前所在步骤位置的组件。', 6 | 'author': 'zhaozhe' 7 | } 8 | -------------------------------------------------------------------------------- /components/steps/demo/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /components/steps/demo/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /components/steps/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /components/steps/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /components/steps/test/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /components/steps/test/cases/demo6.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 39 | -------------------------------------------------------------------------------- /components/swiper-item/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /components/swiper/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'swiper', 3 | 'text': '轮播', 4 | 'category': 'basic', 5 | 'description': '轮播', 6 | 'author': 'huangbinxing' 7 | } 8 | -------------------------------------------------------------------------------- /components/swiper/demo/data/simple.js: -------------------------------------------------------------------------------- 1 | var colors = [ 2 | { 3 | color: '#4390EE', 4 | text: '给时光以生命,给岁月以文明。', 5 | }, 6 | { 7 | color: '#364d79', 8 | text: '你的无畏来源于无知。', 9 | }, 10 | { 11 | color: '#CA4040', 12 | text: '一切都将逝去,只有死神永生。', 13 | }, 14 | ] 15 | 16 | export default colors 17 | -------------------------------------------------------------------------------- /components/switch/README.en-US.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Switch 3 | preview: https://didi.github.io/mand-mobile/examples/#/switch 4 | --- 5 | 6 | Switch between two status 7 | 8 | ### Import 9 | 10 | ```javascript 11 | import { Switch } from 'mand-mobile' 12 | 13 | Vue.component(Switch.name, Switch) 14 | ``` 15 | 16 | ### Code Examples 17 | 18 | 19 | ### API 20 | 21 | #### Switch Props 22 | | Props | Description | Type | Default | 23 | |----|-----|------|------| 24 | |v-model| Whether it is on or off |Boolean|`false`| 25 | |disabled| Whether it is disabled or not |Boolean|`false`| 26 | 27 | #### Switch Instance Events 28 | 29 | ##### @change(isActive) 30 | 31 | | Props | Description | Type | 32 | |----|-----|------| 33 | |isActive| Whether it is on or off |Boolean| 34 | -------------------------------------------------------------------------------- /components/switch/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Switch 开关 3 | preview: https://didi.github.io/mand-mobile/examples/#/switch 4 | --- 5 | 6 | 开关按钮,用于表示开关状态/两种状态之间的切换 7 | 8 | ### 引入 9 | 10 | ```javascript 11 | import { Switch } from 'mand-mobile' 12 | 13 | Vue.component(Switch.name, Switch) 14 | ``` 15 | 16 | ### 代码演示 17 | 18 | 19 | ### API 20 | 21 | #### Switch Props 22 | |属性 | 说明 | 类型 | 默认值| 23 | |----|-----|------|------| 24 | |v-model|打开或者关闭|Boolean|`false`| 25 | |disabled|是否禁用|Boolean|`false`| 26 | 27 | #### Switch Events 28 | 29 | ##### @change(isActive) 30 | 事件说明 31 | 32 | |属性 | 说明 | 类型 | 33 | |----|-----|------| 34 | |isActive|开关状态,打开或者关闭|Boolean| 35 | -------------------------------------------------------------------------------- /components/switch/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'switch', 3 | 'text': '滑动开关', 4 | 'category': 'basic', 5 | 'description': '', 6 | 'author': 'chengyanjing' 7 | } 8 | -------------------------------------------------------------------------------- /components/switch/demo/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | -------------------------------------------------------------------------------- /components/switch/demo/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | -------------------------------------------------------------------------------- /components/switch/demo/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /components/switch/demo/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /components/switch/demo/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | -------------------------------------------------------------------------------- /components/switch/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /components/switch/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /components/switch/test/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | -------------------------------------------------------------------------------- /components/switch/test/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | -------------------------------------------------------------------------------- /components/switch/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import Demo3 from './cases/demo3' 5 | import {renderToString} from '@vue/server-test-utils' 6 | 7 | describe('Switch - Demo', () => { 8 | test(`Open`, () => { 9 | expect(renderToString(Demo0)).toMatchSnapshot() 10 | }) 11 | test(`Closed`, () => { 12 | expect(renderToString(Demo1)).toMatchSnapshot() 13 | }) 14 | test(`Open and disabled`, () => { 15 | expect(renderToString(Demo2)).toMatchSnapshot() 16 | }) 17 | test(`Closed and disabled`, () => { 18 | expect(renderToString(Demo3)).toMatchSnapshot() 19 | }) 20 | }) 21 | -------------------------------------------------------------------------------- /components/switch/test/index.spec.js: -------------------------------------------------------------------------------- 1 | import {Switch} from 'mand-mobile' 2 | import sinon from 'sinon' 3 | import {mount} from '@vue/test-utils' 4 | 5 | describe('Switch - Operation', () => { 6 | let wrapper 7 | 8 | afterEach(() => { 9 | wrapper && wrapper.destroy() 10 | }) 11 | 12 | test('click disabled switch', () => { 13 | wrapper = mount(Switch, { 14 | propsData: { 15 | disabled: true, 16 | }, 17 | }) 18 | 19 | const spy = sinon.spy(wrapper.vm, '$_onChange') 20 | wrapper.find('.md-switch').trigger('click') 21 | expect(spy.called).toBe(true) 22 | }) 23 | }) 24 | -------------------------------------------------------------------------------- /components/tab-bar/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'tab-bar', 3 | 'text': '标签菜单', 4 | 'category': 'basic', 5 | 'description': '标签导航菜单', 6 | 'author': 'moyu ' 7 | } 8 | -------------------------------------------------------------------------------- /components/tab-bar/demo/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 25 | -------------------------------------------------------------------------------- /components/tab-bar/demo/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 36 | -------------------------------------------------------------------------------- /components/tab-bar/demo/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 30 | -------------------------------------------------------------------------------- /components/tab-bar/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 25 | -------------------------------------------------------------------------------- /components/tab-bar/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 32 | -------------------------------------------------------------------------------- /components/tab-bar/test/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 26 | -------------------------------------------------------------------------------- /components/tab-bar/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import Demo3 from './cases/demo3' 5 | import Demo4 from './cases/demo4' 6 | import {renderToString} from '@vue/server-test-utils' 7 | 8 | describe('TabBar - Demo', () => { 9 | test(`Basic`, () => { 10 | expect(renderToString(Demo0)).toMatchSnapshot() 11 | }) 12 | test(`Max length`, () => { 13 | expect(renderToString(Demo1)).toMatchSnapshot() 14 | }) 15 | test(`Scroll`, () => { 16 | expect(renderToString(Demo2)).toMatchSnapshot() 17 | }) 18 | test(`No ink`, () => { 19 | expect(renderToString(Demo3)).toMatchSnapshot() 20 | }) 21 | test(`Custom Item`, () => { 22 | expect(renderToString(Demo4)).toMatchSnapshot() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /components/tab-pane/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /components/tab-picker/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'tab-picker', 3 | 'text': '底部多级联动选择器', 4 | 'category': 'feedback', 5 | 'description': '', 6 | 'author': 'moyu ' 7 | } 8 | -------------------------------------------------------------------------------- /components/tab-picker/demo/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 20 | -------------------------------------------------------------------------------- /components/tab-picker/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 28 | -------------------------------------------------------------------------------- /components/tab-picker/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import {renderToString} from '@vue/server-test-utils' 3 | 4 | describe('TabPicker - Demo', () => { 5 | test(`Basic`, () => { 6 | expect(renderToString(Demo0)).toMatchSnapshot() 7 | }) 8 | }) 9 | -------------------------------------------------------------------------------- /components/tabs/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'tabs', 3 | 'text': '标签页', 4 | 'category': 'basic', 5 | 'description': '用于在内部固定区域切换展示内容的组件', 6 | 'author': 'moyu ' 7 | } 8 | -------------------------------------------------------------------------------- /components/tabs/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import {renderToString} from '@vue/server-test-utils' 3 | 4 | describe('Tabs - Demo', () => { 5 | test(`Basic`, () => { 6 | expect(renderToString(Demo0)).toMatchSnapshot() 7 | }) 8 | }) 9 | -------------------------------------------------------------------------------- /components/tag/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'tag', 3 | 'text': '标签', 4 | 'category': 'basic', 5 | 'description': '小标签', 6 | 'author': 'guoyunlong ' 7 | } 8 | -------------------------------------------------------------------------------- /components/tag/demo/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 21 | -------------------------------------------------------------------------------- /components/tag/demo/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 21 | -------------------------------------------------------------------------------- /components/tag/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | -------------------------------------------------------------------------------- /components/tag/test/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 17 | -------------------------------------------------------------------------------- /components/tag/test/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 17 | -------------------------------------------------------------------------------- /components/tag/test/index.spec.js: -------------------------------------------------------------------------------- 1 | import {renderToString} from '@vue/server-test-utils' 2 | import Demo0 from './cases/demo0' 3 | import Demo1 from './cases/demo1' 4 | import Demo2 from './cases/demo2' 5 | import Demo3 from './cases/demo3' 6 | import Demo4 from './cases/demo4' 7 | 8 | describe('Tag - Demo', () => { 9 | test('Semicircle', () => { 10 | expect(renderToString(Demo0)).toMatchSnapshot() 11 | }) 12 | test('Fillet', () => { 13 | expect(renderToString(Demo1)).toMatchSnapshot() 14 | }) 15 | test('Square', () => { 16 | expect(renderToString(Demo2)).toMatchSnapshot() 17 | }) 18 | test('Characters cut in relief', () => { 19 | expect(renderToString(Demo3)).toMatchSnapshot() 20 | }) 21 | test('Special tags', () => { 22 | expect(renderToString(Demo4)).toMatchSnapshot() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /components/textarea-item/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'textarea-item', 3 | 'text': '文本输入框', 4 | 'category': 'form', 5 | 'description': '文本输入框。', 6 | 'author': '张鹏' 7 | } 8 | -------------------------------------------------------------------------------- /components/textarea-item/demo/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 20 | -------------------------------------------------------------------------------- /components/textarea-item/test/deme.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import Demo2 from './cases/demo2' 4 | import {renderToString} from '@vue/server-test-utils' 5 | 6 | describe('TextareaItem - Demo', () => { 7 | test('Basic', () => { 8 | expect(renderToString(Demo0)).toMatchSnapshot() 9 | }) 10 | test('Error Tip', () => { 11 | expect(renderToString(Demo1)).toMatchSnapshot() 12 | }) 13 | test('Slot', () => { 14 | expect(renderToString(Demo2)).toMatchSnapshot() 15 | }) 16 | }) 17 | -------------------------------------------------------------------------------- /components/tip/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tip 气泡提示 3 | preview: https://didi.github.io/mand-mobile/examples/#/tip 4 | --- 5 | 6 | ### 引入 7 | 8 | ```javascript 9 | import { Tip } from 'mand-mobile' 10 | 11 | Vue.component(Tip.name, Tip) 12 | ``` 13 | 14 | ### 代码演示 15 | 16 | 17 | ### API 18 | 19 | #### Tip Props 20 | |属性 | 说明 | 类型 | 默认值|备注| 21 | |----|-----|------|------|------| 22 | |name|提示名称|String/Number|-|一般用于特殊类名| 23 | |content|提示文本内容|String/Number|-|-| 24 | |placement|位置|String|`top`|`top`, `left`, `bottom`, `right`| 25 | |icon|图标|String|-|可选值请参考组件`Icon`| 26 | |icon-svg|使用svg图标|Boolean|`false`|-| 27 | |fill|充满子元素|Boolean|`false`|如按钮提示,与按钮等宽(top/bottom)或等高(left/right)| 28 | |offset|偏移量|Object:{left, top}|-|-| 29 | 30 | #### Tip Events 31 | 32 | ##### @show() 33 | 提示框显示后触发的事件 34 | 35 | ##### @hide() 36 | 提示框隐藏后触发的事件 37 | -------------------------------------------------------------------------------- /components/tip/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'tip', 3 | 'text': '轻提示', 4 | 'category': 'feedback', 5 | 'description': '弹出式轻提示', 6 | 'author': 'moyu ' 7 | } 8 | -------------------------------------------------------------------------------- /components/tip/demo/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 23 | -------------------------------------------------------------------------------- /components/tip/demo/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 23 | -------------------------------------------------------------------------------- /components/tip/demo/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /components/tip/demo/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 23 | -------------------------------------------------------------------------------- /components/tip/test/tip-wrapper.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /components/toast/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'toast', 3 | 'text': '提示', 4 | 'category': 'feedback', 5 | 'description': '弹出式提示', 6 | 'author': 'moyu ' 7 | } 8 | -------------------------------------------------------------------------------- /components/toast/demo/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | -------------------------------------------------------------------------------- /components/toast/demo/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | -------------------------------------------------------------------------------- /components/toast/demo/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | -------------------------------------------------------------------------------- /components/toast/demo/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 28 | -------------------------------------------------------------------------------- /components/toast/demo/cases/demo4.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 31 | -------------------------------------------------------------------------------- /components/toast/demo/cases/demo5.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | -------------------------------------------------------------------------------- /components/toast/demo/cases/demo6.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 28 | -------------------------------------------------------------------------------- /components/toast/test/cases/demo0.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 15 | -------------------------------------------------------------------------------- /components/toast/test/cases/demo1.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 15 | -------------------------------------------------------------------------------- /components/toast/test/cases/demo2.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 15 | -------------------------------------------------------------------------------- /components/toast/test/cases/demo3.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 15 | -------------------------------------------------------------------------------- /components/toast/test/cases/demo4.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 21 | -------------------------------------------------------------------------------- /components/toast/test/cases/demo5.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 18 | -------------------------------------------------------------------------------- /components/transition/README.en-US.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Transition 3 | preview: https://didi.github.io/mand-mobile/examples/#/transition 4 | --- 5 | 6 | 复用动画切换组件 7 | 8 | ### 引入 9 | 10 | ```javascript 11 | import { Transition } from 'mand-mobile' 12 | 13 | Vue.component(Transition.name, Transition) 14 | ``` 15 | 16 | ### 代码演示 17 | 18 | 19 | ### API 20 | `md-transition` is a wrapper of vue `transtion`, support all `transition` props. 21 | 22 | built-in transition name: 23 | 24 | - `md-fade` 25 | - `md-fade-up` 26 | - `md-fade-down` 27 | - `md-fade-left` 28 | - `md-fade-right` 29 | - `md-slide-up` 30 | - `md-slide-down` 31 | - `md-slide-left` 32 | - `md-slide-right` 33 | - `md-bounce` 34 | - `md-punch` 35 | - `md-zoom` 36 | 37 | -------------------------------------------------------------------------------- /components/transition/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Transition 动画 3 | preview: https://didi.github.io/mand-mobile/examples/#/transition 4 | --- 5 | 6 | 复用动画切换组件 7 | 8 | ### 引入 9 | 10 | ```javascript 11 | import { Transition } from 'mand-mobile' 12 | 13 | Vue.component(Transition.name, Transition) 14 | ``` 15 | 16 | ### 代码演示 17 | 18 | 19 | ### API 20 | `md-transition`组件为Vue内置`transtion`的一层封装,支持所有Transition的属性参数。 21 | 22 | 其中内置动画`name`参数如下: 23 | 24 | - `md-fade` 25 | - `md-fade-up` 26 | - `md-fade-down` 27 | - `md-fade-left` 28 | - `md-fade-right` 29 | - `md-slide-up` 30 | - `md-slide-down` 31 | - `md-slide-left` 32 | - `md-slide-right` 33 | - `md-bounce` 34 | - `md-punch` 35 | - `md-zoom` 36 | 37 | -------------------------------------------------------------------------------- /components/transition/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'transition', 3 | 'text': '动画', 4 | 'category': 'feedback', 5 | 'description': '复用动画切换组件', 6 | 'author': 'moyu ' 7 | } 8 | -------------------------------------------------------------------------------- /components/transition/demo/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 18 | -------------------------------------------------------------------------------- /components/water-mark/component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'name': 'water-mark', 3 | 'text': '水印', 4 | 'category': 'business', 5 | 'description': '', 6 | 'author': 'xuxiaoyan' 7 | } 8 | -------------------------------------------------------------------------------- /components/water-mark/demo/index.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 20 | 21 | -------------------------------------------------------------------------------- /components/water-mark/test/demo.spec.js: -------------------------------------------------------------------------------- 1 | import Demo0 from './cases/demo0' 2 | import Demo1 from './cases/demo1' 3 | import {renderToString} from '@vue/server-test-utils' 4 | 5 | describe('Tabs - Demo', () => { 6 | test(`Basic`, () => { 7 | expect(renderToString(Demo0)).toMatchSnapshot() 8 | }) 9 | test(`Using slots`, () => { 10 | expect(renderToString(Demo1)).toMatchSnapshot() 11 | }) 12 | }) 13 | -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"', 7 | MAND_ENV: '"development"', 8 | }) 9 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"', 4 | MAND_ENV: '"production"', 5 | } 6 | -------------------------------------------------------------------------------- /config/test.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const devEnv = require('./dev.env') 4 | 5 | module.exports = merge(devEnv, { 6 | NODE_ENV: '"testing"', 7 | MAND_ENV: '"testing"', 8 | }) 9 | -------------------------------------------------------------------------------- /docs/static/img/backboard.ffb0d5b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/docs/static/img/backboard.ffb0d5b.png -------------------------------------------------------------------------------- /docs/static/img/list.405b4bc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/docs/static/img/list.405b4bc.png -------------------------------------------------------------------------------- /docs/static/img/mr-king.abdaf07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/docs/static/img/mr-king.abdaf07.png -------------------------------------------------------------------------------- /examples/assets/images/cashier-icon-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/examples/assets/images/cashier-icon-1.png -------------------------------------------------------------------------------- /examples/assets/images/cashier-icon-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/examples/assets/images/cashier-icon-2.png -------------------------------------------------------------------------------- /examples/assets/images/cashier-icon-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/examples/assets/images/cashier-icon-3.png -------------------------------------------------------------------------------- /examples/assets/images/cashier-icon-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/examples/assets/images/cashier-icon-4.png -------------------------------------------------------------------------------- /examples/assets/images/cashier-icon-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/examples/assets/images/cashier-icon-5.png -------------------------------------------------------------------------------- /examples/assets/responsive.js: -------------------------------------------------------------------------------- 1 | (function (window, document) { 2 | function resize () { 3 | var ww = window.innerWidth 4 | if (ww > window.screen.width) { 5 | window.requestAnimationFrame(resize) 6 | } else { 7 | if (ww > 750) { 8 | ww = 750 9 | } 10 | document.documentElement.style.fontSize = ww * 100 / 750 + 'px' 11 | } 12 | } 13 | 14 | resize() 15 | 16 | window.addEventListener('resize', resize) 17 | })(window, document) -------------------------------------------------------------------------------- /examples/create-demo-module.js: -------------------------------------------------------------------------------- 1 | export default function(name = '', demos = []) { 2 | return { 3 | name: `${name}-demo`, 4 | data() { 5 | return { 6 | demos, 7 | } 8 | }, 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /examples/theme.custom.styl: -------------------------------------------------------------------------------- 1 | // color-primary = #1AAD19 -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | 2 | // https://github.com/michael-ciniawsky/postcss-load-config 3 | const browserslist = require('./package.json').browserslist 4 | module.exports = () => { 5 | const plugins = { 6 | 'postcss-url': {url: 'inline'}, 7 | 'cssnano': { 8 | preset: ['default', { 9 | zindex: false, 10 | mergeIdents: false, 11 | discardUnused: false, 12 | autoprefixer: false, 13 | reduceIdents: false, 14 | }] 15 | }, 16 | 'autoprefixer': { browsers: browserslist } 17 | } 18 | 19 | if (process.env.NODE_ENV !== 'production' || process.env.BUILD_TYPE === 'example') { 20 | plugins['postcss-pxtorem'] = { rootValue: 100, minPixelValue: 2, propWhiteList: [] } 21 | } 22 | 23 | return { 24 | plugins 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /site/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | // "presets": [ 3 | // ["env", { 4 | // "modules": false, 5 | // "targets": { 6 | // "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | // } 8 | // }], 9 | // "stage-2" 10 | // ], 11 | "presets": [ 12 | "env", 13 | "stage-2" 14 | ], 15 | "plugins": [ 16 | ["import", { "libraryName": "mand-mobile" }] 17 | ], 18 | "env": { 19 | "test": { 20 | "presets": ["env", "stage-2"], 21 | "plugins": ["istanbul"] 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /site/.eslintignore: -------------------------------------------------------------------------------- 1 | build/*.js 2 | config/*.js 3 | public/* 4 | -------------------------------------------------------------------------------- /site/.eslintrc.js: -------------------------------------------------------------------------------- 1 | // https://eslint.org/docs/user-guide/configuring 2 | 3 | module.exports = { 4 | root: true, 5 | parser: 'babel-eslint', 6 | parserOptions: { 7 | sourceType: 'module' 8 | }, 9 | env: { 10 | browser: true, 11 | }, 12 | // https://github.com/standard/standard/blob/master/docs/RULES-en.md 13 | extends: 'standard', 14 | // required to lint *.vue files 15 | plugins: [ 16 | 'html' 17 | ], 18 | // add your custom rules here 19 | 'rules': { 20 | // allow paren-less arrow functions 21 | 'arrow-parens': 0, 22 | // allow async-await 23 | 'generator-star-spacing': 0, 24 | // allow debugger during development 25 | 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /site/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | public/ 5 | npm-debug.log* 6 | yarn-debug.log* 7 | yarn-error.log* 8 | test/unit/coverage 9 | test/e2e/reports 10 | selenium-debug.log 11 | package-lock.json 12 | yarn.lock 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | -------------------------------------------------------------------------------- /site/.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // to edit target browsers: use "browserslist" field in package.json 6 | // "autoprefixer": {} 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /site/build/bin/default.mfe.blog.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | 3 | function resolve(dir) { 4 | return path.join(__dirname, '../..', dir) 5 | } 6 | 7 | module.exports = { 8 | title: '', 9 | subtitle: '', 10 | logo: '', 11 | favicon: '', 12 | theme: 'default', 13 | hasHome: true, 14 | source: [], 15 | markdownBoundary: { 16 | '': '
', 17 | }, 18 | output: resolve('public'), 19 | defaultTemplate: resolve('theme/default/DocTemplate.vue'), 20 | links: [], 21 | copyRight: '', 22 | produceBy: '', 23 | powerBy: '', 24 | routePrefix: '', 25 | staticPrefix: '', 26 | } 27 | -------------------------------------------------------------------------------- /site/build/dev-client.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | require('eventsource-polyfill') 3 | var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') 4 | 5 | hotClient.subscribe(function(event) { 6 | if (event.action === 'reload') { 7 | window.location.reload() 8 | } 9 | }) 10 | -------------------------------------------------------------------------------- /site/build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils') 2 | const config = require('../config') 3 | const isProduction = process.env.NODE_ENV === 'production' 4 | 5 | module.exports = { 6 | loaders: utils.cssLoaders({ 7 | sourceMap: isProduction ? config.build.productionSourceMap : config.dev.cssSourceMap, 8 | }), 9 | transformToRequire: { 10 | video: 'src', 11 | source: 'src', 12 | img: 'src', 13 | image: 'xlink:href', 14 | }, 15 | } 16 | -------------------------------------------------------------------------------- /site/config/dev.env.js: -------------------------------------------------------------------------------- 1 | const merge = require('webpack-merge') 2 | const prodEnv = require('./prod.env') 3 | 4 | module.exports = merge(prodEnv, { 5 | NODE_ENV: '"development"', 6 | }) 7 | -------------------------------------------------------------------------------- /site/config/prod.env.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | NODE_ENV: '"production"', 3 | } 4 | -------------------------------------------------------------------------------- /site/theme/default/DocTemplate.vue: -------------------------------------------------------------------------------- 1 | 11 | 31 | -------------------------------------------------------------------------------- /site/theme/default/assets/css/global.styl: -------------------------------------------------------------------------------- 1 | .doc-demo-title a 2 | margin 0 5px 3 | background #2f86f6 4 | color #fff 5 | padding 5px 10px 6 | border-radius 2px 7 | font-size 12px 8 | -webkit-font-smoothing antialiased 9 | text-decoration none 10 | transition all .3s 11 | &:hover 12 | opacity .8 13 | .doc-demo-box-priview ul>li 14 | list-style none !important 15 | 16 | .doc-content-qrcode 17 | img 18 | display inline-block 19 | width 100% 20 | margin-top 10px 21 | opacity .8 22 | -------------------------------------------------------------------------------- /site/theme/default/assets/css/mixin.styl: -------------------------------------------------------------------------------- 1 | block() 2 | float left 3 | width 100% 4 | 5 | clearfix() 6 | &:after 7 | content "" 8 | clear both 9 | display table -------------------------------------------------------------------------------- /site/theme/default/assets/images/algolia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/site/theme/default/assets/images/algolia.png -------------------------------------------------------------------------------- /site/theme/default/assets/images/codesandbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/site/theme/default/assets/images/codesandbox.png -------------------------------------------------------------------------------- /site/theme/default/assets/images/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/site/theme/default/assets/images/github.png -------------------------------------------------------------------------------- /site/theme/default/assets/images/home/pictorial/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/site/theme/default/assets/images/home/pictorial/0.png -------------------------------------------------------------------------------- /site/theme/default/assets/images/home/pictorial/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/site/theme/default/assets/images/home/pictorial/1.png -------------------------------------------------------------------------------- /site/theme/default/assets/images/home/pictorial/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/site/theme/default/assets/images/home/pictorial/2.png -------------------------------------------------------------------------------- /site/theme/default/assets/images/home/pictorial/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/site/theme/default/assets/images/home/pictorial/3.png -------------------------------------------------------------------------------- /site/theme/default/assets/images/home/pictorial/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/site/theme/default/assets/images/home/pictorial/4.png -------------------------------------------------------------------------------- /site/theme/default/assets/images/home/pictorial/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/site/theme/default/assets/images/home/pictorial/5.png -------------------------------------------------------------------------------- /site/theme/default/assets/images/home/pictorial/backboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/site/theme/default/assets/images/home/pictorial/backboard.png -------------------------------------------------------------------------------- /site/theme/default/assets/images/home/pictorial/list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/site/theme/default/assets/images/home/pictorial/list.png -------------------------------------------------------------------------------- /site/theme/default/assets/images/home/pictorial/mr-king.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/site/theme/default/assets/images/home/pictorial/mr-king.png -------------------------------------------------------------------------------- /site/theme/default/assets/js/responsive.js: -------------------------------------------------------------------------------- 1 | (function (window, document) { 2 | 3 | function resize(){ 4 | var ww = window.innerWidth; 5 | if (ww > window.screen.width) { 6 | window.requestAnimationFrame(resize); 7 | } 8 | else{ 9 | if (ww > 720) { 10 | ww = 720 11 | } 12 | document.documentElement.style.fontSize = ww * 0.13333333333333333 + 'px'; 13 | document.body.style.opacity = 1; 14 | } 15 | } 16 | 17 | if (document.readyState !== 'loading') { 18 | resize(); 19 | } 20 | else { 21 | document.addEventListener('DOMContentLoaded', resize); 22 | } 23 | 24 | window.addEventListener('resize', resize); 25 | 26 | })(window, document) 27 | -------------------------------------------------------------------------------- /site/theme/default/components/home/Animation2.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/didi/mand-mobile/967ae3ded30b10f7ba167bc8855d3ffffb902bbf/static/.gitkeep -------------------------------------------------------------------------------- /test/jest.init.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import pkg from '../package.json' 3 | 4 | Vue.config.silent = true 5 | 6 | global.MAN_VERSION = pkg.version -------------------------------------------------------------------------------- /types/component.d.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | export class MandComponent extends Vue { 4 | static name: string 5 | } -------------------------------------------------------------------------------- /types/image-processor.d.ts: -------------------------------------------------------------------------------- 1 | export interface ImageProcessorOptions { 2 | dataUrl: string 3 | width?: number 4 | height?: number 5 | quality: number 6 | } 7 | 8 | export interface ImageProcessorData { 9 | dataUrl: string 10 | blob: Blob 11 | } 12 | 13 | export default function ImageProcessor( 14 | options: ImageProcessorOptions, 15 | callback?: (data: ImageProcessorData) => any): Promise 16 | -------------------------------------------------------------------------------- /types/index.d.ts: -------------------------------------------------------------------------------- 1 | export * from './mand-mobile' 2 | 3 | import * as mandMobile from './mand-mobile' 4 | export default mandMobile --------------------------------------------------------------------------------