├── .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 |
2 |
3 |
4 |
5 |
6 |
7 |
34 |
--------------------------------------------------------------------------------
/components/action-bar/test/cases/demo0.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
31 |
--------------------------------------------------------------------------------
/components/action-bar/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
35 |
--------------------------------------------------------------------------------
/components/action-bar/test/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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 |
2 |
10 |
11 |
12 |
20 |
--------------------------------------------------------------------------------
/components/action-sheet/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
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 |
2 |
3 |
8 | 本人承诺投保人已充分了解本保险产品,并保证投保信息的真实性,理解并同意《投保须知》, 《保险条款》
9 |
10 |
11 |
12 |
13 |
33 |
--------------------------------------------------------------------------------
/components/agree/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 | 本人承诺投保人已充分了解本保险产品,并保证投保信息的真实性,理解并同意
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/components/agree/test/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 | 本人承诺投保人已充分了解本保险产品,并保证投保信息的真实性,理解并同意
9 |
10 |
11 |
12 |
13 |
33 |
--------------------------------------------------------------------------------
/components/agree/test/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 | 本人承诺投保人已充分了解本保险产品,并保证投保信息的真实性,理解并同意
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/components/agree/test/cases/demo4.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 | 本人承诺投保人已充分了解本保险产品,并保证投保信息的真实性,理解并同意《投保须知》, 《保险条款》
10 |
11 |
12 |
13 |
14 |
34 |
--------------------------------------------------------------------------------
/components/agree/test/cases/demo5.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 | 本人承诺投保人已充分了解本保险产品,并保证投保信息的真实性,理解并同意
10 |
11 |
12 |
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 |
2 |
3 |
7 |
8 |
13 |
14 |
15 |
16 |
29 |
30 |
--------------------------------------------------------------------------------
/components/amount/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
13 |
14 |
15 |
16 |
25 |
26 |
--------------------------------------------------------------------------------
/components/amount/test/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
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 |
2 |
11 |
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 |
2 |
3 | Default & Round
4 | Primary & Round
5 | Warning & Round
6 | Disabled & Round
7 |
8 |
9 |
10 |
23 |
24 |
--------------------------------------------------------------------------------
/components/button/test/cases/demo0.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | Default
4 | Default Inactive
5 | Primary
6 | Primary Inactive
7 | Loading
8 | Warning
9 | Warning Inactive
10 | Disabled
11 |
12 |
13 |
14 |
23 |
24 |
--------------------------------------------------------------------------------
/components/button/test/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | Default & Round
4 | Primary & Round
5 | Warning & Round
6 | Disabled & Round
7 |
8 |
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 |
2 |
3 |
8 | 验证码已发送至186****5407
9 |
10 |
11 |
12 |
13 |
27 |
28 |
35 |
--------------------------------------------------------------------------------
/components/captcha/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 | 验证码已发送至186****5407
9 |
10 |
11 |
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 | <
2 |
10 |
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 |
2 |
10 |
11 |
12 |
18 |
--------------------------------------------------------------------------------
/components/cell-item/test/cases/demo0.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
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 |
2 |
11 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
26 |
--------------------------------------------------------------------------------
/components/check/demo/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
23 |
--------------------------------------------------------------------------------
/components/check/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
29 |
--------------------------------------------------------------------------------
/components/check/test/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
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 |
2 |
3 |
8 |
9 |
10 |
11 |
25 |
--------------------------------------------------------------------------------
/components/codebox/demo/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
11 |
29 |
--------------------------------------------------------------------------------
/components/codebox/demo/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
10 |
28 |
--------------------------------------------------------------------------------
/components/codebox/demo/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
11 |
29 |
--------------------------------------------------------------------------------
/components/codebox/demo/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
13 |
21 |
--------------------------------------------------------------------------------
/components/codebox/test/cases/demo0.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
11 |
25 |
--------------------------------------------------------------------------------
/components/codebox/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
11 |
12 |
26 |
--------------------------------------------------------------------------------
/components/codebox/test/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
10 |
24 |
--------------------------------------------------------------------------------
/components/codebox/test/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
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 |
2 |
3 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/components/date-picker/demo/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/components/date-picker/test/cases/demo0.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
12 |
13 |
29 |
--------------------------------------------------------------------------------
/components/date-picker/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/components/date-picker/test/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
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 |
2 |
10 |
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 |
2 |
11 |
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 |
2 |
6 |
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 |
2 |
10 |
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 |
2 |
3 |
7 |
8 |
9 |
success-color
10 |
11 |
12 |
13 |
warn-color
14 |
15 |
16 |
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 |
2 |
11 |
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 |
2 |
11 |
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 |
2 |
11 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
27 |
--------------------------------------------------------------------------------
/components/license-plate/demo/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
13 |
19 |
--------------------------------------------------------------------------------
/components/license-plate/test/cases/demo0.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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 |
2 |
3 | 为了确保您的资金安全,请设置支付密码
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/components/notice-bar/demo/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 | 为了确保您的资金安全,请设置支付密码
8 |
9 |
10 |
11 |
12 |
26 |
--------------------------------------------------------------------------------
/components/notice-bar/demo/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 为了确保您的资金安全,请设置支付密码
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/components/notice-bar/demo/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 为了确保您的资金安全,请设置支付密码
4 |
5 |
6 |
7 |
21 |
--------------------------------------------------------------------------------
/components/notice-bar/demo/cases/demo5.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 | 为了确保您的资金安全,请设置支付密码。为了确保您的资金安全,请设置支付密码。为了确保您的资金安全,请设置支付密码。
9 |
10 |
11 |
12 |
13 |
27 |
--------------------------------------------------------------------------------
/components/notice-bar/demo/cases/demo6.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 | 为了确保您的资金安全,请设置支付密码为了确保您的资金安全,请设置支付密码为了确保您的资金安全,请设置支付密码
9 |
10 |
11 |
12 |
13 |
27 |
--------------------------------------------------------------------------------
/components/notice-bar/demo/cases/demo7.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 为了确保您的资金安全,请设置支付密码
6 |
7 |
8 |
9 |
10 |
25 |
--------------------------------------------------------------------------------
/components/notice-bar/test/cases/demo0.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 为了确保您的资金安全,请设置支付密码
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/components/notice-bar/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 | 为了确保您的资金安全,请设置支付密码
8 |
9 |
10 |
11 |
12 |
21 |
--------------------------------------------------------------------------------
/components/notice-bar/test/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 为了确保您的资金安全,请设置支付密码
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/components/notice-bar/test/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 为了确保您的资金安全,请设置支付密码
4 |
5 |
6 |
7 |
16 |
--------------------------------------------------------------------------------
/components/notice-bar/test/cases/demo5.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 | 为了确保您的资金安全,请设置支付密码。为了确保您的资金安全,请设置支付密码。为了确保您的资金安全,请设置支付密码。
9 |
10 |
11 |
12 |
13 |
22 |
--------------------------------------------------------------------------------
/components/notice-bar/test/cases/demo6.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 | 为了确保您的资金安全,请设置支付密码为了确保您的资金安全,请设置支付密码为了确保您的资金安全,请设置支付密码
9 |
10 |
11 |
12 |
13 |
22 |
--------------------------------------------------------------------------------
/components/notice-bar/test/cases/demo7.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 为了确保您的资金安全,请设置支付密码
6 |
7 |
8 |
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 |
2 |
3 |
8 |
9 |
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 |
2 |
3 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/components/picker/test/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
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 |
2 |
11 |
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 |
2 |
11 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
26 |
--------------------------------------------------------------------------------
/components/radio/demo/cases/demo4.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
28 |
--------------------------------------------------------------------------------
/components/radio/group.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
22 |
--------------------------------------------------------------------------------
/components/radio/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
29 |
--------------------------------------------------------------------------------
/components/radio/test/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
28 |
--------------------------------------------------------------------------------
/components/radio/test/cases/demo4.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
23 |
--------------------------------------------------------------------------------
/components/radio/test/cases/demo5.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 自己
5 | 配偶
6 | 父母
7 | 子女
8 |
9 |
10 |
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 |
2 |
3 |
5 |
6 |
7 |
8 |
9 |
21 |
22 |
--------------------------------------------------------------------------------
/components/result-page/demo/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 |
9 |
10 |
23 |
24 |
--------------------------------------------------------------------------------
/components/result-page/demo/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/components/result-page/test/cases/demo0.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
6 |
7 |
8 |
9 |
18 |
19 |
--------------------------------------------------------------------------------
/components/result-page/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 |
9 |
10 |
19 |
20 |
--------------------------------------------------------------------------------
/components/result-page/test/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
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 |
2 |
3 |
当前值:{{ value }}
4 |
5 |
11 |
12 |
13 |
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 |
2 |
3 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
21 |
22 |
26 |
--------------------------------------------------------------------------------
/components/skeleton/demo/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
25 |
26 |
30 |
--------------------------------------------------------------------------------
/components/skeleton/test/cases/demo0.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
21 |
--------------------------------------------------------------------------------
/components/skeleton/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
22 |
--------------------------------------------------------------------------------
/components/skeleton/test/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
23 |
--------------------------------------------------------------------------------
/components/skeleton/test/cases/demo4.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
25 |
--------------------------------------------------------------------------------
/components/slider/demo/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
25 |
--------------------------------------------------------------------------------
/components/slider/demo/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
30 |
--------------------------------------------------------------------------------
/components/slider/demo/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
25 |
26 |
--------------------------------------------------------------------------------
/components/slider/demo/cases/demo4.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
25 |
--------------------------------------------------------------------------------
/components/slider/demo/cases/demo5.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
25 |
--------------------------------------------------------------------------------
/components/slider/test/cases/demo0.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
21 |
--------------------------------------------------------------------------------
/components/slider/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
21 |
--------------------------------------------------------------------------------
/components/slider/test/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
26 |
--------------------------------------------------------------------------------
/components/slider/test/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
21 |
--------------------------------------------------------------------------------
/components/slider/test/cases/demo4.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
21 |
--------------------------------------------------------------------------------
/components/slider/test/cases/demo5.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
26 |
--------------------------------------------------------------------------------
/components/stepper/demo/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
26 |
--------------------------------------------------------------------------------
/components/stepper/demo/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
31 |
--------------------------------------------------------------------------------
/components/stepper/demo/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
31 |
--------------------------------------------------------------------------------
/components/stepper/demo/cases/demo4.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
26 |
--------------------------------------------------------------------------------
/components/stepper/demo/cases/demo5.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
26 |
--------------------------------------------------------------------------------
/components/stepper/test/cases/demo0.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
22 |
--------------------------------------------------------------------------------
/components/stepper/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
22 |
--------------------------------------------------------------------------------
/components/stepper/test/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
27 |
--------------------------------------------------------------------------------
/components/stepper/test/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
27 |
--------------------------------------------------------------------------------
/components/stepper/test/cases/demo4.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
22 |
--------------------------------------------------------------------------------
/components/stepper/test/cases/demo5.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/components/steps/demo/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/components/steps/test/cases/demo0.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/components/steps/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/components/steps/test/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/components/steps/test/cases/demo6.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
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 |
2 |
3 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/components/switch/demo/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/components/switch/demo/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/components/switch/demo/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/components/switch/demo/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/components/switch/test/cases/demo0.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/components/switch/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/components/switch/test/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/components/switch/test/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
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 |
2 |
3 |
7 |
8 |
9 |
10 |
25 |
--------------------------------------------------------------------------------
/components/tab-bar/demo/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
11 |
36 |
--------------------------------------------------------------------------------
/components/tab-bar/demo/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
11 |
30 |
--------------------------------------------------------------------------------
/components/tab-bar/test/cases/demo0.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
10 |
25 |
--------------------------------------------------------------------------------
/components/tab-bar/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
11 |
32 |
--------------------------------------------------------------------------------
/components/tab-bar/test/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
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 |
2 |
11 |
12 |
13 |
20 |
--------------------------------------------------------------------------------
/components/tab-picker/test/cases/demo0.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
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 |
2 |
3 | 可选
4 | 可选
5 |
6 |
7 |
8 |
21 |
--------------------------------------------------------------------------------
/components/tag/demo/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | ¥3600
4 | ¥300
5 |
6 |
7 |
8 |
21 |
--------------------------------------------------------------------------------
/components/tag/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 逾期23天
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/components/tag/test/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 可选
4 | 可选
5 |
6 |
7 |
8 |
17 |
--------------------------------------------------------------------------------
/components/tag/test/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | ¥3600
4 | ¥300
5 |
6 |
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 |
2 |
11 |
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 |
2 |
3 |
4 | 点击我
5 |
6 |
7 |
8 |
9 |
23 |
--------------------------------------------------------------------------------
/components/tip/demo/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 点击我
5 |
6 |
7 |
8 |
9 |
23 |
--------------------------------------------------------------------------------
/components/tip/demo/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 点击我
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/components/tip/demo/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 点击我
5 |
6 |
7 |
8 |
9 |
23 |
--------------------------------------------------------------------------------
/components/tip/test/tip-wrapper.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 点击我
6 |
7 |
8 |
9 |
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 |
2 |
3 | 纯文字
4 |
5 |
6 |
7 |
25 |
--------------------------------------------------------------------------------
/components/toast/demo/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 成功
4 |
5 |
6 |
7 |
25 |
--------------------------------------------------------------------------------
/components/toast/demo/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 失败
4 |
5 |
6 |
7 |
25 |
--------------------------------------------------------------------------------
/components/toast/demo/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 载入
4 |
5 |
6 |
7 |
28 |
--------------------------------------------------------------------------------
/components/toast/demo/cases/demo4.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 连续调用
4 |
5 |
6 |
7 |
31 |
--------------------------------------------------------------------------------
/components/toast/demo/cases/demo5.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 长文字
4 |
5 |
6 |
7 |
25 |
--------------------------------------------------------------------------------
/components/toast/demo/cases/demo6.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 自定义位置
4 |
5 |
6 |
7 |
28 |
--------------------------------------------------------------------------------
/components/toast/test/cases/demo0.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
15 |
--------------------------------------------------------------------------------
/components/toast/test/cases/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
15 |
--------------------------------------------------------------------------------
/components/toast/test/cases/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
15 |
--------------------------------------------------------------------------------
/components/toast/test/cases/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
15 |
--------------------------------------------------------------------------------
/components/toast/test/cases/demo4.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
21 |
--------------------------------------------------------------------------------
/components/toast/test/cases/demo5.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
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 |
2 |
11 |
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 |
2 |
10 |
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 |
2 |
3 |
9 |
10 |
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 |
2 |
3 |

4 |
5 |
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
--------------------------------------------------------------------------------