├── .browserslistrc
├── .eslintignore
├── .eslintrc.js
├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE.md
├── ISSUE_TEMPLATE
│ └── config.yml
└── workflows
│ ├── deploy-docs.yml
│ ├── sync-gitee.yml
│ ├── test-coverage-upload.yml
│ └── verify-files-modify.yml
├── .gitignore
├── .prettierignore
├── .prettierrc.js
├── CHANGE-LOG.md
├── LICENSE
├── README-CN.md
├── README.md
├── babel.config.js
├── build
├── build-entry.js
├── build-js.js
├── build-locale.js
├── build-style.js
├── build-versions.js
├── common
│ ├── get-components.js
│ ├── index.js
│ └── themes-name.js
├── config.js
├── webpack.comps.config.js
├── webpack.main.config.js
└── webpack.umd.config.js
├── components.json
├── examples
├── .eslintignore
├── .eslintrc.js
├── .gitignore
├── babel.config.js
├── build
│ └── md-loader
│ │ ├── config.js
│ │ ├── containers.js
│ │ ├── fence.js
│ │ ├── index.js
│ │ └── util.js
├── package.json
├── public
│ ├── app.html
│ ├── favicon.ico
│ ├── index.html
│ └── versions.json
├── src
│ ├── comp
│ │ ├── anchor.vue
│ │ ├── api-tpl.vue
│ │ ├── app.less
│ │ ├── app.vue
│ │ ├── catalog.vue
│ │ ├── demo-block.vue
│ │ ├── directives
│ │ │ └── clickoutside.js
│ │ ├── layout
│ │ │ ├── doc-layout.vue
│ │ │ ├── empty-layout.vue
│ │ │ └── footer.vue
│ │ ├── locale
│ │ │ └── index.js
│ │ ├── mixins
│ │ │ ├── i18n-mixins.js
│ │ │ └── theme-switch-mixins.js
│ │ └── online-edit
│ │ │ ├── code-pen
│ │ │ └── index.jsx
│ │ │ └── code-sand-box
│ │ │ └── index.jsx
│ ├── css
│ │ ├── custom.less
│ │ ├── index.less
│ │ └── reset.less
│ ├── demo
│ │ ├── index.vue
│ │ ├── normal-data-grid.vue
│ │ └── spreadsheet.vue
│ ├── docs
│ │ ├── en
│ │ │ ├── QA.md
│ │ │ ├── intro.md
│ │ │ ├── locale.md
│ │ │ ├── start.md
│ │ │ ├── theme.md
│ │ │ ├── update-log.md
│ │ │ ├── ve-checkbox
│ │ │ │ ├── api.md
│ │ │ │ ├── checkbox-multiple-advanced.md
│ │ │ │ ├── checkbox-multiple-simple.md
│ │ │ │ ├── checkbox-single.md
│ │ │ │ └── main.vue
│ │ │ ├── ve-contextmenu
│ │ │ │ ├── api.md
│ │ │ │ ├── base.md
│ │ │ │ ├── main.vue
│ │ │ │ └── usage.md
│ │ │ ├── ve-dropdown
│ │ │ │ ├── api.md
│ │ │ │ ├── callback-methods.md
│ │ │ │ ├── custom-content.md
│ │ │ │ ├── main.vue
│ │ │ │ ├── multiple-select.md
│ │ │ │ ├── operation.md
│ │ │ │ └── single-select.md
│ │ │ ├── ve-icon
│ │ │ │ ├── api.md
│ │ │ │ ├── base.md
│ │ │ │ ├── collection.vue
│ │ │ │ ├── explain.md
│ │ │ │ ├── main.vue
│ │ │ │ └── usage.md
│ │ │ ├── ve-loading
│ │ │ │ ├── api.md
│ │ │ │ ├── collection.vue
│ │ │ │ ├── container.md
│ │ │ │ ├── custom.md
│ │ │ │ ├── fullscreen.md
│ │ │ │ ├── main.vue
│ │ │ │ └── usage.md
│ │ │ ├── ve-locale
│ │ │ │ ├── api.md
│ │ │ │ ├── cover-lang.md
│ │ │ │ ├── main.vue
│ │ │ │ ├── switch-lang.md
│ │ │ │ └── usage.md
│ │ │ ├── ve-pagination
│ │ │ │ ├── api.md
│ │ │ │ ├── base-usage.md
│ │ │ │ ├── callback-events.md
│ │ │ │ ├── layout-settings.md
│ │ │ │ ├── main.vue
│ │ │ │ ├── page-index.md
│ │ │ │ ├── page-size.md
│ │ │ │ ├── paging-buttons.md
│ │ │ │ ├── paging-configuration.md
│ │ │ │ └── usage.md
│ │ │ ├── ve-radio
│ │ │ │ ├── api.md
│ │ │ │ ├── base.md
│ │ │ │ ├── controlled.md
│ │ │ │ └── main.vue
│ │ │ ├── ve-select
│ │ │ │ ├── api.md
│ │ │ │ ├── base.md
│ │ │ │ └── main.vue
│ │ │ └── ve-table
│ │ │ │ ├── api
│ │ │ │ ├── cell-autofill-option-props.vue
│ │ │ │ ├── cell-selection-option-props.vue
│ │ │ │ ├── cell-span-option-props.vue
│ │ │ │ ├── cell-style-option-props.vue
│ │ │ │ ├── checkbox-option-props.vue
│ │ │ │ ├── clipboard-option-props.vue
│ │ │ │ ├── column-hidden-option-props.vue
│ │ │ │ ├── column-props
│ │ │ │ │ ├── ellipsis-props.vue
│ │ │ │ │ ├── filter-custom-props.vue
│ │ │ │ │ ├── filter-props.vue
│ │ │ │ │ └── index.vue
│ │ │ │ ├── column-width-resize-option-props.vue
│ │ │ │ ├── contextmenu-body-option-props.vue
│ │ │ │ ├── contextmenu-header-option-props.vue
│ │ │ │ ├── db.js
│ │ │ │ ├── edit-option-props.vue
│ │ │ │ ├── event-custom-option-props.vue
│ │ │ │ ├── expand-option-props.vue
│ │ │ │ ├── instance-methods.vue
│ │ │ │ ├── main.vue
│ │ │ │ ├── radio-option-props.vue
│ │ │ │ ├── row-style-option-props.vue
│ │ │ │ ├── sort-option-props.vue
│ │ │ │ ├── table-props.vue
│ │ │ │ └── virtual-scroll-option-props.vue
│ │ │ │ ├── cell-align
│ │ │ │ ├── basic-align.md
│ │ │ │ ├── explain.md
│ │ │ │ └── main.vue
│ │ │ │ ├── cell-autofill
│ │ │ │ ├── autofill-direction.md
│ │ │ │ ├── base.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── features.md
│ │ │ │ ├── main.vue
│ │ │ │ └── shortcuts.md
│ │ │ │ ├── cell-custom
│ │ │ │ ├── body-cell.md
│ │ │ │ ├── header-cell.md
│ │ │ │ ├── main.vue
│ │ │ │ └── more.md
│ │ │ │ ├── cell-edit
│ │ │ │ ├── base.md
│ │ │ │ ├── combine-column-fixed.md
│ │ │ │ ├── combine-element-ui.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── instance-method.md
│ │ │ │ ├── main.vue
│ │ │ │ └── shortcuts.md
│ │ │ │ ├── cell-ellipsis
│ │ │ │ ├── base.md
│ │ │ │ ├── ellipsis-line.md
│ │ │ │ ├── ellipsis.md
│ │ │ │ ├── explain.md
│ │ │ │ └── main.vue
│ │ │ │ ├── cell-selection
│ │ │ │ ├── base.md
│ │ │ │ ├── disable-selection.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── main.vue
│ │ │ │ ├── range-selection-instance-methods.md
│ │ │ │ ├── shortcuts.md
│ │ │ │ └── single-selection-instance-methods.md
│ │ │ │ ├── cell-span
│ │ │ │ ├── body-colspan.md
│ │ │ │ ├── body-rowspan.md
│ │ │ │ ├── custom-content.md
│ │ │ │ ├── explain.md
│ │ │ │ └── main.vue
│ │ │ │ ├── cell-style
│ │ │ │ ├── body-cell-style.md
│ │ │ │ ├── body-row-style.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── header-cell-style.md
│ │ │ │ ├── header-row-style.md
│ │ │ │ └── main.vue
│ │ │ │ ├── clipboard
│ │ │ │ ├── base.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── features-bak.md
│ │ │ │ ├── main.vue
│ │ │ │ └── shortcuts.md
│ │ │ │ ├── column-fixed
│ │ │ │ ├── column-fixed-auto-width.md
│ │ │ │ ├── column-fixed-left-right.md
│ │ │ │ ├── column-fixed-left.md
│ │ │ │ ├── column-fixed-right.md
│ │ │ │ ├── explain.md
│ │ │ │ └── main.vue
│ │ │ │ ├── column-hidden
│ │ │ │ ├── default-hidden-column.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── instance-methods.md
│ │ │ │ └── main.vue
│ │ │ │ ├── column-resize
│ │ │ │ ├── basic.md
│ │ │ │ ├── disable-resizing.md
│ │ │ │ ├── explain.md
│ │ │ │ └── main.vue
│ │ │ │ ├── column-width
│ │ │ │ ├── explain.md
│ │ │ │ ├── long-word.md
│ │ │ │ ├── main.vue
│ │ │ │ ├── no-width.md
│ │ │ │ ├── percent-width.md
│ │ │ │ └── px-width.md
│ │ │ │ ├── contextmenu
│ │ │ │ ├── base.md
│ │ │ │ ├── contextmenu-types.md
│ │ │ │ ├── custom.md
│ │ │ │ ├── explain.md
│ │ │ │ └── main.vue
│ │ │ │ ├── data-empty
│ │ │ │ ├── basic.md
│ │ │ │ ├── explain.md
│ │ │ │ └── main.vue
│ │ │ │ ├── event-custom
│ │ │ │ ├── explain.md
│ │ │ │ ├── main.vue
│ │ │ │ ├── on-body-cell.md
│ │ │ │ ├── on-body-row.md
│ │ │ │ ├── on-header-cell.md
│ │ │ │ └── on-header-row.md
│ │ │ │ ├── footer-summary
│ │ │ │ ├── base.md
│ │ │ │ ├── cell-span.md
│ │ │ │ ├── cell-style.md
│ │ │ │ ├── custom-cell.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── footer-column-fixed.md
│ │ │ │ ├── footer-fixed.md
│ │ │ │ ├── main.vue
│ │ │ │ ├── on-footer-cell.md
│ │ │ │ ├── on-footer-row.md
│ │ │ │ └── virtual-scroll.md
│ │ │ │ ├── header-filter-custom
│ │ │ │ ├── custom-icon.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── main.vue
│ │ │ │ └── single-filter.md
│ │ │ │ ├── header-filter
│ │ │ │ ├── custom-icon.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── main.vue
│ │ │ │ ├── mixture-filter.md
│ │ │ │ ├── mutil-filter.md
│ │ │ │ └── single-filter.md
│ │ │ │ ├── header-fixed
│ │ │ │ ├── base.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── header-fixed-disabled.md
│ │ │ │ ├── header-fixed-mutil.md
│ │ │ │ └── main.vue
│ │ │ │ ├── header-grouping
│ │ │ │ ├── explain.md
│ │ │ │ ├── grouping-header-fixed-column.md
│ │ │ │ ├── grouping-header.md
│ │ │ │ └── main.vue
│ │ │ │ ├── header-hidden
│ │ │ │ ├── base.md
│ │ │ │ ├── explain.md
│ │ │ │ └── main.vue
│ │ │ │ ├── header-sort
│ │ │ │ ├── explain.md
│ │ │ │ ├── main.vue
│ │ │ │ ├── multi-sort.md
│ │ │ │ ├── single-sort.md
│ │ │ │ └── sort-always.md
│ │ │ │ ├── instance-methods
│ │ │ │ ├── explain.md
│ │ │ │ ├── main.vue
│ │ │ │ ├── scroll-to-col-key.md
│ │ │ │ ├── scroll-to-row-key.md
│ │ │ │ └── scroll-to.md
│ │ │ │ ├── loading
│ │ │ │ ├── basic.md
│ │ │ │ ├── explain.md
│ │ │ │ └── main.vue
│ │ │ │ ├── operation-column
│ │ │ │ ├── base.md
│ │ │ │ ├── explain.md
│ │ │ │ └── main.vue
│ │ │ │ ├── pagination
│ │ │ │ ├── basic.md
│ │ │ │ ├── checkbox.md
│ │ │ │ ├── explain.md
│ │ │ │ └── main.vue
│ │ │ │ ├── row-checkbox
│ │ │ │ ├── base.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── main.vue
│ │ │ │ ├── selected-all-hide.md
│ │ │ │ ├── selected-column.md
│ │ │ │ ├── selected-control.md
│ │ │ │ ├── selected-default.md
│ │ │ │ ├── selected-disable.md
│ │ │ │ └── selected-row-click.md
│ │ │ │ ├── row-expand
│ │ │ │ ├── base.md
│ │ │ │ ├── default-expand.md
│ │ │ │ ├── expand-chart.md
│ │ │ │ ├── expand-column.md
│ │ │ │ ├── expand-control.md
│ │ │ │ ├── expand-event.md
│ │ │ │ ├── expand-table.md
│ │ │ │ ├── expand-trigger.md
│ │ │ │ ├── expandable.md
│ │ │ │ ├── explain.md
│ │ │ │ └── main.vue
│ │ │ │ ├── row-index
│ │ │ │ ├── base.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── main.vue
│ │ │ │ └── ranking.md
│ │ │ │ ├── row-radio
│ │ │ │ ├── base.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── main.vue
│ │ │ │ ├── radio-column.md
│ │ │ │ ├── selected-control.md
│ │ │ │ ├── selected-default.md
│ │ │ │ ├── selected-disable.md
│ │ │ │ └── selected-row-click.md
│ │ │ │ ├── row-style
│ │ │ │ ├── click-highlight.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── hover-highlight.md
│ │ │ │ ├── main.vue
│ │ │ │ └── row-stripe.md
│ │ │ │ ├── table-border
│ │ │ │ ├── around-x.md
│ │ │ │ ├── around-y.md
│ │ │ │ ├── border-all.md
│ │ │ │ ├── border-around.md
│ │ │ │ ├── border-radius.md
│ │ │ │ ├── border-x.md
│ │ │ │ ├── border-y.md
│ │ │ │ ├── default.md
│ │ │ │ ├── explain.md
│ │ │ │ └── main.vue
│ │ │ │ ├── table-height
│ │ │ │ ├── auto-height.md
│ │ │ │ ├── calc-height.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── fixed-height.md
│ │ │ │ └── main.vue
│ │ │ │ ├── table-width
│ │ │ │ ├── auto-width.md
│ │ │ │ ├── calc-width.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── fixed-width.md
│ │ │ │ ├── main.vue
│ │ │ │ └── percent-width.md
│ │ │ │ ├── test
│ │ │ │ ├── main.vue
│ │ │ │ └── performance.md
│ │ │ │ ├── usage
│ │ │ │ └── main.md
│ │ │ │ └── virtual-scroll
│ │ │ │ ├── auto-height.md
│ │ │ │ ├── base.md
│ │ │ │ ├── column-fixed.md
│ │ │ │ ├── combine-lazy-load.md
│ │ │ │ ├── dynamic-enable.md
│ │ │ │ ├── explain.md
│ │ │ │ ├── main.vue
│ │ │ │ ├── row-checkbox.md
│ │ │ │ ├── row-expand-table.md
│ │ │ │ ├── row-expand.md
│ │ │ │ ├── row-index.md
│ │ │ │ └── row-radio.md
│ │ └── zh
│ │ │ ├── QA.md
│ │ │ ├── intro.md
│ │ │ ├── locale.md
│ │ │ ├── start.md
│ │ │ ├── theme.md
│ │ │ ├── update-log.md
│ │ │ ├── ve-checkbox
│ │ │ ├── api.md
│ │ │ ├── checkbox-multiple-advanced.md
│ │ │ ├── checkbox-multiple-simple.md
│ │ │ ├── checkbox-single.md
│ │ │ └── main.vue
│ │ │ ├── ve-contextmenu
│ │ │ ├── api.md
│ │ │ ├── base.md
│ │ │ ├── main.vue
│ │ │ └── usage.md
│ │ │ ├── ve-dropdown
│ │ │ ├── api.md
│ │ │ ├── callback-methods.md
│ │ │ ├── custom-content.md
│ │ │ ├── main.vue
│ │ │ ├── multiple-select.md
│ │ │ ├── operation.md
│ │ │ └── single-select.md
│ │ │ ├── ve-icon
│ │ │ ├── api.md
│ │ │ ├── base.md
│ │ │ ├── collection.vue
│ │ │ ├── explain.md
│ │ │ ├── main.vue
│ │ │ └── usage.md
│ │ │ ├── ve-loading
│ │ │ ├── api.md
│ │ │ ├── collection.vue
│ │ │ ├── container.md
│ │ │ ├── custom.md
│ │ │ ├── fullscreen.md
│ │ │ ├── main.vue
│ │ │ └── usage.md
│ │ │ ├── ve-locale
│ │ │ ├── api.md
│ │ │ ├── cover-lang.md
│ │ │ ├── main.vue
│ │ │ ├── switch-lang.md
│ │ │ └── usage.md
│ │ │ ├── ve-pagination
│ │ │ ├── api.md
│ │ │ ├── base-usage.md
│ │ │ ├── callback-events.md
│ │ │ ├── layout-settings.md
│ │ │ ├── main.vue
│ │ │ ├── page-index.md
│ │ │ ├── page-size.md
│ │ │ ├── paging-buttons.md
│ │ │ ├── paging-configuration.md
│ │ │ └── usage.md
│ │ │ ├── ve-radio
│ │ │ ├── api.md
│ │ │ ├── base.md
│ │ │ ├── controlled.md
│ │ │ └── main.vue
│ │ │ ├── ve-select
│ │ │ ├── api.md
│ │ │ ├── base.md
│ │ │ └── main.vue
│ │ │ └── ve-table
│ │ │ ├── api
│ │ │ ├── cell-autofill-option-props.vue
│ │ │ ├── cell-selection-option-props.vue
│ │ │ ├── cell-span-option-props.vue
│ │ │ ├── cell-style-option-props.vue
│ │ │ ├── checkbox-option-props.vue
│ │ │ ├── clipboard-option-props.vue
│ │ │ ├── column-hidden-option-props.vue
│ │ │ ├── column-props
│ │ │ │ ├── ellipsis-props.vue
│ │ │ │ ├── filter-custom-props.vue
│ │ │ │ ├── filter-props.vue
│ │ │ │ └── index.vue
│ │ │ ├── column-width-resize-option-props.vue
│ │ │ ├── contextmenu-body-option-props.vue
│ │ │ ├── contextmenu-header-option-props.vue
│ │ │ ├── db.js
│ │ │ ├── edit-option-props.vue
│ │ │ ├── event-custom-option-props.vue
│ │ │ ├── expand-option-props.vue
│ │ │ ├── instance-methods.vue
│ │ │ ├── main.vue
│ │ │ ├── radio-option-props.vue
│ │ │ ├── row-style-option-props.vue
│ │ │ ├── sort-option-props.vue
│ │ │ ├── table-props.vue
│ │ │ └── virtual-scroll-option-props.vue
│ │ │ ├── cell-align
│ │ │ ├── basic-align.md
│ │ │ ├── explain.md
│ │ │ └── main.vue
│ │ │ ├── cell-autofill
│ │ │ ├── autofill-direction.md
│ │ │ ├── base.md
│ │ │ ├── explain.md
│ │ │ ├── features.md
│ │ │ ├── main.vue
│ │ │ └── shortcuts.md
│ │ │ ├── cell-custom
│ │ │ ├── body-cell.md
│ │ │ ├── header-cell.md
│ │ │ ├── main.vue
│ │ │ └── more.md
│ │ │ ├── cell-edit
│ │ │ ├── base.md
│ │ │ ├── combine-column-fixed.md
│ │ │ ├── combine-element-ui.md
│ │ │ ├── explain.md
│ │ │ ├── instance-method.md
│ │ │ ├── main.vue
│ │ │ └── shortcuts.md
│ │ │ ├── cell-ellipsis
│ │ │ ├── base.md
│ │ │ ├── ellipsis-line.md
│ │ │ ├── ellipsis.md
│ │ │ ├── explain.md
│ │ │ └── main.vue
│ │ │ ├── cell-selection
│ │ │ ├── base.md
│ │ │ ├── disable-selection.md
│ │ │ ├── explain.md
│ │ │ ├── main.vue
│ │ │ ├── range-selection-instance-methods.md
│ │ │ ├── shortcuts.md
│ │ │ └── single-selection-instance-methods.md
│ │ │ ├── cell-span
│ │ │ ├── body-colspan.md
│ │ │ ├── body-rowspan.md
│ │ │ ├── custom-content.md
│ │ │ ├── explain.md
│ │ │ └── main.vue
│ │ │ ├── cell-style
│ │ │ ├── body-cell-style.md
│ │ │ ├── body-row-style.md
│ │ │ ├── explain.md
│ │ │ ├── header-cell-style.md
│ │ │ ├── header-row-style.md
│ │ │ └── main.vue
│ │ │ ├── clipboard
│ │ │ ├── base.md
│ │ │ ├── explain.md
│ │ │ ├── features-bak.md
│ │ │ ├── main.vue
│ │ │ └── shortcuts.md
│ │ │ ├── column-fixed
│ │ │ ├── column-fixed-auto-width.md
│ │ │ ├── column-fixed-left-right.md
│ │ │ ├── column-fixed-left.md
│ │ │ ├── column-fixed-right.md
│ │ │ ├── explain.md
│ │ │ └── main.vue
│ │ │ ├── column-hidden
│ │ │ ├── default-hidden-column.md
│ │ │ ├── explain.md
│ │ │ ├── instance-methods.md
│ │ │ └── main.vue
│ │ │ ├── column-resize
│ │ │ ├── basic.md
│ │ │ ├── disable-resizing.md
│ │ │ ├── explain.md
│ │ │ └── main.vue
│ │ │ ├── column-width
│ │ │ ├── explain.md
│ │ │ ├── long-word.md
│ │ │ ├── main.vue
│ │ │ ├── no-width.md
│ │ │ ├── percent-width.md
│ │ │ └── px-width.md
│ │ │ ├── contextmenu
│ │ │ ├── base.md
│ │ │ ├── contextmenu-types.md
│ │ │ ├── custom.md
│ │ │ ├── explain.md
│ │ │ └── main.vue
│ │ │ ├── data-empty
│ │ │ ├── basic.md
│ │ │ ├── explain.md
│ │ │ └── main.vue
│ │ │ ├── event-custom
│ │ │ ├── explain.md
│ │ │ ├── main.vue
│ │ │ ├── on-body-cell.md
│ │ │ ├── on-body-row.md
│ │ │ ├── on-header-cell.md
│ │ │ └── on-header-row.md
│ │ │ ├── footer-summary
│ │ │ ├── base.md
│ │ │ ├── cell-span.md
│ │ │ ├── cell-style.md
│ │ │ ├── custom-cell.md
│ │ │ ├── explain.md
│ │ │ ├── footer-column-fixed.md
│ │ │ ├── footer-fixed.md
│ │ │ ├── main.vue
│ │ │ ├── on-footer-cell.md
│ │ │ ├── on-footer-row.md
│ │ │ └── virtual-scroll.md
│ │ │ ├── header-filter-custom
│ │ │ ├── custom-icon.md
│ │ │ ├── explain.md
│ │ │ ├── main.vue
│ │ │ └── single-filter.md
│ │ │ ├── header-filter
│ │ │ ├── custom-icon.md
│ │ │ ├── explain.md
│ │ │ ├── main.vue
│ │ │ ├── mixture-filter.md
│ │ │ ├── mutil-filter.md
│ │ │ └── single-filter.md
│ │ │ ├── header-fixed
│ │ │ ├── base.md
│ │ │ ├── explain.md
│ │ │ ├── header-fixed-disabled.md
│ │ │ ├── header-fixed-mutil.md
│ │ │ └── main.vue
│ │ │ ├── header-grouping
│ │ │ ├── explain.md
│ │ │ ├── grouping-header-fixed-column.md
│ │ │ ├── grouping-header.md
│ │ │ └── main.vue
│ │ │ ├── header-hidden
│ │ │ ├── base.md
│ │ │ ├── explain.md
│ │ │ └── main.vue
│ │ │ ├── header-sort
│ │ │ ├── explain.md
│ │ │ ├── main.vue
│ │ │ ├── multi-sort.md
│ │ │ ├── single-sort.md
│ │ │ └── sort-always.md
│ │ │ ├── instance-methods
│ │ │ ├── explain.md
│ │ │ ├── main.vue
│ │ │ ├── scroll-to-col-key.md
│ │ │ ├── scroll-to-row-key.md
│ │ │ └── scroll-to.md
│ │ │ ├── loading
│ │ │ ├── basic.md
│ │ │ ├── explain.md
│ │ │ └── main.vue
│ │ │ ├── operation-column
│ │ │ ├── base.md
│ │ │ ├── explain.md
│ │ │ └── main.vue
│ │ │ ├── pagination
│ │ │ ├── basic.md
│ │ │ ├── checkbox.md
│ │ │ ├── explain.md
│ │ │ └── main.vue
│ │ │ ├── row-checkbox
│ │ │ ├── base.md
│ │ │ ├── explain.md
│ │ │ ├── main.vue
│ │ │ ├── selected-all-hide.md
│ │ │ ├── selected-column.md
│ │ │ ├── selected-control.md
│ │ │ ├── selected-default.md
│ │ │ ├── selected-disable.md
│ │ │ └── selected-row-click.md
│ │ │ ├── row-expand
│ │ │ ├── base.md
│ │ │ ├── default-expand.md
│ │ │ ├── expand-chart.md
│ │ │ ├── expand-column.md
│ │ │ ├── expand-control.md
│ │ │ ├── expand-event.md
│ │ │ ├── expand-table.md
│ │ │ ├── expand-trigger.md
│ │ │ ├── expandable.md
│ │ │ ├── explain.md
│ │ │ └── main.vue
│ │ │ ├── row-index
│ │ │ ├── base.md
│ │ │ ├── explain.md
│ │ │ ├── main.vue
│ │ │ └── ranking.md
│ │ │ ├── row-radio
│ │ │ ├── base.md
│ │ │ ├── explain.md
│ │ │ ├── main.vue
│ │ │ ├── radio-column.md
│ │ │ ├── selected-control.md
│ │ │ ├── selected-default.md
│ │ │ ├── selected-disable.md
│ │ │ └── selected-row-click.md
│ │ │ ├── row-style
│ │ │ ├── click-highlight.md
│ │ │ ├── explain.md
│ │ │ ├── hover-highlight.md
│ │ │ ├── main.vue
│ │ │ └── row-stripe.md
│ │ │ ├── table-border
│ │ │ ├── around-x.md
│ │ │ ├── around-y.md
│ │ │ ├── border-all.md
│ │ │ ├── border-around.md
│ │ │ ├── border-radius.md
│ │ │ ├── border-x.md
│ │ │ ├── border-y.md
│ │ │ ├── default.md
│ │ │ ├── explain.md
│ │ │ └── main.vue
│ │ │ ├── table-height
│ │ │ ├── auto-height.md
│ │ │ ├── calc-height.md
│ │ │ ├── explain.md
│ │ │ ├── fixed-height.md
│ │ │ └── main.vue
│ │ │ ├── table-width
│ │ │ ├── auto-width.md
│ │ │ ├── calc-width.md
│ │ │ ├── explain.md
│ │ │ ├── fixed-width.md
│ │ │ ├── main.vue
│ │ │ └── percent-width.md
│ │ │ ├── test
│ │ │ ├── main.vue
│ │ │ └── performance.md
│ │ │ ├── usage
│ │ │ └── main.md
│ │ │ └── virtual-scroll
│ │ │ ├── auto-height.md
│ │ │ ├── base.md
│ │ │ ├── column-fixed.md
│ │ │ ├── combine-lazy-load.md
│ │ │ ├── dynamic-enable.md
│ │ │ ├── explain.md
│ │ │ ├── main.vue
│ │ │ ├── row-checkbox.md
│ │ │ ├── row-expand-table.md
│ │ │ ├── row-expand.md
│ │ │ ├── row-index.md
│ │ │ └── row-radio.md
│ ├── images
│ │ └── browsers
│ │ │ ├── chrome_48x48.png
│ │ │ ├── edge_48x48.png
│ │ │ ├── firefox_48x48.png
│ │ │ ├── opera_48x48.png
│ │ │ └── safari_48x48.png
│ ├── main.js
│ ├── plugins
│ │ └── http-request.js
│ ├── router
│ │ ├── index.js
│ │ ├── locale
│ │ │ ├── en.router.config.js
│ │ │ ├── index.js
│ │ │ └── zh.router.config.js
│ │ └── router.config.js
│ ├── service
│ │ └── index.js
│ ├── umd-test
│ │ ├── locale
│ │ │ └── index.html
│ │ ├── ve-pagination
│ │ │ └── index.html
│ │ └── ve-table
│ │ │ └── index.html
│ └── utils
│ │ ├── constant.js
│ │ ├── cookies.js
│ │ ├── i18n.js
│ │ └── index.js
├── vue.config.js
└── yarn.lock
├── jest.config.js
├── package.json
├── packages
├── font
│ ├── demo.css
│ ├── demo_index.html
│ ├── iconfont.css
│ ├── iconfont.eot
│ ├── iconfont.js
│ ├── iconfont.json
│ ├── iconfont.svg
│ ├── iconfont.ttf
│ ├── iconfont.woff
│ └── iconfont.woff2
├── index.js
├── src
│ ├── comps
│ │ └── resize-observer
│ │ │ ├── index.js
│ │ │ └── src
│ │ │ └── index.jsx
│ ├── directives
│ │ ├── clickoutside.js
│ │ ├── events-outside.js
│ │ └── focus.js
│ ├── locale
│ │ ├── index.js
│ │ └── lang
│ │ │ ├── af-ZA.js
│ │ │ ├── en-US.js
│ │ │ ├── fr-FR.js
│ │ │ ├── ko-KR.js
│ │ │ ├── pt-BR.js
│ │ │ ├── ru-RU.js
│ │ │ ├── zh-CN.js
│ │ │ ├── zh-TW.js
│ │ │ └── zu-ZA.js
│ ├── mixins
│ │ └── emitter.js
│ └── utils
│ │ ├── animation-frame.js
│ │ ├── auto-resize.js
│ │ ├── constant.js
│ │ ├── dom.js
│ │ ├── event-key-codes.js
│ │ ├── hooks-manager.js
│ │ ├── index.js
│ │ ├── mouse-event.js
│ │ ├── random.js
│ │ ├── request-animation-timeout.js
│ │ ├── resize-event.js
│ │ └── scroll-bar.js
├── style
│ ├── ve-checkbox.less
│ ├── ve-contextmenu.less
│ ├── ve-dropdown.less
│ ├── ve-icon.less
│ ├── ve-loading.less
│ ├── ve-pagination.less
│ ├── ve-radio.less
│ ├── ve-select.less
│ └── ve-table.less
├── theme-dark
│ ├── base.less
│ ├── index.less
│ ├── var.less
│ ├── ve-checkbox.less
│ ├── ve-contextmenu.less
│ ├── ve-dropdown.less
│ ├── ve-icon.less
│ ├── ve-loading.less
│ ├── ve-pagination.less
│ ├── ve-radio.less
│ ├── ve-select.less
│ └── ve-table.less
├── theme-default
│ ├── base.less
│ ├── index.less
│ ├── var.less
│ ├── ve-checkbox.less
│ ├── ve-contextmenu.less
│ ├── ve-dropdown.less
│ ├── ve-icon.less
│ ├── ve-loading.less
│ ├── ve-pagination.less
│ ├── ve-radio.less
│ ├── ve-select.less
│ └── ve-table.less
├── ve-checkbox-group
│ ├── index.js
│ └── src
│ │ ├── index.jsx
│ │ └── util
│ │ ├── constant.js
│ │ └── index.js
├── ve-checkbox
│ ├── index.js
│ └── src
│ │ ├── index.jsx
│ │ └── util
│ │ ├── constant.js
│ │ └── index.js
├── ve-contextmenu
│ ├── index.js
│ └── src
│ │ ├── index.jsx
│ │ └── util
│ │ ├── constant.js
│ │ └── index.js
├── ve-dropdown
│ ├── index.js
│ └── src
│ │ ├── index.jsx
│ │ └── util
│ │ ├── constant.js
│ │ └── index.js
├── ve-icon
│ ├── index.js
│ └── src
│ │ ├── index.jsx
│ │ └── util
│ │ ├── constant.js
│ │ └── index.js
├── ve-loading
│ ├── index.js
│ └── src
│ │ ├── bounce.jsx
│ │ ├── flow.jsx
│ │ ├── grid.jsx
│ │ ├── index.js
│ │ ├── loading.jsx
│ │ ├── plane.jsx
│ │ ├── pulse.jsx
│ │ ├── util
│ │ ├── constant.js
│ │ └── index.js
│ │ └── wave.jsx
├── ve-locale
│ └── index.js
├── ve-pagination
│ ├── index.js
│ └── src
│ │ ├── index.jsx
│ │ ├── pager.jsx
│ │ └── util
│ │ ├── constant.js
│ │ └── index.js
├── ve-radio
│ ├── index.js
│ └── src
│ │ ├── index.jsx
│ │ └── util
│ │ ├── constant.js
│ │ └── index.js
├── ve-select
│ ├── index.js
│ └── src
│ │ ├── index.jsx
│ │ └── util
│ │ ├── constant.js
│ │ └── index.js
└── ve-table
│ ├── index.js
│ └── src
│ ├── body
│ ├── body-checkbox-content.jsx
│ ├── body-radio-content.jsx
│ ├── body-td.jsx
│ ├── body-tr-scrolling.jsx
│ ├── body-tr.jsx
│ ├── expand-tr-icon.jsx
│ ├── expand-tr.jsx
│ └── index.jsx
│ ├── colgroup
│ └── index.jsx
│ ├── column-resizer
│ └── index.jsx
│ ├── editor
│ ├── constant.js
│ └── index.jsx
│ ├── footer
│ ├── footer-td.jsx
│ ├── footer-tr.jsx
│ └── index.jsx
│ ├── header
│ ├── header-checkbox-content.jsx
│ ├── header-filter-content.jsx
│ ├── header-filter-custom-content.jsx
│ ├── header-th.jsx
│ ├── header-tr.jsx
│ └── index.jsx
│ ├── index.jsx
│ ├── selection
│ ├── constant.js
│ └── index.jsx
│ └── util
│ ├── clipboard.js
│ ├── constant.js
│ ├── index.js
│ └── store.js
├── tests
└── unit
│ ├── constant.js
│ ├── setup.js
│ ├── specs
│ ├── __snapshots__
│ │ ├── ve-checkbox.spec.js.snap
│ │ ├── ve-contextmenu.spec.js.snap
│ │ ├── ve-dropdown.spec.js.snap
│ │ ├── ve-icon.spec.js.snap
│ │ ├── ve-loading.spec.js.snap
│ │ ├── ve-locale.spec.js.snap
│ │ ├── ve-pagination.spec.js.snap
│ │ ├── ve-radio.spec.js.snap
│ │ ├── ve-select.spec.js.snap
│ │ ├── ve-table-border.spec.js.snap
│ │ ├── ve-table-cell-align.spec.js.snap
│ │ ├── ve-table-cell-custom.spec.js.snap
│ │ ├── ve-table-cell-edit.spec.js.snap
│ │ ├── ve-table-cell-ellipsis.spec.js.snap
│ │ ├── ve-table-cell-selection.spec.js.snap
│ │ ├── ve-table-cell-span.spec.js.snap
│ │ ├── ve-table-cell-style.spec.js.snap
│ │ ├── ve-table-column-fixed.spec.js.snap
│ │ ├── ve-table-column-hidden.spec.js.snap
│ │ ├── ve-table-column-width.spec.js.snap
│ │ ├── ve-table-contextmenu.spec.js.snap
│ │ ├── ve-table-footer.spec.js.snap
│ │ ├── ve-table-header-filter-custom.spec.js.snap
│ │ ├── ve-table-header-filter.spec.js.snap
│ │ ├── ve-table-header-fixed.spec.js.snap
│ │ ├── ve-table-header-group.spec.js.snap
│ │ ├── ve-table-header-sort.spec.js.snap
│ │ ├── ve-table-operation-column.spec.js.snap
│ │ ├── ve-table-row-checkbox.spec.js.snap
│ │ ├── ve-table-row-expand.spec.js.snap
│ │ ├── ve-table-row-radio.spec.js.snap
│ │ ├── ve-table-row-style.spec.js.snap
│ │ └── ve-table-virtual-scroll.spec.js.snap
│ ├── ve-checkbox.spec.js
│ ├── ve-contextmenu.spec.js
│ ├── ve-dropdown.spec.js
│ ├── ve-icon.spec.js
│ ├── ve-loading.spec.js
│ ├── ve-locale.spec.js
│ ├── ve-pagination.spec.js
│ ├── ve-radio.spec.js
│ ├── ve-select.spec.js
│ ├── ve-table-border.spec.js
│ ├── ve-table-cell-align.spec.js
│ ├── ve-table-cell-custom.spec.js
│ ├── ve-table-cell-edit.spec.js
│ ├── ve-table-cell-ellipsis.spec.js
│ ├── ve-table-cell-selection-indicator.spec.js
│ ├── ve-table-cell-selection.spec.js
│ ├── ve-table-cell-span.spec.js
│ ├── ve-table-cell-style.spec.js
│ ├── ve-table-column-fixed.spec.js
│ ├── ve-table-column-hidden.spec.js
│ ├── ve-table-column-width.spec.js
│ ├── ve-table-common.spec.js
│ ├── ve-table-contextmenu.spec.js
│ ├── ve-table-custom-events.spec.js
│ ├── ve-table-footer.spec.js
│ ├── ve-table-header-filter-custom.spec.js
│ ├── ve-table-header-filter.spec.js
│ ├── ve-table-header-fixed.spec.js
│ ├── ve-table-header-group.spec.js
│ ├── ve-table-header-sort.spec.js
│ ├── ve-table-instance-methods.spec.js
│ ├── ve-table-operation-column.spec.js
│ ├── ve-table-row-checkbox.spec.js
│ ├── ve-table-row-expand.spec.js
│ ├── ve-table-row-radio.spec.js
│ ├── ve-table-row-style.spec.js
│ └── ve-table-virtual-scroll.spec.js
│ └── util.js
└── yarn.lock
/.browserslistrc:
--------------------------------------------------------------------------------
1 | > 1%
2 | last 2 versions
3 | not dead
4 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | tests/*
2 |
3 | examples/*
4 |
5 | libs/*
6 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: [Happy-Coding-Clans] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: huangshuwei # Replace with a single Patreon username
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: # ['https://www.patreon.com/huangshuwei']
13 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE.md:
--------------------------------------------------------------------------------
1 |
8 |
9 |
16 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: true
2 | contact_links:
3 | - name: Create new issue
4 | url: http://happy-coding-clans.github.io/issue-template-generater/
5 | about: The issue which is not created via http://happy-coding-clans.github.io/issue-template-generater/ will be closed immediately.
6 |
--------------------------------------------------------------------------------
/.github/workflows/sync-gitee.yml:
--------------------------------------------------------------------------------
1 | name: 🔀 Sync mirror to Gitee
2 |
3 | on:
4 | push:
5 | branches:
6 | - master
7 | - dev
8 | - 1.x
9 | - 2.x
10 | create:
11 |
12 | jobs:
13 | mirror:
14 | runs-on: ubuntu-latest
15 | if: github.repository == 'Happy-Coding-Clans/vue-easytable'
16 | steps:
17 | - name: mirror
18 | continue-on-error: true
19 | if: github.event_name == 'push' || (github.event_name == 'create' && github.event.ref_type == 'tag')
20 | uses: wearerequired/git-mirror-action@v1
21 | env:
22 | SSH_PRIVATE_KEY: ${{ secrets.GITEE_SSH_PRIVATE_KEY }}
23 | with:
24 | source-repo: 'git@github.com:Happy-Coding-Clans/vue-easytable.git'
25 | destination-repo: 'git@gitee.com:huangshuwei/vue-easytable.git'
26 |
--------------------------------------------------------------------------------
/.github/workflows/test-coverage-upload.yml:
--------------------------------------------------------------------------------
1 | name: test-coverage-upload
2 | # This workflow is triggered on pushes to the repository.
3 | on:
4 | push:
5 | branches:
6 | - master
7 | paths:
8 | - "tests/**"
9 |
10 | jobs:
11 | test:
12 | runs-on: ubuntu-latest
13 | steps:
14 | - uses: actions/checkout@master
15 | - uses: actions/setup-node@v1
16 | with:
17 | node-version: '14.x'
18 |
19 | - name: Install dependencies
20 | uses: bahmutov/npm-install@v1
21 |
22 | - name: Run test cases
23 | run: npm run test:cover
24 |
25 | - name: Upload coverage to Codecov
26 | uses: codecov/codecov-action@v2
27 | with:
28 | token: ${{ secrets.CODECOV_TOKEN }}
--------------------------------------------------------------------------------
/.github/workflows/verify-files-modify.yml:
--------------------------------------------------------------------------------
1 | name: Verify Files modify
2 |
3 | on:
4 | pull_request_target:
5 | types: [opened, edited, reopened, synchronize, ready_for_review]
6 |
7 | jobs:
8 | verify:
9 | runs-on: ubuntu-latest
10 | steps:
11 | - name: verify-version
12 | uses: actions-cool/verify-files-modify@v1.1.0
13 | with:
14 | forbid-paths: '.github/, build/'
15 | skip-verify-authority: 'write'
16 | assignees: 'huangshuwei'
17 | comment: |
18 | Hi @${{ github.event.pull_request.user.login }}. Thanks for your contribution. The path `.github/` or `scripts/` is only maintained by team members. This current PR will be closed and team members will help on this.
19 | close: true
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | dist
4 | libs/*
5 |
6 | # local env files
7 | .env.local
8 | .env.*.local
9 |
10 | # Log files
11 | debug.log
12 | npm-debug.log*
13 | yarn-debug.log*
14 | yarn-error.log*
15 | pnpm-debug.log*
16 |
17 | # Editor directories and files
18 | .idea
19 | .vscode
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
26 | # test coverage
27 | coverage
28 | tests/unit/coverage
29 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | tests/unit/coverage
2 |
3 | .github/*
4 |
5 | packages/font/*
6 |
7 | libs/*
8 |
9 | examples/dist
10 |
11 | # auto gererated by build/build-entry.js
12 | components.json
13 | packages/theme-dark/index.less
14 | packages/theme-default/index.less
15 | packages/index.js
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | comments: false,
3 | presets: [
4 | [
5 | "@babel/env",
6 | {
7 | targets: {
8 | ie: "11",
9 | edge: "17",
10 | firefox: "60",
11 | chrome: "67",
12 | safari: "11.1",
13 | },
14 | useBuiltIns: "usage",
15 | corejs: "3.6.5",
16 | },
17 | ],
18 | ],
19 | plugins: ["transform-vue-jsx"],
20 | env: {
21 | test: {
22 | // presets: [["env", { targets: { node: "current" } }]],
23 | // plugins: ["istanbul"]
24 | },
25 | },
26 | };
27 |
--------------------------------------------------------------------------------
/build/build-js.js:
--------------------------------------------------------------------------------
1 | /*
2 | build locale lang
3 | 暂未使用!!
4 | */
5 |
6 | /* const { exec } = require("child_process"); */
7 |
8 | /*
9 | compile locale lang
10 | need pkgs: @babel/cli @babel/preset-env
11 | */
12 | /* function compileLocaleLang() {
13 | exec(
14 | "babel packages/src/locale --out-dir libs/locale --presets=@babel/env --ignore packages/src/locale/index.js",
15 | (error, stdout, stderr) => {
16 | if (error) {
17 | console.error(`exec error: ${error}`);
18 | return;
19 | }
20 | console.log(`compile locale lang: \r\n${stdout}`);
21 | }
22 | );
23 | }
24 |
25 | compileLocaleLang(); */
26 |
--------------------------------------------------------------------------------
/build/build-versions.js:
--------------------------------------------------------------------------------
1 | const fse = require("fs-extra");
2 | const path = require("path");
3 |
4 | const docVersions = require("../package.json").docVersions;
5 |
6 | // build versions
7 | function buildVersions() {
8 | fse.writeFileSync(
9 | path.join(__dirname, "../examples/public/versions.json"),
10 | JSON.stringify(docVersions),
11 | );
12 | }
13 |
14 | buildVersions();
15 |
--------------------------------------------------------------------------------
/build/common/get-components.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");
3 | const themeNames = require("./themes-name");
4 |
5 | module.exports = function () {
6 | const dirs = fs.readdirSync(path.resolve(__dirname, "../../packages"));
7 | let excludes = ["font", "src", "style", "index.js"];
8 | excludes = excludes.concat(themeNames);
9 | return dirs.filter((dirName) => excludes.indexOf(dirName) === -1);
10 | };
11 |
--------------------------------------------------------------------------------
/build/common/index.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | libraryName: "VETable",
3 | };
4 |
--------------------------------------------------------------------------------
/build/common/themes-name.js:
--------------------------------------------------------------------------------
1 | module.exports = ["theme-default", "theme-dark"];
2 |
--------------------------------------------------------------------------------
/build/config.js:
--------------------------------------------------------------------------------
1 | /* webpack config */
2 | var path = require("path");
3 | var Components = require("../components.json");
4 |
5 | let externals = {
6 | vue: {
7 | root: "Vue",
8 | commonjs: "vue",
9 | commonjs2: "vue",
10 | amd: "vue",
11 | },
12 | lodash: {
13 | root: "_",
14 | commonjs: "lodash",
15 | commonjs2: "lodash",
16 | amd: "lodash",
17 | },
18 | };
19 |
20 | externals["vue-easytable/packages/src/locale/lang/en-US"] =
21 | "vue-easytable/libs/locale/lang/en-US";
22 |
23 | Object.keys(Components).forEach(function (key) {
24 | externals[`vue-easytable/packages/${key}`] = `vue-easytable/libs/${key}`;
25 | });
26 |
27 | let alias = {
28 | "vue-easytable": path.resolve(__dirname, "../"),
29 | };
30 |
31 | exports.externals = externals;
32 | exports.alias = alias;
33 |
--------------------------------------------------------------------------------
/components.json:
--------------------------------------------------------------------------------
1 |
2 | {
3 | "ve-checkbox":"./packages/ve-checkbox/index.js",
4 | "ve-checkbox-group":"./packages/ve-checkbox-group/index.js",
5 | "ve-contextmenu":"./packages/ve-contextmenu/index.js",
6 | "ve-dropdown":"./packages/ve-dropdown/index.js",
7 | "ve-icon":"./packages/ve-icon/index.js",
8 | "ve-loading":"./packages/ve-loading/index.js",
9 | "ve-locale":"./packages/ve-locale/index.js",
10 | "ve-pagination":"./packages/ve-pagination/index.js",
11 | "ve-radio":"./packages/ve-radio/index.js",
12 | "ve-select":"./packages/ve-select/index.js",
13 | "ve-table":"./packages/ve-table/index.js"
14 | }
15 |
--------------------------------------------------------------------------------
/examples/.eslintignore:
--------------------------------------------------------------------------------
1 | src/docs/**/*.md
2 |
3 | ../packages/v-*
4 |
5 | ../libs/*
--------------------------------------------------------------------------------
/examples/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | dist
4 | libs
5 |
6 | # local env files
7 | .env.local
8 | .env.*.local
9 |
10 | # Log files
11 | npm-debug.log*
12 | yarn-debug.log*
13 | yarn-error.log*
14 | pnpm-debug.log*
15 |
16 | # Editor directories and files
17 | .idea
18 | .vscode
19 | *.suo
20 | *.ntvs*
21 | *.njsproj
22 | *.sln
23 | *.sw?
24 |
--------------------------------------------------------------------------------
/examples/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 | // vue-cli 配合 @vue/babel-preset-jsx 使用。否则使用 babel-plugin-transform-vue-jsx
4 | ["@vue/babel-preset-jsx"],
5 | // 应用兼容性
6 | [
7 | "@vue/app",
8 | {
9 | useBuiltIns: "entry",
10 | corejs: 3,
11 | targets: {
12 | ie: "11",
13 | edge: "17",
14 | firefox: "60",
15 | chrome: "67",
16 | safari: "11.1",
17 | },
18 | jsx: {
19 | injectH: false,
20 | },
21 | },
22 | ],
23 | ],
24 | comments: false,
25 | plugins: [
26 | [
27 | "component",
28 | {
29 | libraryName: "element-ui",
30 | styleLibraryName: "theme-chalk",
31 | },
32 | ],
33 | ],
34 | };
35 |
--------------------------------------------------------------------------------
/examples/build/md-loader/config.js:
--------------------------------------------------------------------------------
1 | const Config = require("markdown-it-chain");
2 | const anchorPlugin = require("markdown-it-anchor");
3 | const slugify = require("transliteration").slugify;
4 | const containers = require("./containers");
5 | const overWriteFenceRule = require("./fence");
6 |
7 | const config = new Config();
8 |
9 | function renderContent(source, resourceFileName) {
10 | config.options
11 | .html(true)
12 | .end()
13 |
14 | /* .plugin("anchor")
15 | .use(anchorPlugin, [
16 | {
17 | slugify: slugify,
18 | permalink: true,
19 | permalinkBefore: true,
20 | permalinkClass: "header-anchor",
21 | permalinkSymbol: "#"
22 | }
23 | ])
24 | .end() */
25 |
26 | .plugin("containers")
27 | .use(containers, [{ resourceFileName }])
28 | .end();
29 |
30 | const md = config.toMd();
31 | overWriteFenceRule(md);
32 | return md.render(source);
33 | }
34 |
35 | module.exports = { renderContent };
36 |
--------------------------------------------------------------------------------
/examples/build/md-loader/fence.js:
--------------------------------------------------------------------------------
1 | // 覆盖默认的 fence 渲染策略
2 | module.exports = (md) => {
3 | const defaultRender = md.renderer.rules.fence;
4 |
5 | md.renderer.rules.fence = (tokens, idx, options, env, self) => {
6 | const token = tokens[idx];
7 | // 判断该 fence 是否在 :::demo 内
8 | const prevToken = tokens[idx - 1];
9 | const isInDemoContainer =
10 | prevToken &&
11 | prevToken.nesting === 1 &&
12 | prevToken.info.trim().match(/^demo\s*(.*)$/);
13 | if (token.info === "html" && isInDemoContainer) {
14 | return `
`;
17 | }
18 | return defaultRender(tokens, idx, options, env, self);
19 | };
20 |
21 | // 重写解析 table 逻辑
22 | md.renderer.rules.table_open = () => {
23 | return '${md.utils.escapeHtml(
15 | token.content,
16 | )}