From 0811cb12e170c4160c2bc4e0ed086341967a57ea Mon Sep 17 00:00:00 2001 From: ajaxzheng <894103554@qq.com> Date: Thu, 1 Aug 2024 17:45:27 +0800 Subject: [PATCH] feat: update vue-docs (#1810) --- examples/sites/demos/apis/dialog-select.js | 14 + examples/sites/demos/apis/dropdown.js | 16 + examples/sites/demos/apis/file-upload.js | 3 +- examples/sites/demos/apis/grid.js | 13 + examples/sites/demos/apis/guide.js | 2 +- examples/sites/demos/apis/input.js | 15 + examples/sites/demos/apis/tree.js | 11 + .../app/file-upload/file-size-array.vue | 19 + .../app/file-upload/file-size.vue | 76 +++ .../app/file-upload/webdoc/file-upload.js | 24 + .../mobile-first/app/grid/basic-usage.vue | 6 +- .../multiple-composition-api.vue | 226 +++++++++ .../pc/app/cascader-panel/multiple.spec.ts | 15 + .../demos/pc/app/cascader-panel/multiple.vue | 234 ++++++++++ .../cascader-panel/webdoc/cascader-panel.js | 12 + .../highlight-query/avoid-composition-api.vue | 52 +++ .../directives/highlight-query/avoid.spec.js | 15 + .../app/directives/highlight-query/avoid.vue | 65 +++ .../basic-usage-composition-api.vue | 31 ++ .../highlight-query/basic-usage.spec.js | 12 + .../highlight-query/basic-usage.vue | 40 ++ .../webdoc/directives-highlight-query.cn.md | 7 + .../webdoc/directives-highlight-query.en.md | 7 + .../webdoc/directives-highlight-query.js | 39 ++ .../lazy-show-popper-composition-api.vue | 43 ++ .../pc/app/dropdown/lazy-show-popper.spec.ts | 20 + .../pc/app/dropdown/lazy-show-popper.vue | 47 ++ .../demos/pc/app/dropdown/webdoc/dropdown.js | 13 + .../pc/app/file-upload/file-size-array.vue | 85 ++++ .../demos/pc/app/file-upload/file-size.vue | 78 ++++ .../pc/app/file-upload/webdoc/file-upload.js | 24 + ...olumn-switching-scroll-composition-api.vue | 81 ++++ .../column-switching-scroll.spec.js | 14 + .../column-switching-scroll.vue | 89 ++++ .../grid/webdoc/grid-dynamically-columns.js | 12 + .../sites/demos/pc/app/icon/iconGroups.js | 435 +++++++++++------- .../demos/pc/app/input/basic-usage.spec.ts | 2 +- .../input/show-tooltip-composition-api.vue | 27 ++ .../demos/pc/app/input/show-tooltip.spec.ts | 10 + .../sites/demos/pc/app/input/show-tooltip.vue | 34 ++ .../sites/demos/pc/app/input/webdoc/input.js | 13 + .../popup-style-position-composition-api.vue | 3 +- .../pc/app/select/popup-style-position.vue | 3 +- .../app/slider/about-step-composition-api.vue | 6 + .../sites/demos/pc/app/slider/about-step.vue | 6 + .../slider/basic-usage-composition-api.vue | 6 + .../sites/demos/pc/app/slider/basic-usage.vue | 6 + .../dynamic-disable-composition-api.vue | 6 + .../demos/pc/app/slider/dynamic-disable.vue | 6 + .../slider/format-tooltip-composition-api.vue | 6 + .../demos/pc/app/slider/format-tooltip.vue | 6 + .../pc/app/slider/marks-composition-api.vue | 12 +- examples/sites/demos/pc/app/slider/marks.vue | 12 +- .../pc/app/slider/max-min-composition-api.vue | 6 + .../sites/demos/pc/app/slider/max-min.vue | 6 + .../slider/range-select-composition-api.vue | 6 + .../demos/pc/app/slider/range-select.vue | 6 + .../shortcut-operation-composition-api.vue | 6 + .../pc/app/slider/shortcut-operation.vue | 6 + .../app/slider/show-input-composition-api.vue | 6 + .../{show-iput.spec.ts => show-input.spec.ts} | 0 .../sites/demos/pc/app/slider/show-input.vue | 6 + .../app/slider/show-tip-composition-api.vue | 6 + .../sites/demos/pc/app/slider/show-tip.vue | 6 + .../slider/slider-event-composition-api.vue | 6 + .../demos/pc/app/slider/slider-event.vue | 6 + .../slider/slider-slot-composition-api.vue | 6 + .../sites/demos/pc/app/slider/slider-slot.vue | 6 + .../slider/vertical-mode-composition-api.vue | 6 + .../demos/pc/app/slider/vertical-mode.vue | 6 + .../pc/app/time-picker/default-value.spec.ts | 2 +- .../pc/app/time-picker/picker-options.spec.ts | 7 +- .../app/tree/filter-view-composition-api.vue | 9 + .../demos/pc/app/tree/filter-view.spec.ts | 8 + .../sites/demos/pc/app/tree/filter-view.vue | 9 + .../sites/demos/pc/app/tree/webdoc/tree.js | 2 + examples/sites/demos/pc/menus.js | 5 +- .../src/assets/images/Infinitely-icon.png | Bin 0 -> 492 bytes .../sites/src/assets/images/Infinitely.png | Bin 0 -> 15869 bytes .../sites/src/assets/images/glaciers-icon.png | Bin 0 -> 246 bytes examples/sites/src/assets/images/glaciers.png | Bin 0 -> 13037 bytes .../sites/src/assets/images/oceanic-icon.png | Bin 0 -> 245 bytes examples/sites/src/assets/images/oceanic.png | Bin 0 -> 22790 bytes .../src/assets/images/starry-sky-icon.png | Bin 0 -> 1233 bytes .../sites/src/assets/images/starry-sky.png | Bin 0 -> 20856 bytes examples/sites/src/i18n/en.json | 6 +- examples/sites/src/i18n/zh.json | 6 +- examples/sites/src/tools/appData.js | 17 +- examples/sites/src/tools/useApiMode.js | 5 + examples/sites/src/tools/useStyleSettings.js | 16 + examples/sites/src/tools/useTheme.js | 43 +- .../src/views/components/float-settings.vue | 222 +++++---- packages/design/smb/index.ts | 4 + packages/design/smb/src/time-spinner/index.ts | 6 + packages/modules.json | 5 - .../src/common/deps/clickoutside.ts | 17 +- .../renderless/src/common/deps/useRelation.ts | 38 +- packages/renderless/src/dialog-box/index.ts | 2 +- .../renderless/src/dialog-select/index.ts | 57 ++- packages/renderless/src/dialog-select/vue.ts | 6 +- .../renderless/src/dropdown-menu/index.ts | 4 + packages/renderless/src/dropdown-menu/vue.ts | 9 +- packages/renderless/src/file-upload/index.ts | 12 +- packages/renderless/src/guide/index.ts | 8 +- packages/renderless/src/input/index.ts | 23 + packages/renderless/src/input/vue.ts | 15 +- packages/renderless/src/option/index.ts | 20 - packages/renderless/src/option/vue.ts | 15 +- packages/renderless/src/pager-item/index.ts | 12 +- packages/renderless/src/picker/index.ts | 2 +- .../src/slider-button-group/index.ts | 65 ++- .../renderless/src/slider-button-group/vue.ts | 50 +- .../renderless/src/slider-button/index.ts | 12 +- packages/renderless/src/slider-button/vue.ts | 9 +- packages/renderless/src/tab-item-mf/vue.ts | 9 +- packages/renderless/src/tabs-mf/index.ts | 84 +++- packages/renderless/src/tabs-mf/vue-bar.ts | 7 - packages/renderless/src/tabs-mf/vue-swipe.ts | 20 + packages/renderless/src/tabs-mf/vue.ts | 32 +- packages/renderless/src/time-line/index.ts | 4 +- packages/renderless/src/time-spinner/index.ts | 5 +- packages/renderless/src/time-spinner/vue.ts | 8 +- packages/renderless/src/time/index.ts | 10 +- packages/renderless/src/time/vue.ts | 13 +- packages/renderless/src/tree/index.ts | 2 + packages/renderless/src/tree/vue.ts | 4 +- .../theme-saas/src/month-table/index.less | 7 + packages/theme-saas/src/split/index.less | 8 +- packages/theme-saas/src/steps/index.less | 34 +- packages/theme-saas/src/svgs/angle-left.svg | 11 + packages/theme-saas/src/svgs/angle-right.svg | 11 + packages/theme-saas/src/svgs/config.svg | 27 ++ packages/theme-saas/src/svgs/creating.svg | 11 + packages/theme-saas/src/svgs/del.svg | 11 +- packages/theme-saas/src/svgs/delete-l.svg | 17 + packages/theme-saas/src/svgs/delete.svg | 15 + packages/theme-saas/src/svgs/discount-sup.svg | 15 + packages/theme-saas/src/svgs/document.svg | 13 + packages/theme-saas/src/svgs/editor.svg | 23 + packages/theme-saas/src/svgs/filter.svg | 14 + packages/theme-saas/src/svgs/folder.svg | 13 + packages/theme-saas/src/svgs/freeze.svg | 11 + packages/theme-saas/src/svgs/go-back.svg | 16 + packages/theme-saas/src/svgs/location.svg | 13 + packages/theme-saas/src/svgs/operation.svg | 11 + packages/theme-saas/src/svgs/refresh.svg | 14 + packages/theme-saas/src/svgs/sold-out.svg | 18 + packages/theme-saas/src/svgs/steps-error.svg | 14 + .../theme-saas/src/svgs/stretch-crosswise.svg | 12 + .../theme-saas/src/svgs/stretch-upright.svg | 12 + packages/theme-saas/src/tree/index.less | 3 +- packages/theme/src/anchor/index.less | 26 +- packages/theme/src/anchor/smb-theme.js | 7 +- packages/theme/src/anchor/vars.less | 4 + packages/theme/src/base/reset.less | 9 +- packages/theme/src/cascader-node/smb-theme.js | 25 +- packages/theme/src/date-table/index.less | 23 +- packages/theme/src/date-table/smb-theme.js | 5 +- packages/theme/src/date-table/vars.less | 3 + packages/theme/src/guide/index.less | 3 +- packages/theme/src/guide/smb-theme.js | 38 +- packages/theme/src/guide/vars.less | 4 + packages/theme/src/link/index.less | 26 +- packages/theme/src/picker/index.less | 38 +- packages/theme/src/progress/smb-theme.js | 3 +- packages/theme/src/select/index.less | 10 +- packages/theme/src/svgs/add-circle.svg | 37 +- packages/theme/src/svgs/add-picture.svg | 22 +- packages/theme/src/svgs/angle-left.svg | 11 + packages/theme/src/svgs/angle-right.svg | 11 + packages/theme/src/svgs/calendar.svg | 40 +- packages/theme/src/svgs/chevron-left.svg | 26 +- packages/theme/src/svgs/chevron-right.svg | 26 +- packages/theme/src/svgs/close.svg | 27 +- packages/theme/src/svgs/config.svg | 27 ++ packages/theme/src/svgs/creating.svg | 11 + packages/theme/src/svgs/delete-l.svg | 17 + packages/theme/src/svgs/delete.svg | 15 + packages/theme/src/svgs/discount-sup.svg | 15 + packages/theme/src/svgs/document.svg | 13 + packages/theme/src/svgs/double-left.svg | 30 +- packages/theme/src/svgs/double-right.svg | 30 +- packages/theme/src/svgs/editor.svg | 23 + packages/theme/src/svgs/expand.svg | 18 +- packages/theme/src/svgs/eyeclose.svg | 30 +- packages/theme/src/svgs/eyeopen.svg | 39 +- .../theme/src/svgs/fillet-external-link.svg | 37 +- packages/theme/src/svgs/filter.svg | 14 + packages/theme/src/svgs/folder.svg | 13 + packages/theme/src/svgs/freeze.svg | 11 + packages/theme/src/svgs/go-back.svg | 16 + packages/theme/src/svgs/help.svg | 28 +- packages/theme/src/svgs/location.svg | 13 + packages/theme/src/svgs/minus.svg | 23 +- packages/theme/src/svgs/on-going-mini.svg | 19 +- packages/theme/src/svgs/operation.svg | 11 + packages/theme/src/svgs/operationfaild.svg | 30 +- packages/theme/src/svgs/plus.svg | 25 +- packages/theme/src/svgs/put-away.svg | 20 +- packages/theme/src/svgs/refresh.svg | 14 + packages/theme/src/svgs/search.svg | 29 +- packages/theme/src/svgs/sold-out.svg | 18 + .../src/svgs/sort-triangle-ascending.svg | 22 +- .../src/svgs/sort-triangle-descending.svg | 22 +- packages/theme/src/svgs/sort-triangle.svg | 18 +- packages/theme/src/svgs/star-active.svg | 31 +- packages/theme/src/svgs/steps-error.svg | 14 + packages/theme/src/svgs/stretch-crosswise.svg | 12 + packages/theme/src/svgs/stretch-upright.svg | 12 + packages/theme/src/svgs/stretch.svg | 59 +-- packages/theme/src/svgs/success.svg | 21 +- packages/theme/src/svgs/time.svg | 28 +- packages/theme/src/svgs/triangle-down.svg | 16 +- packages/theme/src/svgs/up-ward.svg | 11 +- packages/theme/src/svgs/warning-triangle.svg | 21 +- packages/theme/src/svgs/yes.svg | 25 +- packages/theme/src/time-panel/index.less | 30 +- packages/theme/src/time-panel/smb-theme.js | 9 + packages/theme/src/time-panel/vars.less | 7 +- packages/theme/src/time-range/index.less | 2 +- packages/theme/src/time-select/index.less | 9 +- packages/theme/src/time-select/smb-theme.js | 5 +- packages/theme/src/time-select/vars.less | 2 + packages/theme/src/time-spinner/index.less | 14 +- packages/theme/src/time-spinner/smb-theme.js | 12 + packages/theme/src/time-spinner/vars.less | 6 + packages/vue-common/src/csscls.ts | 57 ++- packages/vue-common/src/index.ts | 3 +- packages/vue-directive/index.ts | 3 +- packages/vue-directive/src/highlight-query.ts | 124 +++++ packages/vue-icon-saas/index.ts | 80 ++++ packages/vue-icon/index.ts | 80 ++++ packages/vue-icon/src/angle-left/index.ts | 15 + packages/vue-icon/src/angle-right/index.ts | 15 + packages/vue-icon/src/config/index.ts | 15 + packages/vue-icon/src/creating/index.ts | 15 + packages/vue-icon/src/delete-l/index.ts | 15 + packages/vue-icon/src/delete/index.ts | 15 + packages/vue-icon/src/discount-sup/index.ts | 15 + packages/vue-icon/src/document/index.ts | 15 + packages/vue-icon/src/editor/index.ts | 15 + packages/vue-icon/src/filter/index.ts | 15 + packages/vue-icon/src/folder/index.ts | 15 + packages/vue-icon/src/freeze/index.ts | 15 + packages/vue-icon/src/go-back/index.ts | 15 + packages/vue-icon/src/location/index.ts | 15 + packages/vue-icon/src/operation/index.ts | 15 + packages/vue-icon/src/refresh/index.ts | 15 + packages/vue-icon/src/sold-out/index.ts | 15 + packages/vue-icon/src/steps-error/index.ts | 15 + .../vue-icon/src/stretch-crosswise/index.ts | 15 + .../vue-icon/src/stretch-upright/index.ts | 15 + packages/vue-locale/src/lang/en.ts | 4 + packages/vue-locale/src/lang/zh-CN.ts | 4 + .../vue/src/checkbox/src/mobile-first.vue | 2 +- .../vue/src/date-panel/src/mobile-first.vue | 15 +- packages/vue/src/date-table/src/pc.vue | 2 +- packages/vue/src/dialog-box/src/pc.vue | 1 - packages/vue/src/dialog-select/src/pc.vue | 8 +- .../src/dropdown-menu/src/mobile-first.vue | 4 +- packages/vue/src/dropdown-menu/src/pc.vue | 30 +- packages/vue/src/dropdown/src/index.ts | 6 +- .../vue/src/dropdown/src/mobile-first.vue | 4 + packages/vue/src/dropdown/src/pc.vue | 6 +- packages/vue/src/file-upload/src/index.ts | 1 + .../vue/src/file-upload/src/mobile-first.vue | 20 +- packages/vue/src/file-upload/src/pc.vue | 42 +- packages/vue/src/form-item/src/pc.vue | 30 +- .../vue/src/grid-toolbar/src/custom-saas.vue | 11 +- packages/vue/src/grid-toolbar/src/index.ts | 8 +- packages/vue/src/grid/src/body/src/body.tsx | 4 +- packages/vue/src/grid/src/cell/src/cell.ts | 6 +- .../src/grid/src/composable/useDrag/dnd.ts | 2 +- packages/vue/src/grid/src/config.ts | 4 +- .../src/grid/src/fetch-data/src/methods.ts | 11 +- packages/vue/src/grid/src/grid/grid.ts | 5 +- .../src/grid/src/mobile-first/custom-view.vue | 21 + .../vue/src/grid/src/mobile-first/index.vue | 38 +- .../vue/src/grid/src/pager/src/methods.ts | 6 +- .../vue/src/grid/src/table/src/methods.ts | 104 ++++- packages/vue/src/grid/src/table/src/table.ts | 26 +- .../src/table/src/utils/computeScrollLoad.ts | 10 +- packages/vue/src/input/src/index.ts | 4 + packages/vue/src/input/src/mobile-first.vue | 29 +- packages/vue/src/input/src/pc.vue | 13 +- packages/vue/src/option/package.json | 19 +- packages/vue/src/option/src/mobile-first.vue | 4 +- packages/vue/src/option/src/pc.vue | 9 +- .../vue/src/pager-item/src/mobile-first.vue | 2 + packages/vue/src/pager-item/src/pc.vue | 2 + .../slider-button-group/src/mobile-first.vue | 8 +- .../vue/src/tab-item/src/mobile-first.vue | 5 +- packages/vue/src/tabs/src/mobile-first.vue | 2 +- .../tabs/src/mobile-first/tab-nav-item.vue | 3 +- .../src/tabs/src/mobile-first/tab-swipe.vue | 45 +- packages/vue/src/time/src/pc.vue | 32 +- packages/vue/src/tooltip/src/pc.vue | 34 +- packages/vue/src/tree/package.json | 35 +- packages/vue/src/tree/src/index.ts | 12 +- packages/vue/src/tree/src/pc.vue | 13 +- packages/vue/src/tree/src/tree-node.vue | 17 +- packages/vue/src/upload/src/index.ts | 4 + packages/vue/src/upload/src/mobile-first.vue | 63 ++- packages/vue/src/upload/src/pc.vue | 2 - packages/vue/src/user/src/pc.vue | 4 +- 305 files changed, 5013 insertions(+), 1306 deletions(-) create mode 100644 examples/sites/demos/mobile-first/app/file-upload/file-size-array.vue create mode 100644 examples/sites/demos/mobile-first/app/file-upload/file-size.vue create mode 100644 examples/sites/demos/pc/app/cascader-panel/multiple-composition-api.vue create mode 100644 examples/sites/demos/pc/app/cascader-panel/multiple.spec.ts create mode 100644 examples/sites/demos/pc/app/cascader-panel/multiple.vue create mode 100644 examples/sites/demos/pc/app/directives/highlight-query/avoid-composition-api.vue create mode 100644 examples/sites/demos/pc/app/directives/highlight-query/avoid.spec.js create mode 100644 examples/sites/demos/pc/app/directives/highlight-query/avoid.vue create mode 100644 examples/sites/demos/pc/app/directives/highlight-query/basic-usage-composition-api.vue create mode 100644 examples/sites/demos/pc/app/directives/highlight-query/basic-usage.spec.js create mode 100644 examples/sites/demos/pc/app/directives/highlight-query/basic-usage.vue create mode 100644 examples/sites/demos/pc/app/directives/webdoc/directives-highlight-query.cn.md create mode 100644 examples/sites/demos/pc/app/directives/webdoc/directives-highlight-query.en.md create mode 100644 examples/sites/demos/pc/app/directives/webdoc/directives-highlight-query.js create mode 100644 examples/sites/demos/pc/app/dropdown/lazy-show-popper-composition-api.vue create mode 100644 examples/sites/demos/pc/app/dropdown/lazy-show-popper.spec.ts create mode 100644 examples/sites/demos/pc/app/dropdown/lazy-show-popper.vue create mode 100644 examples/sites/demos/pc/app/file-upload/file-size-array.vue create mode 100644 examples/sites/demos/pc/app/file-upload/file-size.vue create mode 100644 examples/sites/demos/pc/app/grid/dynamically-columns/column-switching-scroll-composition-api.vue create mode 100644 examples/sites/demos/pc/app/grid/dynamically-columns/column-switching-scroll.spec.js create mode 100644 examples/sites/demos/pc/app/grid/dynamically-columns/column-switching-scroll.vue create mode 100644 examples/sites/demos/pc/app/input/show-tooltip-composition-api.vue create mode 100644 examples/sites/demos/pc/app/input/show-tooltip.spec.ts create mode 100644 examples/sites/demos/pc/app/input/show-tooltip.vue rename examples/sites/demos/pc/app/slider/{show-iput.spec.ts => show-input.spec.ts} (100%) create mode 100644 examples/sites/src/assets/images/Infinitely-icon.png create mode 100644 examples/sites/src/assets/images/Infinitely.png create mode 100644 examples/sites/src/assets/images/glaciers-icon.png create mode 100644 examples/sites/src/assets/images/glaciers.png create mode 100644 examples/sites/src/assets/images/oceanic-icon.png create mode 100644 examples/sites/src/assets/images/oceanic.png create mode 100644 examples/sites/src/assets/images/starry-sky-icon.png create mode 100644 examples/sites/src/assets/images/starry-sky.png create mode 100644 packages/design/smb/src/time-spinner/index.ts create mode 100644 packages/renderless/src/tabs-mf/vue-swipe.ts create mode 100644 packages/theme-saas/src/svgs/angle-left.svg create mode 100644 packages/theme-saas/src/svgs/angle-right.svg create mode 100644 packages/theme-saas/src/svgs/config.svg create mode 100644 packages/theme-saas/src/svgs/creating.svg create mode 100644 packages/theme-saas/src/svgs/delete-l.svg create mode 100644 packages/theme-saas/src/svgs/delete.svg create mode 100644 packages/theme-saas/src/svgs/discount-sup.svg create mode 100644 packages/theme-saas/src/svgs/document.svg create mode 100644 packages/theme-saas/src/svgs/editor.svg create mode 100644 packages/theme-saas/src/svgs/filter.svg create mode 100644 packages/theme-saas/src/svgs/folder.svg create mode 100644 packages/theme-saas/src/svgs/freeze.svg create mode 100644 packages/theme-saas/src/svgs/go-back.svg create mode 100644 packages/theme-saas/src/svgs/location.svg create mode 100644 packages/theme-saas/src/svgs/operation.svg create mode 100644 packages/theme-saas/src/svgs/refresh.svg create mode 100644 packages/theme-saas/src/svgs/sold-out.svg create mode 100644 packages/theme-saas/src/svgs/steps-error.svg create mode 100644 packages/theme-saas/src/svgs/stretch-crosswise.svg create mode 100644 packages/theme-saas/src/svgs/stretch-upright.svg create mode 100644 packages/theme/src/svgs/angle-left.svg create mode 100644 packages/theme/src/svgs/angle-right.svg create mode 100644 packages/theme/src/svgs/config.svg create mode 100644 packages/theme/src/svgs/creating.svg create mode 100644 packages/theme/src/svgs/delete-l.svg create mode 100644 packages/theme/src/svgs/delete.svg create mode 100644 packages/theme/src/svgs/discount-sup.svg create mode 100644 packages/theme/src/svgs/document.svg create mode 100644 packages/theme/src/svgs/editor.svg create mode 100644 packages/theme/src/svgs/filter.svg create mode 100644 packages/theme/src/svgs/folder.svg create mode 100644 packages/theme/src/svgs/freeze.svg create mode 100644 packages/theme/src/svgs/go-back.svg create mode 100644 packages/theme/src/svgs/location.svg create mode 100644 packages/theme/src/svgs/operation.svg create mode 100644 packages/theme/src/svgs/refresh.svg create mode 100644 packages/theme/src/svgs/sold-out.svg create mode 100644 packages/theme/src/svgs/steps-error.svg create mode 100644 packages/theme/src/svgs/stretch-crosswise.svg create mode 100644 packages/theme/src/svgs/stretch-upright.svg create mode 100644 packages/theme/src/time-panel/smb-theme.js create mode 100644 packages/theme/src/time-spinner/smb-theme.js create mode 100644 packages/vue-directive/src/highlight-query.ts create mode 100644 packages/vue-icon/src/angle-left/index.ts create mode 100644 packages/vue-icon/src/angle-right/index.ts create mode 100644 packages/vue-icon/src/config/index.ts create mode 100644 packages/vue-icon/src/creating/index.ts create mode 100644 packages/vue-icon/src/delete-l/index.ts create mode 100644 packages/vue-icon/src/delete/index.ts create mode 100644 packages/vue-icon/src/discount-sup/index.ts create mode 100644 packages/vue-icon/src/document/index.ts create mode 100644 packages/vue-icon/src/editor/index.ts create mode 100644 packages/vue-icon/src/filter/index.ts create mode 100644 packages/vue-icon/src/folder/index.ts create mode 100644 packages/vue-icon/src/freeze/index.ts create mode 100644 packages/vue-icon/src/go-back/index.ts create mode 100644 packages/vue-icon/src/location/index.ts create mode 100644 packages/vue-icon/src/operation/index.ts create mode 100644 packages/vue-icon/src/refresh/index.ts create mode 100644 packages/vue-icon/src/sold-out/index.ts create mode 100644 packages/vue-icon/src/steps-error/index.ts create mode 100644 packages/vue-icon/src/stretch-crosswise/index.ts create mode 100644 packages/vue-icon/src/stretch-upright/index.ts create mode 100644 packages/vue/src/grid/src/mobile-first/custom-view.vue diff --git a/examples/sites/demos/apis/dialog-select.js b/examples/sites/demos/apis/dialog-select.js index 652492222..c59d30a0d 100644 --- a/examples/sites/demos/apis/dialog-select.js +++ b/examples/sites/demos/apis/dialog-select.js @@ -434,6 +434,20 @@ export default { mode: ['pc'], pcDemo: '' }, + { + name: 'footer-buttons', + type: 'Slot', + defaultValue: '', + desc: { + 'zh-CN': '自定义弹窗底部按钮', + 'en-US': 'Custom Pop Up Bottom buttons' + }, + metaData: { + new: '3.18.0' + }, + mode: ['pc'], + pcDemo: '' + }, { name: 'option', type: 'Slot', diff --git a/examples/sites/demos/apis/dropdown.js b/examples/sites/demos/apis/dropdown.js index eb85d5092..87624dcdf 100644 --- a/examples/sites/demos/apis/dropdown.js +++ b/examples/sites/demos/apis/dropdown.js @@ -228,6 +228,22 @@ export default { }, mode: ['pc'], pcDemo: 'visible-arrow' + }, + { + name: 'lazy-show-popper', + type: 'boolean', + defaultValue: 'false', + desc: { + 'zh-CN': '是否懒加载下拉菜单及内部的项,以优化性能,默认初始全加载菜单及内部项。', + 'en-US': + 'Indicates whether to lazily load the drop-down menu and internal items to optimize performance. The default value is false. The menu and internal items are loaded initially.' + }, + mode: ['pc', 'mobile-first'], + pcDemo: 'lazy-show-popper', + mfDemo: '', + metaData: { + experimental: '3.18.0' + } } ], events: [ diff --git a/examples/sites/demos/apis/file-upload.js b/examples/sites/demos/apis/file-upload.js index 0b4fa48a1..ced644b7b 100644 --- a/examples/sites/demos/apis/file-upload.js +++ b/examples/sites/demos/apis/file-upload.js @@ -262,7 +262,8 @@ export default { 'zh-CN': '限制文件大小,单位为 KB;当为 Number 类型时,小于该值停止上传;为数组时[min,max] 设置上传范围', 'en-US': '' }, - mode: ['mobile-first'], + mode: ['pc', 'mobile-first'], + pcDemo: 'file-size', mfDemo: '' }, { diff --git a/examples/sites/demos/apis/grid.js b/examples/sites/demos/apis/grid.js index f883c38d6..d0c60e882 100644 --- a/examples/sites/demos/apis/grid.js +++ b/examples/sites/demos/apis/grid.js @@ -1073,6 +1073,19 @@ export default { } ], events: [ + { + name: 'after-refresh-column', + type: '()=> void', + defaultValue: '', + desc: { + 'zh-CN': '在新增或者删除列后,列配置是异步更新的,列配置刷新后触发的回调', + 'en-US': + 'After adding or deleting a column, the column configuration is updated asynchronously, and the callback is triggered after the column configuration is refreshed.' + }, + mode: ['pc', 'mobile-first'], + pcDemo: 'grid-dynamically-columns#column-switching-scroll', + mfDemo: '' + }, { name: 'before-page-change', typeAnchorName: 'IBeforePageChangeArgs', diff --git a/examples/sites/demos/apis/guide.js b/examples/sites/demos/apis/guide.js index a8159384c..6d973be0b 100644 --- a/examples/sites/demos/apis/guide.js +++ b/examples/sites/demos/apis/guide.js @@ -175,7 +175,7 @@ interface IDomData { //销毁的回调函数 destroy: () => void // 完成的回调函数 - completey: () => void + complete: () => void // 需要设置的按钮组 button: { diff --git a/examples/sites/demos/apis/input.js b/examples/sites/demos/apis/input.js index 415a6ce86..1c64313ca 100644 --- a/examples/sites/demos/apis/input.js +++ b/examples/sites/demos/apis/input.js @@ -396,6 +396,21 @@ export default { mobileDemo: 'counter', mfDemo: '' }, + { + name: 'show-tooltip', + type: 'boolean', + defaultValue: 'true', + metaData: { + new: '3.18.0' + }, + desc: { + 'zh-CN': '只读状态下,文本超出是否悬浮提示', + 'en-US': 'In the read-only state, whether the text exceeds the floating prompt' + }, + mode: ['pc', 'mobile-first'], + pcDemo: 'size', + mfDemo: '' + }, { name: 'size', type: "'medium' | 'small' | 'mini'", diff --git a/examples/sites/demos/apis/tree.js b/examples/sites/demos/apis/tree.js index bd9ada2b5..b4a762026 100644 --- a/examples/sites/demos/apis/tree.js +++ b/examples/sites/demos/apis/tree.js @@ -491,6 +491,17 @@ export default { }, mode: ['pc'], pcDemo: 'edit' + }, + { + name: 'highlight-query', + type: 'boolean', + defaultValue: 'false', + desc: { + 'zh-CN': '通过 highlightQuery 属性,是否在匹配的节点中,高亮搜索文字。
', + 'en-US': 'Indicates whether to highlight the search text in the matched node.' + }, + mode: ['pc'], + pcDemo: 'filter-view' } ], events: [ diff --git a/examples/sites/demos/mobile-first/app/file-upload/file-size-array.vue b/examples/sites/demos/mobile-first/app/file-upload/file-size-array.vue new file mode 100644 index 000000000..68e6ec2cd --- /dev/null +++ b/examples/sites/demos/mobile-first/app/file-upload/file-size-array.vue @@ -0,0 +1,19 @@ + + + diff --git a/examples/sites/demos/mobile-first/app/file-upload/file-size.vue b/examples/sites/demos/mobile-first/app/file-upload/file-size.vue new file mode 100644 index 000000000..421ce9c3a --- /dev/null +++ b/examples/sites/demos/mobile-first/app/file-upload/file-size.vue @@ -0,0 +1,76 @@ + + + diff --git a/examples/sites/demos/mobile-first/app/file-upload/webdoc/file-upload.js b/examples/sites/demos/mobile-first/app/file-upload/webdoc/file-upload.js index 8d7993fe5..c97bea825 100644 --- a/examples/sites/demos/mobile-first/app/file-upload/webdoc/file-upload.js +++ b/examples/sites/demos/mobile-first/app/file-upload/webdoc/file-upload.js @@ -38,6 +38,30 @@ export default { }, codeFiles: ['file-list.vue'] }, + { + demoId: 'file-size', + name: { + 'zh-CN': '上传的文件大小限制', + 'en-US': 'Uploaded file size limit' + }, + desc: { + 'zh-CN': '

通过 file-size 配置上传文件的大小。

', + 'en-US': '

Use file-size to configure the size of the uploaded file.

' + }, + codeFiles: ['file-size.vue'] + }, + { + demoId: 'file-size-array', + name: { + 'zh-CN': '上传的文件大小范围', + 'en-US': 'Uploaded file size range' + }, + desc: { + 'zh-CN': '

通过 file-size 配置为数组类型限制上传文件的大小范围。

', + 'en-US': '

Set file-size to an array to limit the size of the file to be uploaded.

' + }, + codeFiles: ['file-size-array.vue'] + }, { demoId: 'show-title', name: { diff --git a/examples/sites/demos/mobile-first/app/grid/basic-usage.vue b/examples/sites/demos/mobile-first/app/grid/basic-usage.vue index 98ce58af1..b4c9a2d09 100644 --- a/examples/sites/demos/mobile-first/app/grid/basic-usage.vue +++ b/examples/sites/demos/mobile-first/app/grid/basic-usage.vue @@ -5,6 +5,7 @@ 卡片视图 列表视图 甘特视图 + custom视图 + diff --git a/examples/sites/demos/pc/app/cascader-panel/multiple-composition-api.vue b/examples/sites/demos/pc/app/cascader-panel/multiple-composition-api.vue new file mode 100644 index 000000000..1e89bcd76 --- /dev/null +++ b/examples/sites/demos/pc/app/cascader-panel/multiple-composition-api.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/examples/sites/demos/pc/app/cascader-panel/multiple.spec.ts b/examples/sites/demos/pc/app/cascader-panel/multiple.spec.ts new file mode 100644 index 000000000..2330c49ba --- /dev/null +++ b/examples/sites/demos/pc/app/cascader-panel/multiple.spec.ts @@ -0,0 +1,15 @@ +import { test, expect } from '@playwright/test' + +test('多选', async ({ page }) => { + page.on('pageerror', (exception) => expect(exception).toBeNull()) + await page.goto('cascader-panel#multiple') + const multipleText1 = page.getByText( + '选中值:[ [ "zhinan", "anzhuang", "xiangmudengji" ], [ "zhinan", "anzhuang", "huanjingzhunbei" ], [ "zhinan", "anzhuang", "anzhuangcli" ], [ "zhinan", "kaifa", "monishuju" ] ]' + ) + await expect(multipleText1).toBeVisible() + await page.getByRole('menuitem', { name: '创建项目' }).locator('span').nth(1).click() + const multipleText2 = page.getByText( + '选中值:[ [ "zhinan", "anzhuang", "xiangmudengji" ], [ "zhinan", "anzhuang", "huanjingzhunbei" ], [ "zhinan", "anzhuang", "anzhuangcli" ], [ "zhinan", "anzhuang", "chuangjianxiangmu" ], [ "zhinan", "kaifa", "monishuju" ] ]' + ) + await expect(multipleText2).toBeVisible() +}) diff --git a/examples/sites/demos/pc/app/cascader-panel/multiple.vue b/examples/sites/demos/pc/app/cascader-panel/multiple.vue new file mode 100644 index 000000000..168d0896f --- /dev/null +++ b/examples/sites/demos/pc/app/cascader-panel/multiple.vue @@ -0,0 +1,234 @@ + + + + + diff --git a/examples/sites/demos/pc/app/cascader-panel/webdoc/cascader-panel.js b/examples/sites/demos/pc/app/cascader-panel/webdoc/cascader-panel.js index ac6059068..d36421abf 100644 --- a/examples/sites/demos/pc/app/cascader-panel/webdoc/cascader-panel.js +++ b/examples/sites/demos/pc/app/cascader-panel/webdoc/cascader-panel.js @@ -30,6 +30,18 @@ export default { }, codeFiles: ['custom-option-content.vue'] }, + { + demoId: 'multiple', + name: { + 'zh-CN': '多选', + 'en-US': 'Multiple Choices' + }, + desc: { + 'zh-CN': '

通过 props.multiple = true 来开启多选模式。

\n', + 'en-US': '

Use props.multiple = true to enable the multi-selection mode.

\n' + }, + codeFiles: ['multiple.vue'] + }, { demoId: 'cascader-panel-props', name: { diff --git a/examples/sites/demos/pc/app/directives/highlight-query/avoid-composition-api.vue b/examples/sites/demos/pc/app/directives/highlight-query/avoid-composition-api.vue new file mode 100644 index 000000000..fe88e4bc1 --- /dev/null +++ b/examples/sites/demos/pc/app/directives/highlight-query/avoid-composition-api.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/examples/sites/demos/pc/app/directives/highlight-query/avoid.spec.js b/examples/sites/demos/pc/app/directives/highlight-query/avoid.spec.js new file mode 100644 index 000000000..27f9058d5 --- /dev/null +++ b/examples/sites/demos/pc/app/directives/highlight-query/avoid.spec.js @@ -0,0 +1,15 @@ +import { test, expect } from '@playwright/test' + +test('避免用法', async ({ page }) => { + page.on('pageerror', (exception) => expect(exception).toBeNull()) + await page.goto('directives-highlight-query#avoid') + + const input = page.locator('.pc-demo-container .tiny-input-inner').first() + const hlNode = page.locator('.pc-demo-container .tiny-hl-query-node') + const button = page.locator('.pc-demo-container .tiny-button') + + await expect(hlNode).toHaveCount(12) + + await button.click() + await expect(hlNode).toHaveCount(6) +}) diff --git a/examples/sites/demos/pc/app/directives/highlight-query/avoid.vue b/examples/sites/demos/pc/app/directives/highlight-query/avoid.vue new file mode 100644 index 000000000..b097af80a --- /dev/null +++ b/examples/sites/demos/pc/app/directives/highlight-query/avoid.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/examples/sites/demos/pc/app/directives/highlight-query/basic-usage-composition-api.vue b/examples/sites/demos/pc/app/directives/highlight-query/basic-usage-composition-api.vue new file mode 100644 index 000000000..e4847734c --- /dev/null +++ b/examples/sites/demos/pc/app/directives/highlight-query/basic-usage-composition-api.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/examples/sites/demos/pc/app/directives/highlight-query/basic-usage.spec.js b/examples/sites/demos/pc/app/directives/highlight-query/basic-usage.spec.js new file mode 100644 index 000000000..b7bf67f28 --- /dev/null +++ b/examples/sites/demos/pc/app/directives/highlight-query/basic-usage.spec.js @@ -0,0 +1,12 @@ +import { test, expect } from '@playwright/test' + +test('基本用法', async ({ page }) => { + page.on('pageerror', (exception) => expect(exception).toBeNull()) + await page.goto('directives-highlight-query#basic-usage') + + const input = page.locator('.pc-demo-container .tiny-input__inner') + const hlNode = page.locator('.pc-demo-container .tiny-hl-query-node') + + await input.fill('一片') + await expect(hlNode).toHaveCount(3) +}) diff --git a/examples/sites/demos/pc/app/directives/highlight-query/basic-usage.vue b/examples/sites/demos/pc/app/directives/highlight-query/basic-usage.vue new file mode 100644 index 000000000..d50c55e7b --- /dev/null +++ b/examples/sites/demos/pc/app/directives/highlight-query/basic-usage.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/examples/sites/demos/pc/app/directives/webdoc/directives-highlight-query.cn.md b/examples/sites/demos/pc/app/directives/webdoc/directives-highlight-query.cn.md new file mode 100644 index 000000000..50714a5a9 --- /dev/null +++ b/examples/sites/demos/pc/app/directives/webdoc/directives-highlight-query.cn.md @@ -0,0 +1,7 @@ +--- +title: HighlightQuery 高亮搜索字 +--- + +# HighlightQuery 高亮搜索字 + +
HighlightQuery 高亮搜索字指令,用于高亮区个区域的匹配字符。
diff --git a/examples/sites/demos/pc/app/directives/webdoc/directives-highlight-query.en.md b/examples/sites/demos/pc/app/directives/webdoc/directives-highlight-query.en.md new file mode 100644 index 000000000..3805adbbf --- /dev/null +++ b/examples/sites/demos/pc/app/directives/webdoc/directives-highlight-query.en.md @@ -0,0 +1,7 @@ +--- +title: HighlightQuery Highlight search word +--- + +# HighlightQuery Highlight search word + +
HighlightQuery Highlight search word command, which is used to match characters in each area of the highlight area.
diff --git a/examples/sites/demos/pc/app/directives/webdoc/directives-highlight-query.js b/examples/sites/demos/pc/app/directives/webdoc/directives-highlight-query.js new file mode 100644 index 000000000..7a193dee8 --- /dev/null +++ b/examples/sites/demos/pc/app/directives/webdoc/directives-highlight-query.js @@ -0,0 +1,39 @@ +export default { + column: '2', + owner: '', + metaData: { + stable: '3.18.0' + }, + versionTipOption: { + stages: ['stable'] + }, + demos: [ + { + demoId: 'basic-usage', + name: { + 'zh-CN': '基本用法', + 'en-US': 'Basic Usage' + }, + desc: { + 'zh-CN': '通过自动高亮搜索字指令,可以自动高亮某个节点下,所有匹配的字符。', + 'en-US': + 'You can use the automatic highlight search word command to automatically highlight all matched characters under a node.' + }, + codeFiles: ['highlight-query/basic-usage.vue'] + }, + { + demoId: 'avoid', + name: { + 'zh-CN': '避免场景', + 'en-US': 'Basic Usage' + }, + desc: { + 'zh-CN': + '纯文字节点在Vue 编译时有特殊处理。自动高亮搜索字的指令是直接处理Dom节点的内容,所以要避免纯文本节点。以下2个场景会造成Vue 更新机制失败。', + 'en-US': + 'Plain text nodes are specially processed during Vue compilation. The instruction for automatically highlighting search words is to directly process the contents of the Dom node, so avoid plain text nodes. The Vue update mechanism fails in the following scenarios:' + }, + codeFiles: ['highlight-query/avoid.vue'] + } + ] +} diff --git a/examples/sites/demos/pc/app/dropdown/lazy-show-popper-composition-api.vue b/examples/sites/demos/pc/app/dropdown/lazy-show-popper-composition-api.vue new file mode 100644 index 000000000..509306369 --- /dev/null +++ b/examples/sites/demos/pc/app/dropdown/lazy-show-popper-composition-api.vue @@ -0,0 +1,43 @@ + + + diff --git a/examples/sites/demos/pc/app/dropdown/lazy-show-popper.spec.ts b/examples/sites/demos/pc/app/dropdown/lazy-show-popper.spec.ts new file mode 100644 index 000000000..3ea061027 --- /dev/null +++ b/examples/sites/demos/pc/app/dropdown/lazy-show-popper.spec.ts @@ -0,0 +1,20 @@ +import { test, expect } from '@playwright/test' + +test('基本用法', async ({ page }) => { + page.on('pageerror', (exception) => expect(exception).toBeNull()) + await page.goto('dropdown#lazy-show-popper') + + const wrap = page.locator('#lazy-show-popper') + const dropDownLi = wrap.locator('.tiny-dropdown li') + const dropDownOnBody = page.locator('body .tiny-dropdown-menu li') + + const dropDown2 = wrap.locator('.tiny-dropdown').nth(1) + + // 2个示例应该是10个菜单项, 懒加载成功的话,应该只加载5个。 + await expect(dropDownLi).toHaveCount(5) + + // 点击后,应该加载10个, 但展开的5项是 appendToBody的。 + await dropDown2.click() + await expect(dropDownLi).toHaveCount(5) + await expect(dropDownOnBody).toHaveCount(5) +}) diff --git a/examples/sites/demos/pc/app/dropdown/lazy-show-popper.vue b/examples/sites/demos/pc/app/dropdown/lazy-show-popper.vue new file mode 100644 index 000000000..dd1a4c318 --- /dev/null +++ b/examples/sites/demos/pc/app/dropdown/lazy-show-popper.vue @@ -0,0 +1,47 @@ + + + diff --git a/examples/sites/demos/pc/app/dropdown/webdoc/dropdown.js b/examples/sites/demos/pc/app/dropdown/webdoc/dropdown.js index 111b9c106..9cea4ceee 100644 --- a/examples/sites/demos/pc/app/dropdown/webdoc/dropdown.js +++ b/examples/sites/demos/pc/app/dropdown/webdoc/dropdown.js @@ -231,6 +231,19 @@ export default { '

button-click: When the button type is selected, listen for the left button click event.

\n

item-click: Listens for menu item click events

\n

visible-change: Listens for changes in the display and hiding of dropdown pop ups.

\n' }, codeFiles: ['events.vue'] + }, + { + demoId: 'lazy-show-popper', + name: { + 'zh-CN': '懒加载菜单和子项', + 'en-US': 'Lazy Load Menus and Subitems' + }, + desc: { + 'zh-CN': '通过 lazy-show-popper 属性,指定是否懒加载下拉菜单及内部的项', + 'en-US': + 'The lazy-show-popper property specifies whether to lazy load the drop-down menu and internal items.' + }, + codeFiles: ['lazy-show-popper.vue'] } ] } diff --git a/examples/sites/demos/pc/app/file-upload/file-size-array.vue b/examples/sites/demos/pc/app/file-upload/file-size-array.vue new file mode 100644 index 000000000..3d39344a9 --- /dev/null +++ b/examples/sites/demos/pc/app/file-upload/file-size-array.vue @@ -0,0 +1,85 @@ + + + diff --git a/examples/sites/demos/pc/app/file-upload/file-size.vue b/examples/sites/demos/pc/app/file-upload/file-size.vue new file mode 100644 index 000000000..d4cef901f --- /dev/null +++ b/examples/sites/demos/pc/app/file-upload/file-size.vue @@ -0,0 +1,78 @@ + + + diff --git a/examples/sites/demos/pc/app/file-upload/webdoc/file-upload.js b/examples/sites/demos/pc/app/file-upload/webdoc/file-upload.js index 2341f424e..e7f0117ca 100644 --- a/examples/sites/demos/pc/app/file-upload/webdoc/file-upload.js +++ b/examples/sites/demos/pc/app/file-upload/webdoc/file-upload.js @@ -189,6 +189,30 @@ export default { }, codeFiles: ['upload-file-list.vue'] }, + { + demoId: 'file-size', + name: { + 'zh-CN': '文件大小限制', + 'en-US': 'Uploaded file size limit' + }, + desc: { + 'zh-CN': '

通过 file-size 配置上传文件的大小。

', + 'en-US': '

Use file-size to configure the size of the uploaded file.

' + }, + codeFiles: ['file-size.vue'] + }, + { + demoId: 'file-size-array', + name: { + 'zh-CN': '文件大小范围', + 'en-US': 'Uploaded file size range' + }, + desc: { + 'zh-CN': '

通过 file-size 配置为数组类型限制上传文件的大小范围。

', + 'en-US': '

Set file-size to an array to limit the size of the file to be uploaded.

' + }, + codeFiles: ['file-size-array.vue'] + }, { demoId: 'upload-file-list-slot', name: { diff --git a/examples/sites/demos/pc/app/grid/dynamically-columns/column-switching-scroll-composition-api.vue b/examples/sites/demos/pc/app/grid/dynamically-columns/column-switching-scroll-composition-api.vue new file mode 100644 index 000000000..a2cdfa035 --- /dev/null +++ b/examples/sites/demos/pc/app/grid/dynamically-columns/column-switching-scroll-composition-api.vue @@ -0,0 +1,81 @@ + + + diff --git a/examples/sites/demos/pc/app/grid/dynamically-columns/column-switching-scroll.spec.js b/examples/sites/demos/pc/app/grid/dynamically-columns/column-switching-scroll.spec.js new file mode 100644 index 000000000..3a297ce99 --- /dev/null +++ b/examples/sites/demos/pc/app/grid/dynamically-columns/column-switching-scroll.spec.js @@ -0,0 +1,14 @@ +import { test, expect } from '@playwright/test' + +test('新增列滚动位置', async ({ page }) => { + page.on('pageerror', (exception) => expect(exception).toBeNull()) + await page.goto('grid-dynamically-columns#column-switching-scroll') + const demo = page.locator('#column-switching-scroll') + + await demo.locator('.tiny-grid__body-wrapper.body__wrapper').click() + await page.mouse.wheel(10000, 0) + + await expect(demo.getByText('地址2')).toBeVisible() + await demo.getByText('显示最后一列').click() + await expect(demo.getByText('地址2')).toBeVisible() +}) diff --git a/examples/sites/demos/pc/app/grid/dynamically-columns/column-switching-scroll.vue b/examples/sites/demos/pc/app/grid/dynamically-columns/column-switching-scroll.vue new file mode 100644 index 000000000..606700043 --- /dev/null +++ b/examples/sites/demos/pc/app/grid/dynamically-columns/column-switching-scroll.vue @@ -0,0 +1,89 @@ + + + diff --git a/examples/sites/demos/pc/app/grid/webdoc/grid-dynamically-columns.js b/examples/sites/demos/pc/app/grid/webdoc/grid-dynamically-columns.js index b566beda9..d7b25a130 100644 --- a/examples/sites/demos/pc/app/grid/webdoc/grid-dynamically-columns.js +++ b/examples/sites/demos/pc/app/grid/webdoc/grid-dynamically-columns.js @@ -14,6 +14,18 @@ export default { }, 'codeFiles': ['dynamically-columns/dynamically-columns.vue'] }, + { + 'demoId': 'column-switching-scroll', + 'name': { + 'zh-CN': '新增列滚动位置', + 'en-US': 'New columns scroll positon' + }, + 'desc': { + 'zh-CN': '根据日期范围选择框的日期范围动态的生成表格列。', + 'en-US': 'For details, see the following example.' + }, + 'codeFiles': ['dynamically-columns/column-switching-scroll.vue'] + }, { 'demoId': 'column-columns-dynamic', 'name': { 'zh-CN': '动态列数据', 'en-US': '' }, diff --git a/examples/sites/demos/pc/app/icon/iconGroups.js b/examples/sites/demos/pc/app/icon/iconGroups.js index 7f52fc36c..dbfb229b6 100644 --- a/examples/sites/demos/pc/app/icon/iconGroups.js +++ b/examples/sites/demos/pc/app/icon/iconGroups.js @@ -1,42 +1,249 @@ export const iconGroups = { - Arrow: [ - 'IconArrowDown', + Left: [ + 'IconAngleLeft', 'IconArrowLeft', - 'IconArrowRight', - 'IconArrowUp', - 'IconAscending', - 'IconChevronDown', 'IconChevronLeft', - 'IconChevronRight', - 'IconChevronUp', 'IconDefault', - 'IconDeltaDownO', - 'IconDeltaDown', 'IconDeltaLeftO', - 'IconDeltaLeft', - 'IconDeltaRightO', - 'IconDeltaRight', - 'IconDeltaUpO', - 'IconDeltaUp', 'IconDoubleLeft', - 'IconDoubleRight', - 'IconDownO', - 'IconDown', - 'IconDownWard', - 'IconEnd', + 'IconLeft', 'IconLeftO', 'IconLeftWard', 'IconLeftWardArrow', - 'IconLeft', - 'IconPopup', - 'IconRightO', + 'IconDeltaLeft', + 'IconPagerFirst', + 'IconPagerPrev', + 'IconRichTextAlignLeft', + 'IconSplitLeft', + 'IconUndo' + ], + Right: [ + 'IconArrowRight', + 'IconAngleRight', + 'IconChevronRight', + 'IconDeltaRight', + 'IconDeltaRightO', + 'IconDoubleRight', + 'IconEnd', + 'IconPagerLast', + 'IconPagerNext', + 'IconRedo', 'IconRight', + 'IconRightO', + 'IconRichTextRedo', + 'IconRichTextAlignRight', 'IconRightward', - 'IconTriangleDown', - 'IconUpO', + 'IconSplitRight', + 'IconStart', + 'IconTransform' + ], + TextAlign: [ + 'IconAlignCenter', + 'IconAlignLeft', + 'IconAlignJustify', + 'IconAlignRight', + 'IconAlignStretch', + 'IconStreamSolid', + 'IconRichTextAddColumnAfter', + 'IconRichTextAddColumnBefore', + 'IconRichTextAddRowAfter', + 'IconRichTextAddRowBefore', + 'IconRichTextAlignCenter', + 'IconRichTextDeleteColumn', + 'IconRichTextDeleteRow', + 'IconRichTextLineHeight', + 'IconRichTextListOrdered', + 'IconRichTextListUnordered', + 'IconRichTextMergeCells', + 'IconRichTextMergeCellsVertical', + 'IconRichTextSplitCellsHorizontal', + 'IconRichTextSplitCellsVertical', + 'IconRichTextTable', + 'IconRichTextTaskList', + 'IconSplit' + ], + Upward: [ + 'IconArrowUp', + 'IconChevronUp', + 'IconDeltaUp', + 'IconDeltaUpO', + 'IconFreeze', 'IconUp', + 'IconUpO', 'IconUpWard' ], + Downward: [ + 'IconArrowBottom', + 'IconArrowDown', + 'IconChevronDown', + 'IconDeltaDown', + 'IconDeltaDownO', + 'IconDown', + 'IconDownO', + 'IconDownWard', + 'IconTriangleDown' + ], + Back: ['IconEditorUndo', 'IconGoBack', 'IconImport', 'IconRichTextUndo'], + Cycle: [ + 'IconConmentRefresh', + 'IconDownload', + 'IconGenerating', + 'IconGroupTransfer', + 'IconReplace', + 'IconRefres', + 'IconRefresh', + 'IconRepeat', + 'IconUpload' + ], + Sort: [ + 'IconAscending', + 'IconDescending', + 'IconSort', + 'IconSortDefault', + 'IconSortO', + 'IconSortTriangle', + 'IconSortTriangleAscending', + 'IconSortTriangleDescending' + ], + Filter: ['IconBefilter', 'IconClearFilter', 'IconDefinedFiltration', 'IconFilter', 'IconFiltered', 'IconUnfilter'], + Reduce: [ + 'IconExpand', + 'IconMinus', + 'IconMinusCircle', + 'IconMinusSquare', + 'IconNodeOpen', + 'IconPanelMini', + 'IconStop', + 'IconZoomOut' + ], + Add: [ + 'IconAdd', + 'IconAddCircle', + 'IconNew', + 'IconNode', + 'IconPlus', + 'IconPlusSquare', + 'IconPlusCircle', + 'IconPutAway', + 'IconView', + 'IconZoomIn' + ], + Check: [ + 'IconCheck', + 'IconHalfchecked', + 'IconHalfselect', + 'IconMobileCheckbox', + 'IconMobileCheckboxHalf', + 'IconPreChecked' + ], + Success: [ + 'IconCheckedLinear', + 'IconCheckedSur', + 'IconDone', + 'IconFinish', + 'IconMobileCheckboxSelected', + 'IconSubScript', + 'IconSuccess', + 'IconSuccessful', + 'IconYes' + ], + Fail: [ + 'IconClose', + 'IconCloseCircle', + 'IconCloseSquare', + 'IconDelete', + 'IconError', + 'IconOperationfaild', + 'IconOperationfaildL', + 'IconStepsError' + ], + Warn: [ + 'IconCueL', + 'IconCueLO', + 'IconExceptionO', + 'IconExclamation', + 'IconWarn', + 'IconWarning', + 'IconWarningO', + 'IconWarningTriangle' + ], + Question: ['IconHelpCircle', 'IconHelpQuery', 'IconUnknow', 'IconUnknown'], + Prompt: [ + 'IconInfo', + 'IconInfoCircle', + 'IconInfoSolid', + 'IconHelp', + 'IconHelpSolid', + 'IconPrompt', + 'IconPromptExclamation' + ], + Stretchable: [ + 'IconFullscreenLeft', + 'IconMinscreenLeft', + 'IconMinscreenRight', + 'IconStretch', + 'IconStretchCrosswise', + 'IconStretchUpright' + ], + More: ['IconEllipsis', 'IconMore', 'IconPopup'], + Dot: [ + 'IconDotIpv4', + 'IconLeave', + 'IconOffLine', + 'IconOnLine', + 'IconBusy', + 'IconDoneMini', + 'IconOnGoing', + 'IconOnGoingMini', + 'IconMobileRadio', + 'IconExceptionMiniO', + 'IconMobileRadioSelected', + 'IconOperation', + 'IconRadio', + 'IconRadioselected' + ], + Location: ['IconLocation', 'IconLocationNumber', 'IconMarkOn'], + Letter: [ + 'IconEditorBold', + 'IconEditorDeleteline', + 'IconEditorItalic', + 'IconEditorSub', + 'IconEditorSubtitle', + 'IconEditorSuper', + 'IconEditorTitle', + 'IconEditorUnderline', + 'IconFontColor', + 'IconFontSize', + 'IconFontStyle', + 'IconFontWeight', + 'IconRichTextBold', + 'IconRichTextFontSize', + 'IconRichTextFormatClear', + 'IconRichTextH1', + 'IconRichTextH2', + 'IconRichTextH3', + 'IconRichTextH4', + 'IconRichTextH5', + 'IconRichTextH6', + 'IconRichTextHeading', + 'IconRichTextItalic', + 'IconRichTextStrikeThrough', + 'IconRichTextSubscript', + 'IconRichTextSuperscript', + 'IconRichTextUnderline', + 'IconTextDecoration', + 'IconUnderline' + ], + Mall: [ + 'IconPurchasePlannedOrder', + 'IconShipped', + 'IconShoppingCard', + 'IconSoldOut', + 'IconSurchargeSettled', + 'IconSurchargeSettled', + 'IconWaitForDeliveryO', + 'IconWaitingToPick' + ], Brands: ['IconAngularjs', 'IconEspaceAuto', 'IconEspace', 'IconNodejs', 'IconReactjs', 'IconVuejs'], Charts: ['IconAreaChart', 'IconDotChart', 'IconLineChart', 'IconPieChart', 'IconStatistics'], Editor: [ @@ -44,11 +251,8 @@ export const iconGroups = { 'IconEditorAlignLeft', 'IconEditorAlignRight', 'IconEditorBackground', - 'IconEditorBold', 'IconEditorCode', - 'IconEditorDeleteline', 'IconEditorEraser', - 'IconEditorItalic', 'IconEditorLeftBorder', 'IconEditorList', 'IconEditorListDot', @@ -58,51 +262,64 @@ export const iconGroups = { 'IconEditorQuote', 'IconEditorRedo', 'IconEditorRightBorder', - 'IconEditorSub', - 'IconEditorSubtitle', - 'IconEditorSuper', 'IconEditorTable', 'IconEditorTextcolor', - 'IconEditorTitle', - 'IconEditorUnderline', - 'IconEditorUndo', + 'IconExport', 'IconEditorVideo', - 'IconOperationfaildL', + 'IconFilletExternalLink', 'IconOuterLink', - 'IconTextDecoration', - 'IconUnderline', 'IconWriting' ], IT: [ 'IconAdministrator', 'IconDataSource', 'IconDesktopView', - 'IconEmailAdd', - 'IconEmailCircle', - 'IconExcel', 'IconException', - 'IconExclamation', 'IconLanguage', - 'IconMailContent', - 'IconMail', - 'IconMarkOn', 'IconMobileView', 'IconMobile', 'IconPrintPreview', - 'IconReplies', - 'IconSent', 'IconShare', 'IconShareArrow', - 'IconShoppingCard', 'IconTabletView', 'IconUnlock', - 'IconUnsent', 'IconUser', 'IconVersiontree', 'IconWebPlus', 'IconJs' ], + Clock: ['IconClockWork', 'IconProcessing', 'IconTime'], + Email: ['IconEmailAdd', 'IconEmailCircle', 'IconMailContent', 'IconMail', 'IconReplies', 'IconSent', 'IconUnsent'], + Folder: ['IconFileCloudupload', 'IconFolder', 'IconFolderClosed', 'IconFolderOpened'], + File: [ + 'IconCloudUpload', + 'IconDocument', + 'IconExcel', + 'IconExcelType', + 'IconFileExcel', + 'IconFile', + 'IconFilesCircle', + 'IconFiles', + 'IconFiletext', + 'IconFileType', + 'IconFileupload', + 'IconFinishO', + 'IconHistoryRecord', + 'IconOtherType', + 'IconPdfType', + 'IconPptType', + 'IconTextType', + 'IconText', + 'IconTextAlign', + 'IconTextTab', + 'IconVideoType', + 'IconWordType', + 'IconXml', + 'IconZipType' + ], + Image: ['IconAddPicture', 'IconImageAdd', 'IconPicture', 'IconPictureType', 'IconRichTextImage'], Media: [ + 'IconAudio', 'IconCourse', 'IconCustom', 'IconCustomerService', @@ -110,161 +327,89 @@ export const iconGroups = { 'IconDialog2', 'IconInformation', 'IconMessageCircle', - 'IconPagerFirst', - 'IconPagerLast', - 'IconPagerNext', - 'IconPagerPrev', + 'IconMic', 'IconPauseCircle', 'IconPause', - 'IconPicture', 'IconStartCircle', - 'IconStart', - 'IconTime' + 'IconStartO', + 'IconTurnOn' ], - Objects: [ + Object: [ 'IconBoat', 'IconCalculator', 'IconCalendar', - 'IconClockWork', 'IconCloudDownload', - 'IconCloudUpload', 'IconCoin', 'IconTaskCooperation', 'IconTelephoneCircle', 'IconTelephone' ], - Symbols: [ - 'IconBusy', - 'IconCheck', - 'IconCheckedLinear', - 'IconCheckedSur', - 'IconCloseCircle', - 'IconCloseSquare', + Symbol: [ 'IconCode', 'IconCommission', - 'IconCueL', 'IconCrop', - 'IconDotIpv4', - 'IconEllipsis', - 'IconError', 'IconEyeclose', 'IconEyeopen', 'IconFrownO', 'IconFrown', 'IconGroup', 'IconHeartempty', - 'IconHelpCircle', - 'IconHelpQuery', - 'IconHelpSolid', - 'IconHelp', 'IconHelpful', - 'IconLeave', 'IconLoading', 'IconLock', 'IconMale', 'IconMeh', - 'IconMore', - 'IconPlus', - 'IconNodeOpen', - 'IconNode', 'IconNone', - 'IconOffLine', - 'IconOnLine', 'IconPanelMax', - 'IconPanelMini', 'IconPanelNormal', - 'IconRadio', - 'IconRadioselected', 'IconSmileO', 'IconSmile', 'IconStarActive', 'IconStarDisable', - 'IconStarO', - 'IconStop', - 'IconSuccess', - 'IconSuccessful', - 'IconInfoSolid', - 'IconInfoCircle', - 'IconInfo', - 'IconOperationfaild', - 'IconUnknow', - 'IconUnknown', - 'IconWarning', - 'IconWarningTriangle', - 'IconClose', - 'IconYes' + 'IconStarO' ], - Tools: [ - 'IconAdd', - 'IconAddPicture', + Tool: [ + 'IconConfig', + 'IconSetting', 'IconAlignBaseline', - 'IconAlignCenter', 'IconAlignFlexCenter', 'IconAlignFlexEnd', 'IconAlignFlexStart', - 'IconAlignJustify', - 'IconAlignLeft', - 'IconAlignRight', - 'IconAlignStretch', 'IconApp', 'IconApplication', 'IconAssociation', 'IconAttachment', 'IconBarChart', - 'IconBefilter', 'IconBoxSolid', 'IconCheckOut', 'IconCheckedTrue', - 'IconClearFilter', - 'IconConmentRefresh', 'IconCopySolid', 'IconCopy', - 'IconDefinedFiltration', 'IconDel', + 'IconDeleteL', 'IconDeleted', 'IconDerive', 'IconDeletePage', - 'IconDescending', 'IconColReverse', 'IconDirectionCol', 'IconDirectionRow', 'IconRowReverse', 'IconDownloadCloud', 'IconDownloadLink', - 'IconDownload', 'IconDraft', 'IconEdit', + 'IconEditor', 'IconEditorTab', - 'IconExport', 'IconExpressSearch', - 'IconFileCloudupload', - 'IconFileExcel', - 'IconFile', - 'IconFilesCircle', - 'IconFiles', - 'IconFiletext', - 'IconFileupload', - 'IconFiltered', 'IconFlag', - 'IconFolderClosed', - 'IconFolderOpened', - 'IconFontColor', 'IconFontFamily', - 'IconFontSize', - 'IconFontStyle', - 'IconFontWeight', 'IconFreezeLeft', 'IconFreezeRight', 'IconFullscreen', - 'IconFullscreenLeft', 'IconGrade', - 'IconGroupTransfer', - 'IconHalfchecked', - 'IconHalfselect', 'IconHideLeft', 'IconHideRight', 'IconHideTopleft', - 'IconImport', 'IconJusitfyCenter', 'IconJusitfyFlexEnd', 'IconJusitfySpaceAround', @@ -274,24 +419,13 @@ export const iconGroups = { 'IconLineHeight', 'IconLineThrought', 'IconLink', - 'IconMinscreenLeft', 'IconMinscreen', - 'IconMinusCircle', - 'IconMinusSquare', - 'IconMinus', - 'IconNew', 'IconNoPremission', 'IconPagelink', - 'IconPlusCircle', - 'IconPlusSquare', - 'IconPreChecked', 'IconPushpin', - 'IconRedo', - 'IconRefres', 'IconRenew', - 'IconRepeat', - 'IconReplace', 'IconRightFrozen', + 'IconRichTextNodeDelete', 'IconSandwichCollapse', 'IconSandwichExpand', 'IconSave', @@ -299,21 +433,8 @@ export const iconGroups = { 'IconSearch', 'IconSelect', 'IconSeparate', - 'IconSetting', - 'IconSortDefault', - 'IconSort', - 'IconStreamSolid', - 'IconTextAlign', - 'IconTextTab', - 'IconText', 'IconTotal', 'IconUndelete', - 'IconUndo', - 'IconUnfilter', - 'IconUnfreeze', - 'IconUpload', - 'IconView', - 'IconZoomIn', - 'IconZoomOut' + 'IconUnfreeze' ] } diff --git a/examples/sites/demos/pc/app/input/basic-usage.spec.ts b/examples/sites/demos/pc/app/input/basic-usage.spec.ts index 9834b3796..1f843459d 100644 --- a/examples/sites/demos/pc/app/input/basic-usage.spec.ts +++ b/examples/sites/demos/pc/app/input/basic-usage.spec.ts @@ -3,7 +3,7 @@ import { test, expect } from '@playwright/test' test('[Input]basic-usage: placeholder, focus-style, v-model', async ({ page }) => { page.on('pageerror', (exception) => expect(exception).toBeNull()) await page.goto('input#basic-usage') - const input = await page.locator('.demo-input > .tiny-input > .tiny-input-display-only > input') + const input = page.locator('.demo-input > .tiny-input > .tiny-input-display-only > input') await expect(input).toBeVisible() await expect(input).toHaveAttribute('placeholder', 'Please input') diff --git a/examples/sites/demos/pc/app/input/show-tooltip-composition-api.vue b/examples/sites/demos/pc/app/input/show-tooltip-composition-api.vue new file mode 100644 index 000000000..c5f57e8ff --- /dev/null +++ b/examples/sites/demos/pc/app/input/show-tooltip-composition-api.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/examples/sites/demos/pc/app/input/show-tooltip.spec.ts b/examples/sites/demos/pc/app/input/show-tooltip.spec.ts new file mode 100644 index 000000000..14a7438ab --- /dev/null +++ b/examples/sites/demos/pc/app/input/show-tooltip.spec.ts @@ -0,0 +1,10 @@ +import { test, expect } from '@playwright/test' + +test('只读态悬浮提示', async ({ page }) => { + page.on('pageerror', (exception) => expect(exception).toBeNull()) + await page.goto('input#show-tooltip') + + const demo = page.locator('#show-tooltip') + await demo.locator('.tiny-input .tiny-input-display-only__content').hover() + await expect(page.locator('.tiny-tooltip.tiny-tooltip__popper')).not.toBeVisible() +}) diff --git a/examples/sites/demos/pc/app/input/show-tooltip.vue b/examples/sites/demos/pc/app/input/show-tooltip.vue new file mode 100644 index 000000000..f89132f86 --- /dev/null +++ b/examples/sites/demos/pc/app/input/show-tooltip.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/examples/sites/demos/pc/app/input/webdoc/input.js b/examples/sites/demos/pc/app/input/webdoc/input.js index 5050d0127..f6faeca12 100644 --- a/examples/sites/demos/pc/app/input/webdoc/input.js +++ b/examples/sites/demos/pc/app/input/webdoc/input.js @@ -41,6 +41,19 @@ export default { }, codeFiles: ['show-password.vue'] }, + { + demoId: 'show-tooltip', + name: { + 'zh-CN': '只读态悬浮提示', + 'en-US': 'Show Tooltip' + }, + desc: { + 'zh-CN': '

通过 show-tooltip 配置当文本超长时,是否显示悬浮提示。

\n', + 'en-US': + '

Use show-tooltip to configure whether to display a floating tip when the text is too long.

\n' + }, + codeFiles: ['show-tooltip.vue'] + }, { demoId: 'size', name: { diff --git a/examples/sites/demos/pc/app/select/popup-style-position-composition-api.vue b/examples/sites/demos/pc/app/select/popup-style-position-composition-api.vue index 562a57393..0b4b8847a 100644 --- a/examples/sites/demos/pc/app/select/popup-style-position-composition-api.vue +++ b/examples/sites/demos/pc/app/select/popup-style-position-composition-api.vue @@ -12,8 +12,7 @@ const options = reactive([ { value: '选项1', label: '北京' }, { value: '选项2', label: '上海' }, { value: '选项3', label: '天津' }, - { value: '选项4', label: '重庆' }, - { value: '选项5', label: '深圳' } + { value: '选项4', label: '重庆' } ]) const value = ref('') diff --git a/examples/sites/demos/pc/app/select/popup-style-position.vue b/examples/sites/demos/pc/app/select/popup-style-position.vue index 886ad3f95..ada2fc539 100644 --- a/examples/sites/demos/pc/app/select/popup-style-position.vue +++ b/examples/sites/demos/pc/app/select/popup-style-position.vue @@ -18,8 +18,7 @@ export default { { value: '选项1', label: '北京' }, { value: '选项2', label: '上海' }, { value: '选项3', label: '天津' }, - { value: '选项4', label: '重庆' }, - { value: '选项5', label: '深圳' } + { value: '选项4', label: '重庆' } ], value: '' } diff --git a/examples/sites/demos/pc/app/slider/about-step-composition-api.vue b/examples/sites/demos/pc/app/slider/about-step-composition-api.vue index 2a3836f06..290b52347 100644 --- a/examples/sites/demos/pc/app/slider/about-step-composition-api.vue +++ b/examples/sites/demos/pc/app/slider/about-step-composition-api.vue @@ -8,3 +8,9 @@ import { Slider as TinySlider } from '@opentiny/vue' const value = ref(20) + + diff --git a/examples/sites/demos/pc/app/slider/about-step.vue b/examples/sites/demos/pc/app/slider/about-step.vue index 752af2a1f..869964318 100644 --- a/examples/sites/demos/pc/app/slider/about-step.vue +++ b/examples/sites/demos/pc/app/slider/about-step.vue @@ -16,3 +16,9 @@ export default { } } + + diff --git a/examples/sites/demos/pc/app/slider/basic-usage-composition-api.vue b/examples/sites/demos/pc/app/slider/basic-usage-composition-api.vue index 91ed87a95..bf292a6f7 100644 --- a/examples/sites/demos/pc/app/slider/basic-usage-composition-api.vue +++ b/examples/sites/demos/pc/app/slider/basic-usage-composition-api.vue @@ -15,3 +15,9 @@ function setValue() { value.value = 50 } + + diff --git a/examples/sites/demos/pc/app/slider/basic-usage.vue b/examples/sites/demos/pc/app/slider/basic-usage.vue index c96fc93b9..4444c4262 100644 --- a/examples/sites/demos/pc/app/slider/basic-usage.vue +++ b/examples/sites/demos/pc/app/slider/basic-usage.vue @@ -25,3 +25,9 @@ export default { } } + + diff --git a/examples/sites/demos/pc/app/slider/dynamic-disable-composition-api.vue b/examples/sites/demos/pc/app/slider/dynamic-disable-composition-api.vue index 022af5108..7e9e86f92 100644 --- a/examples/sites/demos/pc/app/slider/dynamic-disable-composition-api.vue +++ b/examples/sites/demos/pc/app/slider/dynamic-disable-composition-api.vue @@ -8,3 +8,9 @@ import { Slider as TinySlider } from '@opentiny/vue' const value = ref(40) + + diff --git a/examples/sites/demos/pc/app/slider/dynamic-disable.vue b/examples/sites/demos/pc/app/slider/dynamic-disable.vue index e862f29e8..fb59a3f18 100644 --- a/examples/sites/demos/pc/app/slider/dynamic-disable.vue +++ b/examples/sites/demos/pc/app/slider/dynamic-disable.vue @@ -16,3 +16,9 @@ export default { } } + + diff --git a/examples/sites/demos/pc/app/slider/format-tooltip-composition-api.vue b/examples/sites/demos/pc/app/slider/format-tooltip-composition-api.vue index ffe7bbfa8..ef3b194dd 100644 --- a/examples/sites/demos/pc/app/slider/format-tooltip-composition-api.vue +++ b/examples/sites/demos/pc/app/slider/format-tooltip-composition-api.vue @@ -12,3 +12,9 @@ function format(value) { return '当前值为:' + value } + + diff --git a/examples/sites/demos/pc/app/slider/format-tooltip.vue b/examples/sites/demos/pc/app/slider/format-tooltip.vue index cebda2f12..55c1ac07b 100644 --- a/examples/sites/demos/pc/app/slider/format-tooltip.vue +++ b/examples/sites/demos/pc/app/slider/format-tooltip.vue @@ -21,3 +21,9 @@ export default { } } + + diff --git a/examples/sites/demos/pc/app/slider/marks-composition-api.vue b/examples/sites/demos/pc/app/slider/marks-composition-api.vue index 45e0849fb..5442d31df 100644 --- a/examples/sites/demos/pc/app/slider/marks-composition-api.vue +++ b/examples/sites/demos/pc/app/slider/marks-composition-api.vue @@ -1,9 +1,5 @@ + + diff --git a/examples/sites/demos/pc/app/slider/marks.vue b/examples/sites/demos/pc/app/slider/marks.vue index ff6632dbf..0411ee2f7 100644 --- a/examples/sites/demos/pc/app/slider/marks.vue +++ b/examples/sites/demos/pc/app/slider/marks.vue @@ -1,9 +1,5 @@ + + diff --git a/examples/sites/demos/pc/app/slider/max-min-composition-api.vue b/examples/sites/demos/pc/app/slider/max-min-composition-api.vue index 08fa5a12a..bc690e7a8 100644 --- a/examples/sites/demos/pc/app/slider/max-min-composition-api.vue +++ b/examples/sites/demos/pc/app/slider/max-min-composition-api.vue @@ -8,3 +8,9 @@ import { Slider as TinySlider } from '@opentiny/vue' const value = ref(30) + + diff --git a/examples/sites/demos/pc/app/slider/max-min.vue b/examples/sites/demos/pc/app/slider/max-min.vue index 7a8794640..62224e20f 100644 --- a/examples/sites/demos/pc/app/slider/max-min.vue +++ b/examples/sites/demos/pc/app/slider/max-min.vue @@ -16,3 +16,9 @@ export default { } } + + diff --git a/examples/sites/demos/pc/app/slider/range-select-composition-api.vue b/examples/sites/demos/pc/app/slider/range-select-composition-api.vue index 0d6f30ce9..f5f363df3 100644 --- a/examples/sites/demos/pc/app/slider/range-select-composition-api.vue +++ b/examples/sites/demos/pc/app/slider/range-select-composition-api.vue @@ -8,3 +8,9 @@ import { Slider as TinySlider } from '@opentiny/vue' const value = ref([20, 40]) + + diff --git a/examples/sites/demos/pc/app/slider/range-select.vue b/examples/sites/demos/pc/app/slider/range-select.vue index 60f0d8ea8..1adb435da 100644 --- a/examples/sites/demos/pc/app/slider/range-select.vue +++ b/examples/sites/demos/pc/app/slider/range-select.vue @@ -16,3 +16,9 @@ export default { } } + + diff --git a/examples/sites/demos/pc/app/slider/shortcut-operation-composition-api.vue b/examples/sites/demos/pc/app/slider/shortcut-operation-composition-api.vue index f467ca89f..44884cf6c 100644 --- a/examples/sites/demos/pc/app/slider/shortcut-operation-composition-api.vue +++ b/examples/sites/demos/pc/app/slider/shortcut-operation-composition-api.vue @@ -8,3 +8,9 @@ import { Slider as TinySlider } from '@opentiny/vue' const value = ref(40) + + diff --git a/examples/sites/demos/pc/app/slider/shortcut-operation.vue b/examples/sites/demos/pc/app/slider/shortcut-operation.vue index 21d8dcad0..80ec67961 100644 --- a/examples/sites/demos/pc/app/slider/shortcut-operation.vue +++ b/examples/sites/demos/pc/app/slider/shortcut-operation.vue @@ -16,3 +16,9 @@ export default { } } + + diff --git a/examples/sites/demos/pc/app/slider/show-input-composition-api.vue b/examples/sites/demos/pc/app/slider/show-input-composition-api.vue index 02f72a3de..0426936bc 100644 --- a/examples/sites/demos/pc/app/slider/show-input-composition-api.vue +++ b/examples/sites/demos/pc/app/slider/show-input-composition-api.vue @@ -10,3 +10,9 @@ import { Slider as TinySlider } from '@opentiny/vue' const value = ref(40) const value2 = ref([40, 60]) + + diff --git a/examples/sites/demos/pc/app/slider/show-iput.spec.ts b/examples/sites/demos/pc/app/slider/show-input.spec.ts similarity index 100% rename from examples/sites/demos/pc/app/slider/show-iput.spec.ts rename to examples/sites/demos/pc/app/slider/show-input.spec.ts diff --git a/examples/sites/demos/pc/app/slider/show-input.vue b/examples/sites/demos/pc/app/slider/show-input.vue index 49f509aa7..c087d6f3f 100644 --- a/examples/sites/demos/pc/app/slider/show-input.vue +++ b/examples/sites/demos/pc/app/slider/show-input.vue @@ -18,3 +18,9 @@ export default { } } + + diff --git a/examples/sites/demos/pc/app/slider/show-tip-composition-api.vue b/examples/sites/demos/pc/app/slider/show-tip-composition-api.vue index 101184e18..0d71e28ec 100644 --- a/examples/sites/demos/pc/app/slider/show-tip-composition-api.vue +++ b/examples/sites/demos/pc/app/slider/show-tip-composition-api.vue @@ -12,3 +12,9 @@ function format(value) { return '当前值为:' + value } + + diff --git a/examples/sites/demos/pc/app/slider/show-tip.vue b/examples/sites/demos/pc/app/slider/show-tip.vue index 836778149..66873a80f 100644 --- a/examples/sites/demos/pc/app/slider/show-tip.vue +++ b/examples/sites/demos/pc/app/slider/show-tip.vue @@ -21,3 +21,9 @@ export default { } } + + diff --git a/examples/sites/demos/pc/app/slider/slider-event-composition-api.vue b/examples/sites/demos/pc/app/slider/slider-event-composition-api.vue index fc4e6ce10..33b879955 100644 --- a/examples/sites/demos/pc/app/slider/slider-event-composition-api.vue +++ b/examples/sites/demos/pc/app/slider/slider-event-composition-api.vue @@ -32,3 +32,9 @@ function stop(val) { }) } + + diff --git a/examples/sites/demos/pc/app/slider/slider-event.vue b/examples/sites/demos/pc/app/slider/slider-event.vue index b56f83225..270c0fccd 100644 --- a/examples/sites/demos/pc/app/slider/slider-event.vue +++ b/examples/sites/demos/pc/app/slider/slider-event.vue @@ -39,3 +39,9 @@ export default { } } + + diff --git a/examples/sites/demos/pc/app/slider/slider-slot-composition-api.vue b/examples/sites/demos/pc/app/slider/slider-slot-composition-api.vue index c2ee5234e..f2e26dbdf 100644 --- a/examples/sites/demos/pc/app/slider/slider-slot-composition-api.vue +++ b/examples/sites/demos/pc/app/slider/slider-slot-composition-api.vue @@ -12,3 +12,9 @@ import { Slider as TinySlider } from '@opentiny/vue' const value = ref(40) + + diff --git a/examples/sites/demos/pc/app/slider/slider-slot.vue b/examples/sites/demos/pc/app/slider/slider-slot.vue index f0934b619..fe37ccd69 100644 --- a/examples/sites/demos/pc/app/slider/slider-slot.vue +++ b/examples/sites/demos/pc/app/slider/slider-slot.vue @@ -20,3 +20,9 @@ export default { } } + + diff --git a/examples/sites/demos/pc/app/slider/vertical-mode-composition-api.vue b/examples/sites/demos/pc/app/slider/vertical-mode-composition-api.vue index 11bbba780..ff5ba6404 100644 --- a/examples/sites/demos/pc/app/slider/vertical-mode-composition-api.vue +++ b/examples/sites/demos/pc/app/slider/vertical-mode-composition-api.vue @@ -8,3 +8,9 @@ import { Slider as TinySlider } from '@opentiny/vue' const value = ref(30) + + diff --git a/examples/sites/demos/pc/app/slider/vertical-mode.vue b/examples/sites/demos/pc/app/slider/vertical-mode.vue index 06219b040..5dc72b3a4 100644 --- a/examples/sites/demos/pc/app/slider/vertical-mode.vue +++ b/examples/sites/demos/pc/app/slider/vertical-mode.vue @@ -16,3 +16,9 @@ export default { } } + + diff --git a/examples/sites/demos/pc/app/time-picker/default-value.spec.ts b/examples/sites/demos/pc/app/time-picker/default-value.spec.ts index 888141cb2..b833042ac 100644 --- a/examples/sites/demos/pc/app/time-picker/default-value.spec.ts +++ b/examples/sites/demos/pc/app/time-picker/default-value.spec.ts @@ -9,7 +9,7 @@ test('选择器打开时默认时间设置', async ({ page }) => { const minute = page.getByRole('listitem').filter({ hasText: '40' }).first() const second = page.getByRole('listitem').filter({ hasText: '00' }).nth(2) - await page.locator('#default-value input[type="text"]').click() + await page.locator('#default-value input[type="text"]').nth(0).click() await expect(hour).toHaveClass(/active/) await expect(minute).toHaveClass(/active/) await expect(second).toHaveClass(/active/) diff --git a/examples/sites/demos/pc/app/time-picker/picker-options.spec.ts b/examples/sites/demos/pc/app/time-picker/picker-options.spec.ts index 31fc33c4d..9a5f57cf9 100644 --- a/examples/sites/demos/pc/app/time-picker/picker-options.spec.ts +++ b/examples/sites/demos/pc/app/time-picker/picker-options.spec.ts @@ -5,6 +5,7 @@ test('固定时间范围', async ({ page }) => { await page.goto('time-picker#picker-options') const selectTime = page.getByRole('textbox', { name: '18:40:00' }) + const selectTime1 = page.getByRole('textbox', { name: '19:40:00' }) // 点击17点,点击确定,关闭选择框后,查看input 时间是否仍是18:40:00 await selectTime.click() await page.waitForTimeout(100) @@ -12,11 +13,11 @@ test('固定时间范围', async ({ page }) => { await page.getByRole('button', { name: '确定' }).click() await page.waitForTimeout(100) await expect(selectTime).toBeVisible() - // 点击21点,点击确定,关闭选择框后,查看input 时间是否仍是18:40:00 + // 点击19点,点击确定,关闭选择框后,查看input 时间是19:40:00 await selectTime.click() await page.waitForTimeout(100) - await page.getByRole('listitem').filter({ hasText: '21' }).first().click() + await page.getByRole('listitem').filter({ hasText: '19' }).first().click() await page.getByRole('button', { name: '确定' }).click() await page.waitForTimeout(100) - await expect(selectTime).toBeVisible() + await expect(selectTime1).toBeVisible() }) diff --git a/examples/sites/demos/pc/app/tree/filter-view-composition-api.vue b/examples/sites/demos/pc/app/tree/filter-view-composition-api.vue index 6951e0382..fe8cb9b38 100644 --- a/examples/sites/demos/pc/app/tree/filter-view-composition-api.vue +++ b/examples/sites/demos/pc/app/tree/filter-view-composition-api.vue @@ -14,6 +14,13 @@ 隐藏 +
+ 搜索后是否高亮关键字: + + 高亮 + 默认不变 + +
搜索值: @@ -23,6 +30,7 @@ ref="treeRef" :data="data" :view-type="viewType" + :highlight-query="highlightQuery === 'show'" :filter-node-method="filterNodeMethod" :show-auxi="showAuxi === 'show'" default-expand-all @@ -41,6 +49,7 @@ import { Tree as TinyTree, RadioGroup as TinyRadioGroup, Radio as TinyRadio, Inp const treeRef = ref() const viewType = ref('tree') +const highlightQuery = ref('hide') const showAuxi = ref('hide') const filterText = ref('') const data = ref([ diff --git a/examples/sites/demos/pc/app/tree/filter-view.spec.ts b/examples/sites/demos/pc/app/tree/filter-view.spec.ts index b30dac9ce..b8c2e94f9 100644 --- a/examples/sites/demos/pc/app/tree/filter-view.spec.ts +++ b/examples/sites/demos/pc/app/tree/filter-view.spec.ts @@ -7,15 +7,23 @@ test('测试过滤视图', async ({ page }) => { const preview = page.locator('.pc-demo-container') const tree = preview.locator('.tiny-tree').nth(0) const btnPlain = preview.getByText('平铺视图 plain') + const btnHighlight = preview.getByRole('radio', { name: '高亮' }) const checkboxs = tree.locator('.tiny-tree__plain-node .tiny-checkbox') + const highlightNodes = tree.locator('.tiny-tree__plain-node .tiny-hl-query-node') const input = preview.locator('.tiny-input input') await expect(tree.getByText('数据 1-1-1')).toHaveCount(1) + // 测试平铺视图 await btnPlain.click() await expect(checkboxs).toHaveCount(9) await page.waitForTimeout(20) + // 测试过滤 await input.fill('1-1') await expect(checkboxs).toHaveCount(3) + + // 测试高亮 + await btnHighlight.click() + await expect(highlightNodes).toHaveCount(2) }) diff --git a/examples/sites/demos/pc/app/tree/filter-view.vue b/examples/sites/demos/pc/app/tree/filter-view.vue index 70f0d62b2..2bfc65185 100644 --- a/examples/sites/demos/pc/app/tree/filter-view.vue +++ b/examples/sites/demos/pc/app/tree/filter-view.vue @@ -14,6 +14,13 @@ 隐藏
+
+ 搜索后是否高亮关键字: + + 高亮 + 默认不变 + +
搜索值: @@ -23,6 +30,7 @@ ref="treeRef" :data="data" :view-type="viewType" + :highlight-query="highlightQuery === 'show'" :filter-node-method="filterNodeMethod" :show-auxi="showAuxi === 'show'" default-expand-all @@ -49,6 +57,7 @@ export default { return { viewType: 'tree', showAuxi: 'hide', + highlightQuery: 'hide', filterText: '', data: [ { diff --git a/examples/sites/demos/pc/app/tree/webdoc/tree.js b/examples/sites/demos/pc/app/tree/webdoc/tree.js index 6b6b2f535..131948422 100644 --- a/examples/sites/demos/pc/app/tree/webdoc/tree.js +++ b/examples/sites/demos/pc/app/tree/webdoc/tree.js @@ -312,6 +312,7 @@ export default { 'zh-CN': ` 通过 filter-node-method 属性, 指定过滤节点时的函数,函数返回true时节点显示,否则节点隐藏。
通过 filter 组件方法,触发组件进行过滤。
+ 通过 highlightQuery 属性,是否在匹配的节点中,高亮搜索文字。
通过 view-type 属性,设置组件的视图模式,可选值为 tree plain ,默认为 tree
通过 show-auxi 属性,设置在平铺视图时,是否显示节点的辅助信息,默认为true
@@ -321,6 +322,7 @@ export default { `, 'en-US': `The filter-node-method property is used to specify the function for filtering nodes. The function returns true to display the nodes.
Run the filter component method to trigger the component to filter.
+ Use the highlightQuery attribute to determine whether to highlight the search text in the matched node.
Use the view-type property to set the component view mode. The optional values are tree and plain . The default value is tree .
The show-auxi property is used to set whether to display auxiliary node information in tiled view. The default is true.
diff --git a/examples/sites/demos/pc/menus.js b/examples/sites/demos/pc/menus.js index 31f44dbcf..c08f405aa 100644 --- a/examples/sites/demos/pc/menus.js +++ b/examples/sites/demos/pc/menus.js @@ -320,7 +320,10 @@ export const cmpMenus = [ 'label': '自定义指令', 'labelEn': 'Custom Instruction', 'key': 'directives-custom-instruction', - 'children': [{ 'nameCn': '超出隐藏', 'name': 'AutoTip', 'key': 'directives-auto-tip' }] + 'children': [ + { 'nameCn': '超出隐藏', 'name': 'AutoTip', 'key': 'directives-auto-tip' }, + { 'nameCn': '高亮搜索字', 'name': 'HighlightQuery', 'key': 'directives-highlight-query' } + ] } ] diff --git a/examples/sites/src/assets/images/Infinitely-icon.png b/examples/sites/src/assets/images/Infinitely-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..08c7ea479335f957640583dcc45bd7f7feed0449 GIT binary patch literal 492 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 THOhK&00000NkvXXu0mjfUd)pI literal 0 HcmV?d00001 diff --git a/examples/sites/src/assets/images/glaciers-icon.png b/examples/sites/src/assets/images/glaciers-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a9e55176881ba1a09a7225e4d837489604fad58c GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}8$4YcLn7Rh zd)8Mz`9A;QeIGV9Hcqx*P2xQ~J}-L;P5I~XH#{|1zmLK4fqkuQU)Jpv%x=yJCM<1X z91>XtMjW3vKhQOsxButag0JuR7j=tGa#FZ4bG~C-mu%jSCK2hw^X>mj&fD{gSA2Kb zck9D_$@4QGGn52#FLIT%tNC|&L&9b2MY=BG9zh&ERzOq1Mzh6oOo;uXn7L$yicIN& p433^QhOJHs3D(P*@7l66yenV3b;5>eIzYEGc)I$ztaD0e0sz`gTQdLv literal 0 HcmV?d00001 diff --git a/examples/sites/src/assets/images/glaciers.png b/examples/sites/src/assets/images/glaciers.png new file mode 100644 index 0000000000000000000000000000000000000000..7b8b236be1786a97fe925530d4d748f68d8978fd GIT binary patch literal 13037 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 literal 0 HcmV?d00001 diff --git a/examples/sites/src/assets/images/oceanic-icon.png b/examples/sites/src/assets/images/oceanic-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..12d7a3c3fa08c165e31a7c3b16c2f435dd1bb091 GIT binary patch literal 245 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 literal 0 HcmV?d00001 diff --git a/examples/sites/src/assets/images/starry-sky.png b/examples/sites/src/assets/images/starry-sky.png new file mode 100644 index 0000000000000000000000000000000000000000..04b49a01a4e85ef8bd38e04a54ac21cd8d48e628 GIT binary patch literal 20856 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 T1(QrG00000NkvXXu0mjf8?FZM literal 0 HcmV?d00001 diff --git a/examples/sites/src/i18n/en.json b/examples/sites/src/i18n/en.json index 8579b59d3..b4e15c681 100644 --- a/examples/sites/src/i18n/en.json +++ b/examples/sites/src/i18n/en.json @@ -1,5 +1,7 @@ { - "language": "EN", + "zh-cn": "Chinese", + "en-us": "English", + "localeType": "Language Selection", "dark": "Dark", "light": "Light", "searchPlaceholder": "Search", @@ -39,4 +41,4 @@ "demoModeMultiple": "Multiple", "contributor": "Contributors", "noData": "No Data" -} +} \ No newline at end of file diff --git a/examples/sites/src/i18n/zh.json b/examples/sites/src/i18n/zh.json index 852d3ab32..68ed387cc 100644 --- a/examples/sites/src/i18n/zh.json +++ b/examples/sites/src/i18n/zh.json @@ -1,5 +1,7 @@ { - "language": "中", + "zh-cn": "中文", + "en-us": "英文", + "localeType": "语言选择", "dark": "深色", "light": "浅色", "searchPlaceholder": "搜索", @@ -39,4 +41,4 @@ "demoModeMultiple": "多示例", "contributor": "贡献者", "noData": "暂无数据" -} +} \ No newline at end of file diff --git a/examples/sites/src/tools/appData.js b/examples/sites/src/tools/appData.js index 689a98848..7b2c68b6a 100644 --- a/examples/sites/src/tools/appData.js +++ b/examples/sites/src/tools/appData.js @@ -11,17 +11,14 @@ const appData = reactive({ bpState: useMediaQuery([640, 1024, 1280]).matches // 3点4区间, bp0,bp1,bp2,bp3 }) const isZhCn = computed(() => appData.lang === ZH_CN_LANG) -let appFn = { - toggleLang() { - let url = location.href - if (appData.lang === ZH_CN_LANG) { - url = location.href.replace(zhPath, enPath) - } else { - url = location.href.replace(enPath, zhPath) +const appFn = { + toggleLang(name) { + if (name !== appData.lang) { + let url = location.href + url = location.href.replace(LANG_PATH_MAP[appData.lang], LANG_PATH_MAP[name]) + appData.lang = name + location.replace(url) } - appData.lang = appData.lang === ZH_CN_LANG ? EN_US_LANG : ZH_CN_LANG - // router.push(url) - location.replace(url) }, toggleTheme() { appData.theme = appData.theme === 'light' ? 'dark' : 'light' diff --git a/examples/sites/src/tools/useApiMode.js b/examples/sites/src/tools/useApiMode.js index bed22f044..9f19cedd8 100644 --- a/examples/sites/src/tools/useApiMode.js +++ b/examples/sites/src/tools/useApiMode.js @@ -1,9 +1,11 @@ import { reactive } from 'vue' import { $local } from './storage' +import { appFn } from './appData' const _modeKey = 'tiny-vue-api-mode' const _demoModeKey = 'tiny-vue-demo-mode' const apiModeState = reactive({ + localeMode: location.href.includes('en-US') ? 'enUS' : 'zhCN', apiMode: $local[_modeKey] || 'Composition', // 示例风格: Options: 组合式; Composition: 选项式 demoMode: $local[_demoModeKey] || 'default' // 示例展示: default:多示例, single:单示例 }) @@ -12,6 +14,9 @@ const apiModeFn = { getDemoName: (name) => { return name.replace(/\.vue$/, `${apiModeState.apiMode === 'Options' ? '' : '-composition-api'}.vue`) }, + changeLocaleMode: (name) => { + appFn.toggleLang(name) + }, changeApiMode: (name) => { $local[_modeKey] = name }, diff --git a/examples/sites/src/tools/useStyleSettings.js b/examples/sites/src/tools/useStyleSettings.js index 92234f0f5..88f729ba1 100644 --- a/examples/sites/src/tools/useStyleSettings.js +++ b/examples/sites/src/tools/useStyleSettings.js @@ -1,6 +1,22 @@ /** 文档显示风格设置 */ const getStyleSettings = (i18nByKey) => { const styleSettings = [ + { + // 语言选择 + name: 'localeMode', + defaultValue: 'zhCN', + title: i18nByKey('localeType'), + options: [ + { + value: 'zhCN', + text: i18nByKey('zh-cn') + }, + { + value: 'enUS', + text: i18nByKey('en-us') + } + ] + }, { // 示例代码风格 name: 'apiMode', diff --git a/examples/sites/src/tools/useTheme.js b/examples/sites/src/tools/useTheme.js index 442d320d4..9e0907ecc 100644 --- a/examples/sites/src/tools/useTheme.js +++ b/examples/sites/src/tools/useTheme.js @@ -16,6 +16,17 @@ import { INFINITY_THEME, getKeyByValue } from '../const' +import glaciers from '@/assets/images/glaciers.png' +import glaciersIcon from '@/assets/images/glaciers-icon.png' + +import infinitely from '@/assets/images/Infinitely.png' +import infinitelyIcon from '@/assets/images/Infinitely-icon.png' + +import oceanic from '@/assets/images/oceanic.png' +import oceanicIcon from '@/assets/images/oceanic-icon.png' + +import starrySky from '@/assets/images/starry-sky.png' +import starrySkyIcon from '@/assets/images/starry-sky-icon.png' const themeMap = { [DEFAULT_THEME]: null, @@ -27,10 +38,34 @@ const themeMap = { const isEn = appData.lang === 'enUS' const themeData = [ - { value: [DEFAULT_THEME], label: isEn ? 'Default Theme' : '默认主题' }, - { value: [INFINITY_THEME], label: isEn ? 'Infinity Theme' : '无限主题' }, - { value: [AURORA_THEME], label: isEn ? 'Aurora Theme' : 'Aurora 主题' }, - { value: [SMB_THEME], label: isEn ? 'SMB Theme' : 'SMB 主题' } + { + value: [DEFAULT_THEME], + label: isEn ? 'Default Theme' : '冰川主题', + tips: isEn ? 'Accurate, Efficient, Distinct' : '精准、高效、清晰', + icon: glaciersIcon, + bgImage: glaciers + }, + { + value: [SMB_THEME], + label: isEn ? 'Star Theme' : '星空主题', + tips: isEn ? 'Leading, Innovative, Reliable' : '领先、创新、信赖', + icon: starrySkyIcon, + bgImage: starrySky + }, + { + value: [AURORA_THEME], + label: isEn ? 'Ocean Theme' : '海洋主题', + tips: isEn ? 'Simple, Agile, Delightful' : '简约、敏捷、愉悦', + icon: oceanicIcon, + bgImage: oceanic + }, + { + value: [INFINITY_THEME], + label: isEn ? 'Infinity Theme' : '无限主题', + tips: isEn ? 'Creative, Scientific, Efficient' : '创造、科学、高效', + icon: infinitelyIcon, + bgImage: infinitely + } ] const designConfigMap = { diff --git a/examples/sites/src/views/components/float-settings.vue b/examples/sites/src/views/components/float-settings.vue index b4703b158..1115c0d07 100644 --- a/examples/sites/src/views/components/float-settings.vue +++ b/examples/sites/src/views/components/float-settings.vue @@ -5,69 +5,70 @@ :style="settingsStyle" > - - -
- -
-
-